Compare commits

..

3 Commits

Author SHA1 Message Date
Connor Johnstone 11a8d3a88e fleshed out subsonic more 2026-04-01 19:36:24 -04:00
Connor Johnstone ed8175b1d0 Unified the track logic. Seems to work much better 2026-03-26 17:38:16 -04:00
Connor Johnstone 4f4e6e794a added the cleanup, which was missing. also artist lookup first rather than search on import 2026-03-25 14:04:24 -04:00
3 changed files with 15 additions and 3 deletions
+7 -2
View File
@@ -65,9 +65,10 @@ async fn process_file(
// Upsert artist (use album_artist if available, fall back to artist)
let artist_name = meta.album_artist.as_deref().or(meta.artist.as_deref());
let artist_mbid = meta.musicbrainz_artist_id.as_deref();
let artist_id = match artist_name {
Some(name) if !name.is_empty() => {
Some(queries::artists::upsert(conn, name, None).await?.id)
Some(queries::artists::upsert(conn, name, artist_mbid).await?.id)
}
_ => None,
};
@@ -106,7 +107,11 @@ async fn process_file(
bitrate: Set(meta.bitrate),
file_size: Set(scanned.file_size),
fingerprint: NotSet,
musicbrainz_id: Set(meta.musicbrainz_recording_id),
musicbrainz_id: if meta.musicbrainz_recording_id.is_some() {
Set(meta.musicbrainz_recording_id)
} else {
NotSet // Don't overwrite existing DB MBID when file tag is missing
},
artist_id: Set(artist_id),
album_id: Set(album_id),
file_mtime: Set(Some(scanned.mtime)),
+5
View File
@@ -23,6 +23,7 @@ pub struct MusicMetadata {
pub codec: Option<String>,
pub bitrate: Option<i32>,
pub musicbrainz_recording_id: Option<String>,
pub musicbrainz_artist_id: Option<String>,
}
/// Map lofty FileType to a human-readable codec string.
@@ -79,6 +80,10 @@ pub fn extract_metadata(path: &Path) -> IndexResult<MusicMetadata> {
meta.musicbrainz_recording_id = tag
.get_string(&lofty::tag::ItemKey::MusicBrainzRecordingId)
.map(|s| s.to_string());
meta.musicbrainz_artist_id = tag
.get_string(&lofty::tag::ItemKey::MusicBrainzArtistId)
.map(|s| s.to_string());
}
Ok(meta)
+3 -1
View File
@@ -58,10 +58,12 @@ async fn test_scan_indexes_music_files() {
create_test_mp3(dir.path(), "song1.mp3", "Time", "Pink Floyd", "DSOTM");
create_test_mp3(dir.path(), "song2.mp3", "Money", "Pink Floyd", "DSOTM");
// Use concurrency=1 to avoid race in album upsert when two files
// share the same artist+album and are processed simultaneously.
let config = ScanConfig {
root: dir.path().to_owned(),
dry_run: false,
concurrency: 2,
concurrency: 1,
};
let stats = run_scan(db.conn(), &config).await.unwrap();