A decentralized music tracking and discovery platform built on AT Protocol 馃幍
rocksky.app
spotify
atproto
lastfm
musicbrainz
scrobbling
listenbrainz
1import { type InferInsertModel, type InferSelectModel, sql } from "drizzle-orm";
2import { integer, sqliteTable, text, index } from "drizzle-orm/sqlite-core";
3
4const tracks = sqliteTable(
5 "tracks",
6 {
7 id: text("id").primaryKey().notNull(),
8 title: text("title").notNull(),
9 artist: text("artist").notNull(),
10 albumArtist: text("album_artist").notNull(),
11 albumArt: text("album_art"),
12 album: text("album").notNull(),
13 trackNumber: integer("track_number"),
14 duration: integer("duration").notNull(),
15 mbId: text("mb_id").unique(),
16 youtubeLink: text("youtube_link").unique(),
17 spotifyLink: text("spotify_link").unique(),
18 appleMusicLink: text("apple_music_link").unique(),
19 tidalLink: text("tidal_link").unique(),
20 discNumber: integer("disc_number"),
21 lyrics: text("lyrics"),
22 composer: text("composer"),
23 genre: text("genre"),
24 label: text("label"),
25 copyrightMessage: text("copyright_message"),
26 uri: text("uri").unique(),
27 cid: text("cid").unique().notNull(),
28 albumUri: text("album_uri"),
29 artistUri: text("artist_uri"),
30 createdAt: integer("created_at", { mode: "timestamp" })
31 .notNull()
32 .default(sql`(unixepoch())`),
33 updatedAt: integer("updated_at", { mode: "timestamp" })
34 .notNull()
35 .default(sql`(unixepoch())`),
36 },
37 (t) => ({
38 idx_title_artist_album_albumartist: index(
39 "idx_title_artist_album_albumartist",
40 ).on(t.title, t.artist, t.album, t.albumArtist),
41 }),
42);
43
44export type SelectTrack = InferSelectModel<typeof tracks>;
45export type InsertTrack = InferInsertModel<typeof tracks>;
46
47export default tracks;