YouTubeAPIYouTube Data API v3を試してみました
- YouTube API v3について〔クライアントIDや開発キーの入手〕
- チャンネル情報を取得する
- 例)特定のチャンネル情報を取得する(認証なし)〔チャンネルID指定〕
- 例)認証ユーザーのチャンネル情報を取得(認証あり)
- 例)複数のチャンネル情報を取得(認証なし)〔チャンネルID指定〕
- 例)複数のチャンネル情報を取得(認証あり)〔チャンネルID指定〕
- 再生リスト情報を取得する
- 例)認証ユーザー自身の再生リスト情報を取得(認証あり)
- 例)特定のチャンネルの再生リスト情報を取得する(認証なし)〔チャンネルID指定〕
- 例)複数の再生リスト情報を取得する(認証なし)〔再生リストID指定〕
- 再生リスト内の動画情報を取得する
- 例)特定の再生リスト内の動画情報取得(認証あり)〔再生リストID指定〕
- 例)特定の再生リスト内の動画情報取得(認証なし)〔再生リストID指定〕
- 動画情報を取得する
- 特定の動画情報を取得する(認証あり)〔動画ID指定〕
- 特定の動画情報を取得する(認証なし)〔動画ID指定〕
- 動画検索結果を取得する
- 動画のカテゴリ一覧を取得する
YouTube API v3について
クライアントIDや開発キーの入手
2013/3/24
YouTube API v3は、2013年5月10日にリリース版として公開されました。
→https://developers.google.com/youtube/v3/
YouTube Data APIの新バージョンv3が開発中の実験版として公開されていたので、取得系まわりのAPIをJavaScriptで試してみました。 一部しか試してないので大したことは言えませんが、取得系APIでは、取得結果に含めるリソースをフィルタリングできるのが新しいかな。
Google APIs Discovery Serviceで提供されているAPIを使ってアクセスできるようになっていて、結果はJSONで受け取れます。
https://developers.google.com/discovery/
JavaScript用のクライアントライブラリはこちら。
→Google APIs Client Library for JavaScript
サポートブラウザは、Chrome 8+、Firefox 3.5+、MSIE 8+、Safari 4+。 いよいよIE7とはサヨナラですねー。YouTubeのサポート環境もHTML5対応ブラウザとなるようだし。
YouTube API v3で扱えるリソースは以下。
- Activities(アクティビティ)
- Channels(チャンネル)
- GuideCategories(ガイドカテゴリ)
- PlaylistItems(再生リスト内の動画)
- Playlists(再生リスト)
- Search(検索)
- Subscriptions(チャンネル登録者)
- Thumbnails(サムネイル)
- VideoCategories(動画カテゴリ)
- Videos(動画)
v2との違いは、認証方法がOAuth2.0になったことと、リソースの受け取り方。
今までだと全てのリソースをひとまず全部受け取ってから必要なデータだけパースして出力していましたが、 v3では、"part"、"fields"というパラメータがサポートされており、受け取る時に、動画ID・サムネイル・再生回数だけなど、取得したいデータだけにフィルタリングしてリソースの一部だけを取得できるようになっていました。
"part"パラメータは必須で、リソースを返すプロパティのグループの識別子をカンマ区切りで指定します。 APIによってパラメータに指定可能な識別子は異なっており、動画情報取得ならsnippet、contentDetails、player、statistics、statusが指定できます。
"field"パラメータは、"part"パラメータでリクエストしたリソース内にある特定のプロパティを指定してフィルタリングすることができます。
開発キーとクライアントIDの取得は、Google APIコンソール参照。
開発キーはAPI上限が緩和されるので指定しておいた方が良いです。クライアントIDは認証する際に必要です。
このページでは、JavaScript用のクライアントライブラリを使って、YouTubeチャンネルや動画情報を取得する方法を説明します。
チャンネル情報を取得する
2013/5/19
参照:https://developers.google.com/youtube/v3/docs/channels/list
指定したチャンネルIDのチャンネル情報を取得できます。
複数指定する場合はチャンネルIDをカンマ区切りで指定します。
チャンネルIDは、http://www.youtube.com/cocoism3の"cocoism3"ではなく、「data-subscription-value」の値。 チャンネルIDはYouTubeチャンネルのソース内を「CHANNEL_ID」で検索してもわかります。
partパラメータには、以下を指定可能です。
id, snippet, brandingSettings, contentDetails, invideoPromotion, statistics, topicDetails
設置サンプル
例)特定のチャンネル情報を取得する(認証なし)
チャンネルID指定
2013/5/19
認証なしで、指定したチャンネルIDのチャンネル情報を取得します。
※「id」にはチャンネルIDが入っています。
http://www.youtube.com/channel/チャンネルIDで、チャンネルのURLになります。
※「snippet」には、チャンネル情報(チャンネルのタイトル、登録日、説明文、アバター画像のサムネイル)が入っています。 サムネイルはdefault, medium, heightの3サイズ。アバター画像の元サイズが小さい場合はdefaultのみしか入っていません。
※「brandingSettings」には「image」、「hints」が入っていました。チャンネルアートのいろいろなサイズの画像情報が入ってます。
※「contentDetails」には、Google+のID、再生リストのID(お気に入り動画、評価の高い動画、アップロード動画)が入っています。 自身のチャンネルの場合、閲覧履歴(watchHistory)、後で見る(watchLater)は認証なしだと取得できません(他人のチャンネルの場合、それらの情報は認証有無に限らず見れません。)
※「invideoPromotion」、「topicDetails」は含まれていませんでした。
※「statistics」には、チャンネル全体でのコメント数、登録者数、動画数、再生回数が入っています。
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | チャンネル情報取得(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* チャンネルID http://www.youtube.com/channel/UCWuGWqlTp0_To1eJuSBvLMg http://www.youtube.com/user/cocoism */ var CHANNEL_ID="UCWuGWqlTp0_To1eJuSBvLMg"; /* 開発キー https://developers.google.com/youtube/registering_an_application */ //var APIKEY="AIzaSyBWqa3wGl7b8DKxpepR6acqdvgn54_H-DA"; var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; /* APIロード */ function onJSClientLoad() { dbg("onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', getUserChannel); } /* APIリクエスト */ var requestOptions = { id:CHANNEL_ID, part:"id, snippet, brandingSettings, contentDetails, invideoPromotion, statistics, topicDetails" }; /* チャンネル情報取得 */ function getUserChannel(){ var request=gapi.client.request({ path:"/youtube/v3/channels", params:requestOptions }); request.execute(function(resp) { dbg(resp); output(resp); }); } /* HTML出力 */ function output(data){ var s=""; var pageInfo=data.pageInfo; s+="<li><b>pageInfo</b>:<ul>"; s+="<li>resultsPerPage:"+pageInfo.resultsPerPage+"</li>"; s+="<li>totalResults:"+pageInfo.totalResults+"</li>"; s+="</ul></li>"; var totalResults=data.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ var resultsPerPage=data.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ var total=Math.floor(totalResults/resultsPerPage); dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); $.each(data.items, function(i, item){ /* id */ s+=(item.id)?"<li>チャンネルID(id):"+item.id+"</li>":""; /* snippet */ if(item.snippet){ var snippet=item.snippet; s+="<li><b>snippet</b>:<ul>"; s+=(snippet.title)?"<li>チャンネルタイトル(title):"+snippet.title+"</li>":""; s+=(snippet.publishedAt)?"<li>登録日(publishedAt):"+snippet.publishedAt+"</li>":""; s+=(snippet.description)?"<li>チャンネル説明文(description):"+snippet.description+"</li>":""; if(snippet.thumbnails && snippet.thumbnails.default.url){ /* サムネイル(default, medium, height) */ s+="<li>thumbnails:<ul>"; $.each(snippet.thumbnails, function(y, ytem){ s+="<li>"+y+":"+ytem.url+"<br><img src='"+ytem.url+"' /></li>"; }); s+="</ul></li>"; } s+="</ul></li>"; } /* brandingSettings */ if(item.brandingSettings){ s+="<li><b>brandingSettings</b><ul>"; var brandingSettings=item.brandingSettings; for(var o in brandingSettings){ s+="<li>"+o+"<ul>"; for(var oo in brandingSettings[o]){ if(o=="hints"){ s+="<li>"+oo+"<ul>"; for(var ooo in brandingSettings[o][oo]){ s+="<li>"+ooo+": "+brandingSettings[o][oo][ooo]+"</li>"; } s+="</ul>"; }else{ s+="<li>"+oo+": "+brandingSettings[o][oo]+"</li>"; } } s+="</ul></li>"; } s+="</ul></li>"; } /* contentDetails */ if(item.contentDetails){ s+="<li><b>contentDetails</b>:<ul>"; var contentDetails=item.contentDetails; var googlePlusUserId=contentDetails.googlePlusUserId; var relatedPlaylists=contentDetails.relatedPlaylists; s+=(googlePlusUserId)?"<li>Google+のID(googlePlusUserId):<a href='https://plus.google.com/'>"+googlePlusUserId+"</a></li>":""; if(relatedPlaylists){ s+="<li>relatedPlaylists:<ul>"; s+=(relatedPlaylists.favorites)?"<li>お気に入りの動画(favorites):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.favorites+"'>"+relatedPlaylists.favorites+"</a></li>":""; s+=(relatedPlaylists.likes)?"<li>評価の高い動画(likes):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.likes+"'>"+relatedPlaylists.likes+"</a></li>":""; s+=(relatedPlaylists.uploads)?"<li>アップロード動画 (uploads):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.uploads+"'>"+relatedPlaylists.uploads+"</a></li>":""; /* 以下は認証しないと取れない */ s+=(relatedPlaylists.watchHistory)?"<li>閲覧履歴(watchHistory):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.watchHistory+"'>"+relatedPlaylists.watchHistory+"</a></li>":""; s+=(relatedPlaylists.watchLater)?"<li>後で見る(watchLater):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.watchLater+"'>"+relatedPlaylists.watchLater+"</a></li>":""; s+="</ul></li>"; } s+="</ul></li>"; } /* invideoPromotion 入ってない */ if(item.invideoPromotion){ dbg(item.invideoPromotion); } /* statistics */ if(item.statistics){ var statistics=item.statistics; s+="<li><b>statistics</b>:"; s+="<ul>"; s+=(statistics.commentCount)?"<li>コメント数(commentCount):"+statistics.commentCount+"</li>":""; s+=(statistics.subscriberCount)?"<li>登録者数(subscriberCount):"+statistics.subscriberCount+"</li>":""; s+=(statistics.videoCount)?"<li>動画数(videoCount):"+statistics.videoCount+"</li>":""; s+=(statistics.viewCount)?"<li>再生回数(viewCount):"+statistics.viewCount+"</li>":""; s+="</ul>"; s+="</li>"; } /* topicDetails 入ってない */ if(item.topicDetails){ dbg(item.topicDetails); } }); $("#results").append("<h2>channels</h2><ul>"+s+"</ul>"); } function fSize(ary){ var cnt=0; for(var i in ary){ cnt++; } return cnt; } function dbg(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body> <div id="results"></div> </body> </html>
例)認証ユーザーのチャンネル情報を取得(認証あり)
2013/5/19
認証して、認証ユーザー自身のチャンネル情報を取得します。
※認証すると、「contentDetails」には、自身のチャンネルの場合、閲覧履歴(watchHistory)、後で見る(watchLater)のIDが入ります。
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | チャンネル情報取得(認証あり)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 開発キー https://code.google.com/apis/console var APIKEY="AIzaSyBWqa3wGl7b8DKxpepR6acqdvgn54_H-DA"; */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; /* クライアントID https://code.google.com/apis/console var OAUTH2_CLIENT_ID = "693654264922.apps.googleusercontent.com"; */ var OAUTH2_CLIENT_ID="1090976309145-ach3n4qqmm02js32g7sbe10k66mo0g9q.apps.googleusercontent.com"; var OAUTH2_SCOPES = [ 'https://www.googleapis.com/auth/yt-analytics.readonly', 'https://www.googleapis.com/auth/youtube.readonly' ]; /* GoogleAPIロード後に呼び出される */ window.onJSClientLoad = function() { dbg("★onJSClientLoad"); gapi.auth.init(function() { window.setTimeout(checkAuth,1); }); }; /* OAuth認証チェック */ function checkAuth() { dbg("★checkAuth"); gapi.auth.authorize({ client_id: OAUTH2_CLIENT_ID, scope: OAUTH2_SCOPES, immediate: true },handleAuthResult); } /* gapi.auth.authorize()の呼び出し結果を処理 */ function handleAuthResult(authResult) { dbg("★handleAuthResult"); if (authResult) { /* 認証に成功したら認証リンクを隠し、認証したら見れるものを表示 */ $('.pre-auth').hide(); $('.post-auth').show(); /* 処理実行 */ loadAPIClientInterfaces(); }else{ /* 認証に失敗したら認証リンクを表示し、認証しないと見れないものは非表示 */ $('.post-auth').hide(); $('.pre-auth').show(); displayMessage("ERROR: 認証に失敗しました"); /* ログインリンクを有効化 */ $( '#login-link' ).click(function() { gapi.auth.authorize({ client_id: OAUTH2_CLIENT_ID, scope: OAUTH2_SCOPES, immediate: false }, handleAuthResult); }); } } /* ページにメッセージを表示する */ function displayMessage(message) { $("#message").text(message).show(); } /* 上記で表示されたメッセージを隠す */ function hideMessage() { $("#message").hide(); } /* APIロード */ function loadAPIClientInterfaces() { dbg("★handleAPILoaded"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', getUserChannel); } /* チャンネル情報取得 */ function getUserChannel(){ dbg("★getUserChannel"); var request = gapi.client.youtube.channels.list({ mine:true, part:"id, snippet, brandingSettings, contentDetails, invideoPromotion, statistics, topicDetails" }); request.execute(function(resp) { dbg(resp) if(resp.error){ displayMessage("ERROR: "+resp.message); }else{ output(resp); } }); } /* HTML出力 */ function output(data){ dbg("★output"); var s=""; var pageInfo=data.pageInfo; s+="<li><b>pageInfo</b>:<ul>"; s+="<li>resultsPerPage:"+pageInfo.resultsPerPage+"</li>"; s+="<li>totalResults:"+pageInfo.totalResults+"</li>"; s+="</ul></li>"; var totalResults=data.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ var resultsPerPage=data.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ var total=Math.floor(totalResults/resultsPerPage); dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); $.each(data.items, function(i, item){ /* id */ s+=(item.id)?"<li>チャンネルID(id):"+item.id+"</li>":""; /* snippet */ if(item.snippet){ var snippet=item.snippet; s+="<li><b>snippet</b>:<ul>"; s+=(snippet.title)?"<li>チャンネルタイトル(title):"+snippet.title+"</li>":""; s+=(snippet.publishedAt)?"<li>登録日(publishedAt):"+snippet.publishedAt+"</li>":""; s+=(snippet.description)?"<li>チャンネル説明文(description):"+snippet.description+"</li>":""; if(snippet.thumbnails && snippet.thumbnails.default.url){ /* サムネイル(default, medium, height) */ s+="<li>thumbnails:<ul>"; $.each(snippet.thumbnails, function(y, ytem){ s+="<li>"+y+":"+ytem.url+"<br><img src='"+ytem.url+"' /></li>"; }); s+="</ul></li>"; } s+="</ul></li>"; } /* brandingSettings */ if(item.brandingSettings){ s+="<li><b>brandingSettings</b><ul>"; var brandingSettings=item.brandingSettings; for(var o in brandingSettings){ s+="<li>"+o+"<ul>"; for(var oo in brandingSettings[o]){ if(o=="hints"){ s+="<li>"+oo+"<ul>"; for(var ooo in brandingSettings[o][oo]){ s+="<li>"+ooo+": "+brandingSettings[o][oo][ooo]+"</li>"; } s+="</ul>"; }else{ s+="<li>"+oo+": "+brandingSettings[o][oo]+"</li>"; } } s+="</ul></li>"; } s+="</ul></li>"; } /* contentDetails */ if(item.contentDetails){ s+="<li><b>contentDetails</b>:<ul>"; var contentDetails=item.contentDetails; var googlePlusUserId=contentDetails.googlePlusUserId; var relatedPlaylists=contentDetails.relatedPlaylists; s+=(googlePlusUserId)?"<li>Google+のID(googlePlusUserId):<a href='https://plus.google.com/'>"+googlePlusUserId+"</a></li>":""; if(relatedPlaylists){ s+="<li>relatedPlaylists:<ul>"; s+=(relatedPlaylists.favorites)?"<li>お気に入りの動画(favorites):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.favorites+"'>"+relatedPlaylists.favorites+"</a></li>":""; s+=(relatedPlaylists.likes)?"<li>評価の高い動画(likes):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.likes+"'>"+relatedPlaylists.likes+"</a></li>":""; s+=(relatedPlaylists.uploads)?"<li>アップロード動画 (uploads):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.uploads+"'>"+relatedPlaylists.uploads+"</a></li>":""; /* 以下は認証しないと取得不可 */ s+=(relatedPlaylists.watchHistory)?"<li>閲覧履歴(watchHistory):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.watchHistory+"'>"+relatedPlaylists.watchHistory+"</a></li>":""; s+=(relatedPlaylists.watchLater)?"<li>後で見る(watchLater):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.watchLater+"'>"+relatedPlaylists.watchLater+"</a></li>":""; s+="</ul></li>"; } s+="</ul></li>"; } /* invideoPromotion 入ってない */ if(item.invideoPromotion){ dbg(item.invideoPromotion); } /* statistics */ if(item.statistics){ var statistics=item.statistics; s+="<li><b>statistics</b>:"; s+="<ul>"; s+=(statistics.commentCount)?"<li>コメント数(commentCount):"+statistics.commentCount+"</li>":""; s+=(statistics.subscriberCount)?"<li>登録者数(subscriberCount):"+statistics.subscriberCount+"</li>":""; s+=(statistics.videoCount)?"<li>動画数(videoCount):"+statistics.videoCount+"</li>":""; s+=(statistics.viewCount)?"<li>再生回数(viewCount):"+statistics.viewCount+"</li>":""; s+="</ul>"; s+="</li>"; } /* topicDetails 入ってない */ if(item.topicDetails){ dbg(item.topicDetails); } }); $("#results").append("<h2>channels</h2><ul>"+s+"</ul>"); } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body id="oauth"> <div id="login-container" class="pre-auth"> <p>このサンプルを試すには、YouTubeアカウントへのアクセスが必要です。<br>許可する場合は<a href="#" id="login-link">こちらから認証</a>を行ってください。</p> </div> <div class="post-auth"> <div id="message"></div> <div id="results"></div> </div> </body> </html>
例)複数のチャンネル情報を取得(認証なし)
チャンネルID指定
2013/5/19
認証なしで、指定した複数のチャンネルIDのチャンネル情報を取得します。
※企業チャンネルの「brandingSettings」には「image」、「hints」の他、「channel」が入っていました。 デフォルトタブ(defaultTab)やチャンネル未登録者向けの紹介動画のID(unsubscribedTrailer)がとれるんですね。 一般チャンネルで紹介動画指定しているんですが、それは入ってませんでした。
title: LOUIS VUITTON description: The exclusive, inspired source for all Louis Vuitton video content. keywords: "Louis Vuitton" "The Art of Travel" Journeys Awards LV "Marc Jacobs" "Fashion Show" Fashion Luxury defaultTab: Featured moderateComments: true showRelatedChannels: true showBrowseView: true featuredChannelsTitle: louisvuittonjp unsubscribedTrailer: title: Official Dior Channel description: "I create so that each and every woman is the most beautiful". Christian Dior. DIOR is the ultimate symbol of elegance, excellence and luxury. In the 21st Century, DIOR continues to define elegance and style with the same audacity that inspired Monsieur Dior when he launched his house. Christian Dior was a visionary. Beginning with his first collection in 1947 he rewrote the rules of modern elegance and imposed his style on the entire world. He brought women his vision of beauty and happiness. He showed unprecedented creative originality. http://www.dior.com/ keywords: Dior canal officiel "official channel Dior" defaultTab: Featured moderateComments: true showBrowseView: true featuredChannelsTitle: Sélection de chaînes unsubscribedTrailer: BIxSDYyb-oc
※サンプルで使用したチャンネルID
youtube.com/user/cocoism3 UCWuGWqlTp0_To1eJuSBvLMg
youtube.com/user/LOUISVUITTON UC5q0PIKGr2lGOsiT14AlEYg
youtube.com/user/CHANEL UCclHSnngVTZK7LEOQAzcg1w
youtube.com/user/Dior UC6xD-jKli-_qIYXDTsNv4dw
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 複数チャンネル情報を取得(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 開発キー https://code.google.com/apis/console var APIKEY="AIzaSyBWqa3wGl7b8DKxpepR6acqdvgn54_H-DA"; */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; /* APIロード */ function onJSClientLoad() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', getUserChannel); } /* チャンネル情報取得 */ function getUserChannel(){ dbg("★getUserChannel"); var request=gapi.client.request({ path:"/youtube/v3/channels", params :{ id:"UCWuGWqlTp0_To1eJuSBvLMg,UC5q0PIKGr2lGOsiT14AlEYg,UCclHSnngVTZK7LEOQAzcg1w,UC6xD-jKli-_qIYXDTsNv4dw", part:"id, snippet, brandingSettings, contentDetails, invideoPromotion, statistics, topicDetails" } }); request.execute(function(resp) { dbg(resp) if(resp.error){ displayMessage("ERROR: "+resp.message); }else{ output(resp); } }); } /* HTML出力 */ function output(data){ dbg("★output"); var s=""; var pageInfo=data.pageInfo; s+="<li><b>pageInfo</b>:<ul>"; s+="<li>resultsPerPage:"+pageInfo.resultsPerPage+"</li>"; s+="<li>totalResults:"+pageInfo.totalResults+"</li>"; s+="</ul></li>"; var totalResults=data.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ var resultsPerPage=data.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ var total=Math.floor(totalResults/resultsPerPage); dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); $.each(data.items, function(i, item){ /* id */ s+="<li>★<b>"+((item.id)?"チャンネルID(id):"+item.id:"")+"</b><ul>"; /* snippet */ if(item.snippet){ var snippet=item.snippet; s+="<li><b>snippet</b>:<ul>"; s+=(snippet.title)?"<li>チャンネル名称(title):"+snippet.title+"</li>":""; s+=(snippet.description)?"<li>チャンネル説明文(description):"+snippet.description+"</li>":""; s+=(snippet.publishedAt)?"<li>登録日(publishedAt):"+snippet.publishedAt+"</li>":""; if(snippet.thumbnails && snippet.thumbnails.default){ /* サムネイル(default, medium, height) */ s+="<li>thumbnails:<ul>"; $.each(snippet.thumbnails, function(y, ytem){ s+="<li>"+y+":"+ytem.url+"<br><img src='"+ytem.url+"' /></li>"; }); s+="</ul></li>"; } s+="</ul></li>"; } /* brandingSettings */ if(item.brandingSettings){ s+="<li><b>brandingSettings</b><ul>"; var brandingSettings=item.brandingSettings; for(var o in brandingSettings){ s+="<li>"+o+"<ul>"; for(var oo in brandingSettings[o]){ if(o=="hints"){ s+="<li>"+oo+"<ul>"; for(var ooo in brandingSettings[o][oo]){ s+="<li>"+ooo+": "+brandingSettings[o][oo][ooo]+"</li>"; } s+="</ul>"; }else{ s+="<li>"+oo+": "+brandingSettings[o][oo]+"</li>"; } } s+="</ul></li>"; } s+="</ul></li>"; } /* contentDetails */ if(item.contentDetails){ s+="<li><b>contentDetails</b>:<ul>"; var contentDetails=item.contentDetails; var googlePlusUserId=contentDetails.googlePlusUserId; var relatedPlaylists=contentDetails.relatedPlaylists; s+=(googlePlusUserId)?"<li>Google+のID(googlePlusUserId):<a href='https://plus.google.com/'>"+googlePlusUserId+"</a></li>":""; if(relatedPlaylists){ s+="<li>関連プレイリスト(relatedPlaylists):<ul>"; s+=(relatedPlaylists.favorites)?"<li>お気に入りの動画(favorites):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.favorites+"'>"+relatedPlaylists.favorites+"</a></li>":""; s+=(relatedPlaylists.likes)?"<li>評価の高い動画(likes):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.likes+"'>"+relatedPlaylists.likes+"</a></li>":""; s+=(relatedPlaylists.uploads)?"<li>アップロード動画 (uploads):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.uploads+"'>"+relatedPlaylists.uploads+"</a></li>":""; s+=(relatedPlaylists.watchHistory)?"<li>閲覧履歴(watchHistory):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.watchHistory+"'>"+relatedPlaylists.watchHistory+"</a></li>":""; s+=(relatedPlaylists.watchLater)?"<li>後で見る(watchLater):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.watchLater+"'>"+relatedPlaylists.watchLater+"</a></li>":""; s+="</ul></li>"; } s+="</ul></li>"; } /* invideoPromotion 入ってない */ if(item.invideoPromotion){ dbg(item.invideoPromotion); } /* statistics */ if(item.statistics){ var statistics=item.statistics; s+="<li><b>statistics</b>:<ul>"; s+=(statistics.commentCount)?"<li>コメント数(commentCount):"+statistics.commentCount+"</li>":""; s+=(statistics.subscriberCount)?"<li>登録者数(subscriberCount):"+statistics.subscriberCount+"</li>":""; s+=(statistics.videoCount)?"<li>動画数(videoCount):"+statistics.videoCount+"</li>":""; s+=(statistics.viewCount)?"<li>再生回数(viewCount):"+statistics.viewCount+"</li>":""; s+="</ul></li>"; } /* topicDetails 入ってない */ if(item.topicDetails){ dbg(item.topicDetails); } s+="</ul></li>"; }); $("#results").append("<h2>channels</h2><ul>"+s+"</ul>"); } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body> <h1>設置サンプル:[YouTube API(v3) - 複数のチャンネル情報取得(認証なし)</h1> <div id="results"></div> </body> </html>
例)複数のチャンネル情報を取得(認証あり)
チャンネルID指定
2013/5/19
認証して、指定した複数のチャンネルIDのチャンネル情報を取得します。
他人のチャンネルの場合、認証してもしなくても取得できる情報は同じです。
※サンプルで使用したチャンネルID
youtube.com/user/cocoism3 UCWuGWqlTp0_To1eJuSBvLMg
youtube.com/user/LOUISVUITTON UC5q0PIKGr2lGOsiT14AlEYg
youtube.com/user/CHANEL UCclHSnngVTZK7LEOQAzcg1w
youtube.com/user/Dior UC6xD-jKli-_qIYXDTsNv4dw
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 複数のチャンネル情報取得</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 開発キー https://code.google.com/apis/console */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; /* クライアントID https://code.google.com/apis/console var OAUTH2_CLIENT_ID = "693654264922.apps.googleusercontent.com"; */ var OAUTH2_CLIENT_ID="1090976309145-ach3n4qqmm02js32g7sbe10k66mo0g9q.apps.googleusercontent.com"; var OAUTH2_SCOPES = [ 'https://www.googleapis.com/auth/yt-analytics.readonly', 'https://www.googleapis.com/auth/youtube.readonly' ]; /* GoogleAPIロード後に呼び出される */ window.onJSClientLoad = function() { dbg("★onJSClientLoad"); gapi.auth.init(function() { window.setTimeout(checkAuth,1); }); }; /* OAuth認証チェック */ function checkAuth() { dbg("★checkAuth"); gapi.auth.authorize({ client_id: OAUTH2_CLIENT_ID, scope: OAUTH2_SCOPES, immediate: true },handleAuthResult); } /* gapi.auth.authorize()の呼び出し結果を処理 */ function handleAuthResult(authResult) { dbg("★handleAuthResult"); if (authResult) { /* 認証に成功したら認証リンクを隠し、認証したら見れるものを表示 */ $('.pre-auth').hide(); $('.post-auth').show(); /* 処理実行 */ loadAPIClientInterfaces(); }else{ /* 認証に失敗したら認証リンクを表示し、認証しないと見れないものは非表示 */ $('.post-auth').hide(); $('.pre-auth').show(); displayMessage("認証に失敗しました"); /* ログインリンクを有効化 */ $( '#login-link' ).click(function() { gapi.auth.authorize({ client_id: OAUTH2_CLIENT_ID, scope: OAUTH2_SCOPES, immediate: false }, handleAuthResult); }); } } /* ページにメッセージを表示する */ function displayMessage(message) { $("#message").text(message).show(); } /* 上記で表示されたメッセージを隠す */ function hideMessage() { $("#message").hide(); } /* APIロード */ function loadAPIClientInterfaces() { dbg("★loadAPIClientInterfaces"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', getUserChannel); } /* チャンネル情報取得 */ function getUserChannel(){ dbg("★getUserChannel"); dbg("getUserChannel"); var request=gapi.client.request({ mine:"", path:"/youtube/v3/channels", params :{ /* チャンネルIDをカンマ区切りで指定 */ id:"UCWuGWqlTp0_To1eJuSBvLMg,UC5q0PIKGr2lGOsiT14AlEYg,UCclHSnngVTZK7LEOQAzcg1w,UC6xD-jKli-_qIYXDTsNv4dw", part:"id, snippet, brandingSettings, contentDetails, invideoPromotion, statistics, topicDetails" } }); request.execute(function(resp) { dbg(resp) if(resp.error){ displayMessage("ERROR: "+resp.message); }else{ output(resp); } }); } /* HTML出力 */ function output(data){ dbg("★output"); var s=""; var pageInfo=data.pageInfo; s+="<li><b>pageInfo</b>:<ul>"; s+="<li>resultsPerPage:"+pageInfo.resultsPerPage+"</li>"; s+="<li>totalResults:"+pageInfo.totalResults+"</li>"; s+="</ul></li>"; var totalResults=data.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ var resultsPerPage=data.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ var total=Math.floor(totalResults/resultsPerPage); dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); $.each(data.items, function(i, item){ /* id */ s+="<li>★<b>"+((item.id)?"チャンネルID(id):"+item.id:"")+"</b><ul>"; /* snippet */ if(item.snippet){ var snippet=item.snippet; s+="<li><b>snippet</b>:<ul>"; s+=(snippet.title)?"<li>チャンネル名称(title):"+snippet.title+"</li>":""; s+=(snippet.description)?"<li>チャンネル説明文(description):"+snippet.description+"</li>":""; s+=(snippet.publishedAt)?"<li>登録日(publishedAt):"+snippet.publishedAt+"</li>":""; if(snippet.thumbnails && snippet.thumbnails.default){ /* サムネイル(default, medium, height) */ s+="<li>thumbnails:<ul>"; $.each(snippet.thumbnails, function(y, ytem){ s+="<li>"+y+":"+ytem.url+"<br><img src='"+ytem.url+"' /></li>"; }); s+="</ul></li>"; } s+="</ul></li>"; } /* brandingSettings */ if(item.brandingSettings){ s+="<li><b>brandingSettings</b><ul>"; var brandingSettings=item.brandingSettings; for(var o in brandingSettings){ s+="<li>"+o+"<ul>"; for(var oo in brandingSettings[o]){ if(o=="hints"){ s+="<li>"+oo+"<ul>"; for(var ooo in brandingSettings[o][oo]){ s+="<li>"+ooo+": "+brandingSettings[o][oo][ooo]+"</li>"; } s+="</ul>"; }else{ s+="<li>"+oo+": "+brandingSettings[o][oo]+"</li>"; } } s+="</ul></li>"; } s+="</ul></li>"; } /* contentDetails */ if(item.contentDetails){ s+="<li><b>contentDetails</b>:<ul>"; var contentDetails=item.contentDetails; var googlePlusUserId=contentDetails.googlePlusUserId; var relatedPlaylists=contentDetails.relatedPlaylists; s+=(googlePlusUserId)?"<li>Google+のID(googlePlusUserId):<a href='https://plus.google.com/'>"+googlePlusUserId+"</a></li>":""; if(relatedPlaylists){ s+="<li>関連プレイリスト(relatedPlaylists):<ul>"; s+=(relatedPlaylists.favorites)?"<li>お気に入りの動画(favorites):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.favorites+"'>"+relatedPlaylists.favorites+"</a></li>":""; s+=(relatedPlaylists.likes)?"<li>評価の高い動画(likes):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.likes+"'>"+relatedPlaylists.likes+"</a></li>":""; s+=(relatedPlaylists.uploads)?"<li>アップロード動画 (uploads):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.uploads+"'>"+relatedPlaylists.uploads+"</a></li>":""; s+=(relatedPlaylists.watchHistory)?"<li>閲覧履歴(watchHistory):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.watchHistory+"'>"+relatedPlaylists.watchHistory+"</a></li>":""; s+=(relatedPlaylists.watchLater)?"<li>後で見る(watchLater):<a href='http://www.youtube.com/playlist?list="+relatedPlaylists.watchLater+"'>"+relatedPlaylists.watchLater+"</a></li>":""; s+="</ul></li>"; } s+="</ul></li>"; } /* invideoPromotion 入ってない */ if(item.invideoPromotion){ dbg(item.invideoPromotion); } /* statistics */ if(item.statistics){ var statistics=item.statistics; s+="<li><b>statistics</b>:<ul>"; s+=(statistics.commentCount)?"<li>コメント数(commentCount):"+statistics.commentCount+"</li>":""; s+=(statistics.subscriberCount)?"<li>登録者数(subscriberCount):"+statistics.subscriberCount+"</li>":""; s+=(statistics.videoCount)?"<li>動画数(videoCount):"+statistics.videoCount+"</li>":""; s+=(statistics.viewCount)?"<li>再生回数(viewCount):"+statistics.viewCount+"</li>":""; s+="</ul></li>"; } /* topicDetails 入ってない */ if(item.topicDetails){ dbg(item.topicDetails); } s+="</ul></li>"; }); $("#results").append("<h2>channels</h2><ul>"+s+"</ul>"); } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body id="oauth"> <h1>設置サンプル:[YouTube API(v3) - 複数のチャンネル情報取得</h1> <div id="login-container" class="pre-auth"> <p>このサンプルを試すには、YouTubeアカウントへのアクセスが必要です。<br>許可する場合は<a href="#" id="login-link">こちらから認証</a>を行ってください。</p> </div> <div class="post-auth"> <div id="results"></div> </div> </body> </html>
再生リスト情報を取得する
2013/3/24
参照:https://developers.google.com/youtube/v3/docs/playlists/list
再生リストIDを指定すると、指定した再生リスト情報を取得できます。
チャンネルIDを指定すると、そのチャンネルのすべての再生リスト情報を取得できます。
自身のチャンネルや再生リストの場合、認証なしだと再生リストのステイタスが「限定公開」「非公開」のものは含まれませんが、認証すると限定公開・非公開のリスト情報も含まれます。
partパラメータには、以下を指定可能です。
id, snippet, status
設置サンプル
例)認証ユーザー自身の再生リスト情報を取得(認証あり)
2013/3/24
自身のチャンネルの場合、認証ありだと公開・限定公開・非公開ステイタスの再生リストが含まれます。
status.privacyStatusに、公開中の場合は「public」、限定公開・非公開の場合は「private」が入ります。
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 認証ユーザー自身のチャンネルの再生リスト情報取得(認証あり)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 開発キー https://code.google.com/apis/console var APIKEY="AIzaSyBWqa3wGl7b8DKxpepR6acqdvgn54_H-DA"; */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; /* クライアントID https://code.google.com/apis/console */ var OAUTH2_CLIENT_ID="1090976309145-ach3n4qqmm02js32g7sbe10k66mo0g9q.apps.googleusercontent.com"; var OAUTH2_SCOPES = [ 'https://www.googleapis.com/auth/yt-analytics.readonly', 'https://www.googleapis.com/auth/youtube.readonly' ]; /* GoogleAPIロード後に呼び出される */ window.onJSClientLoad = function() { dbg("★onJSClientLoad"); gapi.auth.init(function() { window.setTimeout(checkAuth,1); }); }; /* OAuth認証チェック */ /* OAuth認証チェック */ function checkAuth() { dbg("★checkAuth"); gapi.auth.authorize({ client_id: OAUTH2_CLIENT_ID, scope: OAUTH2_SCOPES, immediate: true },handleAuthResult); } /* gapi.auth.authorize()の呼び出し結果を処理 */ function handleAuthResult(authResult) { dbg("★handleAuthResult"); if (authResult) { /* 認証に成功したら認証リンクを隠し、認証したら見れるものを表示 */ $('.pre-auth').hide(); $('.post-auth').show(); /* 処理実行 */ loadAPIClientInterfaces(); }else{ /* 認証に失敗したら認証リンクを表示し、認証しないと見れないものは非表示 */ $('.post-auth').hide(); $('.pre-auth').show(); displayMessage("認証に失敗しました"); /* ログインリンクを有効化 */ $( '#login-link' ).click(function() { gapi.auth.authorize({ client_id: OAUTH2_CLIENT_ID, scope: OAUTH2_SCOPES, immediate: false }, handleAuthResult); }); } } /* ページにメッセージを表示する */ function displayMessage(message) { $("#message").text(message).show(); } /* 上記で表示されたメッセージを隠す */ function hideMessage() { $("#message").hide(); } /* APIロード */ function loadAPIClientInterfaces() { dbg("★loadAPIClientInterfaces"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', function(){ $.getYouTubeResults({ "maxResults":10, "channelId":CHANNEL_ID /* チャンネルID指定 */ }); }); } (function($){ $.getYouTubeResults=function(options){ dbg("★getYouTubeResults"); var opt=$.extend({ "type":"video", "maxResults":5, /* 1ページ当たりの結果数最大値 */ "limit":0, "channelId":"", "part":"id, snippet, status", "fields":"" },options); var pageToken="", s=""; var allcnt=0, j=0, totalResults=0, resultsPerPage=0, total=0; var requestOptions = { /* 1ページ当たりの結果数最大値(0-50) デフォルト10 */ "maxResults":opt.maxResults, /* 固有チャンネルID(ユーザー名ではない)*/ "channelId":opt.channelId, /*//再生リストID(複数指定可) */ //"id":"PL385A95130B11185F,UUvHgCaboF8WCwZzWG7ILDNA,FLK8sQmJBp8GCxrOtXWBpyEA", "part":opt.part }; if(opt.fields!="") requestOptions.fields=opt.fields; makeRequest(); /* APIリクエスト */ function makeRequest(){ dbg("makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ "mine":false, "path":"/youtube/v3/playlists", "params":requestOptions }); request.execute(function(resp) { dbg(resp); output(resp,pageToken); }); } /* HTML出力 */ function output(resp,pageTokenFLG){ dbg("★output"); pageToken=resp.nextPageToken; if(pageTokenFLG==""){ if(resp.pageInfo){ var pageInfo=resp.pageInfo; resultsPerPage=resp.pageInfo.resultsPerPage; /*1レスポンスに含まれる結果数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果合計数 */ total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<ul>"; s+="<li>結果数最大値の指定:"+opt.maxResults+"</li>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>取得数上限:"+((opt.limit==0)?"∞":"")+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; s+="</ul>"; $("#results").append("<h2>Results</h2>"+s); s=""; } } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Playlists</h2>"+s); } } function itemOutput(items){ dbg("★itemOutput"); dbg(items); //dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(opt.limit>0 && j>=opt.limit) return; j=(allcnt*resultsPerPage)+i+1; /* 動画IDが取得できない場合がある */ if(item.id && item.snippet){ s+="<dl>"; var id=(item.id)?item.id:"no id"; var thumbnails_default="no thumbnails"; var snippet=item.snippet; var title=(snippet.title)?snippet.title:"no title"; var channelId=(snippet.channelId)?snippet.channelId:"no channelId"; var channelTitle=(snippet.channelTitle)?snippet.channelTitle:"no channelTitle"; var pubdatedAt=(snippet.publishedAt)?formatDate(snippet.publishedAt):"no publishedAt"; var description=(snippet.description)?snippet.description:"no description"; if(snippet.thumbnails){ thumbnails_default=snippet.thumbnails.medium.url; /* default, medium, height $.each(snippet.thumbnails, function(y, ytem){ thumbnails:[default]: https://i.ytimg.com/vi/NH5aAfMKFzQ/default.jpg thumbnails:[medium]: https://i.ytimg.com/vi/NH5aAfMKFzQ/mqdefault.jpg thumbnails:[high]: https://i.ytimg.com/vi/NH5aAfMKFzQ/hqdefault.jpg }); */ } s+="<dt><a href='http://www.youtube.com/playlist?list="+id+"'><img src='"+thumbnails_default+"'></a></dt><dd>"; s+="<b>【"+j+"】再生リストのタイトル(ID): "+title+"("+id+")</b>"; s+="<p>再生リストのアップロード日: "+pubdatedAt+"</p>"; s+="<p>再生リストの説明文:"+description+"</p>"; if(item.status){ var status=item.status; s+="<p>再生リストのステイタス:"+status.privacyStatus+"</p>"; } s+="<p>再生リストが属するチャンネルのタイトル(ID): "+channelTitle+"(<a href='http://www.youtube.com/channel/"+channelId+"'>"+channelId+"</a>)</p>"; s+="</dd></dl>"; } }); } return this; } })(jQuery); var formatDate=function(str){ var tmp=str.split("T"); var ymd=tmp[0].split("-"); var hms=tmp[1].split(":"); var sec=hms[2].split(".")[0]; var d=new Date(new Date(ymd[0], ymd[1]-1, ymd[2], hms[0], hms[1], sec).getTime()+(1000*60*60*9)); //+9h var year=d.getFullYear(); var month=d.getMonth()+1; var day=d.getDate(); var hour=(d.getHours() < 10 ) ? '0'+d.getHours() : d.getHours(); var min =(d.getMinutes() < 10 ) ? '0'+d.getMinutes() : d.getMinutes(); var sec =(d.getSeconds() < 10 ) ? '0'+d.getSeconds() : d.getSeconds(); return year+"/"+month+"/"+day+" "+hour+":"+min;//+":"+sec; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body> <h1>認証ユーザー自身のチャンネルの再生リスト情報取得(認証あり)</h1> <div id="login-container" class="pre-auth"> <p>このサンプルを試すには、YouTubeアカウントへのアクセスが必要です。<br>許可する場合は<a href="#" id="login-link">こちらから認証</a>を行ってください。</p> </div> <div class="post-auth"> <div id="results"></div> </div> </body> </html>
例)特定のチャンネルの再生リスト情報を取得する(認証なし)
チャンネルID指定
2013/3/24
自身のチャンネルの場合、認証なしだと公開ステイタスのリストのみで、限定公開・非公開ステイタスの再生リストは含まれません。
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 特定の再生リスト情報を取得する(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* チャンネルID http://www.youtube.com/channel/UCWuGWqlTp0_To1eJuSBvLMg http://www.youtube.com/user/cocoism */ var CHANNEL_ID="UCWuGWqlTp0_To1eJuSBvLMg"; /* 開発キー https://developers.google.com/youtube/registering_an_application */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; /* GoogleAPIロード後に呼び出される */ window.onJSClientLoad = function() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', function(){ $.getYouTubeResults({ "limit":50, "maxResults":25, }); }); }; (function($){ $.getYouTubeResults=function(options){ dbg("★getYouTubeResults"); var opt=$.extend({ "type":"video", "maxResults":10, "limit":0, "channelId":CHANNEL_ID },options); var pageToken="", s=""; var allcnt=0, j=0, totalResults=0, resultsPerPage=0, total=0; var requestOptions = { /* 1ページ当たりの結果数最大値(0-50) デフォルト10 */ maxResults:opt.maxResults, /* 固有チャンネルID(ユーザー名ではない)*/ channelId:opt.channelId, "part":"id, snippet, status" }; makeRequest(); /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ "mine":false, "path":"/youtube/v3/playlists", "params":requestOptions }); request.execute(function(resp) { dbg(resp); output(resp,pageToken); }); } /* HTML出力 */ function output(resp,pageTokenFLG){ dbg("★output"); pageToken=resp.nextPageToken; if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; s+="<ul>"; s+="<li>1ページに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>結果の合計数:"+pageInfo.totalResults+"</li>"; s+="</ul>"; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<ul>"; s+="<li>結果数最大値の指定:"+opt.maxResults+"</li>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>取得数上限:"+((opt.limit==0)?"∞":"")+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; s+="</ul>"; $("#results").append(s); s=""; } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Results</h2>"+s); } } function itemOutput(items){ dbg("★itemOutput"); //dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(j>=opt.limit) return; j=(allcnt*resultsPerPage)+i+1; /* 動画IDが取得できない場合がある */ if(item.id && item.snippet){ s+="<dl>"; var id=(item.id)?item.id:"no id"; var thumbnails_default="no thumbnails"; var snippet=item.snippet; var title=(snippet.title)?snippet.title:"no title"; var channelId=(snippet.channelId)?snippet.channelId:"no channelId"; var channelTitle =(snippet.channelTitle )?snippet.channelTitle :"no channelTitle "; var pubdatedAt=(snippet.publishedAt)?formatDate(snippet.publishedAt):"no publishedAt"; var description=(snippet.description)?snippet.description:"no description"; if(snippet.thumbnails){ thumbnails_default=snippet.thumbnails.medium.url; /* default, medium, height $.each(snippet.thumbnails, function(y, ytem){ thumbnails:[default]: https://i.ytimg.com/vi/NH5aAfMKFzQ/default.jpg thumbnails:[medium]: https://i.ytimg.com/vi/NH5aAfMKFzQ/mqdefault.jpg thumbnails:[high]: https://i.ytimg.com/vi/NH5aAfMKFzQ/hqdefault.jpg }); */ } s+="<dt><a href='http://www.youtube.com/playlist?list="+id+"'><img src='"+thumbnails_default+"'></a></dt><dd>"; s+="<b>【"+j+"】再生リストのタイトル(ID): "+title+"("+id+")</b>"; s+="<p>アップロード日: "+pubdatedAt+"</p>"; s+="<p>再生リストの説明文:"+description+"</p>"; if(item.status){ var status=item.status; s+="<p>再生リストのステイタス:"+status.privacyStatus+"</p>"; } s+="<p>再生リストが属するチャンネルID: "+channelId+"/再生リストが属するチャンネルタイトル: "+channelTitle+"</p>"; s+="</dd></dl>"; } }); } return this; } })(jQuery); var formatDate=function(str){ var tmp=str.split("T"); var ymd=tmp[0].split("-"); var hms=tmp[1].split(":"); var sec=hms[2].split(".")[0]; var d=new Date(new Date(ymd[0], ymd[1]-1, ymd[2], hms[0], hms[1], sec).getTime()+(1000*60*60*9)); //+9h var year=d.getFullYear(); var month=d.getMonth()+1; var day=d.getDate(); var hour=(d.getHours() < 10 ) ? '0'+d.getHours() : d.getHours(); var min =(d.getMinutes() < 10 ) ? '0'+d.getMinutes() : d.getMinutes(); var sec =(d.getSeconds() < 10 ) ? '0'+d.getSeconds() : d.getSeconds(); return year+"/"+month+"/"+day+" "+hour+":"+min;//+":"+sec; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body> <h1>設置サンプル:[YouTube API(v3) - 特定の再生リスト情報を取得する(認証なし)</h1> <div id="results"></div> </body> </html>
例)複数の再生リスト情報を取得する(認証なし)
再生リストID指定
2013/3/24
複数の再生リスト情報を取得する例です。 他人のチャンネルの場合、認証なしだと公開ステイタスのリストのみで、限定公開・非公開ステイタスの再生リストは含まれません。
※サンプルで使用した再生リスト
・Google I/O 2012
http://www.youtube.com/playlist?list=PL56D792A831D0C362
・Angry Birds Facebook Star Wars Tournament
http://www.youtube.com/playlist?list=PLlJklkizbjsbyyo3AyS-vrHObpDFVPbdW
・食べたもの♪
http://www.youtube.com/playlist?list=PLmjuevQrM8DA1EpfZ9Cu5hAFE7WKZtOhn
・ハムスター
http://www.youtube.com/playlist?list=PL3C7063916AA45068
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 特定の再生リスト情報を取得する(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* チャンネルID http://www.youtube.com/channel/UCWuGWqlTp0_To1eJuSBvLMg http://www.youtube.com/user/cocoism */ var CHANNEL_ID="UCWuGWqlTp0_To1eJuSBvLMg"; /* 開発キー https://developers.google.com/youtube/registering_an_application */ //var APIKEY="AIzaSyBWqa3wGl7b8DKxpepR6acqdvgn54_H-DA"; var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; /* GoogleAPIロード後に呼び出される */ window.onJSClientLoad = function() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', function(){ $.getYouTubeResults(); }); }; (function($){ $.getYouTubeResults=function(options){ dbg("★getYouTubeResults"); var opt=$.extend({ "maxResults":10, "limit":0 },options); var pageToken="", s=""; var allcnt=0, j=0, totalResults=0, resultsPerPage=0, total=0; var requestOptions = { /* 1ページ当たりの結果数最大値(0-50) デフォルト10 */ maxResults:opt.maxResults, /*//再生リストID(複数指定可) */ /* Google Developers - Google I/O 2012 http://www.youtube.com/playlist?list=PL56D792A831D0C362 Angry Birds Walkthrough Videos & Golden Eggs - Angry Birds Facebook Star Wars Tournament http://www.youtube.com/playlist?list=PLlJklkizbjsbyyo3AyS-vrHObpDFVPbdW 食べたもの♪ http://www.youtube.com/playlist?list=PLmjuevQrM8DA1EpfZ9Cu5hAFE7WKZtOhn ハムスター http://www.youtube.com/playlist?list=PL3C7063916AA45068 */ "id":"PL56D792A831D0C362,PLlJklkizbjsbyyo3AyS-vrHObpDFVPbdW,PLmjuevQrM8DA1EpfZ9Cu5hAFE7WKZtOhn,PL3C7063916AA45068", "part":"id, snippet, status" }; makeRequest(); /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ "mine":false, "path":"/youtube/v3/playlists", "params":requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ $("#message").html(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ dbg("★output"); pageToken=resp.nextPageToken; if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; s+="<ul>"; s+="<li>1ページに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>結果の合計数:"+pageInfo.totalResults+"</li>"; s+="</ul>"; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<ul>"; s+="<li>結果数最大値の指定:"+opt.maxResults+"</li>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>取得数上限:"+((opt.limit==0)?"∞":"")+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; s+="</ul>"; $("#results").append(s); s=""; } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Results</h2>"+s); } } function itemOutput(items){ dbg("★itemOutput"); dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(opt.limit!=0 && j>opt.limit) return; j=(allcnt*resultsPerPage)+i+1; /* 動画IDが取得できない場合がある */ if(item.id && item.snippet){ s+="<dl>"; var id=(item.id)?item.id:"no id"; var thumbnails_default="no thumbnails"; var snippet=item.snippet; var title=(snippet.title)?snippet.title:"no title"; var channelId=(snippet.channelId)?snippet.channelId:"no channelId"; var channelTitle =(snippet.channelTitle )?snippet.channelTitle :"no channelTitle "; var pubdatedAt=(snippet.publishedAt)?formatDate(snippet.publishedAt):"no publishedAt"; var description=(snippet.description)?snippet.description:"no description"; if(snippet.thumbnails){ thumbnails_default=snippet.thumbnails.medium.url; /* default, medium, height $.each(snippet.thumbnails, function(y, ytem){ thumbnails:[default]: https://i.ytimg.com/vi/NH5aAfMKFzQ/default.jpg thumbnails:[medium]: https://i.ytimg.com/vi/NH5aAfMKFzQ/mqdefault.jpg thumbnails:[high]: https://i.ytimg.com/vi/NH5aAfMKFzQ/hqdefault.jpg }); */ } s+="<dt><a href='http://www.youtube.com/playlist?list="+id+"'><img src='"+thumbnails_default+"'></a></dt><dd>"; s+="<b>【"+j+"】再生リストのタイトル(ID): "+title+"("+id+")</b>"; s+="<p>アップロード日: "+pubdatedAt+"</p>"; s+="<p>再生リストの説明文:"+description+"</p>"; if(item.status){ var status=item.status; s+="<p>再生リストのステイタス:"+status.privacyStatus+"</p>"; } s+="<p>再生リストが属するチャンネルID: "+channelId+"/再生リストが属するチャンネルタイトル: "+channelTitle+"</p>"; s+="</dd></dl>"; } }); } return this; } })(jQuery); var formatDate=function(str){ var tmp=str.split("T"); var ymd=tmp[0].split("-"); var hms=tmp[1].split(":"); var sec=hms[2].split(".")[0]; var d=new Date(new Date(ymd[0], ymd[1]-1, ymd[2], hms[0], hms[1], sec).getTime()+(1000*60*60*9)); //+9h var year=d.getFullYear(); var month=d.getMonth()+1; var day=d.getDate(); var hour=(d.getHours() < 10 ) ? '0'+d.getHours() : d.getHours(); var min =(d.getMinutes() < 10 ) ? '0'+d.getMinutes() : d.getMinutes(); var sec =(d.getSeconds() < 10 ) ? '0'+d.getSeconds() : d.getSeconds(); return year+"/"+month+"/"+day+" "+hour+":"+min;//+":"+sec; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body> <h1>設置サンプル:[YouTube API(v3) - 特定の再生リスト情報を取得する(認証なし)</h1> <div id="message"></div> <div id="results"></div> </body> </html>
再生リスト内の動画情報を取得する
2013/3/24
参照:https://developers.google.com/youtube/v3/docs/playlistItems/list
idまたはplaylistIdパラメータに指定した再生リスト内の動画情報を取得できます。
1つの再生リストだけ取得する場合は、playlistidに再生リストIDを指定します。
※複数の再生リストを取得する場合は、idパラメータにカンマ区切りで再生リストIDを指定すればよいみたいだけどうまくいかない。。。
再生リスト内の動画情報は、再生リストの上から順に取得されます。 再生リスト内での動画位置は、positionに入っています。
再生リスト内の動画ステイタスが、"限定公開"、"非公開"ステイタスの動画の場合、認証有無によらず、動画タイトルは「Private video」として返されます。
partパラメータには、以下を指定可能です。
id, snippet, contentDetails, status
設置サンプル
例)特定の再生リスト内の動画情報取得(認証あり)
再生リストID指定
2013/3/24
再生リストIDで指定した再生リスト内の動画を表示するサンプルです。
※非公開にしている再生リストの動画情報を取得する場合は認証が必要です。
※再生リスト内にある非公開動画のタイトルは取れません。
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 再生リスト内の動画情報取得(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 再生リストID 食べたもの♪ http://www.youtube.com/playlist?list=PLmjuevQrM8DA1EpfZ9Cu5hAFE7WKZtOhn */ var PLAYLIST_ID="PLmjuevQrM8DA1EpfZ9Cu5hAFE7WKZtOhn"; /* 開発キー https://developers.google.com/youtube/registering_an_application */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; /* クライアントID https://code.google.com/apis/console var OAUTH2_CLIENT_ID = "693654264922.apps.googleusercontent.com"; */ var OAUTH2_CLIENT_ID="1090976309145-ach3n4qqmm02js32g7sbe10k66mo0g9q.apps.googleusercontent.com"; var OAUTH2_SCOPES = [ 'https://www.googleapis.com/auth/yt-analytics.readonly', 'https://www.googleapis.com/auth/youtube.readonly' ]; var pageToken="",s=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; /* GoogleAPIロード後に呼び出される */ window.onJSClientLoad = function() { dbg("★onJSClientLoad"); gapi.auth.init(function() { window.setTimeout(checkAuth,1); }); }; /* OAuth認証チェック */ function checkAuth() { dbg("★checkAuth"); gapi.auth.authorize({ client_id: OAUTH2_CLIENT_ID, scope: OAUTH2_SCOPES, immediate: true },handleAuthResult); } /* gapi.auth.authorize()の呼び出し結果を処理 */ function handleAuthResult(authResult) { if (authResult) { /* 認証に成功したら認証リンクを隠し、認証したら見れるものを表示 */ $('.pre-auth').hide(); $('.post-auth').show(); /* 処理実行 */ loadAPIClientInterfaces(); }else{ /* 認証に失敗したら認証リンクを表示し、認証しないと見れないものは非表示 */ $('.post-auth').hide(); $('.pre-auth').show(); displayMessage("認証に失敗しました"); /* ログインリンクを有効化 */ $( '#login-link' ).click(function() { gapi.auth.authorize({ client_id: OAUTH2_CLIENT_ID, scope: OAUTH2_SCOPES, immediate: false }, handleAuthResult); }); } } /* ページにメッセージを表示する */ function displayMessage(message) { $("#message").text(message).show(); } /* 上記で表示されたメッセージを隠す */ function hideMessage() { $("#message").hide(); } /* APIロード */ function loadAPIClientInterfaces() { dbg("★handleAPILoaded"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', makeRequest); } var requestOptions = { "playlistId":PLAYLIST_ID, "part":"id, snippet, contentDetails, status" }; /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:"", path:"/youtube/v3/playlistItems", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ displayMessage(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ pageToken=resp.nextPageToken; if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<li>pageInfo:<ul>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; s+="</ul></li>"; $("#results").append("<h2>Playlist</h2><ul>"+s+"</ul>"); s=""; } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Items</h2><ol>"+s+"</ol>"); } } function itemOutput(items){ dbg(items); //dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ j=(allcnt*resultsPerPage)+i+1; /* id */ s+="<li><b>id:"+((item.id)?item.id:"no id")+"</b><ul>"; /* snippet */ if(item.snippet){ var snippet=item.snippet; s+="<li><b>snippet</b>:<ul>"; s+=(snippet.channelId)?"<li>チャンネルID(channelId):"+snippet.channelId+"</li>":""; s+=(snippet.channelTitle)?"<li>チャンネルタイトル(channelTitle):"+snippet.channelTitle+"</li>":""; s+=(snippet.playlistId)?"<li>再生リストID(playlistId):<a href='http://www.youtube.com/playlist?list="+snippet.playlistId+"'>"+snippet.playlistId+"</a></li>":""; s+=(snippet.position>=0)?"<li>再生リスト内の動画の位置(position):"+snippet.position+"</li>":""; s+=(snippet.publishedAt)?"<li>公開日(publishedAt):"+snippet.publishedAt+"</li>":""; s+=(snippet.resourceId.kind)?"<li>リソース種類(resourceId.kind):"+snippet.resourceId.kind+"</li>":""; s+=(snippet.resourceId.videoId)?"<li>動画ID(resourceId.videoId):<a href='http://www.youtube.com/watch?v="+snippet.resourceId.videoId+"'>"+snippet.resourceId.videoId+"</a></li>":""; s+=(snippet.description)?"<li>動画の説明文:"+snippet.description+"</li>":""; s+=(snippet.title)?"<li>動画タイトル(title):"+snippet.title+"</li>":""; if(snippet.thumbnails && snippet.thumbnails.default.url){ /* default, medium, high */ s+="<li><img src='"+snippet.thumbnails.default.url+"' /></li>"; } s+="</ul></li>"; } /* contentDetails */ if(item.contentDetails){ s+="<li><b>contentDetails</b>:<ul>"; var contentDetails=item.contentDetails; s+=(contentDetails.videoId)?"<li>動画ID(videoId):"+contentDetails.videoId+"</li>":""; s+="</ul></li>"; } /* status */ if(item.status){ var status=item.status; s+="<li><b>status</b>:<ul>"; s+=(status.privacyStatus)?"<li>動画のステイタス:"+status.privacyStatus+"</li>":""; s+="</ul></li>"; } s+="</ul></li>"; }); } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body id="oauth"> <h1>設置サンプル:[YouTube API(v3) - 非公開の再生リスト内の動画情報取得(認証あり)</h1> <div id="login-container" class="pre-auth"> <p>このサンプルを試すには、YouTubeアカウントへのアクセスが必要です。<br>許可する場合は<a href="#" id="login-link">こちらから認証</a>を行ってください。</p> </div> <div class="post-auth"> <div id="results"></div> </div> </body> </html>
例)特定の再生リスト内の動画情報取得(認証なし)
再生リストID指定
2013/3/24
公開ステイタスの再生リストに含まれる動画を表示するサンプルです。
再生リスト内の動画ステイタスは、status.privacyStatusに、公開「public」、限定公開「unlisted」、非公開「private」(動画タイトルは「Private video」)で入ります。
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 再生リスト内の動画情報取得(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 再生リストID 食べたもの♪ http://www.youtube.com/playlist?list=PLmjuevQrM8DA1EpfZ9Cu5hAFE7WKZtOhn */ //var PLAYLIST_ID="PLmjuevQrM8DA1EpfZ9Cu5hAFE7WKZtOhn"; //var PLAYLIST_ID="PLIBTIgwo1klTi59PIDQT9ggXi-U4b5kAk"; var PLAYLIST_ID="PLSHcBF713noUkDvX09CQ_-l9VkNhNXV0q";//F5 /* 開発キー https://developers.google.com/youtube/registering_an_application */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; var pageToken="",s=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; /* GoogleAPIロード後に呼び出される */ window.onJSClientLoad = function() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', makeRequest); }; var requestOptions = { playlistId:PLAYLIST_ID, part:"id, snippet, contentDetails, status" }; /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:"", path:"/youtube/v3/playlistItems", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ $("#message").html(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ pageToken=resp.nextPageToken; if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<li>pageInfo:<ul>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; s+="</ul></li>"; $("#results").append("<h2>Playlist</h2><ul>"+s+"</ul>"); s=""; } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Items</h2><ul>"+s+"</ul>"); } } function itemOutput(items){ $.each(items, function(i, item){ j=(allcnt*resultsPerPage)+i+1; /* id */ s+="<li><b>id:"+((item.id)?item.id:"no id")+"</b><ul>"; /* snippet */ if(item.snippet){ var snippet=item.snippet; s+="<li><b>snippet</b>:<ul>"; s+=(snippet.channelId)?"<li>チャンネルID(channelId):"+snippet.channelId+"</li>":""; s+=(snippet.channelTitle)?"<li>チャンネルタイトル(channelTitle):"+snippet.channelTitle+"</li>":""; s+=(snippet.playlistId)?"<li>再生リストID(playlistId):<a href='http://www.youtube.com/playlist?list="+snippet.playlistId+"'>"+snippet.playlistId+"</a></li>":""; s+=(snippet.position>=0)?"<li>再生リスト内の動画の位置(position):"+snippet.position+"</li>":""; s+=(snippet.publishedAt)?"<li>公開日(publishedAt):"+snippet.publishedAt+"</li>":""; s+=(snippet.resourceId.kind)?"<li>リソース種類(resourceId.kind):"+snippet.resourceId.kind+"</li>":""; s+=(snippet.resourceId.videoId)?"<li>動画ID(resourceId.videoId):<a href='http://www.youtube.com/watch?v="+snippet.resourceId.videoId+"'>"+snippet.resourceId.videoId+"</a></li>":""; s+=(snippet.description)?"<li>動画の説明文:"+snippet.description+"</li>":""; s+=(snippet.title)?"<li>動画タイトル(title):"+snippet.title+"</li>":""; if(snippet.thumbnails && snippet.thumbnails.default.url){ /* default, medium, high */ s+="<li><img src='"+snippet.thumbnails.default.url+"' /></li>"; } s+="</ul></li>"; } /* contentDetails */ if(item.contentDetails){ s+="<li><b>contentDetails</b>:<ul>"; var contentDetails=item.contentDetails; s+=(contentDetails.videoId)?"<li>動画ID(videoId):"+contentDetails.videoId+"</li>":""; s+="</ul></li>"; } /* status */ if(item.status){ var status=item.status; s+="<li><b>status</b>:<ul>"; s+=(status.privacyStatus)?"<li>動画のステイタス:"+status.privacyStatus+"</li>":""; s+="</ul></li>"; } s+="</ul></li>"; }); } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body> <h1>設置サンプル:[YouTube API(v3) - 再生リスト内の動画情報取得(認証なし)</h1> <div id="results"></div> </body> </html>
動画情報を取得する
2013/3/24
参照:https://developers.google.com/youtube/v3/docs/videos/list
idパラメータに指定した動画IDの動画情報を取得できます。 複数の動画情報を取得する場合は、idパラメータにカンマ区切りで指定します。 非公開ステイタスの動画情報を取得するには認証が必要です。
partパラメータには、以下を指定可能です。
id, snippet, contentDetails, fileDetails, player, processingDetails, recordingDetails, statistics, status, suggestions, topicDetails
設置サンプル
特定の動画情報を取得する(認証あり)
動画ID指定
2013/3/24
動画IDをカンマ区切りで指定して、複数の動画情報を取得するサンプル。
認証ありの場合は、動画のタグ、すべてのステイタス(公開・限定公開・非公開)の動画情報を取得できます。
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 動画情報取得(認証あり)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 開発キー https://code.google.com/apis/console var APIKEY="AIzaSyBWqa3wGl7b8DKxpepR6acqdvgn54_H-DA"; */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; /* 取得する動画のID、カンマ区切りで複数指定可 */ var VIDEO_IDs="9hUPqWkgapM,KHs6NqnYozk,9YEEl52u8XE,GILIk8W00s4,8e_wXc0m97w"; /* 非公開, 限定公開, 公開 */ var limit=0; var pageToken="",s="",ss=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; var topicIds_ary=[],topicIds_length=0,topicIds_cnt=0; /* クライアントID https://code.google.com/apis/console */ var OAUTH2_CLIENT_ID="1090976309145-ach3n4qqmm02js32g7sbe10k66mo0g9q.apps.googleusercontent.com"; var OAUTH2_SCOPES = [ 'https://www.googleapis.com/auth/yt-analytics.readonly', 'https://www.googleapis.com/auth/youtube.readonly' ]; /* GoogleAPIロード後に呼び出される */ window.onJSClientLoad = function() { dbg("★onJSClientLoad"); gapi.auth.init(function() { window.setTimeout(checkAuth,1); }); }; /* OAuth認証チェック */ function checkAuth() { dbg("★checkAuth"); gapi.auth.authorize({ client_id: OAUTH2_CLIENT_ID, scope: OAUTH2_SCOPES, immediate: true },handleAuthResult); } /* gapi.auth.authorize()の呼び出し結果を処理 */ function handleAuthResult(authResult) { if (authResult) { /* 認証に成功したら認証リンクを隠し、認証したら見れるものを表示 */ $('.pre-auth').hide(); $('.post-auth').show(); /* 処理実行 */ loadAPIClientInterfaces(); }else{ /* 認証に失敗したら認証リンクを表示し、認証しないと見れないものは非表示 */ $('.post-auth').hide(); $('.pre-auth').show(); displayMessage("認証に失敗しました"); /* ログインリンクを有効化 */ $( '#login-link' ).click(function() { gapi.auth.authorize({ client_id: OAUTH2_CLIENT_ID, scope: OAUTH2_SCOPES, immediate: false }, handleAuthResult); }); } } /* ページにメッセージを表示する */ function displayMessage(message) { $("#message").text(message).show(); } /* 上記で表示されたメッセージを隠す */ function hideMessage() { $("#message").hide(); } /* APIロード */ function loadAPIClientInterfaces() { dbg("loadAPIClientInterfaces"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', makeRequest); } var requestOptions = { id:VIDEO_IDs,//YouTube動画IDをカンマ区切りで複数指定可 part:"id, snippet, contentDetails, fileDetails, player, processingDetails, recordingDetails, statistics, status, suggestions, topicDetails" }; /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:true, path:"/youtube/v3/videos", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ displayMessage(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ dbg("★output"); pageToken=resp.nextPageToken; if(pageTokenFLG=="" && resp.pageInfo){ var pageInfo=resp.pageInfo; s+="<li><b>pageInfo</b>:<ul>"; s+="<li>1ページに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>結果の合計数:"+pageInfo.totalResults+"</li>"; s+="</ul></li>"; resultsPerPage=resp.pageInfo.resultsPerPage;//APIレスポンスに含まれる結果の数。 totalResults=resp.pageInfo.totalResults;//結果セット内の結果の合計数。 if(limit>0){ totalResults=limit; } total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); $("#results").append("<h2>Results</h2><ul>"+s+"</ul>"); s=""; } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Items</h2><ul>"+s+"</ul>"); } } function itemOutput(items){ $.each(items, function(i, item){ if(limit!=0 && j>=limit) return; j=(allcnt*resultsPerPage)+i+1 /* id */ s+="<li><b>id:"+((item.id)?item.id:"no id")+"</b><ul>"; /* snippet */ if(item.snippet){ s+="<li><b>snippet</b>:<ul>"; var snippet=item.snippet; s+=(snippet.title)?"<li>動画タイトル(title):"+snippet.title+"</li>":""; s+=(snippet.channelId)?"<li>チャンネルID(channelId):"+snippet.channelId+"</li>":""; s+=(snippet.channelTitle)?"<li>チャンネルタイトル(channelTitle):"+snippet.channelTitle+"</li>":""; s+=(snippet.categoryId)?"<li>カテゴリID(categoryId):"+snippet.categoryId+"</li>":""; s+=(snippet.publishedAt)?"<li>公開日(publishedAt):"+snippet.publishedAt+"</li>":""; s+=(snippet.description)?"<li>説明文(description):"+snippet.description+"</li>":""; if(snippet.thumbnails && snippet.thumbnails.default){ s+="<li>サムネイル(thumbnails):<br><img src='"+snippet.thumbnails.default.url+"' /></li>"; } if(snippet.tags){ s+="<li>タグ(tags):"+snippet.tags.join(", ")+"</li>"; } s+="</ul></li>"; } /* contentDetails */ if(item.contentDetails){ s+="<li><b>contentDetails</b>:<ul>"; var contentDetails=item.contentDetails; s+=(contentDetails.caption)?"<li>字幕の有無(caption):"+contentDetails.caption+"</li>":""; s+=(contentDetails.definition)?"<li>画質(definition):"+contentDetails.definition+"</li>":""; s+=(contentDetails.dimension)?"<li>次元(dimension):"+contentDetails.dimension+"</li>":""; s+=(contentDetails.duration)?"<li>動画の長さ(duration):"+contentDetails.duration+"</li>":""; s+=(contentDetails.licensedContent)?"<li>licensedContent:"+contentDetails.licensedContent+"</li>":""; s+="</ul></li>"; } /* fileDetails */ if(item.fileDetails){ dbg(item.fileDetails); } /* player */ if(item.player){ s+="<li><b>player</b>:<ul>"; var player=item.player; s+=(player.embedHtml)?"<li>埋め込みタグ(player.embedHtml):<textarea style='width:100%;height:3em;'>"+player.embedHtml+"</textarea></li>":""; s+="</ul></li>"; } /* processingDetails */ if(item.processingDetails){ s+="<li><b>processingDetails</b>:<ul>"; var processingDetails=item.processingDetails; s+=(processingDetails.processingStatus)?"<li>processingStatus:"+processingDetails.processingStatus+"</li>":""; s+="</ul></li>"; } /* recordingDetails */ if(item.recordingDetails){ dbg(item.recordingDetails); } /* statistics */ if(item.statistics){ s+="<li><b>statistics</b>:<ul>"; var statistics=item.statistics; s+=(statistics.commentCount)?"<li>コメント数(commentCount):"+statistics.commentCount+"</li>":""; s+=(statistics.subscriberCount)?"<li>登録者数(subscriberCount):"+statistics.subscriberCount+"</li>":""; s+=(statistics.videoCount)?"<li>動画数(videoCount):"+statistics.videoCount+"</li>":""; s+=(statistics.viewCount)?"<li>再生回数(viewCount):"+statistics.viewCount+"</li>":""; s+="</ul></li>"; } /* status */ if(item.status){ s+="<li><b>status</b>:<ul>"; var status=item.status; s+=(status.embeddable)?"<li>埋め込みを許可(embeddable):"+status.embeddable+"</li>":""; s+=(status.license)?"<li>ライセンス(license):"+status.license+"</li>":""; s+=(status.privacyStatus)?"<li>公開ステイタス(privacyStatus):"+status.privacyStatus+"</li>":""; s+=(status.publicStatsViewable)?"<li>publicStatsViewable:"+status.publicStatsViewable+"</li>":""; s+=(status.uploadStatus)?"<li>アップロードステイタス(uploadStatus):"+status.uploadStatus+"</li>":""; s+="</ul></li>"; } /* suggestions */ if(item.suggestions){ dbg(item.suggestions); } /* topicDetails */ if(item.topicDetails && item.topicDetails.topicIds){ // Freebase topic IDs一覧 s+="<li><b>topicIds.opicIds</b>:"+item.topicDetails.topicIds.join(" ")+"</li>"; for(var y in item.topicDetails.topicIds){ topicIds_ary.push(item.topicDetails.topicIds[y]); } } s+="</ul></li>"; }); } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body id="oauth"> <h1>設置サンプル:[YouTube API(v3) - 動画情報取得(認証あり)</h1> <div id="login-container" class="pre-auth"> <p>このサンプルを試すには、YouTubeアカウントへのアクセスが必要です。<br>許可する場合は<a href="#" id="login-link">こちらから認証</a>を行ってください。</p> </div> <div class="post-auth"> <div id="message"></div> <div id="results"></div> </div> </body> </html>
特定の動画情報を取得する(認証なし)
動画ID指定
2013/3/24
動画IDをカンマ区切りで指定して、複数の動画情報を取得するサンプル。
認証なしの場合は、公開・限定公開ステイタスの動画のみ取得可能です。
非公開ステイタスの動画は、IDを指定しても無視されます。
※認証なしの時に、fileDetails, processingDetails, recordingDetails, suggestionsをpartパラメータに指定するとエラーになる。
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 動画情報取得(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 開発キー https://code.google.com/apis/console */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; /* 取得する動画のID、カンマ区切りで複数指定可 */ var VIDEO_IDs="9cs1Biv_8Xw"; var limit=0; var pageToken="",s="",ss=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; var topicIds_ary=[],topicIds_length=0,topicIds_cnt=0; /* APIロード */ function onJSClientLoad() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', makeRequest); } var requestOptions = { id:VIDEO_IDs,//YouTube動画IDをカンマ区切りで複数指定可 part:"id, snippet, contentDetails, player, statistics, status, topicDetails,recordingDetails" }; /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:"", path:"/youtube/v3/videos", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ $("#message").html(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTMl出力 */ function output(resp,pageTokenFLG){ dbg("★output"); pageToken=resp.nextPageToken; if(pageTokenFLG=="" && resp.pageInfo){ var pageInfo=resp.pageInfo; s+="<li>pageInfo:"; s+="<ul>"; s+="<li>1ページに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>結果の合計数:"+pageInfo.totalResults+"</li>"; s+="</ul>"; s+="</li>"; resultsPerPage=resp.pageInfo.resultsPerPage;//APIレスポンスに含まれる結果の数。 totalResults=resp.pageInfo.totalResults;//結果セット内の結果の合計数。 if(limit>0){ totalResults=limit; } total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); $("#results").append("<h2>Results</h2><ul>"+s+"</ul>"); s=""; } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Items</h2><ul>"+s+"</ul>"); } } function itemOutput(items){ dbg(items); dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(limit!=0 && j>=limit) return; j=(allcnt*resultsPerPage)+i+1 /* id */ s+="<li><b>id:"+((item.id)?item.id:"no id")+"</b><ul>"; /* snippet */ if(item.snippet){ s+="<li><b>snippet</b>:<ul>"; var snippet=item.snippet; s+=(snippet.title)?"<li>動画タイトル(title):"+snippet.title+"</li>":""; s+=(snippet.channelId)?"<li>チャンネルID(channelId):"+snippet.channelId+"</li>":""; s+=(snippet.channelTitle)?"<li>チャンネルタイトル(channelTitle):"+snippet.channelTitle+"</li>":""; s+=(snippet.categoryId)?"<li>カテゴリID(categoryId):"+snippet.categoryId+"</li>":""; s+=(snippet.publishedAt)?"<li>公開日(publishedAt):"+snippet.publishedAt+"</li>":""; s+=(snippet.description)?"<li>説明文(description):"+snippet.description+"</li>":""; if(snippet.thumbnails && snippet.thumbnails.default){ s+="<li>サムネイル(thumbnails):<br><img src='"+snippet.thumbnails.default.url+"' /></li>"; } if(snippet.tags){ s+="<li>タグ(tags):"+snippet.tags.join(", ")+"</li>"; } s+="</ul></li>"; } /* contentDetails */ if(item.contentDetails){ s+="<li><b>contentDetails</b>:<ul>"; var contentDetails=item.contentDetails; s+=(contentDetails.caption)?"<li>字幕の有無(caption):"+contentDetails.caption+"</li>":""; s+=(contentDetails.definition)?"<li>画質(definition):"+contentDetails.definition+"</li>":""; s+=(contentDetails.dimension)?"<li>次元(dimension):"+contentDetails.dimension+"</li>":""; s+=(contentDetails.duration)?"<li>動画の長さ(duration):"+contentDetails.duration+"</li>":""; s+=(contentDetails.licensedContent)?"<li>licensedContent:"+contentDetails.licensedContent+"</li>":""; s+="</ul></li>"; } /* fileDetails */ if(item.fileDetails){ dbg(item.fileDetails); } /* player */ if(item.player){ s+="<li><b>player</b>:<ul>"; var player=item.player; s+=(player.embedHtml)?"<li>埋め込みタグ(player.embedHtml):<textarea style='width:100%;height:3em;'>"+player.embedHtml+"</textarea></li>":""; s+="</ul></li>"; } /* processingDetails */ if(item.processingDetails){ s+="<li><b>processingDetails</b>:<ul>"; var processingDetails=item.processingDetails; s+=(processingDetails.processingStatus)?"<li>processingStatus:"+processingDetails.processingStatus+"</li>":""; s+="</ul></li>"; } /* recordingDetails */ if(item.recordingDetails){ dbg(item.recordingDetails); } /* statistics */ if(item.statistics){ s+="<li><b>statistics</b>:<ul>"; var statistics=item.statistics; s+=(statistics.commentCount)?"<li>コメント数(commentCount):"+statistics.commentCount+"</li>":""; s+=(statistics.subscriberCount)?"<li>登録者数(subscriberCount):"+statistics.subscriberCount+"</li>":""; s+=(statistics.videoCount)?"<li>動画数(videoCount):"+statistics.videoCount+"</li>":""; s+=(statistics.viewCount)?"<li>再生回数(viewCount):"+statistics.viewCount+"</li>":""; s+="</ul></li>"; } /* status */ if(item.status){ s+="<li><b>status</b>:<ul>"; var status=item.status; s+=(status.embeddable)?"<li>埋め込みを許可(embeddable):"+status.embeddable+"</li>":""; s+=(status.license)?"<li>ライセンス(license):"+status.license+"</li>":""; s+=(status.privacyStatus)?"<li>公開ステイタス(privacyStatus):"+status.privacyStatus+"</li>":""; s+=(status.publicStatsViewable)?"<li>publicStatsViewable:"+status.publicStatsViewable+"</li>":""; s+=(status.uploadStatus)?"<li>アップロードステイタス(uploadStatus):"+status.uploadStatus+"</li>":""; s+="</ul></li>"; } /* suggestions */ if(item.suggestions){ dbg(item.suggestions); } /* topicDetails */ if(item.topicDetails && item.topicDetails.topicIds){ // Freebase topic IDs一覧 s+="<li><b>topicIds.opicIds</b>:"+item.topicDetails.topicIds.join(" ")+"</li>"; for(var y in item.topicDetails.topicIds){ topicIds_ary.push(item.topicDetails.topicIds[y]); } } s+="</ul></li>"; }); } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body> <h1>設置サンプル:[YouTube API(v3) - 動画情報取得</h1> <div id="results"></div> </body> /html>
動画検索結果を取得する
2013/3/24
参照https://developers.google.com/youtube/v3/docs/search/list
指定した条件にマッチする検索結果を取得できます。
partパラメータは必須。以下を指定可能です。
id, snippet
フィルター
forMine
trueを指定すると、認証ユーザー自身の動画が検索対象となる。
relatedToVideoId
type='video'と併用。指定した動画IDの関連動画が検索対象になる。
パラメータ(任意)
channelId
指定したチャンネルIDからアップロードされた動画が検索対象になる。
channelType
検索対象となるチャンネルタイプ(any, show)を指定。 anyは全チャンネル、showはショー?のみ検索対象となるみたい。
maxResults
1リクエストの戻り値に含めるデータ件数を指定。 指定可能な値は0〜50。デフォルトは5。
order
- date 作成日が新しい順
- rating 評価が高い順
- relevance 関連性が高い順 ※デフォルト
- title タイトル
- videoCount 動画数が多い順
- viewCount 再生回数が多い順
pageToken
APIリクエストに使用するトークン。
publishedBefore、publishedAfter
指定した日時より前、後に公開されたものを検索対象とする。 日時は、RFC 3339形式で指定。
q
検索キーワードを指定。半角スペース区切りで複数指定した場合はOR検索になる。
regionCode
国コードで指定した国の検索結果が取得できる。日本なら「JP」。
国コードはISO 3166-1 alpha-2で指定。
safeSearch
検索結果に制限されたコンテンツを含めるかどうかを指定。 moderate(ユーザーの地域で制限されているコンテンツを含めない), none(含める), strict(含めない)のいずれかを指定可能。
topicId
指定したトピックに関連するリソースを検索対象とする。
type
video,channel,playlist.のいずれかを指定可能です。 省略した場合、検索結果には、動画・再生リスト・チャンネル情報が混在します。
videoCaption
指定したカテゴリに紐づくリソースのみ検索対象とする。 カテゴリはVideoCategoriesから取得可能。
- any:特に字幕の有無を指定しない
- none:キャプションがない動画のみ
- closedCaption:キャプションがある動画のみ
videoCategoryId
動画のキャプション(字幕)の有無を検索条件にすることができる。
videoDefinition
動画の解像度を検索条件にすることができる。
- any:全動画対象 ※デフォルト
- high:HD動画のみ
- standard:標準の動画のみ
videoDimension
2D動画、3D動画かを検索条件にできる。
- any:2D/3D動画いずれも ※デフォルト
- 2D:2D動画のみ
- 3D:3D動画のみ
videoDuration
動画の長さを検索条件にする。
- any:全動画対象 ※デフォルト
- long:20分より長い動画のみ
- medium:4~20分以内の動画のみ
- short:4分未満の短い動画のみ
videoEmbeddable
動画の埋め込みが許可されているかを検索条件にできる。
- any:全動画対象
- true:埋め込みが許可されている動画のみ
videoLicense
指定したライセンスを有する動画のみ検索対象にする。
- any:全動画対象
- creativeCommon :埋め込みが許可されている動画のみ
- youtube :標準的なYouTubeライセンスの動画のみ
設置サンプル
再生リストの検索(認証なし)
'ハムスター'という名前がタイトルに含まれる再生リストを、再生回数の多い順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。
※再生リストのサムネイルはないようです。snippetに入っている再生リストのサムネイルがグレーのやつになる。
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 開発キー https://code.google.com/apis/console */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; function onJSClientLoad() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', function(){ $.getYouTubeResults({ query:"ハムスター,かわいい", limit:50, maxResults:10 }); }); } (function($){ $.getYouTubeResults=function(options){ dbg("★getYouTubeResults"); var opt=$.extend({ query:"", type:"playlist", maxResults:10, limit:0, channelId:"", regionCode:"JP", /* 国コード */ order:"viewCount", /* 検索順 */ part:"id, snippet, status", fields:"" },options); var pageToken="",s=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; var requestOptions = { maxResults:opt.maxResults, //1ページ当たりの結果数最大値(0-50)デフォルト10 q:opt.query, /* 検索キーワード */ regionCode:opt.regionCode, type:opt.type,//video,channel,playlist order:opt.order, /* publishedAfter publishedBefore topicId videoCaption videoCategoryId videoDefinition videoDimension videoDuration videoEmbeddable videoLicense "relatedToVideoId:"0f1SLJEY6iY",//指定した動画の関連動画のみ検索対象とする videoSyndicated youtube.com外で再生できる動画のみ検索 channelId チャンネル固有ID(ユーザー名ではない)を指定すると、そのチャンネル内での検索となる */ "part":"id,snippet" }; if(opt.fields!="") requestOptions.fields=opt.fields; makeRequest(); /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:"", path:"/youtube/v3/search", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ $("#message").html(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ pageToken=resp.nextPageToken; /* dbg("output");dbg("pageToken:"+pageToken); */ if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ if(opt.limit>0 && totalResults> opt.limit){ totalResults=opt.limit; } total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<li>結果数最大値の指定:"+opt.maxResults+"</li>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>取得数上限:"+((opt.limit==0)?"∞":opt.limit)+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; $("#results").append("<ul>"+s+"</ul>"); s=""; if(totalResults==0){ $("#message").html("検索条件に一致するデータがありませんでした"); } } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Search Results</h2>"+s); } } function itemOutput(items){ //dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(j>=opt.limit) return; j=(allcnt*resultsPerPage)+i+1; if(item.id && item.snippet){ s+="<dl>"; /* id */ var id=item.id.playlistId; var kind=item.id.kind; var thumbnails_default="no thumbnails"; var snippet=item.snippet; var title=(snippet.title)?snippet.title:"no title"; var channelId=(snippet.channelId)?snippet.channelId:"no channelId"; var channelTitle=(snippet.channelTitle)?snippet.channelTitle:"no channelTitle"; var pubdatedAt=(snippet.publishedAt)?formatDate(snippet.publishedAt):"no publishedAt"; var description=(snippet.description)?snippet.description:"no description"; if(snippet.thumbnails){ $.each(snippet.thumbnails, function(y, ytem){ //default, medium, height if(y=="default"){ thumbnails_default=ytem.url; } }); } s+="<dt>"; s+="<a href='http://www.youtube.com/playlist?list="+id+"'><img src='"+thumbnails_default+"'></a>"; s+="</dt><dd>【"+j+"】"; s+="<p>種類:"+kind+"</a></p>"; s+="<p>再生リスト名(ID):<a href='http://www.youtube.com/playlist?list="+id+"'>"+title+"("+id+")</a></p>"; s+="<p>再生リストが属するチャンネルのタイトル(ID): <a href='http://www.youtube.com/feed/"+channelId+"'>"+channelTitle+"("+channelId+")</a></p>"; s+="<p>登録日: "+pubdatedAt+"</p>"; s+="<p>"+description+"</p>"; /* if(snippet.resourceId && snippet.resourceId.videoId){ s+="<p>resourceId.videoId:<a href='http://www.youtube.com/watch?v="+snippet.resourceId.videoId+"'>"+snippet.resourceId.videoId+"</a></p>"; } */ s+="</dd></dl>"; } }); } return this; } })(jQuery); var formatDate=function(str){ var tmp=str.split("T"); var ymd=tmp[0].split("-"); var hms=tmp[1].split(":"); var sec=hms[2].split(".")[0]; var d=new Date(new Date(ymd[0], ymd[1]-1, ymd[2], hms[0], hms[1], sec).getTime()+(1000*60*60*9)); //+9h var year=d.getFullYear(); var month=d.getMonth()+1; var day=d.getDate(); var hour=(d.getHours() < 10 ) ? '0'+d.getHours() : d.getHours(); var min =(d.getMinutes() < 10 ) ? '0'+d.getMinutes() : d.getMinutes(); var sec =(d.getSeconds() < 10 ) ? '0'+d.getSeconds() : d.getSeconds(); return year+"/"+month+"/"+day+" "+hour+":"+min;//+":"+sec; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body> <h1>設置サンプル:[YouTube API(v3) - 再生リストの動画検索(認証なし)</h1> <p> 'ハムスター'という名前がタイトルに含まれる再生リストを、再生回数の多い順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p> <div id="message"></div> <div id="results"></div> </body> /html>
動画の検索(認証なし)
'ハムスター'または'hamster'がタイトルに含まれる動画をを、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 開発キー https://code.google.com/apis/console */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; function onJSClientLoad() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', function(){ $.getYouTubeResults({ query:"ハムスター hamster", order:"date", limit:50, maxResults:10 }); }); } (function($){ $.getYouTubeResults=function(options){ dbg("★getYouTubeResults"); var opt=$.extend({ query:"", type:"video", maxResults:10, limit:0, channelId:"", regionCode:"JP", /* 国コード */ order:"viewCount", /* 検索順 */ part:"id, snippet, status", fields:"" },options); var pageToken="",s=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; var requestOptions = { maxResults:opt.maxResults, //1ページ当たりの結果数最大値(0-50)デフォルト10 q:opt.query, /* 検索キーワード */ regionCode:opt.regionCode, type:opt.type,//video,channel,playlist order:opt.order, /* publishedAfter publishedBefore topicId videoCaption videoCategoryId videoDefinition videoDimension videoDuration videoEmbeddable videoLicense "relatedToVideoId:"0f1SLJEY6iY",//指定した動画の関連動画のみ検索対象とする videoSyndicated youtube.com外で再生できる動画のみ検索 channelId チャンネル固有ID(ユーザー名ではない)を指定すると、そのチャンネル内での検索となる */ "part":"id,snippet" }; if(opt.fields!="") requestOptions.fields=opt.fields; makeRequest(); /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:"", path:"/youtube/v3/search", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ $("#message").html(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ pageToken=resp.nextPageToken; /* dbg("output");dbg("pageToken:"+pageToken); */ if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ if(opt.limit>0 && totalResults> opt.limit){ totalResults=opt.limit; } total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<li>結果数最大値の指定:"+opt.maxResults+"</li>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>取得数上限:"+((opt.limit==0)?"∞":opt.limit)+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; $("#results").append("<h2>Results</h2>"+s); s=""; if(totalResults==0){ $("#message").html("検索条件に一致するデータがありませんでした"); } } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Search Results</h2>"+s); } } function itemOutput(items){ //dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(j>=opt.limit) return; j=(allcnt*resultsPerPage)+i+1; if(item.id && item.snippet){ s+="<dl>"; /* id */ var id=item.id.videoId; var kind=item.id.kind; var thumbnails_default="no thumbnails"; var snippet=item.snippet; var title=(snippet.title)?snippet.title:"no title"; var channelId=(snippet.channelId)?snippet.channelId:"no channelId"; var channelTitle=(snippet.channelTitle)?snippet.channelTitle:"no channelTitle"; var pubdatedAt=(snippet.publishedAt)?formatDate(snippet.publishedAt):"no publishedAt"; var description=(snippet.description)?snippet.description:"no description"; if(snippet.thumbnails){ $.each(snippet.thumbnails, function(y, ytem){ //default, medium, height if(y=="default"){ thumbnails_default=ytem.url; } }); } s+="<dt>"; s+="<a href='http://www.youtube.com/watch?v="+id+"'><img src='"+thumbnails_default+"'></a>"; s+="</dt><dd>【"+j+"】"; s+="<p>種類:"+kind+"</a></p>"; s+="<p>動画タイトル(ID):<a href='http://www.youtube.com/watch?v="+id+"'>"+title+"("+id+")</a></p>"; s+="<p>動画が属するチャンネルのタイトル(ID): <a href='http://www.youtube.com/channel/"+channelId+"'>"+channelTitle+"("+channelId+")</a></p>"; s+="<p>動画の公開日: "+pubdatedAt+"</p>"; s+="<p>動画の説明文:"+description+"</p>"; /* if(snippet.resourceId && snippet.resourceId.videoId){ s+="<p>resourceId.videoId:<a href='http://www.youtube.com/watch?v="+snippet.resourceId.videoId+"'>"+snippet.resourceId.videoId+"</a></p>"; } */ s+="</dd></dl>"; } }); } return this; } })(jQuery); var formatDate=function(str){ var tmp=str.split("T"); var ymd=tmp[0].split("-"); var hms=tmp[1].split(":"); var sec=hms[2].split(".")[0]; var d=new Date(new Date(ymd[0], ymd[1]-1, ymd[2], hms[0], hms[1], sec).getTime()+(1000*60*60*9)); //+9h var year=d.getFullYear(); var month=d.getMonth()+1; var day=d.getDate(); var hour=(d.getHours() < 10 ) ? '0'+d.getHours() : d.getHours(); var min =(d.getMinutes() < 10 ) ? '0'+d.getMinutes() : d.getMinutes(); var sec =(d.getSeconds() < 10 ) ? '0'+d.getSeconds() : d.getSeconds(); return year+"/"+month+"/"+day+" "+hour+":"+min;//+":"+sec; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body> <h1>設置サンプル:[YouTube API(v3) - 動画検索(認証なし)</h1> <p> 'ハムスター'または'hamster'がタイトルに含まれる動画を、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p> <div id="message"></div> <div id="results"></div> </body> /html>
動画のカテゴリ一覧を取得する
2013/3/24
参照:https://developers.google.com/youtube/v3/docs/videoCategories
指定した国コード・言語の動画のカテゴリの一覧を取得できす。
設置サンプル
日本の動画カテゴリを取得(認証なし)
設置サンプルサンプルを見る<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css">
<title>YouTubeAPIv3サンプル | 動画情報取得(認証なし)</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
var apiKey="AIzaSyADjDbt-bUW40F3c41Mu0HWRPXLpAMbPy4"; /* 自分のキー */
var limit="none";
var pageToken="";
var allcnt=0;
var j=0;
/* APIロード */
function onJSClientLoad() {
dbg("onJSClientLoad");
gapi.client.setApiKey(apiKey);
gapi.client.load('youtube', 'v3', makeRequest);
}
var requestOptions = {
"regionCode":"JP", /* 国コード */
"hl":"ja", /* 言語 */
"part":"id,snippet"
};
function makeRequest(){
dbg("makeRequest:"+pageToken);
if(pageToken){
dbg("pageTokenあり:"+pageToken);
requestOptions.pageToken=pageToken;
}else{
dbg("pageTokenなし");
}
var request=gapi.client.request({
mine:"",
path:"/youtube/v3/videoCategories",
params:requestOptions
});
request.execute(function(resp) {
dbg(resp);
output(resp,pageToken);
});
}
var totalResults=0;
var resultsPerPage=0;
var total=0;
var s="";
function output(resp,pageTokenFLG){
itemOutput(resp.items);
$("#results").append("<h2>カテゴリ数:"+resp.items.length+"</h2><table>"+s+"</table>");
}
function itemOutput(items){
s+="<thead><tr><th>id</th><th>title</th><th>channelId</th></tr></thead>";
s+="<tbody>";
$.each(items, function(i, item){
j=(allcnt*resultsPerPage)+i+1;
s+="<tr>";
s+=(item.id)?"<th>"+((item.id)?item.id:"")+"</th>":"<th>-</th>";
if(item.snippet){
var snippet=item.snippet;
s+=(snippet.title)?"<td>"+snippet.title+"</td>":"<td>-</td>";
s+=(snippet.channelId)?"<td>"+snippet.channelId+"</td>":"<td>-</td>";
}
s+="</tr>";
});
s+="</tbody>";
}
var dbg=function(str){
try{
if(window.console && console.log){
console.log(str);
}
}catch(err){
//alert("error:"+err);
}
}
</script>
<script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script>
</head>
<body>
<h1>設置サンプル:[YouTube API(v3) - 動画情報取得</h1>
<div id="results"></div>
</body>
/html>
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 動画情報取得(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> var apiKey="AIzaSyADjDbt-bUW40F3c41Mu0HWRPXLpAMbPy4"; /* 自分のキー */ var limit="none"; var pageToken=""; var allcnt=0; var j=0; /* APIロード */ function onJSClientLoad() { dbg("onJSClientLoad"); gapi.client.setApiKey(apiKey); gapi.client.load('youtube', 'v3', makeRequest); } var requestOptions = { "regionCode":"JP", /* 国コード */ "hl":"ja", /* 言語 */ "part":"id,snippet" }; function makeRequest(){ dbg("makeRequest:"+pageToken); if(pageToken){ dbg("pageTokenあり:"+pageToken); requestOptions.pageToken=pageToken; }else{ dbg("pageTokenなし"); } var request=gapi.client.request({ mine:"", path:"/youtube/v3/videoCategories", params:requestOptions }); request.execute(function(resp) { dbg(resp); output(resp,pageToken); }); } var totalResults=0; var resultsPerPage=0; var total=0; var s=""; function output(resp,pageTokenFLG){ itemOutput(resp.items); $("#results").append("<h2>カテゴリ数:"+resp.items.length+"</h2><table>"+s+"</table>"); } function itemOutput(items){ s+="<thead><tr><th>id</th><th>title</th><th>channelId</th></tr></thead>"; s+="<tbody>"; $.each(items, function(i, item){ j=(allcnt*resultsPerPage)+i+1; s+="<tr>"; s+=(item.id)?"<th>"+((item.id)?item.id:"")+"</th>":"<th>-</th>"; if(item.snippet){ var snippet=item.snippet; s+=(snippet.title)?"<td>"+snippet.title+"</td>":"<td>-</td>"; s+=(snippet.channelId)?"<td>"+snippet.channelId+"</td>":"<td>-</td>"; } s+="</tr>"; }); s+="</tbody>"; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> </head> <body> <h1>設置サンプル:[YouTube API(v3) - 動画情報取得</h1> <div id="results"></div> </body> /html>