More than 1 year has passed since last update.

はじめに

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")
            }
        }
    }
}

結果はこんな感じで返ってきます。

Model.swift
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 動画を再生してみる