Uncategorized

Github Copilotでアルバム画像の設定ツールをVive codingした

まとめ iTunes(「ミュージック」アプリ)の「アートワークを取得」で設定したアルバム画像は独自のデータベースで管理されていて音楽ファイル自体のタグとしては埋め込まれていない。このため音楽サーバなどに転送して別のVLC等の別のアプリで表示するとアルバム画像が認識されない(埋め込まれていないので当然)。 ミュージックアプリのライブラリでは、音楽ファイルはパスやその他の情報とともにMusic Libraryの中(xmlファイルで出力できる)のPERSISTENT IDというフィールドで一意に管理される。PERSISTENT IDは64ビット符号付き整数(NSNumber)のようだが、xmlに出力された際は16進数でエンコードされている。 肝心のアートワークの場所は ~/Library/Containers/com.apple.AMPArtworkAgent/Data/Documents/ のsqliteデータベースに保存されていて、そこからアルバム画像ファイル名の先頭hash値が検索可能である。※ちなみにhash文字列の後ろにあるsuffixのルールはよくわからなかったが、複数設定したときの何かなのだろう、きっと。 なお、「アートワークを取得」で自動で設定したアートワークでなく自分でダウンロードした画像ファイルを手動で設定した場合には音楽ファイルへの埋め込みとして(も?)処理されるようだった。 以上から、以下のようなアプリを作成した①ライブラリの情報から音楽ファイルのパスとPERSISTENT IDを取得②PERSISTENT IDからアートワークファイルのパスを検索③②を①に埋め込みアートワークとして設定④もしすでに埋め込まれていれば何もしない(オプションで強制上書きは可能) と、ここまでは調べて決めたのであとはきっとGithub Copilot氏が作ってくれるだろ…ということで今までやってなかったがVibe Codingをいうものを試してみむとするなりしてみました。 できたもの Githubで公開してみました。READMEも含めて基本的に全てGithub Copilotが生成した。https://github.com/hkurosawa/iTunesArtworkFetcher

16進数のPERSISTENT_IDをNSNumber相当の整数型に変換するPythonスクリプト

ミュージックアプリ(iTunes)のライブラリ書き出しで出力したxmlファイルにあるPERSISTENT_IDは16進数に変換されていて、sqliteの中に保存されているPERSISTENT_IDと対応させるには変換することが必要。 調べるとPERSISTENT_IDはNSNumber型で、どうもNSNumber=int64で変換すれば良いらしい

iTunesで自動取得したアートワークを取り出したい

やりたいこと iTunes(ミュージックアプリ)で「アートワークを取得」した音楽ファイルは、外部のサービスに持っていくとアートワークが設定されていないことがある。これはミュージックアプリが独自の形式でアートワークを管理しているからで、mp3のファイル自体に埋め込むようにしたい。 外部からダウンロードした画像をアートワークに設定した場合にはmp3のタグとして設定される仕様のようなので、すでに自動取得されているアートワークはとりあえずたとえば「アルバム名.jpg」のような形で保存したい。(とりあえず判別がつけばなんでも良い) アートワーク情報の保存場所 アートワークの情報は下記のパスにある~/Library/Containers/com.apple.AMPArtworkAgent/Data/Documents 上記の中に、・画像ファイル自体のフォルダ:artwork/がある。 ただしartwork/配下にはjpgファイルが直接置かれているが、ファイル名がhashっぽいものになっているので直接判別はできなそう。ここの対応付の解読がポイントになりそう。 その他、・データベースっぽいもの:artworkd.sqliteがこのフォルダにはあるので、このあたりに画像ファイルの情報が入っていると推測する。 その他元になりそうな情報としては、ミュージックアプリから「ファイル>ライブラリ>ライブラリを書き出し…」したxmlファイルが使えそう。※どうもswiftのフレームワークでライブラリファイルを直接読むこともできそうだがいったん書き出したxmlファイルで良しとする。 なんとなく上記の情報から取り出しはできそうな気がしてきた(続く)

Raspiで音楽サーバ:3.5mmジャックの有効化

家に眠っていたRaspberry piを音楽サーバとして復活させる際、LibreELEC (12)をインストールしたのだが、3.5mmジャックが出力先で選択できないことに気づいた。 インストールメディア(microSDカード)のconfig.txtの末尾にコメントアウトされている行があり、3.5mmジャックを有効化するにはそれをコメントアウトせよ、と記載があった。 いちどraspberry piをシャットダウンしてmicroSDカードをMacに接続、該当のファイル(SDカードのルートにある)を編集して再度raspberry piを起動、音声の出力先で無事に選択できるようになった。 なお、上記のconfig.txtは起動後のシステムからは/flash/配下でマウントされているらしかった。

