#!/usr/bin/perl
$VERSION = '1.00';
# XAlbum2Rss - Generate RSS Feed from Photo Album XML, (see XPhotoAlbum.pl)
# Version 1.00
#
# Get docs and newest version from
# http://www.neystadt.org/XPhotoAlbum/
#
# Copyright (c) 2005, John Neystadt
# You may install this script on your site for free
# To obtain permision for redistribution or any other usage
# contact john@neystadt.org.
#
# Drop me a line if you deploy this script on your site.
=head1 NAME
XAlbum2Rss.pl v1.00 - XML Photo Album Script RSS Feed Generator
=cut
use XML::DOM;
use XML::RSS;
use Image::ExifTool;
use File::stat;
use POSIX;
my ($DateFormat) = '%Y-%m-%dT%H:%M:%S+02:00'; # '%a, %d %b %Y %H:%M:%S GMT+2';
my ($FeedSize) = 100;
if ($#ARGV < 1) {
print STDERR "Usage: $0
Will print RSS feed on the output\n.";
die 1;
}
my ($IndexFile, $PictureRoot) = @ARGV;
$PictureRoot .= '/'
if !($PictureRoot =~ q|/$|);
my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile ($IndexFile);
my $album = $doc->getChildNodes ()->item (0);
die "Can't load XML file $IndexFile" if (!$doc || !$album);
my $PicturePath = $album->getAttribute ('PATH');
$PicturePath .= '/'
if !($PicturePath =~ q|/$|);
my $children = $album->getChildNodes ();
my $anno;
for (0..$children->getLength ()-1) {
my $child = $children->item ($_);
if ($child->getNodeName eq 'ANNOTATION') {
$anno = $child->getFirstChild ()->getData ();
last;
}
}
my $rss = new XML::RSS (version => '1.0');
$rss->channel(
title => $album->getAttribute ('TITLE'),
link => $album->getAttribute ('LINK'),
description => $anno,
dc => {
date => getNowTime(),
subject => $album->getAttribute ('TITLE'),
creator => $album->getAttribute ('AUTHOR'),
publisher => $album->getAttribute ('AUTHOR'),
rights => $album->getAttribute ('COPYRIGHT'),
language => 'en-us',
},
syn => {
updatePeriod => "hourly",
updateFrequency => "1",
updateBase => "1901-01-01T00:00+00:00",
},
);
$rss->image(
title => "Album Logo",
url => $album->getAttribute ('ICON'),
link => $album->getAttribute ('LINK'),
);
my @images = sortAlbumImages ($doc);
for (@images [0..$FeedSize-1]) {
last if !$_;
image2Rss ($rss, $_, $album);
}
print $rss->as_string;
## END OF MAIN ##
sub image2Rss {
my ($rss, $image, $album) = @_;
my $link = $PicturePath . $image->getAttribute ('HREF');
# Enumerate through parent folders to prepend folder titles
my $elem = $image;
my $title = $image->getFirstChild ()->getData ();
while ($elem) {
$elem = $elem->getParentNode ();
last if $elem->getNodeName () ne 'FOLDER';
$title = $elem->getAttribute ('TITLE') . ' : ' . $title;
}
my $desc = <$title
EOD
$rss->add_item (
title => $title,
link => $link,
description => $desc,
dc => {
subject => $album->getAttribute ('TITLE'),
creator => $album->getAttribute ('AUTHOR'),
date => $image->getAttribute ('DATE'),
},
);
}
sub sortAlbumImages {
my ($doc) = @_;
my @images = $doc->getElementsByTagName ('PICTURE');
my ($f);
foreach (@images) {
my $file = $PictureRoot . $_->getAttribute ('HREF');
my $date = getImageTime ($file);
$f = 0;
if (!$date) {
$f = 1;
$date = getFileTime ($file);
}
$_->setAttribute ('DATE', $date);
print STDERR "$date\t";
if ($f) { print STDERR "FILE"; } else { print STDERR "EXIF"; }
print STDERR "\t$file\n";
}
sub ByImageDate {
$b->getAttribute ('DATE') cmp $a->getAttribute ('DATE');
}
return sort ByImageDate @images;
}
sub getImageTime {
my ($file) = @_;
my $exifTool = new Image::ExifTool;
$exifTool->Options(Group0 => ['EXIF'], Unknown => 0, DateFormat => $DateFormat);
my $info = $exifTool->ImageInfo($file);
return udef if !$info;
if (exists $info->{'DateTimeOriginal'}) {
return $info->{'DateTimeOriginal'};
} elsif (exists $info->{'ModifyDate'}) {
return $info->{'ModifyDate'};
}
return undef;
}
sub getFileTime {
my ($file) = @_;
my $info = stat($file);
die "Can't access referenced file $image!" if !$info;
return POSIX::strftime ($DateFormat, gmtime ($info->mtime));
}
sub getNowTime {
return POSIX::strftime ($DateFormat, gmtime ());
}
__END__
=head1 DESCRIPTION
This simple script can be used to generate RSS feed out of the album file, which you created for XPhotoAlbum.pl. The script can be used for off-Line
RSS generation - add it to your schedule tasks or crontab.
Once you created RSS feed, your friends may add your album to their RSS Reader (http://www.bradsoft.com/feeddemon/), http://www.LiveJournal.com friend lent, or http://my.yahoo.com
personalized portal. Each time you ad a photo, they will instantly see it in their news feed.
=head1 USAGE
I
Will print RSS feed on the output. You can redirect this into album.rdf file, and use it for RSS feed.
=head1 XML Index File Format
Please see the examples below to understand the format of the files.
=head1 CAVEATS
You need to add few new attributes to you album XML file, which will be used for RSS meta-data:
=over
=item 1
LINK - URL of the full album
=item 2
AUTHOR - Your name
=item 3
COPYRIGHT - Copyright text
=back
For example:
... LINK="http://www.neystadt.org/john/album/" AUTHOR="John Neystadt" COPYRIGHT="John Neystadt" ...
=head1 TIPS AND TRICKS
Send your feedback...
=head1 EXAMPLES
Please see http://www.neystadt.org/ for three instances of the albums using this technology.
Particulary examples of the XML index files are located at:
http://www.neystadt.org/john/album/index.rdf
http://www.neystadt.org/john/family-album/index.rdf
=head1 PREREQUISITES
This script requires the C, C and C modules available from CPAN (http://www.cpan.org)
=pod OSNAMES
All UNIXes, Windows NT
=pod SCRIPT CATEGORIES
Web
=pod README
This simple script can be used to generate RSS feed out of the album file, which you created for XPhotoAlbum.pl. The script can be used for off-Line
RSS generation - add it to your schedule tasks or crontab.
See http://www.neystadt.org/XPhotoAlbum/ for additional details.
=cut