Spaces:
Paused
Paused
| import createFilename from "./create-filename.js"; | |
| import { createResponse } from "./request.js"; | |
| import { audioIgnore } from "./service-config.js"; | |
| import { createStream } from "../stream/manage.js"; | |
| import { splitFilenameExtension } from "../misc/utils.js"; | |
| export default function({ r, host, audioFormat, isAudioOnly, isAudioMuted, disableMetadata, filenameStyle, twitterGif, requestIP, audioBitrate, alwaysProxy }) { | |
| let action, | |
| responseType = "tunnel", | |
| defaultParams = { | |
| u: r.urls, | |
| headers: r.headers, | |
| service: host, | |
| filename: r.filenameAttributes ? | |
| createFilename(r.filenameAttributes, filenameStyle, isAudioOnly, isAudioMuted) : r.filename, | |
| fileMetadata: !disableMetadata ? r.fileMetadata : false, | |
| requestIP | |
| }, | |
| params = {}; | |
| if (r.isPhoto) action = "photo"; | |
| else if (r.picker) action = "picker" | |
| else if (r.isGif && twitterGif) action = "gif"; | |
| else if (isAudioOnly) action = "audio"; | |
| else if (isAudioMuted) action = "muteVideo"; | |
| else if (r.isM3U8) action = "m3u8"; | |
| else action = "video"; | |
| if (action === "picker" || action === "audio") { | |
| if (!r.filenameAttributes) defaultParams.filename = r.audioFilename; | |
| defaultParams.audioFormat = audioFormat; | |
| } | |
| if (action === "muteVideo" && isAudioMuted && !r.filenameAttributes) { | |
| const [ name, ext ] = splitFilenameExtension(r.filename); | |
| defaultParams.filename = `${name}_mute.${ext}`; | |
| } else if (action === "gif") { | |
| const [ name ] = splitFilenameExtension(r.filename); | |
| defaultParams.filename = `${name}.gif`; | |
| } | |
| switch (action) { | |
| default: | |
| return createResponse("error", { | |
| code: "error.api.fetch.empty" | |
| }); | |
| case "photo": | |
| responseType = "redirect"; | |
| break; | |
| case "gif": | |
| params = { type: "gif" }; | |
| break; | |
| case "m3u8": | |
| params = { | |
| type: Array.isArray(r.urls) ? "merge" : "remux" | |
| } | |
| break; | |
| case "muteVideo": | |
| let muteType = "mute"; | |
| if (Array.isArray(r.urls) && !r.isM3U8) { | |
| muteType = "proxy"; | |
| } | |
| params = { | |
| type: muteType, | |
| u: Array.isArray(r.urls) ? r.urls[0] : r.urls | |
| } | |
| if (host === "reddit" && r.typeId === "redirect") { | |
| responseType = "redirect"; | |
| } | |
| break; | |
| case "picker": | |
| responseType = "picker"; | |
| switch (host) { | |
| case "instagram": | |
| case "twitter": | |
| case "snapchat": | |
| case "bsky": | |
| params = { picker: r.picker }; | |
| break; | |
| case "tiktok": | |
| let audioStreamType = "audio"; | |
| if (r.bestAudio === "mp3" && audioFormat === "best") { | |
| audioFormat = "mp3"; | |
| audioStreamType = "proxy" | |
| } | |
| params = { | |
| picker: r.picker, | |
| u: createStream({ | |
| service: "tiktok", | |
| type: audioStreamType, | |
| u: r.urls, | |
| headers: r.headers, | |
| filename: r.audioFilename, | |
| isAudioOnly: true, | |
| audioFormat, | |
| }) | |
| } | |
| break; | |
| } | |
| break; | |
| case "video": | |
| switch (host) { | |
| case "bilibili": | |
| params = { type: "merge" }; | |
| break; | |
| case "youtube": | |
| params = { type: r.type }; | |
| break; | |
| case "reddit": | |
| responseType = r.typeId; | |
| params = { type: r.type }; | |
| break; | |
| case "vimeo": | |
| if (Array.isArray(r.urls)) { | |
| params = { type: "merge" } | |
| } else { | |
| responseType = "redirect"; | |
| } | |
| break; | |
| case "twitter": | |
| if (r.type === "remux") { | |
| params = { type: r.type }; | |
| } else { | |
| responseType = "redirect"; | |
| } | |
| break; | |
| case "vk": | |
| case "tiktok": | |
| params = { type: "proxy" }; | |
| break; | |
| case "facebook": | |
| case "vine": | |
| case "instagram": | |
| case "tumblr": | |
| case "pinterest": | |
| case "streamable": | |
| case "snapchat": | |
| case "loom": | |
| case "twitch": | |
| responseType = "redirect"; | |
| break; | |
| } | |
| break; | |
| case "audio": | |
| if (audioIgnore.includes(host) || (host === "reddit" && r.typeId === "redirect")) { | |
| return createResponse("error", { | |
| code: "error.api.fetch.empty" | |
| }) | |
| } | |
| let processType = "audio"; | |
| let copy = false; | |
| if (audioFormat === "best") { | |
| const serviceBestAudio = r.bestAudio; | |
| if (serviceBestAudio) { | |
| audioFormat = serviceBestAudio; | |
| processType = "proxy"; | |
| if (host === "soundcloud") { | |
| processType = "audio"; | |
| copy = true; | |
| } | |
| } else { | |
| audioFormat = "m4a"; | |
| copy = true; | |
| } | |
| } | |
| if (r.isM3U8 || host === "vimeo") { | |
| copy = false; | |
| processType = "audio"; | |
| } | |
| params = { | |
| type: processType, | |
| u: Array.isArray(r.urls) ? r.urls[1] : r.urls, | |
| audioBitrate, | |
| audioCopy: copy, | |
| audioFormat, | |
| } | |
| break; | |
| } | |
| if (defaultParams.filename && (action === "picker" || action === "audio")) { | |
| defaultParams.filename += `.${audioFormat}`; | |
| } | |
| if (alwaysProxy && responseType === "redirect") { | |
| responseType = "tunnel"; | |
| params.type = "proxy"; | |
| } | |
| return createResponse(responseType, {...defaultParams, ...params}) | |
| } | |