use strict;
my $albumNameToken= "#album#";
sub start_plugin
{
my $options= shift; my $plugin= shift; my $path= shift; my $registration= {
"author" => "Igor S. Livshits",
"href" => "http://www.ayradyss.org/",
"version" => "1.0",
"description" => "Generates RSS 2.0 feeds for recently added or changed items in albums",
};
my $rss= album::attempt_require('XML::RSS');
unless ($rss)
{ my $error= "Failed to invoke XML::RSS -- is it installed?";
print STDERR "\n[Plugin: $plugin] $error\n";
$registration->{'description'}.= "\n$error";
return $registration;
}
my $date= album::attempt_require('Date::Format');
unless ($date)
{ my $error= "Failed to invoke Date::Format -- is it installed?";
print STDERR "\n[Plugin: $plugin] $error\n";
$registration->{'description'}.= "\n$error";
return $registration;
}
my $stat= album::attempt_require('File::stat');
unless ($stat)
{ my $error= "Failed to invoke File::stat -- is it installed?";
print STDERR "\n[Plugin: $plugin] $error\n";
$registration->{'description'}.= "\n$error";
return $registration;
}
album::add_option(1,
'title',
album::OPTION_STR,
default => 'Web Album',
usage => "Title of the feed."
);
album::add_option(1,
'baseURL',
album::OPTION_STR,
usage => "URL to the album base."
);
album::add_option(1,
'language',
album::OPTION_STR,
default => 'en-us',
usage => "Language setting for the feed."
);
album::add_option(1,
'description',
album::OPTION_STR,
usage => "Description for the feed."
);
album::add_option(1,
'copyright',
album::OPTION_STR,
usage => "Copyright notice for the feed."
);
album::add_option(1,
'editor',
album::OPTION_STR,
usage => "Address of the album's editor."
);
album::add_option(1,
'webmaster',
album::OPTION_STR,
usage => "Address of the site's web master."
);
album::add_option(1,
'image',
album::OPTION_STR,
usage => "Icon for the feed."
);
album::add_option(1,
'feedFilename',
album::OPTION_STR,
default => 'index.rss',
usage => "XML file name for the feed."
);
album::add_option(1,
'albumNameToken',
album::OPTION_STR,
default => $albumNameToken,
usage => "Placeholder for actual album name during generation."
);
album::add_option(1,
'refreshModified',
album::OPTION_BOOL,
default => 0,
usage => "Toggles creation of unique URLs based on modification time."
);
album::hook($options, 'do_album', \&StartAlbum);
album::hook($options, 'end_album', \&GenerateFeed);
return $registration;
}
sub ListHash
{
my $hash= shift; my $indent= shift; my $string= "";
$indent= "\t" unless $indent;
foreach my $key (keys %$hash)
{
$string.="$indent" . "[$key]: <" . $hash->{$key} . ">\n";
}
return $string;
}
sub ComposeURL
{
my $url= shift; my $leaf= undef;
while ($leaf= shift)
{ $url.= "/" unless $url=~ /\/$/;
$leaf=~ s/^\'//; $leaf=~ s/\'$//; $url.= $leaf; }
return $url;
}
sub ComposeXML
{
my $rss= shift; my $album= shift; my $title= shift; my $baseURL= shift; my $language= shift; my $copyright= shift; my $description= shift; my $publicationDate= shift; my $editor= shift; my $webmaster= shift; my $rssImage= shift;
my $link= ComposeURL($baseURL, $album);
$title=~ s/$albumNameToken/$album/ig;
$rss->channel(title => $title,
link => $link,
language => $language,
description => $description,
copyright => $copyright,
pubDate => Date::Format::time2str("%a, %d %b %Y %T %Z", $publicationDate),
lastBuildDate => Date::Format::time2str("%a, %d %b %Y %T %Z", time()),
docs => "http://blogs.law.harvard.edu/tech/rss",
managingEditor => $editor,
webMaster => $webmaster,
);
$rss->image(title => $title,
url => $rssImage,
link => $link,
description => $description,
) if $rssImage;
}
sub DumpData
{
my $options= shift; my $data= shift; my $hookName= shift; my $directory= shift; my $album= shift;
my $pictures= $data->{'pics'};
my $directories=
$data->{'dirs'};
print "Options:\n", ListHash($options), "\n\n";
print "Data:\n", ListHash($data), "\n\n";
print "Pictures: ", join(", ", @$pictures), "\n\n";
print "Directories:\n\t<", join(">,\n \t<", @$directories), ">\n\n";
print "Objects\n--\n";
foreach my $object (keys %{$data->{'obj'}})
{ print "$object\n", ListHash($data->{'obj'}->{$object});
print "\tThumb\n",
ListHash($data->{'obj'}->{$object}->{'thumb'}, "\t\t");
print "\tFull\n",
ListHash($data->{'obj'}->{$object}->{'full'}, "\t\t");
print "\tMedium\n",
ListHash($data->{'obj'}->{$object}->{'medium'}, "\t\t");
print "\tSnapshot\n",
ListHash($data->{'obj'}->{$object}->{'snapshot'}, "\t\t");
print "\tURL (image page)\n",
ListHash($data->{'obj'}->{$object}->{'URL'}->{'image_page'}, "\t\t");
print "\tURL (album page)\n",
ListHash($data->{'obj'}->{$object}->{'URL'}->{'album_page'}, "\t\t");
}
print "Paths:\n", ListHash($data->{'paths'}), "\n";
print "Hook: $hookName\n";
print "Directory: $directory\n";
print "Album: $album\n\n\n";
}
sub StartAlbum
{
my $options= shift; my $data= shift; my $hookName= shift; my $directory= shift; my $album= shift; my $title= ""; my $albumNameToken= "";
$title= album::option($options, 'title') || "";
$albumNameToken= album::option($options, 'albumNameToken') || "";
$album=~ s/["><]//g; $title=~ s/$albumNameToken/$album/ig;
$data->{head}.= "\t\t<link rel='alternate' type='application/rss+xml' href='"
. ComposeURL(album::option($options, 'baseURL'),
$data->{'paths'}->{'album_path'},
album::option($options, 'feedFilename'))
. "' title='"
. $title
. "' />\n";
return 0; }
sub GenerateFeed
{
my $options= shift; my $data= shift; my $hookName= shift; my $directory= shift; my $album= shift; my $debug= 0; my $title= undef; my $description= undef; my $link= undef; my $permaLink= $link; my $date= undef; my $info= undef; my $refreshModified= album::option($options, 'refreshModified');
my $albumURL= ComposeURL(album::option($options, 'baseURL'), $data->{'paths'}->{'album_path'});
my $rss= new XML::RSS(version => '2.0');
print STDERR "Could not create the RSS object!\n", return
unless $rss;
ComposeXML($rss,
$album || "album",
album::option($options, 'title') || "",
album::option($options, 'baseURL') || "",
album::option($options, 'language') || "",
album::option($options, 'copyright') || "",
album::option($options, 'description') || "",
time(),
album::option($options, 'editor') || "",
album::option($options, 'webmaster') || "",
album::option($options, 'image') || "",
);
foreach my $picture (@{$data->{'pics'}})
{ $info= File::stat::stat($data->{'obj'}->{$picture}->{'full'}->{'path'});
$title= $data->{'obj'}->{$picture}->{'name'};
$link= ComposeURL($albumURL, $data->{'obj'}->{$picture}->{'URL'}->{'album_page'}->{'image'});
$date= Date::Format::time2str("%a, %d %b %Y %T %Z", $info->mtime);
if ($data->{'obj'}->{$picture}->{'is_image'})
{ $description= "Image: " . $data->{'obj'}->{$picture}->{'name'} .
"<br />" .
"Size: " . $data->{'obj'}->{$picture}->{'full'}->{'x'} .
" by " . $data->{'obj'}->{$picture}->{'full'}->{'y'};
}
elsif ($data->{'obj'}->{$picture}->{'is_movie'})
{ $description= "Movie: more informative stuff here later...";
}
else
{ $description= "Unknown: ???";
}
if ($data->{'obj'}->{$picture}->{'has_thumb'})
{ $description.= "<br /><a href='" . $link . "'><img src='" .
ComposeURL($albumURL, $data->{'obj'}->{$picture}->{'URL'}->{'album_page'}->{'thumb'}) .
"' title='" . $title . "' alt='" . $data->{'obj'}->{$picture}->{'file'} . "' /></a>";
}
$permaLink= $link;
$link.= "#" . $info->mtime if $refreshModified;
$rss->add_item(title => $title,
description => $description,
link => $link,
permaLink => $permaLink,
pubDate => $date,
);
}
foreach my $directory (@{$data->{'dirs'}})
{ $info= File::stat::stat($data->{'obj'}->{$directory}->{'path'});
$title= $data->{'obj'}->{$directory}->{'name'};
$link= ComposeURL($albumURL, $data->{'obj'}->{$directory}->{'URL'}->{'album_page'}->{'dir'});
$date= Date::Format::time2str("%a, %d %b %Y %T %Z", $info->mtime);
$description= "Child album: " . $data->{'obj'}->{$directory}->{'name'} .
"<br />" .
"Contains: " . $data->{'obj'}->{$directory}->{'num_pics_str'};
if ($data->{'obj'}->{$directory}->{'has_thumb'})
{ $description.= "<br /><a href='" . $link . "'><img src='" .
ComposeURL($albumURL, $data->{'obj'}->{$directory}->{'URL'}->{'album_page'}->{'thumb'}) .
"' title='" . $title . "' alt='" . $data->{'obj'}->{$directory}->{'file'} . "' /></a>";
}
$permaLink= $link;
$link.= "#" . $info->mtime if $refreshModified;
$rss->add_item(title => $title,
description => $description,
link => $link,
permaLink => $permaLink,
pubDate => $date,
);
}
$rss->save($directory . "/" . album::option($options, 'feedFilename'));
DumpData($options, $data, $hookName, $directory, $album) if $debug;
}
1;