diff --git a/apps/web/src/app/xtream-tauri/data-sources/xtream-data-source.interface.ts b/apps/web/src/app/xtream-tauri/data-sources/xtream-data-source.interface.ts index 18bb044ed..fa90cc7ae 100644 --- a/apps/web/src/app/xtream-tauri/data-sources/xtream-data-source.interface.ts +++ b/apps/web/src/app/xtream-tauri/data-sources/xtream-data-source.interface.ts @@ -1,10 +1,14 @@ import { InjectionToken } from '@angular/core'; import { + PlaybackPositionData, XtreamCategory, XtreamLiveStream, XtreamSerieItem, XtreamVodStream, } from 'shared-interfaces'; + +// Re-export for backward compatibility +export { PlaybackPositionData }; import { XtreamCredentials, CategoryType, StreamType } from '../services/xtream-api.service'; /** @@ -75,21 +79,6 @@ export interface RecentlyViewedItem extends XtreamContentItem { viewed_at: string; } -/** - * Playback position data for resume functionality - */ -export interface PlaybackPositionData { - contentXtreamId: number; - contentType: 'vod' | 'episode'; - seriesXtreamId?: number; - seasonNumber?: number; - episodeNumber?: number; - positionSeconds: number; - durationSeconds?: number; - playlistId?: string; - updatedAt?: string; -} - /** * Database category type mapping (differs from API type) */ diff --git a/apps/web/src/app/xtream-tauri/stores/features/with-playback-positions.feature.ts b/apps/web/src/app/xtream-tauri/stores/features/with-playback-positions.feature.ts index 3056b110d..c7c87c417 100644 --- a/apps/web/src/app/xtream-tauri/stores/features/with-playback-positions.feature.ts +++ b/apps/web/src/app/xtream-tauri/stores/features/with-playback-positions.feature.ts @@ -318,6 +318,7 @@ export function withPlaybackPositions() { if (duration === 0) duration = 1; // Fallback + // Setting position = duration indicates episode is fully watched const data: PlaybackPositionData = { contentXtreamId: id, contentType: 'episode', diff --git a/libs/services/src/lib/playback-position.service.ts b/libs/services/src/lib/playback-position.service.ts index d9dc98181..7149967fe 100644 --- a/libs/services/src/lib/playback-position.service.ts +++ b/libs/services/src/lib/playback-position.service.ts @@ -1,10 +1,14 @@ import { Injectable } from '@angular/core'; +import { PlaybackPositionData } from 'shared-interfaces'; @Injectable({ providedIn: 'root', }) export class PlaybackPositionService { - async savePlaybackPosition(playlistId: string, data: any): Promise { + async savePlaybackPosition( + playlistId: string, + data: PlaybackPositionData + ): Promise { try { await window.electron.dbSavePlaybackPosition(playlistId, data); } catch (error) { @@ -16,7 +20,7 @@ export class PlaybackPositionService { playlistId: string, contentXtreamId: number, contentType: 'vod' | 'episode' - ): Promise { + ): Promise { try { return await window.electron.dbGetPlaybackPosition( playlistId, @@ -32,7 +36,7 @@ export class PlaybackPositionService { async getSeriesPlaybackPositions( playlistId: string, seriesXtreamId: number - ): Promise { + ): Promise { try { return await window.electron.dbGetSeriesPlaybackPositions( playlistId, @@ -47,7 +51,7 @@ export class PlaybackPositionService { async getRecentPlaybackPositions( playlistId: string, limit?: number - ): Promise { + ): Promise { try { return await window.electron.dbGetRecentPlaybackPositions( playlistId, @@ -59,7 +63,7 @@ export class PlaybackPositionService { } } - async getAllPlaybackPositions(playlistId: string): Promise { + async getAllPlaybackPositions(playlistId: string): Promise { try { return await window.electron.dbGetAllPlaybackPositions(playlistId); } catch (error) { diff --git a/libs/shared/interfaces/src/index.ts b/libs/shared/interfaces/src/index.ts index 90f8a9c2e..4b1c63f02 100644 --- a/libs/shared/interfaces/src/index.ts +++ b/libs/shared/interfaces/src/index.ts @@ -10,6 +10,7 @@ export * from './lib/ipc-command.class'; export * from './lib/ipc-commands'; export * from './lib/language.enum'; export * from './lib/parsed-playlist.interface'; +export * from './lib/playback-position.interface'; export * from './lib/playlist-meta.type'; export * from './lib/playlist.interface'; export * from './lib/settings.interface'; diff --git a/libs/shared/interfaces/src/lib/playback-position.interface.ts b/libs/shared/interfaces/src/lib/playback-position.interface.ts new file mode 100644 index 000000000..6c50ca80f --- /dev/null +++ b/libs/shared/interfaces/src/lib/playback-position.interface.ts @@ -0,0 +1,14 @@ +/** + * Playback position data for resume functionality + */ +export interface PlaybackPositionData { + contentXtreamId: number; + contentType: 'vod' | 'episode'; + seriesXtreamId?: number; + seasonNumber?: number; + episodeNumber?: number; + positionSeconds: number; + durationSeconds?: number; + playlistId?: string; + updatedAt?: string; +}