feat(播放): 添加支持直接使用playUrl播放歌曲的功能

- 在SearchResultTable和SearchResultList组件中添加playTheSongWithPlayUrl方法
- 修改播放逻辑,优先使用playUrl进行播放
- 在Mobile.vue中添加playUrl处理逻辑
- 新增tunehub服务的getSongInfo和searchSongs接口
- 重构歌曲搜索处理逻辑,使用tunehub服务替代原有实现
This commit is contained in:
史悦
2026-01-07 17:10:32 +08:00
parent 0dbb36be9d
commit 6fa4f1a72e
9 changed files with 242 additions and 51 deletions

View File

@@ -9,7 +9,7 @@
<van-col span="23" offset="1">
<van-row>
<van-col span="22">
<van-row @click="play(null, item.url, i)">
<van-row @click="play(item, i)">
<van-col style="font-size: 16px">
<i
v-if="item.resourceForbidden"
@@ -115,6 +115,10 @@ export default {
type: Function,
required: true,
},
playTheSongWithPlayUrl: {
type: Function,
required: false,
},
suggestMatchSongId: {
type: String,
required: false,
@@ -137,11 +141,15 @@ export default {
const playTheSong = (songMeta, pageUrl, suggestMatchSongId) => {
props.playTheSong(songMeta, pageUrl, suggestMatchSongId);
};
const playTheSongWithPlayUrl = (playOption) => {
props.playTheSongWithPlayUrl && props.playTheSongWithPlayUrl(playOption);
};
const showPopover = ref([]);
return {
playTheSong,
playTheSongWithPlayUrl,
showPopover,
ellipsis,
};
@@ -158,6 +166,12 @@ export default {
},
},
methods: {
getSourceUrl(item) {
if (!item) {
return "";
}
return item.pageUrl || item.url || "";
},
async uploadToCloud(pageUrl) {
const ret = await createSyncSongFromUrlJob(
pageUrl,
@@ -180,37 +194,60 @@ export default {
startTaskListener(ret.data.jobId);
}
},
play(songMeta, pageUrl, index) {
play(item, index) {
if (this.currentSongIndex === index) {
return;
}
this.currentSongIndex = index;
this.playTheSong(songMeta, pageUrl, this.suggestMatchSongId);
const pageUrl = this.getSourceUrl(item);
if (this.playTheSongWithPlayUrl && item && item.playUrl) {
this.playTheSongWithPlayUrl({
playUrl: item.playUrl,
coverUrl: item.coverUrl,
songName: item.songName,
artist: item.artist,
pageUrl,
source: item.source,
});
return;
}
this.playTheSong(null, pageUrl, this.suggestMatchSongId);
},
async onSelect(actionItem) {
const currentSong = this.searchResult[actionItem.songIndex];
const pageUrl = this.getSourceUrl(currentSong);
console.log(currentSong);
switch (actionItem.action) {
case ActionUpload:
this.uploadToCloud(currentSong.url);
this.uploadToCloud(pageUrl);
break;
case ActionDownloadToLocalService:
this.downloadToLocalService(currentSong.url);
this.downloadToLocalService(pageUrl);
break;
case ActionDownload:
const ret = await getSongsMeta({ url: currentSong.url });
const info = ret.data.songMeta;
console.log(ret);
const a = document.createElement("a");
a.href = info.audios[0].url;
a.download = `${currentSong.songName}-${currentSong.artist}.mp3`;
a.style.display = "none";
document.body.appendChild(a);
a.click();
a.remove();
if (currentSong.playUrl) {
const a = document.createElement("a");
a.href = currentSong.playUrl;
a.download = `${currentSong.songName}-${currentSong.artist}.mp3`;
a.style.display = "none";
document.body.appendChild(a);
a.click();
a.remove();
} else {
const ret = await getSongsMeta({ url: pageUrl });
const info = ret.data.songMeta;
console.log(ret);
const a = document.createElement("a");
a.href = info.audios[0].url;
a.download = `${currentSong.songName}-${currentSong.artist}.mp3`;
a.style.display = "none";
document.body.appendChild(a);
a.click();
a.remove();
}
break;
case ActionOpenRef:
window.open(currentSong.url, "_blank").focus();
window.open(pageUrl || currentSong.url, "_blank").focus();
break;
}
},