このバグに何年も悩まされている気がするけど、ようやくだいぶマシな回避策を見つけられて嬉しい 意外とあんまり解決してない!!!!!!、という話です。どういうバグかというと、
- 一部の MP3 ファイルが最後まで再生できない。5分とかある曲でも、3:01 とか、2:39 あたりで最後まで再生されたことになって (?) 否応なしに次の曲の再生が始まってしまう
- iTunes の再生時間を変更できる設定とはまったく関係なく発生する
- たぶん取り込み時のなんらか処理がぶっ壊れていて、一度そういうものとして取り込まれてしまったファイルは常にこのような挙動でしか再生されない
- 最後まで再生されたことになる地点は、ファイルごとに固有? であり、常にその地点で最後まで再生されたことになる
- 手動でその地点より先までシークすると、そこから先は本当に最後まで再生できる。その地点を通過しようとするときになんかおかしくなる、という雰囲気
- iPhone などにその曲を同期してもこの壊れ方は引き継がれる
- この症状が起こる MP3 ファイルは、iTunes 以外のあらゆるソフトウェアでは普通に最後まで再生できる
- Traktor, rekordbox, VLC Media Player, ffplay (ffmpeg), ブラウザの audio タグとかで試した
- 同じデコーダを使ってるのではないかという気がする QuickTime でも最後まで再生できる!!!
- メタデータとかの雰囲気はあまり関係なさそうで、問題が起こるファイルの ID3 タグを全部剥ぎ取った状態で iTunes に取り込んでみても再現することがあった気がする
- なぜなのかは全然わからないけど、Beatport で買った MP3 ファイルでは高確率で再現する
当然というかなんというか、英語圏でもこのバグは普通に起こっていて、Apple のフォーラムとかで無限に質問されている。"iTunes music cut off" とか、"iTunes song skips too early" とかでググるとこういうのをひたすら見ることができる。
- https://discussions.apple.com/thread/7249051
- https://discussions.apple.com/thread/8306911
- https://discussions.apple.com/thread/8415180
- https://discussions.apple.com/thread/250342050
- https://discussions.apple.com/thread/250342722
- https://discussions.apple.com/thread/250271743
- https://www.reddit.com/r/apple/comments/39s6vn/itunes_cutting_off_recently_added_songs/
これといった解決策はあんまり存在しないと思っていて、ライブラリファイルを再構築したらよいという説もあるけど、それをやると最初に曲をライブラリに追加した日時が全部吹っ飛んでしまうのでなるべくやりたくない。もっとも雑に回避するには、別のところで MP3 ファイルを AAC とかに変換してから取り込むとよいんだけど、本来必要なかった再エンコードで微妙に音質は悪くなるはずだし、MP3 から AAC にメタデータを完璧にマッピングするというのは全然自明なことではないのでとにかくこれもやらなくて済むならそれに越したことはない。
で、無駄に消耗しまくってたんだけど、ついにかなりマシな解決策を見つけた。これ。
このレポジトリに含まれる Fix Truncated Tracks.scpt を、ぶっ壊れた曲を iTunes で選択した状態で実行するとよい (Catalina だと 6 行目を contains "iTunes" then
から contains "Music" then
に書き換える必要がある *1 )。なんでこれで治るのかはさっぱりわからん……。
注意点としては、
- 最初に曲をライブラリに追加した日時 は吹っ飛ぶ
- ライブラリ全部のそれが吹っ飛ぶよりは2億倍マシなので許容できる
- プレイリストに追加されていた情報も吹っ飛んでいる気がする
- 一旦曲を消して、再びライブラリに追加したあとに、もともと追加されていたプレイリストの末尾に入れ直す、ということをやっているように見えるけど、なんかちゃんと動いてない?
何もわからない…… これでずっと治ればいいんだけど。
追記 (2020-01-06)
なんか ↑ の方法で微妙に治ってない気がする!!!!!! で更にまた調べてたけど、ギャップレス再生の時間を決めてるところがぶっ壊れてるのではないかという話をしてる人がいた。疲れる…………
Song playback cut off early - Apple Community
こういう感じだと行ける気がする (本当に最悪)
- MP3 ファイル (α) をどこかにバックアップし、もとのライブラリのディレクトリからはファイルを完全に消す
- バックアップした MP3 ファイルを AIFF にエンコードし (β)、さらにそれに Kid3 とかでメタデータをコピーする
- 消したファイルの曲を Music.app で再生し、曲が見つかりません的なダイアログから 再配置 → 2. で生成した AIFF ファイル (β) を指定し、MP3 (α) が AIFF (β) に入れ替わった的な状態を作り出す
- バックアップしておいた MP3 ファイル (α) について、さらにバックアップを作り、Kid3 で以下のような作業を施す:
- AIFF ファイル (β) を削除し、また削除したファイルの曲を再生、再配置ダイアログで MP3 ファイル (γ) を指定する
- おわり
- MP3 ファイルは (α) から (γ) に入れ替わっているが、Kid3 は自分が保持したいメタデータのタグをたぶん完全に取り扱えているので、事実上ファイルのメタデータタグの欠損は起こっていない
- 最初から最後まで一貫して、ライブラリ上から曲を削除はしていない (実体であるファイルを消しているだけ) なので、Persistent ID や Date Added のような Music.app 外から操作しようがない Music.app 内のメタデータや、プレイリストへの追加状態も完全に保持される
- MP3 ファイル (α) と (γ) の音声ストリーム部分はまったく同一であるはずなので、音質の劣化も発生しないはず
めっちゃ頑張れば自動化できる気がするけど API 用意されてる AppleScript だけじゃなくて UI 操作自動化的なやつをやらないといけない気がする?それともこういうのとシェルスクリプトをうまく組み合わせたらなんとかなるのか……?
macos - Changing the path to a file in iTunes with AppleScript - Stack Overflow
あとここまでやっても iOS デバイスに同期して反映されるのかは結構微妙っぽくて、一旦同期済みのファイルをふっとばしてから再同期させたりするひつようがある……?
*1:scpt ファイルは微妙にプレーンテキストじゃないので p-r とか送ってもなという感じがする、、