From 14657e51d3d185f91aa97cd6a67391f5534ccb96 Mon Sep 17 00:00:00 2001 From: wukko Date: Tue, 24 Jun 2025 20:09:41 +0600 Subject: [PATCH] api/stream: split types.js into proxy.js and ffmpeg.js --- api/src/stream/{types.js => ffmpeg.js} | 42 +------------------------ api/src/stream/proxy.js | 43 ++++++++++++++++++++++++++ api/src/stream/stream.js | 11 ++++--- 3 files changed, 50 insertions(+), 46 deletions(-) rename api/src/stream/{types.js => ffmpeg.js} (81%) create mode 100644 api/src/stream/proxy.js diff --git a/api/src/stream/types.js b/api/src/stream/ffmpeg.js similarity index 81% rename from api/src/stream/types.js rename to api/src/stream/ffmpeg.js index 746557bc..d20525c3 100644 --- a/api/src/stream/types.js +++ b/api/src/stream/ffmpeg.js @@ -1,12 +1,11 @@ import ffmpeg from "ffmpeg-static"; import { spawn } from "child_process"; -import { Agent, request } from "undici"; import { create as contentDisposition } from "content-disposition-header"; import { env } from "../config.js"; import { destroyInternalStream } from "./manage.js"; import { hlsExceptions } from "../processing/service-config.js"; -import { getHeaders, closeRequest, closeResponse, pipe, estimateTunnelLength, estimateAudioMultiplier } from "./shared.js"; +import { closeResponse, pipe, estimateTunnelLength, estimateAudioMultiplier } from "./shared.js"; const metadataTags = [ "album", @@ -55,44 +54,6 @@ const getCommand = (args) => { return [ffmpeg, args] } -const defaultAgent = new Agent(); - -const proxy = async (streamInfo, res) => { - const abortController = new AbortController(); - const shutdown = () => ( - closeRequest(abortController), - closeResponse(res), - destroyInternalStream(streamInfo.urls) - ); - - try { - res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin'); - res.setHeader('Content-disposition', contentDisposition(streamInfo.filename)); - - const { body: stream, headers, statusCode } = await request(streamInfo.urls, { - headers: { - ...getHeaders(streamInfo.service), - Range: streamInfo.range - }, - signal: abortController.signal, - maxRedirections: 16, - dispatcher: defaultAgent, - }); - - res.status(statusCode); - - for (const headerName of ['accept-ranges', 'content-type', 'content-length']) { - if (headers[headerName]) { - res.setHeader(headerName, headers[headerName]); - } - } - - pipe(stream, res, shutdown); - } catch { - shutdown(); - } -} - const render = async (res, streamInfo, ffargs, multiplier) => { let process; const urls = Array.isArray(streamInfo.urls) ? streamInfo.urls : [streamInfo.urls]; @@ -245,7 +206,6 @@ const convertGif = async (streamInfo, res) => { } export default { - proxy, remux, convertAudio, convertGif, diff --git a/api/src/stream/proxy.js b/api/src/stream/proxy.js new file mode 100644 index 00000000..d51927a9 --- /dev/null +++ b/api/src/stream/proxy.js @@ -0,0 +1,43 @@ +import { Agent, request } from "undici"; +import { create as contentDisposition } from "content-disposition-header"; + +import { destroyInternalStream } from "./manage.js"; +import { getHeaders, closeRequest, closeResponse, pipe } from "./shared.js"; + +const defaultAgent = new Agent(); + +export default async function (streamInfo, res) { + const abortController = new AbortController(); + const shutdown = () => ( + closeRequest(abortController), + closeResponse(res), + destroyInternalStream(streamInfo.urls) + ); + + try { + res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin'); + res.setHeader('Content-disposition', contentDisposition(streamInfo.filename)); + + const { body: stream, headers, statusCode } = await request(streamInfo.urls, { + headers: { + ...getHeaders(streamInfo.service), + Range: streamInfo.range + }, + signal: abortController.signal, + maxRedirections: 16, + dispatcher: defaultAgent, + }); + + res.status(statusCode); + + for (const headerName of ['accept-ranges', 'content-type', 'content-length']) { + if (headers[headerName]) { + res.setHeader(headerName, headers[headerName]); + } + } + + pipe(stream, res, shutdown); + } catch { + shutdown(); + } +} diff --git a/api/src/stream/stream.js b/api/src/stream/stream.js index 3050c08b..1290c029 100644 --- a/api/src/stream/stream.js +++ b/api/src/stream/stream.js @@ -1,4 +1,5 @@ -import stream from "./types.js"; +import proxy from "./proxy.js"; +import ffmpeg from "./ffmpeg.js"; import { closeResponse } from "./shared.js"; import { internalStream } from "./internal.js"; @@ -7,7 +8,7 @@ export default async function(res, streamInfo) { try { switch (streamInfo.type) { case "proxy": - return await stream.proxy(streamInfo, res); + return await proxy(streamInfo, res); case "internal": return await internalStream(streamInfo.data, res); @@ -15,13 +16,13 @@ export default async function(res, streamInfo) { case "merge": case "remux": case "mute": - return await stream.remux(streamInfo, res); + return await ffmpeg.remux(streamInfo, res); case "audio": - return await stream.convertAudio(streamInfo, res); + return await ffmpeg.convertAudio(streamInfo, res); case "gif": - return await stream.convertGif(streamInfo, res); + return await ffmpeg.convertGif(streamInfo, res); } closeResponse(res);