Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix RFC3339 datetimes and ignore empty favourites

Add a SQL migration (20260501000000_fix_datetime_formats.sql) that:
- sets NULL/empty created_at/updated_at to the current time
- converts "YYYY-MM-DD HH:MM:SS" timestamps to RFC3339 so SQLx can
decode DateTime<Utc>
Execute the migration during pool initialization.

Tighten favourites queries to use INNER JOIN and filter out empty-
///string IDs so empty/bogus favourite entries are excluded.

+20 -2
+8
crates/library/migrations/20260501000000_fix_datetime_formats.sql
··· 1 + -- Repair rows where created_at or updated_at is an empty string 2 + UPDATE track SET created_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') WHERE created_at IS NULL OR created_at = ''; 3 + UPDATE track SET updated_at = strftime('%Y-%m-%dT%H:%M:%SZ', 'now') WHERE updated_at IS NULL OR updated_at = ''; 4 + 5 + -- Convert SQLite CURRENT_TIMESTAMP format (YYYY-MM-DD HH:MM:SS, no T separator) to RFC3339 6 + -- SQLx expects RFC3339 when decoding DateTime<Utc> from text 7 + UPDATE track SET created_at = strftime('%Y-%m-%dT%H:%M:%SZ', created_at) WHERE created_at NOT LIKE '%T%'; 8 + UPDATE track SET updated_at = strftime('%Y-%m-%dT%H:%M:%SZ', updated_at) WHERE updated_at NOT LIKE '%T%';
+5
crates/library/src/lib.rs
··· 95 95 Err(_) => println!("is_remote column already exists"), 96 96 } 97 97 98 + pool.execute(include_str!( 99 + "../migrations/20260501000000_fix_datetime_formats.sql" 100 + )) 101 + .await?; 102 + 98 103 sqlx::query("PRAGMA journal_mode=WAL") 99 104 .execute(&pool) 100 105 .await?;
+7 -2
crates/library/src/repo/favourites.rs
··· 43 43 pub async fn all_tracks(pool: Pool<Sqlite>) -> Result<Vec<Track>, sqlx::Error> { 44 44 match sqlx::query_as::<_, Track>( 45 45 r#" 46 - SELECT track.* FROM favourites LEFT JOIN track ON favourites.track_id = track.id WHERE favourites.track_id IS NOT NULL 46 + SELECT track.* FROM favourites 47 + INNER JOIN track ON favourites.track_id = track.id 48 + WHERE favourites.track_id IS NOT NULL AND favourites.track_id != '' 47 49 ORDER BY favourites.created_at DESC 48 50 "#, 49 51 ) ··· 61 63 pub async fn all_albums(pool: Pool<Sqlite>) -> Result<Vec<Album>, sqlx::Error> { 62 64 match sqlx::query_as::<_, Album>( 63 65 r#" 64 - SELECT album.* FROM favourites LEFT JOIN album ON favourites.album_id = album.id WHERE favourites.album_id IS NOT NULL ORDER BY favourites.created_at DESC 66 + SELECT album.* FROM favourites 67 + INNER JOIN album ON favourites.album_id = album.id 68 + WHERE favourites.album_id IS NOT NULL AND favourites.album_id != '' 69 + ORDER BY favourites.created_at DESC 65 70 "#, 66 71 ) 67 72 .fetch_all(&pool)