SSブログ

iTunesからMusicBeeへの乗り換え その3くらい(まとめ) [IT]

  iTunesからMusicBeeに乗り換えたので、Android端末と同期するためのiSyncrと、Google Play Music(長いので以下GPM)のMusicManager(長いので以下GPMMM)のiTunesプレイリスト同期機能が使えなくなってしまったので、これを解決すべくWSL(Windows Subsystem for Linux)を利用して以下のスクリプトを作った。のでまとめ。


 MusicBeeの独自プレイリスト形式であるmbpというバイナリファイルがある。これはバイナリファイルだがテキストが埋め込まれているので、強引にテキストファイルとして読み込んでm3uプレイリスト形式に変換する。


  1.で作成したm3uプレイリストを、Android(Linux)用にパスの区切り文字を「\」から「/」にして、プレイリストが格納されているフォルダから相対パスで指定したUTF-8 改行コードLFのm3uファイルを作成する。 


  ffprobe(ffmpeg付属)で音楽ファイルのタグ(メタデータ)を抽出してGPM用のプレイリストcsv形式1行で出力する。


  mp3ファイルの場合、ffprobeで日本語文字化けが起こる(標準出力に出力されたときにはすでに壊れて修復不可能)ので、PythonのeyeD3というライブラリを使用して、mp3のメタデータの文字コードを変換してからメタデータをGPM用のプレイリストcsv形式1行で出力する。(ここで公開されている"id3conv.py"を改造)


  3.と4.を使用して、m3uプレイリストに書かれている音楽ファイルのタグ(メタデータ)を抽出してGPM用のプレイリストcsvファイルに変換する。

6.gmusic-playlist/common.py, gmusic-playlist/preference.py

  gmusicapi(Google Play Music非公式api )を使用してGPM用プレイリストcsvファイルをアップロード・ダウンロードできるgmusic-playlistというツールがあるのだが、これが1つのcsvファイルをアップするたびにパスワードを聞いてくるのでoauthで認証するように改造。 

  5.で生成するGPM用csvプレイリストのメタデータのフィールド(カラム)を多くしているのでその部分も変更している。GPMに渡すメタデータが多いほど正確にGPM上でプレイリストが生成されるため。


  rsyncを使用し、2.で作成したプレイリストに書いてある音楽ファイルだけをSRCフォルダからDSTフォルダにコピーする。書いていないファイルは削除する。sshとファイル名にあるように、sshで暗号化してrsyncサーバーとの通信が可能。

  1.2.7.がNASとAndroid端末と同期するためのスクリプトで、3.-6.がGoogle Play Musicのプレイリストを同期するためのスクリプトである。

  Android端末では/Playlistフォルダにプレイリストが、/Musicフォルダ以下に音楽ファイルが格納されているとすると、m3uファイルは

 ../Music/アーティスト名/…1.flac

 ../Music/アーティスト名/…2.flac

  という書式にする必要がある。そういう書式にするために2.を使う。2.で作成したプレイリストファイルを使って7.でAndroid端末に転送するのだが、単純にファイルのリストを渡しただけではコピーはできない。いや、コピーはできるのだが、指定していないファイルを削除することができず、ゴミファイルが溜まっていく。それを回避するためには、rsyncの--include-fromオプションで残すファイルを指定する必要がある。

  その書式が

  /foo/bar/hoge.piyoというファイルを残すのであれば、

  /foo/

  /foo/bar/

  /foo/bar/hoge.piyo

  とファイルの途中のパスを全部書き出さないとならないので7.のスクリプトでそういった処理をしている。

  GPM用のプレイリストの処理だが、困ったことに4.はPython3でしか動かないし、6.はPython2でしか動かない。それで最初はpyenvという環境切り替えツールを使用して6.のフォルダで使用するPythonのバージョンを"$ pyenv local 2.x.x"でPython2に指定して、5.内でもpyenvを使用してPython3に切り替えて4.を呼び出していた。

  WSLのLinux内で動かす分にはそれでよかったのだが、WindowsのGUIで指定したファイルをバッチファイルにドラッグアンドドロップして変換したいので、バッチファイル(コマンドプロンプト)のwslコマンドでWindowsから呼び出そうとすると、python(及びpyenv)なんてコマンドはねえよと返される。

  Pythonをaptでインストールしたときは問題ないので、pyenvが問題(多分環境変数の問題。WSLのターミナルを起動してログインした時とwslコマンドで呼び出した時ではおそらく読み込まれる設定ファイルが違う)ということでpyenvの使用は諦めて、4.と6.を実行する際にchmodで実行権限を与えて"$ ./bar.py"の様に実行するのではなく、"$ python3 bar.py"などとpyスクリプトで使用したいバージョンでPython自体のコマンドを変えて実行することで解決した。

  こちらのほうがよほどシンプルだが、pythonの共存と切り替えはpyenvが便利だよというネットの情報にはまり込んでしまった。Linux内だけで使用するならそうなんだろうけど、WLSを通して使うということの情報が見当たらなかったからだな。

  こうして作成した1.2.5.6.をWinsdowsのバッチファイル中のwslコマンドで呼び出すことで、MusicBeeのプレイリストをいじったときに、バッチファイルをダブルクリックだったりプレイリストファイルをドラッグアンドドロップするだけで、Android端末用のプレイリストの作製とGPM用プレイリストcsvの作製およびGPMへのアップができるようになった。

  5.で作ったGPM用プレイリストcsvは6.を使うよりこの野良Chromeアドオンでアップロードするのが楽じゃないかな。

余談

  WSL用ユーティリティのwsluにWindows形式とLinux形式のパスの文字列を変換するwslpathというコマンドがある(ここや ここらへん参照)のだが、なるべくWSL依存にはしたくなかったのでWindows形式のパスはsedを用いてLinux形式のパスに変換するようにしている。なので、素のLinux(wsluが無いLinux)で音楽ファイルとプレイリストm3uファイルを管理している場合でも1.-7.は動くはずである(試してないので「はず」止まりだが)。

全角チルダ・波ダッシュ問題(参考1 参考2

  Windowsでは全角チルダは波ダッシュに置換されてしまうが、Linuxでは区別されるので問題が生じることがあった。

  gmusic-playlist/ImportList.py に改造の余地があるな。csvファイル1つごとにGPMにログインログアウトするので時間がかかる。ログインしてから一気に複数のプレイリストをアップしたほうが高速になる。

まあ動くから、モチベが低い。

  google-music-scripsはどういうわけかアップロードできないバグが有る。そこでgmusicapiを使用してアップロードするpy(音楽アップロード用プレイリストcsvアップロード用)を書いた。(これを改造)


nice!(1)  コメント(0) 
共通テーマ:日記・雑感

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

MusicBeeからAndroidへのプ..|- ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。