if (@_) {
my $enclosure = shift;
- # TODO Atom can have multiple enclosures
- $entry->{entry}->link({ rel => 'enclosure', href => $enclosure->{url},
+ my $method = ($XML::Feed::MULTIPLE_ENCLOSURES)? 'add_link' : 'link';
+ $entry->{entry}->$method({ rel => 'enclosure', href => $enclosure->{url},
length => $enclosure->{length},
type => $enclosure->{type} });
return 1;
} else {
- my $l = first { defined $_->rel && $_->rel eq 'enclosure' } $entry->{entry}->link;
- return undef unless $l;
- return XML::Feed::Enclosure->new({ url => $l->href, length => $l->length, type => $l->type });
+ my @links = grep { defined $_->rel && $_->rel eq 'enclosure' } $entry->{entry}->link;
+ return undef unless @links;
+ my @encs = map { XML::Feed::Enclosure->new({ url => $_->href, length => $_->length, type => $_->type }) } @links ;
+ return ($XML::Feed::MULTIPLE_ENCLOSURES)? @encs : $encs[-1];
}
}
my $feed = shift;
my($str) = @_;
$feed->init_empty;
+ my $opts = {
+ hashrefs_instead_of_strings => 1,
+ };
+ $opts->{allow_multiple} = [ 'enclosure' ] if $XML::Feed::MULTIPLE_ENCLOSURES;
if ($str) {
- $feed->{rss}->parse($$str, { hashrefs_instead_of_strings => 1 } );
+ $feed->{rss}->parse($$str, $opts );
}
$feed;
}
if (@_) {
my $enclosure = shift;
- $entry->{entry}->{enclosure} = {
+ my $val = {
url => $enclosure->{url},
type => $enclosure->{type},
length => $enclosure->{length}
- };
+ };
+ if ($XML::Feed::MULTIPLE_ENCLOSURES) {
+ push @{$entry->{entry}->{enclosure}}, $val;
+ } else {
+ $entry->{entry}->{enclosure} = $val;
+ }
} else {
- return XML::Feed::Enclosure->new($entry->{entry}->{enclosure});
+ my $tmp = $entry->{entry}->{enclosure};
+ my @encs = map { XML::Feed::Enclosure->new($_) } (ref $tmp eq 'ARRAY')? @$tmp : ($tmp);
+ return ($XML::Feed::MULTIPLE_ENCLOSURES)? @encs : $encs[-1];
}
}
--- /dev/null
+#!perl -w
+
+use strict;
+use Test::More;
+use XML::Feed;
+use XML::Feed::Enclosure;
+
+$XML::Feed::MULTIPLE_ENCLOSURES=1;
+
+my @formats = qw(atom rss20);
+plan tests => scalar(@formats)*38;
+
+foreach my $format (@formats) {
+ ok (my $feed = XML::Feed->parse("t/samples/$format-multi-enclosure.xml"), "Parsed $format");
+ my ($entry) = $feed->entries;
+ ok (my @enclosures = $entry->enclosure, "Got enclosure");
+ ok ($enclosures[0]->isa("XML::Feed::Enclosure"), "Object isa XML::Feed::Enclosure");
+ is ($enclosures[0]->type, "audio/mpeg", "Got the enclosure mime type");
+ is ($enclosures[0]->length, "2478719", "Got enclosure length");
+ is ($enclosures[0]->url, "http://example.com/sample_podcast.mp3", "Got enclosure url");
+ ok ($enclosures[1]->isa("XML::Feed::Enclosure"), "Object isa XML::Feed::Enclosure");
+ is ($enclosures[1]->type, "video/mpeg", "Got the enclosure mime type");
+ is ($enclosures[1]->length, "8888", "Got enclosure length");
+ is ($enclosures[1]->url, "http://example.com/sample_movie.mpg", "Got enclosure url");
+
+ ok (my $tmp = XML::Feed::Enclosure->new({ type => "image/jpeg" }), "Created a new enclosure");
+ is ($tmp->type, "image/jpeg", "Got type back");
+ ok ($tmp->url("http://example.com/sample_image.jpg"), "Set url");
+ ok ($tmp->length("1337"), "Set length");
+ ok ($entry->enclosure($tmp), "Set the enclosure");
+
+ ok (@enclosures = $entry->enclosure, "Got enclosure again");
+ ok ($enclosures[-1]->isa("XML::Feed::Enclosure"), "Object still isa XML::Feed::Enclosure");
+ is ($enclosures[-1]->type, "image/jpeg", "Got the enclosure mime type");
+ is ($enclosures[-1]->length, "1337", "Got enclosure length again");
+ is ($enclosures[-1]->url, "http://example.com/sample_image.jpg", "Got enclosure url again");
+
+ my $xml = $feed->as_xml;
+ ok ($feed = XML::Feed->parse(\$xml), "Parsed xml again");
+ ok (@enclosures = $entry->enclosure, "Got enclosure again");
+ ok ($enclosures[0]->isa("XML::Feed::Enclosure"), "Object isa XML::Feed::Enclosure");
+ is ($enclosures[0]->type, "audio/mpeg", "Got the enclosure mime type");
+ is ($enclosures[0]->length, "2478719", "Got enclosure length");
+ is ($enclosures[0]->url, "http://example.com/sample_podcast.mp3", "Got enclosure url");
+ ok ($enclosures[1]->isa("XML::Feed::Enclosure"), "Object isa XML::Feed::Enclosure");
+ is ($enclosures[1]->type, "video/mpeg", "Got the enclosure mime type");
+ is ($enclosures[1]->length, "8888", "Got enclosure length");
+ is ($enclosures[1]->url, "http://example.com/sample_movie.mpg", "Got enclosure url");
+ ok ($enclosures[2]->isa("XML::Feed::Enclosure"), "Object still isa XML::Feed::Enclosure");
+ is ($enclosures[2]->type, "image/jpeg", "Got the enclosure mime type");
+ is ($enclosures[2]->length, "1337", "Got enclosure length again");
+ is ($enclosures[2]->url, "http://example.com/sample_image.jpg", "Got enclosure url again");
+ ok ($enclosures[-1]->isa("XML::Feed::Enclosure"), "Object still isa XML::Feed::Enclosure");
+ is ($enclosures[-1]->type, "image/jpeg", "Got the enclosure mime type");
+ is ($enclosures[-1]->length, "1337", "Got enclosure length again");
+ is ($enclosures[-1]->url, "http://example.com/sample_image.jpg", "Got enclosure url again");
+
+
+}