Conversation
Port the Playlist Curator backend from multi-provider-gui to main. Adapts track_id (INTEGER) to item_id (TEXT), strips multi-provider concerns (provider_track joins, fan-out save, app_setup imports), and adds single-server helpers for /server_playlists and /server_playlist_tracks that branch on config.MEDIASERVER_TYPE. MPD is intentionally unsupported (returns 501). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Port the Playlist Curator template from multi-provider-gui, stripping provider picker UI, provider-selector container, and provider-selector.js script tag. Replace loadProviderPlaylists/loadProviderPlaylistTracks with single-server loadServerPlaylists/loadServerPlaylistTracks that auto-load on Playlist Extender tab activation. Stream URLs use encodeURIComponent to handle item_ids with special chars. Save payload drops provider_ids. Find-duplicates no longer parseInt the item_ids. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When extending a playlist, results that are embedding-near-duplicates of source tracks are now annotated with a warning badge showing the cosine distance and which source track they match. Users can adjust sensitivity and optionally hide flagged results — useful for compilations where the same song appears on multiple albums. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ams grid Move duplicate detection controls inside the 2-column grid as a full-width row with centered layout, subtle border-top separator, info tooltip, and fixed-width sensitivity slider. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Default threshold 0.010, slider range 0.005-0.050 based on real usage - Tooltips updated to reflect actual false positive rates - Sensitivity slider and toggles now react instantly (client-side filter) - Backend always returns duplicates up to slider max for instant re-render - Fix vertical centering of Include/Exclude buttons (flex off td, into div) - Distance column narrowed and right-aligned - Album column truncates with ellipsis on overflow - Duplicate badge shows source track name, truncates on overflow Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… UX fixes Weights: - Replace fixed power-of-2 multipliers with influence-based levels (x1, Boost ~5%, Strong ~15%, Focus ~30%) that scale with playlist size - Color-coded buttons (gray/blue/purple/gold) with hover tooltips Filters: - Genre and Mood/Style now use dropdown + threshold slider (default 0.55) - Backend extracts scores numerically via SQL UNNEST for accurate filtering - Fix features query to return unique labels instead of every label:score pair - Merge redundant Genre/Mood dropdown into single Genre field UX: - Recalc spinner next to "Search Results" title during weight changes - Weight changes no longer show disruptive "Finding similar songs..." status - Flag-duplicates checkbox toggle re-renders results instantly - Clear stale results on search error (e.g. "No songs found") - Year shown in Smart Search album column - Recalc skips status/button disruption entirely Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The playlist dropdown's change handler was clearing smartFilterSourceIds on every selection change, including when selecting the smart filter option itself. Now restores IDs from cached smartFilterResults when the smart filter option is selected. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Code reviewFound 1 issue:
AudioMuse-AI/app_playlist_curator.py Lines 421 to 424 in 9c8ea37 AudioMuse-AI/app_playlist_curator.py Lines 584 to 612 in 9c8ea37 AudioMuse-AI/templates/playlist_curator.html Lines 1918 to 1921 in 9c8ea37 🤖 Generated with Claude Code - If this code review was useful, please react with 👍. Otherwise, react with 👎. |
…edup keep toggle When "Flag Near-Duplicates" is unchecked, the backend now skips the O(N×M) cosine distance loop entirely instead of silently running it at maximum sensitivity. The dedup keep toggle also now correctly allows un-keeping the default first track once another track has been marked. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request introduces a Playlist Curator feature, allowing users to search for tracks using smart filters and extend playlists by finding similar tracks based on weighted embedding centroids. It integrates with various media servers for playlist management and includes audio-similarity-based duplicate detection. Feedback points out a security vulnerability where media server credentials are exposed in redirect URLs for streaming, recommending a proxying approach. Additionally, a performance optimization was suggested to limit the number of results returned by broad filter queries.
|
I did a first round of test and here some feedback:
In short I like the functionality but the interface need maybe some parameter less to being more easy to understand/usabke AND if we had play button here we need to add everywhere. |
|
Let me look into proxying to audio stream. My thoughts:
I see this as an advanced page for a more elaborate workflow. It's to manually curate, spend a long time choosing, making decisions, and tweaking your results. It's different from the other features that are meant to be quicker and fast exploration. I have already spend hours on just using it (not the development part), to tweak some old playlists of mine, that I got stuck on, finally be able to shape them further. In the future I would like to see a few more tools for playlist management, e.g. to really analyze and explore existing ones and see track outliers (maybe using the map feature) |
The stream_track endpoint previously issued a 302 redirect to the media server URL, leaking api_key / Navidrome password in the browser address bar, history, and logs. Now the backend fetches the stream server-side and pipes it to the client with Range forwarded so <audio> seek still works. Adds item_id allowlist to block SSRF, a 60s read timeout to prevent stalled upstreams from pinning workers, call_on_close for reliable connection cleanup, and a narrow RequestException handler so credential-bearing URLs never land in tracebacks. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…earch button - Progress bar no longer shrinks on play/pause: time labels get a fixed min-width with tabular-nums so the seek bar keeps a stable width as current-time/duration text grows. - Added @media breakpoints (768px, 480px) so the page works on phones: sticky player wraps, extend-params grid collapses to one column, results table gains horizontal scroll, hardcoded min-widths drop. - Replaced the confusing "Flag duplicates" + "Hide flagged" checkbox pair with a single Off/Mark/Hide selector and an info tooltip that explicitly distinguishes it from the "Find Duplicates in Playlist" scan (which was also relabeled for clarity). - Renamed the "Weight" column header to "Influence" with a tooltip explaining the x1/Boost/Strong/Focus cycle. - Gave the Smart-Filters Search button its own styled class so it visually pairs with the Send-to-Extend button. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ooltip
- Stop "Search-result duplicates:" label wrapping and the <select>
stretching full-width: override the global select{width:100%} rule
with width:auto and flex:0 0 auto, plus white-space:nowrap on the
label so it stays on one line.
- Swap the Influence column's custom info-tooltip for a native title
attribute. The fancy tooltip was being clipped by the table cell's
overflow rules no matter how I positioned it; the native tooltip is
unclipped and predictable. Column width reduced back to 90px since
the info icon is no longer needed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ndyhd/AudioMuse-AI into feature/playlist-curator-port
- Rewrote the curator page description to introduce the two tabs (Smart Search vs Playlist Extender) and how they relate, in place of the previous generic line. - Renamed Playlist Extender's "Exclude" button to "Avoid" (and the EXCLUDED status badge to AVOIDED) to distinguish it from Smart Search's hide-only Exclude — Avoid also actively steers the similarity search away from the track. Renamed influence level "x1" to "Normal" and the source-drawer column "Weight" to "Influence" so it matches the main results table. - Added discoverable info-tooltip widgets (the blue "i" icon used in the rest of the form) to the Influence and Actions column headers in Extender mode. The previous native title= attribute was an invisible affordance; the icon advertises that hover info exists. Also added per-button title= tooltips to Include / Avoid / Smart- Search Exclude explaining their steering effect on recommendations. - Tooltip text cleanup: replaced em dashes with colons across the influence-level and search-result-duplicate tooltips; tightened Mark/Hide copy and dropped the stale cross-reference from the dup sensitivity tooltip. - Tooltip CSS: added white-space: pre-line so authored line breaks render; let table headers overflow visible so the icon and popup aren't clipped; flipped header tooltips to show below the icon; and right-anchored the rightmost-column tooltip so it doesn't overflow the page. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
These are served from inside the Linux container alongside the .py / .sh / .conf files already covered, but were missing from the LF rule. Without it, editing them on Windows quietly converts working-tree LF back to CRLF, which floods diffs with whole-file noise. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
|
@NeptuneHub ready for review |
Rapid weight changes could race: a slow in-flight fetch could overwrite fresher results after landing second. Wire an AbortController through findSimilarSongs so a new request aborts the previous one, and ignore AbortError in the catch/finally so the UI doesn't flash. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Hi there, my (humble) review: I've only looked at the changes to the existing code, i have not looked at any of the new files, so this is only an adjacent review. I just want to check what changed merging this branch would have on the whole project. In that respect it's very good. Minimal impact to the rest of the project and no risk of those changes being hard to integrate for someone rebasing their git branches against this changeset. 👍 |
NeptuneHub
left a comment
There was a problem hiding this comment.
Hi,
here some point:
- you still leve the possibility of return any possible number of result, with a mood/style filter I was able to return 14k songs that was near to crash the browser frozying it for some seconds. If you still want to return everything without max add a way to get the result in a paginated way in both backend and frotnend html page.
- The play/pause button, on Chrome (windows) still slight change dimension when clicked.
- The feature is not mobile friendly, when you resize in a small windows things need to go to the next line not go out of the screen: I know that this is more a desktop feature but still we need to keep the style usable.
- When you click to send to playlist extender, and you have a big number of song (in the test 5000) it tooks around 1 minutes to calculate. This is a direct issue of the point 1 when we didn't set a max, we need to think about this. 1 minutes on a i7 14th gen means several minutes on low end computer hope you didn't crash
- Still don't understand what influence means, can you explain better and then do in a way that the user can understand from the UI?
- In playlist extender search song button still don't have the right button css applied
- With high number of song (tested with 5000) everything become unresponsive like go from one tab to the other, or change some filter. Another time some kind of "max" or other workearound is needed.
- You have in one tab "Search-result duplicates:". You hit search and in another tab you have find duplicate in playlist. If the functionality is "remove the duplicate" try to create a tab named in this way with all the functionality grouped together
- In the search table the button avoid I suppose is a way to remove from the final playlist that you go to save, but Include? shouldn't be all included by default? or at least can we add an include all / exclude all with maybe all included by default? otherwise the user need to do a lot of click here.
In general I like the functionality I find it useful, but the perception is of complexity: can you find a way to improve the UI ?
|
@rendyhd does this PR address #187? If so, Neptune should probably link it. I'm also wondering if the source playlist panel and the search result panel should be side-by-side instead of below each other, or maybe if the search results could be minimized. At the moment the playlist can only be seen 5 tracks at a time, which seems rather limiting. Also, is there some kind of confirmation (or even better, undo) for removing tracks from the source playlist? |
Hi there! Over the last months I've been actively using and improving on it, the two features Smart Search and Playlist Extender are designed to be used next to each other. You can of course use either separate, but the true fun is when you spend some time with them together. It opens so many doors to explore; whether it's expanding on compilation series, artist combinations, or any discover through any of variables AudioMuseAI extracts. I've gotten some real gems. And then once you have that base, you explore further in the Playlist Extender. For me, the combination of the two tabs is what makes the Curator, and allows me to rediscover my library in unique ways. There is an important difference with other features, this is not meant to give you a recommended playlist fast, it's to manually curate and discover. I can honestly spend hours playing around in it. That doesn't mean it's in scope for AudioMuseAI or a fit for the product, I'm just saying that's how I use and enjoy it. I'm opening to changing the name, but cutting half it out wouldn't make sense to me. But at the end of the day it's not up to me. I do like your UI suggestion and way to see removed items. I'll look into those! |
|
What I wanted to say is that these features probably shouldn't share a UI. I get that AudioMuse can be great for creating playlists, but creating a playlist and augmenting a playlist seems like two separate use cases to me, that deserve their own page. You use one after the other, if you use the creator at all. All of this is just to make the UI more manageable and approachable, and to make the feature less specific to your own use case. |
# Conflicts: # app.py
Adds the Playlist Curator page — a tool for building and extending playlists using embedding-based similarity search, smart filters, and weighted track influence.
Core Features
Architecture