diff --git a/publish/changeLog.md b/publish/changeLog.md index acf12f1d..da2015c7 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -5,6 +5,10 @@ - 新增是否在通知栏显示歌曲图片设置,默认开启(原来的行为) - 新增黑色皮肤“黑灯瞎火” +### 优化 + +- 现在即使切歌模式处于单曲循环、顺序播放、禁用时,手动切歌将会按照列表循环的规则处理(#69) + ### 修复 - 修复wy源搜索某些歌曲时第一页之后的歌曲无法加载的问题 diff --git a/src/config/constant.js b/src/config/constant.js index 42271eae..45c55d14 100644 --- a/src/config/constant.js +++ b/src/config/constant.js @@ -25,3 +25,19 @@ export const NAV_VIEW_NAMES = { } export const LXM_FILE_EXT_RXP = /\.(json|lxmc)$/ + +export const MUSIC_TOGGLE_MODE = { + listLoop: 'listLoop', // 列表循环 + random: 'random', // 列表随机 + list: 'list', // 顺序播放 + singleLoop: 'singleLoop', // 单曲循环 + none: 'none', // 禁用 +} + +export const MUSIC_TOGGLE_MODE_LIST = [ + MUSIC_TOGGLE_MODE.listLoop, + MUSIC_TOGGLE_MODE.random, + MUSIC_TOGGLE_MODE.list, + MUSIC_TOGGLE_MODE.singleLoop, + MUSIC_TOGGLE_MODE.none, +] diff --git a/src/config/defaultSetting.js b/src/config/defaultSetting.js index a2b85209..efd811a6 100644 --- a/src/config/defaultSetting.js +++ b/src/config/defaultSetting.js @@ -1,11 +1,12 @@ // const path = require('path') // const os = require('os') // const { isMac } = require('./utils') +import { MUSIC_TOGGLE_MODE } from './constant' const defaultSetting = { version: '1.18', player: { - togglePlayMethod: 'listLoop', + togglePlayMethod: MUSIC_TOGGLE_MODE.listLoop, highQuality: false, isSavePlayTime: false, cacheSize: 1024, // unit MB diff --git a/src/plugins/player/service.js b/src/plugins/player/service.js index 33ed63e9..d48dff2b 100644 --- a/src/plugins/player/service.js +++ b/src/plugins/player/service.js @@ -105,7 +105,7 @@ export default async() => { TrackPlayer.addEventListener(TPEvent.PlaybackState, async info => { const state = store.getState() - console.log('playback-state', TPState[info.state]) + // console.log('playback-state', TPState[info.state]) // console.log((await getCurrentTrack())?.id) if (state.player.isGettingUrl) return @@ -187,7 +187,7 @@ export default async() => { if (retryTrack) { if (retryTrack.musicId == retryGetUrlId) { if (++retryGetUrlNum > 1) { - store.dispatch(playerAction.playNext()) + store.dispatch(playerAction.playNext(true)) retryGetUrlId = null retryTrack = null return @@ -198,7 +198,7 @@ export default async() => { } store.dispatch(playerAction.refreshMusicUrl(global.playInfo.currentPlayMusicInfo, errorTime)) } else { - store.dispatch(playerAction.playNext()) + store.dispatch(playerAction.playNext(true)) } } // // if (!info.nextTrack) return diff --git a/src/screens/PlayDetail/Landscape/MoreBtn/PlayModeBtn.js b/src/screens/PlayDetail/Landscape/MoreBtn/PlayModeBtn.js index 3b808cd7..1746a2d7 100644 --- a/src/screens/PlayDetail/Landscape/MoreBtn/PlayModeBtn.js +++ b/src/screens/PlayDetail/Landscape/MoreBtn/PlayModeBtn.js @@ -4,12 +4,7 @@ import { Icon } from '@/components/common/Icon' import { useGetter, useDispatch } from '@/store' import { toast } from '@/utils/tools' import { useTranslation } from '@/plugins/i18n' -const playNextModes = [ - 'listLoop', - 'random', - 'list', - 'singleLoop', -] +import { MUSIC_TOGGLE_MODE_LIST, MUSIC_TOGGLE_MODE } from '@/config/constant' export default memo(({ width }) => { const togglePlayMethod = useGetter('common', 'togglePlayMethod') @@ -18,22 +13,22 @@ export default memo(({ width }) => { const { t } = useTranslation() const toggleNextPlayMode = () => { - let index = playNextModes.indexOf(togglePlayMethod) - if (++index >= playNextModes.length) index = -1 - const mode = playNextModes[index] + let index = MUSIC_TOGGLE_MODE_LIST.indexOf(togglePlayMethod) + if (++index >= MUSIC_TOGGLE_MODE_LIST.length) index = 0 + const mode = MUSIC_TOGGLE_MODE_LIST[index] setPlayNextMode(mode || '') let modeName switch (mode) { - case 'listLoop': + case MUSIC_TOGGLE_MODE.listLoop: modeName = 'play_list_loop' break - case 'random': + case MUSIC_TOGGLE_MODE.random: modeName = 'play_list_random' break - case 'list': + case MUSIC_TOGGLE_MODE.list: modeName = 'play_list_order' break - case 'singleLoop': + case MUSIC_TOGGLE_MODE.singleLoop: modeName = 'play_single_loop' break default: @@ -46,16 +41,16 @@ export default memo(({ width }) => { const playModeIcon = useMemo(() => { let playModeIcon = null switch (togglePlayMethod) { - case 'listLoop': + case MUSIC_TOGGLE_MODE.listLoop: playModeIcon = 'list-loop' break - case 'random': + case MUSIC_TOGGLE_MODE.random: playModeIcon = 'list-random' break - case 'list': + case MUSIC_TOGGLE_MODE.list: playModeIcon = 'list-order' break - case 'singleLoop': + case MUSIC_TOGGLE_MODE.singleLoop: playModeIcon = 'single-loop' break default: diff --git a/src/screens/PlayDetail/Portrait/Player/components/MoreBtn/PlayModeBtn.js b/src/screens/PlayDetail/Portrait/Player/components/MoreBtn/PlayModeBtn.js index b8148311..3765d563 100644 --- a/src/screens/PlayDetail/Portrait/Player/components/MoreBtn/PlayModeBtn.js +++ b/src/screens/PlayDetail/Portrait/Player/components/MoreBtn/PlayModeBtn.js @@ -4,12 +4,7 @@ import { Icon } from '@/components/common/Icon' import { useGetter, useDispatch } from '@/store' import { toast } from '@/utils/tools' import { useTranslation } from '@/plugins/i18n' -const playNextModes = [ - 'listLoop', - 'random', - 'list', - 'singleLoop', -] +import { MUSIC_TOGGLE_MODE_LIST, MUSIC_TOGGLE_MODE } from '@/config/constant' export default memo(() => { const togglePlayMethod = useGetter('common', 'togglePlayMethod') @@ -18,22 +13,22 @@ export default memo(() => { const { t } = useTranslation() const toggleNextPlayMode = () => { - let index = playNextModes.indexOf(togglePlayMethod) - if (++index >= playNextModes.length) index = -1 - const mode = playNextModes[index] - setPlayNextMode(mode || '') + let index = MUSIC_TOGGLE_MODE_LIST.indexOf(togglePlayMethod) + if (++index >= MUSIC_TOGGLE_MODE_LIST.length) index = 0 + const mode = MUSIC_TOGGLE_MODE_LIST[index] + setPlayNextMode(mode) let modeName switch (mode) { - case 'listLoop': + case MUSIC_TOGGLE_MODE.listLoop: modeName = 'play_list_loop' break - case 'random': + case MUSIC_TOGGLE_MODE.random: modeName = 'play_list_random' break - case 'list': + case MUSIC_TOGGLE_MODE.list: modeName = 'play_list_order' break - case 'singleLoop': + case MUSIC_TOGGLE_MODE.singleLoop: modeName = 'play_single_loop' break default: @@ -46,16 +41,16 @@ export default memo(() => { const playModeIcon = useMemo(() => { let playModeIcon = null switch (togglePlayMethod) { - case 'listLoop': + case MUSIC_TOGGLE_MODE.listLoop: playModeIcon = 'list-loop' break - case 'random': + case MUSIC_TOGGLE_MODE.random: playModeIcon = 'list-random' break - case 'list': + case MUSIC_TOGGLE_MODE.list: playModeIcon = 'list-order' break - case 'singleLoop': + case MUSIC_TOGGLE_MODE.singleLoop: playModeIcon = 'single-loop' break default: diff --git a/src/store/modules/player/action.js b/src/store/modules/player/action.js index 2ecc40db..900b5351 100644 --- a/src/store/modules/player/action.js +++ b/src/store/modules/player/action.js @@ -23,7 +23,7 @@ import { playInfo as playInfoGetter } from './getter' import { play as lrcPlay, setLyric, pause as lrcPause, toggleTranslation as lrcToggleTranslation } from '@/utils/lyric' import { showLyric, hideLyric, setLyric as lrcdSetLyric, toggleLock, setTheme, setLyricTextPosition, setAlpha, setTextSize } from '@/utils/lyricDesktop' import { action as listAction } from '@/store/modules/list' -import { LIST_ID_PLAY_LATER } from '@/config/constant' +import { LIST_ID_PLAY_LATER, MUSIC_TOGGLE_MODE } from '@/config/constant' import { i18n } from '@/plugins/i18n' // import { defaultList } from '../list/getter' @@ -630,15 +630,15 @@ export const playPrev = () => async(dispatch, getState) => { let nextIndex = currentIndex if (!playInfo.isTempPlay) { switch (common.setting.player.togglePlayMethod) { - case 'random': + case MUSIC_TOGGLE_MODE.random: nextIndex = getRandom(0, filteredList.length) break - case 'listLoop': - case 'list': + case MUSIC_TOGGLE_MODE.listLoop: + case MUSIC_TOGGLE_MODE.list: + case MUSIC_TOGGLE_MODE.singleLoop: + case MUSIC_TOGGLE_MODE.none: nextIndex = currentIndex === 0 ? filteredList.length - 1 : currentIndex - 1 break - case 'singleLoop': - break default: nextIndex = -1 return @@ -652,7 +652,7 @@ export const playPrev = () => async(dispatch, getState) => { })) } -export const playNext = () => async(dispatch, getState) => { +export const playNext = isAutoToggle => async(dispatch, getState) => { const { player, common } = getState() if (player.tempPlayList.length) { const playMusicInfo = player.tempPlayList[0] @@ -705,24 +705,32 @@ export const playNext = () => async(dispatch, getState) => { } const currentIndex = listPlayIndex let nextIndex = currentIndex - switch (common.setting.player.togglePlayMethod) { - case 'listLoop': + let togglePlayMethod = common.setting.player.togglePlayMethod + if (isAutoToggle !== true) { + switch (togglePlayMethod) { + case MUSIC_TOGGLE_MODE.list: + case MUSIC_TOGGLE_MODE.singleLoop: + case MUSIC_TOGGLE_MODE.none: + togglePlayMethod = MUSIC_TOGGLE_MODE.listLoop + } + } + switch (togglePlayMethod) { + case MUSIC_TOGGLE_MODE.listLoop: nextIndex = currentIndex === filteredList.length - 1 ? 0 : currentIndex + 1 break - case 'random': + case MUSIC_TOGGLE_MODE.random: nextIndex = getRandom(0, filteredList.length) break - case 'list': + case MUSIC_TOGGLE_MODE.list: nextIndex = currentIndex === filteredList.length - 1 ? -1 : currentIndex + 1 break - case 'singleLoop': + case MUSIC_TOGGLE_MODE.singleLoop: break default: nextIndex = -1 break } - console.log(nextIndex) if (nextIndex < 0) { dispatch(setStatus({ status: STATUS.stop, text: i18n.t('stopped') })) lrcPause()