Better rssing, now with tags!
authorChip Black <bytex64@bytex64.net>
Tue, 19 Nov 2013 10:42:19 +0000 (04:42 -0600)
committerChip Black <bytex64@bytex64.net>
Sat, 29 Mar 2014 03:56:23 +0000 (22:56 -0500)
rss.cgi

diff --git a/rss.cgi b/rss.cgi
index b207874..ca2a779 100755 (executable)
--- a/rss.cgi
+++ b/rss.cgi
@@ -26,24 +26,36 @@ DOC
 }
 
 sub print_rss {
-    my ($name, @items) = @_;
+    my ($type, $name, @items) = @_;
+
+    my ($title, $link);
+    if ($type eq 'user') {
+        $title = "${name}'s blërg";
+        $link = "${baseurl}#$name";
+    } elsif ($type eq 'tag' || $type eq 'ref') {
+        $title = $name;
+        my $basename = $name;
+        $basename =~ s/^.//;
+        $link = "${baseurl}#/$type/$basename";
+    }
 
     print <<HEADER;
 <?xml version="1.0" encoding="utf-8" ?>
 <rss version="2.0">
   <channel>
-    <title>${name}'s blërg</title>
-    <link>${baseurl}#$name</link>
+    <title>$title</title>
+    <link>$link</link>
     <description>Textual vomit</description>
 HEADER
 
     for my $i (@items) {
         my $data = xml_escape($i->{data});
-        my $post_time = strftime("%a, %d %b %Y %H:%M:%S %Z", gmtime($i->{timestamp}));
+        my $post_time = strftime("%a, %d %b %Y %H:%M:%S %Z", localtime($i->{timestamp}));
+        my $author = defined $i->{author} ? $i->{author} : $name;
         print <<ITEM;
     <item>
       <pubDate>$post_time</pubDate>
-      <guid>${baseurl}get/$name/$i->{record}</guid>
+      <guid>${baseurl}get/$author/$i->{record}</guid>
       <description>$data</description>
     </item>
 ITEM
@@ -73,16 +85,12 @@ while (my $q = new CGI::Fast) {
                      -status => '301 Moved Permanently',
                      -location => "${baseurl}rss/user/$username");
         # And present the content in case their client is broken
-        my $n = $b->record_count - 1;
-        my @list = reverse map {
-            {
-                record    => $_,
-                data      => $b->fetch($_),
-                timestamp => $b->timestamp($_),
-            }
-        } ($n > 50 ? $n - 50 : 0)..$n;
-        $b->close;
-        print_rss($username, @list);
+        my $i = {
+            record => '?failed_redirect',
+               timestamp => time,
+            data => qq{Your RSS aggregator is dumb and isn't following 301 redirects.  Please manually redirect it here: ${baseurl}rss/user/$username}
+        };
+        print_rss(user => $username, $i);
     } elsif ($path[0] eq 'user') {
         my $username = $path[1];
         my $b = Blerg::Database->open_existing($username);
@@ -100,8 +108,29 @@ while (my $q = new CGI::Fast) {
             }
         } ($n > 50 ? $n - 50 : 0)..$n;
         $b->close;
-        print_rss($username, @list);
+        print_rss(user => $username, @list);
     } elsif ($path[0] eq 'tag') {
+        my $tag = $path[1];
+        $tag =~ s/^H/#/;
+        my @list = Blerg::Database::tag_list($tag, 0, -1);
+        @list = map {
+            my $b = Blerg::Database->open_existing($_->{author});
+            my $data = $b->fetch($_->{record});
+            my $timestamp = $b->timestamp($_->{record});
+            $b->close;
+            {
+                author => $_->{author},
+                record => $_->{record},
+                data => $data,
+                timestamp => $timestamp,
+            };
+        } @list;
+        print header(-type => 'application/rss+xml');
+        if (substr($tag, 0, 1) eq '#') {
+            print_rss(tag => $tag, @list);
+        } else {
+            print_rss(ref => $tag, @list);
+        }
     } elsif ($path[0] eq 'ref') {
     } elsif ($path[0] eq 'feed') {
     }