@hunghg255/yt-dlp
Version:
yt-dlp plugin for DisTube.js.org
1 lines • 8.55 kB
Source Map (JSON)
{"version":3,"sources":["../src/wrapper.ts","../src/env.ts","../src/index.ts"],"sourcesContent":["import dargs from \"dargs\";\nimport execa from \"execa\";\nimport mkdirp from \"mkdirp\";\nimport fs from \"node:fs/promises\";\nimport { type Dispatcher, request } from \"undici\";\nimport { YTDLP_DIR, YTDLP_FILENAME, YTDLP_PATH, YTDLP_URL } from \"./env\";\nimport type { YtDlpFlags, YtDlpResponse } from \"./type\";\n\nconst makeRequest = async (url: string): Promise<Dispatcher.ResponseData> => {\n const response: any = await request(url, { headers: { \"user-agent\": \"distube\" } });\n if (!response.statusCode) throw new Error(`Cannot make requests to '${url}'`);\n if (response.statusCode.toString().startsWith(\"3\")) {\n if (!response.headers.location) throw new Error(`Cannot redirect to '${url}'`);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _chunk of response.body) {\n // force consumption of body\n }\n return makeRequest(response.headers.location);\n }\n if (response.statusCode.toString().startsWith(\"2\")) return response;\n throw new Error(`${url}\\nStatus code ${response.statusCode.toString()}`);\n};\n\nconst args = (url: string, flags = {}) => [url].concat(dargs(flags, { useEquals: false })).filter(Boolean);\n\nexport const raw = (url: string, flags?: YtDlpFlags, options?: execa.Options<string>) =>\n execa(YTDLP_PATH, args(url, flags), options);\n\nexport const json = (url: string, flags?: YtDlpFlags, options?: execa.Options<string>): Promise<YtDlpResponse> =>\n raw(url, flags, options).then(({ stdout }) => JSON.parse(stdout));\n\nconst binContentTypes = [\"binary/octet-stream\", \"application/octet-stream\", \"application/x-binary\"];\nconst getBinary = async (url: string) => {\n const response = await makeRequest(url);\n const contentType: any = response.headers[\"content-type\"];\n\n if (binContentTypes.includes(contentType ?? \"\")) return { buffer: await response.body.arrayBuffer(), version: \"N/A\" };\n\n const [{ assets, tag_name }] = (await response.body.json()) as any;\n const { browser_download_url } = assets.find(({ name }: { name: string }) => name === YTDLP_FILENAME);\n return await makeRequest(browser_download_url).then(async r => ({\n buffer: await r.body.arrayBuffer(),\n version: typeof tag_name === \"string\" ? tag_name : \"N/A\",\n }));\n};\n\nexport const download = () =>\n Promise.all([getBinary(YTDLP_URL), mkdirp(YTDLP_DIR)]).then(([{ buffer, version }]) => {\n fs.writeFile(YTDLP_PATH, Buffer.from(buffer), { mode: 493 });\n return version;\n });\n","import path from \"path\";\n\nconst e = (key: string) => process.env[key];\n\nexport const YTDLP_DISABLE_DOWNLOAD = !!e(\"YTDLP_DISABLE_DOWNLOAD\");\nexport const YTDLP_URL = e(\"YTDLP_URL\") || \"https://api.github.com/repos/yt-dlp/yt-dlp/releases?per_page=1\";\nexport const YTDLP_IS_WINDOWS = e(\"YTDLP_IS_WINDOWS\") || process.platform === \"win32\";\nexport const YTDLP_DIR = e(\"YTDLP_DIR\") || path.join(__dirname, \"..\", \"bin\");\nexport const YTDLP_FILENAME = e(\"YTDLP_FILENAME\") || `yt-dlp${YTDLP_IS_WINDOWS ? \".exe\" : \"\"}`;\nexport const YTDLP_PATH = path.join(YTDLP_DIR, YTDLP_FILENAME);\n\nexport default { YTDLP_DIR, YTDLP_FILENAME, YTDLP_URL, YTDLP_PATH, YTDLP_IS_WINDOWS, YTDLP_DISABLE_DOWNLOAD };\n","import { download, json } from \"./wrapper\";\nimport { DisTubeError, ExtractorPlugin, Playlist, Song } from \"@hunghg255/distube\";\nimport type { PlaylistInfo } from \"@hunghg255/distube\";\nimport type { GuildMember } from \"discord.js\";\nimport type { YtDlpOptions, YtDlpPlaylist } from \"./type\";\n\nconst isPlaylist = (i: any): i is YtDlpPlaylist => Array.isArray(i.entries);\n\nexport class YtDlpPlugin extends ExtractorPlugin {\n constructor({ update }: YtDlpOptions = {}) {\n super();\n if (update ?? true) download().catch(() => undefined);\n }\n\n override validate() {\n return true;\n }\n\n async resolve<T>(url: string, { member, metadata }: { member?: GuildMember; metadata?: T }) {\n const info: any = await json(url, {\n dumpSingleJson: true,\n noWarnings: true,\n noCallHome: true,\n preferFreeFormats: true,\n skipDownload: true,\n simulate: true,\n }).catch(e => {\n throw new DisTubeError(\"YTDLP_ERROR\", `${e.stderr || e}`);\n });\n if (isPlaylist(info)) {\n if (info.entries.length === 0) throw new DisTubeError(\"YTDLP_ERROR\", \"The playlist is empty\");\n const playlist: PlaylistInfo = {\n ...info,\n source: info.extractor,\n songs: info.entries.map((i: any) => new Song(i, { member, source: i.extractor, metadata })),\n };\n return new Playlist(playlist, { member, metadata });\n }\n return new Song(info, { member, source: info.extractor, metadata });\n }\n\n override async getStreamURL(url: string) {\n const info = await json(url, {\n dumpSingleJson: true,\n noWarnings: true,\n noCallHome: true,\n preferFreeFormats: true,\n skipDownload: true,\n simulate: true,\n format: \"ba/ba*\",\n }).catch(e => {\n throw new DisTubeError(\"YTDLP_ERROR\", `${e.stderr || e}`);\n });\n if (isPlaylist(info)) throw new DisTubeError(\"YTDLP_ERROR\", \"Cannot get stream URL of a entire playlist\");\n return info.url;\n }\n}\n\nexport * from \"./wrapper\";\n"],"mappings":"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","names":["e"]}