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

#はじめに
swiftでYoutubeのAPI使って動画情報を取得しようってやつです。
今回は[Search: list](https://developers.google.com/youtube/v3/docs/search/list?hl=ja#header)を使って「youtuber」と検索した時の結果を取得します。

【実行環境】
swift2.2
Xcode 7.3


#準備
1. [Google Developers Console](https://console.developers.google.com/)でアカウントの登録、プロジェクトの作成をします。

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

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


#実装
色々と方法はあると思いますが、今回は[Alamofire](https://github.com/Alamofire/Alamofire)を使って取得してみました。
ざっくり以下のような感じです。

◼︎リクエストURL

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

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

参考
[YouTube Data API の概要](https://developers.google.com/youtube/v3/getting-started?hl=ja#Sample_Partial_Requests)

◼︎取得部分
[SwiftyJSON](https://github.com/SwiftyJSON/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")
            }
        }
    }
}

```

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

```json

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の値"」のようにパラメータに付与してリクエストすれば続きから取得できます。

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

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

#おわりに
◼︎再生
再生方法もいくつかあると思いますが、端末のplayerを立ち上がらせずに再生できる[YTPlayerView](https://github.com/youtube/youtube-ios-player-helper)が便利そうです。

詳しくはクラスメソッド様の下記リンクをみていただければ...
[[Swift] YouTube-Player-iOS-Helper を使って YouTube 動画を再生してみる](https://github.com/youtube/youtube-ios-player-helper)