見出し画像

iTunes(Music)のライブラリを外付けSSDに出した(mac向け)

何をしたのか

タイトルのとおりで、いままではローカルにおいていた iTunes(Music) のライブラリを外付けSSDに移動したんですが、ぱぱっとぐぐった情報だけではいろいろ足りなくて悪戦苦闘のすえ解決したのでメモ。なお途中で、「名前にスペースを含むフォルダやファイルを find した結果をループさせて、ファイルだけを特定の場所にコピーするシェルスクリプト」を書いたんですが、結果的には必要ありませんでした。

なぜライブラリ移行が必要だったか

先代の MacBook Pro (Early 2015) はPCDJ配信にはスペックがだいぶ足りず、かつ何よりいよいよ老朽化してバッテリがふくらんでしまっており、これを使い続けるのは流石にそろそろまずいか……となったので MacBook Air (M1, 2020) を買ったんですよ。ただ、ちょっとひよってストレージの小さいやつ(256 GB)にしたんですね、まぁ足りるだろうと。ところが、私の iTunes(Music)ライブラリはどうも 100 GB 前後あってそれだけで半分近く占めており、ほかのものをいろいろやりくりしてみても残 10 GB くらいまできてしまい、いよいよまずいなと。そしてちょうど世間はステイホーム、GWということで、時間あるしちょっとやろうかとなったわけです。

やったこと(設定変更)

流石に生兵法は怖いのでぐぐりました。
Macでミュージックファイルの保存場所を変更する

これは iTunes(Music) の設定を変更するんですが、これどうもあくまで設定変更以後にライブラリに追加したものの居場所の設定であって、いまローカルにおいてあるものの場所がいい感じに変わってくれるわけではないようでした。したがってこれは今回やりたいことじゃないです。

やったこと(ライブラリ指定起動)

「ミュージック」アプリのライブラリ保存場所を外付けHDDに移行する方法

これはずばりでしょう、と思ってやってみたんですよ。option押しながら「ミュージック」起動。しかし、手順の途中の

「ライブラリを選択」を選んで、さきほど外付けハードディスクにコピーした「Music」フォルダを指定します。

のところで「フォルダを指定」ができない。そこで仕方なく、そのあたりのフォルダにあった “iTunes Library.itl” を指定してみました。よくわからずにこれを指定したのが実は悪夢(すぐ終わったけど)の始まりでした。

“iTunes Library.itl” を指定して iTunes(Music) を起動してみたところ……!? ライブラリの内容が1年とちょっと巻き戻っていました。この1年買った音源とかあとジャンルをつけなおした(多分数千曲)作業とかがすべて「なかったこと」になっており絶句。ただ、itlファイルの日付を確認すると “2020/3/17” 。確かにその頃の内容っぽくはある。さきほどのライブラリを指定する起動方法で指定できそうなものは他に見当たらず(このときは)、相変わらずフォルダを指定することもできません。ただ、ライブラリのフォルダの中にこの1年で新たに入手したものと思われる音源のファイルは全部残っているようでした。

ということは。

ジャンルつけなおしは全部あきらめるにしても、1年で買った音源が失われるのは回避できそうなので、こいつらを改めてライブラリに取り込んだらそこまでは復帰できるはず。ということで試しに1曲取り込んでみました。が、itlファイルは更新されず、当然ライブラリにもいまとりこんだつもりの内容は反映されず。

どうしたものか……。

やったこと(音源ファィルの保全)

ここからは iTunes(Music) ではなく突然シェルスクリプトの話です。

取り込んだ内容を反映させる方法は一旦後回しにして、とりあえずいま手元に残っている1年分の音源を、がちゃがちゃいじってるうちに全部吹っ飛びましたなんてならないように確実な形でどこかにバックアップしたい、なんならフォルダの形でなくて音源ファイルだけ確保したいということで、それらのファイルを深いフォルダの中から抽出しようと考えました。

で、とりあえず音源が入ってるフォルダの中から日付が新しいものを外付けにコピー。どうもフォルダの日付だけが新しくて中身が古いものも含まれている様子でしたが、数も数だし(3,500件あまり)選別してられないのでとりあえず全部ドカンと。で、「退避」フォルダの奥深くにある音源のファイルを、上の “extracted” フォルダの中にコピーしたい。そこで、extractor.sh をつくることにしました。

画像1

第4階層には mp3 か m4a ファイルしかないし、それ以外の階層にはフォルダしかないという構造なんですが、第1階層の位置から find でファイルを見つけて、その結果のループを cp すればええかな、とぱぱっとぐぐってそれらしいものを書きました。こういうのですね。

shell でディレクトリ内のファイルに対してループ処理

が、ダメでした。もちろんいきなり cp を試さずに find の結果を echo したりしてたんですが、どうにも出力の意味がわからない……で、しばらく悩んで気がつきました。

フォルダ名にもファイル名にもスペースが入ってる

これはなかなか厄介なことになりました。find の結果は

