https://www.youtube.com/watch?v=6wL3evhiN5k
구현 내용
- 테이블 + 컬렉션 뷰 내에 나온 영화 셀을 누르면 해당 영화의 트레일러 영상을 유튜브를 통해 볼 수 있다.
구현 코드
- Google developer console 이라고 검색하여 관련 사이트에 접근한다.
- 이 사이트에서 프로젝트를 하나 생성하고, 유뷰브 API_KEY를 가져온다.
https://developers.google.com/youtube/v3/docs?apix=true&hl=ko
- 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)
}
}
}
}
'iOS > UIKIT' 카테고리의 다른 글
랜덤으로 영화 표시하기 (0) | 2024.07.10 |
---|---|
webkit을 통해 유튜브 영상의 주소로 영상 틀어보기 (0) | 2024.07.08 |
서치바? 검색창은 어떻게 사용하는가? (0) | 2024.07.05 |
API를 통해 가져온 데이터를 테이블 내에 컬렉션뷰 이미지로 넣기 (0) | 2024.07.05 |
공공 API를 통해 데이터 불러오기 (TMDB) (0) | 2024.07.04 |