From b11882c99372a95b61d8994fefdc6de506631b0a Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Tue, 8 Sep 2026 11:20:17 +0200 Subject: [PATCH] feat: improve sync --- backend/src/manager/rooms/index.ts | 9 ++-- backend/src/manager/rooms/room.d.ts | 1 + backend/src/routes/room/update.ts | 3 +- web/src/components/player/PlayerControls.vue | 3 ++ web/src/components/player/ProgressBar.vue | 7 ++- .../components/playlists/UserPlaylists.vue | 11 +--- web/src/components/shared/SharedQueue.vue | 52 ++++++++++--------- web/src/scss/components/progressbar.scss | 4 ++ web/src/ts/dtype/global.d.ts | 5 ++ web/src/ts/messages/index.ts | 28 ++++++++-- web/src/ts/player/index.ts | 6 +-- web/src/ts/player/playlists/add.ts | 6 +-- web/src/ts/player/playlists/index.ts | 5 +- web/src/ts/shared/index.ts | 4 ++ web/src/ts/shared/messageHandler.ts | 5 ++ web/src/ts/shared/state.ts | 6 +++ web/src/ts/userPlaylists/index.ts | 13 +++++ web/src/ts/userPlaylists/save.ts | 6 ++- web/src/views/SharedView.vue | 41 ++++++++++++++- 19 files changed, 160 insertions(+), 55 deletions(-) diff --git a/backend/src/manager/rooms/index.ts b/backend/src/manager/rooms/index.ts index 30f223b..aed0ea6 100644 --- a/backend/src/manager/rooms/index.ts +++ b/backend/src/manager/rooms/index.ts @@ -41,7 +41,8 @@ const create = ( name: string, uid: string ) => { 'index': 0, 'lastUpdate': new Date().getTime(), 'playing': false, - 'start': new Date().getTime() + 'start': new Date().getTime(), + 'offset': 0 } }; @@ -112,9 +113,10 @@ const close = ( name: string, uid: string ) => { * @param playing - Set to true if the player is playing currently * @param index - The current playback index * @param start - The timestamp where playback of the current song started + * @param offset - The playback offset from the start in seconds * @returns true if update succeeded */ -const updateState = ( room: string, uid: string, playing: boolean, index: number, start: number ) => { +const updateState = ( room: string, uid: string, playing: boolean, index: number, start: number, offset: number ) => { if ( !rooms[room] || rooms[room].owner !== uid ) { return false; } @@ -123,7 +125,8 @@ const updateState = ( room: string, uid: string, playing: boolean, index: number 'playing': playing, 'index': index, 'lastUpdate': new Date().getTime(), - 'start': start + 'start': start, + 'offset': offset }; return sendUpdate( room, 'state' ); diff --git a/backend/src/manager/rooms/room.d.ts b/backend/src/manager/rooms/room.d.ts index 3d85963..6c95162 100644 --- a/backend/src/manager/rooms/room.d.ts +++ b/backend/src/manager/rooms/room.d.ts @@ -20,6 +20,7 @@ export interface Room { 'start': number; 'playing': boolean; 'lastUpdate': number; + 'offset': number; }; 'owner': string; 'clients': Client[]; diff --git a/backend/src/routes/room/update.ts b/backend/src/routes/room/update.ts index ddf36d2..18b4c63 100644 --- a/backend/src/routes/room/update.ts +++ b/backend/src/routes/room/update.ts @@ -79,7 +79,8 @@ const routes = ( app: express.Application, foss: boolean, config: Config ) => { sdk.getUID( request )!, request.body.playing ?? false, request.body.index ?? -1, - request.body.start ?? new Date().getTime() + request.body.start ?? new Date().getTime(), + request.body.offset ?? 0 ) ) response.sendStatus( 200 ); else diff --git a/web/src/components/player/PlayerControls.vue b/web/src/components/player/PlayerControls.vue index d4f8277..6570030 100644 --- a/web/src/components/player/PlayerControls.vue +++ b/web/src/components/player/PlayerControls.vue @@ -8,6 +8,7 @@ import { beautifyTime } from '@/ts/util/time'; + import messages from '@/ts/messages'; import player from '@/ts/player'; const playbackPercentage = player.playbackPercentage; @@ -42,6 +43,8 @@ const duration = computed( () => { return beautifyTime( player.duration.value ); } ); + + messages.useRoomWatchers();