rinsukiのかんがえたさいきょうの音楽プレーヤー
課題
iTunes / Music.app のライブラリがつらい
Big Sur beta に持ってったらなんか壊れた
直ったけど
まあこれはbetaに持ってった俺が悪い
AMPArtworkAgentって何???少なくともキャッシュがないなら生成しなおしてよ
謎のバイナリフォーマットやめて
そもそも現状の 作曲者/アーティスト/作詞家/アルバム/コメント ぐらいしか自由記述欄がないライブラリで高度な絞り込みをするのは難しい
苦しんでいる例
ソリューション
音楽ファイルに対して [Tag: [Tag]]の Key-Value Store を付ける
Tag には 親として複数の Tag を持てるようにする
例えば new generations の親として [渋谷凛, 島村卯月, 本田未央] を持つなど
でも暗黙的に 別の key を付けたい時もあるんだよな
この場合だと new generations が使われるのは間違いなくアイマス(デレマス)文脈なので 自動的に コンテンツ: アイドルマスター シンデレラガールズ を付けるなど
どうしたもんかね
tag に kvs を付ける?
parents は nil Tag ということにして kvs にすればよさそう
これらの tag をクエリで絞ってプレイリストを作れるようにする
バックエンドはSQLiteかなんか
少なくともプレーヤーごと OSS にしたい
プレーヤーがOSの更新に合わせて取り残されたからライブラリも開けねえ!ということにはしたくない
iPhone に持っていくために iTunes Library.xml エクスポートがあるといいかな
code:MusicFile.swift
struct MusicFile {
var url: URL
var title: String
}
code:Tag.swift
struct Tag {
var id: UUID
var name: String
var kvs: [Tag?: Tag] // nil means parents }
code:schema.sql
CREATE TABLE songs (id UUID PRIMARY KEY, url TEXT NOT NULL, title TEXT NOT NULL);
CREATE TABLE songs_kvs(
song_id UUID NOT NULL, key_tag_id UUID NOT NULL, value_tag_id UUID NOT NULL,
FOREIGN KEY (song_id) REFERENCES songs(id),
FOREIGN KEY (key_tag_id) REFERENCES tags(id),
FOREIGN KEY (value_tag_id) REFERENCES tags(id),
);
CREATE TABLE tags(id UUID PRIMARY KEY, name TEXT NOT NULL); -- あとで考える: name は unique でいい?
CREATE TABLE tag_kvs(key_tag_id UUID NULL, value_tag_id UUID NOT NULL);
やりたいクエリ例 (これはSQLもどき)
シンデレラガールズの曲
SELECT * FROM songs WHERE kvs[series] IN (アイドルマスターシンデレラガールズ)
例えばこういうレコードがひっかかる
song の kvs に kvs[歌手]=Triad_Primus
Triad_Primus に kvs として [nil: 渋谷凛, nil: 北条加蓮, nil: 神谷奈緒]
渋谷凛 に kvs として [series: アイドルマスターシンデレラガールズ]
渋谷凛がソロで歌った曲
SELECT * FROM songs WHERE kvs[歌手] == 渋谷凛
kvs[歌手]に渋谷凛しかいない曲を見る
歌がない曲
SELECT * FROM songs WHERE kvs[歌手] == ()
空集合とイコールかどうか?というので判定する
kz が何らかの形で関わった曲
SELECT * FROM songs WHERE kvs[*] IN (kz)
kvs[*] でとりあえずどこかの曲に
Nation Blue をうまく扱う
SELECT * FROM songs WHERE kvs[曲] == Nation Blue
これで全バージョンの Nation Blue がひっかかる
SELECT * FROM songs WHERE kvs[曲] == Nation Blue AND kvs[歌手] == ()
Nation Blue のカラオケ版がひっかかる
SELECT * FROM songs WHERE kvs[曲] == Nation Blue AND kvs[歌手] IN 橘ありす
Nation Blue の U149版 (渋谷凛 & 橘ありす) がひっかかる
remixどうするの?問題
SELECT * FROM songs WHERE kvs[曲] == Virtual to Live
これで Virtual to Live (kz remix) はひっかかるべきか?
SELECT * FROM songs WHERE kvs[remixer] == () AND kvs[曲] == Virtual to Live
これでオリジナル版だけを出す?