diff --git a/src/locales/de.ts b/src/locales/de.ts
index 3e6cd223..d621b77c 100644
--- a/src/locales/de.ts
+++ b/src/locales/de.ts
@@ -661,6 +661,13 @@ export const deTranslation = {
themeSchedulerNightTheme: 'Nacht-Theme',
themeSchedulerNightStart: 'Nacht beginnt um',
themeSchedulerActiveHint: 'Theme-Zeitplan ist aktiv - Themes werden automatisch gewechselt.',
+ visualOptionsTitle: 'Visuelle Optionen',
+ coverArtBackground: 'Cover-Hintergrund',
+ coverArtBackgroundSub: 'Zeigt verschwommenes Cover als Hintergrund in Album/Playlist-Kopfzeilen',
+ playlistCoverPhoto: 'Playlist-Coverfoto',
+ playlistCoverPhotoSub: 'Zeigt Coverfoto-Raster in der Playlist-Detailansicht',
+ showBitrate: 'Bitrate anzeigen',
+ showBitrateSub: 'Audio-Bitrate in Track-Listen anzeigen',
uiScaleTitle: 'Interface-Skalierung',
uiScaleLabel: 'Zoom',
},
diff --git a/src/locales/en.ts b/src/locales/en.ts
index 0d7ccbfe..f275ef77 100644
--- a/src/locales/en.ts
+++ b/src/locales/en.ts
@@ -663,6 +663,13 @@ export const enTranslation = {
themeSchedulerNightTheme: 'Night Theme',
themeSchedulerNightStart: 'Night Starts At',
themeSchedulerActiveHint: 'Theme Scheduler is active - theme changes are managed automatically.',
+ visualOptionsTitle: 'Visual Options',
+ coverArtBackground: 'Cover Art Background',
+ coverArtBackgroundSub: 'Show blurred cover art as background in album/playlist headers',
+ playlistCoverPhoto: 'Playlist Cover Photo',
+ playlistCoverPhotoSub: 'Show cover photo grid in playlist detail view',
+ showBitrate: 'Show Bitrate',
+ showBitrateSub: 'Display audio bitrate in track listings',
uiScaleTitle: 'Interface Scale',
uiScaleLabel: 'Zoom',
},
diff --git a/src/locales/es.ts b/src/locales/es.ts
index 29eb8ab3..034cb8bd 100644
--- a/src/locales/es.ts
+++ b/src/locales/es.ts
@@ -664,6 +664,13 @@ export const esTranslation = {
themeSchedulerNightTheme: 'Tema de Noche',
themeSchedulerNightStart: 'Comienza de Noche A las',
themeSchedulerActiveHint: 'El Programador de Temas está activo — los cambios de tema se manejan automáticamente.',
+ visualOptionsTitle: 'Opciones Visuales',
+ coverArtBackground: 'Fondo de Portada',
+ coverArtBackgroundSub: 'Mostrar portada desenfocada como fondo en encabezados de álbumes y listas de reproducción',
+ playlistCoverPhoto: 'Foto de Portada de Playlist',
+ playlistCoverPhotoSub: 'Mostrar cuadrícula de fotos de portada en la vista detallada de playlists',
+ showBitrate: 'Mostrar Bitrate',
+ showBitrateSub: 'Mostrar bitrate de audio en las listas de pistas',
uiScaleTitle: 'Escala de Interfaz',
uiScaleLabel: 'Zoom',
},
diff --git a/src/locales/fr.ts b/src/locales/fr.ts
index b3270954..4887c515 100644
--- a/src/locales/fr.ts
+++ b/src/locales/fr.ts
@@ -659,6 +659,13 @@ export const frTranslation = {
themeSchedulerNightTheme: 'Thème de nuit',
themeSchedulerNightStart: 'Début de la nuit',
themeSchedulerActiveHint: 'Le planificateur de thème est actif - les thèmes changent automatiquement.',
+ visualOptionsTitle: 'Options Visuelles',
+ coverArtBackground: "Fond d'Art de Poche",
+ coverArtBackgroundSub: "Afficher la pochette floutée comme fond dans les en-têtes d'albums et de playlists",
+ playlistCoverPhoto: 'Photo de Couverture de Playlist',
+ playlistCoverPhotoSub: 'Afficher la grille de photos de couverture dans la vue détaillée des playlists',
+ showBitrate: 'Afficher le Débit',
+ showBitrateSub: 'Afficher le débit audio dans les listes de pistes',
uiScaleTitle: "Mise à l'échelle de l'interface",
uiScaleLabel: 'Zoom',
},
diff --git a/src/locales/nb.ts b/src/locales/nb.ts
index 68235cf9..73522001 100644
--- a/src/locales/nb.ts
+++ b/src/locales/nb.ts
@@ -658,6 +658,13 @@ export const nbTranslation = {
themeSchedulerNightTheme: 'Natttema',
themeSchedulerNightStart: 'Natt starter kl.',
themeSchedulerActiveHint: 'Temaplanlegger er aktiv - temaer byttes automatisk.',
+ visualOptionsTitle: 'Visuelle Alternativer',
+ coverArtBackground: 'Cover-bakgrunn',
+ coverArtBackgroundSub: 'Vis uskarpt cover som bakgrunn i album/playlist-overskrifter',
+ playlistCoverPhoto: 'Playlist-coverfoto',
+ playlistCoverPhotoSub: 'Vis coverfoto-rutenett i playlist-detailedvisning',
+ showBitrate: 'Vis Bitrate',
+ showBitrateSub: 'Vis audio-bitrate i sporlister',
uiScaleTitle: 'Grensesnittskala',
uiScaleLabel: 'Zoom',
},
diff --git a/src/locales/nl.ts b/src/locales/nl.ts
index 1253d6bc..ca98fa2b 100644
--- a/src/locales/nl.ts
+++ b/src/locales/nl.ts
@@ -658,6 +658,13 @@ export const nlTranslation = {
themeSchedulerNightTheme: 'Nachtthema',
themeSchedulerNightStart: 'Nacht begint om',
themeSchedulerActiveHint: "Thema-planner is actief - thema's worden automatisch gewisseld.",
+ visualOptionsTitle: 'Visuele Opties',
+ coverArtBackground: 'Cover Achtergrond',
+ coverArtBackgroundSub: 'Toon vervaagde cover als achtergrond in album/playlist headers',
+ playlistCoverPhoto: 'Playlist Coverfoto',
+ playlistCoverPhotoSub: 'Toon coverfoto raster in playlist detailweergave',
+ showBitrate: 'Toon Bitrate',
+ showBitrateSub: 'Toon audio bitrate in tracklijsten',
uiScaleTitle: 'Interface schaal',
uiScaleLabel: 'Zoom',
},
diff --git a/src/locales/ru.ts b/src/locales/ru.ts
index 9b71443f..4a24d23c 100644
--- a/src/locales/ru.ts
+++ b/src/locales/ru.ts
@@ -686,6 +686,13 @@ export const ruTranslation = {
themeSchedulerNightTheme: 'Ночная тема',
themeSchedulerNightStart: 'Ночь начинается в',
themeSchedulerActiveHint: 'Расписание тем активно - темы переключаются автоматически.',
+ visualOptionsTitle: 'Визуальные Настройки',
+ coverArtBackground: 'Фон Обложки',
+ coverArtBackgroundSub: 'Показывать размытую обложку как фон в заголовках альбомов и плейлистов',
+ playlistCoverPhoto: 'Обложка Плейлиста',
+ playlistCoverPhotoSub: 'Показывать сетку обложек в детальном виде плейлиста',
+ showBitrate: 'Показывать Битрейт',
+ showBitrateSub: 'Отображать битрейт аудио в списках треков',
uiScaleTitle: 'Масштаб интерфейса',
uiScaleLabel: 'Масштаб',
},
diff --git a/src/locales/zh.ts b/src/locales/zh.ts
index 987de952..d369d010 100644
--- a/src/locales/zh.ts
+++ b/src/locales/zh.ts
@@ -654,6 +654,13 @@ export const zhTranslation = {
themeSchedulerNightTheme: '夜晚主题',
themeSchedulerNightStart: '夜晚开始时间',
themeSchedulerActiveHint: '主题定时器已启用 - 主题将自动切换。',
+ visualOptionsTitle: '视觉选项',
+ coverArtBackground: '封面背景',
+ coverArtBackgroundSub: '在专辑/播放列表标题中显示模糊的封面作为背景',
+ playlistCoverPhoto: '播放列表封面照片',
+ playlistCoverPhotoSub: '在播放列表详细视图中显示封面照片网格',
+ showBitrate: '显示比特率',
+ showBitrateSub: '在曲目列表中显示音频比特率',
uiScaleTitle: '界面缩放',
uiScaleLabel: '缩放',
},
diff --git a/src/pages/PlaylistDetail.tsx b/src/pages/PlaylistDetail.tsx
index 6d49e0e9..90017df8 100644
--- a/src/pages/PlaylistDetail.tsx
+++ b/src/pages/PlaylistDetail.tsx
@@ -14,6 +14,7 @@ import { usePlaylistStore } from '../store/playlistStore';
import { useOfflineStore } from '../store/offlineStore';
import { useOfflineJobStore } from '../store/offlineJobStore';
import { useAuthStore } from '../store/authStore';
+import { useThemeStore } from '../store/themeStore';
import { useDownloadModalStore } from '../store/downloadModalStore';
import { invoke } from '@tauri-apps/api/core';
import { join } from '@tauri-apps/api/path';
@@ -45,10 +46,10 @@ function totalDurationLabel(songs: SubsonicSong[]): string {
return formatHumanHoursMinutes(total);
}
-function codecLabel(song: SubsonicSong): string {
+function codecLabel(song: SubsonicSong, showBitrate: boolean): string {
const parts: string[] = [];
if (song.suffix) parts.push(song.suffix.toUpperCase());
- if (song.bitRate) parts.push(`${song.bitRate} kbps`);
+ if (showBitrate && song.bitRate) parts.push(`${song.bitRate} kbps`);
return parts.join(' · ');
}
@@ -107,6 +108,10 @@ export default function PlaylistDetail() {
const setDownloadFolder = useAuthStore(s => s.setDownloadFolder);
const requestDownloadFolder = useDownloadModalStore(s => s.requestFolder);
+ const enableCoverArtBackground = useThemeStore(s => s.enableCoverArtBackground);
+ const enablePlaylistCoverPhoto = useThemeStore(s => s.enablePlaylistCoverPhoto);
+ const showBitrate = useThemeStore(s => s.showBitrate);
+
const [playlist, setPlaylist] = useState
(null);
const [songs, setSongs] = useState([]);
const [loading, setLoading] = useState(true);
@@ -540,10 +545,12 @@ export default function PlaylistDetail() {
{/* ── Hero ── */}
- {resolvedBgUrl && (
-
+ {resolvedBgUrl && enableCoverArtBackground && (
+ <>
+
+
+ >
)}
-