LoginSignup
5
0

More than 5 years have passed since last update.

Amazon Dash ボタンで Get Wild を流す by Google Play Music(Chromebookで失敗編)

Posted at

このエントリは、#ssmjp参加者 Advent Calendar 18日目(といいつつ遅れに遅れた)です。

TL;DR

  • Chromebook上のUbuntuとAmazon Dash ボタンでGoogle Play Music上のGet Wild流そうとしたけど
  • Chromebook上のサウンドデバイスをpythonから触る方法がわからず途中で断念したぞ

いきさつ

あっやばい GetWild駆動開発 流行ってる

あっやばい Amazon Dash ボタン 出た

これはボタンでGet Wild流すしか無いぜヒャッハー

そりゃ出た瞬間やる方いらっしゃるよね

結局クソ悩んだけどやっぱりGet Wild忘れられない… ← このエントリ

動作環境

  • Chromebook Flip C100PA
  • crouton導入、Ubuntu trusty
  • node.js v7.2.1 (npm install n 後、n stable で導入)
  • npm install dasher
  • python & pip
  • pip install python-vlc gmusicapi flask
  • Amazon Dash ボタン
  • Amazon Dash ボタンを設定できるスマホ等の端末

Chromebookへの環境の導入

croutonもtrusty上でのnode.js stable導入もpip導入もそんなに難しくないから割愛!
詰まるところは以下。
- libvlc-dev, vlcをapt-getしておかないとpython-vlc導入できない
- libpcap-devをapt-getしておかないとdasherのビルドでコケる

Amazon Dash ボタンの検出とGETリクエスト発行まで

Amazon Dash ボタンをHookするためのサーバアプリ導入

node.jsに、dasherという、node-dash-buttonのラッパーがあります。
これ導入すればOKです。

git clone https://github.com/maddox/dasher.git
cd dasher
npm install

Amazon Dash ボタンの設定

AmazonアプリでAmazon Dash ボタンを設定して、商品選択前に×押してキャンセル。
これはDashボタンを導入しているエントリをご覧ください。

dasher付属のスクリプトでDashボタン検出

./script/find_button を実行してください。MACアドレスを特定できます。
ManufacturerがAmazonか、Unknownのどちらかがボタンです。
Chromebookだとarpで検出されるようなので、ズラズラ出てくるのを何回かDashボタンを押して特定してください。

config設定

./config/config.json に、以下を設定します。
addressは先程検出したMACアドレスです。
後ほど、localhostの3000番ポートにAPIを立てるので、そこを指定します。

{"buttons":[
  {
    "name": "getwildandtough",
    "address": "xx:xx:xx:xx:xx:xx",
    "interface": "wlan0",
    "timeout": "60000",
    "url": "http://127.0.0.1:3000/getwild",
    "method": "GET",
    "json": true
  }
]}

dasher起動

sudo npm run start で起動します。
ここでDashボタン押しちゃうとエラー吐いちゃうのでこのまま。

REST風API作成とGoogle Play Musicへのリクエスト、音の再生

Google Play Musicは2016/12/25現在、公式APIがありません。
ということで、非公式APIを使います。python実装のようなので、
あんまり触ってないpythonで実装します。

  • REST風API作成
    • Flaskで実装します。GETだけしか準備してません。エラー処理もしてません。
  • Google Play Musicへのリクエスト
  • python-vlcでの音の再生
    • 音再生しようとしました…サウンドデバイスの設定方法が分かりません…
    • audio_output_device_enum したいけど、libvlc-dev 2.2.0より古い…
      • croutonからやり直すのつらく諦めの境地である

結局、以下のようになりました。
どなたかvlcで音を出す方法を教えてください。非同期でやりたいです。
APIの返事返さないといけないので…

あと言い訳ですが、dict型で返ってきたjsonをいきなりobject_hookでattribute形式にする方法が分かりませんでした。
正直dictのアクセスはjson触ってると書きづらくて泣きそうになりますのでなんとかしたい。
今回は一度strに戻して、再度dictにしています。

# -*- coding: utf-8 -*-
from flask import Flask, jsonify, abort, make_response
from gmusicapi import Mobileclient
import json
import vlc

# JSON attribute
class D(dict):
    __getattr__ = dict.__getitem__ 

# flask init
api = Flask(__name__)

@api.route('/getwild', methods=['GET'])
def getwild():
    # gmusic client
    mobilecli = Mobileclient()
    mobilecli.login('ログインユーザのgmailアドレス', 'パスワード', Mobileclient.FROM_MAC_ADDRESS)

    results = mobilecli.search('Get Wild',1)
    resultjson = json.dumps(results)
    resultjson = json.loads(resultjson, object_hook=D)

    songurl = mobilecli.get_stream_url(resultjson.song_hits[0].track.storeId)
    print(songurl)

    # vlc...I do not know how to detect audio devices...
    p = vlc.MediaPlayer(songurl)
    p.play() # do not play "Get Wild"... 

    result = {
        "result":True
    }
    return make_response(jsonify(result))

if __name__ == '__main__':
    api.run(host='127.0.0.1', port=3000)

まとめ

全然わからんぜ…古いライブラリだとできないのはキツいぜ…
ただ、非公式Google Play Musicクライアントが思いのほか使えたので、
これはこれでかなり捗るのではと思っています。
あと「Get Wild」でサーチしたら、一発目で当然のようにTMNが当たるので、さすがとしか言いようがありませんでしたな。
上のコードだと当たった一発目しか持ってきてないので、TMNじゃなかったらそのGet Wildが流れるんだぜ…

やり始めたらPython分からなくても、node.jsもあんまり触ったことなくても、6時間くらいでAPI立ててGoogle Play Musicにアクセス出来てDashボタンもHookできるので、すごく良い世の中になったなあと思いました。(調査3時間くらい、実装1時間くらい、出来なくて再調査1時間くらい、このエントリ1時間くらい…)
遅くなってホント申し訳ありませんでした。しかもできんかった…orz

5
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0