feat(mukke): display album cover art in library, playlists, and song lists

Add batch cover-url endpoint (POST /library/cover-urls) to efficiently
resolve multiple cover art presigned URLs in a single request. Integrate
cover art display across all UI surfaces: album grid, album detail header,
song list thumbnails, playlist grid, and playlist detail song list.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-19 20:59:45 +01:00
parent 789ce0a435
commit e848fa5342
81 changed files with 376 additions and 58 deletions

View file

@ -16,6 +16,7 @@ scores:
security: 82
ux: 88
status: 'production'
version: '1.0.0'
stats:
backendModules: 13
webRoutes: 19

View file

@ -16,6 +16,7 @@ scores:
security: 82
ux: 80
status: 'production'
version: '0.3.0'
stats:
backendModules: 9
webRoutes: 24

View file

@ -16,6 +16,7 @@ scores:
security: 60
ux: 55
status: 'beta'
version: '0.2.0'
stats:
backendModules: 7
webRoutes: 17

View file

@ -16,6 +16,7 @@ scores:
security: 85
ux: 85
status: 'production'
version: '1.0.0'
stats:
backendModules: 14
webRoutes: 20

View file

@ -16,6 +16,7 @@ scores:
security: 68
ux: 65
status: 'beta'
version: '0.1.0'
stats:
backendModules: 5
webRoutes: 15

View file

@ -16,6 +16,7 @@ scores:
security: 72
ux: 75
status: 'beta'
version: '0.2.0'
stats:
backendModules: 0
webRoutes: 33

View file

@ -16,6 +16,7 @@ scores:
security: 55
ux: 68
status: 'alpha'
version: '0.2.0'
stats:
backendModules: 2
webRoutes: 19

View file

@ -16,6 +16,7 @@ scores:
security: 88
ux: 82
status: 'production'
version: '0.2.0'
stats:
backendModules: 0
webRoutes: 7

View file

@ -16,6 +16,7 @@ scores:
security: 78
ux: 60
status: 'beta'
version: '0.2.0'
stats:
backendModules: 11
webRoutes: 16

View file

@ -16,6 +16,7 @@ scores:
security: 68
ux: 55
status: 'beta'
version: '0.2.0'
stats:
backendModules: 8
webRoutes: 10

View file

@ -16,6 +16,7 @@ scores:
security: 65
ux: 55
status: 'beta'
version: '0.2.0'
stats:
backendModules: 7
webRoutes: 12

View file

@ -16,6 +16,7 @@ scores:
security: 80
ux: 78
status: 'production'
version: '0.3.0'
stats:
backendModules: 11
webRoutes: 19

View file

@ -16,6 +16,7 @@ scores:
security: 55
ux: 50
status: 'alpha'
version: '0.1.0'
stats:
backendModules: 6
webRoutes: 12

View file

@ -16,6 +16,7 @@ scores:
security: 55
ux: 68
status: 'beta'
version: '0.2.0'
stats:
backendModules: 7
webRoutes: 16

View file

@ -16,6 +16,7 @@ scores:
security: 55
ux: 55
status: 'alpha'
version: '0.1.0'
stats:
backendModules: 8
webRoutes: 12

View file

@ -16,6 +16,7 @@ scores:
security: 65
ux: 72
status: 'beta'
version: '0.2.0'
stats:
backendModules: 4
webRoutes: 6

View file

@ -16,6 +16,7 @@ scores:
security: 72
ux: 55
status: 'beta'
version: '0.2.0'
stats:
backendModules: 10
webRoutes: 17

View file

@ -16,6 +16,7 @@ scores:
security: 82
ux: 85
status: 'production'
version: '1.0.0'
stats:
backendModules: 7
webRoutes: 13

View file

@ -16,6 +16,7 @@ scores:
security: 55
ux: 35
status: 'alpha'
version: '0.0.1'
stats:
backendModules: 7
webRoutes: 0

View file

@ -16,6 +16,7 @@ scores:
security: 70
ux: 75
status: 'beta'
version: '0.2.0'
stats:
backendModules: 5
webRoutes: 13

View file

@ -0,0 +1 @@
export const APP_VERSION = '0.2.0';

View file

@ -5,6 +5,7 @@
import { creditsService } from '$lib/api/credits';
import type { CreditBalance } from '$lib/api/credits';
import { userSettings } from '$lib/stores/user-settings.svelte';
import { APP_VERSION } from '$lib/version';
let loading = $state(true);
let savingProfile = $state(false);
@ -333,5 +334,7 @@
</div>
</Card>
</div>
<p class="mt-8 pb-4 text-center text-xs text-gray-400 dark:text-gray-600">v{APP_VERSION}</p>
{/if}
</div>

View file

@ -8,6 +8,7 @@
import AppSlider from '$lib/components/AppSlider.svelte';
import LanguageSelector from '$lib/components/LanguageSelector.svelte';
import { authStore } from '$lib/stores/auth.svelte';
import { APP_VERSION } from '$lib/version';
// Get translations based on current locale
const translations = $derived(getLoginTranslations($locale || 'de'));
@ -42,6 +43,7 @@
{translations}
{verified}
{initialEmail}
version={APP_VERSION}
>
{#snippet headerControls()}
<LanguageSelector />