From f58801c42ddacf83b03d16810521a49f1d73cb8a Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 11 Jan 2026 21:02:20 +0100 Subject: [PATCH] Fix download endpoint field detection for streaming URLs --- mod.ts | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/mod.ts b/mod.ts index 65679a9..356abb8 100644 --- a/mod.ts +++ b/mod.ts @@ -263,32 +263,42 @@ async function handler(req: Request): Promise { const artist = searchParams.get("artist") || ""; if (!id) return error("Missing id"); - // Get stream URL - const piped = await fetchFromPiped(id); + // Get stream URL - try piped first, then invidious let audioUrl = null; - let metadata = null; + let contentType = "audio/mp4"; + const piped = await fetchFromPiped(id); if (piped.success && piped.streamingUrls) { - const audio = piped.streamingUrls.find((s: any) => s.mimeType?.includes("audio") && s.quality === "AUDIO_QUALITY_MEDIUM") - || piped.streamingUrls.find((s: any) => s.mimeType?.includes("audio")); - if (audio) audioUrl = audio.url; - metadata = piped.metadata; + // Check for mimeType or type field, and quality or audioQuality + const audio = piped.streamingUrls.find((s: any) => + (s.mimeType?.includes("audio") || s.type?.includes("audio")) && + (s.quality === "AUDIO_QUALITY_MEDIUM" || s.audioQuality === "AUDIO_QUALITY_MEDIUM") + ) || piped.streamingUrls.find((s: any) => s.mimeType?.includes("audio") || s.type?.includes("audio")); + if (audio) { + audioUrl = audio.url || audio.directUrl; + contentType = audio.mimeType || audio.type || "audio/mp4"; + } } if (!audioUrl) { const invidious = await fetchFromInvidious(id); if (invidious.success && invidious.streamingUrls) { - const audio = invidious.streamingUrls.find((s: any) => s.mimeType?.includes("audio") && s.quality === "AUDIO_QUALITY_MEDIUM") - || invidious.streamingUrls.find((s: any) => s.mimeType?.includes("audio")); - if (audio) audioUrl = audio.url; - metadata = invidious.metadata; + const audio = invidious.streamingUrls.find((s: any) => + (s.mimeType?.includes("audio") || s.type?.includes("audio")) && + (s.quality === "AUDIO_QUALITY_MEDIUM" || s.audioQuality === "AUDIO_QUALITY_MEDIUM") + ) || invidious.streamingUrls.find((s: any) => s.mimeType?.includes("audio") || s.type?.includes("audio")); + if (audio) { + audioUrl = audio.url || audio.directUrl; + contentType = audio.mimeType || audio.type || "audio/mp4"; + } } } if (!audioUrl) return json({ success: false, error: "No audio stream found" }, 404); - // Create filename - const filename = `${artist ? artist + " - " : ""}${title}`.replace(/[<>:"/\\|?*]/g, "").trim() + ".m4a"; + // Create filename - use m4a for mp4 audio, webm for webm + const ext = contentType.includes("webm") ? ".webm" : ".m4a"; + const filename = `${artist ? artist + " - " : ""}${title}`.replace(/[<>:"/\\|?*]/g, "").trim() + ext; try { const response = await fetch(audioUrl, {