./a b/c d/e f.mp3
./g h/i j/k l.m4a
…

みたいになっているので、何も考えずに組むと

echo ./a b/c d/e f.mp3
echo ./g h/i j/k l.m4a
…

となります。結果として

./a
b/c
d/e
f.mp3
./g
h/i
j/k
l.m4a
…

となってしまいます。

echo “./a b/c d/e f.mp3”
echo “./g h/i j/k l.m4a”
…

とか、“” で囲ったりスペースに \ つけたりしたらよいのではといろいろ試行錯誤したんですが結局ダメで、

echo “./a b/c d/e f.mp3
./g h/i j/k l.m4a
…
z.mp3”

みたいになっちゃったんです。まぁ私のやり方が悪かったのかもしれませんが。それで結局いきついたのは、環境変数IFSを一時的に変更する方法でした。

【シェルスクリプト】IFSで区切り文字(デリミタ)を変更する方法

これで find の出力の中のスペースを echo や cp に回したときに意味を持たせずに、改行だけ「区切り」の意味として扱ってくれるようにしたところ、ようやくやりたい処理を実装することができました。恥ずかしながら初めて知りましたね、IFS。
以下実際に使ったスクリプト。mp3となってるところはあとでm4aでも回しました。

#!/bin/bash

IFS0=$IFS
IFS1=$'\n'
IFS=$IFS1

for file in `find . -name "*.mp3" -maxdepth 4 -type f`; do
   echo cp\ \""${file}"\"\ ./extracted/
   cp "${file}" ./extracted/
done

IFS=$IFS0

やったこと(itlではない別のライブラリファイル(musiclibrary)の発見と利用)

音源は保全できたのでもう少しいろいろさがしたり試したりしてみよう……ん? この “Music Library.musiclibrary” とかいうくどい名前のファイルは何……? しかも日付が昨日? これか? とりあえずoption押しながら起動でこれを指定……このファイルをライブラリは現在に戻ってきましたヤッター! しかしこれだと、このファイルはローカルにあったのでそもそもの当初の目的「ライブラリを外付けに移行する」は達成できていません。そこで、この musiclibrary ファイルと、音源等ファイルを外付けSSDのてきとうな場所にコピーして、一式全部そろっている状態をつくったうえで、option+起動で外付けにあるほうの musiclibrary ファイルを指定したらどうなる……?

\できた/

sh なんか書かずに最初からこうすべきだったようです。混乱した原因はまず私が iTunes(Music) のフォルダ・ファイル構成を理解していなかったことで、そのために無関係なitlファイルを触ってしまったのが悲劇の始まりでした。ちなみにこの itl ファイルの日付、確か去年 Mojave から Catalina に upgrade して iTunes から Music に移行した時期にちょうど当たるので、そのときのものが一応(?)残されてたのかもしれないですね。

iTunes から Music への移行のときは特に問題なかったので、Catalina 以降を使ってる人は itl ファイルは無視して musiclibrary ファイルを見ようね、ということでよさそうです。rekordbox の iTunes ライブラリのところも musiclibrary のほうを見るように改修されてるんでしょうね。一方 Serato は当時 itl しか見てなかったので移行後ライブラリの変更が反映されなくなった、と。ちょうど WeGO4 を mng して rekordbox の PERFORMANCE モードも使えるようになったしもうこっちでいいか、と乗り換えてしまいました。

iPhone との同期

これは軽微ですがまだ問題を抱えてます。

画像2

最初はぐぐってもよくわからないエラーが出て同期自体ができなくなってしまっていたんですが、この「ミュージックを同期」のチェックボックスをOFFにして「適用」、ONにして「適用」とすることで一応同期自体はできるようになったようです。ただ、同じエラーが出続けているのでちょっと億劫ですね。

※追記(2021/5/2)

新しく追加した曲は同期されますが、新しくつくったプレイリストは同期されないようです。原因も不明。少し面倒ではあるものの、この方法を利用すればなんとかなりそう。

意外と知らないiTunesのプレイリストが表示されない時の解決法

これで追加したもの「だけ」を先に同期して、その後それ以外を改めて同期し直すことで目的の状態を作ることはできそうです。

PCDJは?

まだ試してません。rekordbox を最近は使ってますが、iTunes ライブラリは常に新しいほうを見ていたし、Music アプリ内で音源ファイルの場所を確認する限り外付けのほうを指しているので、そこを見に行くだけで特に問題ないよね? はと思ってるんですが……次の出番までに試しておこうと思います。

いじょうです

……ということで長々と書きましたがこれでようやく MBA のストレージにも余裕ができたし、ひととおりやりたいことはできたっぽいです。あとは古すぎて povo に入れない iPhone を新しくするだけかな。同期するときのエラーがワンチャン解消しないかなと思ってはいますが MBA 側の問題っぽいしアカンかなぁ。

いじょうです。


この記事が気に入ったらサポートをしてみませんか?