允许设置其他优先播放的歌曲音质 (#487)

* 优先播放更高音质歌曲

* 设置-播放设置-优先播放320k音质选项改为“优先播放的音质”

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
This commit is contained in:
NKXingXh 2024-04-15 20:18:50 +08:00 committed by GitHub
parent 3e02311ca2
commit 1774b1082d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 96 additions and 66 deletions

View File

@ -1,21 +1,3 @@
### 新增
### 变更
- 新增棕色主题“泥牛入海”
- 新增设置-基本设置-总是保留状态栏高度设置,如果在你的设备上出现软件可交互内容与状态栏内容显示重叠的情况,可以启用该设置以始终为系统状态栏保留空间
- 新增在线自定义源导入功能允许通过http/https链接导入自定义源
### 优化
- 不再丢弃kg源逐行歌词@helloplhm-qwq
- 支持kw源排行榜显示大小revert @Folltoshe #1460
- 优化本地歌曲换源匹配机制
### 修复
- 修复mg歌词在某些情况下获取失败的问题
- 修复mg歌单搜索@helloplhm-qwq
- 修复kg最新评论无法获取的问题@helloplhm-qwq
### 其他
- 更新 React native 到 v0.73.6
- 设置-播放设置-优先播放320k音质选项改为“优先播放的音质”允许选择更高优先播放的音质如果歌曲及音源支持的话#487

View File

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

@ -7,7 +7,6 @@ export default (setting: any): Partial<LX.AppSetting> => {
if (compareVer(setting.version as string, '2.0') < 0) {
setting['player.startupAutoPlay'] = setting.startupAutoPlay
setting['player.togglePlayMethod'] = setting.player?.togglePlayMethod
setting['player.isPlayHighQuality'] = setting.player?.highQuality
setting['player.isSavePlayTime'] = setting.player?.isSavePlayTime
setting['player.cacheSize'] = setting.player?.cacheSize
setting['player.timeoutExit'] = setting.player?.timeoutExit

View File

@ -52,7 +52,7 @@ export const getMusicUrl = async({ musicInfo, quality, isRefresh, allowToggleSou
// // 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,19 @@ export const getOnlineOtherSourcePicByLocal = async(musicInfo: LX.Music.MusicInf
})
}
export const getPlayQuality = (highQuality: boolean, musicInfo: LX.Music.MusicInfoOnline): LX.Quality => {
export const TRY_QUALITYS_LIST = ['flac24bit', 'flac', '320k'] as const
type TryQualityType = typeof TRY_QUALITYS_LIST[number]
export const getPlayQuality = (highQuality: LX.Quality, musicInfo: LX.Music.MusicInfoOnline): LX.Quality => {
let type: LX.Quality = '128k'
if (TRY_QUALITYS_LIST.includes(highQuality as TryQualityType)) {
let list = global.lx.qualityList[musicInfo.source]
if (highQuality && musicInfo.meta._qualitys['320k'] && list && list.includes('320k')) type = '320k'
let t = TRY_QUALITYS_LIST
.slice(TRY_QUALITYS_LIST.indexOf(highQuality as TryQualityType))
.find(q => musicInfo.meta._qualitys[q] && list?.includes(q))
if (t) type = t
}
return type
}
@ -236,7 +245,7 @@ export const getOnlineOtherSourceMusicUrl = async({ musicInfos, quality, onToggl
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.playQuality'], musicInfo)
if (!musicInfo.meta._qualitys[itemQuality]) continue
console.log('try toggle to: ', musicInfo.source, musicInfo.name, musicInfo.singer, musicInfo.interval)
@ -283,7 +292,7 @@ export const handleGetOnlineMusicUrl = async({ musicInfo, quality, onToggleSourc
}> => {
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

@ -338,7 +338,7 @@
"setting_play_handle_audio_focus": "When other apps play sound, automatically pause the playback",
"setting_play_handle_audio_focus_tip": "Take effect after restarting the application",
"setting_play_lyric_transition": "Show lyrics translation",
"setting_play_quality": "Play 320K quality songs first (if supported)",
"setting_play_play_quality": "Prioritize playback sound quality (if supported)",
"setting_play_s2t": "Convert the played lyrics to Traditional Chinese",
"setting_play_save_play_time": "Remember playback progress",
"setting_play_show_notification_image": "Show song picture in notification bar",

View File

@ -338,7 +338,7 @@
"setting_play_handle_audio_focus": "其他应用播放声音时,自动暂停播放",
"setting_play_handle_audio_focus_tip": "重启应用后生效",
"setting_play_lyric_transition": "显示歌词翻译",
"setting_play_quality": "优先播放320K品质的歌曲(如果支持)",
"setting_play_play_quality": "优先播放的音质(如果支持)",
"setting_play_s2t": "将播放的歌词转繁体",
"setting_play_save_play_time": "记住播放进度",
"setting_play_show_notification_image": "在通知栏显示歌曲图片",

View File

@ -1,31 +0,0 @@
import { updateSetting } from '@/core/common'
import { useI18n } from '@/lang'
import { createStyle } from '@/utils/tools'
import { memo } from 'react'
import { View } from 'react-native'
import { useSettingValue } from '@/store/setting/hook'
import CheckBoxItem from '../../components/CheckBoxItem'
export default memo(() => {
const t = useI18n()
const isPlayHighQuality = useSettingValue('player.isPlayHighQuality')
const setPlayHighQuality = (isPlayHighQuality: boolean) => {
updateSetting({ 'player.isPlayHighQuality': isPlayHighQuality })
}
return (
<View style={styles.content}>
<CheckBoxItem check={isPlayHighQuality} onChange={setPlayHighQuality} label={t('setting_play_quality')} />
</View>
)
})
const styles = createStyle({
content: {
marginTop: 5,
},
})

View File

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

View File

@ -0,0 +1,72 @@
import { memo, useMemo } from 'react'
import { StyleSheet, View } from 'react-native'
import SubTitle from '../../components/SubTitle'
import CheckBox from '@/components/common/CheckBox'
import { useSettingValue } from '@/store/setting/hook'
import { updateSetting } from '@/core/common'
import { useI18n } from '@/lang'
import { TRY_QUALITYS_LIST } from '@/core/music/utils'
const useActive = (id: LX.Quality) => {
const q = useSettingValue('player.playQuality')
const isActive = useMemo(() => q == id, [q, id])
return isActive
}
const Item = ({ id, name }: {
id: LX.Quality
name: string
}) => {
const isActive = useActive(id)
// const [toggleCheckBox, setToggleCheckBox] = useState(false)
return <CheckBox marginRight={8} check={isActive} label={name} onChange={() => { updateSetting({ 'player.playQuality': id }) }} need />
}
export default memo(() => {
const t = useI18n()
const playQualityList = useMemo(() => {
return [...TRY_QUALITYS_LIST, '128k'].reverse() as LX.Quality[]
}, [])
return (
<SubTitle title={t('setting_play_play_quality')}>
<View style={styles.list}>
{
playQualityList.map((q) => <Item name={q} id={q} key={q} />)
}
</View>
</SubTitle>
)
})
const styles = StyleSheet.create({
list: {
flexDirection: 'row',
flexWrap: 'wrap',
},
})
// export default memo(() => {
// const t = useI18n()
// const isPlayHighQuality = useSettingValue('player.isPlayHighQuality')
// const setPlayHighQuality = (isPlayHighQuality: boolean) => {
// updateSetting({ 'player.isPlayHighQuality': isPlayHighQuality })
// }
// return (
// <View style={styles.content}>
// <CheckBoxItem check={isPlayHighQuality} onChange={setPlayHighQuality} label={t('setting_play_quality')} />
// </View>
// )
// })
// const styles = createStyle({
// content: {
// marginTop: 5,
// },
// })

View File

@ -2,7 +2,7 @@ import { memo } from 'react'
import Section from '../../components/Section'
import IsSavePlayTime from './IsSavePlayTime'
import IsPlayHighQuality from './IsPlayHighQuality'
import PlayHighQuality from './PlayHighQuality'
import IsHandleAudioFocus from './IsHandleAudioFocus'
import IsEnableAudioOffload from './IsEnableAudioOffload'
import IsAutoCleanPlayedList from './IsAutoCleanPlayedList'
@ -21,7 +21,6 @@ export default memo(() => {
<Section title={t('setting_player')}>
<IsSavePlayTime />
<IsAutoCleanPlayedList />
<IsPlayHighQuality />
<IsHandleAudioFocus />
<IsEnableAudioOffload />
<IsShowNotificationImage />
@ -29,6 +28,7 @@ export default memo(() => {
<IsShowLyricRoma />
<IsS2T />
<MaxCache />
<PlayHighQuality />
</Section>
)
})

View File

@ -112,9 +112,9 @@ declare global {
'player.togglePlayMethod': 'listLoop' | 'random' | 'list' | 'singleLoop' | 'none'
/**
* 320k音
*
*/
'player.isPlayHighQuality': boolean
'player.playQuality': LX.Quality
/**
*