auto follow queue when autodj is triggered

This commit is contained in:
jeffvli
2025-12-28 14:34:38 -08:00
parent 0a54f7c44c
commit ffdef596ad
3 changed files with 39 additions and 0 deletions
+5
View File
@@ -1,6 +1,11 @@
import { LibraryItem, Song } from '/@/shared/types/domain-types'; import { LibraryItem, Song } from '/@/shared/types/domain-types';
export type AutoDJQueueAddedEventPayload = {
songCount: number;
};
export type EventMap = { export type EventMap = {
AUTODJ_QUEUE_ADDED: AutoDJQueueAddedEventPayload;
ITEM_LIST_REFRESH: ItemListRefreshEventPayload; ITEM_LIST_REFRESH: ItemListRefreshEventPayload;
ITEM_LIST_UPDATE_ITEM: ItemListUpdateItemEventPayload; ITEM_LIST_UPDATE_ITEM: ItemListUpdateItemEventPayload;
MEDIA_NEXT: MediaNextEventPayload; MEDIA_NEXT: MediaNextEventPayload;
@@ -11,16 +11,20 @@ import {
} from '/@/renderer/components/item-list/item-table-list/item-table-list'; } from '/@/renderer/components/item-list/item-table-list/item-table-list';
import { ItemTableListColumn } from '/@/renderer/components/item-list/item-table-list/item-table-list-column'; import { ItemTableListColumn } from '/@/renderer/components/item-list/item-table-list/item-table-list-column';
import { ItemListHandle } from '/@/renderer/components/item-list/types'; import { ItemListHandle } from '/@/renderer/components/item-list/types';
import { eventEmitter } from '/@/renderer/events/event-emitter';
import { useIsPlayerFetching, usePlayer } from '/@/renderer/features/player/context/player-context'; import { useIsPlayerFetching, usePlayer } from '/@/renderer/features/player/context/player-context';
import { searchLibraryItems } from '/@/renderer/features/shared/utils'; import { searchLibraryItems } from '/@/renderer/features/shared/utils';
import { useDragDrop } from '/@/renderer/hooks/use-drag-drop'; import { useDragDrop } from '/@/renderer/hooks/use-drag-drop';
import { import {
isShuffleEnabled,
mapShuffledToQueueIndex,
subscribeCurrentTrack, subscribeCurrentTrack,
subscribePlayerQueue, subscribePlayerQueue,
useListSettings, useListSettings,
usePlayerActions, usePlayerActions,
usePlayerQueueType, usePlayerQueueType,
usePlayerSong, usePlayerSong,
usePlayerStore,
useSettingsStore, useSettingsStore,
} from '/@/renderer/store'; } from '/@/renderer/store';
import { Flex } from '/@/shared/components/flex/flex'; import { Flex } from '/@/shared/components/flex/flex';
@@ -101,11 +105,35 @@ export const PlayQueue = forwardRef<ItemListHandle, QueueProps>(({ listKey, sear
} }
}); });
const handleAutoDJQueueAdded = () => {
if (followCurrentSong) {
const state = usePlayerStore.getState();
let index = state.player.index;
if (isShuffleEnabled(state)) {
index = mapShuffledToQueueIndex(index, state.queue.shuffled);
}
if (index !== -1) {
// Use setTimeout to ensure the DOM has updated with the new queue items
setTimeout(() => {
tableRef.current?.scrollToIndex(index, {
align: 'center',
behavior: 'auto',
});
}, 0);
}
}
};
eventEmitter.on('AUTODJ_QUEUE_ADDED', handleAutoDJQueueAdded);
setQueue(); setQueue();
return () => { return () => {
unsub(); unsub();
unsubCurrentTrack(); unsubCurrentTrack();
eventEmitter.off('AUTODJ_QUEUE_ADDED', handleAutoDJQueueAdded);
}; };
}, [getQueue, queueType, tableRef, followCurrentSong]); }, [getQueue, queueType, tableRef, followCurrentSong]);
@@ -2,6 +2,7 @@ import { useQueryClient } from '@tanstack/react-query';
import { useEffect } from 'react'; import { useEffect } from 'react';
import { queryKeys } from '/@/renderer/api/query-keys'; import { queryKeys } from '/@/renderer/api/query-keys';
import { eventEmitter } from '/@/renderer/events/event-emitter';
import { useIsPlayerFetching, usePlayer } from '/@/renderer/features/player/context/player-context'; import { useIsPlayerFetching, usePlayer } from '/@/renderer/features/player/context/player-context';
import { songsQueries } from '/@/renderer/features/songs/api/songs-api'; import { songsQueries } from '/@/renderer/features/songs/api/songs-api';
import { import {
@@ -198,6 +199,11 @@ export const useAutoDJ = () => {
// Add to the end of the queue // Add to the end of the queue
player.addToQueueByData(songsToAdd, Play.LAST); player.addToQueueByData(songsToAdd, Play.LAST);
// Emit event to trigger queue follow
eventEmitter.emit('AUTODJ_QUEUE_ADDED', {
songCount: songsToAdd.length,
});
} catch (error) { } catch (error) {
logFn.error(logMsg[LogCategory.PLAYER].autoPlayFailed, { logFn.error(logMsg[LogCategory.PLAYER].autoPlayFailed, {
category: LogCategory.PLAYER, category: LogCategory.PLAYER,