Commit Graph
326 Commits
Author SHA1 Message Date
Admin ef7ebff9f6 fix(frontend): nested add-to-playlist submenu with playlist thumbnails
The right-click menu now shows a single 'Añadir a una playlist' item; hovering it reveals a submenu listing every playlist with a small cover thumbnail next to its name, instead of dumping the whole playlist list into the first-level menu.
2026-07-16 17:33:38 +02:00
Admin f891002528 fix(frontend): explore search polish
- Rename the local results heading from 'Mi música' to 'Musify'.
- Replace the per-card add-to-playlist icon on YouTube results with a right-click context menu listing all playlists.
- Stop the search box from clearing what the user is typing when a debounced navigation resolves after they've kept typing, by decoupling the input's value from the server-driven query prop.
2026-07-16 17:29:46 +02:00
Admin 6cbcc18aab fix(frontend): wire hardware media-key next/previous track buttons
The player never registered Media Session action handlers, so the OS/keyboard next-track and previous-track keys had nothing to call — only play/pause worked via the browser's built-in audio-element heuristic. Now previoustrack/nexttrack are wired to the player, and metadata/playback state are kept in sync for the lock-screen/OS media widget.
2026-07-16 17:20:49 +02:00
Admin bbc5651ca5 chore(frontend): show 27 local tracks per page in explore 2026-07-16 17:20:48 +02:00
Admin 7e8fed9bd7 fix(frontend): stop duplicating YouTube tracks in recently played after download
The queue/history identity for a song originating on YouTube now always uses its videoId, instead of switching to the local track id once it finishes downloading. Previously that switch made the same song produce two separate entries when merging session and server listening history.
2026-07-16 17:00:35 +02:00
Admin cfa5bdc6ff feat(frontend): hide empty local/YouTube sections when searching in explore 2026-07-16 17:00:27 +02:00
Admin 1050372634 feat(frontend): search local and YouTube Music together without filter tabs 2026-07-16 06:23:21 +02:00
Admin 5f10be4791 feat: show explicit badge on YouTube Music results 2026-07-16 06:15:09 +02:00
Admin f90d76fad9 feat(frontend): unified explore search across local and YouTube Music
Explore now has Todo/Mi musica/YouTube Music filters (searching both by default), YouTube results share the local grid card style, and cards show the artist instead of the upload date.
2026-07-16 06:02:57 +02:00
Admin 4069b36202 feat(frontend): show YouTube tracks in recently played with their thumbnails 2026-07-16 01:15:50 +02:00
Admin c5b0ee3e48 feat(backend): record listening history for YouTube playback
Playing a YouTube song now creates a lightweight track row (without queueing a download) and writes listening history; saving to a playlist queues the download via the new DownloadRequested flag.
2026-07-16 01:15:36 +02:00
Admin 37e0a4a4bf fix(frontend): show real cover art in the player for YouTube tracks 2026-07-16 01:06:20 +02:00
Admin 3baac742d0 feat(frontend): YouTube Music search, playback and playlist saving 2026-07-16 01:06:20 +02:00
Admin 73826b9d08 feat(backend): auto-download YouTube tracks saved to playlists 2026-07-16 01:06:04 +02:00
Admin 11ed8b40ff feat(backend): YouTube Music search and playback resolution endpoints 2026-07-16 01:05:42 +02:00
Admin 2cecd118ed feat(backend): add source, external id and artist to tracks 2026-07-16 01:05:28 +02:00
Admin cc1c1c204f style(frontend): full-width track rows with duration and listens on library page
Rows now span the full page width and show track duration plus
listens count, matching the columns already used elsewhere in the
app. Also trims the trailing bottom padding to match other pages.
2026-07-15 16:18:57 +02:00
Admin af805a172f style(backend): formatting pass on GetListeningHistory 2026-07-15 16:15:37 +02:00
Admin 1438d9bf1a fix(backend): stop loading a user's entire listening history into memory
GetListeningHistory used AsEnumerable() before DistinctBy/Take, which
forced EF Core to materialize every history row for the user just to
keep the last 15 distinct tracks. Now groups by track and takes the
15 most recently played track ids in SQL, then fetches only those.
2026-07-15 16:12:26 +02:00
Admin 135cea6c76 chore(deploy): add pgAdmin to the dev stack
Runs alongside Postgres in the unified compose file at
http://localhost:5050, config via PGADMIN_* env vars.
2026-07-15 16:10:18 +02:00
Admin 02e093d254 style(frontend): even out page-bottom spacing and header sizing
Home and explore had an oversized trailing bottom padding compared to
the rest of the app; brought both down to match. Also matches "Mis
listas" grid/limit on home to "Novedades", and sizes the library page
header the same as the playlists page header.
2026-07-15 16:10:11 +02:00
Admin d1cba7b846 feat(frontend): redesign playlist pages with cover image support
Create and edit playlist modals now upload/preview a cover image
(reusing the presigned-upload flow already used for tracks) and share
identical layout and coloring. Adds a cover proxy route and wires
PlaylistArt to render a playlist's real cover before falling back to
the track mosaic/gradient.

