···11+create table tracks (
22+ id TEXT PRIMARY KEY,
33+ filesize INTEGER NOT NULL, -- u64 (or i64 for js)
44+ duration_s REAL NOT NULL, -- f64
55+ bitrate REAL NOT NULL, -- f64
66+ sample_rate REAL NOT NULL, -- f64
77+ file TEXT NOT NULL, -- f64
88+ modified_at INTEGER NOT NULL, -- u64 ms since unix epoch
99+ added_at INTEGER NOT NULL, -- u64 ms since unix epoch
1010+ name TEXT NOT NULL,
1111+ artist TEXT NOT NULL,
1212+ imported_from TEXT NULL,
1313+ original_id TEXT NULL, -- Imported ID, like iTunes Persistent ID
1414+ composer TEXT NULL,
1515+ sort_name TEXT NULL,
1616+ sort_artist TEXT NULL,
1717+ sort_composer TEXT NULL,
1818+ genre TEXT NULL,
1919+ rating_pct INTEGER NULL, -- from 0 to 100
2020+ year INTEGER NULL, -- i64
2121+ bpm REAL NULL, -- f64
2222+ comments TEXT NULL,
2323+ grouping TEXT NULL,
2424+ liked BOOLEAN NULL,
2525+ disliked BOOLEAN NULL,
2626+ disabled BOOLEAN NULL,
2727+ compilation BOOLEAN NULL,
2828+ album_name TEXT NULL,
2929+ album_artist TEXT NULL,
3030+ sort_album_name TEXT NULL,
3131+ sort_album_artist TEXT NULL,
3232+ track_num INTEGER NULL, -- u32
3333+ track_count INTEGER NULL, -- u32
3434+ disc_num INTEGER NULL, -- u32
3535+ disc_count INTEGER NULL, -- u32
3636+ imported_at INTEGER NULL,
3737+ play_count INTEGER NULL, -- u32
3838+ skip_count INTEGER NULL, -- u32
3939+ volume INTEGER NULL -- from -100 to 100
4040+);
4141+4242+CREATE TABLE plays (
4343+ id TEXT PRIMARY KEY,
4444+ track_id TEXT NOT NULL REFERENCES tracks(id),
4545+ date INTEGER NULL,
4646+ date_range_to INTEGER NULL,
4747+ CHECK ((date IS NULL) != (date_range_to IS NULL))
4848+);
4949+5050+CREATE TABLE skips (
5151+ id TEXT PRIMARY KEY,
5252+ track_id TEXt NOT NULL REFERENCES tracks(id),
5353+ date INTEGER NULL,
5454+ date_range_to INTEGER NULL,
5555+ CHECK ((date IS NULL) != (date_range_to IS NULL))
5656+);
5757+5858+CREATE TABLE track_lists (
5959+ id TEXT PRIMARY KEY,
6060+ type TEXT NOT NULL CHECK (type IN ('playlist', 'folder', 'special')),
6161+ parent_id TEXT NULL REFERENCES track_lists(id),
6262+ position INTEGER NULL,
6363+ name TEXT NOT NULL,
6464+ description TEXT NOT NULL,
6565+ liked BOOLEAN NOT NULL DEFAULT 0,
6666+ disliked BOOLEAN NOT NULL DEFAULT 0,
6767+ imported_from TEXT NULL, -- For example "itunes"
6868+ original_id TEXT NULL, -- For example iTunes Persistent ID
6969+ imported_at INTEGER NULL,
7070+ created_at INTEGER NOT NULL
7171+);
7272+7373+CREATE TABLE playlist_tracks (
7474+ track_list_id TEXT NOT NULL REFERENCES track_lists(id),
7575+ track_id TEXT NOT NULL REFERENCES tracks(id),
7676+ position INTEGER NOT NULL,
7777+ PRIMARY KEY (track_list_id, position)
7878+);
7979+8080+CREATE TABLE play_times (
8181+ id TEXT PRIMARY KEY,
8282+ track_id TEXT NOT NULL REFERENCES tracks(id),
8383+ started_at INTEGER NOT NULL,
8484+ duration INTEGER NOT NULL,
8585+ -- v1 playtime has two issues:
8686+ -- - some durations are double counted (or triple, etc.)
8787+ -- - timestamps aren't updated after pausing
8888+ is_v1 BOOLEAN NOT NULL DEFAULT 0
8989+);