Raspberry piで音楽サーバの構築

iTunesライブラリが壊れた 家のルータのNAS機能を使ったストレージ上に置いていたiTunesライブラリが壊れた(これまでも頻繁にディスクエラーが発生していたが、本格的に壊れた)のを機に、死蔵してあったRaspberry pi(3)を使って音楽サーバを構築してみることにした。 元々AYI Voice Kit用に持っていたRaspi3だが、分解。16GBのmicroSDカードも再利用することにした。下記の公式サイトからPi Imagerをダウンロードして、LibreELECをインストール(よくわからなかったがとりあえず一番メジャーっぽいものを入れた) https://www.raspberrypi.com/software SDカードを差し込んでTVのHDMIに接続するとすぐに起動した。 音楽ファイルは元々のルーターに接続していたUSBメモリを再利用。すぐに起動したので、LibreELECのGUIメニューから音楽ソースにUSBのディレクトリを選択してライブラリの再構築をするとすぐに利用できた。90GB程度で10分ぐらいかかったかもしれない。 音量が小さい 家にあるスピーカー(JBL Authentics 200)の3.5mmジャックに接続してみるが、音が小さい。検索するとLibreELECにはamixerというCUIのツールはプリインストールされてるようで、これでマスタボリュームを設定しようとするがなんだかよくわからない。alsamixerというGUI(といってもターミナル上のもの)を使ったほうが良さそうだが、これはAddonをLibreELECのGUI上からインストールする必要がありそうだった。 さっそくLibreELECのAddonのインストール画面から、Multimedia ToolsというAddonを選択してインストール。中にalsamixerが含まれているので、インストールが完了したらターミナルにsshログインして起動して設定。3.5mm出力を選択すると、たしかに出力が90%ぐらいになっていたので100%に設定(なんでかはよくわからない)。再度スピーカーに設定すると音量が改善していた。が、いまいち大きくないので、RaspiにDLNA経由でiPhoneから接続してAirPlay接続したほうがいまのところ使い勝手が良さそう。 今後、DACをRaspberry piに増設して本格的な音楽サーバ化していってみることにする。

SSL証明書をLet’s Encryptに変更した

前のポストで書いたようにACMで証明書をAWSの外にエクスポートするとお金がかかる(FQDNなら$15だけどwildcardだと$149とかかかってつらい)ことに後から気づいたので、速攻で(と言っても気づいたのは1か月後とかだった)キャンセルの申請をしつつLet’s Encryptに変更しました。 certbotというツールでほぼ自動で証明書を取得することができ、やり方はセットアップも含めて下記でそのまま動いた(nginx+pip)。といってもツールの途中で、証明書の取得までだけやるかどうかが選べるのでそうして(そうすると「ここに保存してあるよ」って教えてくれる)nginxのconfの差し替えは手動で行った。 https://certbot.eff.org/instructions?ws=nginx&os=pip # systemctl restart nginxで証明書が切り替わったことを確認してこの件一件落着(たぶん)。ちゃんと調べてなかったとはいえ、AWSの課金恐ろしい…

AWS Certificate Managerをよく分かってなくて予定外の出費が発生した

ふとクレカの請求を確認してみると、AWSから身に覚えのない多額の請求が来ていることに気づく。調べてみるとAWS Certificate Managerが数万円請求されている?? ACMって無料じゃないの??ということで慌てて調べてみる https://dev.classmethod.jp/articles/amazon-certificate-manager-export-certificate-file >ACM を利用してエクスポート可能なパブリック証明書を作成すると、追加料金がかかります。完全修飾ドメイン名ごとに 15 USD、ワイルドカードドメイン名ごとに 149 USD かかります。証明書の有効期間中に一度だけお支払いいただき、証明書の更新時にのみ再度課金されます。詳細については、「AWS Certificate Manager サービスの料金」ページにアクセスしてください。 とのこと。確かに深く考えずにエクスポートしたいじゃんと思って、エクスポートを請求していたよ…さらにこれも深く考えずにワイルドカードにしてしまっていた…高い授業料と思うしかなさそうだ しかし料金が相変わらずめちゃくちゃ分かりづらいのはどうにかならないのか…