Add defensible orphaned audio detection

This commit is contained in:
Philip Guzman
2026-07-02 16:17:11 -07:00
parent 4d04939846
commit 22c4f58646
9 changed files with 133 additions and 11 deletions
+37 -5
View File
@@ -143,10 +143,24 @@ def diagnostic_details(library: Library, limit: int = DETAIL_LIMIT) -> dict:
database_filename_counts = Counter(
normalize(track.filename) for track in missing_database_tracks
)
referenced_names = {reference.filename for reference in library.references}
referenced_names = {
normalize(reference.filename) for reference in library.references
}
database_names = {normalize(track.filename) for track in database_tracks}
unused_tracks = [
track for track in library.tracks if track.filename not in referenced_names
track
for track in library.tracks
if normalize(track.filename) not in referenced_names
]
orphan_candidates = (
[
track
for track in unused_tracks
if normalize(track.filename) not in database_names
]
if library.database
else None
)
return {
"database_missing_tracks": {
@@ -246,10 +260,10 @@ def diagnostic_details(library: Library, limit: int = DETAIL_LIMIT) -> dict:
],
},
"unused_tracks": {
"title": "Unused tracks",
"title": "Not in crates",
"summary": (
"These scanned files were not referenced by any loaded crate. "
"That does not mean they should be deleted."
"These files are not in any loaded crate, but may still be "
"normal tracks in Serato's main library."
),
"total": len(unused_tracks),
"items": [
@@ -257,6 +271,24 @@ def diagnostic_details(library: Library, limit: int = DETAIL_LIMIT) -> dict:
for track in unused_tracks[:limit]
],
},
"orphan_candidates": {
"title": "Possible orphan files",
"summary": (
"These files were found in the music folder but not by filename "
"in loaded crates or Serato's database. Review only; this is "
"never an automatic deletion recommendation."
),
"total": len(orphan_candidates) if orphan_candidates is not None else None,
"assessed": orphan_candidates is not None,
"items": [
{
"filename": track.filename,
"path": _display_path(track.path),
**_file_preview(track.path),
}
for track in (orphan_candidates or ())[:limit]
],
},
}