2016-07-15 12 views
0

状況私はAndroidスタジオ(Java)で作業しています。私は与えられたプレイリストのすべてのビデオを取得したい(または50、私はすべての後にすべてを取得します)。JavaのYouTubeプレイリストの動画をすべて取得する

問題は私が https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=PLiEwZfNgb4fVrRzTonlVEMj6DB2Nmzg2M&key=AIzaSyC2_YRcTE9916fsmA0_KRnef43GbLzz8m0 のようなURLを使っている人を見るが、私はJavaでこれを実装する方法がわかりません。私はいくつかのtutoに従うと、私のような全く別の情報を取得する方法だ:

YouTube.Search.List query; 
query = youtube.search().list("id,snippet"); 
     query.setKey(MY_API_KEY); 
     query.setMaxResults((long)20); 
     query.setType("video"); 
     query.setFields("items(id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url)"); 

をそして私は本当に私は検索以外の何かを得るのですか理解していません。 ドキュメントのほとんどは英語のみである... [OK]を

EDIT は、私がしようとし続け、私は近いソリューションを得たと思いますが、私はエラーを得ました。 { "code" : 400, "errors" : [ { "domain" : "global", "location" : "fields", "locationType" : "parameter", "message" : "Invalid field selection videoId", "reason" : "invalidParameter" } ], "message" : "Invalid field selection videoId" }

EDITに2ありがとう::マルタインWoudstraここ

private YouTube youtube; 
private YouTube.PlaylistItems.List playlistItemRequest; 
private String PLAYLIST_ID = "PLiEwZfNgb4fVrRzTonlVEMj6DB2Nmzg2M"; 
public static final String KEY = "AIzaSyC2_YRcTE9916fsmA0_KRnef43GbLzz8m0"; 

// Constructor 
public YoutubeConnector(Context context) 
{ 
    youtube = new YouTube.Builder(new NetHttpTransport(), 
      new JacksonFactory(), new HttpRequestInitializer() 
    { 
     @Override 
     public void initialize(HttpRequest hr) throws IOException {} 
    }).setApplicationName(context.getString(R.string.app_name)).build(); 
} 

public List<VideoItem> result() 
{ 
    List<PlaylistItem> playlistItemList = new ArrayList<PlaylistItem>(); 
    try 
    { 
    /* HERE MUST BE MY PROBLEM ! */ 
     playlistItemRequest = youtube.playlistItems().list("snippet"); 
     playlistItemRequest.setPlaylistId(PLAYLIST_ID); 
     playlistItemRequest.setFields("items(id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url),nextPageToken,pageInfo"); 
     playlistItemRequest.setKey(KEY); 
     String nextToken = ""; 
     do { 
      playlistItemRequest.setPageToken(nextToken); 
      PlaylistItemListResponse playlistItemResult = playlistItemRequest.execute(); 

      playlistItemList.addAll(playlistItemResult.getItems()); 

      nextToken = playlistItemResult.getNextPageToken(); 
     } while (nextToken != null); 
    }catch(IOException e) 
    { 
     Log.d("YC", "Could not initialize: "+e); 
    } 
//[...] 
} 

は、私が得たエラーです。 正しい行されました:

playlistItemRequest = youtube.playlistItems().list("snippet,contentDetails"); 
//[...] 
playlistItemRequest.setFields("items(snippet/title,snippet/description,snippet/thumbnails/default/url,contentDetails/videoId),nextPageToken,pageInfo"); 
//[...] 
videoItem.setId(item.getContentDetails().getVideoId()); 
+0

私はあなたの質問への回答を追加しました〜あなたが役に立ったと思っていますか? – Teocci

答えて

2

私はこれは古い質問ですが、適切な情報を入手する方法を理解するためにどのリソースを使用しているかを特定することが重要です。 YouTube API v3には多くのリソースがありますが、通常はsearch,videoplaylistplaylistItemsを使用しています。

は、ドキュメントによると、以下のJSON構造はplaylistItemsリソースの形式を示しています。

{ 
    "kind": "youtube#playlistItem", 
    "etag": etag, 
    "id": string, 
    "snippet": { 
    "publishedAt": datetime, 
    "channelId": string, 
    "title": string, 
    "description": string, 
    "thumbnails": { 
     (key): { 
     "url": string, 
     "width": unsigned integer, 
     "height": unsigned integer 
     } 
    }, 
    "channelTitle": string, 
    "playlistId": string, 
    "position": unsigned integer, 
    "resourceId": { 
     "kind": string, 
     "videoId": string, 
    } 
    }, 
    "contentDetails": { 
    "videoId": string, 
    "startAt": string, 
    "endAt": string, 
    "note": string, 
    "videoPublishedAt": datetime 
    }, 
    "status": { 
    "privacyStatus": string 
    } 
} 

この構造からの、我々はvideoIdを取得するには3つの方法があると仮定して。しかしまず、PARTSFIELDSをどのように定義するのかを知ることが重要です。

は、我々はこのコードを使用 PARTSを定義するには: "snippet"を含む、多くの分野(または子のプロパティ)を含むプロパティを識別し、前の行で

YouTube.PlaylistItems.List list = youtube.playlistItems().list("snippet"); 

titledescriptionposition、およびresourceIdですので、"snippet"を設定すると、APIの応答にはすべての子プロパティが含まれます。

ここで、FIELDSを定義すると、以前のプロパティを制限することもできます。たとえば、このコードでは:私たちはPARTSプロパティでidを定義していなかったので、

list.setFields("items(id/videoId,snippet/title,snippet/description," + 
    "snippet/thumbnails/default/url)"); 

我々はlist.execute()を呼び出すと、エラーが表示されます。また、JSON構造体によると、idは文字列であり、子プロパティとしてvideoIdは含まれていません。ああ!, resourceIdからvideoIdを抽出できますか? - まあ、答えははい/いいえです。 -なぜそうなのか?テオに来て、JSONの構造はそれをはっきりと示しています。 - はい、私はそれを見ることができますが、ドキュメントは言う:

snippet.resourceId.kindプロパティの値がyoutube#videoの場合、このプロパティが存在し、その値はYouTubeが一意でビデオを識別するために使用するIDが含まれていますプレイリスト。

これは、時にはが利用できない可能性があることを意味します。 - それでは、どうすればvideoIdを入手できますか? - まあ、idまたはcontentDetailsをPARTSリソースに追加できます。我々はidを追加する場合、このようなフィールドを定義しています。私たちはcontentDetailsを追加する場合

YouTube.PlaylistItems.List list = youtube.playlistItems().list("id,snippet"); 
list.setFields("items(id,snippet/title,snippet/description," + 
    "snippet/thumbnails/default/url)"); 

、このようなフィールドを定義します。

YouTube.PlaylistItems.List list = youtube.playlistItems() 
    .list("snippet,contentDetails"); 
list.setFields("items(contentDetails/videoId,snippet/title,snippet/description," + 
    "snippet/thumbnails/default/url)"); 

私はこれがあなたたちを助け願っています。

2

id/videoIdのdoesntが存在します。 idsnippet/resourceId/videoIdがあります。 私の推測はあなたのsetfieldsが正しくないです。

+0

ウェブサイトとコードの階層が同じではない理由は分かりませんが、アイテム/ ContentDetails/VideoIdでした。 あなたのご意見は大変お手伝いします。 – Marco

関連する問題