音质选择

This commit is contained in:
zx 2024-04-22 19:59:46 +08:00
parent 03a70c8cb0
commit e1215ce5cf
9 changed files with 111 additions and 7 deletions

View File

@ -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,

View File

@ -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

View File

@ -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 {

View File

@ -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",

View File

@ -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": "其他应用播放声音时,自动暂停播放",

View File

@ -46,7 +46,7 @@ export default memo(() => {
const styles = createStyle({
content: {
marginTop: 10,
marginTop: 0,
marginBottom: 15,
},
})

View File

@ -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<MusicOption[]>([]);
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<LX.Quality>(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 <CheckBox marginRight={8} check={isActive} label={name} onChange={() => { setPlayQuality(id) }} need />
}
return (
<View style={styles.content} >
<SubTitle title={t('setting_play_select')}>
<View style={styles.list}>
{
playQualityList.map((item) => <Item name={item.name} id={item.id} key={item.key} />)
}
</View>
</SubTitle>
</View>
)
})
const styles = createStyle({
content: {
marginTop: 10,
},
list: {
flexDirection: 'row',
flexWrap: 'nowrap',
},
})

View File

@ -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(() => {
<Section title={t('setting_player')}>
<IsSavePlayTime />
<IsAutoCleanPlayedList />
<IsPlayHighQuality />
{/* <IsPlayHighQuality /> */}
<IsHandleAudioFocus />
<IsEnableAudioOffload />
<IsShowNotificationImage />
<IsShowLyricTranslation />
<IsShowLyricRoma />
<IsS2T />
<SelectPlayQuality />
<MaxCache />
</Section>
)

View File

@ -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<Record<LX.Source, LX.Quality[]>>
type ShareType = 'system' | 'clipboard'