2016-07-15 6 views
0

컨텍스트 Android Studio (Java)를 사용하고 있습니다. 나는 주어진 재생 목록의 모든 비디오를 얻고 싶습니다 (또는 50, 나는 다른 모든 것을 얻을 것입니다).Java에서 YouTube 재생 목록의 모든 동영상 가져 오기

문제 나는 https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=PLiEwZfNgb4fVrRzTonlVEMj6DB2Nmzg2M&key=AIzaSyC2_YRcTE9916fsmA0_KRnef43GbLzz8m0 같은 URL을 사용하는 사람들을 볼 수 있지만 나는 자바에서이를 구현하는 방법을 모르겠어요. 좀 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)"); 

을 그리고 난 정말 내가 검색보다는 다른 것을 얻는 방법을 이해하지 않습니다. 문서의 대부분은 영어로만 ...

편집 좋아, 내가, 내가 거의 해결책을 찾은 것 같아 시도를 계속하지만이 오류가 발생했습니다. { "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, video, playlistplaylistItems을 사용합니다.

이 문서에 따르면 다음과 같은 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를 얻을 수있는 세 가지 방법이 있다고 가정 할 수있다. 그러나 먼저 우리가 어떻게 PARTSFIELDS 리소스를 정의 할지를 아는 것이 중요합니다.

우리가이 코드를 사용하는 부품를 정의하려면 : "snippet"을 포함, 다양한 분야 (또는 자식 속성)를 포함하는 속성을 식별, 이전 행에서

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

title, description, position하고, resourceId이므로 "snippet"으로 설정하면 API의 응답에 해당 하위 속성이 모두 포함됩니다.

이제 FIELDS를 정의하면 이전 속성을 제한 할 수 있습니다.예를 들어,이 코드에서 : 우리는 부품 속성에서 id을 정의하지 않았기 때문에

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

우리가 list.execute()를 호출하면 오류가 표시됩니다. 또한 JSON 구조에 따르면 id은 문자열이며 하위 속성으로 videoId을 포함하지 않습니다. 아!하지만 에서 videoId을 추출 할 수 있습니까? - 음, 대답은 예/아니오입니다. 왜? Teo에 오면 JSON 구조가 명확하게 나타납니다. 네, 나는 그것을 볼 수 있지만 문서를 말한다 다음 snippet.resourceId.kind 속성의 값이 youtube#video 경우

는,이 속성이 표시되고 속성의 값은 유튜브가 고유의 동영상을 식별하는 데 사용하는 ID를 포함합니다 재생 목록.

즉, 때때로을 사용할 수 없습니다. 그럼, 우리는 어떻게 videoId을 얻을 수 있습니까? - id 또는 contentDetails을 PARTS 리소스에 추가 할 수 있습니다. 우리는 contentDetails 다음과 같이 필드를 정의 추가하는 경우

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

: 우리가 id를 추가하는 경우 다음과 같이 필드를 정의

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 나던 존재한다. idsnippet/resourceId/videoId이 있습니다. 내 추측은 당신의 setfields가 옳지 않다는 것입니다.

+0

웹 사이트와 코드에서 동일한 계층 구조가 아닌 이유를 모르지만 item/ContentDetails/VideoId입니다. 귀하의 의견은 많이 도와 줘서 고마워. – Marco