
🐾 iTunesの再生回数データから、自分がいつ何にハマっていたかを解析してみようとした話
自分はサブスクに入っておらず、気に入った曲があるとCDを買って、同じ曲をひたすら繰り返し聞く性分だ。おかげでPC内のiTunesライブラリには、何年にもわたって聞き続けてきた曲の再生回数がそれなりに蓄積されているはずだった。「このデータを解析すれば、自分が何年ごろに何にハマっていたかの変遷が見えるのでは」と思い立ち、iTunesライブラリのデータを掘り起こしてみることにした。結論から言うと、当初想定していた「年ごとの再生回数推移」はそのままでは作れないことが分かり、途中で設計を見直す羽目になった。今回はその過程をまとめる。
iTunesライブラリのデータ形式を調べる
iTunesのライブラリフォルダ(C:\Users\<ユーザー名>\Music\iTunes\iTunes配下)を覗くと、iTunes Library.itlというファイルが本体のデータベースだと分かった。ただしこれは独自のバイナリ形式で、標準的なライブラリで直接パースするのは現実的ではない。
つまずき:.itlファイルは中身が読めない
.itlをテキストエディタで開いてみても、当然ながらバイナリの羅列で何も読み取れなかった。調べたところ、iTunes(Musicアプリ)には「ライブラリをXML形式で書き出す」機能があり、こちらは人間にも読める形式でエクスポートできるらしい。iTunesのメニューから「ファイル」→「ライブラリ」→「ライブラリを書き出す」を選ぶと、iTunes Music Library.xmlという形式でライブラリ全体を出力できる。今回はこちらを解析対象にすることにした。
書き出したXML(plist形式)をPythonで読み込む
書き出されたXMLファイルの中身を見ると、実体はApple独自の「plist(Property List)」形式だった。Pythonの標準ライブラリplistlibでそのまま読み込める。
import plistlib
with open("iTunes Music Library.xml", "rb") as f:
library = plistlib.load(f)
tracks = library["Tracks"]
print(f"曲数: {len(tracks)}")
sample = next(iter(tracks.values()))
print(sample.keys())
Tracksの中に、曲ごとの情報が辞書形式で入っている。Name(曲名)、Artist(アーティスト)、Play Count(累計再生回数)、Date Added(ライブラリに追加した日時)といったキーが並んでいるのを見て、「これで年ごとの再生推移も作れそうだ」と思ったのが、この時点での見立てだった。
「年ごとの再生回数」を出そうとして壁にぶつかった
いざ年別の再生回数推移を作ろうとしたところで、根本的な問題に気づいた。iTunesが保持しているのはPlay Count(曲を追加してから今までの累計再生回数)とPlay Date UTC(直近に再生した日時)だけで、「いつ何回再生したか」という時系列のログはそもそも記録されていなかった。
つまずき:iTunesは再生履歴の時系列ログを保存していない
Last.fmのようなスクロビリングサービスを使っていれば、1回ごとの再生に日時が付いた履歴データが蓄積されているのだが、自分はそういったサービスを使ってこなかったため、そもそも解析に使えるデータが存在しないという結論に至った。「年ごとの再生回数推移」という当初の目標は、少なくともiTunes単体のデータでは実現不可能だと分かった。ここは正直、思っていたより早い段階でのつまずきだった。
代替案として「追加日×累計再生回数」の組み合わせに切り替える
年別の再生ログが取れない以上、別の切り口で近似することにした。Date Added(曲をライブラリに追加した年)を「その曲を聞き始めた時期」の近似指標とし、Play Count(累計再生回数)を「どれだけハマったか」の重みとして扱う設計に変更した。
from collections import defaultdict
yearly_data = defaultdict(lambda: {"tracks": 0, "total_plays": 0})
for track in tracks.values():
date_added = track.get("Date Added")
play_count = track.get("Play Count", 0)
if date_added is None:
continue
year = date_added.year
yearly_data[year]["tracks"] += 1
yearly_data[year]["total_plays"] += play_count
for year in sorted(yearly_data):
d = yearly_data[year]
print(f"{year}年: 追加曲数={d['tracks']}, 累計再生回数={d['total_plays']}")
「その年に聞き始めて、今までにどれだけ再生されたか」という切り口であれば、正確な年次推移ではないにせよ、自分がどの時期にどんな曲を集中的に買って聞き込んでいたかの傾向は見えてきそうだった。
実際に自分のライブラリで集計・グラフ化した結果は、この記事に追って差し込む予定だ。
考察:サブスクとは違う形でデータに性分が出る
一連の作業を通して感じたのは、自分のようにサブスクに入らずCDを買って同じ曲を聞き続けるスタイルだからこそ、Play Countという単純な累計値が「ハマり具合」の重みとして意味を持つのだろうということだ。サブスクで次々と新しい曲を試し聞きするスタイルだと、1曲あたりの再生回数は分散しやすく、逆に「年ごとの追加曲数×累計再生回数」を見ても、それほど際立った偏りは出ないかもしれない。CDを買うという行為自体に「これは繰り返し聞く価値があると判断した」というフィルタが一段挟まっている分、iTunesの累計再生回数にもその判断がそのまま反映されやすいのだと思う。
一方で、「いつ何回聞いたか」という真の時系列データが手元に無いというのは、今回はっきり自覚した弱点でもあった。今後もし本格的に自分の音楽遍歴を追いたくなったら、Last.fmのようなスクロビリングサービスを導入して、これから先の再生履歴だけでも記録していく方が確実そうだ。
まとめ
- iTunesの
.itlファイルはバイナリ形式で直接解析できないため、「ライブラリを書き出す」機能でXML(plist)化してから解析する - Pythonの
plistlibで書き出したXMLをそのまま読み込め、Play Count・Date Added・Play Date UTCといった情報が曲ごとに取得できる - iTunesは累計再生回数と直近再生日しか保持しておらず、「年ごとの再生回数推移」という時系列ログはそもそも存在しない
- 代わりに「曲を追加した年」×「累計再生回数」の組み合わせで、聞き込んでいた時期の近似的な傾向を見る設計に切り替えた
- サブスクに入らずCDを買って聞き続けるスタイルだからこそ、累計再生回数という単純な指標が意味を持ちやすいのではという気づきがあった
今回はスクリプトの設計までで一区切りとし、実際に自分のライブラリで集計・グラフ化した結果は追って差し込む予定だ。