{"version":3,"sources":["../src/utils/video.ts","../src/utils/parserTitles.ts","../src/utils/fileExist.ts","../src/utils/agent.ts","../src/utils/audio.ts","../src/utils/createStreamAudio.ts","../src/utils/createStreamVideo.ts","../src/utils/getInfo.ts"],"sourcesContent":["import ytdl, { videoFormat } from \"@distube/ytdl-core\";\r\nimport path from \"path\";\r\nimport ffmpeg from \"ffmpeg-static\";\r\nimport cp from \"child_process\";\r\nimport parser from \"./parserTitles\";\r\nimport { ConvertOptions, FFmpegProcess, MessageResult } from \"../types\";\r\nimport fileExist from \"./fileExist\";\r\nimport { agent, useAgent } from \"./agent\";\r\n\r\nasync function Video(options: ConvertOptions) {\r\n  const {\r\n    directory = \"./\",\r\n    itag,\r\n    url,\r\n    title,\r\n    onDownloading,\r\n    ffmpegPath,\r\n  } = options;\r\n\r\n  const tracker = {\r\n    audio: {\r\n      total: null,\r\n      downloaded: null,\r\n    },\r\n    video: {\r\n      total: null,\r\n      downloaded: null,\r\n    },\r\n  };\r\n\r\n  // Info Youtube\r\n  const videoInfo = await ytdl.getInfo(url, {\r\n    agent: useAgent ? agent : undefined,\r\n  });\r\n  let format: videoFormat;\r\n  if (itag) {\r\n    format = videoInfo.formats.find((fm) => fm.itag === itag);\r\n  }\r\n  const fileTitle = title || parser(videoInfo.videoDetails.title);\r\n  // Stream audio and video\r\n  const audio = ytdl(url, {\r\n    quality: \"highestaudio\",\r\n  })\r\n    .on(\"progress\", (_, downloaded, total) => {\r\n      tracker.audio = { downloaded, total };\r\n    })\r\n    .on(\"error\", (error) => {\r\n      console.error(error);\r\n    });\r\n  const video = ytdl(url, {\r\n    quality: format?.itag || \"highestvideo\",\r\n  })\r\n    .on(\"progress\", (_, downloaded, total) => {\r\n      tracker.video = { downloaded, total };\r\n    })\r\n    .on(\"error\", (error) => {\r\n      console.error(error);\r\n    });\r\n\r\n  const pathname = path.resolve(process.cwd(), directory, `${fileTitle}.mp4`);\r\n\r\n  const promise = new Promise<MessageResult>((resolve, reject) => {\r\n    if (fileExist(pathname)) {\r\n      resolve({\r\n        message: `File already downloaded in ${pathname}`,\r\n        error: false,\r\n        videoInfo,\r\n        pathfile: pathname,\r\n      });\r\n    } else {\r\n      const ffmpegProcess = cp.spawn(\r\n        ffmpegPath || ffmpeg,\r\n        [\r\n          \"-loglevel\",\r\n          \"8\",\r\n          \"-hide_banner\",\r\n          \"-progress\",\r\n          \"pipe:3\",\r\n          \"-i\",\r\n          \"pipe:4\",\r\n          \"-i\",\r\n          \"pipe:5\",\r\n          \"-map\",\r\n          \"0:a\",\r\n          \"-map\",\r\n          \"1:v\",\r\n          \"-c:v\",\r\n          \"copy\",\r\n          `${pathname}`,\r\n        ],\r\n        {\r\n          windowsHide: true,\r\n          stdio: [\"inherit\", \"inherit\", \"inherit\", \"pipe\", \"pipe\", \"pipe\"],\r\n        }\r\n      ) as unknown as FFmpegProcess;\r\n\r\n      if (ffmpegProcess === undefined) {\r\n        reject(new Error(\"Cannot initialize ffmpeg\"));\r\n      }\r\n\r\n      ffmpegProcess.stdio[3].on(\"data\", () => {\r\n        const videoTotal =\r\n          (tracker.video.downloaded / tracker.video.total) * 100;\r\n        const audioTotal =\r\n          (tracker.audio.downloaded / tracker.audio.total) * 100;\r\n        const total = (videoTotal + audioTotal) / 2;\r\n        const videoSize = tracker.video.total + tracker.audio.total;\r\n        // eslint-disable-next-line object-curly-newline\r\n        if (onDownloading)\r\n          onDownloading({ percentage: total, size: videoSize });\r\n      });\r\n\r\n      ffmpegProcess.on(\"close\", () => {\r\n        resolve({\r\n          message: `File in ${pathname}`,\r\n          error: false,\r\n          videoInfo,\r\n          pathfile: pathname,\r\n        });\r\n      });\r\n\r\n      audio.pipe(ffmpegProcess.stdio[4]);\r\n      video.pipe(ffmpegProcess.stdio[5]);\r\n    }\r\n  });\r\n  return promise;\r\n}\r\nexport default Video;\r\n","const parserTitles = (title:string) => {\r\n  const regex = /[\\\\,:,?,|,¿,*,<,>,\",/]/g;\r\n  return title.replace(regex, '');\r\n};\r\n\r\nexport default parserTitles;\r\n","import fs from 'fs';\r\n\r\nconst fileExist = (pathname:string) => fs.existsSync(pathname);\r\n\r\nexport default fileExist;\r\n","import ytdl, { Agent } from '@distube/ytdl-core';\r\nimport dotenv from 'dotenv';\r\n\r\ndotenv.config();\r\n\r\nconst useAgent = !!process.env.PROXY_URL;\r\nlet agent : Agent | undefined;\r\nif (process.env.PROXY_URL) {\r\n  agent = ytdl.createProxyAgent({ uri: process.env.PROXY_URL });\r\n}\r\nexport { agent, useAgent };\r\n","import ytdl, { videoFormat } from '@distube/ytdl-core';\r\nimport path from 'path';\r\nimport ffmpeg from 'ffmpeg-static';\r\nimport cp from 'child_process';\r\nimport ffmMT from 'ffmetadata';\r\nimport parser from './parserTitles';\r\nimport { ConvertOptions, FFmpegProcess, MessageResult } from '../types';\r\nimport fileExist from './fileExist';\r\nimport { agent, useAgent } from './agent';\r\n\r\nasync function Audio(options : ConvertOptions) {\r\n  const {\r\n    directory = './', itag, url, title, onDownloading, ffmpegPath,\r\n  } = options;\r\n\r\n  const tracker = {\r\n    total: null,\r\n    downloaded: null,\r\n  };\r\n\r\n  // Info Youtube\r\n  const videoInfo = await ytdl.getInfo(url, { agent: useAgent ? agent : undefined });\r\n  let format : videoFormat;\r\n  if (itag) { format = videoInfo.formats.find((fm) => fm.itag === itag); }\r\n  const fileTitle = title || parser(videoInfo.videoDetails.title);\r\n\r\n  // Stream audio and video\r\n  const stream = ytdl(url, {\r\n    filter: 'audioonly',\r\n    quality: format?.itag || 'highestaudio',\r\n    agent: useAgent ? agent : undefined,\r\n  }).on('progress', (_, downloaded, total) => {\r\n    tracker.total = total;\r\n    tracker.downloaded = downloaded;\r\n  });\r\n\r\n  const pathname = path.resolve(process.cwd(), directory, `${fileTitle}.mp3`);\r\n\r\n  const promise = new Promise<MessageResult>((resolve, reject) => {\r\n    if (fileExist(pathname)) {\r\n      resolve({\r\n        message: `File already downloaded in ${pathname}`, error: false, videoInfo, pathfile: pathname,\r\n      });\r\n    } else {\r\n      const ffmpegProcess : FFmpegProcess = cp.spawn(ffmpegPath || ffmpeg, [\r\n        '-loglevel', '8', '-hide_banner',\r\n        '-progress', 'pipe:3',\r\n        '-i', 'pipe:4',\r\n        `${pathname}`,\r\n      ], {\r\n        windowsHide: true,\r\n        stdio: [\r\n          'inherit', 'inherit', 'inherit',\r\n          'pipe', 'pipe', 'pipe',\r\n        ],\r\n      });\r\n      if (ffmpegProcess === undefined) {\r\n        reject(new Error('Cannot initialize ffmpeg'));\r\n      }\r\n      ffmpegProcess.stdio[3].on('data', () => {\r\n        const percentage = ((tracker.downloaded / tracker.total) * 100);\r\n        const size = tracker.total;\r\n        if (onDownloading) onDownloading({ percentage, size });\r\n      });\r\n\r\n      ffmpegProcess.on('close', () => {\r\n        const metadata = {\r\n          artist: videoInfo.videoDetails.author.name,\r\n          title: fileTitle,\r\n          album: videoInfo.videoDetails.author.name,\r\n        };\r\n        ffmMT.setFfmpegPath(ffmpegPath || ffmpeg);\r\n        ffmMT.write(pathname, metadata, (err) => {\r\n          if (err) throw err;\r\n          resolve({\r\n            message: `File in ${pathname}`, error: false, videoInfo, pathfile: pathname,\r\n          });\r\n        });\r\n      });\r\n\r\n      stream.pipe(ffmpegProcess.stdio[4]);\r\n    }\r\n  });\r\n  return promise;\r\n}\r\nexport default Audio;\r\n","import ytdl, { videoFormat } from '@distube/ytdl-core';\r\nimport { spawn } from 'child_process';\r\nimport ffmpeg from 'ffmpeg-static';\r\nimport { ConvertOptions } from '../types';\r\nimport { agent, useAgent } from './agent';\r\n\r\ninterface Options extends Omit<ConvertOptions, 'onDownloading' | 'directory' | 'title'>{}\r\n\r\nexport default async function createStreamAudio(options:Options) {\r\n  const { url, itag } = options;\r\n\r\n  const info = await ytdl.getInfo(url);\r\n\r\n  const stream = ytdl(url, {\r\n    filter: 'audioonly',\r\n    quality: itag,\r\n    agent: useAgent ? agent : undefined,\r\n  });\r\n\r\n  const ffmpegProcess = spawn(ffmpeg, [\r\n    '-i', 'pipe:0',\r\n    '-f', 'mp3',\r\n    '-ar', '48000',\r\n    '-ac', '2',\r\n    '-b:a', '192k',\r\n    // Add metadata\r\n    '-metadata', `title=${info.videoDetails.title}`,\r\n    '-metadata', `artist=${info.videoDetails.author.name}`,\r\n    '-metadata', `album=${info.videoDetails.author.name}`,\r\n    'pipe:1',\r\n  ], {\r\n    stdio: ['pipe', 'pipe', 'ignore'],\r\n  });\r\n\r\n  stream.pipe(ffmpegProcess.stdin);\r\n\r\n  return ffmpegProcess.stdout;\r\n}\r\n","import { spawn } from \"child_process\";\r\nimport ytdl from \"@distube/ytdl-core\";\r\nimport ffmpeg from \"ffmpeg-static\";\r\nimport { ConvertOptions, FFmpegProcess } from \"../types\";\r\nimport { useAgent, agent } from \"./agent\";\r\n\r\ninterface Options\r\n  extends Omit<ConvertOptions, \"onDownloading\" | \"directory\" | \"title\"> {}\r\n\r\nexport default async function createStreamVideo(options: Options) {\r\n  const { url, itag } = options;\r\n\r\n  const tracker = {\r\n    audio: {\r\n      total: null,\r\n      downloaded: null,\r\n    },\r\n    video: {\r\n      total: null,\r\n      downloaded: null,\r\n    },\r\n  };\r\n\r\n  const audio = ytdl(url, {\r\n    quality: \"highestaudio\",\r\n  })\r\n    .on(\"progress\", (_, downloaded, total) => {\r\n      tracker.audio = { downloaded, total };\r\n    })\r\n    .on(\"error\", (e) => console.log(e));\r\n  const video = ytdl(url, {\r\n    quality: itag,\r\n  })\r\n    .on(\"progress\", (_, downloaded, total) => {\r\n      tracker.video = { downloaded, total };\r\n    })\r\n    .on(\"error\", (e) => console.log(e));\r\n\r\n  const ffmpegProcess = spawn(\r\n    ffmpeg,\r\n    [\r\n      \"-hide_banner\",\r\n      \"-progress\",\r\n      \"pipe:5\",\r\n      \"-i\",\r\n      \"pipe:3\", // Input audio\r\n      \"-i\",\r\n      \"pipe:4\", // Input video\r\n      \"-map\",\r\n      \"0:a\",\r\n      \"-map\",\r\n      \"1:v\",\r\n      \"-c:v\",\r\n      \"copy\", // Códec de video\r\n      \"-f\",\r\n      \"matroska\", // Formato de salida\r\n      \"pipe:1\", // Salida por pipe\r\n    ],\r\n    {\r\n      windowsHide: true,\r\n      stdio: [\"pipe\", \"pipe\", \"ignore\", \"pipe\", \"pipe\", \"pipe\"],\r\n    }\r\n  ) as unknown as FFmpegProcess;\r\n\r\n  audio.pipe(ffmpegProcess.stdio[3]);\r\n  video.pipe(ffmpegProcess.stdio[4]);\r\n\r\n  ffmpegProcess.stdio[5].on(\"data\", (chunk) => {\r\n    const videoTotal = (tracker.video.downloaded / tracker.video.total) * 100;\r\n    const audioTotal = (tracker.audio.downloaded / tracker.audio.total) * 100;\r\n    const total = (videoTotal + audioTotal) / 2;\r\n    const videoSize = tracker.video.total + tracker.audio.total;\r\n    const videoSizeMB = videoSize / 1024 / 1024;\r\n    const downloadedMB =\r\n      (tracker.video.downloaded + tracker.audio.downloaded) / 1024 / 1024;\r\n\r\n    console.log(\r\n      `Progress: ${total.toFixed(2)}% - ${downloadedMB.toFixed(\r\n        2\r\n      )}MB/${videoSizeMB.toFixed(2)}MB`\r\n    );\r\n  });\r\n\r\n  return ffmpegProcess.stdout; // Regresa el stream de salida\r\n}\r\n","import ytdl, {\r\n  Author, thumbnail, videoFormat,\r\n} from '@distube/ytdl-core';\r\nimport { agent, useAgent } from './agent';\r\n\r\n/**\r\n * @typedef {object} thumbnail\r\n * @property {string} url\r\n * @property {number} width\r\n * @property {number} height\r\n */\r\n\r\n/**\r\n * @typedef {object} format\r\n * @property {number} audioBitrate\r\n * @property {number} audioQuality\r\n * @property {number} approxDurationMs\r\n * @property {string} container\r\n * @property {boolean} hasAudio\r\n * @property {boolean} hasVideo\r\n * @property {number} itag\r\n * @property {string} quality\r\n * @property {string} qualityLabel\r\n */\r\n\r\n/**\r\n * @typedef {object} videoInfo\r\n * @property {string} title\r\n * @property {string} author\r\n * @property {number} lengthSeconds\r\n * @property {number} viewCount\r\n * @property {Array<format>} formats\r\n * @property {Array<format>} formatsAudio\r\n * @property {Array<format>} formatsVideo\r\n * @property {Array<thumbnail>} thumbnails\r\n */\r\n\r\n/**\r\n * @param {string} url\r\n * @return {Promise<videoInfo>}\r\n * @memberof module:yt-converter\r\n */\r\n\r\ninterface Info{\r\n  title: string;\r\n  author: Author;\r\n  lengthSeconds: string;\r\n  viewCount: string;\r\n  likes: number;\r\n  averageRating: number;\r\n  thumbnails: Array<thumbnail>;\r\n  formats: Array<videoFormat>;\r\n  formatsAudio: Array<videoFormat>;\r\n  formatsVideo: Array<videoFormat>;\r\n}\r\n\r\nconst getInfo = (url) => new Promise<Info>((resolve, reject) => {\r\n  try {\r\n    ytdl.getInfo(url, { agent: useAgent ? agent : undefined }).then((info) => {\r\n      const {\r\n        title, author, lengthSeconds, viewCount, likes, averageRating, thumbnails,\r\n      } = info.videoDetails;\r\n\r\n      const { formats } = info;\r\n\r\n      const formatsAudio = formats.filter((format) => format.hasAudio && !format.hasVideo);\r\n      const formatsVideo = formats.filter((format) => format.hasVideo && !format.hasAudio);\r\n\r\n      const infoObj = {\r\n        title,\r\n        author,\r\n        lengthSeconds,\r\n        viewCount,\r\n        likes,\r\n        averageRating,\r\n        thumbnails,\r\n        formats,\r\n        formatsAudio,\r\n        formatsVideo,\r\n      };\r\n      resolve(infoObj);\r\n    }).catch((err) => reject(err));\r\n  } catch (e) {\r\n    reject(e);\r\n  }\r\n});\r\n\r\nexport default getInfo;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,OAAOA,WAA2B;AAClC,OAAO,UAAU;AACjB,OAAO,YAAY;AACnB,OAAO,QAAQ;;;ACHf,IAAM,eAAe,CAAC,UAAiB;AACrC,QAAM,QAAQ;AACd,SAAO,MAAM,QAAQ,OAAO,EAAE;AAChC;AAEA,IAAO,uBAAQ;;;ACLf,OAAO,QAAQ;AAEf,IAAM,YAAY,CAAC,aAAoB,GAAG,WAAW,QAAQ;AAE7D,IAAO,oBAAQ;;;ACJf,OAAO,UAAqB;AAC5B,OAAO,YAAY;AAEnB,OAAO,OAAO;AAEd,IAAM,WAAW,CAAC,CAAC,QAAQ,IAAI;AAC/B,IAAI;AACJ,IAAI,QAAQ,IAAI,WAAW;AACzB,UAAQ,KAAK,iBAAiB,EAAE,KAAK,QAAQ,IAAI,UAAU,CAAC;AAC9D;;;AHAA,SAAe,MAAM,SAAyB;AAAA;AAC5C,UAAM;AAAA,MACJ,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAEJ,UAAM,UAAU;AAAA,MACd,OAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,IACF;AAGA,UAAM,YAAY,MAAMC,MAAK,QAAQ,KAAK;AAAA,MACxC,OAAO,WAAW,QAAQ;AAAA,IAC5B,CAAC;AACD,QAAI;AACJ,QAAI,MAAM;AACR,eAAS,UAAU,QAAQ,KAAK,CAAC,OAAO,GAAG,SAAS,IAAI;AAAA,IAC1D;AACA,UAAM,YAAY,SAAS,qBAAO,UAAU,aAAa,KAAK;AAE9D,UAAM,QAAQA,MAAK,KAAK;AAAA,MACtB,SAAS;AAAA,IACX,CAAC,EACE,GAAG,YAAY,CAAC,GAAG,YAAY,UAAU;AACxC,cAAQ,QAAQ,EAAE,YAAY,MAAM;AAAA,IACtC,CAAC,EACA,GAAG,SAAS,CAAC,UAAU;AACtB,cAAQ,MAAM,KAAK;AAAA,IACrB,CAAC;AACH,UAAM,QAAQA,MAAK,KAAK;AAAA,MACtB,UAAS,iCAAQ,SAAQ;AAAA,IAC3B,CAAC,EACE,GAAG,YAAY,CAAC,GAAG,YAAY,UAAU;AACxC,cAAQ,QAAQ,EAAE,YAAY,MAAM;AAAA,IACtC,CAAC,EACA,GAAG,SAAS,CAAC,UAAU;AACtB,cAAQ,MAAM,KAAK;AAAA,IACrB,CAAC;AAEH,UAAM,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,WAAW,GAAG,SAAS,MAAM;AAE1E,UAAM,UAAU,IAAI,QAAuB,CAAC,SAAS,WAAW;AAC9D,UAAI,kBAAU,QAAQ,GAAG;AACvB,gBAAQ;AAAA,UACN,SAAS,8BAA8B,QAAQ;AAAA,UAC/C,OAAO;AAAA,UACP;AAAA,UACA,UAAU;AAAA,QACZ,CAAC;AAAA,MACH,OAAO;AACL,cAAM,gBAAgB,GAAG;AAAA,UACvB,cAAc;AAAA,UACd;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,GAAG,QAAQ;AAAA,UACb;AAAA,UACA;AAAA,YACE,aAAa;AAAA,YACb,OAAO,CAAC,WAAW,WAAW,WAAW,QAAQ,QAAQ,MAAM;AAAA,UACjE;AAAA,QACF;AAEA,YAAI,kBAAkB,QAAW;AAC/B,iBAAO,IAAI,MAAM,0BAA0B,CAAC;AAAA,QAC9C;AAEA,sBAAc,MAAM,CAAC,EAAE,GAAG,QAAQ,MAAM;AACtC,gBAAM,aACH,QAAQ,MAAM,aAAa,QAAQ,MAAM,QAAS;AACrD,gBAAM,aACH,QAAQ,MAAM,aAAa,QAAQ,MAAM,QAAS;AACrD,gBAAM,SAAS,aAAa,cAAc;AAC1C,gBAAM,YAAY,QAAQ,MAAM,QAAQ,QAAQ,MAAM;AAEtD,cAAI;AACF,0BAAc,EAAE,YAAY,OAAO,MAAM,UAAU,CAAC;AAAA,QACxD,CAAC;AAED,sBAAc,GAAG,SAAS,MAAM;AAC9B,kBAAQ;AAAA,YACN,SAAS,WAAW,QAAQ;AAAA,YAC5B,OAAO;AAAA,YACP;AAAA,YACA,UAAU;AAAA,UACZ,CAAC;AAAA,QACH,CAAC;AAED,cAAM,KAAK,cAAc,MAAM,CAAC,CAAC;AACjC,cAAM,KAAK,cAAc,MAAM,CAAC,CAAC;AAAA,MACnC;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AACA,IAAO,gBAAQ;;;AI/Hf,OAAOC,WAA2B;AAClC,OAAOC,WAAU;AACjB,OAAOC,aAAY;AACnB,OAAOC,SAAQ;AACf,OAAO,WAAW;AAMlB,SAAe,MAAM,SAA0B;AAAA;AAC7C,UAAM;AAAA,MACJ,YAAY;AAAA,MAAM;AAAA,MAAM;AAAA,MAAK;AAAA,MAAO;AAAA,MAAe;AAAA,IACrD,IAAI;AAEJ,UAAM,UAAU;AAAA,MACd,OAAO;AAAA,MACP,YAAY;AAAA,IACd;AAGA,UAAM,YAAY,MAAMC,MAAK,QAAQ,KAAK,EAAE,OAAO,WAAW,QAAQ,OAAU,CAAC;AACjF,QAAI;AACJ,QAAI,MAAM;AAAE,eAAS,UAAU,QAAQ,KAAK,CAAC,OAAO,GAAG,SAAS,IAAI;AAAA,IAAG;AACvE,UAAM,YAAY,SAAS,qBAAO,UAAU,aAAa,KAAK;AAG9D,UAAM,SAASA,MAAK,KAAK;AAAA,MACvB,QAAQ;AAAA,MACR,UAAS,iCAAQ,SAAQ;AAAA,MACzB,OAAO,WAAW,QAAQ;AAAA,IAC5B,CAAC,EAAE,GAAG,YAAY,CAAC,GAAG,YAAY,UAAU;AAC1C,cAAQ,QAAQ;AAChB,cAAQ,aAAa;AAAA,IACvB,CAAC;AAED,UAAM,WAAWC,MAAK,QAAQ,QAAQ,IAAI,GAAG,WAAW,GAAG,SAAS,MAAM;AAE1E,UAAM,UAAU,IAAI,QAAuB,CAAC,SAAS,WAAW;AAC9D,UAAI,kBAAU,QAAQ,GAAG;AACvB,gBAAQ;AAAA,UACN,SAAS,8BAA8B,QAAQ;AAAA,UAAI,OAAO;AAAA,UAAO;AAAA,UAAW,UAAU;AAAA,QACxF,CAAC;AAAA,MACH,OAAO;AACL,cAAM,gBAAgCC,IAAG,MAAM,cAAcC,SAAQ;AAAA,UACnE;AAAA,UAAa;AAAA,UAAK;AAAA,UAClB;AAAA,UAAa;AAAA,UACb;AAAA,UAAM;AAAA,UACN,GAAG,QAAQ;AAAA,QACb,GAAG;AAAA,UACD,aAAa;AAAA,UACb,OAAO;AAAA,YACL;AAAA,YAAW;AAAA,YAAW;AAAA,YACtB;AAAA,YAAQ;AAAA,YAAQ;AAAA,UAClB;AAAA,QACF,CAAC;AACD,YAAI,kBAAkB,QAAW;AAC/B,iBAAO,IAAI,MAAM,0BAA0B,CAAC;AAAA,QAC9C;AACA,sBAAc,MAAM,CAAC,EAAE,GAAG,QAAQ,MAAM;AACtC,gBAAM,aAAe,QAAQ,aAAa,QAAQ,QAAS;AAC3D,gBAAM,OAAO,QAAQ;AACrB,cAAI,cAAe,eAAc,EAAE,YAAY,KAAK,CAAC;AAAA,QACvD,CAAC;AAED,sBAAc,GAAG,SAAS,MAAM;AAC9B,gBAAM,WAAW;AAAA,YACf,QAAQ,UAAU,aAAa,OAAO;AAAA,YACtC,OAAO;AAAA,YACP,OAAO,UAAU,aAAa,OAAO;AAAA,UACvC;AACA,gBAAM,cAAc,cAAcA,OAAM;AACxC,gBAAM,MAAM,UAAU,UAAU,CAAC,QAAQ;AACvC,gBAAI,IAAK,OAAM;AACf,oBAAQ;AAAA,cACN,SAAS,WAAW,QAAQ;AAAA,cAAI,OAAO;AAAA,cAAO;AAAA,cAAW,UAAU;AAAA,YACrE,CAAC;AAAA,UACH,CAAC;AAAA,QACH,CAAC;AAED,eAAO,KAAK,cAAc,MAAM,CAAC,CAAC;AAAA,MACpC;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AACA,IAAO,gBAAQ;;;ACrFf,OAAOC,WAA2B;AAClC,SAAS,aAAa;AACtB,OAAOC,aAAY;AAMnB,SAAO,kBAAyC,SAAiB;AAAA;AAC/D,UAAM,EAAE,KAAK,KAAK,IAAI;AAEtB,UAAM,OAAO,MAAMC,MAAK,QAAQ,GAAG;AAEnC,UAAM,SAASA,MAAK,KAAK;AAAA,MACvB,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,OAAO,WAAW,QAAQ;AAAA,IAC5B,CAAC;AAED,UAAM,gBAAgB,MAAMC,SAAQ;AAAA,MAClC;AAAA,MAAM;AAAA,MACN;AAAA,MAAM;AAAA,MACN;AAAA,MAAO;AAAA,MACP;AAAA,MAAO;AAAA,MACP;AAAA,MAAQ;AAAA;AAAA,MAER;AAAA,MAAa,SAAS,KAAK,aAAa,KAAK;AAAA,MAC7C;AAAA,MAAa,UAAU,KAAK,aAAa,OAAO,IAAI;AAAA,MACpD;AAAA,MAAa,SAAS,KAAK,aAAa,OAAO,IAAI;AAAA,MACnD;AAAA,IACF,GAAG;AAAA,MACD,OAAO,CAAC,QAAQ,QAAQ,QAAQ;AAAA,IAClC,CAAC;AAED,WAAO,KAAK,cAAc,KAAK;AAE/B,WAAO,cAAc;AAAA,EACvB;AAAA;;;ACrCA,SAAS,SAAAC,cAAa;AACtB,OAAOC,WAAU;AACjB,OAAOC,aAAY;AAOnB,SAAO,kBAAyC,SAAkB;AAAA;AAChE,UAAM,EAAE,KAAK,KAAK,IAAI;AAEtB,UAAM,UAAU;AAAA,MACd,OAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,MACA,OAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,IACF;AAEA,UAAM,QAAQC,MAAK,KAAK;AAAA,MACtB,SAAS;AAAA,IACX,CAAC,EACE,GAAG,YAAY,CAAC,GAAG,YAAY,UAAU;AACxC,cAAQ,QAAQ,EAAE,YAAY,MAAM;AAAA,IACtC,CAAC,EACA,GAAG,SAAS,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AACpC,UAAM,QAAQA,MAAK,KAAK;AAAA,MACtB,SAAS;AAAA,IACX,CAAC,EACE,GAAG,YAAY,CAAC,GAAG,YAAY,UAAU;AACxC,cAAQ,QAAQ,EAAE,YAAY,MAAM;AAAA,IACtC,CAAC,EACA,GAAG,SAAS,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AAEpC,UAAM,gBAAgBC;AAAA,MACpBC;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QACA;AAAA;AAAA,MACF;AAAA,MACA;AAAA,QACE,aAAa;AAAA,QACb,OAAO,CAAC,QAAQ,QAAQ,UAAU,QAAQ,QAAQ,MAAM;AAAA,MAC1D;AAAA,IACF;AAEA,UAAM,KAAK,cAAc,MAAM,CAAC,CAAC;AACjC,UAAM,KAAK,cAAc,MAAM,CAAC,CAAC;AAEjC,kBAAc,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,UAAU;AAC3C,YAAM,aAAc,QAAQ,MAAM,aAAa,QAAQ,MAAM,QAAS;AACtE,YAAM,aAAc,QAAQ,MAAM,aAAa,QAAQ,MAAM,QAAS;AACtE,YAAM,SAAS,aAAa,cAAc;AAC1C,YAAM,YAAY,QAAQ,MAAM,QAAQ,QAAQ,MAAM;AACtD,YAAM,cAAc,YAAY,OAAO;AACvC,YAAM,gBACH,QAAQ,MAAM,aAAa,QAAQ,MAAM,cAAc,OAAO;AAEjE,cAAQ;AAAA,QACN,aAAa,MAAM,QAAQ,CAAC,CAAC,OAAO,aAAa;AAAA,UAC/C;AAAA,QACF,CAAC,MAAM,YAAY,QAAQ,CAAC,CAAC;AAAA,MAC/B;AAAA,IACF,CAAC;AAED,WAAO,cAAc;AAAA,EACvB;AAAA;;;ACpFA,OAAOC,WAEA;AAsDP,IAAM,UAAU,CAAC,QAAQ,IAAI,QAAc,CAAC,SAAS,WAAW;AAC9D,MAAI;AACF,IAAAC,MAAK,QAAQ,KAAK,EAAE,OAAO,WAAW,QAAQ,OAAU,CAAC,EAAE,KAAK,CAAC,SAAS;AACxE,YAAM;AAAA,QACJ;AAAA,QAAO;AAAA,QAAQ;AAAA,QAAe;AAAA,QAAW;AAAA,QAAO;AAAA,QAAe;AAAA,MACjE,IAAI,KAAK;AAET,YAAM,EAAE,QAAQ,IAAI;AAEpB,YAAM,eAAe,QAAQ,OAAO,CAAC,WAAW,OAAO,YAAY,CAAC,OAAO,QAAQ;AACnF,YAAM,eAAe,QAAQ,OAAO,CAAC,WAAW,OAAO,YAAY,CAAC,OAAO,QAAQ;AAEnF,YAAM,UAAU;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,OAAO;AAAA,IACjB,CAAC,EAAE,MAAM,CAAC,QAAQ,OAAO,GAAG,CAAC;AAAA,EAC/B,SAAS,GAAG;AACV,WAAO,CAAC;AAAA,EACV;AACF,CAAC;AAED,IAAO,kBAAQ;","names":["ytdl","ytdl","ytdl","path","ffmpeg","cp","ytdl","path","cp","ffmpeg","ytdl","ffmpeg","ytdl","ffmpeg","spawn","ytdl","ffmpeg","ytdl","spawn","ffmpeg","ytdl","ytdl"]}