Many improvemtns and fixes related to decoupling of svelte and rust on android.
🏗️ Build and Test JellyTau / Run Tests (push) Failing after 18s
🏗️ Build and Test JellyTau / Build Android APK (push) Has been skipped
Traceability Validation / Check Requirement Traces (push) Failing after 2s

This commit is contained in:
2026-02-28 19:50:47 +01:00
parent 07f3bf04ca
commit e8e37649fa
53 changed files with 2309 additions and 792 deletions
+7 -7
View File
@@ -97,9 +97,9 @@
await invoke("player_cycle_repeat");
}
// Use track's own ID for artwork (primaryImageTag corresponds to track ID)
// Album art is inherited from album, so all tracks show the same album cover
const artworkItemId = $derived(displayMedia?.id);
// Prefer album ID for artwork (all tracks in an album share the same cover)
// Falls back to track ID if no album ID available
const artworkItemId = $derived(displayMedia?.albumId || displayMedia?.id);
// Show optimistic position while seeking or waiting for backend confirmation
const displayPosition = $derived(seeking || seekPending ? seekValue : rawPosition);
@@ -137,12 +137,12 @@
{#if displayMedia}
<div class="fixed inset-0 z-50 flex flex-col overflow-y-auto">
<!-- Background image (blurred) -->
{#if artworkItemId && displayMedia?.primaryImageTag}
{#if artworkItemId}
<div class="fixed inset-0 z-0">
<CachedImage
itemId={artworkItemId}
imageType="Primary"
tag={displayMedia.primaryImageTag}
tag={displayMedia?.primaryImageTag}
maxWidth={800}
alt=""
class="w-full h-full object-cover blur-3xl opacity-30"
@@ -217,11 +217,11 @@
<!-- Artwork -->
<div class="flex-1 flex items-center justify-center p-8 min-h-0">
<div class="w-full max-w-md aspect-square rounded-lg overflow-hidden shadow-2xl flex-shrink-0">
{#if artworkItemId && displayMedia?.primaryImageTag}
{#if artworkItemId}
<CachedImage
itemId={artworkItemId}
imageType="Primary"
tag={displayMedia.primaryImageTag}
tag={displayMedia?.primaryImageTag}
maxWidth={500}
alt={displayMedia?.name}
class="w-full h-full object-cover"
+10 -11
View File
@@ -145,6 +145,8 @@
function handleTouchStart(e: TouchEvent) {
touchStartX = e.touches[0].clientX;
touchStartY = e.touches[0].clientY;
touchEndX = touchStartX;
touchEndY = touchStartY;
isSwiping = true;
}
@@ -293,15 +295,13 @@
>
<!-- Media info -->
<div class="flex items-center gap-3 flex-1 min-w-0">
<!-- Artwork (clickable to expand) -->
<button
onclick={onExpand}
<!-- Artwork -->
<div
class="w-12 h-12 rounded bg-gray-800 flex-shrink-0 overflow-hidden"
aria-label="Open full player"
>
{#if displayMedia?.primaryImageTag}
{#if displayMedia}
<CachedImage
itemId={displayMedia.id}
itemId={displayMedia.albumId || displayMedia.id}
imageType="Primary"
tag={displayMedia.primaryImageTag}
maxWidth={100}
@@ -315,16 +315,15 @@
</svg>
</div>
{/if}
</button>
</div>
<!-- Title & Artist -->
<div class="flex-1 min-w-0">
<button
onclick={onExpand}
class="text-sm font-medium text-white truncate block w-full text-left hover:underline"
<div
class="text-sm font-medium text-white truncate block w-full text-left"
>
{displayMedia?.name}
</button>
</div>
<div class="text-xs text-gray-400 truncate flex items-center gap-1">
{#if displayMedia?.artistItems?.length}
{#each displayMedia?.artistItems as artist, i}
+4 -12
View File
@@ -372,22 +372,14 @@
// Call Rust backend to start playback
// Rust will choose ExoPlayer (Android), libmpv (Linux), or tell us to use HTML5
// Send minimal video data - no complex serialization to avoid Tauri Android issues
const response: any = await invoke("player_play_item", {
item: {
id: media.id,
title: media.name,
artist: null,
album: null,
duration: media.runTimeTicks ? media.runTimeTicks / 10000000 : null,
artworkUrl: null,
mediaType: "video",
streamUrl: currentStreamUrl,
jellyfinItemId: media.id,
title: media.name,
id: media.id,
videoCodec: needsTranscoding ? "hevc" : "h264",
needsTranscoding,
videoWidth: null,
videoHeight: null,
subtitles: subtitleTracks,
needsTranscoding: needsTranscoding,
},
});