[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を後で個別に抽出するために、簡単な文字列パケット操作を実行します.
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は提供されないため、インターネットを通じて音楽のタイトル、歌手、特集表紙(サムネイル)を入手する必要がある.