Search

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

GET https://www.googleapis.com/youtube/v3/channels

参照: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

GET https://www.googleapis.com/youtube/v3/playlists

参照: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

GET https://www.googleapis.com/youtube/v3/playlistItems

参照: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

GET https://www.googleapis.com/youtube/v3/videos

参照: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

GET https://www.googleapis.com/youtube/v3/videoCategories

参照: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>

関連コンテンツ

Q. このサイトの情報はお役に立ちましたでしょうか?

投票する 投票結果を見る

管理人に【web拍手】を送るweb拍手(1行メッセージも送れます♪)

pagetop

polarized women