From 5a66fe2e1aede2c4734bb08f86c81a60e7b454c5 Mon Sep 17 00:00:00 2001 From: Yuzi0201 <2205816944@qq.com> Date: Sun, 26 Jun 2022 23:41:10 +0800 Subject: [PATCH] add a queue to manage the random play list --- .../components/TrackList/TrackList.vue | 10 ++++ src/renderer/store/actions.js | 60 +++++++++++++++++-- src/renderer/store/getters.js | 2 +- src/renderer/store/modules/playlist.js | 18 ++++++ src/renderer/store/mutation-types.js | 5 ++ 5 files changed, 88 insertions(+), 7 deletions(-) diff --git a/src/renderer/components/TrackList/TrackList.vue b/src/renderer/components/TrackList/TrackList.vue index 28cf263d..6dda6771 100644 --- a/src/renderer/components/TrackList/TrackList.vue +++ b/src/renderer/components/TrackList/TrackList.vue @@ -23,6 +23,7 @@ import { mapActions } from 'vuex'; import TrackItem from './TrackItem.vue'; import CenteredTip from '@/components/CenteredTip.vue'; +import { LOOP_MODE } from '@/store/modules/playlist'; /** @typedef {{ event: string, icon: string, title: string }} TrackListShortcut */ @@ -82,6 +83,7 @@ export default { 'playTrackIndex', 'toggleCollectPopup', 'insertTrackIntoPlaylist', + 'insertTrackIntoRandomPlaylist', 'playPlaylist' ]), handleCollect(id) { @@ -103,6 +105,11 @@ export default { queueTrack(index) { if (this.findTrackInPlaylist(index) > -1) { // track exists in playlist + if (this.playlist.loopMode == LOOP_MODE.RANDOM) { + this.insertTrackIntoRandomPlaylist(index); + this.$toast.message('已添加下一首播放 _(:з」∠)_'); + return; + } this.$toast.message('已经在播放列表中了 ( >﹏<。)~'); return; } @@ -111,6 +118,9 @@ export default { source: this.source, index: this.playlist.index + 1 }); + if (this.playlist.loopMode == LOOP_MODE.RANDOM) { + this.insertTrackIntoRandomPlaylist(this.playlist.index + 1); + } this.$toast.message('已添加下一首播放 _(:з」∠)_'); }, handleQueue(index) { diff --git a/src/renderer/store/actions.js b/src/renderer/store/actions.js index 9f837658..690400db 100644 --- a/src/renderer/store/actions.js +++ b/src/renderer/store/actions.js @@ -414,12 +414,28 @@ export async function playTrackIndex({ state, commit, dispatch }, index) { /** * @param {ActionContext} param0 */ -export function playNextTrack({ dispatch, getters }) { - const { index, list, loopMode } = getters.queue; +export function playNextTrack({ commit, dispatch, getters }) { + const { index, list, loopMode, randomHeardList, randomHeardListPointer } = getters.queue; let nextIndex; switch (loopMode) { case LOOP_MODE.RANDOM: - nextIndex = Math.floor(Math.random() * list.length); + if (!randomHeardList.length) {//第一次切歌,将当次歌曲也放入 + //randomHeardList.push(index); + commit(types.PUSH_RANDOMLIST_HEARD_LIST, index); + nextIndex = Math.floor(Math.random() * list.length); + //randomHeardList.push(nextIndex); + commit(types.PUSH_RANDOMLIST_HEARD_LIST, nextIndex); + commit(types.SET_RANDOMLIST_POINTER, 1); + } + else if (randomHeardListPointer === randomHeardList.length - 1) {//若已到队列尾部,随机生成新歌 + nextIndex = Math.floor(Math.random() * list.length); + commit(types.PUSH_RANDOMLIST_HEARD_LIST, nextIndex); + commit(types.SET_RANDOMLIST_POINTER, randomHeardListPointer + 1); + } + else {//否则,使用队列里的歌曲 + nextIndex = randomHeardList[randomHeardListPointer + 1]; + commit(types.SET_RANDOMLIST_POINTER, randomHeardListPointer + 1); + } break; default: nextIndex = (index + 1) % list.length; @@ -431,12 +447,28 @@ export function playNextTrack({ dispatch, getters }) { /** * @param {ActionContext} param0 */ -export function playPreviousTrack({ dispatch, getters }) { - const { index, list, loopMode } = getters.queue; +export function playPreviousTrack({ commit, dispatch, getters }) { + const { index, list, loopMode, randomHeardList, randomHeardListPointer } = getters.queue; let nextIndex; switch (loopMode) { case LOOP_MODE.RANDOM: - nextIndex = Math.floor(Math.random() * list.length); + if (!randomHeardList.length) { + nextIndex = Math.floor(Math.random() * list.length); + commit(types.UNSHIFT_RANDOMLIST_HEARD_LIST, index); + commit(types.UNSHIFT_RANDOMLIST_HEARD_LIST, nextIndex); + // randomHeardList.unshift(index); + // randomHeardList.unshift(nextIndex); + commit(types.SET_RANDOMLIST_POINTER, 0); + } + else if (randomHeardListPointer === 0) {//若在队列头部,则在队列头插入随机新歌,此时指针不用变! + nextIndex = Math.floor(Math.random() * list.length); + //randomHeardList.unshift(nextIndex); + commit(types.UNSHIFT_RANDOMLIST_HEARD_LIST, nextIndex); + } + else { + nextIndex = randomHeardList[randomHeardListPointer - 1]; + commit(types.SET_RANDOMLIST_POINTER, randomHeardListPointer - 1); + } break; default: nextIndex = (index + list.length - 1) % list.length; @@ -462,6 +494,8 @@ export async function playPlaylist({ commit, dispatch, state }, { tracks, source } if (firstIndex === -1 && state.playlist.loopMode === LOOP_MODE.RANDOM) { firstIndex = Math.floor(Math.random() * list.length); + commit(types.CLEAR_RANDOMLIST); + commit(types.SET_RANDOMLIST_POINTER, 0);//换歌单了,重置随机队列 } if (firstIndex === -1) { firstIndex = 0; @@ -587,6 +621,8 @@ export function nextLoopMode({ commit, state }) { commit(types.SET_LOOP_MODE_SINGLE); break; case LOOP_MODE.SINGLE: + commit(types.CLEAR_RANDOMLIST);//换播放方式了,重置随机队列 + commit(types.SET_RANDOMLIST_POINTER, 0); commit(types.SET_LOOP_MODE_RANDOM); break; case LOOP_MODE.RANDOM: @@ -609,10 +645,22 @@ export function insertTrackIntoPlaylist({ commit, state }, payload) { commit(types.INSERT_TRACK_INTO_PLAYLIST, { tracks: payload.tracks, index }); } +/** + * @param {ActionContext} param0 + * @param {number} payload + */ +export function insertTrackIntoRandomPlaylist({ commit, state }, payload) { + if (state.playlist.randomHeardList.length == 0) + commit(types.PUSH_RANDOMLIST_HEARD_LIST, 0); + commit(types.INSERT_TRACK_INTO_RANDOM_PLAYLIST, payload); +} + /** * @param {ActionContext} param0 */ export function removeTrackFromPlaylist({ getters, commit, dispatch }, payload) { + commit(types.CLEAR_RANDOMLIST);//删歌了,重置随机队列 + commit(types.SET_RANDOMLIST_POINTER, 0); const playingId = getters.playing.id; commit(types.REMOVE_TRACK_FROM_PLAYLIST, payload); if (playingId !== getters.playing.id) { diff --git a/src/renderer/store/getters.js b/src/renderer/store/getters.js index 21bc1bfe..2732765b 100644 --- a/src/renderer/store/getters.js +++ b/src/renderer/store/getters.js @@ -5,7 +5,7 @@ /** * @param {State} state - * @returns {{ index: number, loopMode: number, list: Models.Track[] }} + * @returns {{ index: number, loopMode: number, list: Models.Track[], randomHeardList: number[], randomHeardListPointer: number }} */ export function queue(state) { if (state.ui.radioMode === true) { diff --git a/src/renderer/store/modules/playlist.js b/src/renderer/store/modules/playlist.js index 7a558c00..5e43cb4d 100644 --- a/src/renderer/store/modules/playlist.js +++ b/src/renderer/store/modules/playlist.js @@ -11,6 +11,9 @@ const state = { loopMode: LOOP_MODE.LIST, /** @type {Models.Track[]} */ list: [], + /** @type {[number]} */ + randomHeardList: [], + randomHeardListPointer: 0, }; /** @@ -36,6 +39,21 @@ const mutations = { [types.SET_LOOP_MODE_RANDOM](state) { state.loopMode = LOOP_MODE.RANDOM; }, + [types.PUSH_RANDOMLIST_HEARD_LIST](state, payload) { + state.randomHeardList.push(payload); + }, + [types.UNSHIFT_RANDOMLIST_HEARD_LIST](state, payload) { + state.randomHeardList.unshift(payload); + }, + [types.SET_RANDOMLIST_POINTER](state, payload) { + state.randomHeardListPointer = payload; + }, + [types.CLEAR_RANDOMLIST](state) { + state.randomHeardList = []; + }, + [types.INSERT_TRACK_INTO_RANDOM_PLAYLIST](state, payload) { + state.randomHeardList.splice(state.randomHeardListPointer + 1, 0, payload); + }, [types.RESTORE_PLAYLIST](state, { index, loopMode, list }) { state.index = index || 0; state.loopMode = loopMode || LOOP_MODE.LIST; diff --git a/src/renderer/store/mutation-types.js b/src/renderer/store/mutation-types.js index d567c8cb..05f2798a 100644 --- a/src/renderer/store/mutation-types.js +++ b/src/renderer/store/mutation-types.js @@ -46,6 +46,11 @@ export const SET_CURRENT_INDEX = 'SET_CURRENT_INDEX'; export const SET_LOOP_MODE_LIST = 'SET_LOOP_MODE_LOOP'; export const SET_LOOP_MODE_SINGLE = 'SET_LOOP_MODE_SINGLE'; export const SET_LOOP_MODE_RANDOM = 'SET_LOOP_MODE_RANDOM'; +export const PUSH_RANDOMLIST_HEARD_LIST = 'PUSH_RANDOMLIST_HEARD_LIST'; +export const UNSHIFT_RANDOMLIST_HEARD_LIST = 'UNSHIFT_RANDOMLIST_HEARD_LIST'; +export const SET_RANDOMLIST_POINTER = 'SET_RANDOMLIST_POINTER' +export const CLEAR_RANDOMLIST = 'CLEAR_RANDOMLIST'; +export const INSERT_TRACK_INTO_RANDOM_PLAYLIST = 'INSERT_TRACK_INTO_RANDOM_PLAYLIST'; export const RESTORE_PLAYLIST = 'RESTORE_PLAYLIST'; export const INSERT_TRACK_INTO_PLAYLIST = 'INSERT_TRACK_INTO_PLAYLIST'; export const REMOVE_TRACK_FROM_PLAYLIST = 'REMOVE_TRACK_FROM_PLAYLIST';