Commit Graph
39 Commits
Author SHA1 Message Date
Admin c888c465d5 fix(web): clear svelte-check warnings and log playback failures
The seeded $state initialisers in PlaylistForm intentionally capture the
prop once; untrack() states that instead of tripping
state_referenced_locally. The player now logs the caught exception
rather than discarding it.
2026-07-20 07:28:17 +02:00
Admin 6f7ae9e5bb fix(web): resolve the greeting on the server
It was picked with Math.random() in the component body, so SSR and the
client rendered different text and hydration mismatched. Moving it to
the load keeps the per-visit variety with both sides agreeing, and the
six-level nested ternary becomes a lookup table.
2026-07-20 07:28:12 +02:00
Admin db71c4a331 refactor(web): share track target helpers between home and explore
Both pages reimplemented the same accessors over the target union and a
byte-identical queue-item mapper. Moves the domain type (renamed
ContextMenuTarget -> TrackTarget, since tiles and the queue use it too)
and its helpers to $lib/tracks.ts; TrackContextMenu keeps only its menu
geometry. Home drops from 341 to ~230 lines.

Unifies two divergences the duplication was hiding: home compared the
active tile against track.id while the queue is keyed by
queueIdForTrack, so YouTube-sourced tracks never highlighted; and it
hardcoded explicit to false for local tracks, hiding the badge.

Also cancels in-flight youtube filler results when the effect re-runs,
so a slow response cannot overwrite newer ones.
2026-07-20 07:28:12 +02:00
Admin c8bc26a5e0 fix(web): guard authenticated routes instead of asserting the session user
library, playlists and playlists/[id] read locals.user!.sub with no
check, so an anonymous request threw a TypeError and returned 500
instead of redirecting to login. Adds requireUser(), which redirects to
/login?returnTo=... and returns a non-null SessionUser, and drops the
five non-null assertions.

/upload had no load at all: the page rendered for anonymous users and
only failed on submit. It now redirects up front.
2026-07-20 07:28:04 +02:00
Admin 99c4bb8408 Changes 2026-07-18 23:29:57 +02:00
Admin 72f42369a0 A lot of changes 2026-07-17 18:56:23 +02:00
Admin 7532511e1f fix(frontend): make add-to-queue insert the track to play next
It previously appended to the end of the queue; 'Añadir a la cola' is expected to mean the track plays right after the current one, so it now splices in right after the currently playing track's index.
2026-07-16 22:44:51 +02:00
Admin 63f7253714 feat(frontend): add queue option and enlarge first-level context menu text
The right-click menu now has a plain 'Añadir a la cola' item (appends the track to player.tracks via the new player.addToQueue) alongside the existing playlist submenu, and its first-level text is text-base to match the rest of the menu.
2026-07-16 19:19:08 +02:00
Admin 82152beb93 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 53a3e80c05 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 6b69998865 feat: show explicit badge on YouTube Music results 2026-07-16 06:15:09 +02:00
Admin 74dd1e8374 feat(frontend): show YouTube tracks in recently played with their thumbnails 2026-07-16 01:15:50 +02:00
Admin a6f976a065 fix(frontend): show real cover art in the player for YouTube tracks 2026-07-16 01:06:20 +02:00
Admin 560a943bab feat(frontend): YouTube Music search, playback and playlist saving 2026-07-16 01:06:20 +02:00
Admin 3bbbd52d43 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 126f767dca fix(frontend): change max recent tracks 2026-07-14 18:51:42 +02:00
Admin 9e0c164e17 feat(frontend): persistent player volume 2026-07-14 18:48:57 +02:00
Admin 7d2681aaf6 feat(frontend): show track duration in a Spotify-style table on playlist page 2026-07-14 14:00:23 +02:00
Admin 46a6a9757a feat(frontend): show recently played from listening history on home 2026-07-14 13:26:08 +02:00
Admin f10b0b800b refactor(frontend): drop downloads/import nav, promote library above upload 2026-07-14 13:23:51 +02:00
Admin 5bb6a4a1bf feat(frontend): drive seek bar with rAF for smooth playback progress 2026-07-14 13:23:44 +02:00
Admin a826c39003 refactor(frontend): tidy Navbar, Footer and document shell
Align Navbar and Footer with the new design tokens and enable stable scrollbar gutter on the document.
2026-07-14 04:55:44 +02:00
Admin f155ccc912 feat(frontend): add (app) route group and rework auth routing
Move authenticated pages under an (app) group with a Sidebar shell, add /auth/login and page-based /login, drop the old explore page and login +server endpoint, and add the server upload helper.
2026-07-14 04:55:04 +02:00
Admin 6cc41d1d6f feat(frontend): rework audio player and shared UI components
Expand the player store, split player controls (transport, seek, volume, track info), add Cover/PlaylistArt/NowPlaying UI primitives and a cover image proxy route.
2026-07-14 04:54:51 +02:00
Admin 8c87d84f80 feat(frontend): add theme tokens and dynamic accent palette
Introduce theme.css design tokens, color/palette helpers, and global layout styles (scrollbars, animations, home gradient).
2026-07-14 04:54:45 +02:00
Admin 9b34f2db84 feat(frontend): music player component with separated controls and stream proxy 2026-07-06 02:40:44 +02:00
Admin b9cd3533dc chore(frontend): regenerate api types with track name search 2026-07-06 02:04:04 +02:00
Admin 5d2c9d3986 chore(frontend): generate backend API types from live OpenAPI spec 2026-07-06 01:54:28 +02:00
Admin 93fe2fb942 feat(frontend): add typed backend API client (openapi-fetch) with codegen script 2026-07-06 01:52:25 +02:00
Admin f58f6a0aa5 refactor(frontend): require refresh/id token in Session, validate at callback boundary 2026-07-05 23:57:19 +02:00
Admin ac5fc49800 refactor(frontend): restrict insecure HTTP issuer to dev / explicit opt-in 2026-07-05 23:56:35 +02:00
Admin 6a49b17e38 refactor(frontend): make SessionUser fields non-null and normalize claims at boundary 2026-07-05 23:45:18 +02:00
Admin ea36816777 refactor(frontend): centralize configurable auth/session values in config.ts 2026-07-05 23:43:50 +02:00
Admin 9613cd928d feat(frontend): encrypt session cookie (JWE) and auto-refresh access token 2026-07-05 23:41:49 +02:00
Admin 33ead1daab chore(frontend): remove scaffold comments and add conventions doc 2026-07-05 23:41:42 +02:00
AdminandClaude Opus 4.8 66cb970dd2 fix(frontend): full-page nav for auth links; land on home after login
- Add data-sveltekit-reload to the /login links so the browser performs a full
  navigation (the client router intercepted them and aborted on the external
  Zitadel redirect)
