Skip to content

Commit

Permalink
renderer: store: remember random play order
Browse files Browse the repository at this point in the history
  • Loading branch information
rocka committed Jul 10, 2023
1 parent cdbe67b commit c01a67c
Show file tree
Hide file tree
Showing 8 changed files with 152 additions and 168 deletions.
11 changes: 2 additions & 9 deletions src/renderer/components/PlayerBar/VirtualCurrentPlaylist.vue
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ import { mapActions } from 'vuex';
import { workerExecute } from '@/worker/message';
import CenteredTip from '@/components/CenteredTip.vue';
import { LOOP_MODE } from '@/store/modules/playlist';
const SourceName = {
list: '歌单',
Expand Down Expand Up @@ -137,9 +136,7 @@ export default {
if (this.ui.radioMode) return '私人 FM';
if (this.showFindInput && this.findInput) return `找到 ${this.filteredList.length}`;
return `${this.queue.list.length}`;
},
/** @returns {import('@/store/modules/playlist').State} */
playlist() { return this.$store.state.playlist; },
}
},
methods: {
...mapActions([
Expand All @@ -148,8 +145,7 @@ export default {
'clearPlaylist',
'playTrackIndex',
'toggleCollectPopup',
'removeTrackFromPlaylist',
'insertTrackIntoRandomPlaylist',
'removeTrackFromPlaylist'
]),
toggleFindInput() {
this.showFindInput = !this.showFindInput;
Expand Down Expand Up @@ -184,9 +180,6 @@ export default {
if (this.indexMap.size > 0 && this.indexMap.has(index)) {
i = this.indexMap.get(index);
}
if (this.playlist.loopMode == LOOP_MODE.RANDOM) {
this.insertTrackIntoRandomPlaylist({ index: i, offset: 0 });
}
this.playTrackIndex(i);
},
sourceTipText(track) {
Expand Down
37 changes: 1 addition & 36 deletions src/renderer/components/TrackList/TrackList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ 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 */
Expand Down Expand Up @@ -83,8 +82,6 @@ export default {
'playTrackIndex',
'toggleCollectPopup',
'insertTrackIntoPlaylist',
'insertTrackIntoRandomPlaylist',
'generateRandomHeardList',
'playPlaylist'
]),
handleCollect(id) {
Expand All @@ -106,11 +103,6 @@ export default {
queueTrack(index) {
if (this.findTrackInPlaylist(index) > -1) {
// track exists in playlist
if (this.playlist.loopMode == LOOP_MODE.RANDOM) {
this.insertTrackIntoRandomPlaylist({index,offset: 1});
this.$toast.message('已添加下一首播放 _(:з」∠)_');
return;
}
this.$toast.message('已经在播放列表中了 ( >﹏<。)~');
return;
}
Expand All @@ -119,13 +111,6 @@ export default {
source: this.source,
index: this.playlist.index + 1
});
if (this.playlist.loopMode == LOOP_MODE.RANDOM) {
if (this.playlist.randomHeardList.length == 0) {//若列表为空,直接生成
this.generateRandomHeardList(this.playlist.list.length);
}
else //否则插入
this.insertTrackIntoRandomPlaylist({ index:this.playlist.index + 1 ,offset:1});
}
this.$toast.message('已添加下一首播放 _(:з」∠)_');
},
handleQueue(index) {
Expand All @@ -137,26 +122,6 @@ export default {
},
playTrack(index) {
const i = this.findTrackInPlaylist(index);
if (this.playlist.loopMode == LOOP_MODE.RANDOM) {
if (i > -1) {
// track exists in playlist
this.insertTrackIntoRandomPlaylist({index: i,offset: 0});
this.playTrackIndex(i);
return;
}
if (this.playlist.randomHeardList.length == 0) {
this.generateRandomHeardList(this.playlist.list.length);
}
this.insertTrackIntoPlaylist({
tracks: [this.trackDetails[index]],
source: this.source,
index: this.playlist.index,
});
const newIndex = this.findTrackInPlaylist(index);
this.insertTrackIntoRandomPlaylist({ index:newIndex, offset: 0 });
this.playTrackIndex(newIndex);
return;
}
if (i > -1) {
// track exists in playlist
this.playTrackIndex(i);
Expand All @@ -176,7 +141,7 @@ export default {
this.activateRadio(false);
}
if (this.settings.autoReplacePlaylist) {
this.playPlaylist({ tracks: this.trackDetails, source: this.source, firstIndex: index });
this.playPlaylist({ tracks: this.trackDetails, source: this.source, start: index });
} else {
this.playTrack(index);
}
Expand Down
2 changes: 2 additions & 0 deletions src/renderer/components/TrackList/TrackListHeader.vue
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { mapActions } from 'vuex';
export default {
inheritAttrs: false,
props: {
/** @type {Vue.PropOptions<Models.Track[]>} */
tracks: {
type: Array,
required: true
Expand All @@ -32,6 +33,7 @@ export default {
}
},
computed: {
/** @returns {string} */
btnPlayText() {
return `播放全部 (${this.count || this.tracks.length})`;
}
Expand Down
138 changes: 61 additions & 77 deletions src/renderer/store/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -424,72 +424,58 @@ export async function playTrackIndex({ state, commit, dispatch }, index) {
if (state.ui.radioMode === true) {
commit(types.SET_RADIO_INDEX, index);
} else {
commit(types.SET_CURRENT_INDEX, index);
commit(types.SET_PLAYLIST_INDEX, index);
if (state.playlist.loopMode === LOOP_MODE.RANDOM) {
commit(types.GENERATE_RANDOM_PLAYLIST, index);
}
}
await dispatch('updateUiTrack');
dispatch('playAudio');
}

/**
* @param {ActionContext} param0
* @param {number} number
*/
export function playNextTrack({ commit, dispatch, getters }) {
let { index, list, loopMode, randomHeardList, randomHeardListPointer } = getters.queue;
export async function playTrackOffset({ commit, dispatch, state, getters }, payload) {
const { index, list, loopMode } = getters.queue;
let nextIndex;
switch (loopMode) {
case LOOP_MODE.RANDOM:
if (randomHeardList.length == 0) {
commit(types.GENERATE_RANDOM_HEARD_LIST, list.length);
randomHeardList = getters.queue.randomHeardList;
}
if (randomHeardListPointer == randomHeardList.length - 1) {
commit(types.SET_RANDOMLIST_POINTER, 0);
nextIndex = randomHeardList[0];
}
else {
nextIndex = randomHeardList[randomHeardListPointer + 1];
commit(types.SET_RANDOMLIST_POINTER, randomHeardListPointer + 1);
}
break;
default:
nextIndex = (index + 1) % list.length;
break;
if (loopMode === LOOP_MODE.RANDOM) {
const { randomIndex, randomList } = state.playlist;
const nextRandomIndex = (randomIndex + randomList.length + payload) % randomList.length;
commit(types.SET_RANDOM_PLAYLIST_INDEX, nextRandomIndex);
nextIndex = randomList[nextRandomIndex];
} else {
nextIndex = (index + list.length + payload) % list.length;
}
dispatch('playTrackIndex', nextIndex);
if (state.ui.radioMode === true) {
commit(types.SET_RADIO_INDEX, nextIndex);
} else {
commit(types.SET_PLAYLIST_INDEX, nextIndex);
}
await dispatch('updateUiTrack');
dispatch('playAudio');
}

/**
* @param {ActionContext} param0
*/
export function playPreviousTrack({ commit, dispatch, getters }) {
let { index, list, loopMode, randomHeardList, randomHeardListPointer } = getters.queue;
let nextIndex;
switch (loopMode) {
case LOOP_MODE.RANDOM:
if (randomHeardList.length == 0) {
commit(types.GENERATE_RANDOM_HEARD_LIST, list.length);
randomHeardList = getters.queue.randomHeardList;
}
if (randomHeardListPointer == 0) {
commit(types.SET_RANDOMLIST_POINTER, randomHeardList.length - 1);
nextIndex = randomHeardList[randomHeardList.length - 1];
}
else {
nextIndex = randomHeardList[randomHeardListPointer - 1];
commit(types.SET_RANDOMLIST_POINTER, randomHeardListPointer - 1);
}
break;
default:
nextIndex = (index + list.length - 1) % list.length;
break;
}
dispatch('playTrackIndex', nextIndex);
export function playNextTrack({ dispatch }) {
dispatch('playTrackOffset', 1);
}

/**
* @param {ActionContext} param0
*/
export async function playPlaylist({ commit, dispatch, state }, { tracks, source, firstIndex = -1 }) {
export function playPreviousTrack({ dispatch }) {
dispatch('playTrackOffset', -1);
}

/**
* @param {ActionContext} param0
* @param {{ tracks: Models.Track[], source?: any, start?: number }}
*/
export async function playPlaylist({ commit, dispatch, state }, { tracks, source, start = -1 }) {
const list = [];
for (const t of tracks) {
if (source) {
Expand All @@ -501,24 +487,25 @@ export async function playPlaylist({ commit, dispatch, state }, { tracks, source
if (state.ui.radioMode === true) {
commit(types.ACTIVATE_RADIO, false);
}
if (firstIndex === -1 && state.playlist.loopMode === LOOP_MODE.RANDOM) {
//firstIndex = Math.floor(Math.random() * list.length);
commit(types.GENERATE_RANDOM_HEARD_LIST, list.length);//换歌单了,重置随机队列
firstIndex = state.playlist.randomHeardList[0];
}
if (firstIndex === -1) {
firstIndex = 0;
let nextIndex;
if (start === -1) {
if (state.playlist.loopMode === LOOP_MODE.RANDOM) {
nextIndex = Math.floor(Math.random() * list.length);
commit(types.GENERATE_RANDOM_PLAYLIST, nextIndex);
} else {
nextIndex = 0;
}
} else {
nextIndex = start;
}
dispatch('playTrackIndex', firstIndex);
dispatch('playTrackIndex', nextIndex);
}

/**
* @param {ActionContext} context
*/
export function clearPlaylist({ commit, dispatch }) {
commit(types.SET_PLAY_LIST, []);
commit(types.SET_CURRENT_INDEX, 0);
commit(types.GENERATE_RANDOM_HEARD_LIST, 0);
commit(types.CLEAR_PLAY_LIST);
dispatch('updateUiTrack');
}

Expand Down Expand Up @@ -548,6 +535,9 @@ export async function restorePlaylist({ commit }) {
}
}
commit(types.RESTORE_PLAYLIST, { index, list, loopMode });
if (loopMode === LOOP_MODE.RANDOM) {
commit(types.GENERATE_RANDOM_PLAYLIST, index);
}
}
} catch (e) {
console.error('restorePlaylist failed:', e); // eslint-disable-line no-console
Expand Down Expand Up @@ -625,13 +615,13 @@ export async function checkDownloaded({ commit }, { metadata }) {
* @param {ActionContext} param0
*/
export function nextLoopMode({ commit, state }) {
const { loopMode } = state.playlist;
const { index, loopMode } = state.playlist;
switch (loopMode) {
case LOOP_MODE.LIST:
commit(types.SET_LOOP_MODE_SINGLE);
break;
case LOOP_MODE.SINGLE:
commit(types.GENERATE_RANDOM_HEARD_LIST, state.playlist.list.length);//换播放方式了,重置随机队列
commit(types.GENERATE_RANDOM_PLAYLIST, index);
commit(types.SET_LOOP_MODE_RANDOM);
break;
case LOOP_MODE.RANDOM:
Expand All @@ -644,36 +634,30 @@ export function nextLoopMode({ commit, state }) {
* @param {ActionContext} param0
* @param {{ tracks: Models.Track[]; source?: any; index?: number }} payload
*/
export function insertTrackIntoPlaylist({ commit, state }, payload) {
export function insertTrackIntoPlaylist({ commit, state, getters }, payload) {
if (payload.source) {
for (const t of payload.tracks) {
t.source = payload.source;
}
}
const index = payload.index || state.playlist.index;
commit(types.INSERT_TRACK_INTO_PLAYLIST, { tracks: payload.tracks, index });
}

/**
* @param {ActionContext} param0
* @param {number} payload
*/
export function insertTrackIntoRandomPlaylist({ commit, state }, payload) {
commit(types.INSERT_TRACK_INTO_RANDOM_PLAYLIST, payload);
}

export function generateRandomHeardList({ commit, state }, payload) {
commit(types.GENERATE_RANDOM_HEARD_LIST, payload);
const start = payload.index || state.playlist.index;
commit(types.INSERT_TRACK_INTO_PLAYLIST, { tracks: payload.tracks, start });
if (getters.queue.loopMode === LOOP_MODE.RANDOM) {
commit(types.INSERT_TRACK_INTO_RANDOM_PLAYLIST, { start, count: payload.tracks.length });
}
}

/**
* @param {ActionContext} param0
* @param {{ start: number; count: number }} payload
*/
export function removeTrackFromPlaylist({ getters, commit, dispatch }, payload) {
const playingId = getters.playing.id;
const { index, loopMode } = getters.queue;
commit(types.REMOVE_TRACK_FROM_PLAYLIST, payload);
commit(types.GENERATE_RANDOM_HEARD_LIST, getters.queue.list.length);//删歌了,重置随机队列
if (playingId !== getters.playing.id) {
if (loopMode === LOOP_MODE.RANDOM) {
commit(types.REMOVE_TRACK_FROM_RANDOM_PLAYLIST, payload);
}
if (index >= payload.start) {
dispatch('updateUiTrack');
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/renderer/store/getters.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

/**
* @param {State} state
* @typedef {{ index: number, loopMode: number, list: Models.Track[], randomHeardList: number[], randomHeardListPointer: number }} QueueGetter
* @typedef {{ index: number, loopMode: number, list: Models.Track[] }} QueueGetter
* @returns {QueueGetter}
*/
export function queue(state) {
Expand Down
10 changes: 6 additions & 4 deletions src/renderer/store/hooks.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,16 @@ function updatePlaylistTable(mutation) {
case SET_PLAY_LIST:
PlaylistDb.replace(mutation.payload);
break;
case INSERT_TRACK_INTO_PLAYLIST:
const { index, tracks } = mutation.payload;
PlaylistDb.insert(index, tracks);
case INSERT_TRACK_INTO_PLAYLIST: {
const { start, tracks } = mutation.payload;
PlaylistDb.insert(start, tracks);
break;
case REMOVE_TRACK_FROM_PLAYLIST:
}
case REMOVE_TRACK_FROM_PLAYLIST: {
const { start, count } = mutation.payload;
PlaylistDb.remove(start, count);
break;
}
}
}

Expand Down
Loading

0 comments on commit c01a67c

Please sign in to comment.