diff --git a/src/config/defaultSetting.ts b/src/config/defaultSetting.ts index 1e36c94..33095b4 100644 --- a/src/config/defaultSetting.ts +++ b/src/config/defaultSetting.ts @@ -17,6 +17,7 @@ const defaultSetting: LX.AppSetting = { 'player.startupAutoPlay': false, 'player.togglePlayMethod': 'listLoop', 'player.isPlayHighQuality': false, + 'player.playQuality': "128k", 'player.isSavePlayTime': false, 'player.volume': 1, 'player.playbackRate': 1, diff --git a/src/core/music/online.ts b/src/core/music/online.ts index 319f2c2..37aff87 100644 --- a/src/core/music/online.ts +++ b/src/core/music/online.ts @@ -52,7 +52,7 @@ export const getMusicUrl = async ({ musicInfo, quality, isRefresh, allowToggleSo // // return Promise.reject(new Error('该歌曲没有可播放的音频')) // } - const targetQuality = quality ?? getPlayQuality(settingState.setting['player.isPlayHighQuality'], musicInfo) + const targetQuality = quality ?? getPlayQuality(settingState.setting['player.playQuality'], musicInfo) const cachedUrl = await getStoreMusicUrl(musicInfo, targetQuality) if (cachedUrl && !isRefresh) return cachedUrl diff --git a/src/core/music/utils.ts b/src/core/music/utils.ts index dc7fed4..5c18364 100644 --- a/src/core/music/utils.ts +++ b/src/core/music/utils.ts @@ -208,10 +208,17 @@ export const getOnlineOtherSourcePicByLocal = async (musicInfo: LX.Music.MusicIn }) } -export const getPlayQuality = (highQuality: boolean, musicInfo: LX.Music.MusicInfoOnline): LX.Quality => { +// export const getPlayQuality = (highQuality: boolean, musicInfo: LX.Music.MusicInfoOnline): LX.Quality => { +// let type: LX.Quality = '128k' +// let list = global.lx.qualityList[musicInfo.source] +// if (highQuality && musicInfo.meta._qualitys['flac'] && list && list.includes('flac')) type = 'flac' +// return type +// } + +export const getPlayQuality = (playQuality: LX.Quality, musicInfo: LX.Music.MusicInfoOnline): LX.Quality => { let type: LX.Quality = '128k' let list = global.lx.qualityList[musicInfo.source] - if (highQuality && musicInfo.meta._qualitys['flac'] && list && list.includes('flac')) type = 'flac' + if (musicInfo.meta._qualitys[playQuality] && list && list.includes(playQuality)) type = playQuality return type } @@ -236,7 +243,8 @@ export const getOnlineOtherSourceMusicUrl = async ({ musicInfos, quality, onTogg if (retryedSource.includes(musicInfo.source)) continue retryedSource.push(musicInfo.source) if (!assertApiSupport(musicInfo.source)) continue - itemQuality = quality ?? getPlayQuality(settingState.setting['player.isPlayHighQuality'], musicInfo) + // itemQuality = quality ?? getPlayQuality(settingState.setting['player.isPlayHighQuality'], musicInfo) + itemQuality = quality ?? getPlayQuality(settingState.setting['player.playQuality'], musicInfo) if (!musicInfo.meta._qualitys[itemQuality]) continue console.log('try toggle to: ', musicInfo.source, musicInfo.name, musicInfo.singer, musicInfo.interval) @@ -283,7 +291,7 @@ export const handleGetOnlineMusicUrl = async ({ musicInfo, quality, onToggleSour }> => { if (!await global.lx.apiInitPromise[0]) throw new Error('source init failed') // console.log(musicInfo.source) - const targetQuality = quality ?? getPlayQuality(settingState.setting['player.isPlayHighQuality'], musicInfo) + const targetQuality = quality ?? getPlayQuality(settingState.setting['player.playQuality'], musicInfo) let reqPromise try { diff --git a/src/lang/en_us.json b/src/lang/en_us.json index 3e05e7d..c1a3cfe 100644 --- a/src/lang/en_us.json +++ b/src/lang/en_us.json @@ -334,6 +334,7 @@ "setting_play_auto_clean_played_list": "Automatically clear the played list", "setting_play_auto_clean_played_list_tip": "In random play mode, when switching songs by clicking the same list as the playlist, if automatic clearing of the already played list is enabled, the played songs will re-participate in random play.", "setting_play_cache_size": "Maximum cache size (MB)", + "setting_play_select": "Select sound quality listening", "setting_play_cache_size_no_cache": "Disabled cache", "setting_play_cache_size_save_tip": "The cache setting is completed, it will take effect after restarting the application", "setting_play_handle_audio_focus": "When other apps play sound, automatically pause the playback", diff --git a/src/lang/zh_cn.json b/src/lang/zh_cn.json index 6f6dbb3..455692b 100644 --- a/src/lang/zh_cn.json +++ b/src/lang/zh_cn.json @@ -334,6 +334,7 @@ "setting_play_auto_clean_played_list": "自动清空已播放列表", "setting_play_auto_clean_played_list_tip": "随机播放模式下,通过 「点击」 与 「播放列表相同的列表内的歌曲」 切歌时,若启用 「自动清空已播放列表」,则已播放的歌曲将重新参与随机播放。", "setting_play_cache_size": "最大缓存大小(MB)", + "setting_play_select": "播放音质选择", "setting_play_cache_size_no_cache": "禁用缓存", "setting_play_cache_size_save_tip": "缓存设置完毕,重启应用后生效", "setting_play_handle_audio_focus": "其他应用播放声音时,自动暂停播放", diff --git a/src/screens/Home/Views/Setting/settings/Player/MaxCache.tsx b/src/screens/Home/Views/Setting/settings/Player/MaxCache.tsx index 71b9ab4..c746d9c 100644 --- a/src/screens/Home/Views/Setting/settings/Player/MaxCache.tsx +++ b/src/screens/Home/Views/Setting/settings/Player/MaxCache.tsx @@ -46,7 +46,7 @@ export default memo(() => { const styles = createStyle({ content: { - marginTop: 10, + marginTop: 0, marginBottom: 15, }, }) diff --git a/src/screens/Home/Views/Setting/settings/Player/SelectPlayQuality.tsx b/src/screens/Home/Views/Setting/settings/Player/SelectPlayQuality.tsx new file mode 100644 index 0000000..eb4552a --- /dev/null +++ b/src/screens/Home/Views/Setting/settings/Player/SelectPlayQuality.tsx @@ -0,0 +1,90 @@ +import { memo, useEffect, useMemo, useState } from 'react' +import { View } from 'react-native' + +import InputItem, { type InputItemProps } from '../../components/InputItem' +import { createStyle, toast } from '@/utils/tools' +import { useSettingValue } from '@/store/setting/hook' +import { useI18n } from '@/lang' +import { updateSetting } from '@/core/common' +import CheckBox from '@/components/common/CheckBox' +import SubTitle from '../../components/SubTitle' +import settingState from '@/store/setting/state' + +const MAX_SIZE = 1024 * 1024 * 1024 +export default memo(() => { + const t = useI18n() + const [playQualityList, setPlayQualityList] = useState([]); + useEffect(() => { + setPlayQualityList([ + { + id: "128k", + key: "128k", + name: "标准音质" + }, + { + id: "320k", + key: "320k", + name: "高品音质" + }, + { + id: "flac", + key: "flac", + name: "无损音质" + }, + { + id: "flac24bit", + key: "flac24bit", + name: "Hi-Res音质" + } + ]); + }, []) + const [selectedQuality, setSelectedQuality] = useState(useSettingValue('player.playQuality')); + + const setPlayQuality = (playQuality: LX.Quality) => { + updateSetting({ 'player.playQuality': playQuality }) + setSelectedQuality(playQuality); + } + + interface MusicOption { + id: LX.Quality; + name: string; + size?: string | null; + key?: string + } + + const useActive = (id: LX.Quality) => { + const isActive = useMemo(() => selectedQuality == id, [selectedQuality, id]) + return isActive + } + + const Item = ({ id, name }: { + id: LX.Quality + name: string + }) => { + const isActive = useActive(id) + return { setPlayQuality(id) }} need /> + } + + return ( + + + + { + playQualityList.map((item) => ) + } + + + + ) +}) + +const styles = createStyle({ + content: { + marginTop: 10, + }, + list: { + flexDirection: 'row', + flexWrap: 'nowrap', + }, +}) + diff --git a/src/screens/Home/Views/Setting/settings/Player/index.tsx b/src/screens/Home/Views/Setting/settings/Player/index.tsx index 58f159b..df4bcc1 100644 --- a/src/screens/Home/Views/Setting/settings/Player/index.tsx +++ b/src/screens/Home/Views/Setting/settings/Player/index.tsx @@ -9,6 +9,7 @@ import IsAutoCleanPlayedList from './IsAutoCleanPlayedList' import IsShowNotificationImage from './IsShowNotificationImage' import IsShowLyricTranslation from './IsShowLyricTranslation' import IsShowLyricRoma from './IsShowLyricRoma' +import SelectPlayQuality from './SelectPlayQuality' import IsS2T from './IsS2T' import MaxCache from './MaxCache' import { useI18n } from '@/lang' @@ -21,13 +22,14 @@ export default memo(() => {
- + {/* */} +
) diff --git a/src/types/common.d.ts b/src/types/common.d.ts index 21ecd60..df0bd46 100644 --- a/src/types/common.d.ts +++ b/src/types/common.d.ts @@ -4,6 +4,7 @@ declare namespace LX { type OnlineSource = 'kw' | 'kg' | 'tx' | 'wy' | 'mg' type Source = OnlineSource | 'local' type Quality = '128k' | '320k' | 'flac' | 'flac24bit' | '192k' | 'ape' | 'wav' + type type QualityList = Partial> type ShareType = 'system' | 'clipboard'