Edited at

【Swift】 YouTubeのAPI使って動画情報取得


はじめに

swiftでYoutubeのAPI使って動画情報を取得しようってやつです。

今回はSearch: listを使って「youtuber」と検索した時の結果を取得します。

【実行環境】

swift2.2

Xcode 7.3


準備


  1. Google Developers Consoleでアカウントの登録、プロジェクトの作成をします。


  2. APIManager > GoogleApiのタブの中の「YouTube Data API」をクリック > 有効にする > アラート下に出るので「認証情報に進む」 > 「プロジェクトへの認証情報の追加」という画面になるので、「APIを呼び出す場所」をiOSのものとテスト用にウェブブラウザのものを作成。


3.発行されるkeyを後で使うのでメモ。


実装

色々と方法はあると思いますが、今回はAlamofireを使って取得してみました。

ざっくり以下のような感じです。

◼︎リクエストURL

https://www.googleapis.com/youtube/v3/search?key=【APIKey】&q=youtuber&part=snippet&maxResults=40&order=date

以下のリンク先の情報からパラメータを色々と変更できますが、上記だと「youtuber」と検索した結果が日付順に40件取得できます。

参考

YouTube Data API の概要

◼︎取得部分

SwiftyJSONを使った方がスマートかもしれません。今回はYoutubeListクラスを別で作りたかったので以下のような感じになっています。呼び出す側はcallbackでレスポンスを取得する想定です。(今回はリクエスト部分のみ)


Model.swift

import UIKit

import Alamofire

class Model: NSObject {

private var youtubeNextPageToken: String?

func loadYoutubeList(callback: (youtubeList: YoutubeList) -> (), fail:((error: NSError) -> ())) {

let req = request(.GET, AppConfig.youtubeURL())

req.response { (request, response, responseData, error) -> Void in
do {
let jsonResult = try NSJSONSerialization.JSONObjectWithData(responseData!, options: NSJSONReadingOptions.MutableContainers) as! NSMutableDictionary

self.youtubeNextPageToken = jsonResult["nextPageToken"] as! String?
let ary = jsonResult["items"] as! NSArray
let youtubeList = YoutubeList(ary: ary)
callback(youtubeList: youtubeList)

} catch {
print("loadYoutubeList error")
}
}
}
}


結果は下記のような感じで返ってきます。



jsonResult: {
etag = "\"zekp1FB4kTkkM-rWc1qIAAt-BWc/TifEC5Oym7SNiT_zytNTgnsTItg\"";
items = (
{
etag = "\"zekp1FB4kTkkM-rWc1qIAAt-BWc/PrH1a-Z4ABG9_SjlW5nqJ6VeXWw\"";
id = {
kind = "youtube#video";
videoId = ZjTKLqT9wfw;
};
kind = "youtube#searchResult";
snippet = {
channelId = UCUJ9xD8E1m1fV7RFMZyJeIw;
channelTitle = "Edu Sanchez";
description = "Camaras wey como taii os traigo un video de la ostiaa con muchas ondas vitales webon para todos los kpes xD....Video de presentacion con errores y horrores ...";
liveBroadcastContent = none;
publishedAt = "2016-05-27T05:40:56.000Z";
thumbnails = {
default = {
height = 90;
url = "https://i.ytimg.com/vi/ZjTKLqT9wfw/default.jpg";
width = 120;
};
high = {
height = 360;
url = "https://i.ytimg.com/vi/ZjTKLqT9wfw/hqdefault.jpg";
width = 480;
};
medium = {
height = 180;
url = "https://i.ytimg.com/vi/ZjTKLqT9wfw/mqdefault.jpg";
width = 320;
};
};
title = "YOUTUBER???";
};
},
{
etag = "\"zekp1FB4kTkkM-rWc1qIAAt-BWc/YXQkUGp_kX1iM7Cgate2dFkAagM\"";
id = {
kind = "youtube#video";
videoId = h5YnkuDmKa8;
};
kind = "youtube#searchResult";
snippet = {
channelId = UCm5rGiZgf7ogWcEoO6O8j4w;
channelTitle = "Kick Ass Humor";
description = "Sorry this video is so long im trying to cut down on editing and give you guys some raw unedited content the first ever be in a kickasshumor video contest ...";
liveBroadcastContent = none;
publishedAt = "2016-05-27T05:20:55.000Z";
thumbnails = {
default = {
height = 90;
url = "https://i.ytimg.com/vi/h5YnkuDmKa8/default.jpg";
width = 120;
};
high = {
height = 360;
url = "https://i.ytimg.com/vi/h5YnkuDmKa8/hqdefault.jpg";
width = 480;
};
medium = {
height = 180;
url = "https://i.ytimg.com/vi/h5YnkuDmKa8/mqdefault.jpg";
width = 320;
};
};
title = "small youtuber tag feat. Jay Herrod,KKStreaks and Tbitton192";
};
},
.
.
.
}
);
kind = "youtube#searchListResponse";
nextPageToken = CCgQAA;
pageInfo = {
resultsPerPage = 40;
totalResults = 1000000;
};
regionCode = JP;
}

◼︎続きの検索結果を取得

今回はmaxResults=40をパラメータに付与してますので、41件目から続きの結果が欲しい場合は「nextPageToken」の値を「pageToken="nextPageTokenの値"」のようにパラメータに付与してリクエストすれば続きから取得できます。

https://www.googleapis.com/youtube/v3/search?key=【APIKey】&q=youtuber&part=snippet&maxResults=40&order=date&pageToken=CCgQAA

前のページ(40件前)の結果は「prevPageToken」という値が返ってくると思いますのでこれらのtokenを使って繰り返しリクエストしていけば検索結果を取得できます。


おわりに

◼︎再生

再生方法もいくつかあると思いますが、端末のplayerを立ち上がらせずに再生できるYTPlayerViewが便利そうです。

詳しくはクラスメソッド様の下記リンクをみていただければ...

[Swift] YouTube-Player-iOS-Helper を使って YouTube 動画を再生してみる