mirror of
https://github.com/imsyy/SPlayer.git
synced 2025-11-25 03:14:57 +08:00
🐞 fix: 解决音频资源过期问题
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { Howl, Howler } from "howler";
|
||||
import { musicData, siteStatus, siteSettings } from "@/stores";
|
||||
import { getSongUrl, getSongLyric, songScrobble } from "@/api/song";
|
||||
import { checkPlatform, getLocalCoverData } from "@/utils/helper";
|
||||
import { checkPlatform, getLocalCoverData, getBlobUrlFromUrl } from "@/utils/helper";
|
||||
import { decode as base642Buffer } from "@/utils/base64";
|
||||
import { getSongPlayTime } from "@/utils/timeTools";
|
||||
import { getCoverGradient } from "@/utils/cover-color";
|
||||
@@ -207,7 +207,6 @@ const getFromUnblockMusic = async (data, status, playNow) => {
|
||||
* @param {number} seek - 初始播放进度( 默认为 0 )
|
||||
*/
|
||||
export const createPlayer = async (src, autoPlay = true) => {
|
||||
console.log("播放地址:", src);
|
||||
try {
|
||||
// pinia
|
||||
const music = musicData();
|
||||
@@ -216,9 +215,12 @@ export const createPlayer = async (src, autoPlay = true) => {
|
||||
const { playSongSource, playList } = music;
|
||||
// 当前播放歌曲数据
|
||||
const playSongData = music.getPlaySongData;
|
||||
// 获取播放链接
|
||||
const blobUrl = await getBlobUrlFromUrl(src);
|
||||
console.log("播放地址:", blobUrl);
|
||||
// 初始化播放器
|
||||
player = new Howl({
|
||||
src: [src],
|
||||
src: [blobUrl],
|
||||
format: ["mp3", "flac", "dolby", "webm"],
|
||||
html5: true,
|
||||
preload: true,
|
||||
@@ -260,8 +262,8 @@ export const createPlayer = async (src, autoPlay = true) => {
|
||||
status.playMode === "dj"
|
||||
? "电台节目"
|
||||
: Array.isArray(playSongData.artists)
|
||||
? playSongData.artists.map((ar) => ar.name).join(" / ")
|
||||
: playSongData.artists || "未知歌手";
|
||||
? playSongData.artists.map((ar) => ar.name).join(" / ")
|
||||
: playSongData.artists || "未知歌手";
|
||||
electron.ipcRenderer.send("songNameChange", songName + " - " + songArtist);
|
||||
}
|
||||
// 听歌打卡
|
||||
@@ -649,8 +651,8 @@ const initMediaSession = async (data, cover, islocal, isDj) => {
|
||||
artist: isDj
|
||||
? "电台节目"
|
||||
: islocal
|
||||
? data.artists
|
||||
: data.artists?.map((a) => a.name)?.join(" & "),
|
||||
? data.artists
|
||||
: data.artists?.map((a) => a.name)?.join(" & "),
|
||||
album: isDj ? "电台节目" : islocal ? data.album : data.album.name,
|
||||
artwork: islocal
|
||||
? [
|
||||
|
||||
@@ -354,3 +354,35 @@ export const formatBytes = (bytes, decimals = 2) => {
|
||||
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取音频文件的 Blob 链接
|
||||
* @param {string} url - 音频文件的网络链接
|
||||
* @returns {Promise<string>} - 包含 Blob 链接的 Promise
|
||||
* @throws {Error} 如果获取 Blob 链接时出现错误
|
||||
*/
|
||||
// 上次生成的 BlobUrl
|
||||
let lastBlobUrl = null;
|
||||
export const getBlobUrlFromUrl = async (url) => {
|
||||
try {
|
||||
// 是否为网络链接
|
||||
if (!url.startsWith("http://") && !url.startsWith("https://")) {
|
||||
return url;
|
||||
}
|
||||
// 获取音频文件数据
|
||||
const response = await fetch(url);
|
||||
// 检查请求是否成功
|
||||
if (!response.ok) {
|
||||
throw new Error("获取音频资源失败:", response.statusText);
|
||||
}
|
||||
const blob = await response.blob();
|
||||
// 清理过期的 Blob 链接
|
||||
if (lastBlobUrl) URL.revokeObjectURL(lastBlobUrl);
|
||||
// 转换为本地 Blob 链接
|
||||
lastBlobUrl = URL.createObjectURL(blob);
|
||||
return lastBlobUrl;
|
||||
} catch (error) {
|
||||
console.error("获取 Blob 链接遇到错误:" + error);
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user