-- name: UpsertTrack :one -- file_path is the canonical identity for library scan; mbid is secondary. INSERT INTO tracks ( title, album_id, artist_id, track_number, disc_number, duration_ms, file_path, file_size, file_format, bitrate, mbid, genre ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) ON CONFLICT (file_path) DO UPDATE SET title = EXCLUDED.title, album_id = EXCLUDED.album_id, artist_id = EXCLUDED.artist_id, track_number = EXCLUDED.track_number, disc_number = EXCLUDED.disc_number, duration_ms = EXCLUDED.duration_ms, file_size = EXCLUDED.file_size, file_format = EXCLUDED.file_format, bitrate = EXCLUDED.bitrate, mbid = EXCLUDED.mbid, genre = EXCLUDED.genre, updated_at = now() RETURNING *; -- name: GetTrackByID :one SELECT * FROM tracks WHERE id = $1; -- name: GetTrackByPath :one SELECT * FROM tracks WHERE file_path = $1; -- name: ListTracksByAlbum :many SELECT * FROM tracks WHERE album_id = $1 ORDER BY disc_number NULLS LAST, track_number NULLS LAST; -- name: CountTracksByAlbum :one SELECT count(*) FROM tracks WHERE album_id = $1; -- name: SearchTracks :many SELECT * FROM tracks WHERE title ILIKE '%' || $1 || '%' ORDER BY title LIMIT $2 OFFSET $3; -- name: CountTracksMatching :one SELECT COUNT(*) FROM tracks WHERE title ILIKE '%' || $1::text || '%'; -- name: ListTracksByAlbumForUser :many -- Same as ListTracksByAlbum but excludes tracks the user has quarantined. -- $1 = album_id, $2 = user_id. SELECT * FROM tracks WHERE album_id = $1 AND NOT EXISTS ( SELECT 1 FROM lidarr_quarantine q WHERE q.user_id = $2 AND q.track_id = tracks.id ) ORDER BY disc_number NULLS LAST, track_number NULLS LAST; -- name: SearchTracksForUser :many -- $1 = title query, $2 = user_id, $3 = limit, $4 = offset. SELECT * FROM tracks WHERE title ILIKE '%' || $1 || '%' AND NOT EXISTS ( SELECT 1 FROM lidarr_quarantine q WHERE q.user_id = $2 AND q.track_id = tracks.id ) ORDER BY title LIMIT $3 OFFSET $4; -- name: CountTracksMatchingForUser :one -- $1 = title query, $2 = user_id. SELECT COUNT(*) FROM tracks WHERE title ILIKE '%' || $1::text || '%' AND NOT EXISTS ( SELECT 1 FROM lidarr_quarantine q WHERE q.user_id = $2 AND q.track_id = tracks.id ); -- name: ListArtistTracksForUser :many -- M6a: every track for the artist across their albums, with album_title -- and artist_name joined. Honors per-user lidarr_quarantine. Used by -- /api/artists/{id}/tracks for the artist-card play affordance, which -- shuffles client-side. Ordering matches album/track natural order so -- the shuffle has a deterministic input. SELECT sqlc.embed(t), albums.title AS album_title, artists.name AS artist_name FROM tracks t JOIN albums ON albums.id = t.album_id JOIN artists ON artists.id = t.artist_id WHERE t.artist_id = $1 AND NOT EXISTS ( SELECT 1 FROM lidarr_quarantine q WHERE q.user_id = $2 AND q.track_id = t.id ) ORDER BY albums.release_date NULLS LAST, albums.sort_title, t.disc_number NULLS FIRST, t.track_number NULLS FIRST, t.id;