iOS/UIKIT

유튜브에서 제공하는 API를 통해 영화 트레일러 가져오기

밤새는 탐험가89 2024. 7. 8. 17:13

 

https://www.youtube.com/watch?v=6wL3evhiN5k

 

 

구현 내용

  • 테이블 + 컬렉션 뷰 내에 나온 영화 셀을 누르면 해당 영화의 트레일러 영상을 유튜브를 통해 볼 수 있다. 

 

구현 코드

  • Google developer console 이라고 검색하여 관련 사이트에 접근한다. 
  • 이 사이트에서 프로젝트를 하나 생성하고, 유뷰브 API_KEY를 가져온다. 

 

https://developers.google.com/youtube/v3/docs?apix=true&hl=ko

 

API Reference  |  YouTube Data API  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. API Reference 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. YouTube Data API를 사용하면 YouTube 웹사이트에

developers.google.com

 

 

  • APICaller 클래스 내에 getMovie 라는 메서드를 생성한다. 
  • 이를 통해 keyWord 를 통해 관련 유튜브 영상을 가져 올 수 있도록 한다. 
import Foundation

// MARK: Constants
struct Constants {
    static let baseURL = "https://api.themoviedb.org"
    static let API_KEY = "API_KEY"
    static let YoutubeAPI_KEY = "Youtube_API_KEY"
    static let YoutubeBaseURL = "https://www.googleapis.com/youtube/v3/search?"
}

// MARK: ERROR
enum APIError: Error {
    case failedToGetData
}


// MARK: APICaller 클래스
class APICaller {
    
    static let shared = APICaller()
    ...
    func getMovie(with keyWord: String, completion: @escaping (Result<VideoElement, Error>) -> Void) {
        guard let keyWord = keyWord.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { return }
        
        guard let url = URL(string: "\(Constants.YoutubeBaseURL)q=\(keyWord)&key=\(Constants.YoutubeAPI_KEY)") else { return }
        
        let task = URLSession.shared.dataTask(with: URLRequest(url: url)) { data, _, error in
            guard let data = data, error == nil else { return }
            
            do {
                let results = try JSONDecoder().decode(YoutubeSearchResponse.self, from: data)
                completion(.success(results.items[0]))
            } catch {
                completion(.failure(error))
                print(error.localizedDescription)
            }
        }
        task.resume() 
    }
}

 

 

  • 유튜브 API를 통해 얻어온 초기 데이터의 구조를 분석하여 필요한 부부만 별도이 데이터 모델로 생성한다. 
import Foundation

struct YoutubeSearchResponse: Codable {
    let items: [VideoElement]
}

struct VideoElement: Codable {
    let id: IdVideoElement
}

struct IdVideoElement: Codable {
    let kind: String
    let videoId: String
}

 

  • CollectionViewTableViewCell의 셀이 Home 에서 바로 보이기 때문에 이 곳에 셀을 누르면 관련된 유튜브 주소가 나오도록 했다. 
import UIKit

class CollectionViewTableViewCell: UITableViewCell {
    ...
    ...
}

extension CollectionViewTableViewCell: UICollectionViewDelegate, UICollectionViewDataSource {
    
    ... 
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        collectionView.deselectItem(at: indexPath, animated: true)
        
        let title = titles[indexPath.row]
        guard let titleName = title.original_title ?? title.original_name else { return }
        
        APICaller.shared.getMovie(with: titleName + " trailer") { result in
            switch result {
            case .success(let videoElement):
                print(videoElement.id)
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }
}