Vimeo SDKを使い動画を取得する

2020-11-12

CM制作など動画を扱っているクライアント様から「Vimeoに登録している約4,000件の動画を自社のデータベースに取り込み、自社サイトで検索させたい」というご相談が御座いました。BtoB取引が主で、営業マンが営業先で参考としてお見せする動画を探したり、自社サイトにアクセスした一般ユーザーが予算を条件として検索するなどの機能が必要とのことでした。

現在は動画クリエイターがVimeoに納品し、顧客との紐付けや公開設定、タグ管理などはSalesforceで行うため、検索用のデータは手作業で登録していました。これをVimeo及びSalesforceから必要なデータをAPIでデータベースに取り込み、一列のレコードとするまでを自動化することで効率化しました。

今回はこのViemoからの動画の取り込みについて書きたいと思います。

Vimeo SDKのダウンロード

https://developer.vimeo.com/api/libraries
プラットフォームはPHPなので、該当するSDKをダウンロードし設置し、読み込みます。

require 'vimeo_sdk/autoload.php';
use Vimeo\Vimeo;

トークンの取得

$client = new Vimeo(client_id, client_secret, access_token);

https://developer.vimeo.com/apps
client_id, client_secret, access_tokenはVimeoでAPPを作成した際に発行されます。

Vimeo動画を取得する

$result = $client->request('/me/videos');

とりあえずオプション無しで動画を取得すると、以下のような値が戻ってきます。

Array
(
    [body] => Array
        (
            [total] => 5997
            [page] => 
            [per_page] => 25
            [paging] => Array
                (
                    [next] => /me/videos?page=2
                    [previous] => 
                    [first] => /me/videos?page=1
                    [last] => /me/videos?page=240
                )

            [data] => Array
                (
                    [0] => Array
                        (
                            [uri] => /videos/***************
                            [name] => ***********************
                            [description] => 
                            [type] => video
                            [link] => https://vimeo.com/*********
                            [duration] => 543
                            [width] => 1920
                            [language] => 
                            [height] => 1080

ここで注目するのはpageです。全動画を一気に取得することは出来ず、25件づつ分割されています。

ページを指定してVimeo動画を取得する

$result = $client->request('/me/videos', array('page' => 1, 'per_page' => 5, 'sort'=>'date', 'direction'=>'asc' ));

動画を日付昇順に5件づつに分割し、1ページ目を取得します。CRONで5分毎にpageを進めながら全動画を取得することにしました。

特定のフォルダーに入っている動画を取得する

$result = $client->request('/me/folders/{フォルダーID}/videos', array('page' => 1, 'per_page' => 5, 'sort'=>'date', 'direction'=>'asc' ));

/manage/folders/12345
フォルダーIDはVimeo管理パネルで動画フォルダーへ移動した際のURL末尾の数字がフォルダーのIDになります。これを設定することでVimeoフォルダー内の動画のみを取得することが出来ます。

なお、フォルダーIDはフォルダー一覧から得られます。

$result = $client->request('/me/folders', array());

実行結果

  [0]=>
  array(10) {
    ["created_time"]=>
    string(25) "2020-06-08T01:35:09+00:00"
    ["modified_time"]=>
    string(25) "2020-10-05T03:28:30+00:00"
    ["last_user_action_event_date"]=>
    string(25) "2020-10-05T03:28:30+00:00"
    ["name"]=>
    string(1) "FolderName"
    ["privacy"]=>
    array(1) {
      ["view"]=>
      string(6) "nobody"
    }
    ["resource_key"]=>
    string(40) "***************************"
    ["uri"]=>
    string(32) "/users/FolderID/projects/2024842"
    ["link"]=>
    NULL

その他、プロジェクト一覧やアルバム一覧なども取得可能ですが、ここでは省略いたします。

動画の取得自体は特に難しくはなく、それらをデータベースにインサート、次回は更新があった場合のみアップデートという自動処理を日に数回走らせました。詳細は省きますが、SalesforceからもAPIで動画管理データをSOQLで取得しデータベースにインサートし、VimeoのデータとJoinして利用するようにしました。