diff --git a/Dockerfile b/Dockerfile index da9ad5d..075a51e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -84,6 +84,7 @@ RUN cd src-tauri && cargo fetch && cd .. FROM builder AS test WORKDIR /app RUN echo "Running tests..." && \ + bunx svelte-kit sync && \ bun run test && \ cd src-tauri && cargo test && cd .. && \ echo "All tests passed!" diff --git a/docker-compose.yml b/docker-compose.yml index ff6f71a..2a42903 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,7 +12,7 @@ services: - .:/app environment: - RUST_BACKTRACE=1 - command: bash -c "bun test && cd src-tauri && cargo test && cd .. && echo 'All tests passed!'" + command: bash -c "bunx svelte-kit sync && bun test && cd src-tauri && cargo test && cd .. && echo 'All tests passed!'" # Android build service - builds APK after tests pass android-build: diff --git a/src-tauri/src/commands/repository.rs b/src-tauri/src/commands/repository.rs index 8491807..42036bd 100644 --- a/src-tauri/src/commands/repository.rs +++ b/src-tauri/src/commands/repository.rs @@ -369,6 +369,7 @@ pub fn repository_get_image_url( /// Get subtitle URL for a media item #[tauri::command] +#[allow(dead_code)] pub fn repository_get_subtitle_url( manager: State<'_, RepositoryManagerWrapper>, handle: String, @@ -383,6 +384,7 @@ pub fn repository_get_subtitle_url( /// Get video download URL with quality preset #[tauri::command] +#[allow(dead_code)] pub fn repository_get_video_download_url( manager: State<'_, RepositoryManagerWrapper>, handle: String, diff --git a/src-tauri/src/repository/mod.rs b/src-tauri/src/repository/mod.rs index f92c732..560f5ce 100644 --- a/src-tauri/src/repository/mod.rs +++ b/src-tauri/src/repository/mod.rs @@ -147,6 +147,8 @@ pub trait MediaRepository: Send + Sync { ) -> String; /// Get subtitle URL (synchronous - just constructs URL) + /// Called by frontend via Tauri invoke (getSubtitleUrl in VideoPlayer.svelte) + #[allow(dead_code)] fn get_subtitle_url( &self, item_id: &str, @@ -156,6 +158,8 @@ pub trait MediaRepository: Send + Sync { ) -> String; /// Get video download URL (synchronous - just constructs URL) + /// Called by frontend via Tauri invoke (getVideoDownloadUrl in VideoDownloadButton.svelte) + #[allow(dead_code)] fn get_video_download_url( &self, item_id: &str, diff --git a/src/lib/api/autoplay.ts b/src/lib/api/autoplay.ts index eb8e3f1..e82b7b3 100644 --- a/src/lib/api/autoplay.ts +++ b/src/lib/api/autoplay.ts @@ -6,6 +6,21 @@ import { invoke } from "@tauri-apps/api/core"; +export interface AutoplaySettings { + enabled: boolean; + countdownSeconds: number; +} + +export async function getAutoplaySettings(): Promise { + return invoke("player_get_autoplay_settings"); +} + +export async function setAutoplaySettings( + settings: AutoplaySettings +): Promise { + return invoke("player_set_autoplay_settings", { settings }); +} + export async function cancelAutoplayCountdown(): Promise { return invoke("player_cancel_autoplay_countdown"); } diff --git a/src/lib/api/backend-integration.test.ts b/src/lib/api/backend-integration.test.ts index 185f32a..e33da8b 100644 --- a/src/lib/api/backend-integration.test.ts +++ b/src/lib/api/backend-integration.test.ts @@ -2,7 +2,11 @@ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { invoke } from "@tauri-apps/api/core"; import { RepositoryClient } from "./repository-client"; -vi.mock("@tauri-apps/api/core"); +const mockInvoke = vi.fn(); + +vi.mock("@tauri-apps/api/core", () => ({ + invoke: mockInvoke, +})); /** * Integration tests documenting Phase 1 & 2 refactoring: diff --git a/src/lib/api/repository-client.test.ts b/src/lib/api/repository-client.test.ts index 1d9ec21..c04c343 100644 --- a/src/lib/api/repository-client.test.ts +++ b/src/lib/api/repository-client.test.ts @@ -2,7 +2,11 @@ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { invoke } from "@tauri-apps/api/core"; import { RepositoryClient } from "./repository-client"; -vi.mock("@tauri-apps/api/core"); +const mockInvoke = vi.fn(); + +vi.mock("@tauri-apps/api/core", () => ({ + invoke: mockInvoke, +})); describe("RepositoryClient", () => { let client: RepositoryClient; diff --git a/src/lib/components/common/ResultsCounter.svelte b/src/lib/components/common/ResultsCounter.svelte index 461f8c9..93bf1c1 100644 --- a/src/lib/components/common/ResultsCounter.svelte +++ b/src/lib/components/common/ResultsCounter.svelte @@ -25,8 +25,8 @@ playlist: { singular: "playlist", plural: "playlists" }, }; - const labels = itemTypeLabels[itemType] || { singular: itemType, plural: `${itemType}s` }; - const label = count === 1 ? labels.singular : labels.plural; + const labels = $derived(itemTypeLabels[itemType] || { singular: itemType, plural: `${itemType}s` }); + const label = $derived(count === 1 ? labels.singular : labels.plural);

diff --git a/src/lib/components/home/HeroBanner.svelte b/src/lib/components/home/HeroBanner.svelte index a37c2b9..6523a3d 100644 --- a/src/lib/components/home/HeroBanner.svelte +++ b/src/lib/components/home/HeroBanner.svelte @@ -160,6 +160,7 @@

+ {#if idx < track.artistItems.length - 1} , {/if} @@ -275,13 +277,15 @@ {#if showAlbum}
{#if track.albumId} - + {:else} {track.albumName || "-"} {/if} @@ -361,13 +365,15 @@ {#if showArtist && showAlbum} {#if track.artistItems && track.artistItems.length > 0} {#each track.artistItems as artist, idx} - + {#if idx < track.artistItems.length - 1} , {/if} @@ -377,26 +383,30 @@ {/if} {#if track.albumId} - + {:else} {track.albumName || "-"} {/if} {:else if showArtist} {#if track.artistItems && track.artistItems.length > 0} {#each track.artistItems as artist, idx} - + {#if idx < track.artistItems.length - 1} , {/if} @@ -406,13 +416,15 @@ {/if} {:else if showAlbum} {#if track.albumId} - + {:else} {track.albumName || "-"} {/if} diff --git a/src/lib/components/player/MiniPlayer.svelte b/src/lib/components/player/MiniPlayer.svelte index 661d344..6c9afdc 100644 --- a/src/lib/components/player/MiniPlayer.svelte +++ b/src/lib/components/player/MiniPlayer.svelte @@ -284,6 +284,7 @@