From 164ea8aeb93a4b710da1718cbc02878797b2f438 Mon Sep 17 00:00:00 2001 From: wukko Date: Thu, 26 Jun 2025 17:36:26 +0600 Subject: [PATCH] api: return covers from soundcloud and youtube & refactor createProxyTunnels() in stream/manage a little --- api/src/processing/match-action.js | 2 ++ api/src/processing/request.js | 2 ++ api/src/processing/services/soundcloud.js | 6 +++++ api/src/processing/services/youtube.js | 14 +++++++++++- api/src/stream/manage.js | 28 +++++++++++++++-------- 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/api/src/processing/match-action.js b/api/src/processing/match-action.js index e5e5a1a9..555ecc33 100644 --- a/api/src/processing/match-action.js +++ b/api/src/processing/match-action.js @@ -34,6 +34,8 @@ export default function({ requestIP, originalRequest: r.originalRequest, subtitles: r.subtitles, + cover: r.cover, + cropCover: r.cropCover, }, params = {}; diff --git a/api/src/processing/request.js b/api/src/processing/request.js index 62a4d781..b9ebca05 100644 --- a/api/src/processing/request.js +++ b/api/src/processing/request.js @@ -67,6 +67,8 @@ export function createResponse(responseType, responseData) { copy: responseData?.audioCopy, format: responseData?.audioFormat, bitrate: responseData?.audioBitrate, + cover: !!responseData?.cover || undefined, + cropCover: !!responseData?.cropCover || undefined, }, isHLS: responseData?.isHLS, diff --git a/api/src/processing/services/soundcloud.js b/api/src/processing/services/soundcloud.js index 046ebd79..1c04a366 100644 --- a/api/src/processing/services/soundcloud.js +++ b/api/src/processing/services/soundcloud.js @@ -146,8 +146,14 @@ export default async function(obj) { copyright: json.license?.trim(), } + let cover; + if (json.artwork_url) { + cover = json.artwork_url.replace(/-large/, "-t1080x1080"); + } + return { urls: file.toString(), + cover, filenameAttributes: { service: "soundcloud", id: json.id, diff --git a/api/src/processing/services/youtube.js b/api/src/processing/services/youtube.js index f05e3086..55caa835 100644 --- a/api/src/processing/services/youtube.js +++ b/api/src/processing/services/youtube.js @@ -532,6 +532,15 @@ export default async function (o) { urls = audio.decipher(innertube.session.player); } + let cover = `https://i.ytimg.com/vi/${o.id}/maxresdefault.jpg`; + const testMaxCover = await fetch(cover, { dispatcher: o.dispatcher }) + .then(r => r.status === 200) + .catch(() => {}); + + if (!testMaxCover) { + cover = basicInfo.thumbnail?.[0]?.url; + } + return { type: "audio", isAudioOnly: true, @@ -540,7 +549,10 @@ export default async function (o) { fileMetadata, bestAudio, isHLS: useHLS, - originalRequest + originalRequest, + + cover, + cropCover: basicInfo.author.endsWith("- Topic"), } } diff --git a/api/src/stream/manage.js b/api/src/stream/manage.js index ee0477e6..93e9e652 100644 --- a/api/src/stream/manage.js +++ b/api/src/stream/manage.js @@ -82,17 +82,19 @@ export function createProxyTunnels(info) { urls = [urls]; } + const tunnelTemplate = { + type: "proxy", + headers: info?.headers, + requestIP: info?.requestIP, + } + for (const url of urls) { proxyTunnels.push( createStream({ + ...tunnelTemplate, url, - type: "proxy", - service: info?.service, - headers: info?.headers, - requestIP: info?.requestIP, - - originalRequest: info?.originalRequest + originalRequest: info?.originalRequest, }) ); } @@ -100,11 +102,19 @@ export function createProxyTunnels(info) { if (info.subtitles) { proxyTunnels.push( createStream({ + ...tunnelTemplate, url: info.subtitles, - type: "proxy", service: `${info?.service}-subtitles`, - headers: info?.headers, - requestIP: info?.requestIP + }) + ); + } + + if (info.cover) { + proxyTunnels.push( + createStream({ + ...tunnelTemplate, + url: info.cover, + service: `${info?.service}-cover`, }) ); }