#!/usr/bin/perl

use strict;
use warnings;
use Flickr::Upload qw(upload check_upload);
use LWP::UserAgent;
use Getopt::Long;
use Pod::Usage;

my %args;
my @tags = ();
my $help = 0;
my $man = 0;

if( open CONFIG, "< $ENV{HOME}/.flickrrc" ) {
	while( <CONFIG> ) {
		chomp;
		s/#.*$//;	# strip comments
		$args{$1} = $2 if m/^\s*([a-z]+)=(.+)\s*$/io;
	}
	close CONFIG;
}

GetOptions(
	'help|?' => \$help,
	'man' => \$man,
	'tag=s' => \@tags,
	'uri=s' => sub { $args{$_[0]} = $_[1] },
	'email=s' => sub { $args{$_[0]} = $_[1] },
	'password=s' => sub { $args{$_[0]} = $_[1] },
	'public=i' => sub { $args{is_public} = $_[1] },
	'friend=i' => sub { $args{is_friend} = $_[1] },
	'family=i' => sub { $args{is_family} = $_[1] },
	'title=s' => sub { $args{$_[0]} = $_[1] },
	'description=s' => sub { $args{$_[0]} = $_[1] },
) or pod2usage(2);
pod2usage(1) if $help;
pod2usage(-exitstatus => 0, -verbose => 2) if $man;

pod2usage(1) unless exists $args{'email'};
pod2usage(1) unless exists $args{'password'};
pod2usage(1) unless @ARGV;

my $version = qw($Revision: 1.6 $)[1];

my $ua = LWP::UserAgent->new;
$ua->agent( "flickr_upload/$version" );

$args{'tags'} = join( " ", @tags ) if @tags;

# pipeline things by uploading first, waiting for photo ids second.
$args{'async'} = 1;
my %tickets;

$| = 1;
while( my $photo = shift @ARGV ) {
	print 'Uploading ', $photo, '...';

	my $rc = upload( $ua, 'photo' => $photo, %args );

	# let the caller know how many images weren't uploaded
	exit (1+@ARGV) unless defined $rc;

	# check those later
	$tickets{$rc} = $photo;

	print "\n";
}

# check
print "Waiting for upload results (ctrl-C if you don't care)...\n";
do {
	sleep 1;
	my @checked = check_upload( $ua, keys %tickets );
	for( @checked ) {
		if( $_->{complete} == 0 ) {
			# not done yet, don't do anythig
		} elsif( $_->{complete} == 1 ) {
			# uploaded, got photoid
			print "$tickets{$_->{id}} is at " .
				"http://www.flickr.com/tools/uploader_edit.gne?ids=$_->{photoid}\n";
			delete $tickets{$_->{id}};
		} else {
			print "$tickets{$_->{id}} failed to get photoid\n";
			delete $tickets{$_->{id}};
		}
	}
} while( %tickets );

exit 0;

__END__

=head1 NAME

flickr_upload - Upload photos to C<flickr.com>

=head1 SYNOPSIS

flickr_upload --email <email> --password <password> [--title <title>]
	[--description description] [--public <0|1>] [--friend <0|1>]
	[--family <0|1>] [--tag <tag>] <photos...>

=head1 DESCRIPTION

Uploads images to the L<Flickr.com> service.

=head1 OPTIONS

=over 4

=item --email <email>

Email address of L<Flickr.com> user. Required.

=item --password <password>

Password of L<Flickr.com> user. Required.

=item --title <title>

Title to use on all the images. Optional.

=item --description <description>

Description to use on all the images. Optional.

=item --public <0|1>

Override the default C<is_public> access control. Optional.

=item --friend <0|1>

Override the default C<is_friend> access control. Optional.

=item --family <0|1>

Override the default C<is_friend> access control. Optional.

=item --tag <tag>

Images are tagged with C<tag>. Multiple C<--tag> options can be given, or
you can just put them all into a single space-separated list.

=item <photos...>

List of photos to upload. Uploading stops as soon as a failure is detected
during the upload. The script exit code will indicate the number of images
on the command line that were not uploaded. For each uploaded image, the
allocated photo identifier (currently just a number) is printed.

=head1 CONFIGURATION

To avoid having to type email and passwords and such (or have them show up
in the process table listings), default values will
be read from C<$HOME/.flickrrc> if it exists. Any field defined there can, of
course, be overridden on the command line. For example:

	# my config at $HOME/.flickrrc
	email=me@example.com
	password=secret
	is_public=0
	is_friend=1
	is_family=1

=head1 BUGS

Error handling could be better.

=head1 AUTHOR

Christophe Beauregard, L<cpb@cpan.org>.

=head1 SEE ALSO

L<flickr.com>

L<Flickr::Upload>

=cut
