The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Net::Google::PicasaWeb::Media;
BEGIN {
  $Net::Google::PicasaWeb::Media::VERSION = '0.11';
}
use Moose;

# ABSTRACT: hold information about a photo or video

extends 'Net::Google::PicasaWeb::Base';

use Carp;


has title => (
    is         => 'rw',
    isa        => 'Str',
);


has description => (
    is          => 'rw',
    isa         => 'Str',
);


has content => (
    is          => 'rw',
    isa         => 'Net::Google::PicasaWeb::Media::Content',
);


has thumbnails => (
    is          => 'rw',
    isa         => 'ArrayRef[Net::Google::PicasaWeb::Media::Thumbnail]',
    auto_deref  => 1,
);


sub from_feed {
    my ($class, $service, $media_group) = @_;

    my $content = $media_group->first_child('media:content');

    my %params = (
        service     => $service,
        twig        => $media_group,
        title       => $media_group->field('media:title'),
        description => $media_group->field('media:description'),
    );       
    
    my $self = $class->new(\%params);

    $self->content(
        Net::Google::PicasaWeb::Media::Content->new(
            media     => $self,
            url       => $content->att('url'),
            mime_type => $content->att('type'),
            medium    => $content->att('medium'),

            ($content->att('height')   ? (height => $content->att('height'))   : ()),
            ($content->att('width')    ? (width  => $content->att('width'))    : ()),
            ($content->att('fileSize') ? (size   => $content->att('fileSize')) : ()),
        )
    );
    $self->thumbnails(
        [
            map { 
                Net::Google::PicasaWeb::Media::Thumbnail->new(
                    media  => $self,
                    url    => $_->att('url'),

                    ($_->att('height') ? (height => $_->att('height')) : ()),
                    ($_->att('width')  ? (width  => $_->att('width'))  : ()),
                )
            } $media_group->children('media:thumbnail')
        ]
    );

    return $self;
}

sub _fetch {
    my ($self, $content, %params) = @_;
    my $url = $content->url;

    my %header;
    $header{':content_file'} = $params{file} if $params{file};

    my $response = $self->service->user_agent->get($url, %header);

    if ($response->is_success) {
        return $response->content;
    }
    else {
        croak $response->status_line;
    }
}

package Net::Google::PicasaWeb::Media::Content;
BEGIN {
  $Net::Google::PicasaWeb::Media::Content::VERSION = '0.11';
}
use Moose;


has media => (
    is          => 'rw',
    isa         => 'Net::Google::PicasaWeb::Media',
    required    => 1,
    weak_ref    => 1,
);


has url => (
    is          => 'rw',
    isa         => 'Str',
);


has mime_type => (
    is         => 'rw',
    isa        => 'Str',
);


has medium => (
    is          => 'rw',
    isa         => 'Str',
);


has width => (
    is          => 'rw', 
    isa         => 'Int',
);


has height => (
    is          => 'rw',
    isa         => 'Int',
);


has size => (
    is          => 'rw',
    isa         => 'Int',
);


sub fetch {
    my $self = shift;
    return $self->media->_fetch($self, @_);
}

package Net::Google::PicasaWeb::Media::Thumbnail;
BEGIN {
  $Net::Google::PicasaWeb::Media::Thumbnail::VERSION = '0.11';
}
use Moose;


has media => (
    is          => 'rw',
    isa         => 'Net::Google::PicasaWeb::Media',
    required    => 1,
    weak_ref    => 1,
);


has url => (
    is          => 'rw',
    isa         => 'Str',
);


has width => (
    is          => 'rw',
    isa         => 'Int',
);


has height => (
    is          => 'rw',
    isa         => 'Int',
);


sub fetch {
    my $self = shift;
    return $self->media->_fetch($self, @_);
}

__PACKAGE__->meta->make_immutable;

1;

__END__
=pod

=head1 NAME

Net::Google::PicasaWeb::Media - hold information about a photo or video

=head1 VERSION

version 0.11

=head1 SYNOPSIS

  my @photos = $album->list_media_entries;
  for my $photo (@photos) {
      my $media_info = $photo->photo;

      print "Image Title: ", $media_info->title, "\n";
      print "Image Description: ", $media_info->description, "\n\n";

      my $main_photo = $media_info->content;
      print "Image URL: ", $main_photo->url, "\n";
      print "Image MIME Type: ", $main_photo->mime_type, "\n";
      print "Image Medium: ", $main_photo->medium, "\n";

      print "Thumbnails:\n\n";
      
      for my $thumbnail ($media_info->thumbnails) {
          print "    Thumbnail URL: ", $thumbnail->url, "\n";
          print "    Thumbnail Dimensions: ", 
              $thumbnail->width, "x", $thumbnail->height, "\n\n";

          my $photo_data = $thumbnail->fetch;
          $thumbnail->fetch( file => 'thumbnail.jpg' );
      }
    
      my $photo_data = $main_photo->fetch;
      $main_photo->fetch( file => 'photo.jpg' );
  }

=head1 DESCRIPTION

This is where you will find information about the photos, videos, and thumbnails themselves. You can get information about them with this object, such as the URL that can be used to download the media file. This object (and its children) also provide some features to fetching this information.

This class extends L<Net::Google::PicasaWeb::Base>.

=head1 ATTRIBUTE

=head2 title

This is the title of the photo or video.

=head2 description

This is a description for the photo or video.

=head2 content

This is the main photo or video item attached to the media information entry. See L</MEDIA CONTENT> below for information about the object returned.

=head2 thumbnails

This is an array of object containing information about the thumbnails that were attached when the photo was retrieved from the server.  See L</THUMBNAILS> below for information about these objects.

=head1 METHODS

=head2 from_feed

Builds a media class from a service object and reference to a C<< <media:group> >> object in L<XML::Twig::Elt>.

=head1 MEDIA CONTENT

The object returned from the L</content> accessor is an object with the following accessors and methods.

=head2 ATTRIBUTES

=head3 media

This is the parent L<Net::Google::PicasaWeb::Media> object.

=head3 url

This is the URL where the photo or video may be downloaded from.

=head3 mime_type

This is the MIME-Type of the photo or video.

=head3 medium

This should be one of the following scalar values describing the media entry:

=over

=item *

image

=item *

video

=back

=head3 width

The width of the photo in pixels.

=head3 height

The height of the photo in pixels.

=head3 size

The file size of the photo in bytes.

=head1 METHODS

=head2 fetch

  my $data = $content->fetch(%params);

Fetches the image or video from Picasa Web. By default, this method returns the file data as a scalar.

This method accepts the following parameters, which modify this behavior:

=over

=item file

If given, the data will not be returned, but saved to the named file instead.

=back

=head1 THUMBNAILS

Each thumbnail returned represents an individual image resource used as a thumbnail for the main item. Each one has the following attributes and methods.

=head2 ATTRIBUTES

=head3 media

This is the parent L<Net::Google::PicasaWeb::Media> object.

=head3 url

This is the URL where the thumbnail image can be pulled down from.

=head3 width

This is the pixel width of the image.

=head3 height

This is the pixel height of the image.

=head1 METHODS

=head2 fetch

  my $data = $thumbnail->fetch(%params);

Fetches the thumbnail image from Picasa Web. By default, this method returns the image data as a scalar.

This method accepts the following parameters, which modify this behavior:

=over

=item file

If given, the data will not be returned, but saved to the named file instead.

=back

=head1 AUTHOR

Andrew Sterling Hanenkamp <hanenkamp@cpan.org>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by Andrew Sterling Hanenkamp.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut