エイエイレトリック

なぐりがき

Python「ytmusicapi 」で音楽をYoutube Musicにアップロードする

前置き 〜Google Play Musicのエクスポート〜

Google Play Music のサービスの年内終了が決まり*1、今月になって自分のアカウントも音楽を利用できなくなってしまいました。 長年音楽プレイヤーとして愛用していただけに残念です。

実は普段使っているGoogleアカウントと別のアカウントでGoogle Play Musicを使っており、これを機に一旦音楽をエクスポートして、普段使いのアカウントのYoutube Musicに移行することにしました。

家族で共用に使っていたHDDと同期していたこともあったので、エクスポートのデータ量がGoogle photoの無料保存容量を優に超えてました(※Updating Google Photos’ storage policy to build for the future)。 これだけあるとただのバックアップストレージになっている感は否めません。

エクスポートされるデータはmp3とは別に、再生回数などの情報を含んだcsvファイルも含まれていて、分割して出力した場合csvとmp3がランダムに混ざっているので絶妙に扱いにくいです。

f:id:sh111h:20201114145644p:plain
"https://takeout.google.com/settings/takeout" より

なぜか(?)曲ごとにcsvが出力されており、mp3 ファイルと同じフォルダに入っています。

f:id:sh111h:20201114145906p:plain
『バッハの旋律を夜に聴いたせいです。』.csv

分割ファイルごと、mp3ファイルだけ選択して Youtube Musicにアップロードするのも面倒ですし、Youtube Musicにはアップロード用のマネージャーは公開されてなさそうなので、コードを書いて解決します。

Youtube Musicにアップロードする公式な方法

念のため公式方法も記述しておきます。

Google Play Musicから Youtube Music への移行するツールは https://music.youtube.com/transfer に用意されています。

自分の端末からアップロードする場合、ブラウザ上で行うしかないようです。

support.google.com

ytmusicapi でYoutube Musicにアップロードする

アップロードを自動化したくなったので、Youtube Musicのapiを探したところ、「ytmusicapi」がヒットしました。

github.com

ytmusicapi: Unofficial API for YouTube Music

A work-in-progress API that emulates web requests from the YouTube Music web client.

と書いてある通り非公式のAPIなのですが、pip install で簡単にインストールできるpython パッケージなので使うことにしました。

以降、Python 3.7、 Mac OS Catalina で動作確認しています。 2020年11月時点で v0.10.2 は問題なく使えていますが、Youtube Musicの仕様変更によっては使えなくなる可能性があります。

初期設定

前述の通り、pip install ytmusicapi でインストールできます。

初期設定はほぼドキュメントのSetup通り行えばよいです。

headers_auth.json を作成もしくは生成する方法としては、大きく二つあります。

要求ヘッダー (Request Header) の情報を YTMusic.setup() に入力して json を生成するか、manual-file-creationの形式に従って手動でjsonを作成するかです。

Firefoxの場合、Raw (生ヘッダー) 設定をonにしたデータをコピペして使います。 Raw ではないとjsonにフォーマットされてしまい、setup() に入れるとエラーになるので注意してください。

f:id:sh111h:20201114172316j:plain
Firefoxの場合

保存したheader_auth.json の情報を YTMusic クラスで読み込むことで、自分のアカウントのYoutube Musicを操作できるというわけです。

フォルダー下にあるMP3ファイルをアップロードする

YTMusic.upload_song() でパスを指定してアップロードできるので、フォルダー下にある mp3を指定してアップロードするコードをさくっと書きました。 データ数が多いので tqdm を使ってプログレスバーを表示するようにしています。

実際に実行し、その後ライブラリの曲を「最近追加」でソートし、アップロードした曲があることを確認できました。

別途定期実行する仕組みを作れば、自動同期みたいなこともできそうです。

その他の機能

ytmusicapi: Unofficial API for YouTube Music — ytmusicapi 0.10.2 documentation を見る限り曲の検索やプレイリストの作成など、ブラウザ上でできる作業は一通り可能なようです。 データの操作機能がメインで、現時点で音楽の再生はできないです。

音楽データを整理整頓するときに便利なAPI、という立ち位置だと思います。

アップロードさくっとしたいのであれば、ytmusicapi を活用した以下のライブラリもあるので、こちらを使うのもいいかもしれません。

github.com

最後に

Youtube Musicの非公式API「ytmusicapi 」を使ってみたので紹介しました。 設定さえできれば簡単に使えるのでよかったです。

Youtube Musicという名前だけあって、あまり既存の音楽をアップロードして聴くためのサービスではないのかなとも薄々感じてるんですが、アップロードした音楽のアプリでのオフライン再生機能はあるみたいなので、後継サービスとして使ってみようと思います。

なんにせよ、Google Play Musicの終了は音楽がサブスク・動画ありきの時代になったことを実感させられます。

music.youtube.com

(Firefoxスクリーンショットに映りこんだやつ)