From 92a943c755667b3b2bd8c09138b7921cd5b30886 Mon Sep 17 00:00:00 2001 From: HasselAssel <71652213+HasselAssel@users.noreply.github.com> Date: Fri, 19 Dec 2025 08:13:56 +0100 Subject: [PATCH] Fixes 2 sync and UI bugs in music-together plugin (#4071) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/plugins/music-together/connection.ts | 5 +- src/plugins/music-together/index.ts | 58 ++++++++++++++++++++++- src/plugins/music-together/queue/queue.ts | 7 ++- 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/plugins/music-together/connection.ts b/src/plugins/music-together/connection.ts index a85ab061..7758fc5e 100644 --- a/src/plugins/music-together/connection.ts +++ b/src/plugins/music-together/connection.ts @@ -9,9 +9,11 @@ import delay from 'delay'; import type { Permission, Profile, VideoData } from './types'; export type ConnectionEventMap = { + CLEAR_QUEUE: {}; ADD_SONGS: { videoList: VideoData[]; index?: number }; REMOVE_SONG: { index: number }; MOVE_SONG: { fromIndex: number; toIndex: number }; + SET_INDEX: { index: number }; IDENTIFY: { profile: Profile } | undefined; SYNC_PROFILE: { profiles: Record } | undefined; SYNC_QUEUE: { videoList: VideoData[] } | undefined; @@ -171,9 +173,10 @@ export class Connection { public async broadcast( type: Event, payload: ConnectionEventMap[Event], + after?: ConnectionEventUnion[], ) { await Promise.all( - this.getConnections().map((conn) => conn.send({ type, payload })), + this.getConnections().map((conn) => conn.send({ type, payload, after })), ); } diff --git a/src/plugins/music-together/index.ts b/src/plugins/music-together/index.ts index 0c8dad21..d9590ca5 100644 --- a/src/plugins/music-together/index.ts +++ b/src/plugins/music-together/index.ts @@ -215,6 +215,25 @@ export default createPlugin< this.ignoreChange = true; switch (event.type) { + case 'CLEAR_QUEUE': { + if (conn && this.permission === 'host-only') { + await this.connection?.broadcast('SYNC_QUEUE', { + videoList: this.queue?.videoList ?? [], + }); + return; + } + + this.queue?.clear(); + await this.connection?.broadcast('CLEAR_QUEUE', {}); + break; + } + case 'SET_INDEX': { + this.queue?.setIndex(event.payload.index); + await this.connection?.broadcast('SET_INDEX', { + index: event.payload.index, + }); + break; + } case 'ADD_SONGS': { if (conn && this.permission === 'host-only') { await this.connection?.broadcast('SYNC_QUEUE', { @@ -234,7 +253,15 @@ export default createPlugin< await this.connection?.broadcast('ADD_SONGS', { ...event.payload, videoList, - }); + }, + event.after, + ); + + const afterevent = event.after?.at(0); + if (afterevent?.type === 'SET_INDEX') { + this.queue?.setIndex(afterevent.payload.index); + } + break; } case 'REMOVE_SONG': { @@ -385,6 +412,16 @@ export default createPlugin< const queueListener = async (event: ConnectionEventUnion) => { this.ignoreChange = true; switch (event.type) { + case 'CLEAR_QUEUE': { + await this.connection?.broadcast('CLEAR_QUEUE', {}); + break; + } + case 'SET_INDEX': { + await this.connection?.broadcast('SET_INDEX', { + index: event.payload.index, + }); + break; + } case 'ADD_SONGS': { await this.connection?.broadcast('ADD_SONGS', { ...event.payload, @@ -392,7 +429,9 @@ export default createPlugin< ...it, ownerId: it.ownerId ?? this.connection!.id, })), - }); + }, + event.after, + ); break; } case 'REMOVE_SONG': { @@ -420,6 +459,14 @@ export default createPlugin< const listener = async (event: ConnectionEventUnion) => { this.ignoreChange = true; switch (event.type) { + case 'CLEAR_QUEUE': { + this.queue?.clear(); + break; + } + case 'SET_INDEX': { + this.queue?.setIndex(event.payload.index); + break; + } case 'ADD_SONGS': { const videoList: VideoData[] = event.payload.videoList.map( (it) => ({ @@ -429,6 +476,13 @@ export default createPlugin< ); await this.queue?.addVideos(videoList, event.payload.index); + + const afterevent = event.after?.at(0); + if (afterevent?.type === 'SET_INDEX') { + this.queue?.setIndex(afterevent.payload.index); + } + + break; } case 'REMOVE_SONG': { diff --git a/src/plugins/music-together/queue/queue.ts b/src/plugins/music-together/queue/queue.ts index 3f6f6d0a..0503af76 100644 --- a/src/plugins/music-together/queue/queue.ts +++ b/src/plugins/music-together/queue/queue.ts @@ -314,6 +314,11 @@ export class Queue { if (!this.internalDispatch) { if (event.type === 'CLEAR') { this.ignoreFlag = true; + this.broadcast({ + type: 'CLEAR_QUEUE', + payload: {}, + }); + return; } if (event.type === 'ADD_ITEMS') { if (this.ignoreFlag) { @@ -347,7 +352,7 @@ export class Queue { }, after: [ { - type: 'SYNC_PROGRESS', + type: 'SET_INDEX', payload: { index, },