February 14, 2013

FuelPHPでSoundCloud APIを使ってお気に入りとプレイリスト(Sets)を同期するタスクを作ってみた

もはや自己満足の内容になります。。。
このタスクで何がしたかったかは、最後に書きます。

まず、事前準備として、access tokenをserializeして保存します。

http://madroom-project.blogspot.jp/2013/02/fuelphpsoundcloud.html
$access_token = $client->accessToken($code);
です。仮に、"app/tmp/soundcloud_access_token"として保存したとします。

このファイルを用いて、以下のようなタスクで同期できます。
* $client_id、$client_secret、[id or username]、[playlist_id]は実際の値に置換する必要があります。
<?php

namespace Fuel\Tasks;

class Soundcloud
{

    private static $client_id = 'xxxxxxxxxx';
    private static $client_secret = 'yyyyyyyyyy';

    public function __construct()
    {
        // https://github.com/mptre/php-soundcloud からDLしてvendorに配置
        require_once APPPATH.'vendor'.DS.'soundcloud'.DS.'Services'.DS.'Soundcloud.php';
    }

    public static function run()
    {
        //TODO:
        exit();
    }

    public static function sync()
    {
        $client = new \Services_Soundcloud(
            static::$client_id,
            static::$client_secret);

        // serializeしたaccess_tokenを配列に復元
        $access_token = unserialize(file_get_contents(APPPATH.'tmp'.DS.'soundcloud_access_token'));

        // access_tokenをリフレッシュしてserializeして保存
        $new_access_token = $client->accessTokenRefresh($access_token['refresh_token']);
        file_put_contents(APPPATH.'tmp'.DS.'soundcloud_access_token', serialize($new_access_token));

        // 指定したidあるいはusernameのお気に入りトラックを取得
        $url = 'http://api.soundcloud.com/users/[id or username]/favorites.json?client_id='.static::$client_id;
        $favorite_tracks = json_decode(file_get_contents($url), true);

        // ID一覧を作成
        $favorite_ids = \Arr::pluck($favorite_tracks, 'id');

        // プレイリストを更新(delete/insert式)
        $client->updatePlaylist([playlist_id], $favorite_ids);

        exit();
    }
}

/* End of file tasks/soundcloud.php */
お気に入りトラックのアカウントとプレイリストのアカウントは異なっていてOKです。プレイリストのアカウントは、soundcloud_access_tokenに対するアカウントである必要があります。

このタスクで何がしたかったかというと
* AndroidのSoundCloudアプリでお気に入りを登録。
* 定期的にプレイリストと同期。
* STRATUS 2 ( http://stratus.sc/ ) でプレイリストをサイトに表示。
という自動更新でした。

* 曲数が増えた時の挙動は未確認です。
* tokenのリフレッシュにより、ずっとほったらかしで動くかは未確認です。

以下で使っています。(表示されたりされなかったりで不安定ですが。。。)
http://madroom.net/
まだ作り始めですが、コンテンツはのんびりと適当に"遊びながら"詰めていこうと思います。

そのうちSTRATUS 2がお気に入りリストの埋め込みにも対応したら。。。
それはそれでハッピーですね。(2013/02/14現在、非対応っぽいです。)

P.S.
SoundCloudにしろLast.fmにしろ、APIは充実しているので、やろうと思えばいろいろ出来そうです。仕事で携わる可能性はかなり低そうですが。

No comments:

Post a Comment