0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

iTunesのプレイリストをAndroidへ同期したい。でも削除事故は避けたいので「計画→確認→実行」型CLIを作った

0
Posted at

背景

Windows版iTunesでプレイリストを管理していると、「このプレイリストをAndroidに持っていって聴きたい」という場面がよくあります。iTunesには「プレイリストを書き出し」機能があり .m3u8 を生成できますが、これをそのままAndroidに持っていっても再生できません。

  • 音楽ファイル本体はコピーされない(パス情報だけの書き出し)
  • パスがWindowsの絶対パス(D:\...\iTunes Media\Music\...)なので、Androidでは解決できない

手作業でファイルを探してコピーして…という作業を毎回やるのは現実的ではないので、自動化することにしました。

ただし、自動化する対象が「日常使っている音楽ライブラリ」だったので、ここで一つ迷いが生まれました。

  • 使わなくなった曲ファイルの自動削除(cleanup)
  • 再生回数の自動反映(PlayCount更新)

このあたりを「賢く自動判定して黙って実行する」設計にすると、判定を間違えたときに気づかないまま曲が消えたり、再生回数が変な値になったりするリスクがあります。ライブラリはそれなりの年月をかけて育てたものなので、これは避けたいところでした。

何を作ったか

Node.js製のCLIツールです。

  • iTunesのプレイリスト(.m3u8)を解析
  • 参照されている曲ファイルだけをAndroid転送用フォルダへコピー
  • Android / Rocket Music Playerで解決できる相対パスの .m3u8 を生成
  • Android端末へFTPで転送
  • プレイリストから外れた「孤立ファイル」の検出・削除(cleanup)
  • (オプション)ListenBrainzの再生履歴をもとに、iTunes側のPlayCountを更新する機能

一番重視したのは安全性

このツールのコマンドは、基本的に「計画 → 人間の確認 → 明示的な実行」という3段階に分かれています。

例えば、使われなくなった曲ファイルを消したい場合:

# 1. まず「消える予定のファイル」だけを確認する(何も削除しない)
npm run clean-tracks-plan

# 2. 内容を見て問題なければ、実際に削除する
npm run clean-tracks

plan が付くコマンドはファイルシステムに一切書き込みません。削除を実行する側のコマンドも、削除の直前に「本当にまだそのファイルが存在するか」を再確認してから消します。スキャン結果を鵜呑みにして「消えているはずだから消す」とはしません。

PlayCount(再生回数)の更新はさらに慎重に作ってあり、--expected-count <N>(事前に確認した件数と一致するか)と、APPLY <N> という文字列を実際にタイプする確認ステップの両方を通さないと、iTunes側の値は一切変更されません。

なぜ完全自動化しなかったか

判定ロジックを頑張れば「たぶん大丈夫」な自動削除・自動更新は作れます。ただ、対象が日常使っている音楽ライブラリで、かつ一度消えたファイルや狂った再生回数は簡単には元に戻せません。

このツールでの結論は、「自動化はするが、後戻りしにくい操作の直前には、人間が数字を確認して明示的にGOを出す」という線引きです。これは一般論としての「AIは信用ならない」という話ではなく、単に「取り返しのつく操作」と「取り返しのつきにくい操作」でコストが非対称なので、後者だけ確認を挟んでいる、という設計判断です。

Androidへの転送はFTP

Android側は特定のアプリを必須にしているわけではなく、FTPサーバーとして動作するAndroidアプリを用意してもらう想定です。専用のAndroidアプリは不要です。プレイリストの計画(plan)やローカルコピー(sync)だけならFTP設定なしでも動きます。

ListenBrainzはオプション機能

PlayCount反映のところで少し触れたListenBrainz連携は、あくまでオプション機能です。プレイリストの同期・転送・cleanupといったコア機能はListenBrainzのアカウントなしで完結します。

プライバシー・通信について

このツールが通信するのは以下の2箇所だけです。

  • LAN内のAndroid端末(FTP、転送時のみ)
  • ListenBrainzの公開API(オプション機能を使った場合のみ)

上記以外への通信、アナリティクス、テレメトリの類は一切ありません。ただし「完全オフライン」とまでは言い切れないので、そこは正確に書いておきます。

ダウンロード

現在の位置づけ

  • v0.6.0、pre-release
  • Node.js 20以降が必要
  • ソースzip配布(npm ci が必要。単体exeではありません)
  • Windows版iTunesのローカルライブラリを前提にしています(macOS版Apple Musicは対象外)
  • 実環境(自分のライブラリ・Android端末)で一通りの動作は確認済みですが、他の環境すべてで動くことは検証していません
0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?