Also reworks the playlist detail page: full-width borderless "Añadir
de tu biblioteca" table with listens count and click-to-play, drops
the empty-playlist placeholder message, and restyles the playlists
grid to match the rest of the app.
2026-07-15 16:10:04 +02:00
Admin e98798894e fix(backend): compute track listens count via SQL instead of an unloaded navigation
TrackApplicationResponse.FromEntity counted track.ListeningHistories,
but none of the queries that built a response ever Included it, so
the collection was always empty and listensCount was always 0. Each
query now projects the count as a correlated subquery before mapping
to the response.
2026-07-15 16:09:54 +02:00
Admin b4b08aa3fd feat(backend): add playlist cover endpoint and relax description validation
Adds GET /playlists/{id}/cover (mirrors the track cover endpoint) so
uploaded playlist pictures can actually be served. Also drops the
NotEmpty rule on playlist description, which rejected the blank
description the frontend treats as optional; CreatePlayList now falls
back to the domain's default text instead.
2026-07-15 16:09:40 +02:00
Admin a10426b3f1 feat(frontend): hide playlists if the user doesn't have any 2026-07-14 19:24:41 +02:00
Admin f101ce69a0 Changes 2026-07-14 19:11:58 +02:00
Admin cb7aa32567 fix(frontend): change max recent tracks 2026-07-14 18:51:42 +02:00
Admin 92aec73b9d feat(frontend): persistent player volume 2026-07-14 18:48:57 +02:00
Admin 79119fe3fa style(frontend): drop card background on explore results, match home track style 2026-07-14 14:30:19 +02:00
Admin 26f2c92bec style(frontend): make explore search bar span full width 2026-07-14 14:28:54 +02:00
Admin 1e21c6dad9 feat(frontend): search tracks live as you type on explore page 2026-07-14 14:27:38 +02:00
Admin 2208453775 style(frontend): restore original card sizes and stretch all home grids full width 2026-07-14 14:24:28 +02:00
Admin d05dc74f90 style(frontend): let recently-played cards fill the full page width 2026-07-14 14:22:55 +02:00
Admin fc298ac1dd style(frontend): enlarge recently-played section on home page 2026-07-14 14:20:51 +02:00
Admin 597fc7387a fix(frontend): give duration and remove-track their own grid columns 2026-07-14 14:11:36 +02:00
Admin 054160d68b style(frontend): move remove-track button to the far right of the row 2026-07-14 14:08:45 +02:00
Admin 815aca64bc fix(frontend): contain NowPlaying indicator inside playlist play button 2026-07-14 14:06:48 +02:00
Admin 095088fb65 style(frontend): polish playlist page header, back link and action buttons 2026-07-14 14:04:31 +02:00
Admin c4aea1f7a1 feat(frontend): show track duration in a Spotify-style table on playlist page 2026-07-14 14:00:23 +02:00
Admin 4ebcd69eeb feat(backend): expose track duration and listen count in track response 2026-07-14 13:54:12 +02:00
Admin 877f2c42a4 refactor(backend): rename AudioTranscoderConfiguration/Service to AudioConfiguration/AudioService 2026-07-14 13:54:08 +02:00
Admin 7ac105f113 refactor(backend): return AudioTranscodeResult with status code and duration 2026-07-14 13:49:28 +02:00
Admin 71c0bfa418 feat(backend): add migration for Track.Duration column 2026-07-14 13:48:05 +02:00
Admin 1711012541 feat(backend): extract audio duration during transcoding and persist to track 2026-07-14 13:47:52 +02:00
Admin d889aa63c5 chore(frontend): allow dev server to fall back to a free port 2026-07-14 13:26:11 +02:00
Admin 5905f56e84 feat(frontend): show recently played from listening history on home 2026-07-14 13:26:08 +02:00
Admin 5fe0f6ff32 fix(backend): order listening history by recency and cap to 15 tracks 2026-07-14 13:26:04 +02:00
Admin 2abca7f08d fix(frontend): apply display font to page titles missing it 2026-07-14 13:23:56 +02:00
Admin b372028e0a refactor(frontend): drop downloads/import nav, promote library above upload 2026-07-14 13:23:51 +02:00
Admin e4830ad73f feat(frontend): drive seek bar with rAF for smooth playback progress 2026-07-14 13:23:44 +02:00