diff --git a/src/enums.ts b/src/enums.ts index f4f55c7d..e12042e9 100644 --- a/src/enums.ts +++ b/src/enums.ts @@ -95,8 +95,9 @@ export interface DBSettings { removeRemasterInfo: boolean; mergeAlbums: boolean; showAlbumsAsSingles: boolean; - enablePeriodicScans: boolean - scanInterval: number + enablePeriodicScans: boolean; + scanInterval: number; + autoShuffle: boolean; plugins: Plugin[]; version: string; } diff --git a/src/helpers/usePlayFrom.ts b/src/helpers/usePlayFrom.ts index 42069347..18783dd8 100644 --- a/src/helpers/usePlayFrom.ts +++ b/src/helpers/usePlayFrom.ts @@ -33,6 +33,7 @@ export async function utilPlayFromArtist(index: number = 0) { const tracks = await getArtistTracks(artist.info.artisthash) tracklist.setFromArtist(artist.info.artisthash, artist.info.name, tracks) + tracklist.shuffleListIfAutoShuffle() queue.play(index) } @@ -48,6 +49,7 @@ export async function playFromAlbumCard(albumhash: string, albumname: string) { } tracklist.setFromAlbum(albumname, albumhash, tracks) + tracklist.shuffleListIfAutoShuffle() queue.play() } @@ -62,6 +64,7 @@ export async function playFromArtistCard(artisthash: string, artistname: string) } tracklist.setFromArtist(artisthash, artistname, tracks) + tracklist.shuffleListIfAutoShuffle() queue.play() } @@ -78,6 +81,7 @@ export async function playFromFolderCard(folderpath: string) { } tracklist.setFromFolder(folderpath, tracks) + tracklist.shuffleListIfAutoShuffle() queue.play() } @@ -98,6 +102,9 @@ export async function playFromFavorites(track: Track | undefined) { if (track) { index = tracklist.tracklist.findIndex(t => t.trackhash === track?.trackhash) } + else { + tracklist.shuffleListIfAutoShuffle() + } console.log(tracklist.tracklist) queue.play(index) @@ -118,6 +125,7 @@ export async function playFromPlaylist(id: string, track?: Track) { const index = tracks.findIndex(t => t.trackhash === track.trackhash) queue.play(index) } else { + tracklist.shuffleListIfAutoShuffle() queue.play() } } @@ -131,6 +139,7 @@ export const playFrom = async (source: playSources) => { const album = useAlbum() tracklist.setFromAlbum(album.info.title, album.info.albumhash, album.srcTracks) + tracklist.shuffleListIfAutoShuffle() queue.play() break } @@ -144,6 +153,7 @@ export const playFrom = async (source: playSources) => { await playlist.fetchAll(playlist.info.id, false, true) } tracklist.setFromPlaylist(playlist.info.name, playlist.info.id, playlist.tracks) + tracklist.shuffleListIfAutoShuffle() queue.play() break diff --git a/src/settings/audio/groups.ts b/src/settings/audio/groups.ts index b37d8dd5..964b1ae2 100644 --- a/src/settings/audio/groups.ts +++ b/src/settings/audio/groups.ts @@ -38,6 +38,14 @@ const crossfade: Setting = { show_if: () => settings().use_crossfade, } +const auto_shuffle: Setting = { + title: 'Auto shuffle tracklist', + desc: 'Shuffle tracklist before start playing Playlist / Artist / Album', + type: SettingType.binary, + state: () => settings().auto_shuffle, + action: () => settings().toggleAutoShuffle(), +} + // const streaming_quality_options = [ // { // title: 'Original', @@ -79,4 +87,4 @@ const crossfade: Setting = { // options: streaming_quality_options as any, // } -export default [use_silence, use_crossfade, crossfade] +export default [use_silence, use_crossfade, crossfade, auto_shuffle] diff --git a/src/stores/queue/tracklist.ts b/src/stores/queue/tracklist.ts index b8e48ee3..4ba94155 100644 --- a/src/stores/queue/tracklist.ts +++ b/src/stores/queue/tracklist.ts @@ -146,6 +146,12 @@ export default defineStore('tracklist', { shuffleList() { this.tracklist = shuffle(this.tracklist) }, + shuffleListIfAutoShuffle() { + const settings = useSettings() + if (settings.auto_shuffle) { + this.shuffleList() + } + }, removeByIndex(index: number) { const { currentindex, diff --git a/src/stores/settings/index.ts b/src/stores/settings/index.ts index 7cb6a24e..a70903b2 100644 --- a/src/stores/settings/index.ts +++ b/src/stores/settings/index.ts @@ -55,6 +55,7 @@ export default defineStore('settings', { use_crossfade: false, crossfade_duration: 2000, // milliseconds use_legacy_streaming_endpoint: false, + auto_shuffle: true, // layout layout: '', @@ -204,6 +205,9 @@ export default defineStore('settings', { toggleUseLegacyStreamingEndpoint() { this.use_legacy_streaming_endpoint = !this.use_legacy_streaming_endpoint }, + toggleAutoShuffle() { + this.auto_shuffle = !this.auto_shuffle + }, // layout 👇 toggleLayout() {