mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-14 12:30:06 +02:00
auto follow queue when autodj is triggered
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user