Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

优先播放更高品质的歌曲 #487

Merged
merged 2 commits into from
Apr 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 2 additions & 20 deletions publish/changeLog.md
Original file line number Diff line number Diff line change
@@ -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)
2 changes: 1 addition & 1 deletion src/config/defaultSetting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 0 additions & 1 deletion src/config/migrateSetting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/core/music/online.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
19 changes: 14 additions & 5 deletions src/core/music/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 list = global.lx.qualityList[musicInfo.source]
if (highQuality && musicInfo.meta._qualitys['320k'] && list && list.includes('320k')) type = '320k'
if (TRY_QUALITYS_LIST.includes(highQuality as TryQualityType)) {
let list = global.lx.qualityList[musicInfo.source]

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
}

Expand All @@ -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)
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion src/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion src/lang/zh_cn.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": "在通知栏显示歌曲图片",
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ export default memo(() => {
const styles = createStyle({
content: {
marginTop: 10,
marginBottom: 15,
},
})

72 changes: 72 additions & 0 deletions src/screens/Home/Views/Setting/settings/Player/PlayHighQuality.tsx
Original file line number Diff line number Diff line change
@@ -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,
// },
// })

4 changes: 2 additions & 2 deletions src/screens/Home/Views/Setting/settings/Player/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -21,14 +21,14 @@ export default memo(() => {
<Section title={t('setting_player')}>
<IsSavePlayTime />
<IsAutoCleanPlayedList />
<IsPlayHighQuality />
<IsHandleAudioFocus />
<IsEnableAudioOffload />
<IsShowNotificationImage />
<IsShowLyricTranslation />
<IsShowLyricRoma />
<IsS2T />
<MaxCache />
<PlayHighQuality />
</Section>
)
})
4 changes: 2 additions & 2 deletions src/types/app_setting.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,9 @@ declare global {
'player.togglePlayMethod': 'listLoop' | 'random' | 'list' | 'singleLoop' | 'none'

/**
* 是否优先播放320k音质
* 优先播放的音质
*/
'player.isPlayHighQuality': boolean
'player.playQuality': LX.Quality

/**
* 启动软件时是否恢复上次播放进度
Expand Down