Fix Soulseek test crash, dedup query, and reorganize missing year

- Add null guard for soulseek_client in test-connection endpoint (#190)
- Fix single_album_dedup query: use al.record_type and al.track_count
  (al.album_type and al.total_tracks don't exist on main albums table)
- Fix library reorganize missing year: pre-load album years from DB as
  fallback when file tags lack the date field (common with playlist syncs)
This commit is contained in:
Broque Thomas 2026-03-18 09:09:45 -07:00
parent 333b8577ca
commit 2888a5dda1
2 changed files with 37 additions and 1 deletions

View file

@ -330,6 +330,11 @@ class LibraryReorganizeJob(RepairJob):
max_disc = max((file_tags[fp].get('disc_number', 1) for fp in fpaths), default=1)
album_total_discs[key] = max_disc
# Pre-load album years from DB for files missing year tags
db_album_years = {} # (artist, album) -> year string
if '$year' in (album_template + single_template):
db_album_years = self._load_album_years(context.db)
# Track claimed destinations to detect in-batch collisions
claimed_destinations = set()
# Track src_dir -> dest_dir for post-pass sidecar cleanup
@ -366,6 +371,12 @@ class LibraryReorganizeJob(RepairJob):
disc_number = tags.get('disc_number', 1) or 1
year = tags.get('year', '')
# Fallback: if file tags have no year, try the DB album year
if not year and db_album_years:
year = db_album_years.get((artist.lower(), (album or title).lower()), '')
if not year:
year = db_album_years.get((albumartist.lower(), (album or title).lower()), '')
# Read quality for $quality template variable
quality = _get_audio_quality(fpath)
@ -624,6 +635,31 @@ class LibraryReorganizeJob(RepairJob):
return context.config_manager.get(f'repair.jobs.{self.job_id}.settings.{key}', default)
return default
def _load_album_years(self, db) -> dict:
"""Load all album years from DB in one query. Returns {(artist_lower, album_lower): year_str}."""
years = {}
conn = None
try:
conn = db._get_connection()
cursor = conn.cursor()
cursor.execute("""
SELECT ar.name, al.title, al.year
FROM albums al
JOIN artists ar ON ar.id = al.artist_id
WHERE al.year IS NOT NULL AND al.year != 0
""")
for row in cursor.fetchall():
artist_name, album_title, year = row
if artist_name and album_title and year:
key = (artist_name.lower(), album_title.lower())
years[key] = str(year)[:4]
except Exception as e:
logger.debug("Failed to load album years from DB: %s", e)
finally:
if conn:
conn.close()
return years
def _update_db_path(self, db, old_path: str, new_path: str, transfer_folder: str = ''):
"""Update file_path in the tracks table when a file is moved.

View file

@ -51,7 +51,7 @@ class SingleAlbumDedupJob(RepairJob):
conn = context.db._get_connection()
cursor = conn.cursor()
cursor.execute("""
SELECT t.id, t.title, ar.name, al.title, al.album_type, al.total_tracks,
SELECT t.id, t.title, ar.name, al.title, al.record_type, al.track_count,
t.file_path, t.bitrate, t.duration, al.thumb_url, ar.thumb_url,
t.track_number
FROM tracks t