- Default post-login returnTo to / (home) since /explore is not built yet
- 'Empezar gratis' now starts the register flow (/login?mode=register)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 23:16:25 +02:00
AdminandClaude Opus 4.8 454bffe4ba feat(frontend): make Zitadel client secret optional (support PKCE apps)
Configure openid-client with None auth (public client + PKCE) when no secret is
provided, so both PKCE and confidential (Code) Zitadel web apps work.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 23:01:44 +02:00
AdminandClaude Opus 4.8 0163da096e feat(frontend): server-side Zitadel OIDC auth (part 2)
Add Authorization Code + PKCE login/logout against Zitadel, handled entirely
server-side with an httpOnly signed session cookie:
- $lib/server/auth: openid-client discovery (config cached), jose-signed
  session encode/decode, cookie/name constants
- routes: /login (builds the authorize URL with PKCE/state/nonce, ?mode=register
  -> prompt=create), /auth/callback (code exchange + session cookie),
  /logout (clears session + Zitadel end_session)
- hooks.server populates locals.user/accessToken from the session
- +layout.server exposes the user; Navbar shows the signed-in user + Salir,
  or Iniciar sesión / Registrarse
- switch to adapter-node; env-driven config (.env gitignored, .env.example
  committed) with issuer http://host.docker.internal:8080

Verified: svelte-check + build clean; dev smoke test shows the landing in the
logged-out state and /login issuing a 302 to Zitadel's authorize endpoint with
PKCE/state/nonce (discovery reachable). Real client id/secret still needed to
complete the token exchange.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 22:58:47 +02:00
AdminandClaude Opus 4.8 6bb31ad7c5 feat(frontend): scaffold SvelteKit + Tailwind with landing (part 1)
New SvelteKit app in frontend/ (minimal template, TypeScript, TailwindCSS v4).
Adds the app shell (dark music theme navbar + footer) and a landing page with
hero and feature cards. CTAs point to /login and /explore (built in later parts).

Verified: production build succeeds and the page renders with Tailwind styles
applied (checked via preview).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-05 22:47:29 +02:00