A decentralized music tracking and discovery platform built on AT Protocol 馃幍 rocksky.app
spotify atproto lastfm musicbrainz scrobbling listenbrainz
at main 47 lines 1.6 kB view raw
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;