From 218af65606a34f75503d483537471e9631a6e40f Mon Sep 17 00:00:00 2001 From: Broque Thomas <26755000+Nezreka@users.noreply.github.com> Date: Tue, 5 May 2026 19:54:31 -0700 Subject: [PATCH] ID-first fallback for server-playlist add-track + diagnostic logging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The /api/server/playlist//add-track endpoint only looked up the target Plex playlist by name, but Plex deletes + recreates playlists on edit so the rating key the frontend cached can be stale. The companion GET /tracks endpoint already had id-first / name-fallback; add-track now does the same. Added a warning log on GET /tracks when BOTH lookups fail so the "all source items show Find & Add" symptom (which happens when server_tracks comes back empty) has a clear diagnostic in the log instead of silently rendering an empty server column. Not a refactor regression — the original code had the same name-only lookup. The mass-replace of `plex_client` → `media_server_engine.client('plex')` is byte-equivalent. Just surfacing the latent bug. --- web_server.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/web_server.py b/web_server.py index 3c6aeb90..66302b51 100644 --- a/web_server.py +++ b/web_server.py @@ -18100,6 +18100,12 @@ def get_server_playlist_tracks(playlist_id): raw_playlist = media_server_engine.client('plex').server.playlist(playlist_name) except Exception: pass + if not raw_playlist: + logger.warning( + f"[ServerPlaylistTracks] Plex playlist not found by " + f"id={playlist_id} or name='{playlist_name}' — " + f"compare view will show every source track as Find & Add" + ) if raw_playlist: if not playlist_name: playlist_name = raw_playlist.title @@ -18446,11 +18452,25 @@ def server_playlist_add_track(playlist_id): active_server = config_manager.get_active_media_server() if active_server == 'plex' and media_server_engine.client('plex'): + # ID-first, name-fallback — Plex deletes + recreates playlists + # on edit so the rating key the frontend cached can be stale. + # The GET tracks endpoint uses the same lookup chain. + plex_server = media_server_engine.client('plex').server + raw_playlist = None try: - raw_playlist = media_server_engine.client('plex').server.playlist(playlist_name) + raw_playlist = plex_server.fetchItem(int(playlist_id)) except Exception: + pass + if not raw_playlist and playlist_name: + try: + raw_playlist = plex_server.playlist(playlist_name) + except Exception: + pass + if not raw_playlist: + logger.warning(f"[ServerPlaylist] add-track: playlist not found by id={playlist_id} or name='{playlist_name}'") return jsonify({"success": False, "error": "Playlist not found"}), 404 - new_item = media_server_engine.client('plex').server.fetchItem(int(track_id)) + + new_item = plex_server.fetchItem(int(track_id)) if not new_item: return jsonify({"success": False, "error": "Track not found on server"}), 404