azot 5.0.0-alpha.21 → 5.0.0-alpha.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/azot.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{A as shortVersion,C as SETTINGS_PATH,D as VITE_API_URL,E as APP_TITLE,O as VITE_PUBLIC_KEY,S as EXTENSIONS_SOURCES_DIR,T as APP_NAME,_ as APP_TEMP_DIR,a as prompt,b as EXTENSIONS_DIR,c as FileStorage,d as normalizeError,f as clearOutdatedLogs,g as APP_LOG_DIR,h as APP_DATA_DIR,i as httpClient,j as package_default,k as fullVersion,l as createConf,m as APP_CONFIG_DIR,n as load,o as getCurrentDateTimeString,p as logger,r as HttpClient,s as getLogPrefix,t as createContext,u as errors,v as DOWNLOAD_DIR,w as resolveDir,x as EXTENSIONS_INDEX_PATH,y as EXTENSIONS_DATA_DIR}from"./context-Bkk33DH6.mjs";import{createRequire}from"node:module";import fs,{constants,existsSync,rmSync}from"node:fs";import*as path$1 from"node:path";import path,{basename,dirname,extname,join,parse,resolve}from"node:path";import yargs from"yargs";import"urlpattern-polyfill";import colors from"picocolors";import*as fs$1 from"node:fs/promises";import fsp,{open,readFile,readdir,rm,stat,writeFile}from"node:fs/promises";import process$1,{platform,stdout}from"node:process";import{hideBin}from"yargs/helpers";import{EventEmitter as EventEmitter$1}from"node:events";import{z}from"zod";import{DASH_FORMATS,HLS_FORMATS,Input,UrlSource}from"dasha";import kyImport from"ky";import{Agent,ProxyAgent}from"undici";import{checkbox,confirm}from"@inquirer/prompts";import{execFileSync}from"node:child_process";import{createAuthClient}from"better-auth/client";import{deviceAuthorizationClient}from"better-auth/client/plugins";import{tributeClient}from"@tribute-tg/better-auth";import{QueryCache,QueryClient}from"@tanstack/query-core";import{createHash}from"node:crypto";import{inspect}from"node:util";import{ALL_FORMATS as ALL_FORMATS$1,EncodedAudioPacketSource,EncodedPacketSink,EncodedVideoPacketSource,Input as Input$1,MkvOutputFormat,Mp4OutputFormat,Output,StreamSource,StreamTarget,TextSubtitleSource,UrlSource as UrlSource$1}from"mediabunny";import{finished,pipeline}from"node:stream/promises";import{Readable}from"node:stream";import{isatty}from"node:tty";import{createSpinner}from"nanospinner";import{RemoteCdm,requestMediaKeySystemAccess}from"okova";import{Decryption,FilePathSource,FilePathTarget,Input as Input$2,Output as Output$1}from"shifro";import{convert}from"@transcrobes/subs-convert";import open$1 from"open";var __create=Object.create,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__commonJSMin=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),__copyProps=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=__getOwnPropNames(t),a=0,o=i.length,s;a<o;a++)s=i[a],!__hasOwnProp.call(e,s)&&s!==n&&__defProp(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=__getOwnPropDesc(t,s))||r.enumerable});return e},__toESM=(e,t,n)=>(n=e==null?{}:__create(__getProtoOf(e)),__copyProps(t||!e||!e.__esModule?__defProp(n,`default`,{value:e,enumerable:!0}):n,e)),__require=createRequire(import.meta.url);const getWinConsoleAddonPath=()=>{let e=[];process.resourcesPath&&e.push(join(process.resourcesPath,`bin`,`winconsole.node`));let t=join(__dirname,`..`,`..`,`..`);return e.push(join(t,`assets`,`bin`,`win32`,`winconsole.node`)),e.push(join(t,`native`,`winconsole`,`build`,`Release`,`winconsole.node`)),e.find(e=>existsSync(e))||null},loadWinConsoleAddon=()=>{if(process.platform!==`win32`)return null;let e=getWinConsoleAddonPath();if(!e)return null;try{return __require(e)}catch{return null}};if(process.platform===`win32`){let e=loadWinConsoleAddon();e&&(e.attachParentConsole?.(),e.enableUtf8?.())}const getCliArgs=(e=process.argv,t=process.env)=>t.ELECTRON_RUN_AS_NODE===`1`?e.slice(2):hideBin(e),getDefaultLanguage=()=>Intl.DateTimeFormat().resolvedOptions().locale.startsWith(`ru`)?`ru`:`en`,THEME={dark:`dark`,light:`light`,system:`system`},VIDEO_CONTAINER_FORMAT={mp4:`mp4`,mkv:`mkv`},SettingsSchema=z.object({downloadDir:z.string().default(DOWNLOAD_DIR),binariesDir:z.string().default(resolveDir(join(APP_CONFIG_DIR,`bin`))),drmDir:z.string().default(resolveDir(join(APP_CONFIG_DIR,`drm`))),language:z.string().default(getDefaultLanguage()),theme:z.enum([THEME.dark,THEME.light,THEME.system]).default(THEME.system),preferHardsub:z.coerce.boolean().default(!1),retry:z.coerce.number().int().min(1).max(10).default(3),connections:z.coerce.number().int().min(1).max(64).default(4),maxActiveDownloads:z.coerce.number().int().min(1).default(1),proxy:z.string().optional(),proxyMeta:z.string().optional(),proxyMedia:z.string().optional(),movieFilenameTemplate:z.string().default(`{title} ({quality}, {codec})`),seriesFilenameTemplate:z.string().default(`{title} S{s}E{e} ({quality}, {codec})`),developerMode:z.coerce.boolean().default(!1),allowUnknownSources:z.coerce.boolean().default(!1),videoContainerFormat:z.enum([VIDEO_CONTAINER_FORMAT.mp4,VIDEO_CONTAINER_FORMAT.mkv]).default(VIDEO_CONTAINER_FORMAT.mp4),useAlternativeServer:z.coerce.boolean().default(!1),automaticUpdates:z.coerce.boolean().default(!0)}),defaultSettings=SettingsSchema.parse({});var SettingsStore=class{#e;constructor(e){this.#e=createConf({defaults:defaultSettings,cwd:dirname(e),configName:basename(e,`.json`)}),this.#t()}#t(){let e=this.#e.store,t=SettingsSchema.safeParse(e),n=`{title}.{audioType}.{quality}.{tag}.{format}.{codec}`,r=`{title}.S{s}E{e}.{episodeTitle}.{audioType}.{quality}.{tag}.{format}.{codec}`;if(e.movieFilenameTemplate===`{title}.{audioType}.{quality}.{tag}.{format}.{codec}`&&this.#e.set(`movieFilenameTemplate`,e.seriesFilenameTemplate),e.seriesFilenameTemplate===`{title}.S{s}E{e}.{episodeTitle}.{audioType}.{quality}.{tag}.{format}.{codec}`&&this.#e.set(`seriesFilenameTemplate`,e.seriesFilenameTemplate),!t.success){console.warn(`Settings validation failed! Resetting to defaults.`,t.error.flatten()),this.#e.set(defaultSettings);return}Object.hasOwn(e,`askForOptions`)&&this.#e.set(t.data)}getAll(){return this.#e.store}get(e){return this.#e.get(e)}set(e){let t={...this.#e.store,...e},n=SettingsSchema.safeParse(t);if(!n.success)throw console.error(`Invalid settings update:`,n.error.flatten()),Error(`Settings update failed validation.`);this.#e.set(n.data)}onDidChange(e){this.#e.onDidAnyChange(e)}};const exists=async e=>{try{return await fsp.access(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}},ls=async(e,{recursive:t=!1}={})=>await fsp.readdir(e,{withFileTypes:!0,recursive:t}),rm$1=async(e,{recursive:t=!0,force:n=!0}={})=>{await fsp.rm(e,{recursive:t,force:n})},mkdir=async(e,{recursive:t=!0}={})=>{await fsp.mkdir(e,{recursive:t})},assertDownloadDirWritable=async e=>{try{await fsp.access(e,constants.W_OK)}catch(e){let t=e.code;throw t===`EPERM`||t===`EACCES`||t===`ENOENT`?Object.assign(Error(`Download directory is not writable`),{code:`DOWNLOAD_DIR_NOT_WRITABLE`}):e}},readJson=async e=>{try{let t=await fsp.readFile(e,{encoding:`utf8`});return JSON.parse(t)}catch(t){throw Error(`Failed to read JSON file: ${e}`,{cause:t})}},writeJson=async(e,t)=>{let n=parse(e).dir;try{let r=await exists(n);n&&!r&&await fsp.mkdir(n),await fsp.writeFile(e,JSON.stringify(t,null,2),`utf8`)}catch(t){throw Error(`Failed to save data to file: ${e}`,{cause:t})}},tar={extract:(e,t)=>execFileSync(`tar`,[`-xf`,e,...t?[`-C`,t]:[]],{stdio:`inherit`})},INSTALL_EXTENSION_ERROR_CODES={CHANNEL_NOT_FOUND:`EXTENSION_INSTALL_CHANNEL_NOT_FOUND`,VERSION_NOT_FOUND:`EXTENSION_INSTALL_VERSION_NOT_FOUND`,RELEASE_NOT_FOUND:`EXTENSION_INSTALL_RELEASE_NOT_FOUND`,ASSET_NOT_FOUND:`EXTENSION_INSTALL_ASSET_NOT_FOUND`,UNSUPPORTED_SOURCE:`EXTENSION_INSTALL_UNSUPPORTED_SOURCE`,UNSUPPORTED_PACKAGE_TYPE:`EXTENSION_INSTALL_UNSUPPORTED_PACKAGE_TYPE`,IMPORT_INVALID:`EXTENSION_INSTALL_IMPORT_INVALID`,SOURCE_NOT_FOUND:`EXTENSION_INSTALL_SOURCE_NOT_FOUND`,UNKNOWN:`EXTENSION_INSTALL_UNKNOWN`},KNOWN_INSTALL_EXTENSION_ERROR_CODES=new Set(Object.values(INSTALL_EXTENSION_ERROR_CODES));var InstallExtensionError=class extends Error{code;details;hint;constructor(e){super(e.message),this.name=`InstallExtensionError`,this.code=e.code,this.details=e.details,this.hint=e.hint}toPayload(){return{code:this.code,message:this.message,details:this.details,hint:this.hint}}};const createInstallExtensionError=(e,t,n,r)=>new InstallExtensionError({code:e,message:t,details:n,hint:r}),getChannel=e=>{let t=(e?.startsWith(`v`)?e[1]:e?.[0])??``;return Number.isNaN(parseInt(t))?e?.split(`.`).at(0)||`latest`:e?.split(`-`).at(1)?.split(`.`).at(0)||`latest`},getReleaseTag=e=>(e.version||e.tag_name||``).replace(/^v/,``),toUniqueList=e=>[...new Set(e.filter(Boolean))],getAvailableReleaseDetails=e=>({availableVersions:toUniqueList((e||[]).map(e=>getReleaseTag(e))),availableChannels:toUniqueList((e||[]).map(e=>getChannel(getReleaseTag(e))))}),createRequestedReleaseNotFoundError=(e,t,n)=>{let r={source:n,preferredVersion:e.preferredVersion,preferredChannel:e.preferredChannel,appChannel:e.appChannel,...getAvailableReleaseDetails(t)};return e.preferredVersion?createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.VERSION_NOT_FOUND,`Release not found for requested version: ${e.preferredVersion}`,r):createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.CHANNEL_NOT_FOUND,`Release not found for requested channel: ${e.preferredChannel}`,r)},selectRelease=(e,t,n)=>{if(!e?.length)return null;if(t.preferredVersion)return e.find(e=>getReleaseTag(e)===t.preferredVersion)||null;if(!t.isExplicitSelection){let t=e.find(e=>getChannel(getReleaseTag(e))===`latest`);if(t)return t}return e.find(e=>getChannel(getReleaseTag(e))===t.preferredChannel)||(t.allowFallback&&t.preferredChannel!==`latest`?(logger.debug(`Release ${t.preferredChannel} not found for ${n}, falling back to latest stable`),e.find(e=>getChannel(getReleaseTag(e))===`latest`)||(logger.debug(`Latest stable release not found for ${n}, falling back to latest with any channel`),e.at(0)||null)):null)},parseReleasePreference=e=>{let[,t=``]=e.split(`@`),n=e.replace(t?`@${t}`:``,``),r=getChannel(package_default.version),i=!!t;return{name:n,preferredVersion:Number.isNaN(parseInt(t[0]??``))?``:t,preferredChannel:i?getChannel(t):r,appChannel:r,isExplicitSelection:i,allowFallback:!i&&r!==`latest`}},fetchExtensionAsset=async(e,t)=>{logger.info(`Fetching bundle...`),logger.debug(e);let n=await fetch(e);if(!n.ok)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.ASSET_NOT_FOUND,`Failed to download extension bundle: ${n.status} ${n.statusText}`,{url:e,status:n.status,statusText:n.statusText});let r=n.headers.get(`content-disposition`)?.split(`filename=`)[1]?.split(`;`)[0]?.replaceAll(`"`,``),i=path.basename(e),a=t||r||i,o=await n.arrayBuffer(),s=path.join(EXTENSIONS_SOURCES_DIR,a);return await fsp.writeFile(s,Buffer.from(o)),await fsp.stat(s).then(e=>{logger.debug(`Bundle downloaded (${e.size/1e3} KB): ${s}`)}).catch(()=>{logger.error(`Bundle download failed: can't find output file`)}),s},downloadExtension=async(e,t)=>{if(e.startsWith(`npm:`)||e.startsWith(`@streamyx/`))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.UNSUPPORTED_SOURCE,`NPM extension sources are no longer supported`,{source:e});let n=e,r=e,i=path.dirname(e),a=i!==`.`&&await fsp.stat(i).then(()=>!0,()=>!1),o=e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`/`)||e.startsWith(`~`)||a,s=await fsp.stat(e).then(()=>!0,()=>!1),c=e.startsWith(`https://`),l=e.startsWith(`gl:`)||e.startsWith(`gitlab:`),u=e.startsWith(`github:`)||e.startsWith(`gh:`);if(o&&!s&&!c&&!u&&!l)throw logger.warn(`Installed extension not found: ${e}`),logger.warn(`Run 'azot list' and remove the extension from the list.`),createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.SOURCE_NOT_FOUND,`Installed extension source not found: ${e}`,{source:e});e=e.replace(/^gl:/,``).replace(/^gitlab:/,``).replace(/^gh:/,``).replace(/^github:/,``);let d=parseReleasePreference(e),{name:f}=d;if(c)n=await fetchExtensionAsset(e);else if(u){let[e,t]=f.split(`/`),r=`https://api.github.com/repos/${e}/${t}/releases`,i=await fetch(r).then(e=>e.json());if(i?.message&&!Array.isArray(i))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitHub releases request failed: ${i.message}`,{source:f,provider:`github`,apiMessage:i.message});let a=Array.isArray(i)?i:[],o=selectRelease(a,d,f);if(!o)throw d.isExplicitSelection?createRequestedReleaseNotFoundError(d,a,f):createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitHub release not found`,{source:f,provider:`github`,...getAvailableReleaseDetails(a)});let s=o.assets?.find(e=>e.name.endsWith(`.tgz`)||e.name.endsWith(`.zip`));if(!s)throw logger.debug(o),createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.ASSET_NOT_FOUND,`GitHub release asset not found`,{source:f,provider:`github`,releaseTag:getReleaseTag(o)});let c=s.browser_download_url;n=await fetchExtensionAsset(c)}else if(!s){let e=t?.find(e=>e.name===f),r=e?.releases||[],i=selectRelease(r,d,f),a=i?.assets.find(e=>e.name.endsWith(`.tgz`));if(e&&!i&&d.isExplicitSelection)throw createRequestedReleaseNotFoundError(d,r,f);if(a)n=await fetchExtensionAsset(a.url,a.name);else{let[e,t=`streamyx-extensions`]=f.split(`/`).reverse(),r=`https://gitlab.com/api/v4/projects/${t}%2F${e}/releases`,i=await fetch(r).then(e=>e.json());if(i?.message&&!Array.isArray(i))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitLab releases request failed: ${i.message}`,{source:f,provider:`gitlab`,apiMessage:i.message});let a=Array.isArray(i)?i:[],o=selectRelease(a,d,f);if(!o)throw d.isExplicitSelection?createRequestedReleaseNotFoundError(d,a,f):createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitLab release not found`,{source:f,provider:`gitlab`,...getAvailableReleaseDetails(a)});let s=o.assets?.links?.find(e=>e.name.endsWith(`.tgz`));if(!s)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.ASSET_NOT_FOUND,`GitLab release asset not found`,{source:f,provider:`gitlab`,releaseTag:getReleaseTag(o)});n=await fetchExtensionAsset(s.direct_asset_url||s.url,s.name)}}let p=path.extname(n),m=p===`.zip`,h=p===`.tgz`,g=new Set([`.js`,`.mjs`,`.cjs`]).has(p),_=await fsp.stat(n).then(e=>e.isDirectory()).catch(()=>!1);if(g?r=path.dirname(n):_?r=n:(r=n.replace(`.tgz`,``).replace(`.zip`,``),await exists(r)||await mkdir(r)),m||h)tar.extract(n,r),await rm$1(n);else if(!(g||_))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.UNSUPPORTED_PACKAGE_TYPE,`Unsupported package type`,{source:e,extensionSource:n,packageType:p||`unknown`});return r},getExports=e=>e&&`exports`in e?e.exports:e,getExtensionName=e=>e?.package?.name||`(unknown extension)`,getExtensionApiVersion=e=>{let t=getExports(e);return!t||typeof t!=`object`?null:typeof t.resolveEntries==`function`?`v2`:typeof t.getMediaInfo==`function`?`legacy-media`:typeof t.fetchContentMetadata==`function`?`legacy-content`:null},isSupportedExtensionExports=e=>getExtensionApiVersion(e)!==null,getCompatibleExtensionExports=e=>{let t=getExports(e);if(!t||typeof t!=`object`)throw Error(`Invalid extension exports`);return t},initializeExtension=async e=>{let t=getCompatibleExtensionExports(e),n=getExtensionName(e);try{if(typeof t.setup==`function`){await t.setup();return}typeof t.init==`function`&&await t.init()}catch(e){let r=typeof t.setup==`function`?`setup`:`init`,i=e instanceof Error?e:Error(String(e));throw logger.error(`Extension ${n} ${r} failed: ${i.message}`),i.stack&&logger.debug(i.stack),i}},loginWithExtension=async(e,t)=>{let n=getCompatibleExtensionExports(e),r=getExtensionName(e);try{if(typeof n.auth?.login==`function`){await n.auth.login(t);return}typeof n.login==`function`&&await n.login(t)}catch(e){let t=typeof n.auth?.login==`function`?`auth.login`:`login`,i=e instanceof Error?e:Error(String(e));throw logger.error(`Extension ${r} ${t} failed: ${i.message}`),i.stack&&logger.debug(i.stack),i}},logoutWithExtension=async e=>{let t=getCompatibleExtensionExports(e),n=getExtensionName(e);try{if(typeof t.auth?.logout==`function`){await t.auth.logout();return}typeof t.logout==`function`&&await t.logout()}catch(e){let r=typeof t.auth?.logout==`function`?`auth.logout`:`logout`,i=e instanceof Error?e:Error(String(e));throw logger.error(`Extension ${n} ${r} failed: ${i.message}`),i.stack&&logger.debug(i.stack),i}},runBeforeDownloadHook=async e=>{let t=getCompatibleExtensionExports(e);typeof t.hooks?.beforeDownload==`function`&&await t.hooks.beforeDownload()},runAfterDownloadHook=async(e,{skipMux:t=!1}={})=>{let n=getCompatibleExtensionExports(e),r=getExtensionName(e);if(!t&&typeof n.hooks?.afterMux==`function`)try{await n.hooks.afterMux()}catch(e){let t=e instanceof Error?e:Error(String(e));logger.error(`Extension ${r} hooks.afterMux failed: ${t.message}`),t.stack&&logger.debug(t.stack)}if(typeof n.onDownloadFinished==`function`)try{await n.onDownloadFinished()}catch(e){let t=e instanceof Error?e:Error(String(e));logger.error(`Extension ${r} onDownloadFinished failed: ${t.message}`),t.stack&&logger.debug(t.stack)}},loadExtension=async(e,{context:t,dirname:n,skipValidation:r})=>{let i=await load(e,{dirname:n,context:t}).finally(()=>{});if(!i)return null;let a=`default`in i.exports?i.exports.default:i.exports;if(!r&&!isSupportedExtensionExports(a))throw logger.error(`Incompatible extension interface`),createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Incompatible extension interface`,{extensionPath:e});return i.exports=a,i},sanitizeExtensionName=e=>e.split(`/`).reverse()[0].replaceAll(`@`,``).replace(`extension-`,``).replace(`-extension`,``),readExtensionInfo=async e=>{let t=[join(e,`package.json`),join(e,`package`,`package.json`)],n;for(let e of t)if(await exists(e)){n=e;break}let r={},i=``,a=``,o=``;if(n){let e=dirname(n);r=__require(n)||{},i=join(e,r.main||`index.js`),a=r.name,o=e}else{let t=await ls(e),n=t.find(e=>e.name===`index.js`)||t.find(e=>e.name===`main.js`)||t.find(e=>e.name===`service.js`)||t.find(e=>e.name===`extension.js`)||t.find(e=>e.name.endsWith(`.js`));n&&(i=join(e,n.name),a=parse(i).name)}if(!i)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Extension main script not found: ${e}`,{dir:e});return o||=dirname(i),{name:sanitizeExtensionName(a),path:i,dir:o,package:r}},importExtension=async(e,t)=>{try{let n=await readExtensionInfo(e),r=n.package?.config?.title||n.name,i=createContext({name:n.name,title:r,dir:EXTENSIONS_DATA_DIR});await i.cookieStore.import(join(EXTENSIONS_DATA_DIR,n.name,`cookies.txt`));let a=await loadExtension(n.path,{context:i,dirname:n.dir});if(!a)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Failed to load extension script: ${n.path}`,{source:t,dir:e,path:n.path});return{source:t,exports:a.exports,context:i,...n}}catch(e){throw logger.error(`Error importing module: ${e.message}`),logger.debug(e instanceof Error?e.stack||e.message:String(e)),e}},PRIMARY_API_URL=VITE_API_URL;let apiBaseUrl=PRIMARY_API_URL;const normalizeBase=e=>e.replace(/\/+$/,``),getApiBaseUrl=()=>normalizeBase(apiBaseUrl),joinUrl=(e,t)=>{let n=normalizeBase(e);return t?`${n}/${t.startsWith(`/`)?t.slice(1):t}`:n},getApiUrl=e=>joinUrl(getApiBaseUrl(),e);let publicKey=null;async function verifyResponse(e){if(!publicKey){logger.debug(`Public key not found`);let e=await fetchPublicKey();if(e)logger.debug(`Public key found: ${e.slice(0,50)}...`);else return logger.error(`Public key not found in response`),!1;if(publicKey=await importPublicKey(e).catch(()=>null),!publicKey)return logger.error(`Public key import failed`),!1}let t=e.headers.get(`X-Signature-Timestamp`),n=e.headers.get(`X-Signature`);if(!t||!n)return logger.error(`Signature headers not found`),!1;if(Date.now()-parseInt(t)>3e5)return!1;let r=`${t}:${await e.clone().text()}`,i=base64ToArrayBuffer(n),a=new TextEncoder,o=crypto.subtle.verify({name:`ECDSA`,hash:`SHA-256`},publicKey,i,a.encode(r));return o||(publicKey=null),o}const getPublicKeyFromEnv=()=>atob(VITE_PUBLIC_KEY);async function fetchPublicKey(e=`/auth/.well-known/public-key`){try{let t=await fetch(`${getApiBaseUrl()}${e}`);return t.ok?await t.text():getPublicKeyFromEnv()}catch(e){return logger.error(e.message),getPublicKeyFromEnv()}}async function importPublicKey(e){let t=base64ToArrayBuffer(e.replace(`-----BEGIN PUBLIC KEY-----`,``).replace(`-----END PUBLIC KEY-----`,``).trim());return crypto.subtle.importKey(`spki`,t,{name:`ECDSA`,namedCurve:`P-256`},!0,[`verify`])}function base64ToArrayBuffer(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n.buffer}const createClient$1=e=>createAuthClient({baseURL:`${e}/auth`,plugins:[deviceAuthorizationClient(),tributeClient()],fetchOptions:{retry:0,onSuccess:e=>{let t=e.response.headers.get(`set-auth-token`);t&&(authState.accessToken=t,saveAuth(authState))},auth:{type:`Bearer`,token:()=>authState.accessToken||loadAuth().then(e=>e?.accessToken)},onResponse:async e=>await verifyResponse(e.response).catch(()=>!1)?(logger.debug(`Response verified: ${e.response.url}`),e):(logger.error(`Response verification failed: ${e.response.status} ${e.response.statusText} ${e.response.url}`),errors.emit(`error`,{code:`SIGNATURE_VERIFICATION_FAILED`}),new Response(JSON.stringify({error:`SIGNATURE_VERIFICATION_FAILED`,message:`Signature verification failed`}),{status:401,statusText:`Unauthorized`}))}});let authClientBaseUrl=``,authClient=createClient$1(getApiBaseUrl());const getAuthClient=()=>{let e=getApiBaseUrl();return(!authClient||authClientBaseUrl!==e)&&(authClientBaseUrl=e,authClient=createClient$1(e)),authClient},getJson=async(e,t,n={})=>{let{signal:r,timeoutMs:i=1e4}=n,a=new AbortController,o=()=>a.abort(r?.reason);r?.addEventListener(`abort`,o,{once:!0});let s=!1,c=setTimeout(()=>{s=!0,a.abort(Error(`Request timeout`))},i);try{let n=await fetch(e,{...t,signal:a.signal});if(!n.ok)throw Error(`Request failed: ${n.status}`);return n.json()}catch(e){throw s&&e instanceof DOMException&&e.name===`AbortError`?Error(`Request timed out after ${i}ms`,{cause:e}):e}finally{clearTimeout(c),r?.removeEventListener(`abort`,o)}},backendApi={getExtensions:(e,t)=>getJson(getApiUrl(`extensions`),{headers:e?{Authorization:`Bearer ${e}`}:void 0},{signal:t}),getSubscriptions:(e,t)=>getJson(getApiUrl(`subscriptions`),{headers:{Authorization:`Bearer ${e}`}},{signal:t})},STALE_TIME=300*1e3,GC_TIME=300*1e3,queryClient=new QueryClient({queryCache:new QueryCache,defaultOptions:{queries:{staleTime:STALE_TIME,gcTime:GC_TIME}}}),cache={get:e=>queryClient.getQueryData(e),set:(e,t)=>queryClient.setQueryData(e,t),reset:e=>{e?queryClient.removeQueries({queryKey:e}):queryClient.clear()},invalidate:e=>queryClient.invalidateQueries({queryKey:e}),refresh:async(e,t)=>(queryClient.invalidateQueries({queryKey:e}),useQuery({queryKey:e,queryFn:t}))},useQuery=async({queryKey:e,queryFn:t,staleTime:n,enabled:r=!0})=>{try{let i=queryClient.getQueryState(e),a=i?i?.isInvalidated||!i?.dataUpdatedAt&&!i?.errorUpdatedAt||Date.now()-i.dataUpdatedAt>(n??STALE_TIME):!0,o=()=>cache.reset(e),s=()=>cache.invalidate(e),c=()=>cache.refresh(e,t);return r?i&&!a?{data:i.data,reset:o,invalidate:s,refresh:c}:{data:await queryClient.fetchQuery({queryKey:e,queryFn:t,staleTime:n}),reset:o,invalidate:s,refresh:c}:{data:null,reset:o,invalidate:s,refresh:c}}catch(t){throw queryClient.removeQueries({queryKey:e}),t}},sessionStorage=new FileStorage(join(APP_DATA_DIR,`session.json`)),authState={accessToken:``,tokenType:``,scope:``,createdAt:``},saveAuth=async e=>{sessionStorage.setItem(`access_token`,e.access_token),sessionStorage.setItem(`token_type`,e.token_type||`Bearer`),sessionStorage.setItem(`scope`,e.scope),sessionStorage.setItem(`created_at`,new Date().toISOString()),authState.accessToken=e.access_token,authState.tokenType=e.token_type||`Bearer`,authState.scope=e.scope,authState.createdAt=new Date().toISOString()},loadAuth=async()=>{let e=sessionStorage.getItem(`access_token`),t=sessionStorage.getItem(`token_type`),n=sessionStorage.getItem(`scope`),r=sessionStorage.getItem(`created_at`);return!e||!t||!n||!r?null:{accessToken:e,tokenType:t,scope:n,createdAt:new Date(r)}},getAuth=async()=>{let e=await useQuery({queryKey:[`session`,getApiBaseUrl()],queryFn:()=>getAuthClient().getSession()});return{session:e.data?.data?.session,user:e.data?.data?.user,error:e.data?.error}},getSubscriptions=async()=>{let{user:e,error:t}=await getAuth(),n=await useQuery({queryKey:[`subscriptions`,getApiBaseUrl()],queryFn:async()=>getAuthClient().subscription.list(),enabled:!!e?.id});return{data:n.data?.data,error:n.data?.error??t}},basicBenefits=[`lowConnectionsCount`,`oneDevice`],plusBenefits=[`mediumConnectionsCount`,`twoDevices`,`proxy`,`decryption`,`customIcon`,`tags`,`parallelDownloads`,`userExtensions`,`portableBuild`],proBenefits=[`highConnectionsCount`,`threeDevices`,`customMuxFormat`,`customDecrypter`,`customDrmClient`,`premiumExtensions`],benefits={basic:basicBenefits,plus:plusBenefits,pro:[...basicBenefits,...plusBenefits,...proBenefits]},getUserSubscriptions=()=>useQuery({queryKey:[`lava-subscriptions`,getApiBaseUrl()],queryFn:async()=>{let e=authState.accessToken||(await loadAuth())?.accessToken;return e?backendApi.getSubscriptions(e):[]}}),getUserPlan=async()=>{let e=await getSubscriptions();return{plan:(await getUserSubscriptions()).data?.[0]?.productTitle||e.data?.find(e=>new Date(e.expiresAt)>new Date)?.tributeSubscriptionName,error:e.error}},getCustomerState=async()=>{let{user:e,session:t}=await getAuth(),{plan:n,error:r}=await getUserPlan();return{user:e,session:t,error:r,plan:n,grantedBenefits:n?benefits[n.toLowerCase()]??[]:[]}};var require_builtins=__commonJSMin(((e,t)=>{t.exports={instagram:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h={Referer:`https://www.instagram.com/`},g={"X-IG-App-ID":`936619743392459`,"User-Agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36`},_=async e=>{let t=new URLSearchParams({doc_id:`8845758582119845`,variables:JSON.stringify({shortcode:e,child_comment_count:3,fetch_comment_count:40,parent_comment_count:24,has_threaded_comments:!0})});try{let e=await n(`https://www.instagram.com/graphql/query/?${t.toString()}`,{headers:g});return e.ok?(await e.json()).data?.xdt_shortcode_media??null:(a.error(`GraphQL request failed with status: ${e.status}`),null)}catch(e){return a.error(`Error during GraphQL fetch:`,e),null}},v=async e=>{try{let t=await n(`https://www.instagram.com/p/${e}/embed/captioned/`,{headers:{"User-Agent":g[`User-Agent`]}});if(!t.ok)return null;let r=(await t.text()).match(/window\.__additionalDataLoaded\('extra',\s*({.+?})\s*\);/);return r?.[1]?JSON.parse(r[1]).shortcode_media??null:null}catch(e){return a.error(`Error during embed page fetch:`,e),null}},y=e=>{let t=e.edge_media_to_caption?.edges?.[0]?.node?.text||`Instagram Post`,n=[],r=e=>{if(!e)return;let r=e.is_video&&e.video_url?e.video_url:e.display_url;r&&n.push({title:t,input:new p({source:new m(r,{requestInit:{headers:h}})})})},i=e.edge_sidecar_to_children?.edges;if(i?.length)for(let e of i)r(e.node);else r(e);return n};t.exports=f({canHandle:e=>{try{let t=new URL(e).hostname.toLowerCase();return t===`instagram.com`||t.endsWith(`.instagram.com`)}catch{return!1}},async resolveEntries(e){let t=new URLPattern({pathname:`/:type(p|reel|tv|reels|videos)/:shortcode{/*}?`,baseURL:new URL(e).origin}).exec(e)?.pathname.groups.shortcode;if(!t)return a.error(`Could not extract a valid Instagram shortcode from the URL`),a.debug(e),[];try{let e=await _(t);return e||=(a.warn(`GraphQL method failed. Falling back to embed page scraping.`),await v(t)),e?y(e):(a.error(`All extraction methods failed. The post may be private, deleted, or require a login.`),[])}catch(e){return a.error(`A critical error occurred while fetching Instagram metadata:`,e),[]}}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/41/91/13/419113d2-6246-c557-669e-0f0a5c62bcc5/Prod-0-0-1x_U007epad-0-1-0-sRGB-85-220.png/460x0w.webp`,title:`Instagram`,name:`Instagram`},pkg:{name:`instagram`,version:`0.0.1`,private:!0,keywords:[`social-networks`],homepage:`https://instagram.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`instagram.ts`,config:{icon:`https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/41/91/13/419113d2-6246-c557-669e-0f0a5c62bcc5/Prod-0-0-1x_U007epad-0-1-0-sRGB-85-220.png/460x0w.webp`,title:`Instagram`}}},ntv:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h=(e,t,n)=>e.split(t)[1]?.split(n)[0],g=(e,t)=>{let n=h(e,`<${t}>`,`</${t}>`)?.trim();if(!n)return;let r=n.match(/<!\[CDATA\[(.*?)\]\]>/s);return r?.[1]?r[1].trim():n.split(`DATA[`)[1]?.split(`]`)[0]?.trim()||n},_=async(e,t)=>{let r=await n(e);return r.ok?await r.text():(a.error(`Failed to fetch ${t}. Status: ${r.status} ${r.statusText}`),null)},v=async(e,t,n)=>{let r=new URL(e).pathname,i=new Set;for(let n of t.split(`href="/serial`)){if(!n.startsWith(`/`))continue;let t=n.split(`"`)[0];!t||t.length<=1||t.includes(`/issues/`)||t.includes(`/about/`)||t.split(`/`).length<=2||i.add(e.replace(r,`/serial${t}`))}let a=[];for(let e of i)a.push(...await y(e,n));return a},y=async(e,t=new Set)=>{if(t.has(e))return[];t.add(e);let n=await _(e,`NTV page`);if(!n)return[];let r=h(n,`<meta property="ya:ovs:feed_url" content="`,`">`)??h(n,`<meta property="ya:ovs:feed_url" content="`,`" />`);if(!r)return new URL(e).pathname.includes(`/serial`)?v(e,n,t):(a.error(`Could not find video link in the page.`),[]);let i=r.split(`video/`)[1]?.split(`/`)[0];if(!i)return a.error(`Could not parse NTV video id.`),[];let o=await _(`https://www.ntv.ru/vi${i}/`,`NTV XML metadata`);if(!o)return[];let s=g(o,`dash`)||g(o,`hls`),c=g(o,`file`)||g(o,`video`),l=g(o,`hifile`)||g(o,`hd_video`)||s||c;if(!l)return a.error(`Could not resolve NTV media URL.`),[];let u=h(o,`<embed_tag>`,`</embed_tag>`)||`NTV`,d=h(n,`"name":"`,`"`),f=d?.includes(`серия`)?d.split(`-`)[0]:void 0,y=f?parseInt(f,10):void 0,b=h(o,`<subtitles>`,`</subtitles>`),x=b?`https://www.ntv.ru${b}`:void 0;x&&a.debug(`Subtitles: ${x}`);let S=new p({source:new m(l)});return x&&S.addSubtitleTrack(new m(x),{languageCode:`ru`,name:`Russian`}),[{type:y?`episode`:`video`,title:u,season:y?1:void 0,episode:y,input:S}]};t.exports=f({resolveEntries(e){return y(e,new Set)}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.ntv.ru/static/images/logo.png`,title:`НТВ`,name:`НТВ`},pkg:{name:`ntv`,version:`0.0.9`,private:!0,keywords:[`tv-channels`],homepage:`https://www.ntv.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`ntv.ts`,config:{icon:`https://static.ntv.ru/static/images/logo.png`,title:`НТВ`}}},rbc:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({async resolveEntries(e){let t=await n(e);if(!t.ok)throw Error(`Failed to fetch RBC page: ${t.status} ${t.statusText}`);let r=(await t.text()).match(/(?:https?:)?\/\/[^\s"'<>]+\.m3u8(?:\?[^\s"'<>]*)?/i)?.[0];if(!r)throw Error(`Could not find RBC playlist URL.`);return[{type:`video`,input:new p({source:new m(r.startsWith(`//`)?`https:${r}`:r)})}]}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.rustore.ru/imgproxy/A-G-s2Q1x2iqq3qHCAo66-nllrtlqEr7XNU_JKXt4mQ/preset:web_app_icon_160/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS80MGViMWY3MS1kMDkzLTQ2NDMtOTkyNi0xZWM0ZjkwNzViMTQ=.webp`,title:`РБК`,name:`РБК`},pkg:{name:`rbc`,version:`0.0.2`,private:!0,keywords:[`news`],homepage:`https://rbc.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`rbc.ts`,config:{icon:`https://static.rustore.ru/imgproxy/A-G-s2Q1x2iqq3qHCAo66-nllrtlqEr7XNU_JKXt4mQ/preset:web_app_icon_160/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS80MGViMWY3MS1kMDkzLTQ2NDMtOTkyNi0xZWM0ZjkwNzViMTQ=.webp`,title:`РБК`}}},rutube:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h=[`/video/:id{/}?`,`/play/embed/:id{/}?`,`/shorts/:id{/}?`,`/yappy/:yappyId{/}?`,`/video/private/:id{/}?`],g=e=>{let t={yappyId:``,id:``,key:``};t.key=new URL(e).searchParams.get(`p`)??``;for(let n of h){let r=new URLPattern(n,`https://rutube.ru`).exec(e);r&&(Object.assign(t,r.pathname.groups),Object.assign(t,r.search.groups))}return t},_=async e=>{let t=(await n(`https://rutube.ru/pangolin/api/web/yappy/yappypage/?client=wdp&videoId=${e}&page=1&page_size=15`).then(e=>e.json()).catch(()=>null))?.results?.find(t=>String(t.id)===e)?.link;return t?[{type:`video`,title:`rutube_yappy_${e}`,input:new p({source:new m(t)})}]:(a.error(`ErrorEmptyDownload`),[])};t.exports=f({async resolveEntries(e){let t=g(e);if(t.yappyId)return _(t.yappyId);if(!t.id)return a.error(`Could not extract Rutube video id`),[];let r=new URL(`https://rutube.ru/api/play/options/${t.id}/?no_404=true&referer&pver=v2`);t.key&&r.searchParams.set(`p`,t.key);let i=await n(r).then(e=>e.json()).catch(e=>(e instanceof Error&&a.debug(e.message),null));return i?i.detail||!i.video_balancer?.m3u8?(a.error(`Play info is empty`),[]):i.live_streams?.hls?(a.error(`Live videos are not supported`),[]):[{type:`video`,title:i.title?.trim()||`rutube_${t.id}`,input:new p({source:new m(i.video_balancer.m3u8)})}]:(a.error(`Cannot fetch play info`),[])}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.rustore.ru/imgproxy/vcyBc0LG-3ybXcGs_-_OJXH9ULjoegHlLs-DacemG08/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjQ2MjA3L2NvbnRlbnQvSUNPTi9hNTZhZWJlMy01NjVhLTRiZjYtOTQyZC0xZjE0OTk0YjlhNmUucG5n.webp`,title:`RUTUBE`,name:`RUTUBE`},pkg:{name:`rutube`,version:`0.0.13`,private:!0,keywords:[`video-hostings`],homepage:`https://rutube.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`rutube.ts`,config:{icon:`https://static.rustore.ru/imgproxy/vcyBc0LG-3ybXcGs_-_OJXH9ULjoegHlLs-DacemG08/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjQ2MjA3L2NvbnRlbnQvSUNPTi9hNTZhZWJlMy01NjVhLTRiZjYtOTQyZC0xZjE0OTk0YjlhNmUucG5n.webp`,title:`RUTUBE`}}},soundcloud:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask;let p=d.utils,m=d.Input,h=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let g={version:``,id:``},_=async()=>{try{let e=await n(`https://soundcloud.com/`).then(e=>e.text()).catch(e=>{let t=e instanceof Error&&e.cause!=null?String(e.cause):``;return e instanceof Error&&t.includes(`ECONNRESET`)&&a.warn(`Soundcloud may be blocked in your region. Use proxy or VPN to bypass restrictions.`),``}),t=e.match(/window\.__sc_version="([0-9]{10})"/)?.[1];if(t&&g.version===t)return g.id;let r=``;for(let t of e.matchAll(/<script.+src="(.+)">/g)){let e=t[1];if(!e?.startsWith(`https://a-v2.sndcdn.com/`))continue;let i=(await n(e).then(e=>e.text()).catch(()=>``)).match(/\("client_id=[A-Za-z0-9]{32}"\)/)?.[0].match(/[A-Za-z0-9]{32}/)?.[0];if(i){r=i;break}}return t&&(g.version=t,g.id=r),r}catch{return``}},v=e=>e.audioCodecs?.some(e=>e===`aac`||e===`mp3`)??!1;t.exports=f({async resolveEntries(e,t){let{author:r,song:i,accessKey:a,shortLink:o}=p.execUrlPatterns(e,[`:author/:song/s-:accessKey`,`:author/:song`,`:shortLink`],[`https://soundcloud.com`,`https://on.soundcloud.com`]).pathname,s=await _();if(!s)throw Error(`No client ID`);let c;if(new URL(e).hostname===`on.soundcloud.com`&&o&&(c=await n(`https://on.soundcloud.com/${o}/`,{redirect:`manual`}).then(e=>{let t=e.headers.get(`location`);if(e.status===302&&t?.startsWith(`https://soundcloud.com/`))return t.split(`?`,1)[0]}).catch(()=>void 0)),!c&&r&&i&&(c=`https://soundcloud.com/${r}/${i}${a?`/s-${a}`:``}`),!c)throw Error(`Could not fetch`);let l=await n(`https://api-v2.soundcloud.com/resolve?url=${c}&client_id=${s}`).then(e=>e.status===200?e.json():null).catch(()=>null);if(!l)throw Error(`Could not fetch`);let u=l.media?.transcodings;if(!u?.length)throw Error(`Empty download`);let d=u.find(e=>e.preset===`opus_0_0`),f=u.find(e=>e.preset===`mp3_0_0`);if(f&&(v(t)||!d)&&(d=f),!d)throw Error(`Empty download`);let g=`${d.url}${d.url.includes(`?`)?`&`:`?`}client_id=${s}&track_authorization=${l.track_authorization}`;if(!g.startsWith(`https://api-v2.soundcloud.com/media/soundcloud:tracks:`))throw Error(`Empty download`);let y=await n(g).then(async e=>(await e.json()).url??``).catch(()=>``);if(!y)throw Error(`Could not fetch`);return[{type:`audio`,title:l.title.trim(),author:l.user.username.trim(),input:new m({source:new h(y)})}]}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://play-lh.googleusercontent.com/JSSeB3XQtb9sHD5FWTqVM4AksY_Kg2q20eExenxGqPJZdn2uVQxi8eoHkP5MA-IR4w=w480-h960-rw`,title:`SoundCloud`,name:`SoundCloud`},pkg:{name:`soundcloud`,version:`0.0.6`,private:!0,keywords:[`music`],homepage:`https://soundcloud.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`soundcloud.ts`,config:{icon:`https://play-lh.googleusercontent.com/JSSeB3XQtb9sHD5FWTqVM4AksY_Kg2q20eExenxGqPJZdn2uVQxi8eoHkP5MA-IR4w=w480-h960-rw`,title:`SoundCloud`}}},tiktok:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({canHandle:e=>{try{let t=new URL(e).hostname.toLowerCase();return t===`tiktok.com`||t.endsWith(`.tiktok.com`)}catch{return!1}},async resolveEntries(e){let t=await n(e);if(!t.ok)return a.error(`Failed to fetch TikTok page. Status: ${t.status}`),[];let r=(await t.text()).split(`<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__" type="application/json">`)[1]?.split(`<\/script>`)[0];if(!r)return a.error(`Could not find target script tag. TikTok might have updated their page structure.`),[];let i;try{i=JSON.parse(r)}catch(t){return a.error(`Failed to parse TikTok page JSON`,t,{url:e}),[]}let o=i.__DEFAULT_SCOPE__?.[`webapp.video-detail`],s=o?.itemInfo?.itemStruct;if(!s)return a.error(`Could not find video data in the JSON payload. The content might be unavailable or the structure has changed.`),o?.statusMsg&&a.error(`Error ${o.statusCode}: ${o.statusMsg}`),[];let l=s.video?.playAddr;return l?[{type:`video`,title:s.desc||`TikTok Video`,input:new p({source:new m(l,{requestInit:{headers:{Referer:`https://www.tiktok.com/`,Cookie:c.cookie}}})})}]:(a.error(`Could not find a video URL (playAddr) in the JSON payload.`),[])}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{name:`TikTok`,tag:`TT`,icon:`https://play-lh.googleusercontent.com/LdBITldj-tJxqLm-CsWSbnt4BMo2gk53cgM7mWIL-zn44m1ywLyQgxRsHKqp8r0qceXs=w480-h960-rw`,permissions:[],matches:[`https://*.tiktok.com/*`],manifestVersion:1,title:`TikTok`},pkg:{name:`tiktok`,version:`0.0.2`,private:!0,keywords:[`social-networks`],homepage:`https://www.tiktok.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`tiktok.ts`,config:{name:`TikTok`,tag:`TT`,icon:`https://play-lh.googleusercontent.com/LdBITldj-tJxqLm-CsWSbnt4BMo2gk53cgM7mWIL-zn44m1ywLyQgxRsHKqp8r0qceXs=w480-h960-rw`,permissions:[],matches:[`https://*.tiktok.com/*`],manifestVersion:1,title:`TikTok`}}},virtualroom:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({async resolveEntries(e){let t=new URL(e).searchParams.get(`recordId`);if(!t)return a.error(`Could not extract VirtualRoom recordId.`),[];let r=await n(`https://mv1.virtualroom.ru/vr/player/records/${t}/info`).then(e=>e.ok?e.json():null).catch(()=>null),i=await n(`https://mv1.virtualroom.ru/vr/player/records/${t}/events`).then(e=>e.ok?e.json():null).catch(()=>null),o=r?.data?.roomParameters?.name??`VirtualRoom`;return(i?.data?.translations??[]).filter(e=>!!e.url).map(e=>({title:[o,e.type,e.source,e.start].filter(Boolean).join(` `),input:new p({source:new m(e.url)})}))}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://sun9-50.userapi.com/impg/rY5N7sdA93TFdjkeYqPTnPIjvCJ0rALo_V7V8g/zLAaAv0PpvY.jpg?size=400x400&quality=95&sign=5ddcd6358131b204b8619cb8eeff943f&type=album`,title:`VirtualRoom`,name:`VirtualRoom`},pkg:{name:`virtualroom`,version:`0.0.7`,private:!0,keywords:[`videotelephony`],homepage:`https://virtualroom.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`virtualroom.ts`,config:{icon:`https://sun9-50.userapi.com/impg/rY5N7sdA93TFdjkeYqPTnPIjvCJ0rALo_V7V8g/zLAaAv0PpvY.jpg?size=400x400&quality=95&sign=5ddcd6358131b204b8619cb8eeff943f&type=album`,title:`VirtualRoom`}}},vk:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h=[`2160`,`1440`,`1080`,`720`,`480`,`360`,`240`,`144`],g=e=>{let t=e.match(/video-(\d+)_(\d+)/);return t?{ownerId:t[1],videoId:t[2]}:null},_=e=>{if(!e)return null;for(let t of e)if(Array.isArray(t)){for(let e of t)if(e&&typeof e==`object`&&`player`in e)return e}return null},v=(e,t)=>{let n=t.videoQuality?.replace(`p`,``).trim(),r=h.filter(t=>!!e[`url${t}`]);return r.length?n&&r.includes(n)?n:r[0]:null};t.exports=f({async resolveEntries(e,t){let r=g(e);if(!r)return a.error(`Could not extract VK video identifiers`),[];let i=await n(`https://vkvideo.ru/al_video.php?act=show`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded; charset=utf-8`,accept:`*/*`,"accept-language":`ru-RU,ru;q=0.9`,"sec-ch-ua":`"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"`,"sec-ch-ua-mobile":`?0`,"sec-ch-ua-platform":`"macOS"`,"sec-fetch-dest":`empty`,"sec-fetch-mode":`cors`,"sec-fetch-site":`same-origin`,"x-requested-with":`XMLHttpRequest`,Referer:e,"Referrer-Policy":`strict-origin-when-cross-origin`},body:new URLSearchParams({al:`1`,autoplay:`1`,claim:``,force_no_repeat:`true`,is_video_page:`true`,list:``,module:`direct`,t:``,video:`-${r.ownerId}_${r.videoId}`}).toString()});if(!i.ok)throw Error(`VK request failed: ${i.status} ${i.statusText}`);let o=_((await i.json()).payload),s=o?.player?.params,l=s&&s.length>0?s[0]:void 0;if(!o||!l)return a.error(`Could not find VK player payload`),[];if(o.mvData?.is_active_live===1||o.mvData?.is_active_live===`1`)return a.error(`Live videos are not supported`),[];let u=v(l,t),d=u?l[`url${u}`]:void 0,f=l.dash_sep||d;return f?[{type:`video`,title:[l.md_title?.trim(),l.md_author?.trim()].filter(Boolean).join(` `),input:new p({source:new m(f,{requestInit:{headers:{Referer:e,Cookie:c.cookie}}})})}]:(a.error(`Could not find video URL`),[])}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.rustore.ru/imgproxy/kSjDiz_MKxD_jzwgEqqaIjQZTE-NEP1Xt8HtJT7EU4s/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjAyNzgyMzI5NS9jb250ZW50L0lDT04vOTc0ODYwMTgtNTc4NS00MjRkLTljYWItNGZlNDk2ZDI3Yzc2LnBuZw==.webp`,title:`VK`,name:`VK`},pkg:{name:`vk`,version:`0.0.8`,private:!0,keywords:[`video-hostings`],homepage:`https://vkvideo.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`vk.ts`,config:{icon:`https://static.rustore.ru/imgproxy/kSjDiz_MKxD_jzwgEqqaIjQZTE-NEP1Xt8HtJT7EU4s/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjAyNzgyMzI5NS9jb250ZW50L0lDT04vOTc0ODYwMTgtNTc4NS00MjRkLTljYWItNGZlNDk2ZDI3Yzc2LnBuZw==.webp`,title:`VK`}}},weibo:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask;let p=d.utils,m=d.Input,h=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({async resolveEntries(e){let t=p.execUrlPatterns(e,[`/:userId(\\d+)/:bid`,`/detail/:mid`],[`https://weibo.com/`,`https://m.weibo.cn`]),r=t.pathname.bid||t.pathname.mid;if(!r)return[];let i=await n(`https://m.weibo.cn/statuses/show?id=${r}`,{credentials:`include`,referrer:`https://m.weibo.cn/status/${t.pathname.bid??r}?jumpfrom=weibocom`,method:`GET`,mode:`cors`}).then(e=>e.json()).catch(()=>null);if(!i?.data)return a.error(`Could not resolve Weibo post metadata`),[];let o=[],s=i.data.pics,c=i.data.page_info;if(s?.length)for(let e of s.filter(e=>e.type===`video`||e.type===`livephoto`))e.videoSrc&&o.push({type:`video`,title:e.pid,input:new m({source:new h(e.videoSrc)})});else if(c?.type===`video`){let e=Object.values(c.urls??{})[0],t=c.media_info?.stream_url_hd||c.media_info?.stream_url,n=e||t;n&&o.push({type:`video`,title:c.title||c.page_title,input:new m({source:new h(n)})})}return o}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://play-lh.googleusercontent.com/TTKq2trnzgtoyM0jc1pyrrmXtA_Yd3A2hxubZtDahdZStYf4GPANZa-wjDb1ELHrGqh_=w480-h960-rw`,title:`Weibo`,name:`Weibo`},pkg:{name:`weibo`,version:`0.0.6`,private:!0,keywords:[`social-networks`],homepage:`https://weibo.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`weibo.ts`,config:{icon:`https://play-lh.googleusercontent.com/TTKq2trnzgtoyM0jc1pyrrmXtA_Yd3A2hxubZtDahdZStYf4GPANZa-wjDb1ELHrGqh_=w480-h960-rw`,title:`Weibo`}}}}})),import_builtins=__toESM(require_builtins(),1);const extractExtensionInfo=e=>({name:e.name,source:e.source,dir:e.dir,path:e.path,package:e.package,installedAt:e.installedAt||new Date().toISOString()});var ExtensionManager=class ExtensionManager extends EventEmitter$1{extensions=new Map;extensionDirs;indexPath;infoList=[];constructor({dirs:e,indexPath:t}={}){super(),this.extensionDirs=e??[process.cwd()],this.indexPath=t??path$1.join(process.cwd(),`index.json`)}async init(){return await this.ensureValidIndexPath(),await this.loadInfo(),this}async loadInfo(){return this.infoList=await readJson(this.indexPath).catch(()=>[]),this.infoList}async saveInfo(){return await this.ensureValidIndexPath(),await writeJson(this.indexPath,this.infoList)}async ensureValidIndexPath(){(await fs$1.stat(this.indexPath).catch(()=>null))?.isDirectory()&&(logger.warn(`Invalid extensions index path repaired: ${this.indexPath}`),await rm$1(this.indexPath),await fs$1.writeFile(this.indexPath,`[]`,`utf8`))}static async getAvailableExtensions(){try{return(await backendApi.getExtensions(authState.accessToken,AbortSignal.timeout(8e3))).data}catch(e){return logger.warn(`Failed to fetch extensions catalog: ${e instanceof Error?e.message:String(e)}`),[]}}async discover(){for(let e of this.extensionDirs){logger.debug(`Loading extensions from ${e}`);let t=await fs$1.readdir(e,{withFileTypes:!0}).catch(()=>[]);for(let n of t)if(n.isDirectory()){let t=path$1.join(e,n.name);if(await fs$1.readdir(t).then(e=>e.filter(e=>!e.startsWith(`.`))).then(e=>!e.length))continue;await this.loadExtension(t)}}for(let e of this.infoList)this.extensionDirs.some(t=>e.dir?.includes(t))||!e.dir||(logger.debug(`Loading dev extension from ${e.dir}`),await this.loadExtension(e.dir))}async#e(scriptPath,context){const code=await fs$1.readFile(scriptPath,`utf8`),{Azot,fetch,console,localStorage,cookieStore,window,document,navigator}=context,module={exports:{}};eval(`(() => {${code}})();`);const exports=module.exports;return{exports,context}}async prepareContext(e,t){let n=createContext({name:e,dir:EXTENSIONS_DATA_DIR,title:t});return await n.cookieStore.import(path$1.join(EXTENSIONS_DATA_DIR,e,`cookies.txt`)),n}async loadScript(e,t){let n=t.name,r=t.config?.title||n,i=await this.prepareContext(n,r),a=await load(e,{dirname:t.dir,context:i});if(a)return a.exports=`default`in a.exports?a.exports.default:a.exports,a}async loadCoreExtensions(){let e=Object.keys(import_builtins.default);logger.debug(`Loading ${e.length} built-in extensions: ${e.join(`, `)}`);for(let e of Object.values(import_builtins.default)){let t=e.pkg.name,n=e.manifest?.name;try{let r=await this.prepareContext(t,n),i={exports:e.create(r),package:e.pkg,context:r};this.validate(i),this.extensions.set(t,i),this.emit(`loaded`,t)}catch(e){logger.debug(e instanceof Error?e.message:String(e)),this.emit(`error`,e,t)}}}async loadExtension(e){try{logger.debug(`Loading extension from ${e}`);let t=await readExtensionInfo(e).catch(e=>logger.error(e));if(!t)return;t.package.dir=t.dir;let n=await this.loadScript(t.path,t.package);if(!n)return;let r={package:t.package,exports:n.exports,context:n.context};this.validate(r),this.extensions.set(t.package.name,r),this.emit(`loaded`,t.package.name)}catch(t){this.emit(`error`,t,e)}}validate(e){if(typeof e!=`object`||!e||!isSupportedExtensionExports(e.exports))throw Error(`Invalid extension interface: ${e.package.name}`)}getExtension(e){return this.extensions.get(e)??Array.from(this.extensions.values()).find(t=>t.package.name===e)??null}async getExtensionForUrl(e){for(let t of this.extensions.values()){let n=null,r=t.exports.canHandle,i=new URL(e).hostname.includes(t.package.name);if(n=typeof r==`function`?await r(e):typeof r==`string`?new URLPattern(r).test(e):i,n)return t}return null}async install(e){let t=await ExtensionManager.getAvailableExtensions(),n=[];for(let r of e){let e=await stat(r).then(e=>e.isDirectory()).catch(()=>!1)?r:await downloadExtension(r,t);if(!e)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.SOURCE_NOT_FOUND,`Extension source not found: ${r}`,{source:r});let i=await importExtension(e,r);if(!i)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Extension import failed: ${r}`,{source:r,dir:e});n.push(i);let a=this.infoList.find(({name:e})=>e===i.name);if(a){let e=a.source;e!==i.source&&await rm$1(e);let t=a.dir?this.#t(a.dir):null,n=i.dir?this.#t(i.dir):null;t&&t!==n&&await rm$1(t),a.installedAt=new Date().toISOString(),Object.assign(a,extractExtensionInfo(i)),logger.info(`Extension ${i.name} updated`)}else this.infoList.push(extractExtensionInfo(i)),logger.info(`Extension ${i.name} added`)}if(await this.saveInfo(),n.length)for(let e of n)this.extensions.set(e.name,e)}#t(e){let t=path$1.parse(e);return t.dir===EXTENSIONS_SOURCES_DIR?e:t.dir}async uninstall(e){for(let t of e){let e=this.infoList.find(e=>e.name===t);if(!e){logger.error(`Extension ${t} not found`);return}let n=e.dir??``,r=n?.includes(EXTENSIONS_SOURCES_DIR);await exists(n)?(r&&await rm$1(this.#t(n)),this.infoList=this.infoList.filter(e=>e.name!==t),logger.info(`Extension ${t} removed`),this.extensions.delete(t)):logger.warn(`Extension ${t} directory not found: ${n}`)}await this.saveInfo()}async importCookies(e,t){let n=this.getExtension(e);if(!n)throw Error(`Extension ${e} not found`);return await n.context.cookieStore.import(t,{removeSource:!1})}async login(e,t={}){let n=this.getExtension(e);n&&await loginWithExtension(n,t)}async logout(e){for(let t of e){let e=this.getExtension(t);if(!e)return;logger.info(`Logging out...`),await logoutWithExtension(e),logger.debug(`Clearing localStorage...`),e.context.localStorage.clear(),logger.debug(`Clearing cookies store...`);let n=await e.context.cookieStore.getAll();for(let t of n)await e.context.cookieStore.delete(t);logger.info(`Logged out from extension ${t}`)}}list(){return Array.from(this.extensions.values()).map(e=>({name:e.package.name,version:e.package.version,description:e.package.description,package:e.package}))}};const mergeExtensionHeadersIntoDrm=(e,t)=>!e||`payload`in e||`keys`in e?e:{...e,headers:{...e.headers,...t?.context.http.headers}},defaultLegacyRequestFilter=async(e,t)=>{if(!t)return e;let n=await e.clone().arrayBuffer(),r=Buffer.from(n).toString(`base64`),i=t.replace(`{{challenge}}`,r);return new Request(e.url,{method:e.method,headers:e.headers,body:i})},defaultLegacyResponseFilter=async e=>{let t=await e.clone().arrayBuffer();if(t[0]===123){let n=null;try{n=JSON.parse(Buffer.from(t).toString(`utf8`))}catch(e){logger.error(`Can't parse license response as JSON`),logger.debug(e.message),logger.debug(`Base64 response data: ${Buffer.from(t).toString(`base64`)}`)}if(!n)return e;try{let n=`CAIS`,r=n+Buffer.from(t).toString(`utf8`).split(`"${n}`)[1].split(`"`)[0],i=Buffer.from(r,`base64`);return new Response(i,{status:e.status,headers:e.headers})}catch{logger.error(`Can't recognize license response`),logger.error(`Response: ${JSON.stringify(n)}`)}}return e},normalizeLegacyMediaInfoList=e=>typeof e==`string`?[{sources:[{url:e}]}]:Array.isArray(e)&&typeof e[0]==`string`?e.map(e=>({sources:[{url:e}]})):Array.isArray(e)?e:e&&typeof e==`object`?[e]:[],normalizeLegacyStreams=e=>e.sources??e.streams??[],resolveLegacyMediaMetadata=(e,t)=>({id:e.id,title:e.title,tag:t.package.config?.tag,seasonNumber:e.seasonNumber??e.season,episodeNumber:e.episodeNumber??e.episode,episodeTitle:e.episodeTitle}),resolveLegacyMediaResources=async(e,t,n)=>{let r=getCompatibleExtensionExports(n);if(typeof r.getMediaInfo==`function`){let i=normalizeLegacyMediaInfoList(await r.getMediaInfo(e,t));if(!i.length)return logger.info(`No metadata found`),[];let a=[];for(let e of i){if(typeof r.refreshMediaInfo==`function`){let n=await r.refreshMediaInfo(e,t);n&&typeof n==`object`&&Object.assign(e,n)}let i=normalizeLegacyStreams(e);for(let t of i){let r=typeof t==`string`?{url:t}:t;a.push({source:{url:r.url,headers:r.headers,drm:r.drm&&!Array.isArray(r.drm)&&typeof r.drm==`object`?{server:r.drm.server}:void 0},metadata:resolveLegacyMediaMetadata(e,n),drm:r.drm&&!Array.isArray(r.drm)&&typeof r.drm==`object`?{server:r.drm.server}:void 0})}}return logger.info(`Fetching metadata finished`),a}let i=await r.fetchContentMetadata?.(e,t);if(!i?.length)return logger.info(`No metadata found`),[];let a=[];for(let e of i){let r={...e},i;if(!r.source&&n.exports.fetchContentSource&&r.id){let e=await n.exports.fetchContentSource(r.id,t);e&&(r.source=e)}if(!r.source?.url){logger.error(`Can't find content source`);continue}r.source.drm&&`payload`in r.source.drm&&n.exports.fetchContentDrm&&(i=r.source.drm.payload,r.source.drm=void 0);let{source:o,...s}=r,c=mergeExtensionHeadersIntoDrm(r.source.drm,n);o.drm=c,o.headers={...o.headers,...n.context.http.headers},n.exports.tag&&(s.tag=n.exports.tag),a.push({source:o,metadata:s,drm:c,drmPayload:i})}return logger.info(`Fetching metadata finished`),a},resolveLegacyMediaResourceDrm=async(e,t,n)=>{if(e.drmPayload&&n?.exports.fetchContentDrm){let r=mergeExtensionHeadersIntoDrm(await n.exports.fetchContentDrm(e.drmPayload,t),n);return e.source.drm=r,e.drm=r,r}let r=mergeExtensionHeadersIntoDrm(e.source.drm??e.drm,n);return e.source.drm=r,e.drm=r,r},createLegacyDrmLicenseResolver=e=>{let t=e.template?defaultLegacyRequestFilter:void 0,n=defaultLegacyResponseFilter,r=new HttpClient;return async({url:i,data:a})=>{let o=new Request(i,{body:Buffer.from(a),method:`POST`,headers:e.headers}),s=await t?.(o,e.template)||o,c=await r.fetch(s.url,{body:await s.arrayBuffer(),headers:s.headers,method:s.method}),l=await n?.(c)||c;return new Uint8Array(await l.arrayBuffer())}},resolvedInputs=new Map,normalizeHeaders=e=>{if(!e)return;let t=Object.fromEntries(new Headers(e).entries());return Object.keys(t).length?t:void 0},serializeMediaEntry=e=>{let{input:t,...n}=e;return n},createEntryCacheKey=(e,t,n)=>createHash(`sha1`).update(JSON.stringify({extension:e.package.name,url:t,id:n.id??null,title:n.title??null,season:n.season??null,episode:n.episode??null})).digest(`hex`),extractInputSource=(e,t)=>{let n=e.source??e._rootSource,r=n?.rootPath;if(typeof r!=`string`||!r)return t??null;let i=n?._url instanceof Request?n._url.headers:void 0,a=n?._options?.requestInit?.headers,o={...normalizeHeaders(i),...normalizeHeaders(a)};return{...t??{},url:r,headers:Object.keys(o).length?o:t?.headers}},createEntryMetadata=(e,t)=>{let n=e.id??e.details?.id;return{id:n==null?void 0:String(n),title:e.title,tag:t.package.config?.tag,seasonNumber:e.season,episodeNumber:e.episode,episodeTitle:e.episodeTitle}},normalizeResolvedResources=e=>e.length?e.length===1?e[0]:e:null,createDirectMediaMetadata=e=>{let t;try{t=new URL(e)}catch{throw Error(`Invalid direct media URL: ${e}`)}let n=t.pathname.replace(/\/+$/,``).split(`/`).filter(Boolean).pop(),r=n?.split(`.`).slice(0,-1).join(`.`)||n||t.hostname||`download`;return{source:{url:e},metadata:{title:r}}},configureExtensionProxy=(e,t)=>{let n=t.proxy||t.proxyMeta;n&&(e.context.http.configure({proxyUrl:n}),httpClient.configure({proxyUrl:n}))},analyzeMediaResource=async(e,t,n)=>{if(!n){logger.warn(`No suitable extension available. Downloading as a direct link...`);let{source:n,metadata:r}=createDirectMediaMetadata(e);return n.audioLanguage=t.languages?.[0],n.http2=t.http2,{source:n,metadata:r}}if(configureExtensionProxy(n,t),await initializeExtension(n),getExtensionApiVersion(n)===`v2`){let r=getCompatibleExtensionExports(n);logger.info(`Resolving media entries...`);let i=await r.resolveEntries(e,t);if(!i?.length)return logger.info(`No metadata found`),null;let a=i.map(t=>{let r=t,i=serializeMediaEntry(t),a=t.input?createEntryCacheKey(n,e,r):void 0;a&&t.input&&resolvedInputs.set(a,t.input);let o=t.input?extractInputSource(t.input):null;return{source:o??{url:e},metadata:createEntryMetadata(i,n),extension:{api:`v2`,entry:i,cacheKey:a,hasResolvedSource:!!o}}});return logger.info(`Resolving media entries finished`),normalizeResolvedResources(a)}return logger.info(`Fetching content metadata...`),normalizeResolvedResources(await resolveLegacyMediaResources(e,t,n))},materializeMediaResource=async({resource:e,url:t,options:n,extension:r})=>{if(!r||!e.extension||e.extension.api!==`v2`||getExtensionApiVersion(r)!==`v2`)return{source:e.source};configureExtensionProxy(r,n),await initializeExtension(r);let i=getCompatibleExtensionExports(r),a=e.extension.entry,o=e.extension.cacheKey?resolvedInputs.get(e.extension.cacheKey):void 0;if(!o&&typeof i.resolveMedia==`function`&&(o=await i.resolveMedia(t,n,a)??void 0,o&&e.extension.cacheKey&&resolvedInputs.set(e.extension.cacheKey,o)),!o){if(e.extension.hasResolvedSource)return{source:e.source,entry:a};throw Error(`Extension ${r.package.name} could not materialize media entry. Provide resolveMedia() or an inline input rooted in UrlSource.`)}return{source:extractInputSource(o,e.source)??e.source,input:o,entry:a}},resolveMediaResourceDrm=async(e,t,n)=>resolveLegacyMediaResourceDrm(e,t,n);var DownloadRunState=class{#e=[];#t=new Set;#n=new Map;#r=new Map;#i=new Set;get activeRunCount(){return this.#r.size}get queuedCount(){return this.#e.length}getActiveRun(e){return this.#r.get(e)}setActiveRun(e,t){this.#r.set(e,t)}deleteActiveRun(e){this.#r.delete(e)}getActiveJob(e){return this.#n.get(e)}setActiveJob(e){this.#n.set(e.id,e)}deleteActiveJob(e){this.#n.delete(e)}queueResumeAfterStop(e){this.#i.add(e)}consumeResumeAfterStop(e){let t=this.#i.has(e);return t&&this.#i.delete(e),t}enqueue(e){this.#t.has(e.id)||this.#r.has(e.id)||(this.#e.push(e.id),this.#t.add(e.id))}dequeue(e){if(!this.#t.has(e))return!1;let t=this.#e.indexOf(e);return t!==-1&&this.#e.splice(t,1),this.#t.delete(e),!0}dequeueNext(e){for(;this.#e.length>0;){let t=this.#e.shift();if(!t)return;this.#t.delete(t);let n=e(t);if(n&&n.status===`queued`)return n}}};const ERROR_DETAIL_KEYS=[`code`,`errno`,`syscall`,`address`,`port`,`host`,`hostname`,`path`,`type`],isResponseLike=e=>typeof e==`object`&&!!e&&`status`in e&&`statusText`in e&&`url`in e,getOwnErrorDetails=e=>{let t=[],n=e;for(let e of ERROR_DETAIL_KEYS){let r=n[e];r==null||r===``||t.push(`${e}=${String(r)}`)}return t},formatErrorDetails=(e,t=0)=>{if(t>3)return`[max-depth]`;if(e instanceof Error){let n=getOwnErrorDetails(e),r=`cause`in e?e.cause:void 0,i=[`${e.name}: ${e.message}`];return n.length&&i.push(`details=${n.join(`, `)}`),r!==void 0&&r!==e&&i.push(`cause=${formatErrorDetails(r,t+1)}`),i.join(` | `)}return isResponseLike(e)?`Response ${e.status} ${e.statusText} url=${e.url}`:inspect(e,{depth:2,breakLength:1/0})},logErrorDetails=(e,t)=>{logger.debug(`${e}: ${formatErrorDetails(t)}`),t instanceof Error&&t.stack&&logger.debug(t.stack)},getTrackDescription=(e,t)=>{let n=`${t} ∙ `;return e.type===`subtitle`?n+=`SUBTITLES`:n+=e.type?.toUpperCase(),e.type===`video`&&(e.width&&(n+=` ∙ ${e.width}x${e.height}`),e.bitrate&&(n+=` ∙ ${Math.round(e.bitrate/1e3)} KiB/s`)),e.type===`audio`&&(e.languageCode&&(n+=` ∙ ${e.languageCode.toUpperCase()}`),e.name&&(n+=` (${e.name})`),e.sampleRate&&(n+=` ∙ ${e.sampleRate} kHz`),e.bitrate&&(n+=` ∙ ${Math.round(e.bitrate/1e3)} KiB/s`)),e.type===`subtitle`&&(e.languageCode&&(n+=` ∙ ${e.languageCode.toUpperCase()}`),e.name&&(n+=` (${e.name})`),e.forced&&(n+=` FORCED`)),n},getTrackId=e=>e.id,findDuplicateTrackIds=e=>{let t=new Map;for(let n of e){let e=getTrackId(n),r=t.get(e);if(r){r.push(n);continue}t.set(e,[n])}return Array.from(t.entries()).filter(([,e])=>e.length>1)},assertUniqueTrackIds=e=>{let t=findDuplicateTrackIds(e);if(!t.length)return;let n=t.map(([e,t])=>`${e} (${t.length} copies)`).join(`, `);throw Object.assign(Error(`Duplicate tracks selected: ${n}`),{code:`DUPLICATE_TRACKS_SELECTED`})},getErrorCode=e=>{if(!e||typeof e!=`object`||!(`code`in e))return;let t=e.code;return typeof t==`string`?t:void 0};var DownloaderError=class extends Error{code;constructor(e,t=e,n){super(t,n),this.name=`DownloaderError`,this.code=e}};const normalizeDownloaderError=(e,t=`DOWNLOAD_FAILED`)=>{if(e instanceof DownloaderError||e instanceof Error&&e.name===`AbortError`)return e;if(e instanceof Error){let n=new DownloaderError(getErrorCode(e)??t,e.message,{cause:e});return e.stack&&(n.stack=e.stack),n}return new DownloaderError(t,typeof e==`string`?e:`Unknown error`)},sanitizeFilename=e=>{let t=e.replace(/[<>:"/\\|?*\x00-\x1F]/g,``);t=t.replace(/^[\s.]+|[\s.]+$/g,``),t=t.replace(/\s+/g,` `);let n=t.lastIndexOf(`.`),r=n>0,i=r?t.slice(n):``,a=r?t.slice(0,n):t;if(i.length>=255)t=t.slice(0,255);else{let e=255-i.length;a.length>e&&(a=a.slice(0,e)),t=a+i}let o=/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i;if(i.length<255){let e=t.lastIndexOf(`.`),n=e>0;if(i=n?t.slice(e):``,a=n?t.slice(0,e):t,o.test(a)){let e=255-i.length;t=`_${a}`.slice(0,e)+i}}return t.length===0?`untitled`:t},fillTemplate=(e,t)=>Object.keys(t).reduce((e,n)=>{let r=`{${n}}`,i=t[n];if(!i){let t=RegExp(`(?:\\.|^)\\{${n}\\}(?=\\.|$)|\\{${n}\\}(\\.|$)|\\{${n}\\}`,`g`);return e.replace(t,(e,t)=>``).replaceAll(`....`,`...`)}return e.replaceAll(r,i)},e).replaceAll(` `,` `),resolveContainerFormat=e=>typeof e==`string`&&e.trim()||`mp4`,createDownloadMetadata=e=>{let t=`seasonNumber`in e?`${e.seasonNumber}`:``,n=`episodeNumber`in e?`${e.episodeNumber}`:``,r=t?`S${t}`:``,i=n?`E${n}`:``,a=t&&n?`${r}:${i}`:``,o=`episodeTitle`in e&&e.episodeTitle?.trim()?`"${e.episodeTitle}"`:``;return{title:`${e.title??``} ${a} ${o}`.trim()}},resolveDownloadOutputPlan=({settings:e,options:t,source:n,meta:r,allTracks:i})=>{let a=r.title,o=r.tag,s=`seasonNumber`in r?r.seasonNumber:void 0,c=`episodeNumber`in r?r.episodeNumber:void 0,l=`episodeTitle`in r?r.episodeTitle:``,u=i.find(e=>e.type===`video`)?.codec??``,d=e.get(`downloadDir`),f=t.movieTemplate||e.get(`movieFilenameTemplate`),p=t.episodeTemplate||e.get(`seriesFilenameTemplate`),m=`${sanitizeFilename(fillTemplate(c?p:f,{title:a??``,s:s?s.toString().padStart(2,`0`):``,e:c?c.toString().padStart(2,`0`):``,quality:t.videoQuality??``,codec:u,tag:o??``,episodeTitle:l??``,audioType:n.audioType?n.audioType.toUpperCase():``,format:`WEB-DL`}))}.${resolveContainerFormat(t.format||e.get(`videoContainerFormat`))}`,h=t.outputPath||join(d,m),g=parse(h);return{downloadDir:d,outputPath:h,resolvedFilenameWithoutExtension:g.name,filenameWithExtension:g.base,outputDirectory:g.dir||d,downloadMetadata:createDownloadMetadata(r)}},openFileHandle=async(e,t,n)=>n??open(e,t),createMediabunnyFileSource=e=>{let t=null;return new StreamSource({getSize:async()=>(t=await openFileHandle(e,`r`,t),(await t.stat()).size),read:async(n,r)=>{t=await openFileHandle(e,`r`,t);let i=new Uint8Array(r-n);return await t.read(i,0,r-n,n),i},dispose:async()=>{let e=t;t=null,await e?.close()},prefetchProfile:`fileSystem`})},createMediabunnyFileTarget=e=>{let t=null;return new StreamTarget(new WritableStream({start:async()=>{t=await openFileHandle(e,`w`,t)},write:async n=>{if(!t)throw Error(`MediaBunny output handle was not initialized for ${e}`);await t.write(n.data,0,n.data.byteLength,n.position)},close:async()=>{let e=t;t=null,await e?.close()},abort:async()=>{let e=t;t=null,await e?.close()}}),{chunked:!0})},inspectMedia=async(e,t)=>{let n=new Input$1({formats:ALL_FORMATS$1,source:e.startsWith(`https`)?new UrlSource$1(e,{requestInit:{headers:t}}):createMediabunnyFileSource(e)});return{tracks:await n.getTracks(),primaryVideoTrack:await n.getPrimaryVideoTrack(),primaryAudioTrack:await n.getPrimaryAudioTrack()}},ALL_DASHA_FORMATS=[...DASH_FORMATS,...HLS_FORMATS],SENSITIVE_HEADER_KEYS=new Set([`authorization`,`cookie`,`set-cookie`,`api-key`]),getSafeHeadersForLogging=e=>Object.fromEntries(Object.keys(e).map(t=>[t,SENSITIVE_HEADER_KEYS.has(t.toLowerCase())?`[REDACTED]`:e[t]])),getManifestFormats=e=>e===`mpd`?DASH_FORMATS:e===`m3u8`?HLS_FORMATS:ALL_DASHA_FORMATS,createManifestInput=({http:e,source:t,detection:n})=>(logger.debug(`Fetching manifest...`),logger.debug(t.url),t.headers&&logger.debug(JSON.stringify(getSafeHeadersForLogging(t.headers))),new Input({source:new UrlSource(t.url,{requestInit:{headers:t.headers},fetchFn:e.fetch.bind(e)}),formats:getManifestFormats(n.kind)})),getStableHash=e=>createHash(`sha1`).update(e).digest(`hex`),normalizeTrackLanguageCode=(e,t)=>{if(e)switch(e){case`aar`:case`abk`:return`rus`;case`ave`:return`eng`;case`zu`:return t?.includes(`start.film`)?`ru`:`zu`;default:return e}},createPreparedTrackId=({origin:e,type:t,sourceUrl:n,languageCode:r,name:i,codec:a})=>`${e}:${t}:${getStableHash([n??``,r??``,i??``,a??``].join(`|`))}`,createPreparedTrackFromManifestTrack=async(e,t)=>{let[n,r,i,a,o,s]=await Promise.all([e.getCodec(),e.getBitrate(),e.getLanguageCode(),e.getName(),e.getDisposition(),e.hasOnlyKeyPackets()]),c={id:`manifest:${e.type}:${e.id}`,origin:`manifest`,type:e.type,codec:n,bitrate:r,languageCode:normalizeTrackLanguageCode(i,t),name:a,forced:o.forced,hearingImpaired:o.hearingImpaired,visuallyImpaired:o.visuallyImpaired,isDefault:o.default,isIFrameOnly:s,inputTrack:e};if(e.isVideoTrack()){let[t,n]=await Promise.all([e.getDisplayWidth(),e.getDisplayHeight()]);c.width=t,c.height=n}if(e.isAudioTrack()){let[t,n]=await Promise.all([e.getNumberOfChannels(),e.getSampleRate()]);c.numberOfChannels=t,c.sampleRate=n}return c},ensurePreparedTrackSegments=async e=>e.segments?e.segments:e.inputTrack?(e.segmentsPromise??=e.inputTrack.getSegments().then(t=>(e.segments=t,e.segmentCount=t.length,t)),e.segmentsPromise):(e.segments=[],e.segmentCount=0,e.segments),filterByCodecs=(e,t)=>{let n=e.filter(e=>t.some(t=>t===e.codec));return n.length?n:e.toSorted((e,t)=>(t.bitrate??0)-(e.bitrate??0))},filterByQuality=(e,t)=>{let n=t?parseInt(String(t),10)*16/9:void 0,r=e.toSorted((e,t)=>(t.bitrate??0)-(e.bitrate??0));if(!t)return r;let i=e.filter(e=>Number(e.height)===Number(t));if(i.length)return i;let a=e.filter(e=>Number(e.width)===Number(n));return a.length?a:r},filterByChannels=(e,t)=>e.filter(e=>e.numberOfChannels===Number(t)),normalizeLanguage=e=>e?.trim().toLowerCase()??``,getLanguageFamily=e=>normalizeLanguage(e).slice(0,2),getLanguageVariant=e=>normalizeLanguage(e)||`und`,matchesRequestedLanguage=(e,t)=>{let n=normalizeLanguage(e),r=normalizeLanguage(t);return!n||!r?!1:n===r||n.startsWith(`${r}-`)?!0:getLanguageFamily(n)===getLanguageFamily(r)},getUniqueLanguageFamilies=e=>Array.from(new Map(e.map(e=>normalizeLanguage(e)).filter(Boolean).map(e=>[getLanguageFamily(e),e])).values()),takeBestTracksPerVariant=(e,t)=>{let n=new Map;for(let r of e){let e=getLanguageVariant(r.languageCode),i=n.get(e);if(!i){n.set(e,[r]);continue}i.length<t&&i.push(r)}return Array.from(n.values()).flat()},filterByLanguages=(e,t,n=1)=>{let r=e.toSorted((e,t)=>(t.bitrate??0)-(e.bitrate??0)),i=getUniqueLanguageFamilies(t),a=[];for(let e of i){let t=r.filter(t=>matchesRequestedLanguage(t.languageCode,e));t.length&&a.push(...takeBestTracksPerVariant(t,n))}let o=getUniqueLanguageFamilies(e.map(e=>e.languageCode||`und`));if(!a.length)for(let e of o){let t=r.filter(t=>matchesRequestedLanguage(t.languageCode??`und`,e));t.length&&a.push(...takeBestTracksPerVariant(t,n))}return a},filterPairableAudios=(e,t)=>{if(!t?.inputTrack)return e;let n=t.inputTrack,r=e.filter(e=>e.inputTrack?e.inputTrack.canBePairedWith(n):!0);return r.length?r:e},toKbps=e=>(e??0)/1e3,getSegmentCountLabel=async e=>{if(typeof e.segmentCount==`number`)return`${e.segmentCount} Segments`;if(!e.inputTrack)return`Direct`;try{return`${(await ensurePreparedTrackSegments(e)).length} Segments`}catch{return`? Segments`}},buildSelectedTracks=({videos:e,audios:t,subtitles:n})=>({videos:e,audios:t,subtitles:n,all:[...e,...t,...n]});async function getTracks(e,t,n){let r=t.videoQuality,i=e.filter(e=>e.type===`video`&&!e.isIFrameOnly),a=e.filter(e=>e.type===`audio`),o=e.filter(e=>e.type===`subtitle`);if(t.select){let e=await Promise.all(i.map(async(e,t)=>({name:`${e.width??`?`}x${e.height??`?`} | ${toKbps(e.bitrate)||`?`} Kbps | ${e.codec??`?`} | ${await getSegmentCountLabel(e)}`,value:e.id,checked:t===0}))),t=i.length?await checkbox({message:`Select video streams`,pageSize:12,choices:e,loop:!1}):[],n=i.filter(e=>t.includes(e.id)),r=await Promise.all(a.map(async(e,t)=>({name:`${e.name?`${e.name} | `:``}${toKbps(e.bitrate)||`?`} Kbps | ${e.codec?`${e.codec} | `:``}${e.languageCode||`und`} | ${e.numberOfChannels??`?`}CH | ${await getSegmentCountLabel(e)}`,value:e.id,checked:t===0}))),s=a.length?await checkbox({message:`Select audio streams`,pageSize:12,choices:r,loop:!1}):[],c=a.filter(e=>s.includes(e.id)),l=await Promise.all(o.map(async(e,t)=>({name:`${e.codec??`?`} | ${e.languageCode||`und`} | ${await getSegmentCountLabel(e)}`,value:e.id,checked:t===0}))),u=o.length?await checkbox({message:`Select subtitles`,pageSize:12,choices:l,loop:!1}):[];return buildSelectedTracks({videos:n,audios:c,subtitles:o.filter(e=>u.includes(e.id))})}t.videoCodecs&&(i=filterByCodecs(i,t.videoCodecs)),i=filterByQuality(i,r||NaN);let s=i[0],c=[...t.languages||[]],l=n.audioLanguage?.slice(0,2);!c.length&&l&&c.push(l);let u=filterPairableAudios(a,s);t.audioChannels&&(u=filterByChannels(u,t.audioChannels)),t.audioCodecs&&(u=filterByCodecs(u,t.audioCodecs));let d=filterByLanguages(u,c,1);d.length&&(u=d);let f=c.at(-1),p=f?u.map(e=>!e.languageCode||e.languageCode===`und`?{...e,languageCode:f}:e):u,m=o.filter(e=>t.subtitleLanguages?.length?t.subtitleLanguages.some(t=>matchesRequestedLanguage(e.languageCode||`und`,t)):!1);return buildSelectedTracks({videos:t.skipVideo||!s?[]:[s],audios:t.skipAudio?[]:p,subtitles:t.skipSubtitles?[]:m})}const createEmptyPreparedTracks=()=>({videos:[],audios:[],subtitles:[],all:[]}),audioCodecMap={aac:`aac`,mp4a:`aac`,"mp4a.40.2":`aac`,ac3:`ac3`,"ac-3":`ac3`,eac3:`eac3`,"ec-3":`eac3`,opus:`opus`,vorbis:`vorbis`,flac:`flac`},tryGetUrl=e=>{if(!e)return null;try{return new URL(e)}catch{return null}},normalizePathname=e=>{let t=tryGetUrl(e);if(t)try{return decodeURIComponent(t.pathname)}catch{return t.pathname}},normalizeAudioStreamCodec=e=>{if(!e)return`aac`;let t=e.toLowerCase();return audioCodecMap[t]??audioCodecMap[t.split(`.`)[0]??``]??`aac`},countTracksByType=(e,t)=>e.filter(e=>e.type===t).length,logExtractedTracks=e=>{let t=`Extracted, there are `;if(e.length===0)t+=`no tracks`;else{t+=`${e.length} tracks`;let n=countTracksByType(e,`video`);n&&(t+=`, ${n} video tracks`);let r=countTracksByType(e,`audio`);r&&(t+=`, ${r} audio tracks`);let i=countTracksByType(e,`subtitle`);i&&(t+=`, ${i} subtitle tracks`)}logger.info(t)},appendAdditionalSubtitles=(e,t=[])=>{let n=[...t];for(let t of e.subtitles??[]){let r=normalizePathname(t.url),i=normalizeTrackLanguageCode(t.language,e.url);n.some(e=>{let t=normalizePathname(e.sourceUrl);return!r||!t?!1:r===t})||n.push({id:createPreparedTrackId({origin:`external-subtitle`,type:`subtitle`,sourceUrl:t.url,languageCode:i,name:t.label||t.title,codec:t.format}),origin:`external-subtitle`,type:`subtitle`,sourceUrl:t.url,languageCode:i,codec:t.format,forced:t.forced,name:t.label||t.title})}return n},prepareProgressiveSource=async({options:e,source:t,meta:n,detection:r})=>{let i={...e},a={...n};if(!a.title){let e=tryGetUrl(t.url)?.pathname.split(`/`).pop();e&&(a.title=e)}let{primaryVideoTrack:o,primaryAudioTrack:s}=await inspectMedia(t.url,t.headers),c=await o?.getCodec(),l=await o?.getCodedWidth(),u=await o?.getCodedHeight();i.videoQuality||=u?`${u}p`:void 0;let d=createEmptyPreparedTracks();if(d.subtitles=appendAdditionalSubtitles(t),d.all.push(...d.subtitles),r.isAudio&&!i.skipAudio){let e={id:createPreparedTrackId({origin:`progressive`,type:`audio`,sourceUrl:t.url,languageCode:t.audioLanguage,codec:await s?.getCodec()}),origin:`progressive`,type:`audio`,codec:normalizeAudioStreamCodec(await s?.getCodec()),languageCode:normalizeTrackLanguageCode(await s?.getLanguageCode(),t.url)??normalizeTrackLanguageCode(t.audioLanguage,t.url)??`und`,numberOfChannels:await s?.getNumberOfChannels(),sampleRate:await s?.getSampleRate(),sourceUrl:t.url};return d.audios.push(e),d.all.push(e),{options:i,source:t,meta:a,allTracks:[e],tracks:d}}if(!i.skipVideo){let e=parseInt((i.videoQuality??``).replace(`p`,``),10),n={id:createPreparedTrackId({origin:`progressive`,type:`video`,sourceUrl:t.url,codec:c}),origin:`progressive`,type:`video`,codec:c??`avc`,width:l??void 0,height:u??(e||void 0),sourceUrl:t.url};return d.videos.push(n),d.all.push(n),{options:i,source:t,meta:a,allTracks:[n],tracks:d}}return{options:i,source:t,meta:a,allTracks:[],tracks:d}},prepareInputSource=async({options:e,source:t,meta:n,input:r,disposeInput:i=!0})=>{let a={...e},o={...n},s=i;try{let e=await r.getTracks();if(!e.length)throw new DownloaderError(`MANIFEST_PARSE_FAILED`,`Failed to parse manifest`);let n=await Promise.all(e.map(e=>createPreparedTrackFromManifestTrack(e,t.url)));logExtractedTracks(n);let c=await getTracks(n,a,t),l=c.videos[0]?.height;if(l&&(a.videoQuality=`${l}p`),!o.title){let e=tryGetUrl(t.url)?.host;e&&(o.title=`${e}_${getCurrentDateTimeString()}`)}return s=!1,{options:a,source:t,meta:o,allTracks:n,tracks:c,dispose:i?()=>r.dispose?.():void 0}}finally{s&&r.dispose?.()}},prepareManifestSource=async({http:e,options:t,source:n,meta:r,detection:i})=>prepareInputSource({options:t,source:n,meta:r,input:createManifestInput({http:e,source:n,detection:i})}),prepareSource=async({http:e,options:t,source:n,meta:r,input:i,detection:a})=>i?prepareInputSource({options:t,source:n,meta:r,input:i,disposeInput:!1}):a.strategy===`progressive`?prepareProgressiveSource({options:t,source:n,meta:r,detection:a}):prepareManifestSource({http:e,options:t,source:n,meta:r,detection:a}),hasSuffix=(e,t)=>{try{let n=new URL(e);return n.pathname.endsWith(t)||n.search.endsWith(t)}catch{return!1}},selectPreparationStrategy=async(e,t)=>{let n=hasSuffix(t.url,`.m3u8`),r=hasSuffix(t.url,`.mpd`),i=hasSuffix(t.url,`.mp4`),a=hasSuffix(t.url,`.mov`),o=!1,s=!1;if(!n&&!r&&!i&&!a)try{let n=await e.fetch(t.url,{method:`HEAD`,headers:t.headers});if(!n.ok)logger.warn(`HEAD request for ${t.url} returned ${n.status} ${n.statusText}`);else{let e=n.headers.get(`content-type`);o=!!e?.includes(`audio`),s=!!e?.includes(`video`)}}catch(e){let n=e instanceof Error?e.message:String(e);logger.warn(`HEAD request failed for ${t.url}: ${n}`)}return r?{strategy:`manifest`,kind:`mpd`,isAudio:o,isVideo:s,matchedContentLabel:`Dynamic Adaptive Streaming over HTTP`}:n?{strategy:`manifest`,kind:`m3u8`,isAudio:o,isVideo:s,matchedContentLabel:`HTTP Live Streaming`}:o||s||i||a?{strategy:`progressive`,kind:`progressive`,isAudio:o,isVideo:s,matchedContentLabel:`Progressive Stream`}:{strategy:`manifest`,kind:`unknown`,isAudio:o,isVideo:s}};var require_reusify=__commonJSMin(((e,t)=>{function n(e){var t=new e,n=t;function r(){var r=t;return r.next?t=r.next:(t=new e,n=t),r.next=null,r}function i(e){n.next=e,n=e}return{get:r,release:i}}t.exports=n})),require_queue=__commonJSMin(((e,t)=>{var n=require_reusify();function r(e,t,r){if(typeof e==`function`&&(r=t,t=e,e=null),!(r>=1))throw Error(`fastqueue concurrency must be equal to or greater than 1`);var o=n(a),s=null,c=null,l=0,u=null,d={push:v,drain:i,saturated:i,pause:p,paused:!1,get concurrency(){return r},set concurrency(e){if(!(e>=1))throw Error(`fastqueue concurrency must be equal to or greater than 1`);if(r=e,!d.paused)for(;s&&l<r;)l++,b()},running:f,resume:g,idle:_,length:m,getQueue:h,unshift:y,empty:i,kill:x,killAndDrain:S,error:w,abort:C};return d;function f(){return l}function p(){d.paused=!0}function m(){for(var e=s,t=0;e;)e=e.next,t++;return t}function h(){for(var e=s,t=[];e;)t.push(e.value),e=e.next;return t}function g(){if(d.paused){if(d.paused=!1,s===null){l++,b();return}for(;s&&l<r;)l++,b()}}function _(){return l===0&&d.length()===0}function v(n,a){var f=o.get();f.context=e,f.release=b,f.value=n,f.callback=a||i,f.errorHandler=u,l>=r||d.paused?c?(c.next=f,c=f):(s=f,c=f,d.saturated()):(l++,t.call(e,f.value,f.worked))}function y(n,a){var f=o.get();f.context=e,f.release=b,f.value=n,f.callback=a||i,f.errorHandler=u,l>=r||d.paused?s?(f.next=s,s=f):(s=f,c=f,d.saturated()):(l++,t.call(e,f.value,f.worked))}function b(n){n&&o.release(n);var i=s;i&&l<=r?d.paused?l--:(c===s&&(c=null),s=i.next,i.next=null,t.call(e,i.value,i.worked),c===null&&d.empty()):--l===0&&d.drain()}function x(){s=null,c=null,d.drain=i}function S(){s=null,c=null,d.drain(),d.drain=i}function C(){var e=s;for(s=null,c=null;e;){var t=e.next,n=e.callback,r=e.errorHandler,a=e.value,o=e.context;e.value=null,e.callback=i,e.errorHandler=null,r&&r(Error(`abort`),a),n.call(o,Error(`abort`)),e.release(e),e=t}d.drain=i}function w(e){u=e}}function i(){}function a(){this.value=null,this.callback=i,this.next=null,this.release=i,this.context=null,this.errorHandler=null;var e=this;this.worked=function(t,n){var r=e.callback,a=e.errorHandler,o=e.value;e.value=null,e.callback=i,e.errorHandler&&a(t,o),r.call(e.context,t,n),e.release(e)}}function o(e,t,n){typeof e==`function`&&(n=t,t=e,e=null);function a(e,n){t.call(this,e).then(function(e){n(null,e)},n)}var o=r(e,a,n),s=o.push,c=o.unshift;return o.push=l,o.unshift=u,o.drained=d,o;function l(e){var t=new Promise(function(t,n){s(e,function(e,r){if(e){n(e);return}t(r)})});return t.catch(i),t}function u(e){var t=new Promise(function(t,n){c(e,function(e,r){if(e){n(e);return}t(r)})});return t.catch(i),t}function d(){return new Promise(function(e){process.nextTick(function(){if(o.idle())e();else{var t=o.drain;o.drain=function(){typeof t==`function`&&t(),e(),o.drain=t}}})})}}t.exports=r,t.exports.promise=o})),import_queue=__toESM(require_queue(),1);const DEFAULT_CONNECT_TIMEOUT=3e5,createClient=(e={})=>{let t=e.maxRetries??5,{proxy:n}=e,r=n?new ProxyAgent({uri:n,allowH2:!0}):new Agent({allowH2:!0});return kyImport.create({fetch:e.fetch,dispatcher:r,proxy:n,timeout:DEFAULT_CONNECT_TIMEOUT,retry:{limit:t,methods:[`get`,`head`],statusCodes:[408,413,429,500,502,503,504],backoffLimit:3e4},throwHttpErrors:!0,redirect:`follow`,headers:{"user-agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36`}})},sleep=e=>new Promise(t=>setTimeout(t,e)),createTempFileDir=async(e,t)=>{let n=await fsp.stat(t).catch(()=>null);(!n||!n.isDirectory())&&await fsp.mkdir(t,{recursive:!0});let r=getTempFileDirPath(e,t),i=await fsp.stat(r).catch(()=>null);return(!i||!i.isDirectory())&&await fsp.mkdir(r,{recursive:!0}),r},getTempFileDirPath=(e,t)=>{let n=path.resolve(e),r=path.parse(e).name,i=createHash(`sha1`).update(n).digest(`hex`).slice(0,10);return path.join(t,`${r}-${i}`)},ensureDirExists=async e=>{let t=path.dirname(e),n=path.resolve(t);path.parse(n).root!==n&&(await fsp.stat(t).then(()=>!0).catch(()=>!1)||await fsp.mkdir(t,{recursive:!0}))},clear=async(...e)=>{let t=[];for(let n of e)n&&t.push(fsp.rm(n,{recursive:!0,force:!0}).catch(()=>void 0));await Promise.all(t)},getDefaultResumeFilePath=e=>`${e}.part.json`,resolvePath=e=>{if(e.filePath)return e.filePath;if(e.output)return getDefaultResumeFilePath(e.output);throw Error(`Either output or filePath is required for FileResumeStore`)},isRetryableRenameError=e=>{if(!e||typeof e!=`object`)return!1;let t=`code`in e?e.code:void 0;return t===`EPERM`||t===`EACCES`||t===`EBUSY`},replaceFile=async(e,t)=>{let n=process$1.platform===`win32`?[0,50,150,300,500]:[0],r;for(let i of n){i>0&&await sleep(i);try{await fsp.rename(e,t);return}catch(n){if(r=n,!isRetryableRenameError(n))break;await fsp.rm(t,{force:!0}).catch(()=>void 0);try{await fsp.rename(e,t);return}catch(e){if(r=e,!isRetryableRenameError(e))break}}}throw r};var FileResumeStore=class{async get(e){let t=resolvePath(e);if(!await fsp.stat(t).then(()=>!0).catch(()=>!1))return null;try{let e=await fsp.readFile(t,`utf8`);return JSON.parse(e)}catch{return null}}async set(e,t){let n=resolvePath(e);await ensureDirExists(n);let r=`${n}.${process$1.pid}.${Date.now().toString(36)}.tmp`;await fsp.writeFile(r,JSON.stringify(t));try{await replaceFile(r,n)}finally{try{await fsp.rm(r,{force:!0})}catch{}}}async delete(e){let t=resolvePath(e);await fsp.rm(t,{force:!0}).catch(()=>void 0)}};const toAbsoluteOutputPath=e=>path.resolve(e),getDefaultResumeKey=e=>createHash(`sha1`).update(toAbsoluteOutputPath(e)).digest(`hex`),toStateParts=e=>e.map((e,t)=>({index:t,start:e.start,end:e.end,output:e.output,completed:!1,bytesWritten:0})),hasSameLayout=(e,t)=>e.parts.length===t.length?e.parts.every((e,n)=>{let r=t[n];return r?e.start===r.start&&e.end===r.end&&(e.output??null)===(r.output??null):!1}):!1,hasSameSignature=(e,t)=>!t||!e.sourceSignature?!0:e.sourceSignature===t,normalizeDownloadedBytes=e=>{let t=e.parts.reduce((e,t)=>e+t.bytesWritten,0);return t>0?t:e.bytesDownloaded},isValidResumeState=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.version===2&&typeof t.key==`string`&&Array.isArray(t.parts)&&typeof t.bytesDownloaded==`number`};var ResumeManager=class{key;output;filePath;cleanupOnSuccess;store;target;trustExplicitKey;constructor(e={}){if(this.output=e.output,this.filePath=e.filePath,this.key=e.key??(this.output?getDefaultResumeKey(this.output):``),!this.key)throw Error(`Resume key is required when output is not provided`);this.store=e.store??new FileResumeStore,this.cleanupOnSuccess=e.cleanupOnSuccess??!0,this.target={key:this.key,output:this.output,filePath:this.filePath},this.trustExplicitKey=typeof e.key==`string`&&e.key.length>0}async read(){let e=await this.store.get(this.target);return isValidResumeState(e)?e:null}async write(e){let t=new Date().toISOString(),n={...e,version:2,key:this.key,output:e.output??this.output,bytesDownloaded:normalizeDownloadedBytes(e),createdAt:e.createdAt||t,updatedAt:t};await this.store.set(this.target,n)}async delete(){await this.store.delete(this.target)}createState(e){let t=new Date().toISOString();return{version:2,key:this.key,output:this.output,input:e.input,bytesTotal:e.bytesTotal,bytesDownloaded:0,parts:toStateParts(e.parts),sourceSignature:e.sourceSignature,planner:e.planner,createdAt:t,updatedAt:t}}reconcileState(e,t){let n=e.version!==2,r=e.key!==this.key,i=!this.trustExplicitKey&&!hasSameSignature(e,t.sourceSignature),a=!hasSameLayout(e,t.parts);if(n||r||i||a)return{state:this.createState(t),reset:!0};let o={...e,key:this.key,output:this.output,input:t.input,bytesTotal:t.bytesTotal,sourceSignature:t.sourceSignature,planner:t.planner,parts:t.parts.map((t,n)=>{let r=e.parts[n];return{index:n,start:t.start,end:t.end,output:t.output,completed:r?.completed??!1,bytesWritten:r?.bytesWritten??0}}),createdAt:e.createdAt,updatedAt:e.updatedAt};return o.bytesDownloaded=normalizeDownloadedBytes(o),{state:o,reset:!1}}markPartCompleted(e,t,n){let r=e.parts[t];if(!r)return e;let i=r.bytesWritten;return r.completed=!0,r.bytesWritten=n,e.bytesDownloaded=Math.max(0,e.bytesDownloaded-i+n),e.updatedAt=new Date().toISOString(),e}async getProgress(){let e=await this.read();if(!e)return null;let t=e.bytesDownloaded;if(e.bytesTotal){let n=e.bytesTotal;return{bytesDownloaded:t,totalBytes:n,percentComplete:n>0?Math.round(t/n*100):0}}let n=e.parts.length,r=e.parts.filter(e=>e.completed).length;return{bytesDownloaded:t,totalBytes:null,percentComplete:n>0?Math.round(r/n*100):0,segmentsCompleted:r,segmentsTotal:n}}};const DEFAULT_MAX_PART_SIZE=8*2**20,getPartOutput=(e,t,n)=>{let r=`part_${n}.part`;return path.join(t,r)},getPartSize=(e,t,n)=>{let r=Math.ceil(e/Math.max(1,t));return Math.max(1,Math.min(r,Math.max(1,n)))},getRanges=(e,t,n)=>{let r=getPartSize(e,t,n),i=[],a=0;for(;a<e;){let t=Math.min(e-1,a+r-1);i.push([a,t]),a=t+1}return i},getRangeHeader=e=>{let[t,n]=e;return`bytes=${t}-${n||``}`},getParts=e=>getRanges(e.contentLength,e.maxWorkerCount,e.maxChunkSize??DEFAULT_MAX_PART_SIZE).map(t=>{let[n,r]=t,i=new Headers(e.requestInit?.headers);return i.set(`Range`,getRangeHeader([n,r])),{url:e.url,headers:i,start:n,end:r}}),createAbortError$1=e=>{let t=e?Error(`The operation was aborted`,{cause:e}):Error(`The operation was aborted`);return t.name=`AbortError`,t},isAbortLikeError=e=>{if(!(e instanceof Error))return!1;if(e.name===`AbortError`||e.code===`ABORT_ERR`)return!0;let t=e.cause;return t instanceof Error&&t.name===`AbortError`},fetchWorker=async e=>await e.client.get(e.url,{redirect:`follow`,...e.requestInit}),saveData=(e,t,n)=>async r=>{if(n?.aborted)throw createAbortError$1();let i=typeof t==`number`?{flags:`r+`,start:t}:{flags:`w`},a=fs.createWriteStream(e,i),o=Readable.fromWeb(r.body);try{await pipeline(o,a,{signal:n})}catch(e){throw isAbortLikeError(e)?createAbortError$1(e):e}if(n?.aborted)throw createAbortError$1();return r},updateProgress=(e,t,n)=>r=>{if(n?.aborted)throw createAbortError$1();let i=parseInt(r.headers.get(`content-length`)||`0`);if(e.increase(i),n?.aborted)throw createAbortError$1();return t&&!n?.aborted?t(e.toProgressInfo()):e.log(),r},resolveResumeOptions=e=>typeof e==`boolean`?{enabled:e,cleanupOnSuccess:!0}:e?{enabled:e.enabled??!0,key:e.key,store:e.store,filePath:e.filePath,cleanupOnSuccess:e.cleanupOnSuccess??!0}:{enabled:!1,cleanupOnSuccess:!0},resolveDownloadConfig=e=>({tempDir:e.tempDir??process.cwd(),maxRetries:e.maxRetries??5,maxChunkSize:e.maxChunkSize??DEFAULT_MAX_PART_SIZE,maxWorkerCount:e.maxWorkerCount??4,resume:resolveResumeOptions(e.resume),proxy:e.proxy,requestInit:e.requestInit,fetchFn:e.fetchFn}),DEFAULT_STATE={total:{b:0,mb:0},current:{b:0,mb:0},chunkSize:0,chunkSizes:[],averageSize:{b:0,mb:0},averageTotal:{b:0,mb:0},speed:{bps:0,mbps:0}},formatSeconds=e=>{let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60,i=t>0?`${t}h`:``,a=n>0?`${n}m`:``,o=r>0?`${r}s`:``;return t>0?`${i} ${a||`0m`} ${o&&`${o}`}`:!t&&n>0?`${a} ${o&&`${o}`}`:o},createProgress=(e=0)=>{let t=structuredClone(DEFAULT_STATE),n=0,r=setInterval(()=>{n>1&&(t.speed.bps=t.current.b/n),n+=.5},500);return{state:t,setTotal:e=>{t.total.b=e,t.total.mb=e/1024/1024},setCurrent(e){t.current.b=e,t.current.mb=e/1024/1024},increase(n){t.current.b+=n,t.current.mb=t.current.b/1024/1024,t.speed.mbps=t.speed.bps/1024/1024,t.chunkSize=n,t.chunkSizes.push(n),t.averageSize.b=t.current.b/t.chunkSizes.length,t.averageSize.mb=t.averageSize.b/1024/1024,t.averageTotal.b=e*t.averageSize.b,t.averageTotal.mb=t.averageTotal.b/1024/1024},stop(){clearInterval(r),Object.assign(t,DEFAULT_STATE)},log(){let e=t.current.b,n=t.total.b,r=e+(n?`/${n}`:``);stdout.write(`\rDownloading [${r}]`)},stopLog(){stdout.write(`
|
|
2
|
+
import{A as shortVersion,C as SETTINGS_PATH,D as VITE_API_URL,E as APP_TITLE,O as VITE_PUBLIC_KEY,S as EXTENSIONS_SOURCES_DIR,T as APP_NAME,_ as APP_TEMP_DIR,a as prompt,b as EXTENSIONS_DIR,c as FileStorage,d as normalizeError,f as clearOutdatedLogs,g as APP_LOG_DIR,h as APP_DATA_DIR,i as httpClient,j as package_default,k as fullVersion,l as createConf,m as APP_CONFIG_DIR,n as load,o as getCurrentDateTimeString,p as logger,r as HttpClient,s as getLogPrefix,t as createContext,u as errors,v as DOWNLOAD_DIR,w as resolveDir,x as EXTENSIONS_INDEX_PATH,y as EXTENSIONS_DATA_DIR}from"./context-D70eLebO.mjs";import{createRequire}from"node:module";import fs,{constants,existsSync,rmSync}from"node:fs";import*as path$1 from"node:path";import path,{basename,dirname,extname,join,parse,resolve}from"node:path";import yargs from"yargs";import"urlpattern-polyfill";import colors from"picocolors";import*as fs$1 from"node:fs/promises";import fsp,{open,readFile,readdir,rm,stat,writeFile}from"node:fs/promises";import process$1,{platform,stdout}from"node:process";import{hideBin}from"yargs/helpers";import{EventEmitter as EventEmitter$1}from"node:events";import{z}from"zod";import{DASH_FORMATS,HLS_FORMATS,Input,UrlSource}from"dasha";import kyImport from"ky";import{Agent,ProxyAgent}from"undici";import{checkbox,confirm}from"@inquirer/prompts";import{execFileSync}from"node:child_process";import{createAuthClient}from"better-auth/client";import{deviceAuthorizationClient}from"better-auth/client/plugins";import{tributeClient}from"@tribute-tg/better-auth";import{QueryCache,QueryClient}from"@tanstack/query-core";import{createHash}from"node:crypto";import{inspect}from"node:util";import{ALL_FORMATS as ALL_FORMATS$1,EncodedAudioPacketSource,EncodedPacketSink,EncodedVideoPacketSource,Input as Input$1,MkvOutputFormat,Mp4OutputFormat,Output,StreamSource,StreamTarget,TextSubtitleSource,UrlSource as UrlSource$1}from"mediabunny";import{finished,pipeline}from"node:stream/promises";import{Readable}from"node:stream";import{isatty}from"node:tty";import{createSpinner}from"nanospinner";import{RemoteCdm,requestMediaKeySystemAccess}from"okova";import{Decryption,FilePathSource,FilePathTarget,Input as Input$2,Output as Output$1}from"shifro";import{convert}from"@transcrobes/subs-convert";import open$1 from"open";var __create=Object.create,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__commonJSMin=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),__copyProps=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=__getOwnPropNames(t),a=0,o=i.length,s;a<o;a++)s=i[a],!__hasOwnProp.call(e,s)&&s!==n&&__defProp(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=__getOwnPropDesc(t,s))||r.enumerable});return e},__toESM=(e,t,n)=>(n=e==null?{}:__create(__getProtoOf(e)),__copyProps(t||!e||!e.__esModule?__defProp(n,`default`,{value:e,enumerable:!0}):n,e)),__require=createRequire(import.meta.url);const getWinConsoleAddonPath=()=>{let e=[];process.resourcesPath&&e.push(join(process.resourcesPath,`bin`,`winconsole.node`));let t=join(__dirname,`..`,`..`,`..`);return e.push(join(t,`assets`,`bin`,`win32`,`winconsole.node`)),e.push(join(t,`native`,`winconsole`,`build`,`Release`,`winconsole.node`)),e.find(e=>existsSync(e))||null},loadWinConsoleAddon=()=>{if(process.platform!==`win32`)return null;let e=getWinConsoleAddonPath();if(!e)return null;try{return __require(e)}catch{return null}};if(process.platform===`win32`){let e=loadWinConsoleAddon();e&&(e.attachParentConsole?.(),e.enableUtf8?.())}const getCliArgs=(e=process.argv,t=process.env)=>t.ELECTRON_RUN_AS_NODE===`1`?e.slice(2):hideBin(e),getDefaultLanguage=()=>Intl.DateTimeFormat().resolvedOptions().locale.startsWith(`ru`)?`ru`:`en`,THEME={dark:`dark`,light:`light`,system:`system`},VIDEO_CONTAINER_FORMAT={mp4:`mp4`,mkv:`mkv`},SettingsSchema=z.object({downloadDir:z.string().default(DOWNLOAD_DIR),binariesDir:z.string().default(resolveDir(join(APP_CONFIG_DIR,`bin`))),drmDir:z.string().default(resolveDir(join(APP_CONFIG_DIR,`drm`))),language:z.string().default(getDefaultLanguage()),theme:z.enum([THEME.dark,THEME.light,THEME.system]).default(THEME.system),preferHardsub:z.coerce.boolean().default(!1),retry:z.coerce.number().int().min(1).max(10).default(3),connections:z.coerce.number().int().min(1).max(64).default(4),maxActiveDownloads:z.coerce.number().int().min(1).default(1),proxy:z.string().optional(),proxyMeta:z.string().optional(),proxyMedia:z.string().optional(),movieFilenameTemplate:z.string().default(`{title} ({quality}, {codec})`),seriesFilenameTemplate:z.string().default(`{title} S{s}E{e} ({quality}, {codec})`),developerMode:z.coerce.boolean().default(!1),allowUnknownSources:z.coerce.boolean().default(!1),videoContainerFormat:z.enum([VIDEO_CONTAINER_FORMAT.mp4,VIDEO_CONTAINER_FORMAT.mkv]).default(VIDEO_CONTAINER_FORMAT.mp4),useAlternativeServer:z.coerce.boolean().default(!1),automaticUpdates:z.coerce.boolean().default(!0)}),defaultSettings=SettingsSchema.parse({});var SettingsStore=class{#e;constructor(e){this.#e=createConf({defaults:defaultSettings,cwd:dirname(e),configName:basename(e,`.json`)}),this.#t()}#t(){let e=this.#e.store,t=SettingsSchema.safeParse(e),n=`{title}.{audioType}.{quality}.{tag}.{format}.{codec}`,r=`{title}.S{s}E{e}.{episodeTitle}.{audioType}.{quality}.{tag}.{format}.{codec}`;if(e.movieFilenameTemplate===`{title}.{audioType}.{quality}.{tag}.{format}.{codec}`&&this.#e.set(`movieFilenameTemplate`,e.seriesFilenameTemplate),e.seriesFilenameTemplate===`{title}.S{s}E{e}.{episodeTitle}.{audioType}.{quality}.{tag}.{format}.{codec}`&&this.#e.set(`seriesFilenameTemplate`,e.seriesFilenameTemplate),!t.success){console.warn(`Settings validation failed! Resetting to defaults.`,t.error.flatten()),this.#e.set(defaultSettings);return}Object.hasOwn(e,`askForOptions`)&&this.#e.set(t.data)}getAll(){return this.#e.store}get(e){return this.#e.get(e)}set(e){let t={...this.#e.store,...e},n=SettingsSchema.safeParse(t);if(!n.success)throw console.error(`Invalid settings update:`,n.error.flatten()),Error(`Settings update failed validation.`);this.#e.set(n.data)}onDidChange(e){this.#e.onDidAnyChange(e)}};const exists=async e=>{try{return await fsp.access(e),!0}catch(e){if(e.code===`ENOENT`)return!1;throw e}},ls=async(e,{recursive:t=!1}={})=>await fsp.readdir(e,{withFileTypes:!0,recursive:t}),rm$1=async(e,{recursive:t=!0,force:n=!0}={})=>{await fsp.rm(e,{recursive:t,force:n})},mkdir=async(e,{recursive:t=!0}={})=>{await fsp.mkdir(e,{recursive:t})},assertDownloadDirWritable=async e=>{try{await fsp.access(e,constants.W_OK)}catch(e){let t=e.code;throw t===`EPERM`||t===`EACCES`||t===`ENOENT`?Object.assign(Error(`Download directory is not writable`),{code:`DOWNLOAD_DIR_NOT_WRITABLE`}):e}},readJson=async e=>{try{let t=await fsp.readFile(e,{encoding:`utf8`});return JSON.parse(t)}catch(t){throw Error(`Failed to read JSON file: ${e}`,{cause:t})}},writeJson=async(e,t)=>{let n=parse(e).dir;try{let r=await exists(n);n&&!r&&await fsp.mkdir(n),await fsp.writeFile(e,JSON.stringify(t,null,2),`utf8`)}catch(t){throw Error(`Failed to save data to file: ${e}`,{cause:t})}},tar={extract:(e,t)=>execFileSync(`tar`,[`-xf`,e,...t?[`-C`,t]:[]],{stdio:`inherit`})},INSTALL_EXTENSION_ERROR_CODES={CHANNEL_NOT_FOUND:`EXTENSION_INSTALL_CHANNEL_NOT_FOUND`,VERSION_NOT_FOUND:`EXTENSION_INSTALL_VERSION_NOT_FOUND`,RELEASE_NOT_FOUND:`EXTENSION_INSTALL_RELEASE_NOT_FOUND`,ASSET_NOT_FOUND:`EXTENSION_INSTALL_ASSET_NOT_FOUND`,UNSUPPORTED_SOURCE:`EXTENSION_INSTALL_UNSUPPORTED_SOURCE`,UNSUPPORTED_PACKAGE_TYPE:`EXTENSION_INSTALL_UNSUPPORTED_PACKAGE_TYPE`,IMPORT_INVALID:`EXTENSION_INSTALL_IMPORT_INVALID`,SOURCE_NOT_FOUND:`EXTENSION_INSTALL_SOURCE_NOT_FOUND`,UNKNOWN:`EXTENSION_INSTALL_UNKNOWN`},KNOWN_INSTALL_EXTENSION_ERROR_CODES=new Set(Object.values(INSTALL_EXTENSION_ERROR_CODES));var InstallExtensionError=class extends Error{code;details;hint;constructor(e){super(e.message),this.name=`InstallExtensionError`,this.code=e.code,this.details=e.details,this.hint=e.hint}toPayload(){return{code:this.code,message:this.message,details:this.details,hint:this.hint}}};const createInstallExtensionError=(e,t,n,r)=>new InstallExtensionError({code:e,message:t,details:n,hint:r}),getChannel=e=>{let t=(e?.startsWith(`v`)?e[1]:e?.[0])??``;return Number.isNaN(parseInt(t))?e?.split(`.`).at(0)||`latest`:e?.split(`-`).at(1)?.split(`.`).at(0)||`latest`},getReleaseTag=e=>(e.version||e.tag_name||``).replace(/^v/,``),toUniqueList=e=>[...new Set(e.filter(Boolean))],getAvailableReleaseDetails=e=>({availableVersions:toUniqueList((e||[]).map(e=>getReleaseTag(e))),availableChannels:toUniqueList((e||[]).map(e=>getChannel(getReleaseTag(e))))}),createRequestedReleaseNotFoundError=(e,t,n)=>{let r={source:n,preferredVersion:e.preferredVersion,preferredChannel:e.preferredChannel,appChannel:e.appChannel,...getAvailableReleaseDetails(t)};return e.preferredVersion?createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.VERSION_NOT_FOUND,`Release not found for requested version: ${e.preferredVersion}`,r):createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.CHANNEL_NOT_FOUND,`Release not found for requested channel: ${e.preferredChannel}`,r)},selectRelease=(e,t,n)=>{if(!e?.length)return null;if(t.preferredVersion)return e.find(e=>getReleaseTag(e)===t.preferredVersion)||null;if(!t.isExplicitSelection){let t=e.find(e=>getChannel(getReleaseTag(e))===`latest`);if(t)return t}return e.find(e=>getChannel(getReleaseTag(e))===t.preferredChannel)||(t.allowFallback&&t.preferredChannel!==`latest`?(logger.debug(`Release ${t.preferredChannel} not found for ${n}, falling back to latest stable`),e.find(e=>getChannel(getReleaseTag(e))===`latest`)||(logger.debug(`Latest stable release not found for ${n}, falling back to latest with any channel`),e.at(0)||null)):null)},parseReleasePreference=e=>{let[,t=``]=e.split(`@`),n=e.replace(t?`@${t}`:``,``),r=getChannel(package_default.version),i=!!t;return{name:n,preferredVersion:Number.isNaN(parseInt(t[0]??``))?``:t,preferredChannel:i?getChannel(t):r,appChannel:r,isExplicitSelection:i,allowFallback:!i&&r!==`latest`}},fetchExtensionAsset=async(e,t)=>{logger.info(`Fetching bundle...`),logger.debug(e);let n=await fetch(e);if(!n.ok)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.ASSET_NOT_FOUND,`Failed to download extension bundle: ${n.status} ${n.statusText}`,{url:e,status:n.status,statusText:n.statusText});let r=n.headers.get(`content-disposition`)?.split(`filename=`)[1]?.split(`;`)[0]?.replaceAll(`"`,``),i=path.basename(e),a=t||r||i,o=await n.arrayBuffer(),s=path.join(EXTENSIONS_SOURCES_DIR,a);return await fsp.writeFile(s,Buffer.from(o)),await fsp.stat(s).then(e=>{logger.debug(`Bundle downloaded (${e.size/1e3} KB): ${s}`)}).catch(()=>{logger.error(`Bundle download failed: can't find output file`)}),s},downloadExtension=async(e,t)=>{if(e.startsWith(`npm:`)||e.startsWith(`@streamyx/`))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.UNSUPPORTED_SOURCE,`NPM extension sources are no longer supported`,{source:e});let n=e,r=e,i=path.dirname(e),a=i!==`.`&&await fsp.stat(i).then(()=>!0,()=>!1),o=e.startsWith(`./`)||e.startsWith(`../`)||e.startsWith(`/`)||e.startsWith(`~`)||a,s=await fsp.stat(e).then(()=>!0,()=>!1),c=e.startsWith(`https://`),l=e.startsWith(`gl:`)||e.startsWith(`gitlab:`),u=e.startsWith(`github:`)||e.startsWith(`gh:`);if(o&&!s&&!c&&!u&&!l)throw logger.warn(`Installed extension not found: ${e}`),logger.warn(`Run 'azot list' and remove the extension from the list.`),createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.SOURCE_NOT_FOUND,`Installed extension source not found: ${e}`,{source:e});e=e.replace(/^gl:/,``).replace(/^gitlab:/,``).replace(/^gh:/,``).replace(/^github:/,``);let d=parseReleasePreference(e),{name:f}=d;if(c)n=await fetchExtensionAsset(e);else if(u){let[e,t]=f.split(`/`),r=`https://api.github.com/repos/${e}/${t}/releases`,i=await fetch(r).then(e=>e.json());if(i?.message&&!Array.isArray(i))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitHub releases request failed: ${i.message}`,{source:f,provider:`github`,apiMessage:i.message});let a=Array.isArray(i)?i:[],o=selectRelease(a,d,f);if(!o)throw d.isExplicitSelection?createRequestedReleaseNotFoundError(d,a,f):createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitHub release not found`,{source:f,provider:`github`,...getAvailableReleaseDetails(a)});let s=o.assets?.find(e=>e.name.endsWith(`.tgz`)||e.name.endsWith(`.zip`));if(!s)throw logger.debug(o),createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.ASSET_NOT_FOUND,`GitHub release asset not found`,{source:f,provider:`github`,releaseTag:getReleaseTag(o)});let c=s.browser_download_url;n=await fetchExtensionAsset(c)}else if(!s){let e=t?.find(e=>e.name===f),r=e?.releases||[],i=selectRelease(r,d,f),a=i?.assets.find(e=>e.name.endsWith(`.tgz`));if(e&&!i&&d.isExplicitSelection)throw createRequestedReleaseNotFoundError(d,r,f);if(a)n=await fetchExtensionAsset(a.url,a.name);else{let[e,t=`streamyx-extensions`]=f.split(`/`).reverse(),r=`https://gitlab.com/api/v4/projects/${t}%2F${e}/releases`,i=await fetch(r).then(e=>e.json());if(i?.message&&!Array.isArray(i))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitLab releases request failed: ${i.message}`,{source:f,provider:`gitlab`,apiMessage:i.message});let a=Array.isArray(i)?i:[],o=selectRelease(a,d,f);if(!o)throw d.isExplicitSelection?createRequestedReleaseNotFoundError(d,a,f):createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.RELEASE_NOT_FOUND,`GitLab release not found`,{source:f,provider:`gitlab`,...getAvailableReleaseDetails(a)});let s=o.assets?.links?.find(e=>e.name.endsWith(`.tgz`));if(!s)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.ASSET_NOT_FOUND,`GitLab release asset not found`,{source:f,provider:`gitlab`,releaseTag:getReleaseTag(o)});n=await fetchExtensionAsset(s.direct_asset_url||s.url,s.name)}}let p=path.extname(n),m=p===`.zip`,h=p===`.tgz`,g=new Set([`.js`,`.mjs`,`.cjs`]).has(p),_=await fsp.stat(n).then(e=>e.isDirectory()).catch(()=>!1);if(g?r=path.dirname(n):_?r=n:(r=n.replace(`.tgz`,``).replace(`.zip`,``),await exists(r)||await mkdir(r)),m||h)tar.extract(n,r),await rm$1(n);else if(!(g||_))throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.UNSUPPORTED_PACKAGE_TYPE,`Unsupported package type`,{source:e,extensionSource:n,packageType:p||`unknown`});return r},getExports=e=>e&&`exports`in e?e.exports:e,getExtensionName=e=>e?.package?.name||`(unknown extension)`,getExtensionApiVersion=e=>{let t=getExports(e);return!t||typeof t!=`object`?null:typeof t.resolveEntries==`function`?`v2`:typeof t.getMediaInfo==`function`?`legacy-media`:typeof t.fetchContentMetadata==`function`?`legacy-content`:null},isSupportedExtensionExports=e=>getExtensionApiVersion(e)!==null,getCompatibleExtensionExports=e=>{let t=getExports(e);if(!t||typeof t!=`object`)throw Error(`Invalid extension exports`);return t},initializeExtension=async e=>{let t=getCompatibleExtensionExports(e),n=getExtensionName(e);try{if(typeof t.setup==`function`){await t.setup();return}typeof t.init==`function`&&await t.init()}catch(e){let r=typeof t.setup==`function`?`setup`:`init`,i=e instanceof Error?e:Error(String(e));throw logger.error(`Extension ${n} ${r} failed: ${i.message}`),i.stack&&logger.debug(i.stack),i}},loginWithExtension=async(e,t)=>{let n=getCompatibleExtensionExports(e),r=getExtensionName(e);try{if(typeof n.auth?.login==`function`){await n.auth.login(t);return}typeof n.login==`function`&&await n.login(t)}catch(e){let t=typeof n.auth?.login==`function`?`auth.login`:`login`,i=e instanceof Error?e:Error(String(e));throw logger.error(`Extension ${r} ${t} failed: ${i.message}`),i.stack&&logger.debug(i.stack),i}},logoutWithExtension=async e=>{let t=getCompatibleExtensionExports(e),n=getExtensionName(e);try{if(typeof t.auth?.logout==`function`){await t.auth.logout();return}typeof t.logout==`function`&&await t.logout()}catch(e){let r=typeof t.auth?.logout==`function`?`auth.logout`:`logout`,i=e instanceof Error?e:Error(String(e));throw logger.error(`Extension ${n} ${r} failed: ${i.message}`),i.stack&&logger.debug(i.stack),i}},runBeforeDownloadHook=async e=>{let t=getCompatibleExtensionExports(e);typeof t.hooks?.beforeDownload==`function`&&await t.hooks.beforeDownload()},runAfterDownloadHook=async(e,{skipMux:t=!1}={})=>{let n=getCompatibleExtensionExports(e),r=getExtensionName(e);if(!t&&typeof n.hooks?.afterMux==`function`)try{await n.hooks.afterMux()}catch(e){let t=e instanceof Error?e:Error(String(e));logger.error(`Extension ${r} hooks.afterMux failed: ${t.message}`),t.stack&&logger.debug(t.stack)}if(typeof n.onDownloadFinished==`function`)try{await n.onDownloadFinished()}catch(e){let t=e instanceof Error?e:Error(String(e));logger.error(`Extension ${r} onDownloadFinished failed: ${t.message}`),t.stack&&logger.debug(t.stack)}},loadExtension=async(e,{context:t,dirname:n,skipValidation:r})=>{let i=await load(e,{dirname:n,context:t}).finally(()=>{});if(!i)return null;let a=`default`in i.exports?i.exports.default:i.exports;if(!r&&!isSupportedExtensionExports(a))throw logger.error(`Incompatible extension interface`),createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Incompatible extension interface`,{extensionPath:e});return i.exports=a,i},sanitizeExtensionName=e=>e.split(`/`).reverse()[0].replaceAll(`@`,``).replace(`extension-`,``).replace(`-extension`,``),readExtensionInfo=async e=>{let t=[join(e,`package.json`),join(e,`package`,`package.json`)],n;for(let e of t)if(await exists(e)){n=e;break}let r={},i=``,a=``,o=``;if(n){let e=dirname(n);r=__require(n)||{},i=join(e,r.main||`index.js`),a=r.name,o=e}else{let t=await ls(e),n=t.find(e=>e.name===`index.js`)||t.find(e=>e.name===`main.js`)||t.find(e=>e.name===`service.js`)||t.find(e=>e.name===`extension.js`)||t.find(e=>e.name.endsWith(`.js`));n&&(i=join(e,n.name),a=parse(i).name)}if(!i)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Extension main script not found: ${e}`,{dir:e});return o||=dirname(i),{name:sanitizeExtensionName(a),path:i,dir:o,package:r}},importExtension=async(e,t)=>{try{let n=await readExtensionInfo(e),r=n.package?.config?.title||n.name,i=createContext({name:n.name,title:r,dir:EXTENSIONS_DATA_DIR});await i.cookieStore.import(join(EXTENSIONS_DATA_DIR,n.name,`cookies.txt`));let a=await loadExtension(n.path,{context:i,dirname:n.dir});if(!a)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Failed to load extension script: ${n.path}`,{source:t,dir:e,path:n.path});return{source:t,exports:a.exports,context:i,...n}}catch(e){throw logger.error(`Error importing module: ${e.message}`),logger.debug(e instanceof Error?e.stack||e.message:String(e)),e}},PRIMARY_API_URL=VITE_API_URL;let apiBaseUrl=PRIMARY_API_URL;const normalizeBase=e=>e.replace(/\/+$/,``),getApiBaseUrl=()=>normalizeBase(apiBaseUrl),joinUrl=(e,t)=>{let n=normalizeBase(e);return t?`${n}/${t.startsWith(`/`)?t.slice(1):t}`:n},getApiUrl=e=>joinUrl(getApiBaseUrl(),e);let publicKey=null;async function verifyResponse(e){if(!publicKey){logger.debug(`Public key not found`);let e=await fetchPublicKey();if(e)logger.debug(`Public key found: ${e.slice(0,50)}...`);else return logger.error(`Public key not found in response`),!1;if(publicKey=await importPublicKey(e).catch(()=>null),!publicKey)return logger.error(`Public key import failed`),!1}let t=e.headers.get(`X-Signature-Timestamp`),n=e.headers.get(`X-Signature`);if(!t||!n)return logger.error(`Signature headers not found`),!1;if(Date.now()-parseInt(t)>3e5)return!1;let r=`${t}:${await e.clone().text()}`,i=base64ToArrayBuffer(n),a=new TextEncoder,o=crypto.subtle.verify({name:`ECDSA`,hash:`SHA-256`},publicKey,i,a.encode(r));return o||(publicKey=null),o}const getPublicKeyFromEnv=()=>atob(VITE_PUBLIC_KEY);async function fetchPublicKey(e=`/auth/.well-known/public-key`){try{let t=await fetch(`${getApiBaseUrl()}${e}`);return t.ok?await t.text():getPublicKeyFromEnv()}catch(e){return logger.error(e.message),getPublicKeyFromEnv()}}async function importPublicKey(e){let t=base64ToArrayBuffer(e.replace(`-----BEGIN PUBLIC KEY-----`,``).replace(`-----END PUBLIC KEY-----`,``).trim());return crypto.subtle.importKey(`spki`,t,{name:`ECDSA`,namedCurve:`P-256`},!0,[`verify`])}function base64ToArrayBuffer(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n.buffer}const createClient$1=e=>createAuthClient({baseURL:`${e}/auth`,plugins:[deviceAuthorizationClient(),tributeClient()],fetchOptions:{retry:0,onSuccess:e=>{let t=e.response.headers.get(`set-auth-token`);t&&(authState.accessToken=t,saveAuth(authState))},auth:{type:`Bearer`,token:()=>authState.accessToken||loadAuth().then(e=>e?.accessToken)},onResponse:async e=>await verifyResponse(e.response).catch(()=>!1)?(logger.debug(`Response verified: ${e.response.url}`),e):(logger.error(`Response verification failed: ${e.response.status} ${e.response.statusText} ${e.response.url}`),errors.emit(`error`,{code:`SIGNATURE_VERIFICATION_FAILED`}),new Response(JSON.stringify({error:`SIGNATURE_VERIFICATION_FAILED`,message:`Signature verification failed`}),{status:401,statusText:`Unauthorized`}))}});let authClientBaseUrl=``,authClient=createClient$1(getApiBaseUrl());const getAuthClient=()=>{let e=getApiBaseUrl();return(!authClient||authClientBaseUrl!==e)&&(authClientBaseUrl=e,authClient=createClient$1(e)),authClient},getJson=async(e,t,n={})=>{let{signal:r,timeoutMs:i=1e4}=n,a=new AbortController,o=()=>a.abort(r?.reason);r?.addEventListener(`abort`,o,{once:!0});let s=!1,c=setTimeout(()=>{s=!0,a.abort(Error(`Request timeout`))},i);try{let n=await fetch(e,{...t,signal:a.signal});if(!n.ok)throw Error(`Request failed: ${n.status}`);return n.json()}catch(e){throw s&&e instanceof DOMException&&e.name===`AbortError`?Error(`Request timed out after ${i}ms`,{cause:e}):e}finally{clearTimeout(c),r?.removeEventListener(`abort`,o)}},backendApi={getExtensions:(e,t)=>getJson(getApiUrl(`extensions`),{headers:e?{Authorization:`Bearer ${e}`}:void 0},{signal:t}),getSubscriptions:(e,t)=>getJson(getApiUrl(`subscriptions`),{headers:{Authorization:`Bearer ${e}`}},{signal:t})},STALE_TIME=300*1e3,GC_TIME=300*1e3,queryClient=new QueryClient({queryCache:new QueryCache,defaultOptions:{queries:{staleTime:STALE_TIME,gcTime:GC_TIME}}}),cache={get:e=>queryClient.getQueryData(e),set:(e,t)=>queryClient.setQueryData(e,t),reset:e=>{e?queryClient.removeQueries({queryKey:e}):queryClient.clear()},invalidate:e=>queryClient.invalidateQueries({queryKey:e}),refresh:async(e,t)=>(queryClient.invalidateQueries({queryKey:e}),useQuery({queryKey:e,queryFn:t}))},useQuery=async({queryKey:e,queryFn:t,staleTime:n,enabled:r=!0})=>{try{let i=queryClient.getQueryState(e),a=i?i?.isInvalidated||!i?.dataUpdatedAt&&!i?.errorUpdatedAt||Date.now()-i.dataUpdatedAt>(n??STALE_TIME):!0,o=()=>cache.reset(e),s=()=>cache.invalidate(e),c=()=>cache.refresh(e,t);return r?i&&!a?{data:i.data,reset:o,invalidate:s,refresh:c}:{data:await queryClient.fetchQuery({queryKey:e,queryFn:t,staleTime:n}),reset:o,invalidate:s,refresh:c}:{data:null,reset:o,invalidate:s,refresh:c}}catch(t){throw queryClient.removeQueries({queryKey:e}),t}},sessionStorage=new FileStorage(join(APP_DATA_DIR,`session.json`)),authState={accessToken:``,tokenType:``,scope:``,createdAt:``},saveAuth=async e=>{sessionStorage.setItem(`access_token`,e.access_token),sessionStorage.setItem(`token_type`,e.token_type||`Bearer`),sessionStorage.setItem(`scope`,e.scope),sessionStorage.setItem(`created_at`,new Date().toISOString()),authState.accessToken=e.access_token,authState.tokenType=e.token_type||`Bearer`,authState.scope=e.scope,authState.createdAt=new Date().toISOString()},loadAuth=async()=>{let e=sessionStorage.getItem(`access_token`),t=sessionStorage.getItem(`token_type`),n=sessionStorage.getItem(`scope`),r=sessionStorage.getItem(`created_at`);return!e||!t||!n||!r?null:{accessToken:e,tokenType:t,scope:n,createdAt:new Date(r)}},getAuth=async()=>{let e=await useQuery({queryKey:[`session`,getApiBaseUrl()],queryFn:()=>getAuthClient().getSession()});return{session:e.data?.data?.session,user:e.data?.data?.user,error:e.data?.error}},getSubscriptions=async()=>{let{user:e,error:t}=await getAuth(),n=await useQuery({queryKey:[`subscriptions`,getApiBaseUrl()],queryFn:async()=>getAuthClient().subscription.list(),enabled:!!e?.id});return{data:n.data?.data,error:n.data?.error??t}},basicBenefits=[`lowConnectionsCount`,`oneDevice`],plusBenefits=[`mediumConnectionsCount`,`twoDevices`,`proxy`,`decryption`,`customIcon`,`tags`,`parallelDownloads`,`userExtensions`,`portableBuild`],proBenefits=[`highConnectionsCount`,`threeDevices`,`customMuxFormat`,`customDecrypter`,`customDrmClient`,`premiumExtensions`],benefits={basic:basicBenefits,plus:plusBenefits,pro:[...basicBenefits,...plusBenefits,...proBenefits]},getUserSubscriptions=()=>useQuery({queryKey:[`lava-subscriptions`,getApiBaseUrl()],queryFn:async()=>{let e=authState.accessToken||(await loadAuth())?.accessToken;return e?backendApi.getSubscriptions(e):[]}}),getUserPlan=async()=>{let e=await getSubscriptions();return{plan:(await getUserSubscriptions()).data?.[0]?.productTitle||e.data?.find(e=>new Date(e.expiresAt)>new Date)?.tributeSubscriptionName,error:e.error}},getCustomerState=async()=>{let{user:e,session:t}=await getAuth(),{plan:n,error:r}=await getUserPlan();return{user:e,session:t,error:r,plan:n,grantedBenefits:n?benefits[n.toLowerCase()]??[]:[]}};var require_builtins=__commonJSMin(((e,t)=>{t.exports={instagram:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h={Referer:`https://www.instagram.com/`},g={"X-IG-App-ID":`936619743392459`,"User-Agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36`},_=async e=>{let t=new URLSearchParams({doc_id:`8845758582119845`,variables:JSON.stringify({shortcode:e,child_comment_count:3,fetch_comment_count:40,parent_comment_count:24,has_threaded_comments:!0})});try{let e=await n(`https://www.instagram.com/graphql/query/?${t.toString()}`,{headers:g});return e.ok?(await e.json()).data?.xdt_shortcode_media??null:(a.error(`GraphQL request failed with status: ${e.status}`),null)}catch(e){return a.error(`Error during GraphQL fetch:`,e),null}},v=async e=>{try{let t=await n(`https://www.instagram.com/p/${e}/embed/captioned/`,{headers:{"User-Agent":g[`User-Agent`]}});if(!t.ok)return null;let r=(await t.text()).match(/window\.__additionalDataLoaded\('extra',\s*({.+?})\s*\);/);return r?.[1]?JSON.parse(r[1]).shortcode_media??null:null}catch(e){return a.error(`Error during embed page fetch:`,e),null}},y=e=>{let t=e.edge_media_to_caption?.edges?.[0]?.node?.text||`Instagram Post`,n=[],r=e=>{if(!e)return;let r=e.is_video&&e.video_url?e.video_url:e.display_url;r&&n.push({title:t,input:new p({source:new m(r,{requestInit:{headers:h}})})})},i=e.edge_sidecar_to_children?.edges;if(i?.length)for(let e of i)r(e.node);else r(e);return n};t.exports=f({canHandle:e=>{try{let t=new URL(e).hostname.toLowerCase();return t===`instagram.com`||t.endsWith(`.instagram.com`)}catch{return!1}},async resolveEntries(e){let t=new URLPattern({pathname:`/:type(p|reel|tv|reels|videos)/:shortcode{/*}?`,baseURL:new URL(e).origin}).exec(e)?.pathname.groups.shortcode;if(!t)return a.error(`Could not extract a valid Instagram shortcode from the URL`),a.debug(e),[];try{let e=await _(t);return e||=(a.warn(`GraphQL method failed. Falling back to embed page scraping.`),await v(t)),e?y(e):(a.error(`All extraction methods failed. The post may be private, deleted, or require a login.`),[])}catch(e){return a.error(`A critical error occurred while fetching Instagram metadata:`,e),[]}}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/41/91/13/419113d2-6246-c557-669e-0f0a5c62bcc5/Prod-0-0-1x_U007epad-0-1-0-sRGB-85-220.png/460x0w.webp`,title:`Instagram`,name:`Instagram`},pkg:{name:`instagram`,version:`0.0.1`,private:!0,keywords:[`social-networks`],homepage:`https://instagram.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`instagram.ts`,config:{icon:`https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/41/91/13/419113d2-6246-c557-669e-0f0a5c62bcc5/Prod-0-0-1x_U007epad-0-1-0-sRGB-85-220.png/460x0w.webp`,title:`Instagram`}}},ntv:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h=(e,t,n)=>e.split(t)[1]?.split(n)[0],g=(e,t)=>{let n=h(e,`<${t}>`,`</${t}>`)?.trim();if(!n)return;let r=n.match(/<!\[CDATA\[(.*?)\]\]>/s);return r?.[1]?r[1].trim():n.split(`DATA[`)[1]?.split(`]`)[0]?.trim()||n},_=async(e,t)=>{let r=await n(e);return r.ok?await r.text():(a.error(`Failed to fetch ${t}. Status: ${r.status} ${r.statusText}`),null)},v=async(e,t,n)=>{let r=new URL(e).pathname,i=new Set;for(let n of t.split(`href="/serial`)){if(!n.startsWith(`/`))continue;let t=n.split(`"`)[0];!t||t.length<=1||t.includes(`/issues/`)||t.includes(`/about/`)||t.split(`/`).length<=2||i.add(e.replace(r,`/serial${t}`))}let a=[];for(let e of i)a.push(...await y(e,n));return a},y=async(e,t=new Set)=>{if(t.has(e))return[];t.add(e);let n=await _(e,`NTV page`);if(!n)return[];let r=h(n,`<meta property="ya:ovs:feed_url" content="`,`">`)??h(n,`<meta property="ya:ovs:feed_url" content="`,`" />`);if(!r)return new URL(e).pathname.includes(`/serial`)?v(e,n,t):(a.error(`Could not find video link in the page.`),[]);let i=r.split(`video/`)[1]?.split(`/`)[0];if(!i)return a.error(`Could not parse NTV video id.`),[];let o=await _(`https://www.ntv.ru/vi${i}/`,`NTV XML metadata`);if(!o)return[];let s=g(o,`dash`)||g(o,`hls`),c=g(o,`file`)||g(o,`video`),l=g(o,`hifile`)||g(o,`hd_video`)||s||c;if(!l)return a.error(`Could not resolve NTV media URL.`),[];let u=h(o,`<embed_tag>`,`</embed_tag>`)||`NTV`,d=h(n,`"name":"`,`"`),f=d?.includes(`серия`)?d.split(`-`)[0]:void 0,y=f?parseInt(f,10):void 0,b=h(o,`<subtitles>`,`</subtitles>`),x=b?`https://www.ntv.ru${b}`:void 0;x&&a.debug(`Subtitles: ${x}`);let S=new p({source:new m(l)});return x&&S.addSubtitleTrack(new m(x),{languageCode:`ru`,name:`Russian`}),[{type:y?`episode`:`video`,title:u,season:y?1:void 0,episode:y,input:S}]};t.exports=f({resolveEntries(e){return y(e,new Set)}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.ntv.ru/static/images/logo.png`,title:`НТВ`,name:`НТВ`},pkg:{name:`ntv`,version:`0.0.9`,private:!0,keywords:[`tv-channels`],homepage:`https://www.ntv.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`ntv.ts`,config:{icon:`https://static.ntv.ru/static/images/logo.png`,title:`НТВ`}}},rbc:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({async resolveEntries(e){let t=await n(e);if(!t.ok)throw Error(`Failed to fetch RBC page: ${t.status} ${t.statusText}`);let r=(await t.text()).match(/(?:https?:)?\/\/[^\s"'<>]+\.m3u8(?:\?[^\s"'<>]*)?/i)?.[0];if(!r)throw Error(`Could not find RBC playlist URL.`);return[{type:`video`,input:new p({source:new m(r.startsWith(`//`)?`https:${r}`:r)})}]}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.rustore.ru/imgproxy/A-G-s2Q1x2iqq3qHCAo66-nllrtlqEr7XNU_JKXt4mQ/preset:web_app_icon_160/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS80MGViMWY3MS1kMDkzLTQ2NDMtOTkyNi0xZWM0ZjkwNzViMTQ=.webp`,title:`РБК`,name:`РБК`},pkg:{name:`rbc`,version:`0.0.2`,private:!0,keywords:[`news`],homepage:`https://rbc.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`rbc.ts`,config:{icon:`https://static.rustore.ru/imgproxy/A-G-s2Q1x2iqq3qHCAo66-nllrtlqEr7XNU_JKXt4mQ/preset:web_app_icon_160/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS80MGViMWY3MS1kMDkzLTQ2NDMtOTkyNi0xZWM0ZjkwNzViMTQ=.webp`,title:`РБК`}}},rutube:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h=[`/video/:id{/}?`,`/play/embed/:id{/}?`,`/shorts/:id{/}?`,`/yappy/:yappyId{/}?`,`/video/private/:id{/}?`],g=e=>{let t={yappyId:``,id:``,key:``};t.key=new URL(e).searchParams.get(`p`)??``;for(let n of h){let r=new URLPattern(n,`https://rutube.ru`).exec(e);r&&(Object.assign(t,r.pathname.groups),Object.assign(t,r.search.groups))}return t},_=async e=>{let t=(await n(`https://rutube.ru/pangolin/api/web/yappy/yappypage/?client=wdp&videoId=${e}&page=1&page_size=15`).then(e=>e.json()).catch(()=>null))?.results?.find(t=>String(t.id)===e)?.link;return t?[{type:`video`,title:`rutube_yappy_${e}`,input:new p({source:new m(t)})}]:(a.error(`ErrorEmptyDownload`),[])};t.exports=f({async resolveEntries(e){let t=g(e);if(t.yappyId)return _(t.yappyId);if(!t.id)return a.error(`Could not extract Rutube video id`),[];let r=new URL(`https://rutube.ru/api/play/options/${t.id}/?no_404=true&referer&pver=v2`);t.key&&r.searchParams.set(`p`,t.key);let i=await n(r).then(e=>e.json()).catch(e=>(e instanceof Error&&a.debug(e.message),null));return i?i.detail||!i.video_balancer?.m3u8?(a.error(`Play info is empty`),[]):i.live_streams?.hls?(a.error(`Live videos are not supported`),[]):[{type:`video`,title:i.title?.trim()||`rutube_${t.id}`,input:new p({source:new m(i.video_balancer.m3u8)})}]:(a.error(`Cannot fetch play info`),[])}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.rustore.ru/imgproxy/vcyBc0LG-3ybXcGs_-_OJXH9ULjoegHlLs-DacemG08/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjQ2MjA3L2NvbnRlbnQvSUNPTi9hNTZhZWJlMy01NjVhLTRiZjYtOTQyZC0xZjE0OTk0YjlhNmUucG5n.webp`,title:`RUTUBE`,name:`RUTUBE`},pkg:{name:`rutube`,version:`0.0.13`,private:!0,keywords:[`video-hostings`],homepage:`https://rutube.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`rutube.ts`,config:{icon:`https://static.rustore.ru/imgproxy/vcyBc0LG-3ybXcGs_-_OJXH9ULjoegHlLs-DacemG08/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjQ2MjA3L2NvbnRlbnQvSUNPTi9hNTZhZWJlMy01NjVhLTRiZjYtOTQyZC0xZjE0OTk0YjlhNmUucG5n.webp`,title:`RUTUBE`}}},soundcloud:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask;let p=d.utils,m=d.Input,h=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let g={version:``,id:``},_=async()=>{try{let e=await n(`https://soundcloud.com/`).then(e=>e.text()).catch(e=>{let t=e instanceof Error&&e.cause!=null?String(e.cause):``;return e instanceof Error&&t.includes(`ECONNRESET`)&&a.warn(`Soundcloud may be blocked in your region. Use proxy or VPN to bypass restrictions.`),``}),t=e.match(/window\.__sc_version="([0-9]{10})"/)?.[1];if(t&&g.version===t)return g.id;let r=``;for(let t of e.matchAll(/<script.+src="(.+)">/g)){let e=t[1];if(!e?.startsWith(`https://a-v2.sndcdn.com/`))continue;let i=(await n(e).then(e=>e.text()).catch(()=>``)).match(/\("client_id=[A-Za-z0-9]{32}"\)/)?.[0].match(/[A-Za-z0-9]{32}/)?.[0];if(i){r=i;break}}return t&&(g.version=t,g.id=r),r}catch{return``}},v=e=>e.audioCodecs?.some(e=>e===`aac`||e===`mp3`)??!1;t.exports=f({async resolveEntries(e,t){let{author:r,song:i,accessKey:a,shortLink:o}=p.execUrlPatterns(e,[`:author/:song/s-:accessKey`,`:author/:song`,`:shortLink`],[`https://soundcloud.com`,`https://on.soundcloud.com`]).pathname,s=await _();if(!s)throw Error(`No client ID`);let c;if(new URL(e).hostname===`on.soundcloud.com`&&o&&(c=await n(`https://on.soundcloud.com/${o}/`,{redirect:`manual`}).then(e=>{let t=e.headers.get(`location`);if(e.status===302&&t?.startsWith(`https://soundcloud.com/`))return t.split(`?`,1)[0]}).catch(()=>void 0)),!c&&r&&i&&(c=`https://soundcloud.com/${r}/${i}${a?`/s-${a}`:``}`),!c)throw Error(`Could not fetch`);let l=await n(`https://api-v2.soundcloud.com/resolve?url=${c}&client_id=${s}`).then(e=>e.status===200?e.json():null).catch(()=>null);if(!l)throw Error(`Could not fetch`);let u=l.media?.transcodings;if(!u?.length)throw Error(`Empty download`);let d=u.find(e=>e.preset===`opus_0_0`),f=u.find(e=>e.preset===`mp3_0_0`);if(f&&(v(t)||!d)&&(d=f),!d)throw Error(`Empty download`);let g=`${d.url}${d.url.includes(`?`)?`&`:`?`}client_id=${s}&track_authorization=${l.track_authorization}`;if(!g.startsWith(`https://api-v2.soundcloud.com/media/soundcloud:tracks:`))throw Error(`Empty download`);let y=await n(g).then(async e=>(await e.json()).url??``).catch(()=>``);if(!y)throw Error(`Could not fetch`);return[{type:`audio`,title:l.title.trim(),author:l.user.username.trim(),input:new m({source:new h(y)})}]}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://play-lh.googleusercontent.com/JSSeB3XQtb9sHD5FWTqVM4AksY_Kg2q20eExenxGqPJZdn2uVQxi8eoHkP5MA-IR4w=w480-h960-rw`,title:`SoundCloud`,name:`SoundCloud`},pkg:{name:`soundcloud`,version:`0.0.6`,private:!0,keywords:[`music`],homepage:`https://soundcloud.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`soundcloud.ts`,config:{icon:`https://play-lh.googleusercontent.com/JSSeB3XQtb9sHD5FWTqVM4AksY_Kg2q20eExenxGqPJZdn2uVQxi8eoHkP5MA-IR4w=w480-h960-rw`,title:`SoundCloud`}}},tiktok:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({canHandle:e=>{try{let t=new URL(e).hostname.toLowerCase();return t===`tiktok.com`||t.endsWith(`.tiktok.com`)}catch{return!1}},async resolveEntries(e){let t=await n(e);if(!t.ok)return a.error(`Failed to fetch TikTok page. Status: ${t.status}`),[];let r=(await t.text()).split(`<script id="__UNIVERSAL_DATA_FOR_REHYDRATION__" type="application/json">`)[1]?.split(`<\/script>`)[0];if(!r)return a.error(`Could not find target script tag. TikTok might have updated their page structure.`),[];let i;try{i=JSON.parse(r)}catch(t){return a.error(`Failed to parse TikTok page JSON`,t,{url:e}),[]}let o=i.__DEFAULT_SCOPE__?.[`webapp.video-detail`],s=o?.itemInfo?.itemStruct;if(!s)return a.error(`Could not find video data in the JSON payload. The content might be unavailable or the structure has changed.`),o?.statusMsg&&a.error(`Error ${o.statusCode}: ${o.statusMsg}`),[];let l=s.video?.playAddr;return l?[{type:`video`,title:s.desc||`TikTok Video`,input:new p({source:new m(l,{requestInit:{headers:{Referer:`https://www.tiktok.com/`,Cookie:c.cookie}}})})}]:(a.error(`Could not find a video URL (playAddr) in the JSON payload.`),[])}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{name:`TikTok`,tag:`TT`,icon:`https://play-lh.googleusercontent.com/LdBITldj-tJxqLm-CsWSbnt4BMo2gk53cgM7mWIL-zn44m1ywLyQgxRsHKqp8r0qceXs=w480-h960-rw`,permissions:[],matches:[`https://*.tiktok.com/*`],manifestVersion:1,title:`TikTok`},pkg:{name:`tiktok`,version:`0.0.2`,private:!0,keywords:[`social-networks`],homepage:`https://www.tiktok.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`tiktok.ts`,config:{name:`TikTok`,tag:`TT`,icon:`https://play-lh.googleusercontent.com/LdBITldj-tJxqLm-CsWSbnt4BMo2gk53cgM7mWIL-zn44m1ywLyQgxRsHKqp8r0qceXs=w480-h960-rw`,permissions:[],matches:[`https://*.tiktok.com/*`],manifestVersion:1,title:`TikTok`}}},virtualroom:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({async resolveEntries(e){let t=new URL(e).searchParams.get(`recordId`);if(!t)return a.error(`Could not extract VirtualRoom recordId.`),[];let r=await n(`https://mv1.virtualroom.ru/vr/player/records/${t}/info`).then(e=>e.ok?e.json():null).catch(()=>null),i=await n(`https://mv1.virtualroom.ru/vr/player/records/${t}/events`).then(e=>e.ok?e.json():null).catch(()=>null),o=r?.data?.roomParameters?.name??`VirtualRoom`;return(i?.data?.translations??[]).filter(e=>!!e.url).map(e=>({title:[o,e.type,e.source,e.start].filter(Boolean).join(` `),input:new p({source:new m(e.url)})}))}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://sun9-50.userapi.com/impg/rY5N7sdA93TFdjkeYqPTnPIjvCJ0rALo_V7V8g/zLAaAv0PpvY.jpg?size=400x400&quality=95&sign=5ddcd6358131b204b8619cb8eeff943f&type=album`,title:`VirtualRoom`,name:`VirtualRoom`},pkg:{name:`virtualroom`,version:`0.0.7`,private:!0,keywords:[`videotelephony`],homepage:`https://virtualroom.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`virtualroom.ts`,config:{icon:`https://sun9-50.userapi.com/impg/rY5N7sdA93TFdjkeYqPTnPIjvCJ0rALo_V7V8g/zLAaAv0PpvY.jpg?size=400x400&quality=95&sign=5ddcd6358131b204b8619cb8eeff943f&type=album`,title:`VirtualRoom`}}},vk:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask,d.utils;let p=d.Input,m=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3;let h=[`2160`,`1440`,`1080`,`720`,`480`,`360`,`240`,`144`],g=e=>{let t=e.match(/video-(\d+)_(\d+)/);return t?{ownerId:t[1],videoId:t[2]}:null},_=e=>{if(!e)return null;for(let t of e)if(Array.isArray(t)){for(let e of t)if(e&&typeof e==`object`&&`player`in e)return e}return null},v=(e,t)=>{let n=t.videoQuality?.replace(`p`,``).trim(),r=h.filter(t=>!!e[`url${t}`]);return r.length?n&&r.includes(n)?n:r[0]:null};t.exports=f({async resolveEntries(e,t){let r=g(e);if(!r)return a.error(`Could not extract VK video identifiers`),[];let i=await n(`https://vkvideo.ru/al_video.php?act=show`,{method:`POST`,headers:{"content-type":`application/x-www-form-urlencoded; charset=utf-8`,accept:`*/*`,"accept-language":`ru-RU,ru;q=0.9`,"sec-ch-ua":`"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"`,"sec-ch-ua-mobile":`?0`,"sec-ch-ua-platform":`"macOS"`,"sec-fetch-dest":`empty`,"sec-fetch-mode":`cors`,"sec-fetch-site":`same-origin`,"x-requested-with":`XMLHttpRequest`,Referer:e,"Referrer-Policy":`strict-origin-when-cross-origin`},body:new URLSearchParams({al:`1`,autoplay:`1`,claim:``,force_no_repeat:`true`,is_video_page:`true`,list:``,module:`direct`,t:``,video:`-${r.ownerId}_${r.videoId}`}).toString()});if(!i.ok)throw Error(`VK request failed: ${i.status} ${i.statusText}`);let o=_((await i.json()).payload),s=o?.player?.params,l=s&&s.length>0?s[0]:void 0;if(!o||!l)return a.error(`Could not find VK player payload`),[];if(o.mvData?.is_active_live===1||o.mvData?.is_active_live===`1`)return a.error(`Live videos are not supported`),[];let u=v(l,t),d=u?l[`url${u}`]:void 0,f=l.dash_sep||d;return f?[{type:`video`,title:[l.md_title?.trim(),l.md_author?.trim()].filter(Boolean).join(` `),input:new p({source:new m(f,{requestInit:{headers:{Referer:e,Cookie:c.cookie}}})})}]:(a.error(`Could not find video URL`),[])}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://static.rustore.ru/imgproxy/kSjDiz_MKxD_jzwgEqqaIjQZTE-NEP1Xt8HtJT7EU4s/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjAyNzgyMzI5NS9jb250ZW50L0lDT04vOTc0ODYwMTgtNTc4NS00MjRkLTljYWItNGZlNDk2ZDI3Yzc2LnBuZw==.webp`,title:`VK`,name:`VK`},pkg:{name:`vk`,version:`0.0.8`,private:!0,keywords:[`video-hostings`],homepage:`https://vkvideo.ru/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`vk.ts`,config:{icon:`https://static.rustore.ru/imgproxy/kSjDiz_MKxD_jzwgEqqaIjQZTE-NEP1Xt8HtJT7EU4s/preset:app_card_icon/aHR0cHM6Ly9zdGF0aWMucnVzdG9yZS5ydS9hcGsvMjAyNzgyMzI5NS9jb250ZW50L0lDT04vOTc0ODYwMTgtNTc4NS00MjRkLTljYWItNGZlNDk2ZDI3Yzc2LnBuZw==.webp`,title:`VK`}}},weibo:{create:e=>{let t={exports:{}};return((e,n,r,i,a,o,s,c,l,u)=>{let d=e??Streamyx??{};d&&(d.defineExtension||=e=>e);let f=d.defineExtension;d.version,d.sleep,d.input,d.prompt,d.notify,d.confirm,d.ask;let p=d.utils,m=d.Input,h=d.UrlSource;d.ALL_FORMATS,d.DASH,d.DASH_FORMATS,d.HLS,d.HLS_FORMATS,d.MP4,d.MP3,t.exports=f({async resolveEntries(e){let t=p.execUrlPatterns(e,[`/:userId(\\d+)/:bid`,`/detail/:mid`],[`https://weibo.com/`,`https://m.weibo.cn`]),r=t.pathname.bid||t.pathname.mid;if(!r)return[];let i=await n(`https://m.weibo.cn/statuses/show?id=${r}`,{credentials:`include`,referrer:`https://m.weibo.cn/status/${t.pathname.bid??r}?jumpfrom=weibocom`,method:`GET`,mode:`cors`}).then(e=>e.json()).catch(()=>null);if(!i?.data)return a.error(`Could not resolve Weibo post metadata`),[];let o=[],s=i.data.pics,c=i.data.page_info;if(s?.length)for(let e of s.filter(e=>e.type===`video`||e.type===`livephoto`))e.videoSrc&&o.push({type:`video`,title:e.pid,input:new m({source:new h(e.videoSrc)})});else if(c?.type===`video`){let e=Object.values(c.urls??{})[0],t=c.media_info?.stream_url_hd||c.media_info?.stream_url,n=e||t;n&&o.push({type:`video`,title:c.title||c.page_title,input:new m({source:new h(n)})})}return o}})})(e.Azot,e.fetch,e.localStorage,e.cookieStore,e.console,e.prompt,e.alert,e.document,e.navigator,e.window),t.exports.default||t.exports},manifest:{icon:`https://play-lh.googleusercontent.com/TTKq2trnzgtoyM0jc1pyrrmXtA_Yd3A2hxubZtDahdZStYf4GPANZa-wjDb1ELHrGqh_=w480-h960-rw`,title:`Weibo`,name:`Weibo`},pkg:{name:`weibo`,version:`0.0.6`,private:!0,keywords:[`social-networks`],homepage:`https://weibo.com/`,author:{name:`Azot`,url:`https://azot.mov/`},contributors:[{name:`Vitaly Gashkov`,email:`vitalygashkov@vk.com`,url:`https://github.com/vitalygashkov`}],type:`module`,main:`weibo.ts`,config:{icon:`https://play-lh.googleusercontent.com/TTKq2trnzgtoyM0jc1pyrrmXtA_Yd3A2hxubZtDahdZStYf4GPANZa-wjDb1ELHrGqh_=w480-h960-rw`,title:`Weibo`}}}}})),import_builtins=__toESM(require_builtins(),1);const extractExtensionInfo=e=>({name:e.name,source:e.source,dir:e.dir,path:e.path,package:e.package,installedAt:e.installedAt||new Date().toISOString()});var ExtensionManager=class ExtensionManager extends EventEmitter$1{extensions=new Map;extensionDirs;indexPath;infoList=[];constructor({dirs:e,indexPath:t}={}){super(),this.extensionDirs=e??[process.cwd()],this.indexPath=t??path$1.join(process.cwd(),`index.json`)}async init(){return await this.ensureValidIndexPath(),await this.loadInfo(),this}async loadInfo(){return this.infoList=await readJson(this.indexPath).catch(()=>[]),this.infoList}async saveInfo(){return await this.ensureValidIndexPath(),await writeJson(this.indexPath,this.infoList)}async ensureValidIndexPath(){(await fs$1.stat(this.indexPath).catch(()=>null))?.isDirectory()&&(logger.warn(`Invalid extensions index path repaired: ${this.indexPath}`),await rm$1(this.indexPath),await fs$1.writeFile(this.indexPath,`[]`,`utf8`))}static async getAvailableExtensions(){try{return(await backendApi.getExtensions(authState.accessToken,AbortSignal.timeout(8e3))).data}catch(e){return logger.warn(`Failed to fetch extensions catalog: ${e instanceof Error?e.message:String(e)}`),[]}}async discover(){for(let e of this.extensionDirs){logger.debug(`Loading extensions from ${e}`);let t=await fs$1.readdir(e,{withFileTypes:!0}).catch(()=>[]);for(let n of t)if(n.isDirectory()){let t=path$1.join(e,n.name);if(await fs$1.readdir(t).then(e=>e.filter(e=>!e.startsWith(`.`))).then(e=>!e.length))continue;await this.loadExtension(t)}}for(let e of this.infoList)this.extensionDirs.some(t=>e.dir?.includes(t))||!e.dir||(logger.debug(`Loading dev extension from ${e.dir}`),await this.loadExtension(e.dir))}async#e(scriptPath,context){const code=await fs$1.readFile(scriptPath,`utf8`),{Azot,fetch,console,localStorage,cookieStore,window,document,navigator}=context,module={exports:{}};eval(`(() => {${code}})();`);const exports=module.exports;return{exports,context}}async prepareContext(e,t){let n=createContext({name:e,dir:EXTENSIONS_DATA_DIR,title:t});return await n.cookieStore.import(path$1.join(EXTENSIONS_DATA_DIR,e,`cookies.txt`)),n}async loadScript(e,t){let n=t.name,r=t.config?.title||n,i=await this.prepareContext(n,r),a=await load(e,{dirname:t.dir,context:i});if(a)return a.exports=`default`in a.exports?a.exports.default:a.exports,a}async loadCoreExtensions(){let e=Object.keys(import_builtins.default);logger.debug(`Loading ${e.length} built-in extensions: ${e.join(`, `)}`);for(let e of Object.values(import_builtins.default)){let t=e.pkg.name,n=e.manifest?.name;try{let r=await this.prepareContext(t,n),i={exports:e.create(r),package:e.pkg,context:r};this.validate(i),this.extensions.set(t,i),this.emit(`loaded`,t)}catch(e){logger.debug(e instanceof Error?e.message:String(e)),this.emit(`error`,e,t)}}}async loadExtension(e){try{logger.debug(`Loading extension from ${e}`);let t=await readExtensionInfo(e).catch(e=>logger.error(e));if(!t)return;t.package.dir=t.dir;let n=await this.loadScript(t.path,t.package);if(!n)return;let r={package:t.package,exports:n.exports,context:n.context};this.validate(r),this.extensions.set(t.package.name,r),this.emit(`loaded`,t.package.name)}catch(t){this.emit(`error`,t,e)}}validate(e){if(typeof e!=`object`||!e||!isSupportedExtensionExports(e.exports))throw Error(`Invalid extension interface: ${e.package.name}`)}getExtension(e){return this.extensions.get(e)??Array.from(this.extensions.values()).find(t=>t.package.name===e)??null}async getExtensionForUrl(e){for(let t of this.extensions.values()){let n=null,r=t.exports.canHandle,i=new URL(e).hostname.includes(t.package.name);if(n=typeof r==`function`?await r(e):typeof r==`string`?new URLPattern(r).test(e):i,n)return t}return null}async install(e){let t=await ExtensionManager.getAvailableExtensions(),n=[];for(let r of e){let e=await stat(r).then(e=>e.isDirectory()).catch(()=>!1)?r:await downloadExtension(r,t);if(!e)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.SOURCE_NOT_FOUND,`Extension source not found: ${r}`,{source:r});let i=await importExtension(e,r);if(!i)throw createInstallExtensionError(INSTALL_EXTENSION_ERROR_CODES.IMPORT_INVALID,`Extension import failed: ${r}`,{source:r,dir:e});n.push(i);let a=this.infoList.find(({name:e})=>e===i.name);if(a){let e=a.source;e!==i.source&&await rm$1(e);let t=a.dir?this.#t(a.dir):null,n=i.dir?this.#t(i.dir):null;t&&t!==n&&await rm$1(t),a.installedAt=new Date().toISOString(),Object.assign(a,extractExtensionInfo(i)),logger.info(`Extension ${i.name} updated`)}else this.infoList.push(extractExtensionInfo(i)),logger.info(`Extension ${i.name} added`)}if(await this.saveInfo(),n.length)for(let e of n)this.extensions.set(e.name,e)}#t(e){let t=path$1.parse(e);return t.dir===EXTENSIONS_SOURCES_DIR?e:t.dir}async uninstall(e){for(let t of e){let e=this.infoList.find(e=>e.name===t);if(!e){logger.error(`Extension ${t} not found`);return}let n=e.dir??``,r=n?.includes(EXTENSIONS_SOURCES_DIR);await exists(n)?(r&&await rm$1(this.#t(n)),this.infoList=this.infoList.filter(e=>e.name!==t),logger.info(`Extension ${t} removed`),this.extensions.delete(t)):logger.warn(`Extension ${t} directory not found: ${n}`)}await this.saveInfo()}async importCookies(e,t){let n=this.getExtension(e);if(!n)throw Error(`Extension ${e} not found`);return await n.context.cookieStore.import(t,{removeSource:!1})}async login(e,t={}){let n=this.getExtension(e);n&&await loginWithExtension(n,t)}async logout(e){for(let t of e){let e=this.getExtension(t);if(!e)return;logger.info(`Logging out...`),await logoutWithExtension(e),logger.debug(`Clearing localStorage...`),e.context.localStorage.clear(),logger.debug(`Clearing cookies store...`);let n=await e.context.cookieStore.getAll();for(let t of n)await e.context.cookieStore.delete(t);logger.info(`Logged out from extension ${t}`)}}list(){return Array.from(this.extensions.values()).map(e=>({name:e.package.name,version:e.package.version,description:e.package.description,package:e.package}))}};const mergeExtensionHeadersIntoDrm=(e,t)=>!e||`payload`in e||`keys`in e?e:{...e,headers:{...e.headers,...t?.context.http.headers}},defaultLegacyRequestFilter=async(e,t)=>{if(!t)return e;let n=await e.clone().arrayBuffer(),r=Buffer.from(n).toString(`base64`),i=t.replace(`{{challenge}}`,r);return new Request(e.url,{method:e.method,headers:e.headers,body:i})},defaultLegacyResponseFilter=async e=>{let t=await e.clone().arrayBuffer();if(t[0]===123){let n=null;try{n=JSON.parse(Buffer.from(t).toString(`utf8`))}catch(e){logger.error(`Can't parse license response as JSON`),logger.debug(e.message),logger.debug(`Base64 response data: ${Buffer.from(t).toString(`base64`)}`)}if(!n)return e;try{let n=`CAIS`,r=n+Buffer.from(t).toString(`utf8`).split(`"${n}`)[1].split(`"`)[0],i=Buffer.from(r,`base64`);return new Response(i,{status:e.status,headers:e.headers})}catch{logger.error(`Can't recognize license response`),logger.error(`Response: ${JSON.stringify(n)}`)}}return e},normalizeLegacyMediaInfoList=e=>typeof e==`string`?[{sources:[{url:e}]}]:Array.isArray(e)&&typeof e[0]==`string`?e.map(e=>({sources:[{url:e}]})):Array.isArray(e)?e:e&&typeof e==`object`?[e]:[],normalizeLegacyStreams=e=>e.sources??e.streams??[],resolveLegacyMediaMetadata=(e,t)=>({id:e.id,title:e.title,tag:t.package.config?.tag,seasonNumber:e.seasonNumber??e.season,episodeNumber:e.episodeNumber??e.episode,episodeTitle:e.episodeTitle}),resolveLegacyMediaResources=async(e,t,n)=>{let r=getCompatibleExtensionExports(n);if(typeof r.getMediaInfo==`function`){let i=normalizeLegacyMediaInfoList(await r.getMediaInfo(e,t));if(!i.length)return logger.info(`No metadata found`),[];let a=[];for(let e of i){if(typeof r.refreshMediaInfo==`function`){let n=await r.refreshMediaInfo(e,t);n&&typeof n==`object`&&Object.assign(e,n)}let i=normalizeLegacyStreams(e);for(let t of i){let r=typeof t==`string`?{url:t}:t;a.push({source:{url:r.url,headers:r.headers,drm:r.drm&&!Array.isArray(r.drm)&&typeof r.drm==`object`?{server:r.drm.server}:void 0},metadata:resolveLegacyMediaMetadata(e,n),drm:r.drm&&!Array.isArray(r.drm)&&typeof r.drm==`object`?{server:r.drm.server}:void 0})}}return logger.info(`Fetching metadata finished`),a}let i=await r.fetchContentMetadata?.(e,t);if(!i?.length)return logger.info(`No metadata found`),[];let a=[];for(let e of i){let r={...e},i;if(!r.source&&n.exports.fetchContentSource&&r.id){let e=await n.exports.fetchContentSource(r.id,t);e&&(r.source=e)}if(!r.source?.url){logger.error(`Can't find content source`);continue}r.source.drm&&`payload`in r.source.drm&&n.exports.fetchContentDrm&&(i=r.source.drm.payload,r.source.drm=void 0);let{source:o,...s}=r,c=mergeExtensionHeadersIntoDrm(r.source.drm,n);o.drm=c,o.headers={...o.headers,...n.context.http.headers},n.exports.tag&&(s.tag=n.exports.tag),a.push({source:o,metadata:s,drm:c,drmPayload:i})}return logger.info(`Fetching metadata finished`),a},resolveLegacyMediaResourceDrm=async(e,t,n)=>{if(e.drmPayload&&n?.exports.fetchContentDrm){let r=mergeExtensionHeadersIntoDrm(await n.exports.fetchContentDrm(e.drmPayload,t),n);return e.source.drm=r,e.drm=r,r}let r=mergeExtensionHeadersIntoDrm(e.source.drm??e.drm,n);return e.source.drm=r,e.drm=r,r},createLegacyDrmLicenseResolver=e=>{let t=e.template?defaultLegacyRequestFilter:void 0,n=defaultLegacyResponseFilter,r=new HttpClient;return async({url:i,data:a})=>{let o=new Request(i,{body:Buffer.from(a),method:`POST`,headers:e.headers}),s=await t?.(o,e.template)||o,c=await r.fetch(s.url,{body:await s.arrayBuffer(),headers:s.headers,method:s.method}),l=await n?.(c)||c;return new Uint8Array(await l.arrayBuffer())}},resolvedInputs=new Map,normalizeHeaders=e=>{if(!e)return;let t=Object.fromEntries(new Headers(e).entries());return Object.keys(t).length?t:void 0},serializeMediaEntry=e=>{let{input:t,...n}=e;return n},createEntryCacheKey=(e,t,n)=>createHash(`sha1`).update(JSON.stringify({extension:e.package.name,url:t,id:n.id??null,title:n.title??null,season:n.season??null,episode:n.episode??null})).digest(`hex`),extractInputSource=(e,t)=>{let n=e.source??e._rootSource,r=n?.rootPath;if(typeof r!=`string`||!r)return t??null;let i=n?._url instanceof Request?n._url.headers:void 0,a=n?._options?.requestInit?.headers,o={...normalizeHeaders(i),...normalizeHeaders(a)};return{...t??{},url:r,headers:Object.keys(o).length?o:t?.headers}},createEntryMetadata=(e,t)=>{let n=e.id??e.details?.id;return{id:n==null?void 0:String(n),title:e.title,tag:t.package.config?.tag,seasonNumber:e.season,episodeNumber:e.episode,episodeTitle:e.episodeTitle}},normalizeResolvedResources=e=>e.length?e.length===1?e[0]:e:null,createDirectMediaMetadata=e=>{let t;try{t=new URL(e)}catch{throw Error(`Invalid direct media URL: ${e}`)}let n=t.pathname.replace(/\/+$/,``).split(`/`).filter(Boolean).pop(),r=n?.split(`.`).slice(0,-1).join(`.`)||n||t.hostname||`download`;return{source:{url:e},metadata:{title:r}}},configureExtensionProxy=(e,t)=>{let n=t.proxy||t.proxyMeta;n&&(e.context.http.configure({proxyUrl:n}),httpClient.configure({proxyUrl:n}))},analyzeMediaResource=async(e,t,n)=>{if(!n){logger.warn(`No suitable extension available. Downloading as a direct link...`);let{source:n,metadata:r}=createDirectMediaMetadata(e);return n.audioLanguage=t.languages?.[0],n.http2=t.http2,{source:n,metadata:r}}if(configureExtensionProxy(n,t),await initializeExtension(n),getExtensionApiVersion(n)===`v2`){let r=getCompatibleExtensionExports(n);logger.info(`Resolving media entries...`);let i=await r.resolveEntries(e,t);if(!i?.length)return logger.info(`No metadata found`),null;let a=i.map(t=>{let r=t,i=serializeMediaEntry(t),a=t.input?createEntryCacheKey(n,e,r):void 0;a&&t.input&&resolvedInputs.set(a,t.input);let o=t.input?extractInputSource(t.input):null;return{source:o??{url:e},metadata:createEntryMetadata(i,n),extension:{api:`v2`,entry:i,cacheKey:a,hasResolvedSource:!!o}}});return logger.info(`Resolving media entries finished`),normalizeResolvedResources(a)}return logger.info(`Fetching content metadata...`),normalizeResolvedResources(await resolveLegacyMediaResources(e,t,n))},materializeMediaResource=async({resource:e,url:t,options:n,extension:r})=>{if(!r||!e.extension||e.extension.api!==`v2`||getExtensionApiVersion(r)!==`v2`)return{source:e.source};configureExtensionProxy(r,n),await initializeExtension(r);let i=getCompatibleExtensionExports(r),a=e.extension.entry,o=e.extension.cacheKey?resolvedInputs.get(e.extension.cacheKey):void 0;if(!o&&typeof i.resolveMedia==`function`&&(o=await i.resolveMedia(t,n,a)??void 0,o&&e.extension.cacheKey&&resolvedInputs.set(e.extension.cacheKey,o)),!o){if(e.extension.hasResolvedSource)return{source:e.source,entry:a};throw Error(`Extension ${r.package.name} could not materialize media entry. Provide resolveMedia() or an inline input rooted in UrlSource.`)}return{source:extractInputSource(o,e.source)??e.source,input:o,entry:a}},resolveMediaResourceDrm=async(e,t,n)=>resolveLegacyMediaResourceDrm(e,t,n);var DownloadRunState=class{#e=[];#t=new Set;#n=new Map;#r=new Map;#i=new Set;get activeRunCount(){return this.#r.size}get queuedCount(){return this.#e.length}getActiveRun(e){return this.#r.get(e)}setActiveRun(e,t){this.#r.set(e,t)}deleteActiveRun(e){this.#r.delete(e)}getActiveJob(e){return this.#n.get(e)}setActiveJob(e){this.#n.set(e.id,e)}deleteActiveJob(e){this.#n.delete(e)}queueResumeAfterStop(e){this.#i.add(e)}consumeResumeAfterStop(e){let t=this.#i.has(e);return t&&this.#i.delete(e),t}enqueue(e){this.#t.has(e.id)||this.#r.has(e.id)||(this.#e.push(e.id),this.#t.add(e.id))}dequeue(e){if(!this.#t.has(e))return!1;let t=this.#e.indexOf(e);return t!==-1&&this.#e.splice(t,1),this.#t.delete(e),!0}dequeueNext(e){for(;this.#e.length>0;){let t=this.#e.shift();if(!t)return;this.#t.delete(t);let n=e(t);if(n&&n.status===`queued`)return n}}};const ERROR_DETAIL_KEYS=[`code`,`errno`,`syscall`,`address`,`port`,`host`,`hostname`,`path`,`type`],isResponseLike=e=>typeof e==`object`&&!!e&&`status`in e&&`statusText`in e&&`url`in e,getOwnErrorDetails=e=>{let t=[],n=e;for(let e of ERROR_DETAIL_KEYS){let r=n[e];r==null||r===``||t.push(`${e}=${String(r)}`)}return t},formatErrorDetails=(e,t=0)=>{if(t>3)return`[max-depth]`;if(e instanceof Error){let n=getOwnErrorDetails(e),r=`cause`in e?e.cause:void 0,i=[`${e.name}: ${e.message}`];return n.length&&i.push(`details=${n.join(`, `)}`),r!==void 0&&r!==e&&i.push(`cause=${formatErrorDetails(r,t+1)}`),i.join(` | `)}return isResponseLike(e)?`Response ${e.status} ${e.statusText} url=${e.url}`:inspect(e,{depth:2,breakLength:1/0})},logErrorDetails=(e,t)=>{logger.debug(`${e}: ${formatErrorDetails(t)}`),t instanceof Error&&t.stack&&logger.debug(t.stack)},getTrackDescription=(e,t)=>{let n=`${t} ∙ `;return e.type===`subtitle`?n+=`SUBTITLES`:n+=e.type?.toUpperCase(),e.type===`video`&&(e.width&&(n+=` ∙ ${e.width}x${e.height}`),e.bitrate&&(n+=` ∙ ${Math.round(e.bitrate/1e3)} KiB/s`)),e.type===`audio`&&(e.languageCode&&(n+=` ∙ ${e.languageCode.toUpperCase()}`),e.name&&(n+=` (${e.name})`),e.sampleRate&&(n+=` ∙ ${e.sampleRate} kHz`),e.bitrate&&(n+=` ∙ ${Math.round(e.bitrate/1e3)} KiB/s`)),e.type===`subtitle`&&(e.languageCode&&(n+=` ∙ ${e.languageCode.toUpperCase()}`),e.name&&(n+=` (${e.name})`),e.forced&&(n+=` FORCED`)),n},getTrackId=e=>e.id,findDuplicateTrackIds=e=>{let t=new Map;for(let n of e){let e=getTrackId(n),r=t.get(e);if(r){r.push(n);continue}t.set(e,[n])}return Array.from(t.entries()).filter(([,e])=>e.length>1)},assertUniqueTrackIds=e=>{let t=findDuplicateTrackIds(e);if(!t.length)return;let n=t.map(([e,t])=>`${e} (${t.length} copies)`).join(`, `);throw Object.assign(Error(`Duplicate tracks selected: ${n}`),{code:`DUPLICATE_TRACKS_SELECTED`})},getErrorCode=e=>{if(!e||typeof e!=`object`||!(`code`in e))return;let t=e.code;return typeof t==`string`?t:void 0};var DownloaderError=class extends Error{code;constructor(e,t=e,n){super(t,n),this.name=`DownloaderError`,this.code=e}};const normalizeDownloaderError=(e,t=`DOWNLOAD_FAILED`)=>{if(e instanceof DownloaderError||e instanceof Error&&e.name===`AbortError`)return e;if(e instanceof Error){let n=new DownloaderError(getErrorCode(e)??t,e.message,{cause:e});return e.stack&&(n.stack=e.stack),n}return new DownloaderError(t,typeof e==`string`?e:`Unknown error`)},sanitizeFilename=e=>{let t=e.replace(/[<>:"/\\|?*\x00-\x1F]/g,``);t=t.replace(/^[\s.]+|[\s.]+$/g,``),t=t.replace(/\s+/g,` `);let n=t.lastIndexOf(`.`),r=n>0,i=r?t.slice(n):``,a=r?t.slice(0,n):t;if(i.length>=255)t=t.slice(0,255);else{let e=255-i.length;a.length>e&&(a=a.slice(0,e)),t=a+i}let o=/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$/i;if(i.length<255){let e=t.lastIndexOf(`.`),n=e>0;if(i=n?t.slice(e):``,a=n?t.slice(0,e):t,o.test(a)){let e=255-i.length;t=`_${a}`.slice(0,e)+i}}return t.length===0?`untitled`:t},fillTemplate=(e,t)=>Object.keys(t).reduce((e,n)=>{let r=`{${n}}`,i=t[n];if(!i){let t=RegExp(`(?:\\.|^)\\{${n}\\}(?=\\.|$)|\\{${n}\\}(\\.|$)|\\{${n}\\}`,`g`);return e.replace(t,(e,t)=>``).replaceAll(`....`,`...`)}return e.replaceAll(r,i)},e).replaceAll(` `,` `),resolveContainerFormat=e=>typeof e==`string`&&e.trim()||`mp4`,createDownloadMetadata=e=>{let t=`seasonNumber`in e?`${e.seasonNumber}`:``,n=`episodeNumber`in e?`${e.episodeNumber}`:``,r=t?`S${t}`:``,i=n?`E${n}`:``,a=t&&n?`${r}:${i}`:``,o=`episodeTitle`in e&&e.episodeTitle?.trim()?`"${e.episodeTitle}"`:``;return{title:`${e.title??``} ${a} ${o}`.trim()}},resolveDownloadOutputPlan=({settings:e,options:t,source:n,meta:r,allTracks:i})=>{let a=r.title,o=r.tag,s=`seasonNumber`in r?r.seasonNumber:void 0,c=`episodeNumber`in r?r.episodeNumber:void 0,l=`episodeTitle`in r?r.episodeTitle:``,u=i.find(e=>e.type===`video`)?.codec??``,d=e.get(`downloadDir`),f=t.movieTemplate||e.get(`movieFilenameTemplate`),p=t.episodeTemplate||e.get(`seriesFilenameTemplate`),m=`${sanitizeFilename(fillTemplate(c?p:f,{title:a??``,s:s?s.toString().padStart(2,`0`):``,e:c?c.toString().padStart(2,`0`):``,quality:t.videoQuality??``,codec:u,tag:o??``,episodeTitle:l??``,audioType:n.audioType?n.audioType.toUpperCase():``,format:`WEB-DL`}))}.${resolveContainerFormat(t.format||e.get(`videoContainerFormat`))}`,h=t.outputPath||join(d,m),g=parse(h);return{downloadDir:d,outputPath:h,resolvedFilenameWithoutExtension:g.name,filenameWithExtension:g.base,outputDirectory:g.dir||d,downloadMetadata:createDownloadMetadata(r)}},openFileHandle=async(e,t,n)=>n??open(e,t),createMediabunnyFileSource=e=>{let t=null;return new StreamSource({getSize:async()=>(t=await openFileHandle(e,`r`,t),(await t.stat()).size),read:async(n,r)=>{t=await openFileHandle(e,`r`,t);let i=new Uint8Array(r-n);return await t.read(i,0,r-n,n),i},dispose:async()=>{let e=t;t=null,await e?.close()},prefetchProfile:`fileSystem`})},createMediabunnyFileTarget=e=>{let t=null;return new StreamTarget(new WritableStream({start:async()=>{t=await openFileHandle(e,`w`,t)},write:async n=>{if(!t)throw Error(`MediaBunny output handle was not initialized for ${e}`);await t.write(n.data,0,n.data.byteLength,n.position)},close:async()=>{let e=t;t=null,await e?.close()},abort:async()=>{let e=t;t=null,await e?.close()}}),{chunked:!0})},inspectMedia=async(e,t)=>{let n=new Input$1({formats:ALL_FORMATS$1,source:e.startsWith(`https`)?new UrlSource$1(e,{requestInit:{headers:t}}):createMediabunnyFileSource(e)});return{tracks:await n.getTracks(),primaryVideoTrack:await n.getPrimaryVideoTrack(),primaryAudioTrack:await n.getPrimaryAudioTrack()}},ALL_DASHA_FORMATS=[...DASH_FORMATS,...HLS_FORMATS],SENSITIVE_HEADER_KEYS=new Set([`authorization`,`cookie`,`set-cookie`,`api-key`]),getSafeHeadersForLogging=e=>Object.fromEntries(Object.keys(e).map(t=>[t,SENSITIVE_HEADER_KEYS.has(t.toLowerCase())?`[REDACTED]`:e[t]])),getManifestFormats=e=>e===`mpd`?DASH_FORMATS:e===`m3u8`?HLS_FORMATS:ALL_DASHA_FORMATS,createManifestInput=({http:e,source:t,detection:n})=>(logger.debug(`Fetching manifest...`),logger.debug(t.url),t.headers&&logger.debug(JSON.stringify(getSafeHeadersForLogging(t.headers))),new Input({source:new UrlSource(t.url,{requestInit:{headers:t.headers},fetchFn:e.fetch.bind(e)}),formats:getManifestFormats(n.kind)})),getStableHash=e=>createHash(`sha1`).update(e).digest(`hex`),normalizeTrackLanguageCode=(e,t)=>{if(e)switch(e){case`aar`:case`abk`:return`rus`;case`ave`:return`eng`;case`zu`:return t?.includes(`start.film`)?`ru`:`zu`;default:return e}},createPreparedTrackId=({origin:e,type:t,sourceUrl:n,languageCode:r,name:i,codec:a})=>`${e}:${t}:${getStableHash([n??``,r??``,i??``,a??``].join(`|`))}`,createPreparedTrackFromManifestTrack=async(e,t)=>{let[n,r,i,a,o,s]=await Promise.all([e.getCodec(),e.getBitrate(),e.getLanguageCode(),e.getName(),e.getDisposition(),e.hasOnlyKeyPackets()]),c={id:`manifest:${e.type}:${e.id}`,origin:`manifest`,type:e.type,codec:n,bitrate:r,languageCode:normalizeTrackLanguageCode(i,t),name:a,forced:o.forced,hearingImpaired:o.hearingImpaired,visuallyImpaired:o.visuallyImpaired,isDefault:o.default,isIFrameOnly:s,inputTrack:e};if(e.isVideoTrack()){let[t,n]=await Promise.all([e.getDisplayWidth(),e.getDisplayHeight()]);c.width=t,c.height=n}if(e.isAudioTrack()){let[t,n]=await Promise.all([e.getNumberOfChannels(),e.getSampleRate()]);c.numberOfChannels=t,c.sampleRate=n}return c},ensurePreparedTrackSegments=async e=>e.segments?e.segments:e.inputTrack?(e.segmentsPromise??=e.inputTrack.getSegments().then(t=>(e.segments=t,e.segmentCount=t.length,t)),e.segmentsPromise):(e.segments=[],e.segmentCount=0,e.segments),filterByCodecs=(e,t)=>{let n=e.filter(e=>t.some(t=>t===e.codec));return n.length?n:e.toSorted((e,t)=>(t.bitrate??0)-(e.bitrate??0))},filterByQuality=(e,t)=>{let n=t?parseInt(String(t),10)*16/9:void 0,r=e.toSorted((e,t)=>(t.bitrate??0)-(e.bitrate??0));if(!t)return r;let i=e.filter(e=>Number(e.height)===Number(t));if(i.length)return i;let a=e.filter(e=>Number(e.width)===Number(n));return a.length?a:r},filterByChannels=(e,t)=>e.filter(e=>e.numberOfChannels===Number(t)),normalizeLanguage=e=>e?.trim().toLowerCase()??``,getLanguageFamily=e=>normalizeLanguage(e).slice(0,2),getLanguageVariant=e=>normalizeLanguage(e)||`und`,matchesRequestedLanguage=(e,t)=>{let n=normalizeLanguage(e),r=normalizeLanguage(t);return!n||!r?!1:n===r||n.startsWith(`${r}-`)?!0:getLanguageFamily(n)===getLanguageFamily(r)},getUniqueLanguageFamilies=e=>Array.from(new Map(e.map(e=>normalizeLanguage(e)).filter(Boolean).map(e=>[getLanguageFamily(e),e])).values()),takeBestTracksPerVariant=(e,t)=>{let n=new Map;for(let r of e){let e=getLanguageVariant(r.languageCode),i=n.get(e);if(!i){n.set(e,[r]);continue}i.length<t&&i.push(r)}return Array.from(n.values()).flat()},filterByLanguages=(e,t,n=1)=>{let r=e.toSorted((e,t)=>(t.bitrate??0)-(e.bitrate??0)),i=getUniqueLanguageFamilies(t),a=[];for(let e of i){let t=r.filter(t=>matchesRequestedLanguage(t.languageCode,e));t.length&&a.push(...takeBestTracksPerVariant(t,n))}let o=getUniqueLanguageFamilies(e.map(e=>e.languageCode||`und`));if(!a.length)for(let e of o){let t=r.filter(t=>matchesRequestedLanguage(t.languageCode??`und`,e));t.length&&a.push(...takeBestTracksPerVariant(t,n))}return a},filterPairableAudios=(e,t)=>{if(!t?.inputTrack)return e;let n=t.inputTrack,r=e.filter(e=>e.inputTrack?e.inputTrack.canBePairedWith(n):!0);return r.length?r:e},toKbps=e=>(e??0)/1e3,getSegmentCountLabel=async e=>{if(typeof e.segmentCount==`number`)return`${e.segmentCount} Segments`;if(!e.inputTrack)return`Direct`;try{return`${(await ensurePreparedTrackSegments(e)).length} Segments`}catch{return`? Segments`}},buildSelectedTracks=({videos:e,audios:t,subtitles:n})=>({videos:e,audios:t,subtitles:n,all:[...e,...t,...n]});async function getTracks(e,t,n){let r=t.videoQuality,i=e.filter(e=>e.type===`video`&&!e.isIFrameOnly),a=e.filter(e=>e.type===`audio`),o=e.filter(e=>e.type===`subtitle`);if(t.select){let e=await Promise.all(i.map(async(e,t)=>({name:`${e.width??`?`}x${e.height??`?`} | ${toKbps(e.bitrate)||`?`} Kbps | ${e.codec??`?`} | ${await getSegmentCountLabel(e)}`,value:e.id,checked:t===0}))),t=i.length?await checkbox({message:`Select video streams`,pageSize:12,choices:e,loop:!1}):[],n=i.filter(e=>t.includes(e.id)),r=await Promise.all(a.map(async(e,t)=>({name:`${e.name?`${e.name} | `:``}${toKbps(e.bitrate)||`?`} Kbps | ${e.codec?`${e.codec} | `:``}${e.languageCode||`und`} | ${e.numberOfChannels??`?`}CH | ${await getSegmentCountLabel(e)}`,value:e.id,checked:t===0}))),s=a.length?await checkbox({message:`Select audio streams`,pageSize:12,choices:r,loop:!1}):[],c=a.filter(e=>s.includes(e.id)),l=await Promise.all(o.map(async(e,t)=>({name:`${e.codec??`?`} | ${e.languageCode||`und`} | ${await getSegmentCountLabel(e)}`,value:e.id,checked:t===0}))),u=o.length?await checkbox({message:`Select subtitles`,pageSize:12,choices:l,loop:!1}):[];return buildSelectedTracks({videos:n,audios:c,subtitles:o.filter(e=>u.includes(e.id))})}t.videoCodecs&&(i=filterByCodecs(i,t.videoCodecs)),i=filterByQuality(i,r||NaN);let s=i[0],c=[...t.languages||[]],l=n.audioLanguage?.slice(0,2);!c.length&&l&&c.push(l);let u=filterPairableAudios(a,s);t.audioChannels&&(u=filterByChannels(u,t.audioChannels)),t.audioCodecs&&(u=filterByCodecs(u,t.audioCodecs));let d=filterByLanguages(u,c,1);d.length&&(u=d);let f=c.at(-1),p=f?u.map(e=>!e.languageCode||e.languageCode===`und`?{...e,languageCode:f}:e):u,m=o.filter(e=>t.subtitleLanguages?.length?t.subtitleLanguages.some(t=>matchesRequestedLanguage(e.languageCode||`und`,t)):!1);return buildSelectedTracks({videos:t.skipVideo||!s?[]:[s],audios:t.skipAudio?[]:p,subtitles:t.skipSubtitles?[]:m})}const createEmptyPreparedTracks=()=>({videos:[],audios:[],subtitles:[],all:[]}),audioCodecMap={aac:`aac`,mp4a:`aac`,"mp4a.40.2":`aac`,ac3:`ac3`,"ac-3":`ac3`,eac3:`eac3`,"ec-3":`eac3`,opus:`opus`,vorbis:`vorbis`,flac:`flac`},tryGetUrl=e=>{if(!e)return null;try{return new URL(e)}catch{return null}},normalizePathname=e=>{let t=tryGetUrl(e);if(t)try{return decodeURIComponent(t.pathname)}catch{return t.pathname}},normalizeAudioStreamCodec=e=>{if(!e)return`aac`;let t=e.toLowerCase();return audioCodecMap[t]??audioCodecMap[t.split(`.`)[0]??``]??`aac`},countTracksByType=(e,t)=>e.filter(e=>e.type===t).length,logExtractedTracks=e=>{let t=`Extracted, there are `;if(e.length===0)t+=`no tracks`;else{t+=`${e.length} tracks`;let n=countTracksByType(e,`video`);n&&(t+=`, ${n} video tracks`);let r=countTracksByType(e,`audio`);r&&(t+=`, ${r} audio tracks`);let i=countTracksByType(e,`subtitle`);i&&(t+=`, ${i} subtitle tracks`)}logger.info(t)},appendAdditionalSubtitles=(e,t=[])=>{let n=[...t];for(let t of e.subtitles??[]){let r=normalizePathname(t.url),i=normalizeTrackLanguageCode(t.language,e.url);n.some(e=>{let t=normalizePathname(e.sourceUrl);return!r||!t?!1:r===t})||n.push({id:createPreparedTrackId({origin:`external-subtitle`,type:`subtitle`,sourceUrl:t.url,languageCode:i,name:t.label||t.title,codec:t.format}),origin:`external-subtitle`,type:`subtitle`,sourceUrl:t.url,languageCode:i,codec:t.format,forced:t.forced,name:t.label||t.title})}return n},prepareProgressiveSource=async({options:e,source:t,meta:n,detection:r})=>{let i={...e},a={...n};if(!a.title){let e=tryGetUrl(t.url)?.pathname.split(`/`).pop();e&&(a.title=e)}let{primaryVideoTrack:o,primaryAudioTrack:s}=await inspectMedia(t.url,t.headers),c=await o?.getCodec(),l=await o?.getCodedWidth(),u=await o?.getCodedHeight();i.videoQuality||=u?`${u}p`:void 0;let d=createEmptyPreparedTracks();if(d.subtitles=appendAdditionalSubtitles(t),d.all.push(...d.subtitles),r.isAudio&&!i.skipAudio){let e={id:createPreparedTrackId({origin:`progressive`,type:`audio`,sourceUrl:t.url,languageCode:t.audioLanguage,codec:await s?.getCodec()}),origin:`progressive`,type:`audio`,codec:normalizeAudioStreamCodec(await s?.getCodec()),languageCode:normalizeTrackLanguageCode(await s?.getLanguageCode(),t.url)??normalizeTrackLanguageCode(t.audioLanguage,t.url)??`und`,numberOfChannels:await s?.getNumberOfChannels(),sampleRate:await s?.getSampleRate(),sourceUrl:t.url};return d.audios.push(e),d.all.push(e),{options:i,source:t,meta:a,allTracks:[e],tracks:d}}if(!i.skipVideo){let e=parseInt((i.videoQuality??``).replace(`p`,``),10),n={id:createPreparedTrackId({origin:`progressive`,type:`video`,sourceUrl:t.url,codec:c}),origin:`progressive`,type:`video`,codec:c??`avc`,width:l??void 0,height:u??(e||void 0),sourceUrl:t.url};return d.videos.push(n),d.all.push(n),{options:i,source:t,meta:a,allTracks:[n],tracks:d}}return{options:i,source:t,meta:a,allTracks:[],tracks:d}},prepareInputSource=async({options:e,source:t,meta:n,input:r,disposeInput:i=!0})=>{let a={...e},o={...n},s=i;try{let e=await r.getTracks();if(!e.length)throw new DownloaderError(`MANIFEST_PARSE_FAILED`,`Failed to parse manifest`);let n=await Promise.all(e.map(e=>createPreparedTrackFromManifestTrack(e,t.url)));logExtractedTracks(n);let c=await getTracks(n,a,t),l=c.videos[0]?.height;if(l&&(a.videoQuality=`${l}p`),!o.title){let e=tryGetUrl(t.url)?.host;e&&(o.title=`${e}_${getCurrentDateTimeString()}`)}return s=!1,{options:a,source:t,meta:o,allTracks:n,tracks:c,dispose:i?()=>r.dispose?.():void 0}}finally{s&&r.dispose?.()}},prepareManifestSource=async({http:e,options:t,source:n,meta:r,detection:i})=>prepareInputSource({options:t,source:n,meta:r,input:createManifestInput({http:e,source:n,detection:i})}),prepareSource=async({http:e,options:t,source:n,meta:r,input:i,detection:a})=>i?prepareInputSource({options:t,source:n,meta:r,input:i,disposeInput:!1}):a.strategy===`progressive`?prepareProgressiveSource({options:t,source:n,meta:r,detection:a}):prepareManifestSource({http:e,options:t,source:n,meta:r,detection:a}),hasSuffix=(e,t)=>{try{let n=new URL(e);return n.pathname.endsWith(t)||n.search.endsWith(t)}catch{return!1}},selectPreparationStrategy=async(e,t)=>{let n=hasSuffix(t.url,`.m3u8`),r=hasSuffix(t.url,`.mpd`),i=hasSuffix(t.url,`.mp4`),a=hasSuffix(t.url,`.mov`),o=!1,s=!1;if(!n&&!r&&!i&&!a)try{let n=await e.fetch(t.url,{method:`HEAD`,headers:t.headers});if(!n.ok)logger.warn(`HEAD request for ${t.url} returned ${n.status} ${n.statusText}`);else{let e=n.headers.get(`content-type`);o=!!e?.includes(`audio`),s=!!e?.includes(`video`)}}catch(e){let n=e instanceof Error?e.message:String(e);logger.warn(`HEAD request failed for ${t.url}: ${n}`)}return r?{strategy:`manifest`,kind:`mpd`,isAudio:o,isVideo:s,matchedContentLabel:`Dynamic Adaptive Streaming over HTTP`}:n?{strategy:`manifest`,kind:`m3u8`,isAudio:o,isVideo:s,matchedContentLabel:`HTTP Live Streaming`}:o||s||i||a?{strategy:`progressive`,kind:`progressive`,isAudio:o,isVideo:s,matchedContentLabel:`Progressive Stream`}:{strategy:`manifest`,kind:`unknown`,isAudio:o,isVideo:s}};var require_reusify=__commonJSMin(((e,t)=>{function n(e){var t=new e,n=t;function r(){var r=t;return r.next?t=r.next:(t=new e,n=t),r.next=null,r}function i(e){n.next=e,n=e}return{get:r,release:i}}t.exports=n})),require_queue=__commonJSMin(((e,t)=>{var n=require_reusify();function r(e,t,r){if(typeof e==`function`&&(r=t,t=e,e=null),!(r>=1))throw Error(`fastqueue concurrency must be equal to or greater than 1`);var o=n(a),s=null,c=null,l=0,u=null,d={push:v,drain:i,saturated:i,pause:p,paused:!1,get concurrency(){return r},set concurrency(e){if(!(e>=1))throw Error(`fastqueue concurrency must be equal to or greater than 1`);if(r=e,!d.paused)for(;s&&l<r;)l++,b()},running:f,resume:g,idle:_,length:m,getQueue:h,unshift:y,empty:i,kill:x,killAndDrain:S,error:w,abort:C};return d;function f(){return l}function p(){d.paused=!0}function m(){for(var e=s,t=0;e;)e=e.next,t++;return t}function h(){for(var e=s,t=[];e;)t.push(e.value),e=e.next;return t}function g(){if(d.paused){if(d.paused=!1,s===null){l++,b();return}for(;s&&l<r;)l++,b()}}function _(){return l===0&&d.length()===0}function v(n,a){var f=o.get();f.context=e,f.release=b,f.value=n,f.callback=a||i,f.errorHandler=u,l>=r||d.paused?c?(c.next=f,c=f):(s=f,c=f,d.saturated()):(l++,t.call(e,f.value,f.worked))}function y(n,a){var f=o.get();f.context=e,f.release=b,f.value=n,f.callback=a||i,f.errorHandler=u,l>=r||d.paused?s?(f.next=s,s=f):(s=f,c=f,d.saturated()):(l++,t.call(e,f.value,f.worked))}function b(n){n&&o.release(n);var i=s;i&&l<=r?d.paused?l--:(c===s&&(c=null),s=i.next,i.next=null,t.call(e,i.value,i.worked),c===null&&d.empty()):--l===0&&d.drain()}function x(){s=null,c=null,d.drain=i}function S(){s=null,c=null,d.drain(),d.drain=i}function C(){var e=s;for(s=null,c=null;e;){var t=e.next,n=e.callback,r=e.errorHandler,a=e.value,o=e.context;e.value=null,e.callback=i,e.errorHandler=null,r&&r(Error(`abort`),a),n.call(o,Error(`abort`)),e.release(e),e=t}d.drain=i}function w(e){u=e}}function i(){}function a(){this.value=null,this.callback=i,this.next=null,this.release=i,this.context=null,this.errorHandler=null;var e=this;this.worked=function(t,n){var r=e.callback,a=e.errorHandler,o=e.value;e.value=null,e.callback=i,e.errorHandler&&a(t,o),r.call(e.context,t,n),e.release(e)}}function o(e,t,n){typeof e==`function`&&(n=t,t=e,e=null);function a(e,n){t.call(this,e).then(function(e){n(null,e)},n)}var o=r(e,a,n),s=o.push,c=o.unshift;return o.push=l,o.unshift=u,o.drained=d,o;function l(e){var t=new Promise(function(t,n){s(e,function(e,r){if(e){n(e);return}t(r)})});return t.catch(i),t}function u(e){var t=new Promise(function(t,n){c(e,function(e,r){if(e){n(e);return}t(r)})});return t.catch(i),t}function d(){return new Promise(function(e){process.nextTick(function(){if(o.idle())e();else{var t=o.drain;o.drain=function(){typeof t==`function`&&t(),e(),o.drain=t}}})})}}t.exports=r,t.exports.promise=o})),import_queue=__toESM(require_queue(),1);const DEFAULT_CONNECT_TIMEOUT=3e5,createClient=(e={})=>{let t=e.maxRetries??5,{proxy:n}=e,r=n?new ProxyAgent({uri:n,allowH2:!0}):new Agent({allowH2:!0});return kyImport.create({fetch:e.fetch,dispatcher:r,proxy:n,timeout:DEFAULT_CONNECT_TIMEOUT,retry:{limit:t,methods:[`get`,`head`],statusCodes:[408,413,429,500,502,503,504],backoffLimit:3e4},throwHttpErrors:!0,redirect:`follow`,headers:{"user-agent":`Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36`}})},sleep=e=>new Promise(t=>setTimeout(t,e)),createTempFileDir=async(e,t)=>{let n=await fsp.stat(t).catch(()=>null);(!n||!n.isDirectory())&&await fsp.mkdir(t,{recursive:!0});let r=getTempFileDirPath(e,t),i=await fsp.stat(r).catch(()=>null);return(!i||!i.isDirectory())&&await fsp.mkdir(r,{recursive:!0}),r},getTempFileDirPath=(e,t)=>{let n=path.resolve(e),r=path.parse(e).name,i=createHash(`sha1`).update(n).digest(`hex`).slice(0,10);return path.join(t,`${r}-${i}`)},ensureDirExists=async e=>{let t=path.dirname(e),n=path.resolve(t);path.parse(n).root!==n&&(await fsp.stat(t).then(()=>!0).catch(()=>!1)||await fsp.mkdir(t,{recursive:!0}))},clear=async(...e)=>{let t=[];for(let n of e)n&&t.push(fsp.rm(n,{recursive:!0,force:!0}).catch(()=>void 0));await Promise.all(t)},getDefaultResumeFilePath=e=>`${e}.part.json`,resolvePath=e=>{if(e.filePath)return e.filePath;if(e.output)return getDefaultResumeFilePath(e.output);throw Error(`Either output or filePath is required for FileResumeStore`)},isRetryableRenameError=e=>{if(!e||typeof e!=`object`)return!1;let t=`code`in e?e.code:void 0;return t===`EPERM`||t===`EACCES`||t===`EBUSY`},replaceFile=async(e,t)=>{let n=process$1.platform===`win32`?[0,50,150,300,500]:[0],r;for(let i of n){i>0&&await sleep(i);try{await fsp.rename(e,t);return}catch(n){if(r=n,!isRetryableRenameError(n))break;await fsp.rm(t,{force:!0}).catch(()=>void 0);try{await fsp.rename(e,t);return}catch(e){if(r=e,!isRetryableRenameError(e))break}}}throw r};var FileResumeStore=class{async get(e){let t=resolvePath(e);if(!await fsp.stat(t).then(()=>!0).catch(()=>!1))return null;try{let e=await fsp.readFile(t,`utf8`);return JSON.parse(e)}catch{return null}}async set(e,t){let n=resolvePath(e);await ensureDirExists(n);let r=`${n}.${process$1.pid}.${Date.now().toString(36)}.tmp`;await fsp.writeFile(r,JSON.stringify(t));try{await replaceFile(r,n)}finally{try{await fsp.rm(r,{force:!0})}catch{}}}async delete(e){let t=resolvePath(e);await fsp.rm(t,{force:!0}).catch(()=>void 0)}};const toAbsoluteOutputPath=e=>path.resolve(e),getDefaultResumeKey=e=>createHash(`sha1`).update(toAbsoluteOutputPath(e)).digest(`hex`),toStateParts=e=>e.map((e,t)=>({index:t,start:e.start,end:e.end,output:e.output,completed:!1,bytesWritten:0})),hasSameLayout=(e,t)=>e.parts.length===t.length?e.parts.every((e,n)=>{let r=t[n];return r?e.start===r.start&&e.end===r.end&&(e.output??null)===(r.output??null):!1}):!1,hasSameSignature=(e,t)=>!t||!e.sourceSignature?!0:e.sourceSignature===t,normalizeDownloadedBytes=e=>{let t=e.parts.reduce((e,t)=>e+t.bytesWritten,0);return t>0?t:e.bytesDownloaded},isValidResumeState=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return t.version===2&&typeof t.key==`string`&&Array.isArray(t.parts)&&typeof t.bytesDownloaded==`number`};var ResumeManager=class{key;output;filePath;cleanupOnSuccess;store;target;trustExplicitKey;constructor(e={}){if(this.output=e.output,this.filePath=e.filePath,this.key=e.key??(this.output?getDefaultResumeKey(this.output):``),!this.key)throw Error(`Resume key is required when output is not provided`);this.store=e.store??new FileResumeStore,this.cleanupOnSuccess=e.cleanupOnSuccess??!0,this.target={key:this.key,output:this.output,filePath:this.filePath},this.trustExplicitKey=typeof e.key==`string`&&e.key.length>0}async read(){let e=await this.store.get(this.target);return isValidResumeState(e)?e:null}async write(e){let t=new Date().toISOString(),n={...e,version:2,key:this.key,output:e.output??this.output,bytesDownloaded:normalizeDownloadedBytes(e),createdAt:e.createdAt||t,updatedAt:t};await this.store.set(this.target,n)}async delete(){await this.store.delete(this.target)}createState(e){let t=new Date().toISOString();return{version:2,key:this.key,output:this.output,input:e.input,bytesTotal:e.bytesTotal,bytesDownloaded:0,parts:toStateParts(e.parts),sourceSignature:e.sourceSignature,planner:e.planner,createdAt:t,updatedAt:t}}reconcileState(e,t){let n=e.version!==2,r=e.key!==this.key,i=!this.trustExplicitKey&&!hasSameSignature(e,t.sourceSignature),a=!hasSameLayout(e,t.parts);if(n||r||i||a)return{state:this.createState(t),reset:!0};let o={...e,key:this.key,output:this.output,input:t.input,bytesTotal:t.bytesTotal,sourceSignature:t.sourceSignature,planner:t.planner,parts:t.parts.map((t,n)=>{let r=e.parts[n];return{index:n,start:t.start,end:t.end,output:t.output,completed:r?.completed??!1,bytesWritten:r?.bytesWritten??0}}),createdAt:e.createdAt,updatedAt:e.updatedAt};return o.bytesDownloaded=normalizeDownloadedBytes(o),{state:o,reset:!1}}markPartCompleted(e,t,n){let r=e.parts[t];if(!r)return e;let i=r.bytesWritten;return r.completed=!0,r.bytesWritten=n,e.bytesDownloaded=Math.max(0,e.bytesDownloaded-i+n),e.updatedAt=new Date().toISOString(),e}async getProgress(){let e=await this.read();if(!e)return null;let t=e.bytesDownloaded;if(e.bytesTotal){let n=e.bytesTotal;return{bytesDownloaded:t,totalBytes:n,percentComplete:n>0?Math.round(t/n*100):0}}let n=e.parts.length,r=e.parts.filter(e=>e.completed).length;return{bytesDownloaded:t,totalBytes:null,percentComplete:n>0?Math.round(r/n*100):0,segmentsCompleted:r,segmentsTotal:n}}};const DEFAULT_MAX_PART_SIZE=8*2**20,getPartOutput=(e,t,n)=>{let r=`part_${n}.part`;return path.join(t,r)},getPartSize=(e,t,n)=>{let r=Math.ceil(e/Math.max(1,t));return Math.max(1,Math.min(r,Math.max(1,n)))},getRanges=(e,t,n)=>{let r=getPartSize(e,t,n),i=[],a=0;for(;a<e;){let t=Math.min(e-1,a+r-1);i.push([a,t]),a=t+1}return i},getRangeHeader=e=>{let[t,n]=e;return`bytes=${t}-${n||``}`},getParts=e=>getRanges(e.contentLength,e.maxWorkerCount,e.maxChunkSize??DEFAULT_MAX_PART_SIZE).map(t=>{let[n,r]=t,i=new Headers(e.requestInit?.headers);return i.set(`Range`,getRangeHeader([n,r])),{url:e.url,headers:i,start:n,end:r}}),createAbortError$1=e=>{let t=e?Error(`The operation was aborted`,{cause:e}):Error(`The operation was aborted`);return t.name=`AbortError`,t},isAbortLikeError=e=>{if(!(e instanceof Error))return!1;if(e.name===`AbortError`||e.code===`ABORT_ERR`)return!0;let t=e.cause;return t instanceof Error&&t.name===`AbortError`},fetchWorker=async e=>await e.client.get(e.url,{redirect:`follow`,...e.requestInit}),saveData=(e,t,n)=>async r=>{if(n?.aborted)throw createAbortError$1();let i=typeof t==`number`?{flags:`r+`,start:t}:{flags:`w`},a=fs.createWriteStream(e,i),o=Readable.fromWeb(r.body);try{await pipeline(o,a,{signal:n})}catch(e){throw isAbortLikeError(e)?createAbortError$1(e):e}if(n?.aborted)throw createAbortError$1();return r},updateProgress=(e,t,n)=>r=>{if(n?.aborted)throw createAbortError$1();let i=parseInt(r.headers.get(`content-length`)||`0`);if(e.increase(i),n?.aborted)throw createAbortError$1();return t&&!n?.aborted?t(e.toProgressInfo()):e.log(),r},resolveResumeOptions=e=>typeof e==`boolean`?{enabled:e,cleanupOnSuccess:!0}:e?{enabled:e.enabled??!0,key:e.key,store:e.store,filePath:e.filePath,cleanupOnSuccess:e.cleanupOnSuccess??!0}:{enabled:!1,cleanupOnSuccess:!0},resolveDownloadConfig=e=>({tempDir:e.tempDir??process.cwd(),maxRetries:e.maxRetries??5,maxChunkSize:e.maxChunkSize??DEFAULT_MAX_PART_SIZE,maxWorkerCount:e.maxWorkerCount??4,resume:resolveResumeOptions(e.resume),proxy:e.proxy,requestInit:e.requestInit,fetchFn:e.fetchFn}),DEFAULT_STATE={total:{b:0,mb:0},current:{b:0,mb:0},chunkSize:0,chunkSizes:[],averageSize:{b:0,mb:0},averageTotal:{b:0,mb:0},speed:{bps:0,mbps:0}},formatSeconds=e=>{let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60,i=t>0?`${t}h`:``,a=n>0?`${n}m`:``,o=r>0?`${r}s`:``;return t>0?`${i} ${a||`0m`} ${o&&`${o}`}`:!t&&n>0?`${a} ${o&&`${o}`}`:o},createProgress=(e=0)=>{let t=structuredClone(DEFAULT_STATE),n=0,r=setInterval(()=>{n>1&&(t.speed.bps=t.current.b/n),n+=.5},500);return{state:t,setTotal:e=>{t.total.b=e,t.total.mb=e/1024/1024},setCurrent(e){t.current.b=e,t.current.mb=e/1024/1024},increase(n){t.current.b+=n,t.current.mb=t.current.b/1024/1024,t.speed.mbps=t.speed.bps/1024/1024,t.chunkSize=n,t.chunkSizes.push(n),t.averageSize.b=t.current.b/t.chunkSizes.length,t.averageSize.mb=t.averageSize.b/1024/1024,t.averageTotal.b=e*t.averageSize.b,t.averageTotal.mb=t.averageTotal.b/1024/1024},stop(){clearInterval(r),Object.assign(t,DEFAULT_STATE)},log(){let e=t.current.b,n=t.total.b,r=e+(n?`/${n}`:``);stdout.write(`\rDownloading [${r}]`)},stopLog(){stdout.write(`
|
|
3
3
|
`)},toString(){let e=``;t.speed.bps&&(e+=`${t.speed.mbps.toFixed(1)} MB/s – `),e+=`${t.current.mb.toFixed(1)}`,t.total.b?e+=` of ${t.total.mb.toFixed(1)} MB`:e+=` MB`;let r=t.total.b||t.averageTotal.b;if(r){let i=r-t.speed.bps*n,a=Math.round(i/t.speed.bps),o=formatSeconds(a);a&&isFinite(a)&&o&&(e+=`, ${o} left`)}return e},toProgressInfo(){let e=t.total.b||null;return{bytesDownloaded:t.current.b,totalBytes:e,percentComplete:e?t.current.b/e*100:null,bytesPerSecond:t.speed.bps,estimatedSecondsRemaining:t.speed.bps>0&&e?(e-t.current.b)/t.speed.bps:null}}}},VOLATILE_HEADER_NAMES=new Set([`authorization`,`cookie`,`set-cookie`,`x-amz-date`,`x-amz-security-token`,`x-amz-content-sha256`,`x-goog-date`,`x-goog-security-token`]),serializeHeaders=(e,t={})=>{if(!e)return[];let n=t.includeVolatile??!1,r=[];return new Headers(e).forEach((e,t)=>{!n&&VOLATILE_HEADER_NAMES.has(t.toLowerCase())||r.push([t,e])}),r.sort(([e],[t])=>e.localeCompare(t)),r},normalizeUrlForSignature=e=>{try{let t=new URL(e),n=t.pathname.split(`/`).map(e=>e&&(e.includes(`=`)||e.includes(`,`)?`:volatile`:e)).join(`/`);return`${t.origin}${n}`}catch{let t=String(e);return(t.split(`#`)[0]??t).split(`?`)[0]||t}},createPartSignature=e=>({url:normalizeUrlForSignature(e.url),start:e.start,end:e.end,output:e.output,headers:serializeHeaders(e.headers)}),createSourceSignature=e=>{let t={input:Array.isArray(e.input)?e.input.map(e=>createPartSignature(e)):normalizeUrlForSignature(String(e.resolvedUrl)),requestHeaders:serializeHeaders(e.requestHeaders),parts:e.parts.map(e=>createPartSignature(e)),maxWorkerCount:e.maxWorkerCount,maxChunkSize:e.maxChunkSize};return createHash(`sha1`).update(JSON.stringify(t)).digest(`hex`)},loadOrCreateResumeState=async e=>{if(!e.manager)return null;let t={input:Array.isArray(e.input)?e.input:e.resolvedUrl,parts:e.parts,bytesTotal:e.bytesTotal,sourceSignature:e.sourceSignature,planner:{maxWorkerCount:e.maxWorkerCount,maxChunkSize:e.maxChunkSize}},n=await e.manager.read(),r=(n?e.manager.reconcileState(n,t):null)?.state??e.manager.createState(t);return await e.manager.write(r),r},ensureAllPartsCompleted=e=>{if(e&&!e.parts.every(e=>e.completed))throw Error(`Not all segments were downloaded successfully. Try resuming later.`)},planDownloadParts=e=>{if(Array.isArray(e.input))return e.input.map((t,n)=>({...t,output:getPartOutput(e.url,e.tempFileDir,n)}));if(!e.acceptsRanges)throw Error(`Unable to get parts`);if(!e.size)throw Error(`Size is not known`);return getParts({url:e.url,requestInit:e.requestInit,contentLength:e.size,maxWorkerCount:e.maxWorkerCount,maxChunkSize:e.maxChunkSize})},ensureOutputReadyForRanges=async e=>{if(!e.parts.some(t=>typeof t.start==`number`&&(t.output??e.output)===e.output)||await fsp.stat(e.output).then(()=>!0).catch(()=>!1))return;let t=await fsp.open(e.output,`w`);e.size&&e.size>0&&await t.truncate(e.size),await t.close()},createAbortError=()=>{let e=Error(`The operation was aborted`);return e.name=`AbortError`,e},parseContentRange=e=>{let t=e.match(/bytes\s+(\d+)-(\d+)\/(\d+|\*)/i);if(!t||!t[1]||!t[2]||!t[3])return null;let n=parseInt(t[1],10),r=parseInt(t[2],10),i=t[3];if(!Number.isFinite(n)||!Number.isFinite(r)||r<n)return null;if(i===`*`)return{start:n,end:r,total:null};let a=parseInt(i,10);return!Number.isFinite(a)||a<=0?null:{start:n,end:r,total:a}},validateRangedPartResponse=(e,t)=>{if(typeof t.start!=`number`||typeof t.end!=`number`)return;if(e.status!==206)throw Error(`Range request failed for bytes=${t.start}-${t.end}: expected 206, got ${e.status}`);let n=e.headers.get(`content-range`);if(!n)throw Error(`Range request failed for bytes=${t.start}-${t.end}: missing Content-Range header`);let r=parseContentRange(n);if(!r)throw Error(`Range request failed for bytes=${t.start}-${t.end}: invalid Content-Range "${n}"`);if(r.start!==t.start||r.end!==t.end)throw Error(`Range request failed for bytes=${t.start}-${t.end}: got bytes=${r.start}-${r.end}`)},resolvePartSize=async(e,t,n)=>{let r=e.headers.get(`content-length`);if(r){let e=parseInt(r,10);if(Number.isFinite(e)&&e>0)return e}let i=e.headers.get(`content-range`);if(i){let e=i.match(/bytes\s+(\d+)-(\d+)\//i);if(e&&e[1]&&e[2]){let t=parseInt(e[1],10),n=parseInt(e[2],10);if(Number.isFinite(t)&&Number.isFinite(n)&&n>=t)return n-t+1}}return typeof t.start==`number`&&typeof t.end==`number`?Math.max(0,t.end-t.start+1):t.output&&t.output!==n?fsp.stat(t.output).then(e=>e.size).catch(()=>0):0},getPendingPartIndexes=(e,t)=>e.map((e,t)=>t).filter(e=>!(t?.parts[e]?.completed??!1)),createStateWriteScheduler=e=>{let t=Promise.resolve();return{enqueue:()=>(t=t.then(e),t),onIdle:()=>t}},runPartQueue=async e=>{let t=e.signal??e.requestInit?.signal??void 0,n=()=>{if(t?.aborted)throw createAbortError()};n();let r=getPendingPartIndexes(e.parts,e.resumeState),i=import_queue.promise(async r=>{let{index:i,part:a}=r;n();let o=await fetchWorker({index:i,client:e.client,url:a.url,requestInit:{...e.requestInit,signal:t,headers:a.headers??e.requestInit?.headers}});if(n(),validateRangedPartResponse(o,a),await saveData(a.output??e.output,a.start,t)(o),updateProgress(e.progress,e.onProgress,t)(o),n(),e.resumeState&&e.resumeManager){let t=await resolvePartSize(o,a,e.output);e.resumeManager.markPartCompleted(e.resumeState,i,t),await c.enqueue()}},e.maxWorkerCount),a=()=>{i.pause(),i.killAndDrain(),i.kill()};if(t?.aborted)throw a(),createAbortError();let o=()=>{},s=t?new Promise((e,n)=>{let r=()=>{a(),n(createAbortError())};t.addEventListener(`abort`,r,{once:!0}),o=()=>t.removeEventListener(`abort`,r)}):null,c=createStateWriteScheduler(async()=>{!e.resumeState||!e.resumeManager||await e.resumeManager.write(e.resumeState)}),l=r.map(t=>{let r=e.parts[t];return r?(n(),i.push({index:t,part:r})):Promise.resolve()}),u=[];try{let e=Promise.allSettled(l);s&&(await Promise.race([e,s]),n()),u=await e}finally{o(),await c.onIdle()}let d=u.find(e=>e.status===`rejected`);if(d?.status===`rejected`)throw d.reason},pipePartToOutput=async(e,t)=>{await new Promise((n,r)=>{let i=fs.createReadStream(e),a=()=>{t.off(`error`,o),i.off(`error`,s),i.off(`end`,c)},o=e=>{a(),r(Error(`Output write stream error`,{cause:e}))},s=e=>{a(),r(Error(`Segment read stream error`,{cause:e}))},c=()=>{a(),n()};t.on(`error`,o),i.on(`error`,s),i.on(`end`,c),i.pipe(t,{end:!1})})},mergePartOutputs=async e=>{let t=e.parts.map(e=>e.output).filter(t=>!!t&&t!==e.output);if(!t.length)return;let n=fs.createWriteStream(e.output);for(let e of t)await pipePartToOutput(e,n);n.end(),await finished(n)},validateOutputSize=async e=>{if(!e.expectedSize)return;let t=await fsp.stat(e.output).then(e=>e.size).catch(()=>null);if(t&&t!==e.expectedSize)throw Error(`Actual size ${t} doesn't match expected size ${e.expectedSize}`)},finalizeDownload=async e=>{e.resumeManager&&e.resumeManager.cleanupOnSuccess&&await e.resumeManager.delete(),await clear(e.tempFileDir)},executeDownloadFlow=async e=>{let t=createSourceSignature({input:e.input,resolvedUrl:e.url,parts:e.parts,requestHeaders:e.requestInit?.headers,maxWorkerCount:e.maxWorkerCount,maxChunkSize:e.maxChunkSize}),n=await loadOrCreateResumeState({manager:e.resumeManager,input:e.input,resolvedUrl:e.url,parts:e.parts,bytesTotal:e.size??void 0,sourceSignature:t,maxWorkerCount:e.maxWorkerCount,maxChunkSize:e.maxChunkSize}),r=createProgress(e.parts.length);e.size&&r.setTotal(e.size),n?.bytesDownloaded&&r.setCurrent(n.bytesDownloaded),await ensureOutputReadyForRanges({output:e.output,size:e.size,parts:e.parts});try{await runPartQueue({parts:e.parts,output:e.output,maxWorkerCount:e.maxWorkerCount,client:e.client,requestInit:e.requestInit,progress:r,onProgress:e.onProgress,resumeState:n,resumeManager:e.resumeManager,signal:e.signal})}finally{r.stop(),e.onProgress||r.stopLog()}ensureAllPartsCompleted(n),await mergePartOutputs({output:e.output,parts:e.parts}),await validateOutputSize({output:e.output,expectedSize:Array.isArray(e.input)?null:e.size}),await finalizeDownload({tempFileDir:e.tempFileDir,resumeManager:e.resumeManager})},probeInput=async e=>{let t=new Headers(e.requestInit?.headers);t.set(`Range`,`bytes=0-0`);let n=Array.isArray(e.input)?e.input[0]?.url:e.input;if(!n)throw Error(`Input is empty`);let r=await e.client.head(n,{...e.requestInit,headers:t}),i=r.headers.get(`content-type`),a=r.headers.get(`content-length`),o=r.headers.get(`content-range`),s=o?.split(`/`)?.[1]||a,c=s&&!Array.isArray(e.input)?parseInt(s,10):null,l=r.headers.get(`accept-ranges`)===`bytes`||!!o?.includes(`bytes`)||!!i?.includes(`video`)||!!i?.includes(`audio`)||!!i?.includes(`octet-stream`);return{url:r.url,size:c,acceptsRanges:l}};var Download=class e{input;output;resume;onProgress;config;client;resumeManager;probe;tempFileDir;constructor(e){this.input=e.input,this.output=e.output,this.resume=e.resume,this.onProgress=e.onProgress,this.config=resolveDownloadConfig(e),this.client=createClient({maxRetries:this.config.maxRetries,proxy:this.config.proxy,fetch:this.config.fetchFn}),this.config.resume.enabled&&(this.resumeManager=new ResumeManager({output:this.output,key:this.config.resume.key,filePath:this.config.resume.filePath,store:this.config.resume.store,cleanupOnSuccess:this.config.resume.cleanupOnSuccess}))}static async init(t){let n=new e(t);return await n._init(),n}async _init(){this.probe=await probeInput({client:this.client,input:this.input,requestInit:this.config.requestInit}),await ensureDirExists(this.output),this.tempFileDir=await createTempFileDir(this.output,this.config.tempDir),this.config.resume.enabled||(await clear(this.output,getDefaultResumeFilePath(this.output),this.tempFileDir),this.tempFileDir=await createTempFileDir(this.output,this.config.tempDir))}async execute(){if(!this.probe||!this.tempFileDir)throw Error(`Download was not initialized. Use Download.init(options).`);let e=planDownloadParts({input:this.input,url:this.probe.url,size:this.probe.size,acceptsRanges:this.probe.acceptsRanges,requestInit:this.config.requestInit,tempFileDir:this.tempFileDir,maxWorkerCount:this.config.maxWorkerCount,maxChunkSize:this.config.maxChunkSize});await executeDownloadFlow({input:this.input,output:this.output,url:this.probe.url,size:this.probe.size,requestInit:this.config.requestInit,maxWorkerCount:this.config.maxWorkerCount,maxChunkSize:this.config.maxChunkSize,onProgress:this.onProgress,client:this.client,parts:e,tempFileDir:this.tempFileDir,resumeManager:this.resumeManager,signal:this.config.requestInit?.signal??void 0})}async getSize(){if(this.probe||=await probeInput({client:this.client,input:this.input,requestInit:this.config.requestInit}),!this.probe.size)throw Error(`Size is not known`);return this.probe.size}};const retry=async({attempts:e,fn:t,shouldRetry:n,onRetry:r})=>{let i=Math.max(1,Math.trunc(e)),a;for(let e=1;e<=i;e+=1)try{return await t(e)}catch(t){if(a=t,e>=i||!n?.(t,e))throw t;await r?.(t,e)}throw a instanceof Error?a:Error(String(a))},forceNanospinnerTtyIfNeeded=()=>{if(process.platform===`win32`&&!isatty(process.stderr.fd)&&loadWinConsoleAddon()?.getConsoleSize?.()?.columns)try{let e=__require(`nanospinner/dist/consts.js`);e&&e.isTTY===!1&&(e.isTTY=!0,e.symbols?.frames?.length===1&&(e.symbols.frames=[`-`,`\\`,`|`,`/`]))}catch{}},getSpinnerStream=e=>{let t=process.stderr;if(!e||process.platform!==`win32`)return t;if(!t.columns||t.columns!==e){let n=Object.getOwnPropertyDescriptor(t,`columns`)??Object.getOwnPropertyDescriptor(Object.getPrototypeOf(t),`columns`);if(!n||n.writable||n.set)try{t.columns=e}catch{}if(t.columns!==e){let n=Object.create(t);return Object.defineProperty(n,`columns`,{value:e,configurable:!0,enumerable:!0,writable:!0}),logger.warn(`Unable to override stderr.columns; using spinner-local width ${e}.`),n}}return t},logLevelsColors={debug:`gray`,info:`green`,warn:`yellow`,error:`red`},getColorizedLogLevel=e=>{let t=e.toUpperCase(),n=colors[logLevelsColors[e]];return n(t)},withPrefixedText=(e,t)=>typeof t==`string`?`${e} ${t}`:t&&{...t,text:`${e} ${t.text??``}`.trimEnd()},createSpinner$1=(e,t)=>{forceNanospinnerTtyIfNeeded();let n=getLogPrefix(getColorizedLogLevel(`info`)),r=createSpinner(e,{stream:getSpinnerStream(loadWinConsoleAddon()?.getConsoleSize?.()?.columns??process.stderr.columns??process.stdout.columns??(process.platform===`win32`?120:80))}).start({text:`${n} ${e}`,color:t}),i=r.update.bind(r),a=r.success.bind(r),o=r.error.bind(r);return r.update=e=>i(withPrefixedText(n,e)),r.success=e=>a(withPrefixedText(n,e)),r.error=e=>o(withPrefixedText(n,e)),r},MAX_SAFE_MOLNIA_WORKERS=16,getWidevinePssh=e=>{if(!(!e||typeof e!=`object`||!(`drm`in e)))return e.drm?.widevine?.pssh},getTrackResumeKey=(e,t)=>createHash(`sha1`).update(`${e}:${getTrackId(t)}`).digest(`hex`),buildTrackArtifactPath=({outputDirectory:e,resolvedFilenameWithoutExtension:t,track:n})=>join(e,`${t}.${createHash(`sha256`).update(getTrackId(n)).digest(`hex`).slice(0,6)}.${n.type===`subtitle`?`vtt`:n.type===`audio`?`m4a`:`mp4`}`),getSegmentRangeHeaders=(e,t)=>{if(t)return{Range:`bytes=${e}-${e+t-1}`}},buildTrackDownloadInput=async e=>{if(e.sourceUrl&&!e.inputTrack)return e.sourceUrl;let t=[],n=await ensurePreparedTrackSegments(e),r=n[0];r?.initSegment&&t.push({url:r.initSegment.location.path,headers:getSegmentRangeHeaders(r.initSegment.location.offset,r.initSegment.location.length)});for(let e of n)t.push({url:e.location.path,headers:getSegmentRangeHeaders(e.location.offset,e.location.length)});return!t.length&&e.sourceUrl?e.sourceUrl:t.length===1&&!t[0]?.headers?t[0].url:t},resolveMaxWorkerCount=e=>{let t=Math.max(1,Math.trunc(e)),n=Math.min(MAX_SAFE_MOLNIA_WORKERS,t);return{normalizedRequestedConnections:t,maxWorkerCount:n,wasClamped:t!==n}},resolveMaxAttempts=e=>Math.max(1,Math.trunc(e)+1),buildTrackResume=(e,t)=>t.origin===`manifest`?{enabled:!0,key:getTrackResumeKey(e,t)}:!0,buildTrackProgressInfo=({title:e,progress:t,track:n,filepath:r,target:i})=>{let a={b:t.totalBytes??NaN,mb:(t.totalBytes??NaN)/1024/1024},o={b:t.bytesDownloaded??NaN,mb:(t.bytesDownloaded??NaN)/1024/1024},s=t.totalBytes?Math.round(t.bytesDownloaded/t.totalBytes*100):void 0;return{title:e,total:a,current:o,percentage:s,speed:{bps:t.bytesPerSecond??NaN,mbps:(t.bytesPerSecond??NaN)/1024/1024},trackName:basename(r),trackPath:r,finalName:i.finalName,finalPath:i.finalPath,state:s===100?`downloaded`:`downloading`,quality:n.type===`video`&&n.width?`${n.width}x${n.height}`:void 0,codec:n.type===`video`?n.codec??void 0:void 0}},buildTrackProgressMessage=e=>`Downloading ∙ ${`${(e.bytesDownloaded/1024/1024).toFixed(2)} MB`}${e.totalBytes?` of ${(e.totalBytes/1024/1024).toFixed(2)} MB`:``}`,collectPsshList=e=>e.flatMap(e=>{let t=e.segments?.[0],n=getWidevinePssh(t?.initSegment?.encryption)??getWidevinePssh(t?.encryption);return n?[n]:[]}).map(e=>{let t=e;return typeof t==`string`?t:t instanceof Uint8Array||t instanceof ArrayBuffer?Buffer.from(t).toString(`base64`):ArrayBuffer.isView(t)?Buffer.from(t.buffer).toString(`base64`):String(t)}),toDownloadArtifact=(e,t)=>({path:t,type:e.type,language:e.languageCode,label:e.name??void 0,forced:e.type===`subtitle`?e.forced:!1}),downloadTrack=async({track:e,filepath:t,description:n,target:r,source:i,options:a,settings:o,abortSignal:s,title:c,emitProgress:l})=>{logger.info(n),logger.debug(`Path: ${t}`);let u=a.connections??o.get(`connections`)??1,{maxWorkerCount:d,wasClamped:f}=resolveMaxWorkerCount(u);f&&logger.warn(`Connections value ${u} was clamped to ${d} for stability`),logger.debug(`Max worker count: ${d}`);let p=createSpinner$1(`Downloading`,`yellow`),m=``,h=await buildTrackDownloadInput(e),g=resolveMaxAttempts(a.retry??o.get(`retry`)??1);try{await retry({attempts:g,fn:async()=>{let n=await Download.init({input:h,output:t,tempDir:APP_TEMP_DIR,requestInit:{headers:i.headers,signal:s},proxy:a.proxyMedia||a.proxy||void 0,resume:buildTrackResume(i.url,e),maxRetries:a.retry,maxWorkerCount:d,onProgress:n=>{l(buildTrackProgressInfo({title:c,progress:n,track:e,filepath:t,target:r})),m=buildTrackProgressMessage(n),p.update(m)}});if(s?.aborted){logger.debug(`Track download skipped, already aborted: ${t}`);let e=Error(`The operation was aborted`);throw e.name=`AbortError`,e}await n.execute()},shouldRetry:e=>!(e instanceof Error&&e.name===`AbortError`),onRetry:async(e,n)=>{let r=e instanceof Error?e.message:String(e);logger.warn(`Track download retry ${n}/${g-1} scheduled for ${t}: ${r}`)}}),p.success(m)}catch(e){if(p.error(n),e instanceof Error&&e.name===`AbortError`)throw e;let t=e instanceof Error?e.message:String(e);throw logger.error(`Download track failed: ${t}`),e instanceof Error&&e.stack?logger.debug(e.stack):logger.debug(t),e instanceof Error?e:Error(t)}},isAbortError=e=>e instanceof Error&&e.name===`AbortError`,isAbortSignal=e=>!!e&&typeof e==`object`&&`aborted`in e&&`addEventListener`in e&&typeof e.addEventListener==`function`;var Downloader=class extends EventEmitter$1{#e;#t;#n;#r;#i;#a;constructor({settings:e,downloadsStorage:t}){super(),this.#i=e,this.#a=t}async start(e,t,n={id:crypto.randomUUID()},r,i){isAbortSignal(r)?(this.#r=new AbortController,r.addEventListener(`abort`,()=>{this.#r?.abort()})):this.#r=void 0;let a=new HttpClient({proxyUrl:e.proxy||e.proxyMeta||void 0});this.#e={...e},this.#t=t,this.#n={...n};let o;try{this.#o();let e=await selectPreparationStrategy(a,this.#t);e.matchedContentLabel&&logger.info(`Content Matched: ${e.matchedContentLabel}`),logger.info(`Parsing streams...`),o=await prepareSource({http:a,options:this.#e,source:this.#t,meta:this.#n,input:i,detection:e}),this.#e=o.options,this.#n=o.meta,await assertDownloadDirWritable(this.#i.get(`downloadDir`));let t=resolveDownloadOutputPlan({settings:this.#i,options:this.#e,source:this.#t,meta:this.#n,allTracks:o.allTracks});return this.#s(t.outputPath,t.resolvedFilenameWithoutExtension),await this.#c(o,t)}catch(e){if(isAbortError(e))throw e;let t=normalizeDownloaderError(e);throw this.emit(`error`,t),t}finally{await o?.dispose?.()}}#o(){logger.debug(`URL: ${this.#t.url}`);let e=`seasonNumber`in this.#n?this.#n.seasonNumber:void 0,t=`episodeNumber`in this.#n?this.#n.episodeNumber:void 0,n=`episodeTitle`in this.#n?this.#n.episodeTitle:``,r=[this.#n.title,e?`S${e}`:``,t?`E${t}`:``,n].filter(Boolean).join(` ∙ `);r&&logger.info(r)}#s(e,t){this.emit(`output-path`,e),logger.debug(`Resolved output path: ${e}`);let n=createDownloadMetadata(this.#n),r=this.#a.getByFilePath(e);r&&(r.title=n.title||t),logger.debug(`Emit download start`),this.emit(`start`,this.#a.jobs)}async#c(e,t){logger.debug(`Downloading tracks`);let n=[];assertUniqueTrackIds(e.tracks.all);for(let r of e.tracks.all){let e=buildTrackArtifactPath({outputDirectory:t.outputDirectory,resolvedFilenameWithoutExtension:t.resolvedFilenameWithoutExtension,track:r}),i=getTrackDescription(r,t.resolvedFilenameWithoutExtension);r.type===`subtitle`&&logger.debug(`URL: ${r.sourceUrl??`manifest subtitle track`}`),await downloadTrack({track:r,filepath:e,description:i,target:{finalName:t.filenameWithExtension,finalPath:t.outputPath},source:this.#t,options:this.#e,settings:this.#i,abortSignal:this.#r?.signal,title:createDownloadMetadata(this.#n).title,emitProgress:e=>{this.emit(`progress`,e,t.outputPath)}}),await exists(e)&&n.push(toDownloadArtifact(r,e))}return{downloaded:n,psshList:collectPsshList(e.tracks.all),selectedTracks:e.tracks.all}}};const describeUrl=e=>{try{let t=new URL(e),n=[...new Set(t.searchParams.keys())],r=n.length?`?${n.join(`,`)}`:``;return`${t.origin}${t.pathname}${r}`}catch{return e}},getContentKeys=async(e,t)=>{let{verbose:n,url:r,resolveLicense:i}=t,a=Buffer.from(e,`base64`),o=`cenc`,s=joinUrl(getApiBaseUrl(),`drm`),c=new RemoteCdm({keySystem:`com.widevine.alpha`,baseUrl:s,headers:{Authorization:`Bearer ${authState.accessToken}`}}),l=`initializing`,u=null;try{logger.debug(`DRM key request started: license=${describeUrl(r)}, remoteCdm=${describeUrl(s)}, psshLength=${e.length}, initDataBytes=${a.length}`),l=`requesting-media-key-system-access`;let t=requestMediaKeySystemAccess(c.keySystem,[]);l=`creating-media-keys`;let o=await t.createMediaKeys({cdm:c});l=`creating-session`,u=o.createSession(),l=`generating-license-request`,logger.debug(`Generating license request...`);let d=u.waitForLicenseRequest();await u.generateRequest(`cenc`,a);let f=await d;logger.debug(`License request of ${f.length} bytes generated for session ${u.sessionId}`),l=`requesting-license`,logger.debug(`Requesting license at ${r}`);let p=await i({url:r,pssh:e,data:new Uint8Array(f),sessionId:u.sessionId});if(p[0]===123||p[0]===60){logger.debug(`License response is not binary`);let e=Buffer.from(p).toString(`utf8`);if(logger.debug(e),e.includes(`<html>`))throw Error(`Invalid license response`)}l=`updating-session`,logger.debug(`Updating session...`),await u.update(new Uint8Array(p)),l=`waiting-for-key-statuses-change`,logger.debug(`Waiting for key statuses change...`);let m=await u.waitForKeyStatusesChange();logger.debug(`Keys count: ${m.length}`),l=`closing-session`,await u.close(),await u.remove();for(let e of m){let t=`Key: ${e.keyId}:${e.key}`;n?logger.info(t):logger.debug(t)}return m.map(e=>({kid:e.keyId,key:e.key}))}catch(e){throw logger.error(`Failed to get DRM content keys at stage=${l} for license=${describeUrl(r)} via remoteCdm=${describeUrl(s)}`),logErrorDetails(`DRM content key error`,e),e}finally{if(u){try{await u.close()}catch{}try{await u.remove()}catch{}}}},extractDecryptionKeys=async({keys:e,drm:t,psshList:n,drmDir:r,resolveLicense:i,licenseUrl:a})=>{logger.debug(`Extracting decryption keys`);let o=[],s=t&&`keys`in t?t.keys:[],c=[...e||[],...s];c.length&&o.push(...c);let l=a??(t&&`server`in t?t.server:void 0);if(i&&l){let e=[...new Set(n??[])];for(let[t,n]of e.entries()){logger.debug(`Resolving DRM keys for PSSH ${t+1}/${e.length} using ${describeUrl(l)}`),logger.debug(`PSSH: ${n}`);let a=await getContentKeys(n,{url:l,resolveLicense:i,clientDir:r});a&&a.length&&o.push(...a)}o.length||(logger.warn(`Can't get decryption keys`),logger.debug(`PSSH: ${e.join(`, `)}`))}return o};var Decrypter=class{strategy;constructor(e){this.strategy=e}async prepare(){await this.strategy.prepare?.()}async process(e){let t=await this.strategy.decryptFile(e);return e.cleanup&&await rm(e.input,{force:!0}),t}};const normalizeHex=e=>e.replaceAll(`-`,``).toLowerCase();var ShifroDecrypter=class{async decryptFile(e){let t=new Map;for(let n of e.keys){if(!n.kid)throw Error(`Shifro requires a KID for every decryption key`);t.set(normalizeHex(n.kid),normalizeHex(n.key))}return logger.debug(`Decrypting via shifro: ${e.input}`),await(await Decryption.init({input:new Input$2({source:new FilePathSource(e.input),keys:t}),output:new Output$1({target:new FilePathTarget(e.output)})})).execute(),e.output}};const cueBlockHeaderRegex=/(?:(.+?)\n)?((?:\d{2}:)?\d{2}:\d{2}\.\d{3})\s+-->\s+((?:\d{2}:)?\d{2}:\d{2}\.\d{3})([^\n]*)/g,preambleStartRegex=/^\uFEFF?WEBVTT(?:.|\n)*?\n{2}/,subtitleTimestampRegex=/(?:(\d{2}):)?(\d{2}):(\d{2})\.(\d{3})/,knownLanguageCodes={ar:`ara`,de:`deu`,en:`eng`,es:`spa`,fr:`fra`,hi:`hin`,it:`ita`,ja:`jpn`,ko:`kor`,pl:`pol`,pt:`por`,ru:`rus`,th:`tha`,tr:`tur`,uk:`ukr`,und:`und`,vi:`vie`,zh:`zho`},isSubtitleInput=e=>e===`subtitle`||e===`text`,parseMuxTimestamp=e=>{let t=e.trim().split(`:`);if(t.length<2||t.length>3)throw Error(`Invalid trim timestamp: ${e}`);let n=Number(t.at(-1)),r=Number(t.at(-2)),i=t.length===3?Number(t[0]):0;if(![i,r,n].every(e=>Number.isFinite(e)&&e>=0))throw Error(`Invalid trim timestamp: ${e}`);return i*3600+r*60+n},parseSubtitleTimestamp=e=>{let t=subtitleTimestampRegex.exec(e);if(!t)throw Error(`Invalid WebVTT timestamp: ${e}`);return 3600*1e3*Number(t[1]||`0`)+60*1e3*Number(t[2])+1e3*Number(t[3])+Number(t[4])},formatWebVttTimestamp=e=>{let t=Math.floor(e/(3600*1e3)),n=Math.floor(e%(3600*1e3)/(60*1e3)),r=Math.floor(e%(60*1e3)/1e3),i=e%1e3;return`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}.${i.toString().padStart(3,`0`)}`},formatSubtitleConversionIssues=e=>{let t=[e.invalidEntries?.length?`${e.invalidEntries.length} invalid entries`:void 0,e.invalidTimecodes?.length?`${e.invalidTimecodes.length} invalid timecodes`:void 0,e.invalidIndices?.length?`${e.invalidIndices.length} invalid indices`:void 0,e.timecodeIssues?.reversedTimecodes?.length?`${e.timecodeIssues.reversedTimecodes.length} reversed timecodes`:void 0,e.timecodeIssues?.overlappingTimecodes?.length?`${e.timecodeIssues.overlappingTimecodes.length} overlapping timecodes`:void 0].filter(Boolean);return t.length?` (${t.join(`, `)})`:``},convertSubtitleTextToWebVtt=e=>{let t=e.replaceAll(`\r
|
|
4
4
|
`,`
|
|
5
5
|
`).replaceAll(`\r`,`
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{closeSync as e,existsSync as t,mkdirSync as n,openSync as r,readSync as i,writeSync as a}from"node:fs";import o,{basename as s,dirname as c,join as l}from"node:path";import"urlpattern-polyfill";import u from"picocolors";import d,{readFile as f,readdir as p,rm as m,stat as h,unlink as g,writeFile as _}from"node:fs/promises";import{configureSync as ee,getConsoleSink as v,getLogger as te,withFilter as ne}from"@logtape/logtape";import{getFileSink as re}from"@logtape/file";import{getPrettyFormatter as ie}from"@logtape/pretty";import y,{EOL as ae,homedir as oe,tmpdir as se}from"node:os";import{arch as ce,platform as le,stdin as b,stdout as ue,version as de}from"node:process";import fe,{EventEmitter as x}from"node:events";import S from"conf";import{setTimeout as C}from"node:timers/promises";import{ALL_FORMATS as pe,DASH as me,DASH_FORMATS as he,HLS as ge,HLS_FORMATS as _e,Input as ve,MP3 as ye,MP4 as be,UrlSource as xe}from"dasha";import{createInterface as Se}from"node:readline/promises";import{Impit as Ce}from"impit";import we from"ky";import{Agent as Te,ProxyAgent as Ee}from"undici";import{parseSetCookie as De}from"cookie";import w from"metavm";import{confirm as Oe,input as ke,number as Ae,password as je,select as Me}from"@inquirer/prompts";var Ne=`azot`,T=`5.0.0-alpha.
|
|
1
|
+
import{closeSync as e,existsSync as t,mkdirSync as n,openSync as r,readSync as i,writeSync as a}from"node:fs";import o,{basename as s,dirname as c,join as l}from"node:path";import"urlpattern-polyfill";import u from"picocolors";import d,{readFile as f,readdir as p,rm as m,stat as h,unlink as g,writeFile as _}from"node:fs/promises";import{configureSync as ee,getConsoleSink as v,getLogger as te,withFilter as ne}from"@logtape/logtape";import{getFileSink as re}from"@logtape/file";import{getPrettyFormatter as ie}from"@logtape/pretty";import y,{EOL as ae,homedir as oe,tmpdir as se}from"node:os";import{arch as ce,platform as le,stdin as b,stdout as ue,version as de}from"node:process";import fe,{EventEmitter as x}from"node:events";import S from"conf";import{setTimeout as C}from"node:timers/promises";import{ALL_FORMATS as pe,DASH as me,DASH_FORMATS as he,HLS as ge,HLS_FORMATS as _e,Input as ve,MP3 as ye,MP4 as be,UrlSource as xe}from"dasha";import{createInterface as Se}from"node:readline/promises";import{Impit as Ce}from"impit";import we from"ky";import{Agent as Te,ProxyAgent as Ee}from"undici";import{parseSetCookie as De}from"cookie";import w from"metavm";import{confirm as Oe,input as ke,number as Ae,password as je,select as Me}from"@inquirer/prompts";var Ne=`azot`,T=`5.0.0-alpha.22`,Pe=`Azot`,E={name:Ne,version:T,description:`A powerful, extensible app for downloading videos`,homepage:`https://azot.mov`,author:`Vitaly Gashkov <vitalygashkov@vk.com>`,bin:{azot:`./dist/azot.mjs`,azt:`./dist/azt.mjs`},files:[`dist`,`types`],type:`module`,main:`./dist/api.mjs`,types:`./types/api.d.ts`,exports:{".":{types:`./types/api.d.ts`,import:`./dist/api.mjs`,"module-sync":`./dist/api.mjs`},"./context":{types:`./types/context.d.ts`,import:`./dist/context.mjs`,"module-sync":`./dist/context.mjs`},"./types/extension":`./types/extension.d.ts`,"./vitest":{import:`./dist/vitest.mjs`,"module-sync":`./dist/vitest.mjs`}},scripts:{start:`tsx --env-file-if-exists .env.local ./src/cli.ts`,dev:`tsx watch --env-file-if-exists .env.local ./src/cli.ts`,"clean:dist":`node -e "require('node:fs').rmSync('dist', { recursive: true, force: true })"`,"bundle:extensions":`node ./scripts/bundle-extensions.mjs`,build:`pnpm run clean:dist && pnpm run bundle:extensions && tsdown`,"pack:publish":`node ./scripts/publish-package.mjs --pack`,"publish:package":`node ./scripts/publish-package.mjs`,prepublishOnly:`node ./scripts/forbid-direct-publish.mjs`,typecheck:`tsc --noEmit -p tsconfig.json --composite false`,test:`vitest`},dependencies:{"@gitbeaker/rest":`^43.8.0`,"@inquirer/prompts":`^8.3.2`,"@logtape/file":`^2.0.4`,"@logtape/logtape":`^2.0.4`,"@logtape/pretty":`^2.0.4`,"@tanstack/query-core":`^5.90.20`,"@transcrobes/subs-convert":`^5.2.0`,"@tribute-tg/better-auth":`^2.1.10`,"better-auth":`^1.5.5`,conf:`^15.1.0`,cookie:`^1.1.1`,"cross-spawn":`^7.0.6`,dasha:`^4.2.0`,impit:`^0.13.0`,ky:`^1.14.3`,mediabunny:`^1.44.2`,metavm:`^1.4.5`,molnia:`workspace:*`,nanospinner:`^1.2.2`,okova:`^0.11.0`,open:`^11.0.0`,"p-queue":`^9.1.0`,picocolors:`^1.1.1`,"posthog-js":`^1.360.2`,semver:`^7.7.4`,shifro:`^1.1.4`,"telegram-better-auth":`^0.0.8`,undici:`^7.24.4`,"urlpattern-polyfill":`^10.1.0`,yargs:`^18.0.0`,yauzl:`^3.2.1`,zod:`^4.3.6`},devDependencies:{"@azot/shared":`workspace:*`,"@types/node":`^25.5.0`,"@types/semver":`^7.7.1`,"@types/yargs":`^17.0.35`,execa:`^9.6.1`,"javascript-obfuscator":`^4.1.1`,tsdown:`^0.22.0`,tsx:`^4.21.0`,typescript:`^6.0.3`},peerDependencies:{vitest:`^4.1.0`},peerDependenciesMeta:{vitest:{optional:!0}},engines:{node:`>=24.10`,pnpm:`>=10`},packageManager:`pnpm@11.0.0`,productName:Pe};`pkg`in process&&process.pkg,process.versions.electron,process.env.AZOT_E2E;const Fe=`v${T} ${le}-${ce} node-${de}`,Ie=`v${T}`,Le=Ne?.split(`/`)[0]?.split(`-`)[0]?.replace(`@`,``),D=Pe,Re={darwin:`macOS`,win32:`Windows`,linux:`Linux`}[process.platform],ze=`https://azot.mov/api`,Be=`LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFY243SFdZaXVyMWR3UU5pSmhFSGZHczZFM25rOAo4TXhOZVo5Ly85UWpaUStVNm5Ud0twMGJNTXJydGxHVVZ5ZWFGQS9lREtkL29QZHg0NXpmU0Rkc1lRPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg`,O=e=>{let r=typeof e==`string`?e:e[Re];return t(r)||n(r,{recursive:!0}),r},k=oe(),Ve=se(),A=O({Windows:process.env.APPDATA||l(k,`AppData`,`Roaming`),macOS:l(k,`Library`,`Application Support`),Linux:process.env.XDG_DATA_HOME||l(k,`.local`,`share`)}),j=O({Windows:process.env.APPDATA||l(k,`AppData`,`Roaming`),macOS:l(k,`Library`,`Application Support`),Linux:process.env.XDG_CONFIG_HOME||l(k,`.config`)});O({Windows:process.env.LOCALAPPDATA||l(k,`AppData`,`Local`),macOS:l(k,`Library`,`Caches`),Linux:process.env.XDG_CACHE_HOME||l(k,`.cache`)});const He=O({Windows:l(k,`Downloads`),macOS:l(k,`Downloads`),Linux:process.env.XDG_DOWNLOAD_DIR||l(k,`Downloads`)}),Ue=O({Windows:l(A,D),macOS:l(A,D),Linux:l(A,D.toLowerCase())}),We=O({Windows:l(j,D),macOS:l(j,D),Linux:l(j,D.toLowerCase())}),Ge=O({Windows:l(j,D,`logs`),macOS:l(k,`Library`,`Logs`,D),Linux:l(j,D.toLowerCase(),`logs`)}),Ke=l(Ve,D.toLowerCase()),M=O(l(Ue,`extensions`)),qe=O(l(M,`installed`)),Je=O(l(M,`work`)),Ye=l(M,`index.json`),Xe=l(We,`settings.json`),Ze=process.argv.includes(`-d`)||process.argv.includes(`--debug`)||process.env.NODE_ENV_ELECTRON_VITE===`development`||!!process.env.ELECTRON_CLI_ARGS;ee({sinks:{console:ne(v({formatter:ie({timestamp:`time`,messageColor:null,messageStyle:null,levelStyle:null,icons:!1,colors:!0,level:`FULL`,categoryWidth:0,categoryStyle:null,categoryTruncate:`end`,wordWrap:!0})}),Ze?`debug`:`info`),file:re(l(Ge,`Azot_${new Date().toISOString().split(`.`)[0].replace(`T`,`_`).replaceAll(`-`,``).replaceAll(`:`,``)}.log`),{flushInterval:0})},loggers:[{category:[],lowestLevel:`trace`,sinks:[`console`,`file`]},{category:[`logtape`,`meta`],lowestLevel:`error`,sinks:[`console`]}]});const N=te([]),Qe=async e=>{let t=await p(e).then(e=>e.filter(e=>e.endsWith(`.log`))),n=t=>l(e,t),r=t.map(e=>h(n(e)).catch(()=>null).then(t=>({stats:t,path:n(e)}))),i=(await Promise.all(r)).filter(Boolean);i.sort((e,t)=>t.stats.mtime.getTime()-e.stats.mtime.getTime());let a=i.slice(50).map(e=>g(e.path));await Promise.allSettled(a).catch(N.error)},$e=e=>{if(typeof e==`string`)return{message:e};if(e instanceof Error)return{message:e.message};if(e&&typeof e==`object`){let t=`message`in e?String(e.message):void 0,n=`code`in e?String(e.code):void 0;if(t||n)return{message:t||n||`Unknown error`,code:n}}return{message:`Unknown error`}},et=new fe,P=e=>new(`default`in S?S.default:S)(e);var F=class{#e;constructor(e){this.#e=P({cwd:c(e),configName:s(e,`.json`)})}get length(){return Object.keys(this.#e.store).length}clear(){this.#e.clear()}getItem(e){return this.#e.get(e)??null}key(e){return Object.keys(this.#e.store).at(e)??null}removeItem(e){this.#e.delete(e)}setItem(e,t){this.#e.set(e,t)}};const I=e=>{let t=[`}`,`{`,`%`,`>`,`<`,`^`,`;`,"`",`$`,`"`,`@`,`=`],n=e;for(let e in t)n=n.replaceAll(`/`,`_`).replaceAll(t[e],``);return n},L=(e,t,n)=>{let r={},i={};for(let a of n)for(let n of t){let t=new URLPattern(n,a).exec(e);t&&(Object.assign(r,t.pathname.groups),Object.assign(i,t.search.groups))}return{pathname:r,search:i}},R=(e=new Map)=>{let t=(t,n)=>{for(let r of e.keys())for(let i of e.get(r)||[]){let e=n===void 0||isNaN(n),a=t===void 0||isNaN(t),o=!1;if(o=a?r===n:(e?isNaN(r):r===n)&&i===t,o)return!0}return!1},n=(t,n)=>{let r=n||NaN,i=t||NaN;e.has(r)?e.get(r)?.add(i):e.set(r,new Set([i]))},r=()=>Array.from(e.values()).flatMap(e=>Array.from(e)),i=e.size,a=r();return{items:e,has:t,set:n,getMin:()=>Math.min(...a),getMax:()=>Math.max(...a),seasonsCount:i,episodesCount:a.length}},tt=new Intl.DateTimeFormat(`en-US`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}),nt=new Intl.DateTimeFormat(`en-US`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}),rt=()=>{let e=new Date;return tt.format(e).replaceAll(`/`,`-`).replace(`, `,`_`).replaceAll(`:`,`-`)},it=()=>{let e=new Date,t=e.getMilliseconds().toString().padStart(3,`0`);return`${nt.format(e)}.${t}`},at=e=>`${u.gray(it().slice(2))} ${e.padEnd(18,` `)}`,z=new class t extends x{static requestEventName=`form`;static responseEventName=`form:response`;title;#e=Promise.resolve();constructor(t={}){super(),this.title=t.title,this.listen(async t=>{let{title:n,description:i,fields:a,...o}=t,s={},c=Object.entries(a||o);if(!b.isTTY||process.platform===`win32`){let t=0,a=1,o=!1;if(process.platform===`win32`)try{t=r(`\\\\.\\CONIN$`,`r`),a=r(`\\\\.\\CONOUT$`,`w`),o=!0}catch{}try{for(let[e,{label:r,type:o}]of c){let c=o===`confirm`;s[e]=ct([n,i,r].filter(Boolean).join(`. `)+(c?` (y/n)`:``)+`: `,void 0,{inputFd:t,outputFd:a})??``}return s}finally{o&&(e(t),e(a))}}b.setEncoding&&b.setEncoding(`utf8`),b.isTTY&&b.setRawMode&&b.setRawMode(!1),b.resume();let l=Se({input:b,output:ue,terminal:!0});try{for(let[e,{label:t,type:r}]of c){let a=r===`confirm`,o=[n,i,t].filter(Boolean).join(`. `)+(a?` (y/n)`:``)+`: `;s[e]=await Promise.race([l.question(o),C(st,``)])}return s}finally{l.close()}})}async ask(e){let n=()=>new Promise(n=>{this.once(t.responseEventName,e=>{n(e)}),this.emit(t.requestEventName,e)}),r=this.#e.then(n,n);return this.#e=r.then(()=>void 0,()=>void 0),r}listen(e){this.addListener(t.requestEventName,async n=>{let r=await e(n);this.emit(t.responseEventName,r)})}},ot=async(e,t)=>{let n=t?.fields??{answer:{label:e}};return await z.ask({title:t?.title,description:e,fields:n})},st=12e4,ct=(e,t,n)=>{let r=n?.inputFd??0;a(n?.outputFd??1,e||``);let o=Buffer.alloc(1),s=``;for(;;){try{i(r,o,0,1,null)}catch(e){if(e.code===`EOF`)break;throw e}let e=o.toString(`utf-8`);if(e===`
|
|
2
2
|
`||e===`\r`){if(e===`\r`)try{i(r,o,0,1,null),o.toString(`utf-8`)}catch(e){if(e.code===`EOF`)break;throw e}break}s+=e}return s.trim()||t},B=e=>{let t=[];for(let n of e)try{let e=De(n),r={...e,expires:e.expires instanceof Date?e.expires.getTime():e.expires,sameSite:typeof e.sameSite==`boolean`?`strict`:e.sameSite};t.push(r)}catch(e){N.debug(e instanceof Error?e.stack??e.message:String(e))}return t},lt=async e=>{let t=await f(e,`utf8`).catch(()=>``);if(!t)return[];let n=t.split(ae).flatMap(e=>e.split(`
|
|
3
3
|
`)).filter(e=>!!e.trim()&&!e.startsWith(`# `)).map(e=>e.split(` `)),r=[];for(let e of n){let[t,n,i,a,o,s,c]=e;r.push({name:s,value:c,expires:Number(o),maxAge:void 0,domain:t.replace(`#HttpOnly_`,``),path:i,secure:a===`TRUE`,httpOnly:void 0,sameSite:void 0})}return r},ut=(e,t)=>e.name===t.name&&e.domain===t.domain&&e.path===t.path&&e.partitioned===t.partitioned,V=(e,t)=>{let n=[...e];for(let e of t){let t=n.findIndex(t=>ut(t,e));t>=0?n[t]=e:n.push(e)}return n},dt=(e,t)=>{if(typeof e!=`string`)return e;if(t===void 0)throw TypeError(`CookieStore.set(name, value) requires a value argument`);return{name:e,value:t}};var H=class{#e={};#t;#n;#r=!1;static parse(e){return B(e)}constructor({storagePath:e}={}){this.#n=e,this.#t=[]}async import(e,{removeSource:t=!0}={}){if(await this.#i(),!(await h(e).catch(()=>null))?.isFile())return 0;N.debug(`Importing cookies from ${e}`);let n=await lt(e);this.#t=V(this.#t,n);try{await this.#a(),t&&await m(e,{force:!0})}catch(e){throw e}return n.length}async#i(){if(!(!this.#n||this.#r)){if((await h(this.#n).catch(()=>null))?.isFile()){let e=await f(this.#n,`utf8`);this.#e=e?JSON.parse(e):{},this.#t=`cookies`in this.#e?this.#e.cookies:[]}this.#r=!0}}async#a(){if(!this.#n)return;let e=JSON.stringify({...this.#e,cookies:this.#t},null,2);await _(this.#n,e,`utf8`)}async get(e){await this.#i();let t=typeof e==`string`?e:e.name;return this.#t.find(e=>e.name===t)??null}async getAll(e){if(await this.#i(),!e)return this.#t;let t=typeof e==`string`?e:e.name;return this.#t.filter(e=>e.name===t)??null}async set(e,t){await this.#i();let n=dt(e,t);this.#t=V(this.#t,[n]),await this.#a()}async delete(e){if(await this.#i(),!e)this.#t=[];else{let t=typeof e==`string`?e:e.name;this.#t=this.#t.filter(e=>e.name!==t)}await this.#a()}toString(){return this.#t.map(e=>`${e.name}=${e.value}`).join(`; `)}};const U=we.default??we,ft=e=>e?e instanceof Headers?e.has(`User-Agent`):typeof e==`object`&&e?`User-Agent`in e||`user-agent`in e:!1:!1,W=e=>e instanceof URL?e:e instanceof Request?new URL(e.url):new URL(e);var G=class{cookieStore;headers;#e;#t;constructor(e={}){this.headers=new Headers,this.configure(e)}configure({maxRetries:e=3,proxyUrl:t,allowH2:n=!0,cookieStore:r,fetch:i}={}){this.cookieStore=r??this.cookieStore??new H;let a=t?new Ee({uri:t,allowH2:n}):new Te({allowH2:n}),o={retry:e};this.#e=U.create({dispatcher:a,proxy:t,fetch:i,...o});let s=new Ce({browser:`chrome142`,proxyUrl:t,ignoreTlsErrors:!0,followRedirects:!1}),c=async(e,t)=>{let n=await s.fetch.bind(s)(e,t);return new Response(n.body,n)};this.#t=U.create({fetch:this.#r.bind(this,i??c),...o})}async fetch(e,t={}){let n=await this.#o(e,t)??{},r=e instanceof Request?e:new Request(e,n),i=await this.#n(e,n.headers??r.headers),a=(ft(t?.headers)?this.#e:this.#t)[n.method?.toLowerCase()??r?.method?.toLowerCase()??`get`],o=n.body,s=await a(r.url,{...n,body:o,headers:i}),c=s.headers.getSetCookie();return c&&await this.setCookies(c),s}async#n(e,t){let n=this.appendHeaders(t),r=await this.cookieStore.getAll(),i=r.filter(t=>!t.domain||W(e).hostname.includes(t.domain));for(let e of r)i.find(t=>t.name===e.name)||e.domain||i.push(e);let a=i.map(e=>`${e.name}=${e.value}`).join(`; `);return a?(n.has(`cookie`)?n.get(`cookie`)||n.delete(`cookie`):n.set(`cookie`,a),n):(n.get(`cookie`)||n.delete(`cookie`),n)}async setCookies(e){let t=[];if(typeof e==`string`){let[n]=B([e]);n&&t.push(n)}else if(Array.isArray(e)&&typeof e.at(0)==`string`){let n=B(e);t.push(...n)}else Array.isArray(e)&&typeof e[0]!=`string`&&t.push(...e);if(!(!t||!t?.length))for(let e of t)await this.cookieStore.set(e)}appendHeaders(e){let t=new Headers(this.headers),n=e instanceof Headers?e.entries():Object.entries(e??{});for(let[e,r]of n)t.set(e,r);return t}setHeader(e,t){this.headers.set(e,t)}removeHeader(e){this.headers.delete(e)}async#r(e,t,n={}){let r=0,i=t instanceof Request?new URL(t.url):t,a=await this.#o(t,n)??{};for(a.redirect=`manual`;;){let t=await e(i,a),n=t.headers.getSetCookie();if(n.length&&await this.setCookies(n),!this.#a(t.status))return t;let o=t.headers.get(`location`);if(!o)return t;if(r>=20)throw Error(`Maximum redirect limit (20) exceeded`);r+=1,i=new URL(o,W(i)),a=this.#i(a,t.status)??{},a.headers=await this.#n(i,a.headers)}}#i(e={},t){let n=e.method?.toUpperCase()??`GET`;if(t===303||(t===301||t===302)&&n===`POST`){let t=new Headers(e.headers);return t.delete(`content-length`),t.delete(`content-type`),{...e,method:`GET`,body:void 0,headers:t,redirect:`manual`}}return{...e,redirect:`manual`}}#a(e){return[301,302,303,307,308].includes(e)}async#o(e,t={}){if(!(e instanceof Request))return{...t};let n=new Headers(e.headers);for(let[e,r]of new Headers(t.headers).entries())n.set(e,r);let r=(t.method??e.method).toUpperCase(),i={...t,method:r,headers:n};return t.body!==void 0||r===`GET`||r===`HEAD`?(i.body=t.body,i):(i.body=await e.clone().arrayBuffer(),i)}};const pt=new G,{COMMON_CONTEXT:mt}=w,ht=async e=>{let t=async e=>{let n=await d.readdir(e,{withFileTypes:!0});return(await Promise.all(n.map(async n=>{let r=n.name.endsWith(`.js`),i=n.name.endsWith(`.test.js`);return n.isDirectory()&&n.name!==`node_modules`?t(o.join(e,n.name)):n.isFile()&&r&&!i?[o.join(e,n.name)]:[]}))).flat()};return t(e)},gt=async(e,t={})=>{let n={};if(t.dirname){let e=await ht(t.dirname);for(let r of e)n[r.replace(t.dirname,`.`)]=!0}let r={context:w.createContext({...mt,...t.context}),dirname:t.dirname,access:{"node:crypto":!0,crypto:!0,azot:!0,...n,...t.access},type:t.format===`esm`?w.MODULE_TYPE.ECMA:w.MODULE_TYPE.COMMONJS};return await d.stat(e).then(()=>!0).catch(()=>!1)?await d.access(e).then(()=>!0).catch(()=>!1)?await w.readScript(e,r):w.createScript(t.name??`default`,e,r):_t(e,t.name??`default`,r)},_t=(e,t=`Eval`,n)=>{try{return w.createScript(t,e,n)}catch(t){return console.debug(t),console.debug(e),console.error(`Syntax Error: ${t.message}`),null}},vt=(e,t=1)=>typeof e==`string`?Array.from({length:t},()=>e[Math.floor(Math.random()*e.length)]):!Array.isArray(e)||e.length===0?[]:Array.from({length:t},()=>e[Math.floor(Math.random()*e.length)]),yt=new class e extends x{static requestEventName=`feedback`;static responseEventName=`feedback:response`;#e=Promise.resolve();async ask(t){let n=()=>new Promise(n=>{this.once(e.responseEventName,e=>{n(e)}),this.emit(e.requestEventName,t)}),r=this.#e.then(n,n);return this.#e=r.then(()=>void 0,()=>void 0),r}listen(t){this.addListener(e.requestEventName,async n=>{let r=await t(n);this.emit(e.responseEventName,r)})}},K=e=>{if(!e||typeof e!=`object`)return!1;let t=`name`in e?String(e.name):``;return t===`ExitPromptError`||t===`AbortPromptError`},bt=e=>e&&e[0].toUpperCase()+e.slice(1),q=(e,t=!1)=>{if(typeof e==`boolean`)return e;if(typeof e!=`string`)return t;let n=e.trim().toLowerCase();return[`1`,`true`,`yes`,`y`,`on`].includes(n)?!0:[`0`,`false`,`no`,`n`,`off`].includes(n)?!1:t},J=(e,t=0)=>{if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e!=`string`)return t;let n=Number(e);return Number.isFinite(n)?n:t},xt=e=>{switch(e.type){case`checkbox`:return q(e.defaultValue,!1);case`number`:return J(e.defaultValue,0);default:return e.defaultValue??``}},St=(e,t)=>{switch(e.type){case`checkbox`:return q(t,q(e.defaultValue,!1));case`number`:return J(t,J(e.defaultValue,0));default:return typeof t==`string`?t:t==null?e.defaultValue??``:String(t)}},Ct=e=>{let t=Object.entries(e).map(([e,t])=>[e,xt(t)]);return Object.fromEntries(t)},Y=(e,t)=>{let n=Object.entries(e).map(([e,n])=>[e,St(n,t[e])]);return Object.fromEntries(n)},wt=e=>!!e&&typeof e==`object`&&`fields`in e,Tt=e=>{switch(e){case`password`:case`number`:case`checkbox`:return e;default:return`text`}},Et=e=>{let t=Object.fromEntries(Object.entries(e.fields).map(([e,t])=>[e,{type:Tt(t.type),title:t.label||e,description:t.description,placeholder:t.placeholder,defaultValue:t.defaultValue??t.value,required:t.required,autoFocus:t.autoFocus}]));return{message:e.description??``,options:{title:e.title,form:t,primaryAction:e.actions?.primaryAction,secondaryAction:e.actions?.secondaryAction}}},X=async e=>{e?.onAction&&await e.onAction()},Z=async(e,t)=>{if(!t.length)return`dismiss`;try{return await Me({message:e,loop:!1,choices:t.map(e=>({name:e.action.title,value:e.kind}))})}catch(e){if(K(e))return`dismiss`;throw e}},Dt=new Set([`http:`,`https:`,`mailto:`]),Ot=e=>{try{return Dt.has(new URL(e).protocol)}catch{return!1}},kt=async(e,t)=>{if(!Ot(e)){N.warn(`Blocked unsupported external URL protocol: ${e}`);return}if(t){let{default:t}=await import(`open`);await t(e);return}let{shell:n}=await import(`electron`);await n.openExternal(e)},At=({isCLI:e,resolveTitle:t,requestPrompt:n})=>{let r=(t,n,r)=>{let i=typeof t==`string`?t:t?.toString();return i?.trim()&&kt(i,e).catch(e=>{N.error(`Failed to open URL: ${i}`),N.debug(e instanceof Error?e.message:String(e))}),null},i=async(n,r={})=>{let i=t(r.title)??`Azot`,a=[r.primaryAction?{kind:`primary`,action:r.primaryAction}:null,r.secondaryAction?{kind:`secondary`,action:r.secondaryAction}:null].filter(Boolean);if(e){if(!a.length)return N.info(n);let e=await Z(n,a);e===`primary`&&await X(r.primaryAction),e===`secondary`&&await X(r.secondaryAction);return}let o=(await yt.ask({variant:`notify`,title:i,message:n,style:r.style,primaryAction:r.primaryAction?{title:r.primaryAction.title,style:r.primaryAction.style}:void 0,secondaryAction:r.secondaryAction?{title:r.secondaryAction.title,style:r.secondaryAction.style}:void 0})).action??`dismiss`;o===`primary`&&await X(r.primaryAction),o===`secondary`&&await X(r.secondaryAction)},a=async(n,r={})=>{let i=t(r.title)??`Azot`,a=!!r.primaryAction||!!r.secondaryAction,o=r.primaryAction??{title:`OK`},s=r.secondaryAction??{title:`Cancel`,style:`cancel`};if(e){if(a){let e=await Z(n,[{kind:`primary`,action:o},{kind:`secondary`,action:s}]);return e===`primary`?(await X(o),!0):(e===`secondary`&&await X(s),!1)}try{let e=await Oe({message:n,default:!0});return e?await X(r.primaryAction):await X(r.secondaryAction),e}catch(e){if(K(e))return!1;throw e}}let c=await yt.ask({variant:`confirm`,title:i,message:n,style:r.style,primaryAction:{title:o.title,style:o.style},secondaryAction:{title:s.title,style:s.style}}),l=c.action===`primary`;return l?await X(o):c.action===`secondary`&&await X(s),l},o=async(r,i)=>{let a=Ct(i.form),o=Object.entries(i.form),s=!!i.primaryAction||!!i.secondaryAction,c=i.primaryAction??{title:`Submit`},l=i.secondaryAction??{title:`Cancel`,style:`cancel`};if(e){let e={};try{for(let[t,n]of o){let r=[n.title||t,n.description].filter(Boolean).join(` - `);if(n.type===`checkbox`){e[t]=await Oe({message:r,default:q(n.defaultValue,!1)});continue}if(n.type===`number`){let i=J(n.defaultValue,NaN);e[t]=await Ae({message:r,default:Number.isFinite(i)?i:void 0,validate:e=>(e===void 0||Number.isNaN(e))&&n.required?`This field is required`:!0});continue}if(n.type===`password`){e[t]=await je({message:r,validate:n.required?e=>String(e??``).trim()?!0:`This field is required`:void 0});continue}e[t]=await ke({message:r,default:n.defaultValue,validate:n.required?e=>String(e??``).trim()?!0:`This field is required`:void 0})}}catch(e){if(K(e))return a;throw e}if(!s)return Y(i.form,e);let t=await Z(r,[{kind:`primary`,action:c},{kind:`secondary`,action:l}]);return t===`primary`?(await X(c),Y(i.form,e)):(t===`secondary`&&await X(l),a)}let u=Object.fromEntries(o.map(([e,t])=>[e,{type:t.type,label:t.title||e,description:t.description,placeholder:t.placeholder,defaultValue:t.defaultValue,value:t.defaultValue,required:t.required,autoFocus:t.autoFocus}])),d=await n({title:t(i.title),description:r,fields:u,actions:s?{primaryAction:{title:c.title,style:c.style},secondaryAction:{title:l.title,style:l.style}}:void 0}),f=d.__action??`primary`,p={...d};return delete p.__action,f===`primary`?(await X(i.primaryAction),Y(i.form,p)):(f===`secondary`&&await X(i.secondaryAction),a)};return{notify:i,confirm:a,askPrompt:async(e,t)=>{if(wt(e)){let t=Et(e);return o(t.message,t.options)}if(!t)throw TypeError(`prompt(message, options) requires a form definition`);return o(e,t)},openWindow:r}},Q=(e,t,n)=>{Object.getOwnPropertyDescriptor(e,t)||Object.defineProperty(e,t,n)},jt=()=>{Q(Uint8Array.prototype,`toBase64`,{value:function(){return Buffer.from(this).toString(`base64`)},writable:!0,configurable:!0}),Q(Uint8Array.prototype,`toHex`,{value:function(){return Buffer.from(this).toString(`hex`)},writable:!0,configurable:!0}),Q(Uint8Array,`fromBase64`,{value:function(e){return new Uint8Array(Buffer.from(e,`base64`))},writable:!0,configurable:!0}),Q(Uint8Array,`fromHex`,{value:function(e){return new Uint8Array(Buffer.from(e,`hex`))},writable:!0,configurable:!0})},Mt=new Map([[24,[`Sequoia`,`15`]],[23,[`Sonoma`,`14`]],[22,[`Ventura`,`13`]],[21,[`Monterey`,`12`]],[20,[`Big Sur`,`11`]],[19,[`Catalina`,`10.15`]],[18,[`Mojave`,`10.14`]],[17,[`High Sierra`,`10.13`]],[16,[`Sierra`,`10.12`]],[15,[`El Capitan`,`10.11`]],[14,[`Yosemite`,`10.10`]],[13,[`Mavericks`,`10.9`]],[12,[`Mountain Lion`,`10.8`]],[11,[`Lion`,`10.7`]],[10,[`Snow Leopard`,`10.6`]],[9,[`Leopard`,`10.5`]],[8,[`Tiger`,`10.4`]],[7,[`Panther`,`10.3`]],[6,[`Jaguar`,`10.2`]],[5,[`Puma`,`10.1`]]]),$=()=>{switch(y.type()){case`Darwin`:return`macOS`;case`Windows_NT`:return`Windows`;default:return`Linux`}},Nt=()=>{let e=Number(y.release().split(`.`)[0]),[t,n]=Mt.get(e)||[`Unknown`,``];return{name:t,version:n}},Pt=()=>{switch($()){case`macOS`:return Nt().version;case`Windows`:return y.release();case`Linux`:return y.release()}},Ft=e=>{let t=process.version.replace(/^v/,``),n=[{brand:`Azot`,version:e.split(`.`).slice(0,2).join(`.`)},{brand:`Node.js`,version:t.split(`.`).slice(0,1).join(`.`)}];return{mobile:!1,platform:$(),brands:n,getHighEntropyValues:async r=>{let i={mobile:!1,platform:$(),brands:n};return r.includes(`architecture`)&&(i.architecture=y.arch()),r.includes(`platform`)&&(i.platform=$()),r.includes(`platformVersion`)&&(i.platformVersion=Pt()),r.includes(`fullVersionList`)&&(i.fullVersionList=[{brand:`Azot`,version:e},{brand:`Node.js`,version:t}]),i}}},It=({name:e=`extension`,dir:t=process.cwd(),title:n}={})=>{jt();let r=O(l(t,e)),i=new F(l(r,`storage.json`)),a=new H({storagePath:l(r,`cookies.json`)}),o=new G({cookieStore:a}),s=(e,t,n)=>e.split(t)[1]?.split(n)[0]?.trim(),c={sanitizeString:I,execUrlPatterns:L,extendEpisodes:R,between:s,getRandomElements:vt},u=n?bt(n):void 0,{notify:d,confirm:f,askPrompt:p,openWindow:m}=At({isCLI:!0,resolveTitle:e=>e||u,requestPrompt:async e=>(e.title||=u,await z.ask(e))});class h extends ve{constructor(e){super({...e,formats:e.formats??pe})}}class g extends xe{constructor(e,t={}){super(e,{fetchFn:o.fetch.bind(o),...t,requestInit:{...t.requestInit,headers:{...o.headers,...t.requestInit?.headers}}})}}let _={defineExtension:e=>e,version:E.version,sleep:C,sanitizeString:I,execUrlPatterns:L,extendEpisodes:R,between:s,getRandomElements:vt,utils:c,notify:d,confirm:f,prompt:p,Input:h,UrlSource:g,ALL_FORMATS:pe,DASH:me,DASH_FORMATS:he,HLS:ge,HLS_FORMATS:_e,MP4:be,MP3:ye,input:ot,ask:p};class ee{get cookie(){return a.toString()}}let v={fetch:o.fetch.bind(o),Response,Request,Headers,AbortController,AbortSignal,URL,URLSearchParams,URLPattern,open:m,Blob,structuredClone,btoa,atob,TextEncoder,TextDecoder,Uint8Array,crypto,console:{log:console.log,info:N.info.bind(N),warn:N.warn.bind(N),error:(...e)=>{let t=String(e[0]??`Unknown error`);et.emit(`error`,{message:t}),N.error(t)},trace:N.trace.bind(N),debug:N.debug.bind(N)},Event,EventTarget,localStorage:i,cookieStore:a,document:new ee,eval:e=>_t(e)?.exports,navigator:{appName:`Azot`,appVersion:E.version,platform:process.platform,userAgent:`Azot/${E.version}`,userAgentData:Ft(E.version)}};return{http:o,question:z,common:c,Streamyx:_,Azot:_,window:v,...v}};export{Ie as A,Xe as C,ze as D,D as E,Be as O,qe as S,Le as T,Ke as _,z as a,M as b,F as c,$e as d,Qe as f,Ge as g,Ue as h,pt as i,E as j,Fe as k,P as l,We as m,gt as n,rt as o,N as p,G as r,at as s,It as t,et as u,He as v,O as w,Ye as x,Je as y};
|
package/dist/context.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./context-
|
|
1
|
+
import{t as e}from"./context-D70eLebO.mjs";export{e as createContext};
|
package/dist/vitest.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./context-
|
|
1
|
+
import{t as e}from"./context-D70eLebO.mjs";import"./context.mjs";import{beforeEach as t,vi as n}from"vitest";const r=e();Object.entries(r).forEach(([e,t])=>{n.stubGlobal(e,t)}),n.mock(`azot`,async()=>r.Azot),t(async()=>{r.localStorage.clear();let e=await r.cookieStore.getAll();for(let t of e)await r.cookieStore.delete(t.name);n.clearAllMocks()});export{};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "azot",
|
|
3
|
-
"version": "5.0.0-alpha.
|
|
3
|
+
"version": "5.0.0-alpha.22",
|
|
4
4
|
"description": "A powerful, extensible app for downloading videos",
|
|
5
5
|
"homepage": "https://azot.mov",
|
|
6
6
|
"author": "Vitaly Gashkov <vitalygashkov@vk.com>",
|
|
@@ -68,6 +68,11 @@
|
|
|
68
68
|
"peerDependencies": {
|
|
69
69
|
"vitest": "^4.1.0"
|
|
70
70
|
},
|
|
71
|
+
"peerDependenciesMeta": {
|
|
72
|
+
"vitest": {
|
|
73
|
+
"optional": true
|
|
74
|
+
}
|
|
75
|
+
},
|
|
71
76
|
"engines": {
|
|
72
77
|
"node": ">=24.10",
|
|
73
78
|
"pnpm": ">=10"
|