mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-22 07:15:47 +00:00
feat(fullscreen-player): rebuilt static fullscreen player (#1001)
* feat(player): static media-center fullscreen player (v1) New lean fullscreen player: sharp full-bleed background (artist photo, cover fallback), no blur / no continuous animations. Bottom-left big cover bottom- flush with a full-width semi-transparent text bar (title with queue position, artist, year/genre + rating stars, next-up); control row of transport · center time · actions; full-width seekbar; live clock. Only the seekbar, time readout and clock update at runtime, each owning its state (no per-tick re-render). Reuses FsSeekbar/FsPlayBtn, the cover/artist hooks, idle-fade and queue helpers. Wired in AppShell; old player kept for A/B. * feat(fullscreen-player): true waveform seekbar instead of thin bar Replace FsSeekbar with the real WaveformSeek (cucadmuh's idea). The taller canvas grows the bottom cluster upward, shifting the info/control rows up. Height clamped to 32-52px. * feat(fullscreen-player): up-next popover + control-bar styling - Queue button opens a semi-transparent 'Up next' popover anchored bottom right; clicking a row jumps to that queue item. - Larger bottom-right action buttons. - Control row gets its own darker semi-transparent bar (touches the info bar above) for contrast; play button matches the plain transport buttons (no white circle, same size). * feat(fullscreen-player): high-res (2000px) background cover Fetch the full-screen background cover at the 2000px tier via the existing on-demand fullRes path (same getCoverArt fetch, saved as a high-res WebP outside the backfill pipeline) instead of the low-res 500px pipeline tier. usePlaybackCoverArt now forwards a fullRes option to useCoverArt. * feat(fullscreen-player): scrolling lyrics overlay + control-bar polish - Lyrics button next to Queue toggles a centered, dark semi-transparent scrolling-lyrics overlay (reuses FsLyricsApple). - Control bar darkened to match the lyrics overlay (0.88). - Close button sized down to harmonize with the clock. * feat(fullscreen-player): make rating stars clickable The rating stars next to the year were display-only. Wire them to queueSongRating (same path as the player bar / context menu): click to set, click the current value to clear, with a hover preview. Keeps the lucide outline look to match the rest of the control bar. * fix(fullscreen-player): stable, high-res album cover The foreground cover was keyed per track, so Navidrome's per-track `mf-<id>` coverArt re-triggered the distinct-disc heuristic and reloaded the cover on every song change within the same album. Key it on albumId (via useAlbumCoverRef) so it stays put while the album is unchanged. It also used the low-res tier; reuse the fullRes 2000px cover already fetched for the background so the foreground is crisp and both share a single fetch/decode. * refactor(fullscreen-player): remove the old player and its settings The static rebuild is now the only fullscreen player. Delete the old FullscreenPlayer component, its old-only parts (FsArt, FsPortrait, FsSeekbar, FsLyricsRail, FsLyricsMenu, useFsDynamicAccent) and its test. Remove the now-orphaned settings (showFullscreenLyrics, fsLyricsStyle, showFsArtistPortrait, fsPortraitDim) along with the Appearance 'Fullscreen player' section and its search entry. The new player always shows the artist photo with cover fallback and has its own lyrics toggle. Shared building blocks used by the static player (FsLyricsApple, FsPlayBtn, FsClock, FsTimeReadout, FsQueueModal, useFsArtistPortrait) are kept. * i18n(fullscreen-player): translate the new player's strings Wire the static player's previously English-only strings through i18n across all 9 locales: now-playing label, track position, up-next label, queue/lyrics/shuffle controls, and the queue overlay (title, empty, close). Reuses existing queue.title / common.close keys; adds six new keys to the player namespace. * docs(changelog): note fullscreen player rebuild (#1001)
This commit is contained in:
committed by
GitHub
parent
c674e4515b
commit
dc4eef1a97
@@ -48,6 +48,12 @@ export const player = {
|
||||
playbackRate: 'Geschwindigkeit',
|
||||
miniPlayer: 'Mini-Player',
|
||||
lyrics: 'Lyrics',
|
||||
fsNowPlaying: 'Wird gespielt…',
|
||||
fsTrackPosition: 'Titel {{current}} / {{total}}',
|
||||
fsNext: 'Als Nächstes',
|
||||
fsUpNext: 'Als Nächstes',
|
||||
fsQueueEmpty: 'Nichts in der Warteschlange.',
|
||||
shuffle: 'Zufallswiedergabe',
|
||||
fsLyricsToggle: 'Lyrics im Vollbild',
|
||||
lyricsLoading: 'Lyrics werden geladen…',
|
||||
lyricsNotFound: 'Keine Lyrics für diesen Titel gefunden',
|
||||
|
||||
@@ -48,6 +48,12 @@ export const player = {
|
||||
playbackRate: 'Playback speed',
|
||||
miniPlayer: 'Mini Player',
|
||||
lyrics: 'Lyrics',
|
||||
fsNowPlaying: 'Now playing…',
|
||||
fsTrackPosition: 'Track {{current}} / {{total}}',
|
||||
fsNext: 'Next',
|
||||
fsUpNext: 'Up next',
|
||||
fsQueueEmpty: 'Nothing queued.',
|
||||
shuffle: 'Shuffle',
|
||||
fsLyricsToggle: 'Lyrics in fullscreen',
|
||||
lyricsLoading: 'Loading lyrics…',
|
||||
lyricsNotFound: 'No lyrics found for this track',
|
||||
|
||||
@@ -48,6 +48,12 @@ export const player = {
|
||||
playbackRate: 'Velocidad',
|
||||
miniPlayer: 'Mini reproductor',
|
||||
lyrics: 'Letras',
|
||||
fsNowPlaying: 'Reproduciendo…',
|
||||
fsTrackPosition: 'Pista {{current}} / {{total}}',
|
||||
fsNext: 'Siguiente',
|
||||
fsUpNext: 'A continuación',
|
||||
fsQueueEmpty: 'Nada en cola.',
|
||||
shuffle: 'Aleatorio',
|
||||
fsLyricsToggle: 'Letras en pantalla completa',
|
||||
lyricsLoading: 'Cargando letras…',
|
||||
lyricsNotFound: 'No se encontraron letras para esta pista',
|
||||
|
||||
@@ -48,6 +48,12 @@ export const player = {
|
||||
playbackRate: 'Vitesse',
|
||||
miniPlayer: 'Mini-lecteur',
|
||||
lyrics: 'Paroles',
|
||||
fsNowPlaying: "Lecture en cours…",
|
||||
fsTrackPosition: "Piste {{current}} / {{total}}",
|
||||
fsNext: "Suivant",
|
||||
fsUpNext: "À suivre",
|
||||
fsQueueEmpty: "File d'attente vide.",
|
||||
shuffle: "Aléatoire",
|
||||
fsLyricsToggle: 'Paroles en plein écran',
|
||||
lyricsLoading: 'Chargement des paroles…',
|
||||
lyricsNotFound: 'Aucune parole trouvée pour ce titre',
|
||||
|
||||
@@ -48,6 +48,12 @@ export const player = {
|
||||
playbackRate: 'Hastighet',
|
||||
miniPlayer: 'Minispiller',
|
||||
lyrics: 'Sangtekst',
|
||||
fsNowPlaying: 'Spilles nå…',
|
||||
fsTrackPosition: 'Spor {{current}} / {{total}}',
|
||||
fsNext: 'Neste',
|
||||
fsUpNext: 'Neste',
|
||||
fsQueueEmpty: 'Ingenting i køen.',
|
||||
shuffle: 'Tilfeldig',
|
||||
fsLyricsToggle: 'Sangtekst i fullskjerm',
|
||||
lyricsLoading: 'Laster sangtekst…',
|
||||
lyricsNotFound: 'Ingen sangtekst funnet for dette sporet',
|
||||
|
||||
@@ -48,6 +48,12 @@ export const player = {
|
||||
playbackRate: 'Snelheid',
|
||||
miniPlayer: 'Minispeler',
|
||||
lyrics: 'Songtekst',
|
||||
fsNowPlaying: 'Wordt afgespeeld…',
|
||||
fsTrackPosition: 'Track {{current}} / {{total}}',
|
||||
fsNext: 'Volgende',
|
||||
fsUpNext: 'Hierna',
|
||||
fsQueueEmpty: 'Niets in de wachtrij.',
|
||||
shuffle: 'Shuffle',
|
||||
fsLyricsToggle: 'Songtekst in volledig scherm',
|
||||
lyricsLoading: 'Songtekst laden…',
|
||||
lyricsNotFound: 'Geen songtekst gevonden voor dit nummer',
|
||||
|
||||
@@ -48,6 +48,12 @@ export const player = {
|
||||
playbackRate: 'Viteză',
|
||||
miniPlayer: 'Player Mini',
|
||||
lyrics: 'Versuri',
|
||||
fsNowPlaying: 'Se redă acum…',
|
||||
fsTrackPosition: 'Piesa {{current}} / {{total}}',
|
||||
fsNext: 'Următoarea',
|
||||
fsUpNext: 'Urmează',
|
||||
fsQueueEmpty: 'Nimic în coadă.',
|
||||
shuffle: 'Amestecă',
|
||||
fsLyricsToggle: 'Versuri în ecran complet',
|
||||
lyricsLoading: 'Se încarcă versurile…',
|
||||
lyricsNotFound: 'Niciun vers găsit pentru această piesă',
|
||||
|
||||
@@ -48,6 +48,12 @@ export const player = {
|
||||
playbackRate: 'Скорость',
|
||||
miniPlayer: 'Мини-плеер',
|
||||
lyrics: 'Текст',
|
||||
fsNowPlaying: 'Сейчас играет…',
|
||||
fsTrackPosition: 'Трек {{current}} / {{total}}',
|
||||
fsNext: 'Далее',
|
||||
fsUpNext: 'Далее',
|
||||
fsQueueEmpty: 'Очередь пуста.',
|
||||
shuffle: 'Перемешать',
|
||||
lyricsLoading: 'Загрузка текста…',
|
||||
lyricsNotFound: 'Текст не найден',
|
||||
lyricsNoSources: 'Источники текста не выбраны — включите их в Настройки → Текст',
|
||||
|
||||
@@ -48,6 +48,12 @@ export const player = {
|
||||
playbackRate: '速度',
|
||||
miniPlayer: '迷你播放器',
|
||||
lyrics: '歌词',
|
||||
fsNowPlaying: '正在播放…',
|
||||
fsTrackPosition: '曲目 {{current}} / {{total}}',
|
||||
fsNext: '下一首',
|
||||
fsUpNext: '即将播放',
|
||||
fsQueueEmpty: '队列为空。',
|
||||
shuffle: '随机播放',
|
||||
fsLyricsToggle: '全屏歌词',
|
||||
lyricsLoading: '正在加载歌词…',
|
||||
lyricsNotFound: '未找到此曲目的歌词',
|
||||
|
||||
Reference in New Issue
Block a user