[Android]YouTube Data APIを使用してYouTubeビデオ情報を取得
7530 ワード
前回の記事リンク
https://velog.io/@mraz3068/Android-%EB%8B%A4%EB%A5%B8-%EC%95%B1%EC%97%90%EC%84%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B0%9B%EA%B8%B0
前の記事では、他のアプリケーションのデータを受信する方法について説明しました.
これで、YouTubeデータAPIを使用してより多くのデータを取得し、画面に送信します.
まず、YouTube Data APIに関する詳細な説明は、リンクを添付することで代替されます.
https://developers.google.com/youtube/v3/docs?hl=ko
使用するリソースビデオ
https://developers.google.com/youtube/v3/docs/videos?hl=ko
YouTubeの動画情報を取得するためには、プロジェクトにダウンロードする必要があるファイルも存在する.
https://developers.google.com/youtube/android/player/downloads
該当するリンクに入り、圧縮ファイルをダウンロードし、解凍した後
プロジェクト内でappフォルダ内に新しいlibsフォルダを追加しjarファイルに入れればいいです.
基本的な設定が完了しました.
前回いただいたYouTubeのリンクを見てみましょう
sharedText: https://youtu.be/q-YzHC6m7Po
このリンクでは、ビデオのキー値、すなわち一意idは、/の後にgnbfly 2 ya 8という値である.実際、他のビデオのリンクの前のベースurlは同じで、後ろのidも違います.
したがって、idを後で個別に抽出するために、簡単な文字列パケット操作を実行します.
キー値を手に入れました.apiドキュメントを参照して、フォーマットに従って必要な情報を要求することができます.
https://developers.google.com/youtube/v3/getting-started?hl=ko
必要な情報はビデオのタイトル、チャンネル名、サムネイルです.
したがって、リクエストは次のようになります.
I/okhttp.OkHttpClient: {
"items": [
{
"id": "q-YzHC6m7Po",
"snippet": {
"title": "Deja Vu",
"thumbnails": {
"default": {
"url": "https://i.ytimg.com/vi/q-YzHC6m7Po/default.jpg",
"width": 120,
"height": 90
},
"medium": {
"url": "https://i.ytimg.com/vi/q-YzHC6m7Po/mqdefault.jpg",
"width": 320,
"height": 180
},
"high": {
"url": "https://i.ytimg.com/vi/q-YzHC6m7Po/hqdefault.jpg",
"width": 480,
"height": 360
},
"standard": {
"url": "https://i.ytimg.com/vi/q-YzHC6m7Po/sddefault.jpg",
"width": 640,
"height": 480
},
"maxres": {
"url": "https://i.ytimg.com/vi/q-YzHC6m7Po/maxresdefault.jpg",
"width": 1280,
"height": 720
}
},
"channelTitle": "Post Malone - Topic"
}
}
]
}
<-- END HTTP (988-byte body)
D/fetch Success: YouTubeResponse(items=[Item(id=q-YzHC6m7Po, snippet=Snippet(thumbnails=Thumbnails(default=Default(height=90, url=https://i.ytimg.com/vi/q-YzHC6m7Po/default.jpg, width=120), high=High(height=360, url=https://i.ytimg.com/vi/q-YzHC6m7Po/hqdefault.jpg, width=480), maxres=Maxres(height=720, url=https://i.ytimg.com/vi/q-YzHC6m7Po/maxresdefault.jpg, width=1280), medium=Medium(height=180, url=https://i.ytimg.com/vi/q-YzHC6m7Po/mqdefault.jpg, width=320), standard=Standard(height=480, url=https://i.ytimg.com/vi/q-YzHC6m7Po/sddefault.jpg, width=640)), title=Deja Vu, channelTitle=Post Malone - Topic))])
簡単にスクリーンに吹き付けると、このように出力できます.
YouTubeではOpen APIが存在し、ビデオリンクさえあればサムネイルや音楽のタイトル、歌手などを知ることができるが、Melonなどのストリーミングメディアサイトでは単独のOpen APIは提供されないため、インターネットを通じて音楽のタイトル、歌手、特集表紙(サムネイル)を入手する必要がある.
https://velog.io/@mraz3068/Android-%EB%8B%A4%EB%A5%B8-%EC%95%B1%EC%97%90%EC%84%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B0%9B%EA%B8%B0
前の記事では、他のアプリケーションのデータを受信する方法について説明しました.
これで、YouTubeデータAPIを使用してより多くのデータを取得し、画面に送信します.
まず、YouTube Data APIに関する詳細な説明は、リンクを添付することで代替されます.
https://developers.google.com/youtube/v3/docs?hl=ko
使用するリソースビデオ
https://developers.google.com/youtube/v3/docs/videos?hl=ko
YouTubeの動画情報を取得するためには、プロジェクトにダウンロードする必要があるファイルも存在する.
https://developers.google.com/youtube/android/player/downloads
該当するリンクに入り、圧縮ファイルをダウンロードし、解凍した後
プロジェクト内でappフォルダ内に新しいlibsフォルダを追加しjarファイルに入れればいいです.
基本的な設定が完了しました.
前回いただいたYouTubeのリンクを見てみましょう
sharedText: https://youtu.be/q-YzHC6m7Po
このリンクでは、ビデオのキー値、すなわち一意idは、/の後にgnbfly 2 ya 8という値である.実際、他のビデオのリンクの前のベースurlは同じで、後ろのidも違います.
したがって、idを後で個別に抽出するために、簡単な文字列パケット操作を実行します.
if(Intent.ACTION_SEND == action && type != null) {
if("text/plain" == type) {
sharedText = intent.getStringExtra(Intent.EXTRA_TEXT).toString()
Log.d("sharedText", sharedText)
val arr = sharedText.split("be/")
videoId = arr[1]
Log.d("sharedText", videoId)
fetchData(videoId)
}
else if (type.startsWith("image/")) {
val imageUri = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)
Log.d("imageUri", "$imageUri")
}
}
sharedText: q-YzHC6m7Poキー値を手に入れました.apiドキュメントを参照して、フォーマットに従って必要な情報を要求することができます.
https://developers.google.com/youtube/v3/getting-started?hl=ko
必要な情報はビデオのタイトル、チャンネル名、サムネイルです.
したがって、リクエストは次のようになります.
interface YouTubeService {
//video resource endpoint
@GET("youtube/v3/videos")
suspend fun fetchYoutubeSearchResultInfo(
@Query("id") videoId: String,
@Query("key") apiKey: String = BuildConfig.GOOGLE_API_KEY,
@Query("fields") fields: String = "items(id,snippet(title,thumbnails,channelTitle))",
@Query("part") part: String = "snippet"
): Response<YouTubeResponse>?
}
対応する方法で改造通信を行う.class YouTubeRepository {
suspend fun fetchYoutubeVideoInfo(
accessToken: String,
videoId: String,
): YouTubeState<YouTubeResponse> {
ServiceGenerator.setBuilderOptions(
targetUrl = BuildConfig.YOUTUBE_BASE_URL,
authToken = accessToken
)
.create(YouTubeService::class.java)
.fetchYoutubeSearchResultInfo(
videoId = videoId
)?.run {
return YouTubeState.Success(
this.body() ?: YouTubeResponse()
)
} ?: return YouTubeState.Error(Exception("Fetch Exception"))
}
}
バックエンドサーバが存在する場合は、ログイン時に使用するaccessTokenに送信されます.そうでない場合はgoogle apiキーを送信するだけです.suspend fun fetchYoutubeVideoInfo(
accessToken: String,
videoId: String,
context: CoroutineContext = Dispatchers.IO,
start: CoroutineStart = CoroutineStart.DEFAULT,
): YouTubeState<YouTubeResponse> = viewModelScope.async(
context = context,
start = start
) {
youTubeRepository.fetchYoutubeVideoInfo(
accessToken = accessToken,
videoId = videoId
)
}.await()
ビュー内private fun fetchData(videoId: String) {
mainScope {
viewModel.fetchYoutubeVideoInfo(accessToken = accessToken, videoId = videoId).let{
when(it) {
is YouTubeState.Success -> {
Log.d( "fetch Success", "${it.data}")
initViews(it.data)
}
is YouTubeState.Error -> {
Log.d("fetch error", "${it.exception}")
}
}
}
}
}
ログで記録した結果は以下の通りです.I/okhttp.OkHttpClient: {
"items": [
{
"id": "q-YzHC6m7Po",
"snippet": {
"title": "Deja Vu",
"thumbnails": {
"default": {
"url": "https://i.ytimg.com/vi/q-YzHC6m7Po/default.jpg",
"width": 120,
"height": 90
},
"medium": {
"url": "https://i.ytimg.com/vi/q-YzHC6m7Po/mqdefault.jpg",
"width": 320,
"height": 180
},
"high": {
"url": "https://i.ytimg.com/vi/q-YzHC6m7Po/hqdefault.jpg",
"width": 480,
"height": 360
},
"standard": {
"url": "https://i.ytimg.com/vi/q-YzHC6m7Po/sddefault.jpg",
"width": 640,
"height": 480
},
"maxres": {
"url": "https://i.ytimg.com/vi/q-YzHC6m7Po/maxresdefault.jpg",
"width": 1280,
"height": 720
}
},
"channelTitle": "Post Malone - Topic"
}
}
]
}
<-- END HTTP (988-byte body)
D/fetch Success: YouTubeResponse(items=[Item(id=q-YzHC6m7Po, snippet=Snippet(thumbnails=Thumbnails(default=Default(height=90, url=https://i.ytimg.com/vi/q-YzHC6m7Po/default.jpg, width=120), high=High(height=360, url=https://i.ytimg.com/vi/q-YzHC6m7Po/hqdefault.jpg, width=480), maxres=Maxres(height=720, url=https://i.ytimg.com/vi/q-YzHC6m7Po/maxresdefault.jpg, width=1280), medium=Medium(height=180, url=https://i.ytimg.com/vi/q-YzHC6m7Po/mqdefault.jpg, width=320), standard=Standard(height=480, url=https://i.ytimg.com/vi/q-YzHC6m7Po/sddefault.jpg, width=640)), title=Deja Vu, channelTitle=Post Malone - Topic))])
簡単にスクリーンに吹き付けると、このように出力できます.
YouTubeではOpen APIが存在し、ビデオリンクさえあればサムネイルや音楽のタイトル、歌手などを知ることができるが、Melonなどのストリーミングメディアサイトでは単独のOpen APIは提供されないため、インターネットを通じて音楽のタイトル、歌手、特集表紙(サムネイル)を入手する必要がある.
Reference
この問題について([Android]YouTube Data APIを使用してYouTubeビデオ情報を取得), 我々は、より多くの情報をここで見つけました https://velog.io/@mraz3068/Android-YouTube-Data-API-를-사용하여-유튜브-영상-정보-얻어오기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol