본문 바로가기

TIL

[TIL] kotlin Youtube Data API 3 - [ 1 ] 기본 설정

-1-  Youtube Data API 3  videos:List 받아와 Hot 10 Thumbnails 만들기 [ 1 ]

 

0. NewProject 만들어 두고 build.gradle 의존성 추가 및 Manifest 권한 부여

 

build.gradle

android {

    buildFeatures {
        viewBinding = true
        buildConfig = true
    }
}

dependencies {

    // gson converter
    implementation("com.google.code.gson:gson:2.10.1")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")

    // url 이미지 로딩 coil Library
    implementation("io.coil-kt:coil:2.4.0")

    // coroutine Library
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")

    // viewModel Library
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
    implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2")
    
    // retrofit, okHttp3, moshi converter Library
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.okhttp3:okhttp:4.10.0")
    implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
    
    // fragment
    implementation("androidx.fragment:fragment-ktx:1.6.1")
    ...
}

 

JVM 오류가 발생할 시 JVM 버전 17을 맞춰주고 다시 시도 해보자.
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }

 

 

Manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.INTERNET"/>
    
    <application
    
    ...
    </application>
</manifest>
  • 네트워크 통신을 위해 INTERNET 권한 부여

 

 

1. API Key 발급받기

https://console.cloud.google.com/

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

  • 구글 클라우드 콘솔로 이동해서 API KEY를 발급 받는다

 

[ 1 - 1 ] API 및 서비스 / 라이브러리로 이동.

 

[ 1 - 2 ] 라이브러리 화면 중앙 API 및 서비스 검색에 ' youtube api ' 검색 후 youtube Data API 3 사용하기

검색 창

[ 1 - 3 ] 사용하기 , API 사용해 보기 링크를 타고 들어가면 리소스 유형, 메소드 등 정보가 많으니 참조하기.

 

[ 1 - 4 ] 사용자 인증 정보로 넘어가서 사용자 인증정보 만들기 

 

  • 이후 안내되는 방식대로 인증 정보 추가해주면 API key가 정상적으로 발급이 된다.

 

2. Key 정상작동 확인하기, Json Data 받기

 

Videos: list  |  YouTube Data API  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English Videos: list 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. API 요청 매개변수와 일치하는

developers.google.com

 

[ 2 - 1 ] most popular videos - Trending 동영상을 확인하기 위해 list ( most popular videos ) 클릭 

 

 

  • Data API 3 Videos : List 에서 본인이 사용할 프로퍼티를 추가해준 뒤 API Key를 체크해주고 Excute 클릭해준다 

 

  • 다음과 같은 API 요청코드가 나온다. 코드가 안나올 경우 execute 우측에 Show Code 클릭 해주면 확인 가능하다.
  • https://youtube.googleapis.com/youtube/v3/videos?part=snippet&chart=mostPopular&hl=ko-KR&maxResults=1&regionCode=KR&videoCategoryId=20&key=[YOUR_API_KEY]
  • [YOUR_API_KEY] 부분에 [ 1 ] 에서 발급받은 본인 키를 입력 후  URL 검색창에 입력해주고 이동해주면 된다.

  • 정상적으로 API 검색이 완료되었으면 해당 내용 Json을 복사해서 Android Studio 에서 플러그인 통해서 class로 만들어주자 

[ 2 - 2 ] Android studio - Json To Kotlin Class 플러그인 사용해서 Data Class 생성해주기.

  • Generate가 완료되면 Data 클래스가 생기면 취향에 맞게 데이터 위치를 바꿔주면 된다.

 

 

Video category Id list
1 - Film & Animation 
2 - Autos & Vehicles
10 - Music
15 - Pets & Animals
17 - Sports
18 - Short Movies
19 - Travel & Events
20 - Gaming
21 - Videoblogging
22 - People & Blogs
23 - Comedy
24 - Entertainment
25 - News & Politics
26 - Howto & Style
27 - Education
28 - Science & Technology
29 - Nonprofits & Activism
30 - Movies
31 - Anime/Animation
32 - Action/Adventure
33 - Classics
34 - Comedy
35 - Documentary
36 - Drama
37 - Family
38 - Foreign
39 - Horror
40 - Sci-Fi/Fantasy
41 - Thriller
42 - Shorts
43 - Shows
44 - Trailers

 

 

VideoInterface.kt

