Fix source-info popover showing no data due to path format mismatch
track_downloads stores local Windows paths but tracks table stores server-side paths (Plex/Jellyfin). Both the track_id lookup (NULL due to failed auto-link at insert time) and exact file_path fallback were failing. Added filename-suffix LIKE matching as a final fallback in get_track_source_info, plus a back-link so the track_id gets written back for fast future lookups. Also improved the auto-link in record_track_download to use the same suffix matching when exact path fails.
This commit is contained in:
parent
0edb8e93bb
commit
c1ef32acd2
2 changed files with 47 additions and 1 deletions
|
|
@ -9513,6 +9513,16 @@ class MusicDatabase:
|
||||||
if not track_id and file_path:
|
if not track_id and file_path:
|
||||||
cursor.execute("SELECT id FROM tracks WHERE file_path = ? LIMIT 1", (file_path,))
|
cursor.execute("SELECT id FROM tracks WHERE file_path = ? LIMIT 1", (file_path,))
|
||||||
row = cursor.fetchone()
|
row = cursor.fetchone()
|
||||||
|
if not row:
|
||||||
|
# Fallback: match by filename suffix (handles server path vs local path differences)
|
||||||
|
import os as _os
|
||||||
|
fname = _os.path.basename(file_path.replace('\\', '/'))
|
||||||
|
if fname:
|
||||||
|
cursor.execute(
|
||||||
|
"SELECT id FROM tracks WHERE file_path LIKE ? OR file_path LIKE ? LIMIT 1",
|
||||||
|
(f'%/{fname}', f'%\\{fname}')
|
||||||
|
)
|
||||||
|
row = cursor.fetchone()
|
||||||
if row:
|
if row:
|
||||||
track_id = str(row[0])
|
track_id = str(row[0])
|
||||||
|
|
||||||
|
|
@ -9577,6 +9587,33 @@ class MusicDatabase:
|
||||||
logger.error(f"Error getting download by file path: {e}")
|
logger.error(f"Error getting download by file path: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_download_by_filename(self, filename: str, link_track_id: str = None) -> Optional[dict]:
|
||||||
|
"""Find a download record by filename suffix (handles server vs local path mismatches).
|
||||||
|
Optionally back-links the track_id on the found record for future fast lookups."""
|
||||||
|
try:
|
||||||
|
conn = self._get_connection()
|
||||||
|
cursor = conn.cursor()
|
||||||
|
# Match using both separator styles to handle Windows vs Unix paths
|
||||||
|
cursor.execute("""
|
||||||
|
SELECT * FROM track_downloads
|
||||||
|
WHERE file_path LIKE ? OR file_path LIKE ?
|
||||||
|
ORDER BY created_at DESC
|
||||||
|
LIMIT 1
|
||||||
|
""", (f'%/{filename}', f'%\\{filename}'))
|
||||||
|
row = cursor.fetchone()
|
||||||
|
if row and link_track_id:
|
||||||
|
# Back-link this record so future track_id lookups work directly
|
||||||
|
cursor.execute(
|
||||||
|
"UPDATE track_downloads SET track_id = ? WHERE id = ? AND track_id IS NULL",
|
||||||
|
(str(link_track_id), row['id'])
|
||||||
|
)
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
return dict(row) if row else None
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error getting download by filename: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
# ==================== Discovery Pool Methods ====================
|
# ==================== Discovery Pool Methods ====================
|
||||||
|
|
||||||
def get_discovery_pool_matched(self, limit: int = 500) -> list:
|
def get_discovery_pool_matched(self, limit: int = 500) -> list:
|
||||||
|
|
|
||||||
|
|
@ -14362,7 +14362,7 @@ def get_track_source_info(track_id):
|
||||||
downloads = database.get_track_downloads(str(track_id))
|
downloads = database.get_track_downloads(str(track_id))
|
||||||
|
|
||||||
if not downloads:
|
if not downloads:
|
||||||
# Try matching by file path as fallback
|
# Try matching by file path as fallback (exact, then filename suffix)
|
||||||
conn = database._get_connection()
|
conn = database._get_connection()
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
cursor.execute("SELECT file_path FROM tracks WHERE id = ?", (track_id,))
|
cursor.execute("SELECT file_path FROM tracks WHERE id = ?", (track_id,))
|
||||||
|
|
@ -14372,6 +14372,15 @@ def get_track_source_info(track_id):
|
||||||
dl = database.get_download_by_file_path(row['file_path'])
|
dl = database.get_download_by_file_path(row['file_path'])
|
||||||
if dl:
|
if dl:
|
||||||
downloads = [dl]
|
downloads = [dl]
|
||||||
|
else:
|
||||||
|
# Path format mismatch (e.g. Plex path vs local Windows path) —
|
||||||
|
# fall back to filename-only match and back-link the track_id
|
||||||
|
import os as _os
|
||||||
|
fname = _os.path.basename(row['file_path'].replace('\\', '/'))
|
||||||
|
if fname:
|
||||||
|
dl = database.get_download_by_filename(fname, link_track_id=track_id)
|
||||||
|
if dl:
|
||||||
|
downloads = [dl]
|
||||||
|
|
||||||
return jsonify({"success": True, "downloads": downloads})
|
return jsonify({"success": True, "downloads": downloads})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue