From ef39903a578ed8d663bd5fdd055ec1d2565f63f9 Mon Sep 17 00:00:00 2001 From: Stephan Orgiazzi Date: Sun, 30 Aug 2026 01:34:58 +0200 Subject: [PATCH] fix: keep player open after playback ends --- .../player/controller/usePlayerLifecycle.ts | 22 +------------------ src/features/player/model/playerState.ts | 2 -- src/integrations/mpv/constants.ts | 1 - src/integrations/mpv/stateUpdates.ts | 2 -- 4 files changed, 1 insertion(+), 26 deletions(-) diff --git a/src/features/player/controller/usePlayerLifecycle.ts b/src/features/player/controller/usePlayerLifecycle.ts index d1fd212..00ba38a 100644 --- a/src/features/player/controller/usePlayerLifecycle.ts +++ b/src/features/player/controller/usePlayerLifecycle.ts @@ -1,5 +1,5 @@ import { useEffect, useEffectEvent, type Dispatch, type SetStateAction } from "react"; -import { Effect, FiberSet, Queue, Schema, Semaphore, Stream } from "effect"; +import { Effect, Queue, Schema, Semaphore, Stream } from "effect"; import { getStartupMediaSource } from "@features/mediaOpen/startup"; import { listen } from "@tauri-apps/api/event"; import type { Window } from "@tauri-apps/api/window"; @@ -92,32 +92,12 @@ export function usePlayerLifecycle({ const lifecycle = Effect.scoped( Effect.gen(function* () { yield* Effect.addFinalizer(() => stopPlayer); - const runScoped = yield* FiberSet.makeRuntime(); const mediaSources = yield* Queue.sliding(1); const windowResizes = yield* Queue.sliding(1); const offerMediaSource = (request: MediaSourceRequest): void => { Effect.runSync(Queue.offer(mediaSources, request)); }; - let autoCloseStarted = false; - yield* Effect.acquireRelease( - Effect.sync(() => - player.subscribe((next) => { - if (!mounted || autoCloseStarted || !next.filename || !next.eofReached) { - return; - } - - autoCloseStarted = true; - runScoped( - lifecyclePromise("close window", "Failed to close window", () => - appWindow.close(), - ).pipe(Effect.catch((error) => Effect.logError(error.operation, error))), - ); - }), - ), - (unsubscribe) => Effect.sync(unsubscribe), - ); - yield* Effect.acquireRelease( optionalListener( lifecyclePromise("register drag listener", "Failed to listen for dropped media", () => diff --git a/src/features/player/model/playerState.ts b/src/features/player/model/playerState.ts index 0c2e7fa..b0f2719 100644 --- a/src/features/player/model/playerState.ts +++ b/src/features/player/model/playerState.ts @@ -16,7 +16,6 @@ export type PlayerState = { paused: boolean; pausedForCache: boolean; coreIdle: boolean; - eofReached: boolean; timePos: number; duration: number; volume: number; @@ -35,7 +34,6 @@ export const EMPTY_PLAYER_STATE: PlayerState = { paused: true, pausedForCache: false, coreIdle: false, - eofReached: false, timePos: 0, duration: 0, volume: DEFAULT_PLAYER_VOLUME, diff --git a/src/integrations/mpv/constants.ts b/src/integrations/mpv/constants.ts index 6a4e76b..400a76c 100644 --- a/src/integrations/mpv/constants.ts +++ b/src/integrations/mpv/constants.ts @@ -32,7 +32,6 @@ export const OBSERVED_PROPERTIES = [ ["pause", "flag"], ["paused-for-cache", "flag"], ["core-idle", "flag"], - ["eof-reached", "flag", "none"], ["time-pos", "double", "none"], ["duration", "double", "none"], ["volume", "double"], diff --git a/src/integrations/mpv/stateUpdates.ts b/src/integrations/mpv/stateUpdates.ts index bbda00f..8e93f1a 100644 --- a/src/integrations/mpv/stateUpdates.ts +++ b/src/integrations/mpv/stateUpdates.ts @@ -57,8 +57,6 @@ const PROPERTY_UPDATERS = { updateField(state, "pausedForCache", isMpvBoolean(value) ? value : false), "core-idle": (state, value) => updateField(state, "coreIdle", isMpvBoolean(value) ? value : false), - "eof-reached": (state, value) => - updateField(state, "eofReached", isMpvBoolean(value) ? value : false), "time-pos": (state, value) => updateField(state, "timePos", getNumberOrZero(value)), duration: (state, value) => updateField(state, "duration", getNumberOrZero(value)), volume: (state, value) => updateField(state, "volume", isMpvNumber(value) ? value : state.volume),