diff --git a/publish/changeLog.md b/publish/changeLog.md index 798723a..851e817 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -4,5 +4,8 @@ ### 新增 - 新增重复歌曲列表,可以方便移除我的列表中的重复歌曲,此列表会列出目标列表里歌曲名相同的歌曲,可在“我的列表”里的列表名菜单中使用(注:该功能与PC端的区别是可以点击歌曲名多选删除) +- 新增打开当前歌曲详情页菜单,可以在歌曲菜单中使用 + +### 其他 - 更新 React native 到 v0.73.9 diff --git a/src/components/OnlineList/ListMenu.tsx b/src/components/OnlineList/ListMenu.tsx index 9a5a617..03ff1a3 100644 --- a/src/components/OnlineList/ListMenu.tsx +++ b/src/components/OnlineList/ListMenu.tsx @@ -16,6 +16,7 @@ export interface ListMenuProps { onPlayLater: (selectInfo: SelectInfo) => void onAdd: (selectInfo: SelectInfo) => void onCopyName: (selectInfo: SelectInfo) => void + onMusicSourceDetail: (selectInfo: SelectInfo) => void onDislikeMusic: (selectInfo: SelectInfo) => void } export interface ListMenuType { @@ -54,6 +55,7 @@ export default forwardRef((props: ListMenuProps, re // { action: 'download', label: '下载' }, { action: 'add', label: t('add_to') }, { action: 'copyName', label: t('copy_name') }, + { action: 'musicSourceDetail', label: t('music_source_detail') }, { action: 'dislike', label: t('dislike'), disabled: isDislikeMusic }, ] as const }, [t, isDislikeMusic]) @@ -73,6 +75,10 @@ export default forwardRef((props: ListMenuProps, re case 'copyName': props.onCopyName(selectInfo) break + case 'musicSourceDetail': + props.onMusicSourceDetail(selectInfo) + // setVIsibleMusicPosition(true) + break case 'dislike': props.onDislikeMusic(selectInfo) break diff --git a/src/components/OnlineList/index.tsx b/src/components/OnlineList/index.tsx index 7b082af..9a7a16d 100644 --- a/src/components/OnlineList/index.tsx +++ b/src/components/OnlineList/index.tsx @@ -6,7 +6,7 @@ import ListMenu, { type ListMenuType, type Position, type SelectInfo } from './L import ListMusicMultiAdd, { type MusicMultiAddModalType as ListAddMultiType } from '@/components/MusicMultiAddModal' import ListMusicAdd, { type MusicAddModalType as ListMusicAddType } from '@/components/MusicAddModal' import MultipleModeBar, { type MultipleModeBarType, type SelectMode } from './MultipleModeBar' -import { handleDislikeMusic, handlePlay, handlePlayLater, handleShare } from './listAction' +import { handleDislikeMusic, handlePlay, handlePlayLater, handleShare, handleShowMusicSourceDetail } from './listAction' import { createStyle } from '@/utils/tools' export interface OnlineListProps { @@ -109,6 +109,7 @@ export default forwardRef(({ onPlayLater={info => { hancelExitSelect(); handlePlayLater(info.musicInfo, info.selectedList, hancelExitSelect) }} onCopyName={info => { handleShare(info.musicInfo) }} onAdd={handleAddMusic} + onMusicSourceDetail={info => { void handleShowMusicSourceDetail(info.musicInfo) }} onDislikeMusic={info => { void handleDislikeMusic(info.musicInfo) }} /> {/* */} diff --git a/src/components/OnlineList/listAction.ts b/src/components/OnlineList/listAction.ts index b778d94..d0c4cc6 100644 --- a/src/components/OnlineList/listAction.ts +++ b/src/components/OnlineList/listAction.ts @@ -4,9 +4,11 @@ import { playList, playNext } from '@/core/player/player' import { addTempPlayList } from '@/core/player/tempPlayList' import settingState from '@/store/setting/state' import { getListMusicSync } from '@/utils/listManage' -import { confirmDialog, shareMusic, toast } from '@/utils/tools' +import { confirmDialog, openUrl, shareMusic, toast } from '@/utils/tools' import { addDislikeInfo, hasDislike } from '@/core/dislikeList' import playerState from '@/store/player/state' +import musicSdk from '@/utils/musicSdk' +import { toOldMusicInfo } from '@/utils' export const handlePlay = (musicInfo: LX.Music.MusicInfoOnline) => { void addListMusics(LIST_IDS.DEFAULT, [musicInfo], settingState.setting['list.addMusicLocationType']).then(() => { @@ -29,6 +31,13 @@ export const handleShare = (musicInfo: LX.Music.MusicInfoOnline) => { shareMusic(settingState.setting['common.shareType'], settingState.setting['download.fileName'], musicInfo) } +export const handleShowMusicSourceDetail = async(minfo: LX.Music.MusicInfoOnline) => { + const url = musicSdk[minfo.source as LX.OnlineSource]?.getMusicDetailPageUrl(toOldMusicInfo(minfo)) + if (!url) return + void openUrl(url) +} + + export const handleDislikeMusic = async(musicInfo: LX.Music.MusicInfoOnline) => { const confirm = await confirmDialog({ message: global.i18n.t('lists_dislike_music_tip', { name: musicInfo.name }), diff --git a/src/lang/en_us.json b/src/lang/en_us.json index 300065c..77096d7 100644 --- a/src/lang/en_us.json +++ b/src/lang/en_us.json @@ -149,6 +149,7 @@ "metadata_edit_modal_tip": "Song name cannot be empty", "metadata_edit_modal_title": "Edit song tags", "move_to": "Move to...", + "music_source_detail": "Song page", "name": "Name: {name}", "nav_exit": "Exit application", "nav_love": "Collection", diff --git a/src/lang/zh_cn.json b/src/lang/zh_cn.json index d50d5f1..446551c 100644 --- a/src/lang/zh_cn.json +++ b/src/lang/zh_cn.json @@ -149,6 +149,7 @@ "metadata_edit_modal_tip": "歌曲名不能为空", "metadata_edit_modal_title": "编辑歌曲标签", "move_to": "移动到...", + "music_source_detail": "歌曲详情页", "name": "歌曲名:{name}", "nav_exit": "退出应用", "nav_love": "我的收藏", diff --git a/src/screens/Home/Views/Mylist/MusicList/ListMenu.tsx b/src/screens/Home/Views/Mylist/MusicList/ListMenu.tsx index fdaca7a..cc7205a 100644 --- a/src/screens/Home/Views/Mylist/MusicList/ListMenu.tsx +++ b/src/screens/Home/Views/Mylist/MusicList/ListMenu.tsx @@ -21,6 +21,7 @@ export interface ListMenuProps { onEditMetadata: (selectInfo: SelectInfo) => void onCopyName: (selectInfo: SelectInfo) => void onChangePosition: (selectInfo: SelectInfo) => void + onMusicSourceDetail: (selectInfo: SelectInfo) => void onDislikeMusic: (selectInfo: SelectInfo) => void onRemove: (selectInfo: SelectInfo) => void } @@ -65,35 +66,26 @@ export default forwardRef((props, ref) => { // { action: 'download', label: '下载' }, { action: 'add', label: t('add_to') }, { action: 'move', label: t('move_to') }, - { action: 'copyName', label: t('copy_name') }, { action: 'changePosition', label: t('change_position') }, + { action: 'copyName', label: t('copy_name') }, + { action: 'musicSourceDetail', disabled: musicInfo.source == 'local', label: t('music_source_detail') }, + // { action: 'musicSearch', label: t('music_search') }, { action: 'dislike', disabled: hasDislike(musicInfo), label: t('dislike') }, { action: 'remove', label: t('delete') }, ] - if (musicInfo.source == 'local') menu.splice(4, 0, { action: 'editMetadata', disabled: !edit_metadata, label: t('edit_metadata') }) + if (musicInfo.source == 'local') menu.splice(5, 0, { action: 'editMetadata', disabled: !edit_metadata, label: t('edit_metadata') }) setMenus(menu) void Promise.all([hasEditMetadata(musicInfo)]).then(([_edit_metadata]) => { // console.log(_edit_metadata) - let isUpdated = true + let isUpdated = false if (edit_metadata != _edit_metadata) { edit_metadata = _edit_metadata isUpdated ||= true } if (isUpdated) { - const menu = [ - { action: 'play', label: t('play') }, - { action: 'playLater', label: t('play_later') }, - // { action: 'download', label: '下载' }, - { action: 'add', label: t('add_to') }, - { action: 'move', label: t('move_to') }, - { action: 'copyName', label: t('copy_name') }, - { action: 'changePosition', label: t('change_position') }, - { action: 'dislike', disabled: hasDislike(musicInfo), label: t('dislike') }, - { action: 'remove', label: t('delete') }, - ] - if (musicInfo.source == 'local') menu.splice(4, 0, { action: 'editMetadata', disabled: !edit_metadata, label: t('edit_metadata') }) - setMenus(menu) + menu[menu.findIndex(m => m.action == 'editMetadata')].disabled = !edit_metadata + setMenus([...menu]) } }) } @@ -132,6 +124,10 @@ export default forwardRef((props, ref) => { props.onChangePosition(selectInfo) // setVIsibleMusicPosition(true) break + case 'musicSourceDetail': + props.onMusicSourceDetail(selectInfo) + // setVIsibleMusicPosition(true) + break case 'dislike': props.onDislikeMusic(selectInfo) break diff --git a/src/screens/Home/Views/Mylist/MusicList/index.tsx b/src/screens/Home/Views/Mylist/MusicList/index.tsx index c3d5ffa..897a487 100644 --- a/src/screens/Home/Views/Mylist/MusicList/index.tsx +++ b/src/screens/Home/Views/Mylist/MusicList/index.tsx @@ -2,7 +2,7 @@ import { useCallback, useRef } from 'react' import listState from '@/store/list/state' import ListMenu, { type ListMenuType, type Position, type SelectInfo } from './ListMenu' -import { handleDislikeMusic, handlePlay, handlePlayLater, handleRemove, handleShare, handleUpdateMusicInfo, handleUpdateMusicPosition } from './listAction' +import { handleDislikeMusic, handlePlay, handlePlayLater, handleRemove, handleShare, handleShowMusicSourceDetail, handleUpdateMusicInfo, handleUpdateMusicPosition } from './listAction' import List, { type ListType } from './List' import ListMusicAdd, { type MusicAddModalType as ListMusicAddType } from '@/components/MusicAddModal' import ListMusicMultiAdd, { type MusicMultiAddModalType as ListAddMultiType } from '@/components/MusicMultiAddModal' @@ -156,6 +156,7 @@ export default () => { onRemove={info => { hancelExitSelect(); handleRemove(info.listId, info.musicInfo, info.selectedList, hancelExitSelect) }} onDislikeMusic={info => { void handleDislikeMusic(info.musicInfo) }} onCopyName={info => { handleShare(info.musicInfo) }} + onMusicSourceDetail={info => { void handleShowMusicSourceDetail(info.musicInfo) }} onAdd={handleAddMusic} onMove={handleMoveMusic} onEditMetadata={handleEditMetadata} diff --git a/src/screens/Home/Views/Mylist/MusicList/listAction.ts b/src/screens/Home/Views/Mylist/MusicList/listAction.ts index 8a94445..649f882 100644 --- a/src/screens/Home/Views/Mylist/MusicList/listAction.ts +++ b/src/screens/Home/Views/Mylist/MusicList/listAction.ts @@ -2,13 +2,14 @@ import { removeListMusics, updateListMusicPosition, updateListMusics } from '@/c import { playList, playNext } from '@/core/player/player' import { addTempPlayList } from '@/core/player/tempPlayList' import settingState from '@/store/setting/state' -import { similar, sortInsert } from '@/utils' -import { confirmDialog, shareMusic, toast } from '@/utils/tools' +import { similar, sortInsert, toOldMusicInfo } from '@/utils' +import { confirmDialog, openUrl, shareMusic, toast } from '@/utils/tools' import { addDislikeInfo, hasDislike } from '@/core/dislikeList' import playerState from '@/store/player/state' import type { SelectInfo } from './ListMenu' import { type Metadata } from '@/components/MetadataEditModal' +import musicSdk from '@/utils/musicSdk' export const handlePlay = (listId: SelectInfo['listId'], index: SelectInfo['index']) => { void playList(listId, index) @@ -89,6 +90,13 @@ export const searchListMusic = (list: LX.Music.MusicInfo[], text: string) => { return sortedList.map(item => item.data).reverse() } +export const handleShowMusicSourceDetail = async(minfo: SelectInfo['musicInfo']) => { + const url = musicSdk[minfo.source as LX.OnlineSource]?.getMusicDetailPageUrl(toOldMusicInfo(minfo)) + if (!url) return + void openUrl(url) +} + + export const handleDislikeMusic = async(musicInfo: SelectInfo['musicInfo']) => { const confirm = await confirmDialog({ message: global.i18n.t('lists_dislike_music_tip', { name: musicInfo.name }),