YouTubeに動画をアップロードしてみよう
と、思った。
とりあえず、スクリプト集めだな。そかそか、APIのデベロッパーキーが必要ね?
ん?クライアントIDってなんだっけ? この辺りは簡単に探せそうだな。
my $developer_key = ‘xxxxxx’;
my $client_id = ‘xxxxxx’;
ダウンロードして、タイトルつけてアップロードってことになるな。
なるほど・・・このスクリプトは、ファイル名を渡してやれば、アップロードしてくれるのか。
結構よさげだね。
ダウンロードもスクリプトで処理したいな、探してみる。
d.hatena.ne.jp/shakemid/20081221/1229868522
とりあえず、スクリプト集めだな。そかそか、APIのデベロッパーキーが必要ね?
ん?クライアントIDってなんだっけ? この辺りは簡単に探せそうだな。
my $developer_key = ‘xxxxxx’;
my $client_id = ‘xxxxxx’;
ダウンロードして、タイトルつけてアップロードってことになるな。
なるほど・・・このスクリプトは、ファイル名を渡してやれば、アップロードしてくれるのか。
結構よさげだね。
ダウンロードもスクリプトで処理したいな、探してみる。
d.hatena.ne.jp/shakemid/20081221/1229868522
#!/usr/bin/perl # YouTube upload use strict; use warnings; use utf8; use LWP::UserAgent; use HTTP::Request; use HTTP::Request::Common; use IO::All; use Getopt::Long; use Jcode; # usage sub usage { print <<EOM; Usage: $0 [option(s)] filename Options: -t, --title title (default: filename) -d, --description description (default: filename) -k, --keywords keywords (default: filename) -c, --category category (default: People) -m, --ctype content-type (default: video/x-flv) EOM exit 1; } # account settings my $username = 'username'; my $password = 'password'; my $developer_key = 'xxxxxx'; my $client_id = 'xxxxxx'; # video settings my $title; my $description; my $keywords; my $category; my $content_type; my $options = GetOptions( "t|title=s" => \$title, "d|description=s" => \$description, "k|keywords=s" => \$keywords, "c|category=s" => \$category, "m|ctype=s" => \$content_type, ) or usage(); $content_type ||= "video/x-flv"; my $filename = shift; usage() if ! defined $filename; my $video_detail = video_detail( { title => $title || $filename, description => $description || $filename, keywords => $keywords || $filename, category => $category, } ); my $ua = LWP::UserAgent->new( keep_alive => 1 ); my $data = io($filename)->binary->all; my $token = auth(); upload($token); sub upload { my $token = shift; my $url = "http://uploads.gdata.youtube.com/feeds/api/users/$username/uploads"; my $request = HTTP::Request->new( POST => $url ); $request->header( "Authorization" => "GoogleLogin auth=$token", "X-GData-Key" => "key=$developer_key", "X-GData-Client" => $client_id, Slug => $filename, Content_Type => 'multipart/related; boundary=xyzzy', ); $request->add_part( HTTP::Message->new( [ Content_type => 'application/atom+xml' ], $video_detail ) ); $request->add_part( HTTP::Message->new( [ Content_type => $content_type, 'Content-Transfer-Encoding' => 'binary' ], $data ) ); my $response = $ua->request($request); die $response->status_line unless ( $response->is_success ); print $response->content; } sub auth { my $request = POST( "https://www.google.com/youtube/accounts/ClientLogin", Content_Type => 'application/x-www-form-urlencoded', Content => [ Email => $username, Passwd => $password, service => "youtube", source => "uploads", ], ); my $response = $ua->request($request); die $response->status_line unless ( $response->is_success ); $response->content =~ /Auth=(.*?)\n/; return $1; } sub video_detail { my $param = shift; foreach my $key ( keys %$param ){ #utf8::encode($param->{$key}) if utf8::is_utf8($param->{$key}); $param->{$key} = Jcode->new( $param->{$key} )->utf8; } my $title = $param->{title} || die "title is required"; my $description = $param->{description} || die "description is required"; my $keywords = $param->{keywords} || die "keywords is required"; my $category = $param->{category} || "People"; my $video_detail = << "XML"; <?xml version="1.0"?> <entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007"> <media:group> <media:title type="plain">$title</media:title> <media:description type="plain">$description</media:description> <media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">$category</media:category> <media:keywords>$keywords</media:keywords> </media:group> </entry> XML return $video_detail; }
スポンサーリンク