Render fancy podcast enclosures.
authorAmitai Schlair <schmonz-web-ikiwiki@schmonz.com>
Thu, 21 Feb 2013 02:16:19 +0000 (21:16 -0500)
committerAmitai Schlair <schmonz-web-ikiwiki@schmonz.com>
Thu, 21 Feb 2013 02:16:19 +0000 (21:16 -0500)
Simple podcast feeds didn't have content tags and I made sure to
keep it that way. This may be unnecessarily conservative. Changing
the behavior to include empty content tags might be fine, but I
don't want to think about it right now, I just want my tests to
keep passing!

The new fancy-podcast tests are copy-pasted-edited from the
simple-podcast tests. These tests shall be refactored.

IkiWiki/Plugin/inline.pm
t/podcast.t
templates/atomitem.tmpl
templates/rssitem.tmpl

index 20cb8a27c9e9ea544540f2521b1793be54be8a45..9b4cee4e42ab7c37c21cd69a3837f3a66b59ba74 100644 (file)
@@ -647,6 +647,7 @@ sub genfeed ($$$$$@) {
        foreach my $p (@pages) {
                my $u=URI->new(encode_utf8(urlto($p, "", 1)));
                my $pcontent = absolute_urls(get_inline_content($p, $page), $url);
+               my $fancy_enclosure_seen = 0;
 
                $itemtemplate->param(
                        title => pagetitle(basename($p)),
@@ -668,17 +669,27 @@ sub genfeed ($$$$$@) {
                                $itemtemplate->param(mdate_822 => date_822($pagestate{$p}{meta}{updated}));
                                $itemtemplate->param(mdate_3339 => date_3339($pagestate{$p}{meta}{updated}));
                        }
+
+                       if (exists $pagestate{$p}{meta}{enclosure}) {
+                               my $absurl = $pagestate{$p}{meta}{enclosure};
+
+                               # XXX better way to compute relative to srcdir?
+                               my $file = $absurl;
+                               $file =~ s|^$config{url}/||;
+
+                               genenclosure($itemtemplate, $absurl, $file);
+                               $fancy_enclosure_seen = 1;
+                       }
                }
 
                my $file=$pagesources{$p};
-               my $type=pagetype($file);
-               if (defined $type) {
-                       $itemtemplate->param(content => $pcontent);
-               }
-               else {
+               unless ($fancy_enclosure_seen || defined(pagetype($file))) {
                        genenclosure($itemtemplate, $u, $file);
+                       $itemtemplate->param(simplepodcast => 1);
                }
 
+               $itemtemplate->param(content => $pcontent);
+
                run_hooks(pagetemplate => sub {
                        shift->(page => $p, destpage => $page,
                                template => $itemtemplate);
index 88d2ca074878c1f08b841b84d1c6a47a932b2bb1..6a2c25ee1ab2a5fceb4fa01f37d8efa11568439f 100755 (executable)
@@ -9,7 +9,7 @@ BEGIN {
                        "XML::Feed and/or HTML::Parser not available"};
        }
        else {
-               eval q{use Test::More tests => 92};
+               eval q{use Test::More tests => 136};
        }
 }
 
@@ -72,6 +72,11 @@ sub simple_podcast {
                                        qq{$format $title id});
                                is($body, undef,
                                        qq{$format $title no body text});
+
+                               # prevent undef method killing test harness
+                               $enclosure = XML::Feed::Enclosure->new({})
+                                       unless defined $enclosure;
+
                                is($enclosure->url, $url,
                                        qq{$format $title enclosure url});
                                is($enclosure->type, $media_types{$title},
@@ -93,6 +98,90 @@ sub simple_podcast {
        ok(! system("rm -rf $tmp $statedir"), q{teardown});
 }
 
+sub fancy_podcast {
+       my $baseurl = 'http://example.com';
+       my @command = (qw(./ikiwiki.out -plugin inline -rss -atom));
+       push @command, qw(-underlaydir=underlays/basewiki);
+       push @command, qw(-set underlaydirbase=underlays -templatedir=templates);
+       push @command, "-url=$baseurl", qw(t/tinypodcast), "$tmp/out";
+
+       ok(! system("mkdir $tmp"),
+               q{setup});
+       ok(! system(@command),
+               q{build});
+
+       my %media_types = (
+               'piano.mp3'     => 'audio/mpeg',
+               'walter.ogg'    => 'video/x-theora+ogg',
+       );
+
+       for my $format (qw(atom rss)) {
+               my $feed = XML::Feed->parse("$tmp/out/fancy/index.$format");
+
+               is($feed->title, 'fancy',
+                       qq{$format feed title});
+               is($feed->link, "$baseurl/fancy/",
+                       qq{$format feed link});
+               is($feed->description, 'wiki',
+                       qq{$format feed description});
+               if ('atom' eq $format) {
+                       is($feed->author, $feed->description,
+                               qq{$format feed author});
+                       is($feed->id, $feed->link,
+                               qq{$format feed id});
+                       is($feed->generator, "ikiwiki",
+                               qq{$format feed generator});
+               }
+
+               # XXX compare against simple_podcast
+               # XXX make them table-driven shared code
+               for my $entry ($feed->entries) {
+                       my $title = $entry->title;
+                       my $url = $entry->id;
+                       my $body = $entry->content->body;
+                       my $enclosure = $entry->enclosure;
+
+                       is($entry->link, $url, qq{$format $title link});
+                       isnt($entry->issued, undef,
+                               qq{$format $title issued date});
+                       isnt($entry->modified, undef,
+                               qq{$format $title modified date});
+
+                       if (defined $media_types{$title}) {
+                               is($url, "$baseurl/$title",
+                                       qq{$format $title id});
+                               is($body, undef,
+                                       qq{$format $title no body text});
+                               is($enclosure->url, $url,
+                                       qq{$format $title enclosure url});
+                               is($enclosure->type, $media_types{$title},
+                                       qq{$format $title enclosure type});
+                               cmp_ok($enclosure->length, '>', 0,
+                                       qq{$format $title enclosure length});
+                       }
+                       else {
+                               my $expected_id = "$baseurl/$title/";
+                               $expected_id =~ s/\ /_/g;
+
+                               is($url, $expected_id,
+                                       qq{$format $title id});
+                               isnt($body, undef,
+                                       qq{$format $title body text});
+                               isnt($enclosure, undef,
+                                       qq{$format $title enclosure});
+                               use File::Basename;
+                               my $filename = basename($enclosure->url);
+                               is($enclosure->type, $media_types{$filename},
+                                       qq{$format $title enclosure type});
+                               cmp_ok($enclosure->length, '>', 0,
+                                       qq{$format $title enclosure length});
+                       }
+               }
+       }
+
+       ok(! system("rm -rf $tmp $statedir"), q{teardown});
+}
+
 sub single_page_html {
        my @command = (qw(./ikiwiki.out));
        push @command, qw(-underlaydir=underlays/basewiki);
@@ -211,3 +300,4 @@ sub _extract_html_links {
 simple_podcast();
 single_page_html();
 inlined_pages_html();
+fancy_podcast();
index 4ed17bc62070756b16e2dc1c6de3d10d0058de5e..9b056e0f455c06a06144d4c73922184441c1d3a6 100644 (file)
        <published><TMPL_VAR CDATE_3339></published>
 <TMPL_IF ENCLOSURE>
        <link rel="enclosure" type="<TMPL_VAR TYPE>" href="<TMPL_VAR ENCLOSURE>" length="<TMPL_VAR LENGTH>" />
-<TMPL_ELSE>
+</TMPL_IF>
+<TMPL_UNLESS SIMPLEPODCAST>
        <content type="html" xml:lang="en">
        <TMPL_VAR CONTENT ESCAPE=HTML>
        </content>
-</TMPL_IF>
+</TMPL_UNLESS>
 <TMPL_IF COMMENTSURL>
        <link rel="comments" href="<TMPL_VAR COMMENTSURL>" type="text/html" />
 </TMPL_IF>
index 831daa871d11369b7b5c532014fbfab2b478c550..2d315173bb3a1da36d1b0fd38d7582fe88512483 100644 (file)
        <dcterms:modified><TMPL_VAR MDATE_3339></dcterms:modified>
 <TMPL_IF ENCLOSURE>
        <enclosure url="<TMPL_VAR ENCLOSURE>" type="<TMPL_VAR TYPE>" length="<TMPL_VAR LENGTH>" />
-<TMPL_ELSE>
-       <description><TMPL_VAR CONTENT ESCAPE=HTML></description>
 </TMPL_IF>
+<TMPL_UNLESS SIMPLEPODCAST>
+       <description><TMPL_VAR CONTENT ESCAPE=HTML></description>
+</TMPL_UNLESS>
 <TMPL_IF COMMENTSURL>
        <comments><TMPL_VAR COMMENTSURL></comments>
 </TMPL_IF>