use Term::ReadLine;
use Getopt::Long;
use Encode;
+use UUID;
#use encoding 'utf-8';
binmode(STDOUT, ":utf8");
my $haveimagick = eval { require Image::Magick; };
{ package Image::Magick; } # to make perl compiler happy
-my $haverss = eval { require XML::RSS; };
-{ package XML::RSS; } # to make perl compiler happy
-
-my $haveatom = eval { require XML::Atom; };
-{ package XML::Atom; } # to make perl compiler happy
+my $havefeed = eval { require XML::FeedPP; };
+{ package XML::FeedPP; } # to make perl compiler happy
my $havegeoloc = eval { require Image::ExifTool::Location; };
{ package Image::ExifTool::Location; } # to make perl compiler happy
######################################################################
my $incpath;
-my $rssobj;
+my $feedobj;
my $debug = 0;
my $asktitle = 0;
my $noasktitle = 0;
&help;
}
-if ($feed && ! ($haverss || $haveatom)) {
- print STDERR "You need to get XML::RSS and/or XML::Atom to use --feed\n";
+if ($feed && !$havefeed) {
+ print STDERR "You need to install XML::FeedPP to use --feed\n";
exit 1;
}
my $term = new Term::ReadLine "Edit Title";
FsObj->new(getcwd)->iterate;
-if ($rssobj) { $rssobj->{-rss}->save($rssobj->{-savepath}); }
+if ($feedobj) {
+ $feedobj->{-feed}->pubDate(time);
+ $feedobj->{-feed}->to_file($feedobj->{-savepath});
+}
sub help {
--asktitle: ask to edit album titles even if there are ".title" files
--noasktitle: don't ask to enter album titles even where ".title"
files are absent. Use partial directory names as titles.
- --feed=...: build RSS feed for newly added "albums", give name of rss file
+ --feed=...: build Atom feed for newly added "albums",
+ enter filename, base URL, and optionally PuSH hub url,
+ separated by commas. (Note: PuSH obviously does not work
+ "out of the box" for static tree! You need a separate
+ "watcher" script to do the publishing for you.)
__END__
exit 1;
-root=>$root,
-fullpath=>$root,
};
- # fill in -inc, -rss, -relpath
+ # fill in -inc, -feed, -relpath
initpaths($self); # we are not blessed yet, so cheat.
}
bless $self, $class;
$self->{-relpath} = $relpath;
$self->{-toppath} = substr($fullpath,0,$pos);
#print "rel=$relpath, top=$self->{-toppath}, inc=$inc\n";
- initrss($self);
+ initfeed($self);
} else {
$self->{-inc} = 'NO-.INCLUDE-IN-PATH/'; # won't work anyway
- $self->{-rss} = '';
+ $self->{-feed} = '';
$self->{-relpath} = '';
$self->{-depth} = 0;
}
}
-sub initrss {
+sub initfeed {
my $self=shift; # this is not a method but we cheat
my $fullpath=$self->{-fullpath};
my $toppath=$self->{-toppath};
$feedbase .= '/' unless ($feedbase =~ /\/$/);
print "($feedfile, $feedbase, $feedhub)\n";
- $rssobj->{-savepath} = $self->{-toppath}.'/'.$feedfile;
- $rssobj->{-file} = $feedfile;
- $rssobj->{-base} = $feedbase;
- $rssobj->{-hub} = $feedhub;
- $rssobj->{-rss} = new XML::RSS (version=>'2.0');
- if ( -f $rssobj->{-file} ) {
- $rssobj->{-rss}->parsefile($rssobj->{-file});
- my $itemstodel = @{$rssobj->{-rss}->{'items'}} - 15;
- while ($itemstodel-- > 0) {
- pop(@{$rssobj->{-rss}->{'items'}})
- }
- $rssobj->{-rss}->save($rssobj->{-savepath});
+ $feedobj->{-savepath} = $self->{-toppath}.'/'.$feedfile;
+ $feedobj->{-file} = $feedfile;
+ $feedobj->{-base} = $feedbase;
+ $feedobj->{-hub} = $feedhub;
+ $feedobj->{-feed} = XML::FeedPP::Atom::Atom10->new;
+ if ( -f $feedobj->{-file} ) {
+ $feedobj->{-feed}->load($feedobj->{-file});
+ $feedobj->{-feed}->limit_item(15);
} else {
- $rssobj->{-rss}->channel(
- title=>'Gallery',
- link=>$feedbase,
- description=>'Gallery Feed',
- #language=>$language,
- #rating=>$rating,
- #copyright=>$copyright,
- #pubDate=>$pubDate,
- #lastBuildDate=>$lastBuild,
- #docs=>$docs,
- #managingEditor=>$editor,
- #webMaster=>$webMaster
- );
- $rssobj->{-rss}->save($rssobj->{-savepath});
- }
- $self->{-rss} = $rssobj->{-rss};
+ $feedobj->{-feed}->title("Gallery");
+ $feedobj->{-feed}->description("generated by ".
+ "<a href=\"http://www.average.org/mkgallery/\">".
+ "mkgallery</a>");
+ $feedobj->{-feed}->link($feedbase);
+ #$feedobj->{-feed}->copyright("");
+ #$feedobj->{-feed}->language("en");
+ #$feedobj->{-feed}->image($url, $tit, $link, $desc, $w, $h);
+ }
+ $feedobj->{-feed}->pubDate(time);
+ $feedobj->{-feed}->to_file($feedobj->{-savepath});
+ $self->{-feed} = $feedobj->{-feed};
}
sub iterate {
my $inc = $self->{-inc}.$incdir.'/';
my $title = $self->{-title};
- my $rsslink="";
- if ($rssobj) {
- $rsslink=Link({-rel=>'alternate',
- -type=>'application/rss+xml',
+ my $feedlink="";
+ if ($feedobj) {
+ $feedlink=Link({-rel=>'alternate',
+ -type=>'application/atom+xml',
-title=>'Gallery Feed',
- -href=>$rssobj->{-base}.$rssobj->{-file}});
+ -href=>$feedobj->{-base}.$feedobj->{-file}});
}
print $IND start_html(-title => $title,
-encoding=>"utf-8",
- -head=>$rsslink,
+ -head=>$feedlink,
-style=>[
{-src=>$inc."gallery.css"},
{-src=>$inc."custom.css"},
close($IND) if ($IND);
undef $self->{-IND};
- if ($rssobj) {
- my $rsstitle=sprintf "%s [%d images, %d subalbums]",
+ if ($feedobj) {
+ my $feedtitle=sprintf "%s [%d images, %d subalbums]",
$self->{-title},
$self->{-numofimgs},
$self->{-numofsubs};
- my $rsslink=$rssobj->{-rss}->channel('link').
+ my $feedlink=$feedobj->{-feed}->link.
$self->{-relpath}."index.html";
- $rssobj->{-rss}->add_item(
+ my $uu;
+ my $us;
+ UUID::generate($uu);
+ UUID::unparse($uu, $us);
+ $feedobj->{-feed}->add_item(
title => $self->{-title},
- link => $rsslink,
- description => $rsstitle,
- pubDate => time2str(time),
+ link => $feedlink,
+ description => $feedtitle,
+ pubDate => time,
+ guid => $us,
);
}
}