mirror of
https://github.com/ikun0014/lx-music-mobile.git
synced 2025-07-04 12:32:10 +08:00
允许设置其他优先播放的歌曲音质 (#487)
* 优先播放更高音质歌曲 * 设置-播放设置-优先播放320k音质选项改为“优先播放的音质” --------- Co-authored-by: lyswhut <lyswhut@qq.com>
This commit is contained in:
parent
3e02311ca2
commit
1774b1082d
@ -1,21 +1,3 @@
|
|||||||
### 新增
|
### 变更
|
||||||
|
|
||||||
- 新增棕色主题“泥牛入海”
|
- 设置-播放设置-优先播放320k音质选项改为“优先播放的音质”,允许选择更高优先播放的音质,如果歌曲及音源支持的话(#487)
|
||||||
- 新增设置-基本设置-总是保留状态栏高度设置,如果在你的设备上出现软件可交互内容与状态栏内容显示重叠的情况,可以启用该设置以始终为系统状态栏保留空间
|
|
||||||
- 新增在线自定义源导入功能,允许通过http/https链接导入自定义源
|
|
||||||
|
|
||||||
### 优化
|
|
||||||
|
|
||||||
- 不再丢弃kg源逐行歌词(@helloplhm-qwq)
|
|
||||||
- 支持kw源排行榜显示大小(revert @Folltoshe #1460)
|
|
||||||
- 优化本地歌曲换源匹配机制
|
|
||||||
|
|
||||||
### 修复
|
|
||||||
|
|
||||||
- 修复mg歌词在某些情况下获取失败的问题
|
|
||||||
- 修复mg歌单搜索(@helloplhm-qwq)
|
|
||||||
- 修复kg最新评论无法获取的问题(@helloplhm-qwq)
|
|
||||||
|
|
||||||
### 其他
|
|
||||||
|
|
||||||
- 更新 React native 到 v0.73.6
|
|
||||||
|
@ -16,7 +16,7 @@ const defaultSetting: LX.AppSetting = {
|
|||||||
|
|
||||||
'player.startupAutoPlay': false,
|
'player.startupAutoPlay': false,
|
||||||
'player.togglePlayMethod': 'listLoop',
|
'player.togglePlayMethod': 'listLoop',
|
||||||
'player.isPlayHighQuality': false,
|
'player.playQuality': '128k',
|
||||||
'player.isSavePlayTime': false,
|
'player.isSavePlayTime': false,
|
||||||
'player.volume': 1,
|
'player.volume': 1,
|
||||||
'player.playbackRate': 1,
|
'player.playbackRate': 1,
|
||||||
|
@ -7,7 +7,6 @@ export default (setting: any): Partial<LX.AppSetting> => {
|
|||||||
if (compareVer(setting.version as string, '2.0') < 0) {
|
if (compareVer(setting.version as string, '2.0') < 0) {
|
||||||
setting['player.startupAutoPlay'] = setting.startupAutoPlay
|
setting['player.startupAutoPlay'] = setting.startupAutoPlay
|
||||||
setting['player.togglePlayMethod'] = setting.player?.togglePlayMethod
|
setting['player.togglePlayMethod'] = setting.player?.togglePlayMethod
|
||||||
setting['player.isPlayHighQuality'] = setting.player?.highQuality
|
|
||||||
setting['player.isSavePlayTime'] = setting.player?.isSavePlayTime
|
setting['player.isSavePlayTime'] = setting.player?.isSavePlayTime
|
||||||
setting['player.cacheSize'] = setting.player?.cacheSize
|
setting['player.cacheSize'] = setting.player?.cacheSize
|
||||||
setting['player.timeoutExit'] = setting.player?.timeoutExit
|
setting['player.timeoutExit'] = setting.player?.timeoutExit
|
||||||
|
@ -52,7 +52,7 @@ export const getMusicUrl = async({ musicInfo, quality, isRefresh, allowToggleSou
|
|||||||
|
|
||||||
// // return Promise.reject(new Error('该歌曲没有可播放的音频'))
|
// // 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)
|
const cachedUrl = await getStoreMusicUrl(musicInfo, targetQuality)
|
||||||
if (cachedUrl && !isRefresh) return cachedUrl
|
if (cachedUrl && !isRefresh) return cachedUrl
|
||||||
|
|
||||||
|
@ -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'
|
let type: LX.Quality = '128k'
|
||||||
|
if (TRY_QUALITYS_LIST.includes(highQuality as TryQualityType)) {
|
||||||
let list = global.lx.qualityList[musicInfo.source]
|
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
|
return type
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,7 +245,7 @@ export const getOnlineOtherSourceMusicUrl = async({ musicInfos, quality, onToggl
|
|||||||
if (retryedSource.includes(musicInfo.source)) continue
|
if (retryedSource.includes(musicInfo.source)) continue
|
||||||
retryedSource.push(musicInfo.source)
|
retryedSource.push(musicInfo.source)
|
||||||
if (!assertApiSupport(musicInfo.source)) continue
|
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
|
if (!musicInfo.meta._qualitys[itemQuality]) continue
|
||||||
|
|
||||||
console.log('try toggle to: ', musicInfo.source, musicInfo.name, musicInfo.singer, musicInfo.interval)
|
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')
|
if (!await global.lx.apiInitPromise[0]) throw new Error('source init failed')
|
||||||
// console.log(musicInfo.source)
|
// console.log(musicInfo.source)
|
||||||
const targetQuality = quality ?? getPlayQuality(settingState.setting['player.isPlayHighQuality'], musicInfo)
|
const targetQuality = quality ?? getPlayQuality(settingState.setting['player.playQuality'], musicInfo)
|
||||||
|
|
||||||
let reqPromise
|
let reqPromise
|
||||||
try {
|
try {
|
||||||
|
@ -338,7 +338,7 @@
|
|||||||
"setting_play_handle_audio_focus": "When other apps play sound, automatically pause the playback",
|
"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_handle_audio_focus_tip": "Take effect after restarting the application",
|
||||||
"setting_play_lyric_transition": "Show lyrics translation",
|
"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_s2t": "Convert the played lyrics to Traditional Chinese",
|
||||||
"setting_play_save_play_time": "Remember playback progress",
|
"setting_play_save_play_time": "Remember playback progress",
|
||||||
"setting_play_show_notification_image": "Show song picture in notification bar",
|
"setting_play_show_notification_image": "Show song picture in notification bar",
|
||||||
|
@ -338,7 +338,7 @@
|
|||||||
"setting_play_handle_audio_focus": "其他应用播放声音时,自动暂停播放",
|
"setting_play_handle_audio_focus": "其他应用播放声音时,自动暂停播放",
|
||||||
"setting_play_handle_audio_focus_tip": "重启应用后生效",
|
"setting_play_handle_audio_focus_tip": "重启应用后生效",
|
||||||
"setting_play_lyric_transition": "显示歌词翻译",
|
"setting_play_lyric_transition": "显示歌词翻译",
|
||||||
"setting_play_quality": "优先播放320K品质的歌曲(如果支持)",
|
"setting_play_play_quality": "优先播放的音质(如果支持)",
|
||||||
"setting_play_s2t": "将播放的歌词转繁体",
|
"setting_play_s2t": "将播放的歌词转繁体",
|
||||||
"setting_play_save_play_time": "记住播放进度",
|
"setting_play_save_play_time": "记住播放进度",
|
||||||
"setting_play_show_notification_image": "在通知栏显示歌曲图片",
|
"setting_play_show_notification_image": "在通知栏显示歌曲图片",
|
||||||
|
@ -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,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
@ -47,7 +47,6 @@ export default memo(() => {
|
|||||||
const styles = createStyle({
|
const styles = createStyle({
|
||||||
content: {
|
content: {
|
||||||
marginTop: 10,
|
marginTop: 10,
|
||||||
marginBottom: 15,
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
// },
|
||||||
|
// })
|
||||||
|
|
@ -2,7 +2,7 @@ import { memo } from 'react'
|
|||||||
|
|
||||||
import Section from '../../components/Section'
|
import Section from '../../components/Section'
|
||||||
import IsSavePlayTime from './IsSavePlayTime'
|
import IsSavePlayTime from './IsSavePlayTime'
|
||||||
import IsPlayHighQuality from './IsPlayHighQuality'
|
import PlayHighQuality from './PlayHighQuality'
|
||||||
import IsHandleAudioFocus from './IsHandleAudioFocus'
|
import IsHandleAudioFocus from './IsHandleAudioFocus'
|
||||||
import IsEnableAudioOffload from './IsEnableAudioOffload'
|
import IsEnableAudioOffload from './IsEnableAudioOffload'
|
||||||
import IsAutoCleanPlayedList from './IsAutoCleanPlayedList'
|
import IsAutoCleanPlayedList from './IsAutoCleanPlayedList'
|
||||||
@ -21,7 +21,6 @@ export default memo(() => {
|
|||||||
<Section title={t('setting_player')}>
|
<Section title={t('setting_player')}>
|
||||||
<IsSavePlayTime />
|
<IsSavePlayTime />
|
||||||
<IsAutoCleanPlayedList />
|
<IsAutoCleanPlayedList />
|
||||||
<IsPlayHighQuality />
|
|
||||||
<IsHandleAudioFocus />
|
<IsHandleAudioFocus />
|
||||||
<IsEnableAudioOffload />
|
<IsEnableAudioOffload />
|
||||||
<IsShowNotificationImage />
|
<IsShowNotificationImage />
|
||||||
@ -29,6 +28,7 @@ export default memo(() => {
|
|||||||
<IsShowLyricRoma />
|
<IsShowLyricRoma />
|
||||||
<IsS2T />
|
<IsS2T />
|
||||||
<MaxCache />
|
<MaxCache />
|
||||||
|
<PlayHighQuality />
|
||||||
</Section>
|
</Section>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
4
src/types/app_setting.d.ts
vendored
4
src/types/app_setting.d.ts
vendored
@ -112,9 +112,9 @@ declare global {
|
|||||||
'player.togglePlayMethod': 'listLoop' | 'random' | 'list' | 'singleLoop' | 'none'
|
'player.togglePlayMethod': 'listLoop' | 'random' | 'list' | 'singleLoop' | 'none'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否优先播放320k音质
|
* 优先播放的音质
|
||||||
*/
|
*/
|
||||||
'player.isPlayHighQuality': boolean
|
'player.playQuality': LX.Quality
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 启动软件时是否恢复上次播放进度
|
* 启动软件时是否恢复上次播放进度
|
||||||
|
Loading…
x
Reference in New Issue
Block a user