diff --git a/src/lib/components/immersive/ImmersiveHeader.svelte b/src/lib/components/immersive/ImmersiveHeader.svelte index 5ced02e94..b722abd0a 100644 --- a/src/lib/components/immersive/ImmersiveHeader.svelte +++ b/src/lib/components/immersive/ImmersiveHeader.svelte @@ -2,7 +2,7 @@ import { X, Disc3, LayoutGrid, Mic2, ListMusic, Music2, Info, Radio } from 'lucide-svelte'; import { t } from '$lib/i18n'; - export type ImmersiveTab = 'lyrics' | 'credits' | 'suggestions' | 'queue'; + export type ImmersiveTab = 'lyrics' | 'trackInfo' | 'suggestions' | 'queue'; export type DisplayMode = 'coverflow' | 'split' | 'lyrics-focus' | 'queue-focus'; interface Props { @@ -13,7 +13,7 @@ onClose: () => void; visible?: boolean; hasLyrics?: boolean; - hasCredits?: boolean; + hasTrackInfo?: boolean; hasSuggestions?: boolean; } @@ -25,13 +25,13 @@ onClose, visible = true, hasLyrics = true, - hasCredits = true, + hasTrackInfo = true, hasSuggestions = true }: Props = $props(); const tabs = $derived([ { id: 'lyrics' as const, label: $t('player.lyrics'), icon: Music2, enabled: hasLyrics }, - { id: 'credits' as const, label: $t('player.credits') || 'Credits', icon: Info, enabled: hasCredits }, + { id: 'trackInfo' as const, label: $t('player.trackInfo') || 'Track Info', icon: Info, enabled: hasTrackInfo }, { id: 'suggestions' as const, label: $t('player.suggestions') || 'Suggestions', icon: Radio, enabled: hasSuggestions }, { id: 'queue' as const, label: $t('player.queue') || 'Queue', icon: ListMusic, enabled: true }, ].filter(tab => tab.enabled)); diff --git a/src/lib/components/immersive/ImmersivePlayer.svelte b/src/lib/components/immersive/ImmersivePlayer.svelte index b56e198d0..33b8ef1f6 100644 --- a/src/lib/components/immersive/ImmersivePlayer.svelte +++ b/src/lib/components/immersive/ImmersivePlayer.svelte @@ -5,7 +5,7 @@ import ImmersiveHeader, { type ImmersiveTab, type DisplayMode } from './ImmersiveHeader.svelte'; import ImmersiveControls from './ImmersiveControls.svelte'; import LyricsPanel from './panels/LyricsPanel.svelte'; - import CreditsPanel from './panels/CreditsPanel.svelte'; + import TrackInfoPanel from './panels/TrackInfoPanel.svelte'; import SuggestionsPanel from './panels/SuggestionsPanel.svelte'; import QueuePanel from './panels/QueuePanel.svelte'; import CoverflowPanel from './panels/CoverflowPanel.svelte'; @@ -177,9 +177,9 @@ case 'L': if (displayMode === 'split') activeTab = 'lyrics'; break; - case 'c': - case 'C': - if (displayMode === 'split' && enableCredits) activeTab = 'credits'; + case 't': + case 'T': + if (displayMode === 'split' && enableCredits) activeTab = 'trackInfo'; break; case 's': case 'S': @@ -235,7 +235,7 @@ {onClose} visible={showUI} hasLyrics={true} - hasCredits={enableCredits} + hasTrackInfo={enableCredits} hasSuggestions={enableSuggestions} /> @@ -292,8 +292,8 @@ isLoading={lyricsLoading} error={lyricsError} /> - {:else if activeTab === 'credits'} - + {:else if activeTab === 'trackInfo'} + {:else if activeTab === 'suggestions'} {:else if activeTab === 'queue'} diff --git a/src/lib/components/immersive/index.ts b/src/lib/components/immersive/index.ts index a673a9c81..551c73dbe 100644 --- a/src/lib/components/immersive/index.ts +++ b/src/lib/components/immersive/index.ts @@ -7,7 +7,7 @@ export { default as ImmersiveControls } from './ImmersiveControls.svelte'; // Panels export { default as LyricsPanel } from './panels/LyricsPanel.svelte'; -export { default as CreditsPanel } from './panels/CreditsPanel.svelte'; +export { default as TrackInfoPanel } from './panels/TrackInfoPanel.svelte'; export { default as SuggestionsPanel } from './panels/SuggestionsPanel.svelte'; // Shared diff --git a/src/lib/components/immersive/panels/CreditsPanel.svelte b/src/lib/components/immersive/panels/CreditsPanel.svelte deleted file mode 100644 index 4150d4105..000000000 --- a/src/lib/components/immersive/panels/CreditsPanel.svelte +++ /dev/null @@ -1,72 +0,0 @@ - - -
-
-
- -
- Credits - Producer, Composer, Musicians... - Coming Soon -
-
- - diff --git a/src/lib/components/immersive/panels/QueuePanel.svelte b/src/lib/components/immersive/panels/QueuePanel.svelte index 1766a135c..87fc24527 100644 --- a/src/lib/components/immersive/panels/QueuePanel.svelte +++ b/src/lib/components/immersive/panels/QueuePanel.svelte @@ -48,7 +48,7 @@ {#if hasUpcoming && onClear} {/if} diff --git a/src/lib/components/immersive/panels/TrackInfoPanel.svelte b/src/lib/components/immersive/panels/TrackInfoPanel.svelte new file mode 100644 index 000000000..9e80bd3bd --- /dev/null +++ b/src/lib/components/immersive/panels/TrackInfoPanel.svelte @@ -0,0 +1,375 @@ + + +
+ {#if loading} +
+ + {$t('common.loading') || 'Loading...'} +
+ {:else if error} +
+ {$t('errors.failedToLoad') || 'Failed to load'} +
+ {:else if !trackId} +
+ + {$t('player.noTrackSelected') || 'No track selected'} +
+ {:else if trackInfo} +
+ +
+

{trackInfo.track.title}

+ {#if trackInfo.track.album?.title} +

{trackInfo.track.album.title}

+ {/if} +
+ + + + + + {#if groupedCredits.length > 0} +
+

{$t('player.credits') || 'Credits'}

+
+ {#each groupedCredits as { role, names }} +
+ {formatRole(role)} + {names.join(', ')} +
+ {/each} +
+
+ {/if} + + + {#if trackInfo.track.copyright} + + {/if} +
+ {/if} +
+ + diff --git a/src/lib/i18n/locales/en.json b/src/lib/i18n/locales/en.json index 703c0f2cf..2083cda18 100644 --- a/src/lib/i18n/locales/en.json +++ b/src/lib/i18n/locales/en.json @@ -254,6 +254,7 @@ "noLyrics": "No lyrics available", "fetchingLyrics": "Fetching lyrics...", "credits": "Credits", + "trackInfo": "Track Info", "suggestions": "Suggestions", "shuffle": "Shuffle", "repeat": "Repeat", diff --git a/src/lib/i18n/locales/es.json b/src/lib/i18n/locales/es.json index 448547fec..5bfc42e77 100644 --- a/src/lib/i18n/locales/es.json +++ b/src/lib/i18n/locales/es.json @@ -254,6 +254,7 @@ "noLyrics": "No hay letras disponibles", "fetchingLyrics": "Buscando letras...", "credits": "Créditos", + "trackInfo": "Info de Pista", "suggestions": "Sugerencias", "shuffle": "Aleatorio", "repeat": "Repetir",