Loupedeck live買いました! whooooooo!!
ところで私は普段、音楽を聞くときYouTube musicを使っています。YouTube Musicってブラウザから操作するのめちゃくちゃめんどくさいですよね。
今回YouTube musicライフを快適にするために、Loupedeck liveを使ってYouTube musicの操作を行えるようにしたので紹介します。
OSはwindows 11です。
以下で紹介する情報の中には古いバージョン特有のものもあるかと思うので、最新情報を確認するのがいいと思います。
この記事の内容でできるようになること
- 基本的な再生、停止、スキップ、シャッフル、ループの切り替えなど
- 10秒スキップ、10秒バック
- 特定の曲をワンプッシュで再生
- 特定のプレイリストの曲をワンプッシュで再生
- 特定のプレイリストをランダムにワンプッシュで再生
YouTube Music Desktop Appをインストール
まずYouTube Music Desktop Appをインストールしましょう。ブラウザのYouTube Musicを使うよりこれを入れたほうが色々できるようになります。
以下のリンクにアクセス
https://github.com/ytmdesktop/ytmdesktop
Available forというところのBinariesを押す。
インストールしたいバージョンのインストーラーをAssetsからダウンロードする。記事公開時点での安定版はv1.13.0でした。再生やスキップなどの基本的な機能はこれで問題ないですが、特定の曲や特定のプレイリストをLoupedeckから再生したい場合は、プレリリース版のv1.14.2をインストールする必要がありました。
あとは適当にインストールする。
インストールが終わったらログインとかは適当にやり、設定画面を開く
連携のリモコンサーバーをONにする。
これでYouTube Music Desktop Appの導入は完了です。
Loupedeckにプラグイン導入
Loupedeckのアプリを開き、Marketplaceを開きます。そしてyoutubeと入力して、プラグインからYoutube Music Desktopというのをインストールします。
ステータスが準備完了になってればOKです。準備完了にならない場合はYouTube Music Desktop Appがインストールされていること、設定の確認、再起動などしてみてください。
この段階でできること
あとは別のプラグインなどと同じく、Loupedeckのボタンやつまみに割り当てれば使えるようになります。
具体的にできることが知りたい場合は以下を参照。
https://help.xeroxdev.de/en/loupedeck/ytmd/home
一応最低限のことはこれでできるようになるんですが、特定の曲を再生したり特定のプレイリストを再生したりといったことはできないんですよね。ちょっと機能は少なめ。spotifyとかはLoupedeckの公式対応だから、それと比べるとちょっと劣るかも(使ったことないけど)。
10秒スキップ、10秒バックしたい
YouTube Music Desktop AppのAPIでは10秒スキップ、10秒バックができます。ただしプラグインだとなんでか10秒スキップ、10秒バックができないんですよね。これは初音ミクの消失を聞くときに高確率で欲しくなる機能なので欲しいです。
そんなわけで、APIを直接呼び出してできるようにしました。例えば10秒バックは以下のようなコードを適当な場所に配置して
import requests
import json
requests.post('http://localhost:9863/query', data=json.dumps({"command":"player-rewind"}))
Loupedeckの「実行」を選んで以下のように書けばOKです。pythonのあとに||が必要なことに注意。
python|| <ファイルへの絶対パス>
プラグインにもとからある機能と比べると若干レスポンスが悪くはなりますが、まあしょうがないです。私はつまみにアサインしました。余分に回せばたくさんスキップしたり戻ったりすることもできます。実行時にウィンドウが表示されるのが嫌な場合はpythonをpythonwに書き換えるといいと思います。
プラグインでサポートされていないけどYouTube Music Desktop AppのAPIでサポートされていることは同じように実行できると思います。
特定の曲、特定のプレイリストを再生するボタンを作る
ボタン一発で特定のプレイリストの再生を開始する、というやつを作りたいです。
YouTube Music Desktop AppはURIでコントロールすることができます。具体的には以下の画像参照(上で貼ったgithubリンクのwikiにある)。
ここで <Video_Id>や<Playlist_Id>はyoutube musicをブラウザで開いたときURLに出てくるやつです。
例えばURLがこんな感じなら
bj4nuPCRDxg がVideo_Idで、PL_0A0t0-Y0ANo9NZV4LRSUzIus8JkmHEK がPlaylist_Idになります。つまりこの曲を再生したいなら「ytmd://play/bj4nuPCRDxg」、この曲をこのプレイリストで再生したいなら「ytmd://play/bj4nuPCRDxg/PL_0A0t0-Y0ANo9NZV4LRSUzIus8JkmHEK」にブラウザからアクセスすればできます。
Loupedeckで実行するには、「ウェブページ」を選んでURIを入れて実行するようにすればいいです。
ちなみにv1.13.0ではURIで実行することができなかったので、これをやりたい場合はv1.14.2をインストールする必要があります。
プレイリストの曲をランダムに再生する
上記の方法ではプレイリストを再生するときに特定の曲も指定しなければならず、必ず同じ曲から再生されることになってしまいます。この記事公開時点ではランダムな曲からプレイリストを再生する方法はありませんでした。
ランダムな曲からプレイリストの再生を開始する一番簡単な方法はマクロでやることだと思います。つまり「固定された曲からプレイリスト再生」->「シャッフル」->「次の曲に行く」というマクロを組めばいいです。ただやってみた感じ個人的になんか微妙だったので、ちゃんとランダムな曲から再生するやつを作りました。 以下の公開します。ただ将来アプリが更新されたら機能追加される可能性も高いので、真似する前にYouTube Music Desktop Appの更新情報を確認することを推奨します。
プレイリストからランダムに曲を再生するコードです。ただしこの例ではvideo_ids_in_playlist.jsonに予めplaylist idとプレイリスト内のすべての曲のvideo idのリストが格納されているものとします。コマンドライン引数で与えられたプレイリストの名前をkeyにplaylist idとvideo idのリストを取ってきて、ランダムに再生を開始しています。
import sys
import os
import json
import random
import webbrowser
#ディレクトリは適当に設定してね
with open(os.path.dirname(sys.argv[0]) + '/json/video_ids_in_playlist.json', 'r') as f:
data = json.load(f)
playlist_id = data[sys.argv[1]][0]
now_video_id = data[sys.argv[1]][1][random.randrange(len(data[sys.argv[1]][1]))]
uri = f"ytmd://play/{now_video_id}/{playlist_id}"
webbrowser.open(uri)
ランダムに再生開始の曲が決定され、そのあとはプレイリストを順番に再生していきます。もしランダムに再生したい場合はLoupedeckのマクロでシャッフルを入れるか、コード内でシャッフルを入れるかすればできます。
あとは以下の感じでやる。
python|| <ファイルの絶対パス> playlist_name
jsonファイルのkeyになるplaylist_nameを指定する必要があります。
プレイリスト情報の更新
上記の方法でランダムにシャッフルすることができるんですが、予めプレイリストに含まれる曲のvideo idのリストを持っておく必要があります。記事更新時点ではYouTube Music Desktop Appの機能を使ってvideo idのリストを取得することはできませんでした。もちろん手動で作成することはできますが、曲数が多いとかなりめんどくさく、かつプレイリストに曲を追加したら更新しないといけません(しなくてもその曲からスタートする確率が0になるだけなので、大した問題でもないが)。
そこでYouTube Data APIを使ってあるプレイリストに含まれている曲のvideo idリストを取得するプログラムを作りました。以下のコードを動かすには予めYouTube Data APIの設定を行いAPI keyを取得しておく必要があるので注意してください。YouTube Data APIの設定とかは別のサイトとか参照。
from apiclient.discovery import build
import os
import sys
import json
# 更新対象のプレイリストIDのリスト。これはブラウザでYoutube musicにアクセスしてリンクから確認してね。
playlist_ids = {"プレイリストの名前1": "playlist_id1", "プレイリストの名前2", "playlist_id2", ...}
def get_video_id_in_playlist(youtube, playlist_id) -> list:
video_id_list = []
playlistitems_list_request = youtube.playlistItems().list(playlistId=playlist_id, part="snippet", maxResults=50)
while playlistitems_list_request:
playlistitems_list_response = playlistitems_list_request.execute()
for playlist_item in playlistitems_list_response["items"]:
video_id_list.append(playlist_item["snippet"]["resourceId"]["videoId"])
playlistitems_list_request = youtube.playlistItems().list_next(
playlistitems_list_request, playlistitems_list_response)
return video_id_list
def main():
API_KEY = "<あなたのAPIキー>"
youtube = build('youtube', 'v3', developerKey=API_KEY)
result = {}
for key, playlist_id in playlist_ids.items():
r = [playlist_id]
r.append(get_video_id_in_playlist(youtube, playlist_id))
result[key] = r
#ディレクトリは適当に設定してね
with open(os.path.dirname(sys.argv[0]) + '/json/video_ids_in_playlist.json', 'w') as f:
json.dump(result, f)
if __name__ == "__main__":
main()
上記のプログラムを実行する際、対象のプレイリストが公開あるいは限定公開になっていることが必要なので注意してください。これで生成したファイルが、ひとつ上に書いたプレイリストのランダム再生に使うファイルになっています。
このプログラムもLoupedeckに登録することで、ワンプッシュで実行できるようにしました。曲を追加したときとかに1回ポチってやればOKです。
まとめ。
最終的にこんな感じになりました! 右の縦3列はプレイリスト再生用、また追加予定。画面を開かなくてもYouTube Musicの操作ができるというのはものすごく便利です! 最強!
あとはライブラリの画面に一発アクセスできるようになれれば超便利そうなんですが、できるのか不明です。更新求む!
コメント