| WWW-YouTube documentation | Contained in the WWW-YouTube distribution. |
WWW::YouTube::XML::API - How to Interface with YouTube using HTTP Protocol and GData XML Atom API.
http://code.google.com/apis/youtube/developers_guide_protocol.html
use WWW::YouTube;
foreach my $feed qw( top_rated top_favorites most_viewed most_recent most_discussed most_linked most_responded recently_featured watch_on_mobile ) { print "##\n## /feeds/api/standardfeeds/$feed\n##\n";
$request = WWW::YouTube::XML::API::standardfeeds( $feed );
$result = WWW::YouTube::XML::API::ua_request( $request );
if ( $result->is_success() )
{
$xml_tree = WWW::YouTube::XML::parse_result( $result );
WWW::YouTube::XML::example_show_xml_links( $xml_tree );
$xml_tree->delete();
}
else
{
print $result->as_string() . "\nFAILURE\n";
} ## end if
} ## end foreach
my $request = WWW::YouTube::XML::API::uploaded_by_userid( $userid );
my $result = WWW::YouTube::XML::API::ua_request( $request );
if ( $result->is_success() ) { my $xml_tree = XML::TreeBuilder->new();
$xml_tree->parse( $result->content() ); $xml_tree->eof(); # do something here, then $xml_tree->delete();
} ## end if
user agent transaction dump
transaction request dump
transaction result dump
XML::API stands for XML Application Programming Interface
See: http://code.youtube.com http://code.google.com/apis/youtube http://code.google.com/apis/youtube/developers_guide_protocol.html
WWW::YouTube::XML::demo()
1. Standard video feeds
foreach my $feed qw( top_rated top_favorites most_viewed most_recent most_discussed most_linked most_responded recently_featured watch_on_mobile ) { print "##\n## /feeds/api/standardfeeds/$feed\n##\n";
$request = WWW::YouTube::XML::API::standardfeeds( $feed );
$result = WWW::YouTube::XML::API::ua_request( $request );
if ( $result->is_success() )
{
$xml_tree = WWW::YouTube::XML::parse_result( $result );
WWW::YouTube::XML::example_show_xml_links( $xml_tree );
$xml_tree->delete();
}
else
{
print $result->as_string() . "\nFAILURE\n";
} ## end if
} ## end foreach
NOTE: This also works. WWW::YouTube::XML::API::standardfeeds( 'US/top_rated?time=today' );
2. Videos uploaded by a specific user
$request = WWW::YouTube::XML::API::uploaded_by_userid([ $userid ]);
$result = WWW::YouTube::XML::API::ua_request( $request );
3. Related videos
Follow a link with rel="http://gdata.youtube.com/schemas/2007#video.related".
4. Browsing with categories and keywords
$request = WWW::YouTube::XML::API::browse( $categories_or_keywords );
$result = WWW::YouTube::XML::API::ua_request( $request );
See: http://code.google.com/apis/youtube/developers_guide_protocol.html#Browsing_with_Categories_and_Keywords
5. Searching for videos
$request = WWW::YouTube::XML::API::search( 'vq' => 'funny+video', 'max-results' => 10 );
$result = WWW::YouTube::XML::API::ua_request( $request );
See: http://code.google.com/apis/youtube/developers_guide_protocol.html#Searching_for_Videos
$request = WWW::YouTube::XML::API::upload_by_userid_filename( $userid, $filename, $xml_tree );
## ADD FILE PART ## See WWW::YouTube::XML::example_upload
$result = WWW::YouTube::XML::API::ua_request( $request );
1. Updating a video entry
$request = WWW::YouTube::XML::API::get_uploaded_by_userid_videoid( $userid, $videoid );
$result = WWW::YouTube::XML::API::ua_request( $request );
$xml_tree = WWW::YouTube::XML::parse_result( $result );
## Edit the Entry, then put the update
$request = WWW::YouTube::XML::API::put_uploaded_by_userid_videoid( $userid, $videoid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Deleting a video
$request = WWW::YouTube::XML::API::remove_uploaded_by_userid_videoid( $userid, $videoid );
$result = WWW::YouTube::XML::API::ua_request( $request );
1. Adding a rating
$request = WWW::YouTube::XML::API::rating_by_videoid( $videoid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Comments
1. Retrieving comments for a video
$request = WWW::YouTube::XML::API::comments_by_videoid( $videoid );
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Adding a comment in response to a video
$request = WWW::YouTube::XML::API::comment_by_videoid( $videoid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
3. Video responses
1. Retrieving a list of video responses
$request = WWW::YouTube::XML::API::responses_by_videoid( $videoid );
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Adding a video response
$request = WWW::YouTube::XML::API::response_by_videoid( $videoid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
3. Deleting a video response
$request = WWW::YouTube::XML::API::remove_response_by_videoid_responseid( $videoid, $responseid );
$result = WWW::YouTube::XML::API::ua_request( $request );
4. Adding a complaint
$request = WWW::YouTube::XML::API::complaint_by_videoid( $videoid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
5. Sharing videos with other users
$request = WWW::YouTube::XML::API::contact_by_userid( $userid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
1. Favorite videos
1. Retrieving a user's favorite videos
$request = WWW::YouTube::XML::API::favorites_by_userid([ $userid ]);
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Adding a favorite video
$request = WWW::YouTube::XML::API::favorite_by_userid( $userid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
3. Deleting a favorite video
$request = WWW::YouTube::XML::API::remove_favorite_by_userid_videoid( $userid, $videoid );
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Playlists
1. Retrieving a user's playlists
$request = WWW::YouTube::XML::API::playlists_by_userid([ $userid ]);
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Retrieving a single playlist
Follow a gd:feedLink with rel="http://gdata.youtube.com/schemas/2007#playlist".
3. Adding a playlist
$request = WWW::YouTube::XML::API::playlist_by_userid( $userid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
4. Updating a playlist
$request = WWW::YouTube::XML::API::get_playlist_by_userid_playlistid( $userid, $playlistid );
$result = WWW::YouTube::XML::API::ua_request( $request );
$xml_tree = WWW::YouTube::XML::parse_result( $result );
## Edit the Entry, then put the update
$request = WWW::YouTube::XML::API::put_playlist_by_userid_playlistid( $userid, $playlistid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
1. Adding a video to a playlist
$request = WWW::YouTube::XML::API::add_to_playlist_by_playlistid( $playlistid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Editing video information in a playlist
$request = WWW::YouTube::XML::API::get_entry_by_playlistid_entryid( $playlistid, $entryid );
$result = WWW::YouTube::XML::API::ua_request( $request );
$xml_tree = WWW::YouTube::XML::parse_result( $result );
## Edit the Entry, then put the update
$request = WWW::YouTube::XML::API::put_entry_by_playlistid_entryid( $playlistid, $entryid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
3. Removing a video from a playlist
$request = WWW::YouTube::XML::API::remove_entry_by_playlistid_entryid( $playlistid, $entryid );
$result = WWW::YouTube::XML::API::ua_request( $request );
5. Deleting a playlist
$request = WWW::YouTube::XML::API::remove_playlist_by_userid_playlistid( $userid, $playlistid );
$result = WWW::YouTube::XML::API::ua_request( $request );
3. Subscriptions
1. Retrieving a user's subscriptions
$request = WWW::YouTube::XML::API::subscriptions_by_userid([ $userid ]);
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Adding a subscription
$request = WWW::YouTube::XML::API::subscribe_by_userid( $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
3. Deleting a subscription
$request = WWW::YouTube::XML::API::remove_subscription_by_userid_subscriptionid( $userid, $subscriptionid );
$result = WWW::YouTube::XML::API::ua_request( $request );
1. User profiles
1. Retrieving a user's profile
$request = WWW::YouTube::XML::API::profile_by_userid([ $userid ]);
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Contacts
1. Retrieving a user's contacts
$request = WWW::YouTube::XML::API::contacts_by_userid([ $userid ]);
$result = WWW::YouTube::XML::API::ua_request( $request );
2. Adding a contact
$request = WWW::YouTube::XML::API::add_contact_by_userid( $userid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
3. Updating a contact
$request = WWW::YouTube::XML::API::get_contact_by_userid_contactid( $userid, $contactid );
$result = WWW::YouTube::XML::API::ua_request( $request );
$xml_tree = WWW::YouTube::XML::parse_result( $result );
# Edit the Entry, then put the update
$request = WWW::YouTube::XML::API::put_contact_by_userid_contactid( $userid, $contactid, $xml_tree );
$result = WWW::YouTube::XML::API::ua_request( $request );
4. Deleting a contact
$request = WWW::YouTube::XML::API::remove_contact_by_userid_contactid( $userid, $contactid );
$result = WWW::YouTube::XML::API::ua_request( $request );
Copyright (C) 2008 Eric R. Meyers E<lt>Eric.R.Meyers@gmail.comE<gt>
| WWW-YouTube documentation | Contained in the WWW-YouTube distribution. |
## ## WWW::YouTube::XML::API ## package WWW::YouTube::XML::API; use strict; use warnings; #program version #my $VERSION="0.1"; #For CVS , use following line our $VERSION=sprintf("%d.%04d", q$Revision: 2008.0728 $ =~ /(\d+)\.(\d+)/); BEGIN { require Exporter; @WWW::YouTube::XML::API::ISA = qw(Exporter); @WWW::YouTube::XML::API::EXPORT = qw(); ## export required @WWW::YouTube::XML::API::EXPORT_OK = ( ); ## export ok on request } ## end BEGIN require WWW::YouTube::GData; require WWW::YouTube::ML::API; ## NOTE: generic *ML require AppConfig::Std; require URI; require HTTP::Request; require HTTP::Message; require Data::Dumper; require File::Spec; require IO::File; require Date::Format; __PACKAGE__ =~ m/^(WWW::[^:]+)::([^:]+)(::([^:]+)){0,1}$/; ##debug##print( "API! $1::$2::$4\n" ); %WWW::YouTube::XML::API::opts_type_args = ( 'ido' => $1, 'iknow' => $2, 'iman' => $4, 'myp' => __PACKAGE__, 'opts' => {}, 'opts_filename' => {}, 'export_ok' => [], 'opts_type_flag' => [ @{$WWW::YouTube::ML::API::opts_type_args{'opts_type_flag'}}, ], 'opts_type_numeric' => [ @{$WWW::YouTube::ML::API::opts_type_args{'opts_type_numeric'}}, ], 'opts_type_string' => [ @{$WWW::YouTube::ML::API::opts_type_args{'opts_type_string'}}, ], ); die( __PACKAGE__ ) if ( __PACKAGE__ ne join( '::', $WWW::YouTube::XML::API::opts_type_args{'ido'}, $WWW::YouTube::XML::API::opts_type_args{'iknow'}, $WWW::YouTube::XML::API::opts_type_args{'iman'} ) ); WWW::YouTube::ML::API::create_opts_types( \%WWW::YouTube::XML::API::opts_type_args ); $WWW::YouTube::XML::API::numeric_max_try = $WWW::YouTube::ML::API::numeric_max_try; ##debug##$WWW::YouTube::XML::API::numeric_max_try++; ##debug##printf( STDERR "WWW::YouTube::XML::API::numeric_max_try=%d\n", $WWW::YouTube::XML::API::numeric_max_try ); ##debug##printf( STDERR "WWW::YouTube::ML::API::numeric_max_try=%d\n", $WWW::YouTube::ML::API::numeric_max_try ); WWW::YouTube::ML::API::register_all_opts( \%WWW::YouTube::XML::API::opts_type_args ); push( @WWW::YouTube::XML::API::EXPORT_OK, @{$WWW::YouTube::XML::API::opts_type_args{'export_ok'}} ); #foreach my $x ( keys %{$WWW::YouTube::XML::API::opts_type_args{'opts'}} ) #{ # printf( "opts{%s}=%s\n", $x, $WWW::YouTube::XML::API::opts_type_args{'opts'}{$x} ); #} ## end foreach #foreach my $x ( @{$WWW::YouTube::XML::API::opts_type_args{'export_ok'}} ) #{ # printf( "ok=%s\n", $x ); #} ## end foreach #foreach my $x ( @WWW::YouTube::XML::API::EXPORT_OK ) #{ # printf( "OK=%s\n", $x ); #} ## end foreach ## ## NOTE: Getopts hasn't set the options yet. (all flags = 0 right now) ## $WWW::YouTube::XML::API::url = 'http://gdata.youtube.com'; $WWW::YouTube::XML::API::config = AppConfig::Std->new(); $WWW::YouTube::XML::API::config_file = File::Spec->catfile( $ENV{'HOME'}, '.www_youtube_rc' ); $WWW::YouTube::XML::API::config->define( 'username', { EXPAND => 0 } ); $WWW::YouTube::XML::API::config->define( 'password', { EXPAND => 0 } ); $WWW::YouTube::XML::API::config->define( 'dev_key', { EXPAND => 0 } ); $WWW::YouTube::XML::API::config->define( 'clnt_id', { EXPAND => 0 } ); if ( ! -e $WWW::YouTube::XML::API::config_file ) { system( "echo 'username = ' > $WWW::YouTube::XML::API::config_file" ); system( "echo 'password = ' >> $WWW::YouTube::XML::API::config_file" ); system( "echo 'dev_key = ' >> $WWW::YouTube::XML::API::config_file" ); system( "echo 'clnt_id = ' >> $WWW::YouTube::XML::API::config_file" ); } ## end if if ( -e $WWW::YouTube::XML::API::config_file && ( ( ( stat( $WWW::YouTube::XML::API::config_file ) )[2] & 36 ) != 0 ) ) { die "Your config file $WWW::YouTube::XML::API::config_file is readable by others!\n"; } ## end if if ( -f $WWW::YouTube::XML::API::config_file ) { $WWW::YouTube::XML::API::config->file( $WWW::YouTube::XML::API::config_file ) || die "reading $WWW::YouTube::XML::API::config_file\n"; } ## end if ##debug##printf( "username='%s'\n", $WWW::YouTube::XML::API::config->username() ); ##debug##printf( "password='%s'\n", $WWW::YouTube::XML::API::config->password() ); ##debug##printf( "dev_key='%s'\n", $WWW::YouTube::XML::API::config->dev_key() ); ##debug##printf( "clnt_id='%s'\n", $WWW::YouTube::XML::API::config->clnt_id() ); $WWW::YouTube::XML::API::gdi = WWW::YouTube::GData->new( 'Email' => $WWW::YouTube::XML::API::config->username(), 'Passwd' => $WWW::YouTube::XML::API::config->password(), ); $WWW::YouTube::XML::API::gdi->login() || die "login failed: ".$WWW::YouTube::XML::API::gdi->errstr()."\n"; $WWW::YouTube::XML::API::ua = $WWW::YouTube::XML::API::gdi->_ua(); $WWW::YouTube::XML::API::ua->default_headers->push_header( 'X-GData-Key' => 'key=' . $WWW::YouTube::XML::API::config->dev_key() ); $WWW::YouTube::XML::API::ua->default_headers->push_header( 'X-GData-Client' => $WWW::YouTube::XML::API::config->clnt_id() ); ##debug##print $WWW::YouTube::XML::API::ua->default_header( 'Authorization' ) . "\n"; ##debug##print $WWW::YouTube::XML::API::ua->default_header( 'X-GData-Key' ) . "\n"; ##debug##print $WWW::YouTube::XML::API::ua->default_header( 'X-GData-Client' ) . "\n"; END { } ## end END ## ## WWW::YouTube::XML::API::show_all_opts ## sub WWW::YouTube::XML::API::show_all_opts { WWW::YouTube::ML::API::show_all_opts( \%WWW::YouTube::XML::API::opts_type_args ); } ## end sub WWW::YouTube::XML::API::show_all_opts ## ## WWW::YouTube::XML::API::request_dumper ## sub WWW::YouTube::XML::API::request_dumper { my $request = shift; my $ima = 'request'; ## dumper my $filename = $WWW::YouTube::XML::API::opts_type_args{'opts_filename'}{"${ima}_dmp"}; my $fh = IO::File->new(); $fh->open( "+>${filename}.txt" ) || die "opening: ${filename}.txt: $!\n"; $fh->print( Data::Dumper->Dump( [ $request ], [ $ima ] ) ); $fh->close(); } ## end sub WWW::YouTube::XML::API::request_dumper ## ## WWW::YouTube::XML::API::result_dumper ## sub WWW::YouTube::XML::API::result_dumper { my $result = shift; my $ima = 'result'; ## dumper my $filename = $WWW::YouTube::XML::API::opts_type_args{'opts_filename'}{"${ima}_dmp"}; my $fh = IO::File->new(); ## ## .xml ## $fh->open( "+>${filename}.xml" ) || die "opening: ${filename}.xml: $!\n"; $fh->print( $result->content() ); $fh->close(); ## ## .txt ## $fh->open( "+>${filename}.txt" ) || die "opening: ${filename}.txt: $!\n"; $fh->print( Data::Dumper->Dump( [ $result ], [ $ima ] ) ); $fh->close(); } ## end sub WWW::YouTube::XML::API::result_dumper ## ## WWW::YouTube::XML::API::tree_dumper ## sub WWW::YouTube::XML::API::tree_dumper { my $tree = shift; my $ima = 'tree'; ## dumper my $filename = $WWW::YouTube::XML::API::opts_type_args{'opts_filename'}{"${ima}_dmp"}; my $fh = IO::File->new(); $fh->open( "+>${filename}.txt" ) || die "opening: ${filename}.txt: $!\n"; $fh->print( Data::Dumper->Dump( [ $tree ], [ $ima ] ) ); $fh->close(); } ## end sub WWW::YouTube::XML::API::tree_dumper ## ## WWW::YouTube::XML::API::ua_request ## sub WWW::YouTube::XML::API::ua_request { my $request = shift; WWW::YouTube::XML::API::request_dumper( $request ) if ( $WWW::YouTube::XML::API::flag_request_dmp ); my $result = $WWW::YouTube::XML::API::ua->request( $request ); if ( ! $result->is_success() ) { printf( STDERR "Failed: %s\n", $result->status_line() ); } else { WWW::YouTube::XML::API::result_dumper( $result ) if ( $WWW::YouTube::XML::API::flag_result_dmp ); } ## end if return ( $result ); } ## end sub WWW::YouTube::XML::API::ua_request ## ## Retrieving Most Recent videos, etc. ## GET http://gdata.youtube.com/feeds/api/standardfeeds/most_recent ## sub WWW::YouTube::XML::API::standardfeeds { my $api = shift; my $request = HTTP::Request->new(); $request->method( 'GET' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/standardfeeds/$api" ); return( $request ); } ## end sub WWW::YouTube::XML::API::standardfeeds ## ## Retrieving user's contacts by userid ## GET http://gdata.youtube.com/feeds/api/users/userID/contacts ## sub WWW::YouTube::XML::API::contacts_by_userid { my $userid = shift || 'default'; my $request = HTTP::Request->new(); $request->method( 'GET' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/users/${userid}/contacts" ); return( $request ); } ## end sub WWW::YouTube::XML::API::contacts_by_userid ## ## Retrieving user's favorite videos by userid ## GET http://gdata.youtube.com/feeds/api/users/userID/favorites ## sub WWW::YouTube::XML::API::favorites_by_userid { my $userid = shift || 'default'; my $request = HTTP::Request->new(); $request->method( 'GET' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/users/${userid}/favorites" ); return( $request ); } ## end sub WWW::YouTube::XML::API::favorites_by_userid ## ## Retrieving user's playlists by userid ## GET http://gdata.youtube.com/feeds/api/users/userID/playlists ## sub WWW::YouTube::XML::API::playlists_by_userid { my $userid = shift || 'default'; my $request = HTTP::Request->new(); $request->method( 'GET' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/users/${userid}/playlists" ); return( $request ); } ## end sub WWW::YouTube::XML::API::playlists_by_userid ## ## Retrieving user's profile by userid ## GET http://gdata.youtube.com/feeds/api/users/userID ## sub WWW::YouTube::XML::API::profile_by_userid { my $userid = shift || 'default'; my $request = HTTP::Request->new(); $request->method( 'GET' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/users/${userid}" ); return( $request ); } ## end sub WWW::YouTube::XML::API::profile_by_userid ## ## Retrieving user's subscriptions by userid ## GET http://gdata.youtube.com/feeds/api/users/userID/subscriptions ## sub WWW::YouTube::XML::API::subscriptions_by_userid { my $userid = shift || 'default'; my $request = HTTP::Request->new(); $request->method( 'GET' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/users/${userid}/subscriptions" ); return( $request ); } ## end sub WWW::YouTube::XML::API::subscriptions_by_userid ## ## Retrieving user's uploaded videos by userid ## GET http://gdata.youtube.com/feeds/api/users/userID/uploads ## sub WWW::YouTube::XML::API::uploaded_by_userid { my $userid = shift || 'default'; my $request = HTTP::Request->new(); $request->method( 'GET' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/users/${userid}/uploads" ); return( $request ); } ## end sub WWW::YouTube::XML::API::uploaded_by_userid ## ## Retrieving user's uploaded video entry by userid and videoid ## GET http://gdata.youtube.com/feeds/api/users/userID/uploads/videoID ## sub WWW::YouTube::XML::API::get_uploaded_by_userid_videoid { my ( $userid, $videoid ) = @_; my $request = HTTP::Request->new(); $request->method( 'GET' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/users/${userid}/uploads/${videoid}" ); return( $request ); } ## end sub WWW::YouTube::XML::API::get_uploaded_by_userid_videoid ## ## Updating user's uploaded video entry by userid and videoid ## PUT http://gdata.youtube.com/feeds/api/users/userID/uploads/videoID ## sub WWW::YouTube::XML::API::put_uploaded_by_userid_videoid { my ( $userid, $videoid, $entry ) = @_; my $request = HTTP::Request->new(); $request->method( 'PUT' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/users/${userid}/uploads/${videoid}" ); $request->header( 'Content_Type' => 'application/atom+xml' ); $request->content( $entry->as_xml() ); return( $request ); } ## end sub WWW::YouTube::XML::API::put_uploaded_by_userid_videoid ## ## Removing user's uploaded videos by userid and videoid ## DELETE http://gdata.youtube.com/feeds/api/users/userID/uploads/videoID ## sub WWW::YouTube::XML::API::remove_uploaded_by_userid_videoid { my ( $userid, $videoid ) = @_; my $request = HTTP::Request->new(); $request->method( 'DELETE' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/users/${userid}/uploads/${videoid}" ); $request->header( 'Content_Type' => 'application/atom+xml' ); return( $request ); } ## end sub WWW::YouTube::XML::API::remove_uploaded_by_userid_videoid ## ## WWW::YouTube::XML::API::upload_by_userid_filename ## sub WWW::YouTube::XML::API::upload_by_userid_filename { my ( $userid, $filename, $xml_tree ) = @_; my $request = HTTP::Request->new(); $request->method( 'POST' ); $request->uri( "/feeds/api/users/${userid}/uploads" ); $request->protocol( 'HTTP/1.1' ); $request->header( 'Host' => 'uploads.gdata.youtube.com' ); $request->header( 'Slug' => $filename ); $request->header( 'Connection' => 'close' ); $request->content_type( 'multipart/related; boundary="<boundary_string>"' ); $request->add_part( HTTP::Message->new( ['Content-Type' => 'application/atom+xml; charset=UTF-8'], $xml_tree->as_XML() ) ); return( $request ); } ## end sub WWW::YouTube::XML::API::upload_by_userid_filename ## ## Browsing with categories and keywords ## GET http://gdata.youtube.com/feeds/api/videos/-/categories_or_keywords ## sub WWW::YouTube::XML::API::browse { my $query = shift; my $request = HTTP::Request->new(); $request->method( 'GET' ); if ( ! ( $query =~ m@^[/]@ ) ) { $query = '/' . $query; } ## end if $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/videos/-$query" ); return( $request ); } ## end sub WWW::YouTube::XML::API::browse ## ## Searching for videos ## GET http://gdata.youtube.com/feeds/api/videos?query_parameters ## sub WWW::YouTube::XML::API::search { my @query = @_; my $request = HTTP::Request->new(); my $uri = URI->new( $WWW::YouTube::XML::API::url . '/feeds/api/videos' ); $uri->query_form( @query ); $request->method( 'GET' ); $request->uri( $uri ); return( $request ); } ## end sub WWW::YouTube::XML::API::search ## ## Retrieving a video's comments by videoid ## GET http://gdata.youtube.com/feeds/api/videos/videoID/comments ## sub WWW::YouTube::XML::API::comments_by_videoid { my $videoid = shift; my $request = HTTP::Request->new(); $request->method( 'GET' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/videos/${videoid}/comments" ); return( $request ); } ## end sub WWW::YouTube::XML::API::comments_by_videoid ## ## Creating a comment ## ## POST http://gdata.youtube.com/feeds/api/videos/videoID/comments ## sub WWW::YouTube::XML::API::comment_by_videoid { my ( $videoid, $xml_tree ) = @_; my $request = HTTP::Request->new(); $request->method( 'POST' ); $request->uri( $WWW::Youtube::XML::API::url . "/feeds/api/videos/${videoid}/comments" ); $request->header( 'Content_Type' => 'application/atom+xml' ); $request->content( $xml_tree->as_XML() ); return( $request ); } ## end sub WWW::YouTube::XML::API::comment_by_videoid ## ## Creating a video response ## ## POST http://gdata.youtube.com/feeds/api/videos/videoID/responses ## sub WWW::YouTube::XML::API::response_by_videoid { my ( $videoid, $xml_tree ) = @_; my $request = HTTP::Request->new(); $request->method( 'POST' ); $request->uri( $WWW::YouTube::XML::API::url . "/feeds/api/${videoid}/responses" ); $request->header( 'Content_Type' => 'application/atom+xml' ); $request->content( $xml_tree->as_XML() ); return( $request ); } ## end sub WWW::YouTube::XML::API::response_by_videoid 1; __END__ ## package WWW::YouTube::XML::API