#はじめに
swiftでYoutubeのAPI使って動画情報を取得しようってやつです。
今回はSearch: listを使って「youtuber」と検索した時の結果を取得します。
【実行環境】
swift2.2
Xcode 7.3
#準備
-
Google Developers Consoleでアカウントの登録、プロジェクトの作成をします。
-
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件取得できます。
◼︎取得部分
SwiftyJSONを使った方がスマートかもしれません。今回はYoutubeListクラスを別で作りたかったので以下のような感じになっています。呼び出す側はcallbackでレスポンスを取得する想定です。(今回はリクエスト部分のみ)
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 動画を再生してみる