interface VideoInterface {
    @GET("videos")
    suspend fun searchYoutube(
        @Query("key") key: String = Constants.API_KEY,
        @Query("part") part: String,
        @Query("videoCategoryId") videoCategoryId :String,
        @Query("chart") chart:String,
        @Query("hl") hl:String,
        @Query("maxResults")maxResults:Int,
        @Query("regionCode")regionCode:String,
    ) : Response<SearchResponse>
}
  • [ 2 - 1 ] 의 API 사용해보기에서 사용한 매개변수를 토대로 Interface를 만들어준다,
  • 비동기적으로 처리할 수 있도록 suspend annotation 및 Response< 2- 2에서 생성한 데이터명 > 을 지정해준다.
  • Youtube Data API 3 는 API Key 를 통해 Headers로 특정할 수 없어 API Key로는 Headers로 데이터를 받을 수 없고, Query 매개변수로 Key를 전달해야 한다.
  • Headers를 특정할 수 있어  헤더를 통한 인증을 요구하는 경우 경우 ( 예 : Kakao API )에는 Headers 를 사용해야 한다.

Headers를 특정할 수 있어 Headers로 통신하는 접근하는 경우 예시

  • Header에 저장하는 것과 차이점
    • Key가 URL의 쿼리 매개변수로 포함하는지,  HTTP 헤더에 키를 배치하는지와 같이 API Key가 API 요청에 포함되는 방식의 차이이다. 
    •  헤더는 URL에 포함되지 않기 때문에 Headers에 Key를 저장하는 것이 URL에 포함하는 것보다 더 안전할 수 있다. 로그나 브라우저 기록에서 쉽게 볼 수 없기 때문이다.

 

 

 

RetrofitInstance.kt

object RetrofitInstance {
    private val okHttpClient: OkHttpClient by lazy {
        val interceptor = HttpLoggingInterceptor()

        if (BuildConfig.DEBUG)
            interceptor.level = HttpLoggingInterceptor.Level.BODY
        else
            interceptor.level = HttpLoggingInterceptor.Level.NONE

        OkHttpClient.Builder()
            .connectTimeout(20, TimeUnit.SECONDS)
            .writeTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS)
            .addNetworkInterceptor(interceptor)
            .build()
    }

    private val searchRetrofit: Retrofit by lazy {
        Retrofit.Builder()
            .baseUrl("https://youtube.googleapis.com/youtube/v3/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient)
            .build()
    }

    val api: VideoInterface by lazy {
        searchRetrofit.create(VideoInterface::class.java)
    }
}
  • Retrofit에 관해서는 아래 글에서 추가로 설명. 
 

[TIL] Retrofit 개념, 응답 처리 메서드 ( Response<T>, Call<T> )

전에 작성했던 글 안에 Retrofit과 OkHttp에 대해서 간단하게 작성했었는데 더 자세하게 정리하기 위해 분리. Retrofit ? Retrofit은 Type - safe한 REST 통신 라이브러리이다. RESTful API를 호출하고 JSON 또는 XML

junes-daily.tistory.com

 

 


 

[오늘 복습한 내용]

1. API 키 발급 방법과, Docs를 효율적으로 읽는 방법

 


[오류,에러 등등]

1. 특별한 오류는 없었다.

 


[느낀 점]

1. 어렵다

 

2. 더하기 → 곱셈 → 미적분 

 

3. 선택과 집중을 잘하자. 아직까진 공회전이 너무 잦은 것 같다

 

 


[Reference]

 

// Youtube Data API 3

https://han-py.tistory.com/432

https://android-uni.tistory.com/10

https://developers.google.com/youtube/v3/docs/search/list?hl=ko&apix_params=%7B%22part%22%3A%5B%22snippet%22%5D%2C%22maxResults%22%3A10%2C%22q%22%3A%22oneofthegirls%22%7D

https://developers.google.com/youtube/v3/docs/videos/list?hl=ko&apix_params=%7B%22part%22%3A%5B%22snippet%22%5D%2C%22chart%22%3A%22mostPopular%22%2C%22hl%22%3A%22ko-KR%22%2C%22maxResults%22%3A1%2C%22regionCode%22%3A%22KR%22%2C%22videoCategoryId%22%3A%2220%22%7D

https://stackoverflow.com/questions/61389951/how-to-use-youtube-data-api

 

// Category ID

https://stackoverflow.com/questions/17698040/youtube-api-v3-where-can-i-find-a-list-of-each-videocategoryid