Jelajahi Sumber

等待可以起播百度云盘歌曲

sequoia00 2 minggu lalu
induk
melakukan
9dd95a430d
2 mengubah file dengan 22 tambahan dan 5 penghapusan
  1. 8 4
      app/main.py
  2. 14 1
      static/js/app.js

+ 8 - 4
app/main.py

@@ -179,10 +179,14 @@ def cloud_raw_url(relative_path: str) -> str:
     except urllib.error.URLError as error:
         raise HTTPException(status_code=502, detail=str(error.reason))
 
-    raw_url = result.get("data", {}).get("raw_url")
-    if not raw_url:
-        raise HTTPException(status_code=404, detail="Cloud raw url not found")
-    return raw_url
+    data = result.get("data", {})
+    sign = data.get("sign")
+    path = data.get("path")
+    if not sign or not path:
+        raise HTTPException(status_code=404, detail="Cloud signed url not found")
+    encoded_path = "/".join(urllib.parse.quote(part) for part in path.lstrip("/").split("/"))
+    quoted_sign = urllib.parse.quote(sign, safe="")
+    return f"{CLOUD_ALIST_BASE.rstrip('/')}/d/{urllib.parse.quote('百度网盘')}/{encoded_path}?sign={quoted_sign}"
 
 
 def is_supported_file(path: Path) -> bool:

+ 14 - 1
static/js/app.js

@@ -17,6 +17,7 @@ const progressBar = document.getElementById("progressBar");
 const audioCacheName = "musicweb-audio-cache-v1";
 let toastTimer = null;
 let featuredTimer = null;
+let playRequestId = 0;
 
 const iconMarkup = {
   play: '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8 5v14l11-7-11-7z"/></svg>',
@@ -667,6 +668,7 @@ function syncPlayButton() {
 
 async function getCachedAudioUrl(track) {
   if (track.path?.startsWith("cloud/")) {
+    showIconToast("云端加载中");
     const response = await fetch(`/api/cloud-url/${track.path}`);
     if (!response.ok) throw new Error(`cloud url request failed: ${response.status}`);
     const data = await response.json();
@@ -696,18 +698,29 @@ async function getCachedAudioUrl(track) {
 
 async function playTrack(index) {
   if (!state.currentQueue.length) return;
+  const requestId = ++playRequestId;
   state.currentTrackIndex = index;
   const track = state.currentQueue[index];
   try {
-    audio.src = await getCachedAudioUrl(track);
+    const resolvedUrl = await getCachedAudioUrl(track);
+    if (requestId !== playRequestId) return;
+    audio.pause();
+    audio.removeAttribute("src");
+    audio.load();
+    audio.src = resolvedUrl;
     await audio.play();
   } catch (error) {
+    if (requestId !== playRequestId) return;
     console.error("playTrack failed", track?.path, error);
+    audio.pause();
+    audio.removeAttribute("src");
+    audio.load();
     audio.src = track.url;
     audio.play().catch((fallbackError) => {
       console.error("fallback play failed", track?.path, fallbackError);
     });
   }
+  if (requestId !== playRequestId) return;
   updateDock(track);
   renderQueue();
   savePlaybackState();