Fix Discover synced playlists not appearing under Server Playlists
Server Playlists was filtered to only show playlists matching mirrored_playlists entries, but Discover syncs are stored in sync_history (not mirrored_playlists), so they were excluded. Adds GET /api/sync/history/names returning distinct synced playlist names, and includes those in the filter alongside mirrored playlists.
This commit is contained in:
parent
61c6b6f3f9
commit
86621704fe
3 changed files with 34 additions and 5 deletions
|
|
@ -10289,6 +10289,17 @@ class MusicDatabase:
|
|||
logger.debug(f"Error deleting sync history entry: {e}")
|
||||
return False
|
||||
|
||||
def get_sync_history_playlist_names(self):
|
||||
"""Return distinct playlist names ever synced (for server playlist filtering)."""
|
||||
try:
|
||||
conn = self._get_connection()
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT DISTINCT playlist_name FROM sync_history WHERE playlist_name != ''")
|
||||
return [row[0] for row in cursor.fetchall()]
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting sync history playlist names: {e}")
|
||||
return []
|
||||
|
||||
def get_sync_history_stats(self):
|
||||
"""Return counts grouped by source."""
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -30405,6 +30405,16 @@ def delete_sync_history_entry_api(entry_id):
|
|||
except Exception as e:
|
||||
return jsonify({"success": False, "error": str(e)}), 500
|
||||
|
||||
@app.route('/api/sync/history/names', methods=['GET'])
|
||||
def get_sync_history_playlist_names():
|
||||
"""Return distinct playlist names ever synced, for server playlist cross-reference."""
|
||||
try:
|
||||
db = MusicDatabase()
|
||||
names = db.get_sync_history_playlist_names()
|
||||
return jsonify(names)
|
||||
except Exception as e:
|
||||
return jsonify([])
|
||||
|
||||
# ===============================
|
||||
# == UNIFIED MISSING TRACKS API ==
|
||||
# ===============================
|
||||
|
|
|
|||
|
|
@ -72385,31 +72385,39 @@ async function loadServerPlaylists() {
|
|||
}
|
||||
|
||||
try {
|
||||
// Fetch server playlists and mirrored playlists in parallel
|
||||
const [serverRes, mirroredRes] = await Promise.all([
|
||||
// Fetch server playlists, mirrored playlists, and sync history names in parallel
|
||||
const [serverRes, mirroredRes, historyNamesRes] = await Promise.all([
|
||||
fetch('/api/server/playlists'),
|
||||
fetch('/api/mirrored-playlists'),
|
||||
fetch('/api/sync/history/names'),
|
||||
]);
|
||||
const data = await serverRes.json();
|
||||
let mirroredAll = [];
|
||||
try { mirroredAll = await mirroredRes.json(); } catch (_) { }
|
||||
if (!Array.isArray(mirroredAll)) mirroredAll = [];
|
||||
let historyNames = [];
|
||||
try { historyNames = await historyNamesRes.json(); } catch (_) { }
|
||||
if (!Array.isArray(historyNames)) historyNames = [];
|
||||
|
||||
if (!data.success || !data.playlists) {
|
||||
if (container) container.innerHTML = `<div class="playlist-placeholder">${data.error || 'Could not load server playlists'}</div>`;
|
||||
return;
|
||||
}
|
||||
|
||||
// Only show server playlists that have a matching mirrored playlist
|
||||
// Only show server playlists that have a matching mirrored playlist or sync history entry
|
||||
const mirroredNames = new Set(mirroredAll.map(p => p.name.trim().toLowerCase()));
|
||||
const filtered = data.playlists.filter(pl => mirroredNames.has(pl.name.trim().toLowerCase()));
|
||||
const syncedNames = new Set(historyNames.map(n => n.trim().toLowerCase()));
|
||||
const filtered = data.playlists.filter(pl => {
|
||||
const key = pl.name.trim().toLowerCase();
|
||||
return mirroredNames.has(key) || syncedNames.has(key);
|
||||
});
|
||||
|
||||
_serverPlaylists = filtered;
|
||||
const title = document.getElementById('server-tab-title');
|
||||
if (title) title.textContent = `Server Playlists (${data.server_type ? data.server_type.charAt(0).toUpperCase() + data.server_type.slice(1) : ''})`;
|
||||
|
||||
if (filtered.length === 0) {
|
||||
if (container) container.innerHTML = '<div class="playlist-placeholder">No synced playlists found. Only server playlists that match your mirrored playlists are shown here.</div>';
|
||||
if (container) container.innerHTML = '<div class="playlist-placeholder">No synced playlists found. Only server playlists that have been synced via SoulSync are shown here.</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue