azot 5.0.0-alpha.1 → 5.0.0-alpha.2

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/out/main.js CHANGED
@@ -1,3 +1 @@
1
- const e=require(`./chunk-nOFOJqeH.js`),t=e.__toESM(require(`node:os`)),n=e.__toESM(require(`node:path`)),r=e.__toESM(require(`node:timers/promises`)),i=e.__toESM(require(`node:fs/promises`)),a=e.__toESM(require(`@logtape/logtape`)),o=e.__toESM(require(`@logtape/file`)),s=e.__toESM(require(`@logtape/pretty`)),c=e.__toESM(require(`node:fs`)),l=e.__toESM(require(`node:process`));require(`urlpattern-polyfill`);const u=e.__toESM(require(`node:events`)),d=e.__toESM(require(`node:readline/promises`)),f=e.__toESM(require(`node:url`)),p=e.__toESM(require(`undici`)),m=e.__toESM(require(`impit`)),h=e.__toESM(require(`metavm`));require(`picocolors`),require(`nanospinner`);const g=e.__toESM(require(`conf`));var _=`azot`,v=`Azot`,ee=`5.0.0-alpha.1`,y=`out/main.js`,b={azt:`out/azt.js`},x=`azot.d.ts`,S=[`out`,`azot.d.ts`,`.npmrc`],C=`Vitaly Gashkov <vitalygashkov@vk.com>`,w=`A powerful, extensible app for downloading videos`,te={type:`git`,url:`https://github.com/azot-labs/azot.git`},ne=`https://azot.so`,re={start:`tsx --env-file .env ./src/main/cli.ts`,preview:`electron-vite preview --config vite.desktop.config.mjs`,dev:`electron-vite dev --config vite.desktop.config.mjs --watch`,test:`vitest`,coverage:`vitest run --coverage`,"bundle:lib":`tsdown`,"bundle:cli":`electron-vite build --config vite.cli.config.mjs`,bundle:`npm run bundle:cli && electron-vite build --config vite.desktop.config.mjs`,build:`npm run bundle && electron-builder build --config electron-builder.config.js`,"build:mac":`npm run bundle && electron-builder build --mac --config electron-builder.config.js`,"build:win":`npm run bundle && electron-builder build --win --config electron-builder.config.js`,"build:linux":`npm run bundle && electron-builder build --linux --config electron-builder.config.js`,publish:`npm run bundle && electron-builder build --publish always --config electron-builder.config.js`,typecheck:`npm run typecheck:node && npm run typecheck:web`,"typecheck:node":`tsc --noEmit -p tsconfig.node.json --composite false`,"typecheck:web":`vue-tsc --noEmit -p tsconfig.web.json --composite false`,format:`prettier --write .`,lint:`eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts,.vue --fix`},ie={node:`22`},ae=[`darwin`,`linux`,`win32`],oe=[{type:`individual`,url:`https://t.me/tribute/app?startapp=dqW2`}],se={"@electron-toolkit/preload":`^3.0.2`,"@electron-toolkit/utils":`^4.0.0`,"@inquirer/prompts":`^7.8.3`,"@logtape/file":`^1.0.4`,"@logtape/logtape":`^1.0.4`,"@logtape/pretty":`^1.0.4`,"@tanstack/query-core":`^5.85.5`,"@tribute-tg/better-auth":`^1.0.9`,"better-auth":`^1.3.7`,bytenode:`^1.5.7`,conf:`^14.0.0`,"cross-spawn":`^7.0.6`,dasha:`3.1.8`,"electron-squirrel-startup":`^1.0.1`,"electron-updater":`^6.6.2`,impit:`^0.5.4`,"javascript-obfuscator":`^4.1.1`,metavm:`^1.4.4`,molnia:`^0.1.5`,nanospinner:`^1.2.2`,okova:`^0.9.3`,"p-queue":`^8.1.0`,picocolors:`^1.1.1`,tsdown:`^0.14.2`,undici:`^7.15.0`,"urlpattern-polyfill":`^10.1.0`,yargs:`^18.0.0`,yauzl:`^3.2.0`},ce={"@electron-toolkit/eslint-config":`^2.1.0`,"@electron-toolkit/eslint-config-prettier":`^3.0.0`,"@electron-toolkit/eslint-config-ts":`^3.1.0`,"@electron-toolkit/tsconfig":`^1.0.1`,"@eslint/js":`^9.26.0`,"@iconify/vue":`^4.3.0`,"@intlify/unplugin-vue-i18n":`^6.0.8`,"@rushstack/eslint-patch":`^1.10.5`,"@tailwindcss/vite":`^4.1.12`,"@tanstack/vue-query":`^5.85.5`,"@types/node":`^24.3.0`,"@types/wicg-file-system-access":`^2023.10.5`,"@types/yargs":`^17.0.33`,"@vee-validate/zod":`^4.15.1`,"@vitejs/plugin-vue":`^6.0.1`,"@vue/eslint-config-prettier":`^10.2.0`,"@vue/eslint-config-typescript":`^14.5.0`,"@vueuse/core":`^13.7.0`,"class-variance-authority":`^0.7.1`,clsx:`^2.1.1`,dotenv:`^17.2.1`,electron:`37.3.1`,"electron-builder":`^26.0.12`,"electron-vite":`^4.0.0`,eslint:`^9.34.0`,"eslint-plugin-import":`^2.32.0`,"eslint-plugin-n":`^17.21.3`,"eslint-plugin-vue":`^10.4.0`,execa:`^9.6.0`,globals:`^16.3.0`,"lucide-vue-next":`^0.541.0`,"non.geist":`^1.0.4`,pinia:`^3.0.3`,postcss:`^8.5.6`,prettier:`^3.6.2`,"reka-ui":`^2.4.1`,sass:`^1.90.0`,"tailwind-merge":`^3.3.1`,tailwindcss:`^4.1.12`,"tailwindcss-animate":`^1.0.7`,tsx:`^4.20.5`,typescript:`^5.9.2`,"vee-validate":`^4.15.1`,vite:`^7.1.3`,"vite-plugin-static-copy":`^3.1.2`,vitest:`^3.2.4`,vue:`^3.5.18`,"vue-eslint-parser":`^10.2.0`,"vue-i18n":`^11.1.11`,"vue-sonner":`^1.3.0`,"vue-tsc":`^3.0.6`,zod:`^3.25.42`},T={name:_,productName:v,version:ee,main:y,bin:b,types:x,files:S,author:C,description:w,repository:te,homepage:ne,scripts:re,engines:ie,os:ae,funding:oe,dependencies:se,devDependencies:ce};const le=`pkg`in process&&process.pkg!==void 0,E=!!process.versions.electron&&!1,D=!E,ue=`v${T.version} ${l.platform}-${l.arch} node-${l.version}`,de=`v${T.version}`,fe=T.name,O=T.productName,k={darwin:`macOS`,win32:`Windows`,linux:`Linux`},A=k[process.platform],j=e=>{let t=typeof e==`string`?e:e[A];return(0,c.existsSync)(t)||(0,c.mkdirSync)(t,{recursive:!0}),t},M=(0,t.homedir)(),N=(0,t.tmpdir)(),P=j({Windows:process.env.APPDATA||(0,n.join)(M,`AppData`,`Roaming`),macOS:(0,n.join)(M,`Library`,`Application Support`),Linux:process.env.XDG_DATA_HOME||(0,n.join)(M,`.local`,`share`)}),F=j({Windows:process.env.APPDATA||(0,n.join)(M,`AppData`,`Roaming`),macOS:(0,n.join)(M,`Library`,`Application Support`),Linux:process.env.XDG_CONFIG_HOME||(0,n.join)(M,`.config`)}),pe=j({Windows:process.env.LOCALAPPDATA||(0,n.join)(M,`AppData`,`Local`),macOS:(0,n.join)(M,`Library`,`Caches`),Linux:process.env.XDG_CACHE_HOME||(0,n.join)(M,`.cache`)}),me=j({Windows:(0,n.join)(M,`Downloads`),macOS:(0,n.join)(M,`Downloads`),Linux:process.env.XDG_DOWNLOAD_DIR||(0,n.join)(M,`Downloads`)}),I=j({Windows:(0,n.join)(P,O),macOS:(0,n.join)(P,O),Linux:(0,n.join)(P,O.toLowerCase())}),L=j({Windows:(0,n.join)(F,O),macOS:(0,n.join)(F,O),Linux:(0,n.join)(F,O.toLowerCase())}),R=j({Windows:(0,n.join)(F,O,`logs`),macOS:(0,n.join)(M,`Library`,`Logs`,O),Linux:(0,n.join)(F,O.toLowerCase(),`logs`)}),he=(0,n.join)(N,O.toLowerCase()),z=j((0,n.join)(I,`extensions`)),ge=j((0,n.join)(z,`installed`)),_e=j((0,n.join)(z,`work`)),ve=(0,n.join)(L,`settings.json`),B=process.argv.includes(`-d`)||process.argv.includes(`--debug`)||process.env.NODE_ENV_ELECTRON_VITE===`development`||!!process.env.ELECTRON_CLI_ARGS,V=()=>{let e=new Date().toISOString().split(`.`)[0].replace(`T`,`_`).replaceAll(`-`,``).replaceAll(`:`,``);return`Azot_${e}.log`},H=()=>(0,n.join)(R,V()),ye=(0,s.getPrettyFormatter)({timestamp:`time`,levelStyle:null,icons:!1,colors:!0,level:`FULL`,categoryWidth:0,categoryStyle:null,categoryTruncate:`end`,wordWrap:!0});(0,a.configureSync)({sinks:{console:(0,a.withFilter)((0,a.getConsoleSink)({formatter:ye}),B?`debug`:`info`),file:(0,o.getFileSink)(H(),{flushInterval:0})},loggers:[{category:[],lowestLevel:`trace`,sinks:[`console`,`file`]},{category:[`logtape`,`meta`],lowestLevel:`error`,sinks:[`console`]}]});const U=(0,a.getLogger)([]),W=e=>{let t=[`}`,`{`,`%`,`>`,`<`,`^`,`;`,"`",`$`,`"`,`@`,`=`],n=e;for(let e in t)n=n.replaceAll(`/`,`_`).replaceAll(t[e],``);return n},G=(e,t,n)=>{let r={},i={};for(let a of n)for(let n of t){let t=new URLPattern(n,a),o=t.exec(e);o&&(Object.assign(r,o.pathname.groups),Object.assign(i,o.search.groups))}return{pathname:r,search:i}},K=(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(),o=a.length,s=()=>Math.min(...a),c=()=>Math.max(...a);return{items:e,has:t,set:n,getMin:s,getMax:c,seasonsCount:i,episodesCount:o}},be=new Intl.DateTimeFormat(`en-US`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}),xe=new Intl.DateTimeFormat(`en-US`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1});var Se=class e extends u.EventEmitter{static{this.requestEventName=`form`}static{this.responseEventName=`form:response`}constructor(){super(),D&&this.listen(async e=>{let t=(0,d.createInterface)({input:l.stdin,output:l.stdout}),{title:n,description:i,fields:a,...o}=e,s={};for(let[e,{label:c,type:l}]of Object.entries(a||o)){let a=l===`confirm`,o=[n,i,c].filter(Boolean).join(`. `)+(a?` (y/n)`:``)+`: `,u=await Promise.race([t.question(o),(0,r.setTimeout)(we,``)]);s[e]=u}return t.close(),s})}async ask(t){let n=new Promise(n=>{this.emit(e.requestEventName,t),this.addListener(e.responseEventName,e=>{n(e)})});return n}listen(t){this.addListener(e.requestEventName,async n=>{let r=await t(n);this.emit(e.responseEventName,r)})}};const q=new Se,Ce=async(e,t)=>{let n=t?.fields??{answer:{label:e}},r=await q.ask({title:t?.title,description:e,fields:n});return r},we=12e4,Te=(e,t)=>{(0,c.writeSync)(1,e||``);let n=Buffer.alloc(1),r=``;for(;;){try{(0,c.readSync)(0,n,0,1,null)}catch(e){if(e.code===`EOF`)break;throw e}let e=n.toString(`utf-8`);if(e===`
2
- `||e===`\r`){if(e===`\r`)try{(0,c.readSync)(0,n,0,1,null),n.toString(`utf-8`)}catch(e){if(e.code===`EOF`)break;throw e}break}r+=e}return r.trim()||t},Ee=e=>{let t=e.expires instanceof Date?e.expires.getTime():e.expires,n;return e.sameSite===`Strict`?n=`strict`:e.sameSite===`Lax`&&(n=`lax`),{name:e.name,value:e.value,expires:t,domain:e.domain,path:e.path,sameSite:n,partitioned:!1,maxAge:e.maxAge,secure:e.secure,httpOnly:e.httpOnly,unparsed:e.unparsed}},J=e=>{let t=[];for(let n of e)try{let e=(0,p.parseCookie)(n);e&&t.push(Ee(e))}catch(e){U.debug(e)}return t},De=async e=>{let n=await(0,i.readFile)(e,`utf8`).catch(()=>``);if(!n)return[];let r=n.split(t.EOL).flatMap(e=>e.split(`
3
- `)),a=r.filter(e=>!!e.trim()&&!e.startsWith(`# `)),o=a.map(e=>e.split(` `)),s=[];for(let e of o){let[t,n,r,i,a,o,c]=e;s.push({name:o,value:c,expires:Number(a),maxAge:void 0,domain:t.replace(`#HttpOnly_`,``),path:r,secure:i===`TRUE`,httpOnly:void 0,sameSite:void 0,unparsed:e})}return s};var Y=class{#data={};#cookies;#storagePath;#hasBeenRead=!1;static parse(e){return J(e)}constructor({storagePath:e}={}){this.#storagePath=e,this.#cookies=[]}async import(e){let t=await(0,i.stat)(e).catch(()=>null);t?.isFile()&&(this.#cookies=await De(e),await(0,i.rm)(e,{recursive:!0,force:!0}))}async#read(){if(!this.#storagePath||this.#hasBeenRead)return;let e=await(0,i.stat)(this.#storagePath).catch(()=>null);if(e?.isFile()){let e=await(0,i.readFile)(this.#storagePath,`utf8`);this.#data=e?JSON.parse(e):{},this.#cookies=`cookies`in this.#data?this.#data.cookies:[]}this.#hasBeenRead=!0}async#write(){if(!this.#storagePath)return;let e=JSON.stringify({...this.#data,cookies:this.#cookies},null,2);await(0,i.writeFile)(this.#storagePath,e,`utf8`)}async get(e){await this.#read();let t=typeof e==`string`?e:e.name;return this.#cookies.find(e=>e.name===t)??null}async getAll(e){if(await this.#read(),!e)return this.#cookies;let t=typeof e==`string`?e:e.name;return this.#cookies.filter(e=>e.name===t)??null}async set(e){await this.#read(),this.#cookies=this.#cookies.filter(t=>!(t.name===e.name&&t.domain===e.domain)),this.#cookies.push(e),await this.#write()}async delete(e){if(await this.#read(),!e)this.#cookies=[];else{let t=typeof e==`string`?e:e.name;this.#cookies=this.#cookies.filter(e=>e.name!==t)}}toString(){return this.#cookies.map(e=>`${e.name}=${e.value}`).join(`; `)}},X=class{#impit;#agent;#retryThreshold;#retryDelayMs;#failures=new Map;constructor(e={}){this.headers=new Headers,this.#retryThreshold=3,this.#retryDelayMs=1500,this.configure(e)}configure({proxyUrl:e,allowH2:t=!0,maxRedirections:n=3,maxRetries:r=3,cookieStore:i}={}){this.cookieStore=i??this.cookieStore??new Y,this.#impit=new m.Impit({browser:`chrome`,ignoreTlsErrors:!0,proxyUrl:e,followRedirects:!0,maxRedirects:n});let{redirect:a,retry:o}=p.interceptors;e?this.#agent=new p.ProxyAgent({uri:e,allowH2:t}).compose(a({maxRedirections:n}),o({maxRetries:r})):this.#agent=new p.Agent({allowH2:t}).compose(a({maxRedirections:n}),o({maxRetries:r}))}get retries(){return this.#retryThreshold}async fetch(e,t={}){let n=t.headers&&(t.headers instanceof Headers?t.headers.has(`User-Agent`):`User-Agent`in t.headers),r=this.appendHeaders(t?.headers||{}),i=await this.cookieStore.getAll(),a=i.filter(t=>!t.domain||new f.URL(e).hostname.includes(t.domain));for(let e of i){let t=a.find(t=>t.name===e.name);if(t)continue;e.domain||a.push(e)}let o=a.map(e=>`${e.name}=${e.value}`).join(`; `);r.has(`cookie`)?r.get(`cookie`)||r.delete(`cookie`):r.set(`cookie`,o);let s={...t,body:t?.body,headers:r};t&&(t.headers=r);let c=await(n?(0,p.fetch)(e,{...s,dispatcher:this.#agent}):this.withRetry(this.#impit.fetch.bind(this.#impit),e,s)),l=c.headers.getSetCookie();return l&&await this.setCookies(l),c}async withRetry(e,t,n){try{let r=await e(t,n),i=r.status>=300&&r.status<=399,a=r.status>=200&&r.status<=299||i;return!a&&this.#hasAttempts(t)?(await this.#nextRetry(t),U.debug(await r.text()),U.debug(String(r.status)),this.withRetry(e,t,n)):r}catch(r){let i=r;if(U.debug(i.stack),U.debug({input:t,init:{method:n?.method,headers:n?.headers,body:`...`}}),!this.#hasAttempts(t))throw r;return await this.#nextRetry(t),this.withRetry(e,t,n)}}async setCookies(e){let t=[];if(typeof e==`string`){let[n]=J([e]);n&&t.push(n)}else if(Array.isArray(e)&&typeof e.at(0)==`string`){let n=J(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);for(let[n,r]of Object.entries(e))t.set(n,r);return t}#hasAttempts(e){return this.#getFailuresCount(e)<=this.#retryThreshold}#getFailuresCount(e){return this.#failures.get(e)||1}#addFailure(e){this.#failures.set(e,this.#getFailuresCount(e)+1)}async#nextRetry(e){let t=this.#getFailuresCount(e);t&&await new Promise(e=>setTimeout(e,this.#retryDelayMs)),this.#addFailure(e),U.debug(`Retry ${t}/${this.#retryThreshold}: ${String(e)}`)}setHeader(e,t){this.headers.set(e,t)}removeHeader(e){this.headers.delete(e)}setRetryCount(e){e>1&&(this.#retryThreshold=e)}};const Oe=new X,{COMMON_CONTEXT:ke}=h.default,Ae=(e,t=`Eval`)=>{try{let n=h.default.createScript(t,e);return n}catch(e){return console.error(`Syntax Error: ${e.message}`),null}},Z=(e,t=1)=>{if(Array.isArray(e)||typeof e==`string`){let n=[];for(let r=1;r<=t;r++)n.push(e[Math.floor(Math.random()*e.length)]);return n}else return[]},je=e=>{let t=`default`in g.default?g.default.default:g.default;return new t(e)};var Me=class{#store;constructor({storagePath:e}){this.#store=je({cwd:(0,n.dirname)(e),configName:(0,n.basename)(e,`.json`)})}get length(){return Object.keys(this.#store.store).length}clear(){this.#store.clear()}getItem(e){return this.#store.get(e)??null}key(e){return Object.keys(this.#store.store).at(e)??null}removeItem(e){this.#store.delete(e)}setItem(e,t){this.#store.set(e,t)}};const Q=()=>{switch(t.default.type()){case`Darwin`:return`macOS`;case`Windows_NT`:return`Windows`;default:return`Linux`}};Object.defineProperties(Uint8Array.prototype,{toBase64:{value:function(){return Buffer.from(this).toString(`base64`)},writable:!0,configurable:!0},toHex:{value:function(){return Buffer.from(this).toString(`hex`)},writable:!0,configurable:!0}}),Object.defineProperties(Uint8Array,{fromBase64:{value:function(e){return new Uint8Array(Buffer.from(e,`base64`))},writable:!0,configurable:!0},fromHex:{value:function(e){return new Uint8Array(Buffer.from(e,`hex`))},writable:!0,configurable:!0}});const Ne=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`]]]),Pe=()=>{let e=Number(t.default.release().split(`.`)[0]),[n,r]=Ne.get(e)||[`Unknown`,``];return{name:n,version:r}},Fe=()=>{switch(Q()){case`macOS`:return Pe().version;case`Windows`:return t.default.release();case`Linux`:return t.default.release()}},Ie=()=>{let e=[{brand:`Azot`,version:T.version.split(`.`).slice(0,2).join(`.`)},{brand:`Node.js`,version:process.version.replace(`v`,``).split(`.`).slice(0,1).join(`.`)}];return{mobile:!1,platform:Q(),brands:e,getHighEntropyValues:async n=>{let r={mobile:!1,platform:Q(),brands:e};return n.includes(`architecture`)&&(r.architecture=t.default.arch()),n.includes(`platform`)&&(r.platform=Q()),n.includes(`platformVersion`)&&(r.platformVersion=Fe()),n.includes(`fullVersionList`)&&(r.fullVersionList=[{brand:`Azot`,version:T.version},{brand:`Node.js`,version:process.version}]),r}}},$=({name:e=`extension`,dir:t=process.cwd()}={})=>{let i=j((0,n.join)(t,e)),a=new Me({storagePath:(0,n.join)(i,`storage.json`)}),o=new Y({storagePath:(0,n.join)(i,`cookies.json`)}),s=new X({cookieStore:o}),c=(e,t,n)=>e.split(t)[1]?.split(n)[0]?.trim(),l={sanitizeString:W,execUrlPatterns:G,extendEpisodes:K,between:c,getRandomElements:Z},u={version:T.version,input:Ce,sleep:r.setTimeout,sanitizeString:W,execUrlPatterns:G,extendEpisodes:K,between:c,getRandomElements:Z,utils:l,prompt:q.ask.bind(q)};class d{get cookie(){return o.toString()}}let f={fetch:s.fetch.bind(s),Response,Request,Headers,AbortController,AbortSignal,URL,URLSearchParams,URLPattern,Blob,structuredClone,btoa,atob,TextEncoder,TextDecoder,Uint8Array,crypto,console:U,prompt:Te,alert:e=>{U.warn(e)},Event,EventTarget,localStorage:a,cookieStore:o,document:new d,eval:e=>Ae(e)?.exports,navigator:{appName:`Azot`,appVersion:T.version,platform:process.platform,userAgentData:Ie()}},p={http:s,question:q,common:l,Streamyx:u,Azot:u,window:f,...f};return p};exports.createContext=$;
1
+ const e=`Streamyx`in globalThis?globalThis.Streamyx:{},t=`Azot`in globalThis?globalThis.Azot:{};if(!globalThis.Azot&&globalThis.Streamyx&&(globalThis.Azot=globalThis.Streamyx),globalThis.Azot&&!globalThis.Azot.input){let e=async(e,t)=>{let n=t?.fields??{answer:{label:e}},r=await globalThis.Azot.prompt.ask({title:t?.title,description:e,fields:n});return r};globalThis.Azot.input=e}var n={...e,...t};module.exports=n;
package/out/test.js ADDED
@@ -0,0 +1,3 @@
1
+ const e=require(`./chunk-nOFOJqeH.js`),t=e.__toESM(require(`node:os`)),n=e.__toESM(require(`node:path`)),r=e.__toESM(require(`node:timers/promises`)),i=e.__toESM(require(`node:fs/promises`)),a=e.__toESM(require(`@logtape/logtape`)),o=e.__toESM(require(`@logtape/file`)),s=e.__toESM(require(`@logtape/pretty`)),c=e.__toESM(require(`node:fs`)),l=e.__toESM(require(`node:process`));require(`urlpattern-polyfill`);const u=e.__toESM(require(`node:events`)),d=e.__toESM(require(`node:readline/promises`)),f=e.__toESM(require(`node:url`)),p=e.__toESM(require(`undici`)),m=e.__toESM(require(`impit`)),h=e.__toESM(require(`metavm`));require(`picocolors`),require(`nanospinner`);const g=e.__toESM(require(`conf`));var _=`azot`,v=`Azot`,y=`5.0.0-alpha.2`,b=`./out/main.js`,x=`./types/main.d.ts`,S={".":{types:`./types/main.d.ts`,import:`./out/main.js`,require:`./out/main.js`},"./test":{types:`./types/test.d.ts`,import:`./out/test.js`,require:`./out/test.js`}},C={azt:`out/azt.js`},ee=[`out`,`azot.d.ts`,`types`,`.npmrc`],te=`Vitaly Gashkov <vitalygashkov@vk.com>`,ne=`A powerful, extensible app for downloading videos`,re={type:`git`,url:`https://github.com/azot-labs/azot.git`},ie=`https://azot.so`,ae={start:`tsx --env-file .env ./src/main/cli.ts`,preview:`electron-vite preview --config vite.desktop.config.mjs`,dev:`electron-vite dev --config vite.desktop.config.mjs --watch`,test:`vitest`,coverage:`vitest run --coverage`,"bundle:lib":`tsdown`,"bundle:cli":`electron-vite build --config vite.cli.config.mjs`,bundle:`npm run bundle:cli && electron-vite build --config vite.desktop.config.mjs`,build:`npm run bundle && electron-builder build --config electron-builder.config.js`,"build:mac":`npm run bundle && electron-builder build --mac --config electron-builder.config.js`,"build:win":`npm run bundle && electron-builder build --win --config electron-builder.config.js`,"build:linux":`npm run bundle && electron-builder build --linux --config electron-builder.config.js`,publish:`npm run bundle && electron-builder build --publish always --config electron-builder.config.js`,"publish:lib":`npm run bundle:lib && npm publish --tag alpha`,typecheck:`npm run typecheck:node && npm run typecheck:web`,"typecheck:node":`tsc --noEmit -p tsconfig.node.json --composite false`,"typecheck:web":`vue-tsc --noEmit -p tsconfig.web.json --composite false`,format:`prettier --write .`,lint:`eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts,.vue --fix`},oe={node:`22`},se=[`darwin`,`linux`,`win32`],ce=[{type:`individual`,url:`https://t.me/tribute/app?startapp=dqW2`}],le={"@electron-toolkit/preload":`^3.0.2`,"@electron-toolkit/utils":`^4.0.0`,"@inquirer/prompts":`^7.8.3`,"@logtape/file":`^1.0.4`,"@logtape/logtape":`^1.0.4`,"@logtape/pretty":`^1.0.4`,"@tanstack/query-core":`^5.85.5`,"@tribute-tg/better-auth":`^1.0.9`,"better-auth":`^1.3.7`,bytenode:`^1.5.7`,conf:`^14.0.0`,"cross-spawn":`^7.0.6`,dasha:`3.1.8`,"electron-squirrel-startup":`^1.0.1`,"electron-updater":`^6.6.2`,impit:`^0.5.4`,"javascript-obfuscator":`^4.1.1`,metavm:`^1.4.4`,molnia:`^0.1.5`,nanospinner:`^1.2.2`,okova:`^0.9.3`,"p-queue":`^8.1.0`,picocolors:`^1.1.1`,tsdown:`^0.14.2`,undici:`^7.15.0`,"urlpattern-polyfill":`^10.1.0`,yargs:`^18.0.0`,yauzl:`^3.2.0`},w={"@electron-toolkit/eslint-config":`^2.1.0`,"@electron-toolkit/eslint-config-prettier":`^3.0.0`,"@electron-toolkit/eslint-config-ts":`^3.1.0`,"@electron-toolkit/tsconfig":`^1.0.1`,"@eslint/js":`^9.26.0`,"@iconify/vue":`^4.3.0`,"@intlify/unplugin-vue-i18n":`^6.0.8`,"@rushstack/eslint-patch":`^1.10.5`,"@tailwindcss/vite":`^4.1.12`,"@tanstack/vue-query":`^5.85.5`,"@types/node":`^24.3.0`,"@types/wicg-file-system-access":`^2023.10.5`,"@types/yargs":`^17.0.33`,"@vee-validate/zod":`^4.15.1`,"@vitejs/plugin-vue":`^6.0.1`,"@vue/eslint-config-prettier":`^10.2.0`,"@vue/eslint-config-typescript":`^14.5.0`,"@vueuse/core":`^13.7.0`,"class-variance-authority":`^0.7.1`,clsx:`^2.1.1`,dotenv:`^17.2.1`,electron:`37.3.1`,"electron-builder":`^26.0.12`,"electron-vite":`^4.0.0`,eslint:`^9.34.0`,"eslint-plugin-import":`^2.32.0`,"eslint-plugin-n":`^17.21.3`,"eslint-plugin-vue":`^10.4.0`,execa:`^9.6.0`,globals:`^16.3.0`,"lucide-vue-next":`^0.541.0`,"non.geist":`^1.0.4`,pinia:`^3.0.3`,postcss:`^8.5.6`,prettier:`^3.6.2`,"reka-ui":`^2.4.1`,sass:`^1.90.0`,"tailwind-merge":`^3.3.1`,tailwindcss:`^4.1.12`,"tailwindcss-animate":`^1.0.7`,tsx:`^4.20.5`,typescript:`^5.9.2`,"vee-validate":`^4.15.1`,vite:`^7.1.3`,"vite-plugin-static-copy":`^3.1.2`,vitest:`^3.2.4`,vue:`^3.5.18`,"vue-eslint-parser":`^10.2.0`,"vue-i18n":`^11.1.11`,"vue-sonner":`^1.3.0`,"vue-tsc":`^3.0.6`,zod:`^3.25.42`},T={name:_,productName:v,version:y,main:b,types:x,exports:S,bin:C,files:ee,author:te,description:ne,repository:re,homepage:ie,scripts:ae,engines:oe,os:se,funding:ce,dependencies:le,devDependencies:w};const ue=`pkg`in process&&process.pkg!==void 0,E=!!process.versions.electron&&!1,D=!E,de=`v${T.version} ${l.platform}-${l.arch} node-${l.version}`,fe=`v${T.version}`,pe=T.name,O=T.productName,k={darwin:`macOS`,win32:`Windows`,linux:`Linux`},A=k[process.platform],j=e=>{let t=typeof e==`string`?e:e[A];return(0,c.existsSync)(t)||(0,c.mkdirSync)(t,{recursive:!0}),t},M=(0,t.homedir)(),N=(0,t.tmpdir)(),P=j({Windows:process.env.APPDATA||(0,n.join)(M,`AppData`,`Roaming`),macOS:(0,n.join)(M,`Library`,`Application Support`),Linux:process.env.XDG_DATA_HOME||(0,n.join)(M,`.local`,`share`)}),F=j({Windows:process.env.APPDATA||(0,n.join)(M,`AppData`,`Roaming`),macOS:(0,n.join)(M,`Library`,`Application Support`),Linux:process.env.XDG_CONFIG_HOME||(0,n.join)(M,`.config`)}),me=j({Windows:process.env.LOCALAPPDATA||(0,n.join)(M,`AppData`,`Local`),macOS:(0,n.join)(M,`Library`,`Caches`),Linux:process.env.XDG_CACHE_HOME||(0,n.join)(M,`.cache`)}),he=j({Windows:(0,n.join)(M,`Downloads`),macOS:(0,n.join)(M,`Downloads`),Linux:process.env.XDG_DOWNLOAD_DIR||(0,n.join)(M,`Downloads`)}),I=j({Windows:(0,n.join)(P,O),macOS:(0,n.join)(P,O),Linux:(0,n.join)(P,O.toLowerCase())}),L=j({Windows:(0,n.join)(F,O),macOS:(0,n.join)(F,O),Linux:(0,n.join)(F,O.toLowerCase())}),R=j({Windows:(0,n.join)(F,O,`logs`),macOS:(0,n.join)(M,`Library`,`Logs`,O),Linux:(0,n.join)(F,O.toLowerCase(),`logs`)}),ge=(0,n.join)(N,O.toLowerCase()),z=j((0,n.join)(I,`extensions`)),_e=j((0,n.join)(z,`installed`)),ve=j((0,n.join)(z,`work`)),ye=(0,n.join)(L,`settings.json`),B=process.argv.includes(`-d`)||process.argv.includes(`--debug`)||process.env.NODE_ENV_ELECTRON_VITE===`development`||!!process.env.ELECTRON_CLI_ARGS,V=()=>{let e=new Date().toISOString().split(`.`)[0].replace(`T`,`_`).replaceAll(`-`,``).replaceAll(`:`,``);return`Azot_${e}.log`},be=()=>(0,n.join)(R,V()),H=(0,s.getPrettyFormatter)({timestamp:`time`,levelStyle:null,icons:!1,colors:!0,level:`FULL`,categoryWidth:0,categoryStyle:null,categoryTruncate:`end`,wordWrap:!0});(0,a.configureSync)({sinks:{console:(0,a.withFilter)((0,a.getConsoleSink)({formatter:H}),B?`debug`:`info`),file:(0,o.getFileSink)(be(),{flushInterval:0})},loggers:[{category:[],lowestLevel:`trace`,sinks:[`console`,`file`]},{category:[`logtape`,`meta`],lowestLevel:`error`,sinks:[`console`]}]});const U=(0,a.getLogger)([]),W=e=>{let t=[`}`,`{`,`%`,`>`,`<`,`^`,`;`,"`",`$`,`"`,`@`,`=`],n=e;for(let e in t)n=n.replaceAll(`/`,`_`).replaceAll(t[e],``);return n},G=(e,t,n)=>{let r={},i={};for(let a of n)for(let n of t){let t=new URLPattern(n,a),o=t.exec(e);o&&(Object.assign(r,o.pathname.groups),Object.assign(i,o.search.groups))}return{pathname:r,search:i}},K=(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(),o=a.length,s=()=>Math.min(...a),c=()=>Math.max(...a);return{items:e,has:t,set:n,getMin:s,getMax:c,seasonsCount:i,episodesCount:o}},xe=new Intl.DateTimeFormat(`en-US`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}),Se=new Intl.DateTimeFormat(`en-US`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1});var Ce=class e extends u.EventEmitter{static{this.requestEventName=`form`}static{this.responseEventName=`form:response`}constructor(){super(),D&&this.listen(async e=>{let t=(0,d.createInterface)({input:l.stdin,output:l.stdout}),{title:n,description:i,fields:a,...o}=e,s={};for(let[e,{label:c,type:l}]of Object.entries(a||o)){let a=l===`confirm`,o=[n,i,c].filter(Boolean).join(`. `)+(a?` (y/n)`:``)+`: `,u=await Promise.race([t.question(o),(0,r.setTimeout)(Te,``)]);s[e]=u}return t.close(),s})}async ask(t){let n=new Promise(n=>{this.emit(e.requestEventName,t),this.addListener(e.responseEventName,e=>{n(e)})});return n}listen(t){this.addListener(e.requestEventName,async n=>{let r=await t(n);this.emit(e.responseEventName,r)})}};const q=new Ce,we=async(e,t)=>{let n=t?.fields??{answer:{label:e}},r=await q.ask({title:t?.title,description:e,fields:n});return r},Te=12e4,Ee=(e,t)=>{(0,c.writeSync)(1,e||``);let n=Buffer.alloc(1),r=``;for(;;){try{(0,c.readSync)(0,n,0,1,null)}catch(e){if(e.code===`EOF`)break;throw e}let e=n.toString(`utf-8`);if(e===`
2
+ `||e===`\r`){if(e===`\r`)try{(0,c.readSync)(0,n,0,1,null),n.toString(`utf-8`)}catch(e){if(e.code===`EOF`)break;throw e}break}r+=e}return r.trim()||t},De=e=>{let t=e.expires instanceof Date?e.expires.getTime():e.expires,n;return e.sameSite===`Strict`?n=`strict`:e.sameSite===`Lax`&&(n=`lax`),{name:e.name,value:e.value,expires:t,domain:e.domain,path:e.path,sameSite:n,partitioned:!1,maxAge:e.maxAge,secure:e.secure,httpOnly:e.httpOnly,unparsed:e.unparsed}},J=e=>{let t=[];for(let n of e)try{let e=(0,p.parseCookie)(n);e&&t.push(De(e))}catch(e){U.debug(e)}return t},Y=async e=>{let n=await(0,i.readFile)(e,`utf8`).catch(()=>``);if(!n)return[];let r=n.split(t.EOL).flatMap(e=>e.split(`
3
+ `)),a=r.filter(e=>!!e.trim()&&!e.startsWith(`# `)),o=a.map(e=>e.split(` `)),s=[];for(let e of o){let[t,n,r,i,a,o,c]=e;s.push({name:o,value:c,expires:Number(a),maxAge:void 0,domain:t.replace(`#HttpOnly_`,``),path:r,secure:i===`TRUE`,httpOnly:void 0,sameSite:void 0,unparsed:e})}return s};var X=class{#data={};#cookies;#storagePath;#hasBeenRead=!1;static parse(e){return J(e)}constructor({storagePath:e}={}){this.#storagePath=e,this.#cookies=[]}async import(e){let t=await(0,i.stat)(e).catch(()=>null);t?.isFile()&&(this.#cookies=await Y(e),await(0,i.rm)(e,{recursive:!0,force:!0}))}async#read(){if(!this.#storagePath||this.#hasBeenRead)return;let e=await(0,i.stat)(this.#storagePath).catch(()=>null);if(e?.isFile()){let e=await(0,i.readFile)(this.#storagePath,`utf8`);this.#data=e?JSON.parse(e):{},this.#cookies=`cookies`in this.#data?this.#data.cookies:[]}this.#hasBeenRead=!0}async#write(){if(!this.#storagePath)return;let e=JSON.stringify({...this.#data,cookies:this.#cookies},null,2);await(0,i.writeFile)(this.#storagePath,e,`utf8`)}async get(e){await this.#read();let t=typeof e==`string`?e:e.name;return this.#cookies.find(e=>e.name===t)??null}async getAll(e){if(await this.#read(),!e)return this.#cookies;let t=typeof e==`string`?e:e.name;return this.#cookies.filter(e=>e.name===t)??null}async set(e){await this.#read(),this.#cookies=this.#cookies.filter(t=>!(t.name===e.name&&t.domain===e.domain)),this.#cookies.push(e),await this.#write()}async delete(e){if(await this.#read(),!e)this.#cookies=[];else{let t=typeof e==`string`?e:e.name;this.#cookies=this.#cookies.filter(e=>e.name!==t)}}toString(){return this.#cookies.map(e=>`${e.name}=${e.value}`).join(`; `)}},Z=class{#impit;#agent;#retryThreshold;#retryDelayMs;#failures=new Map;constructor(e={}){this.headers=new Headers,this.#retryThreshold=3,this.#retryDelayMs=1500,this.configure(e)}configure({proxyUrl:e,allowH2:t=!0,maxRedirections:n=3,maxRetries:r=3,cookieStore:i}={}){this.cookieStore=i??this.cookieStore??new X,this.#impit=new m.Impit({browser:`chrome`,ignoreTlsErrors:!0,proxyUrl:e,followRedirects:!0,maxRedirects:n});let{redirect:a,retry:o}=p.interceptors;e?this.#agent=new p.ProxyAgent({uri:e,allowH2:t}).compose(a({maxRedirections:n}),o({maxRetries:r})):this.#agent=new p.Agent({allowH2:t}).compose(a({maxRedirections:n}),o({maxRetries:r}))}get retries(){return this.#retryThreshold}async fetch(e,t={}){let n=t.headers&&(t.headers instanceof Headers?t.headers.has(`User-Agent`):`User-Agent`in t.headers),r=this.appendHeaders(t?.headers||{}),i=await this.cookieStore.getAll(),a=i.filter(t=>!t.domain||new f.URL(e).hostname.includes(t.domain));for(let e of i){let t=a.find(t=>t.name===e.name);if(t)continue;e.domain||a.push(e)}let o=a.map(e=>`${e.name}=${e.value}`).join(`; `);r.has(`cookie`)?r.get(`cookie`)||r.delete(`cookie`):r.set(`cookie`,o);let s={...t,body:t?.body,headers:r};t&&(t.headers=r);let c=await(n?(0,p.fetch)(e,{...s,dispatcher:this.#agent}):this.withRetry(this.#impit.fetch.bind(this.#impit),e,s)),l=c.headers.getSetCookie();return l&&await this.setCookies(l),c}async withRetry(e,t,n){try{let r=await e(t,n),i=r.status>=300&&r.status<=399,a=r.status>=200&&r.status<=299||i;return!a&&this.#hasAttempts(t)?(await this.#nextRetry(t),U.debug(await r.text()),U.debug(String(r.status)),this.withRetry(e,t,n)):r}catch(r){let i=r;if(U.debug(i.stack),U.debug({input:t,init:{method:n?.method,headers:n?.headers,body:`...`}}),!this.#hasAttempts(t))throw r;return await this.#nextRetry(t),this.withRetry(e,t,n)}}async setCookies(e){let t=[];if(typeof e==`string`){let[n]=J([e]);n&&t.push(n)}else if(Array.isArray(e)&&typeof e.at(0)==`string`){let n=J(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);for(let[n,r]of Object.entries(e))t.set(n,r);return t}#hasAttempts(e){return this.#getFailuresCount(e)<=this.#retryThreshold}#getFailuresCount(e){return this.#failures.get(e)||1}#addFailure(e){this.#failures.set(e,this.#getFailuresCount(e)+1)}async#nextRetry(e){let t=this.#getFailuresCount(e);t&&await new Promise(e=>setTimeout(e,this.#retryDelayMs)),this.#addFailure(e),U.debug(`Retry ${t}/${this.#retryThreshold}: ${String(e)}`)}setHeader(e,t){this.headers.set(e,t)}removeHeader(e){this.headers.delete(e)}setRetryCount(e){e>1&&(this.#retryThreshold=e)}};const Oe=new Z,{COMMON_CONTEXT:ke}=h.default,Ae=(e,t=`Eval`)=>{try{let n=h.default.createScript(t,e);return n}catch(e){return console.error(`Syntax Error: ${e.message}`),null}},Q=(e,t=1)=>{if(Array.isArray(e)||typeof e==`string`){let n=[];for(let r=1;r<=t;r++)n.push(e[Math.floor(Math.random()*e.length)]);return n}else return[]},je=e=>{let t=`default`in g.default?g.default.default:g.default;return new t(e)};var Me=class{#store;constructor({storagePath:e}){this.#store=je({cwd:(0,n.dirname)(e),configName:(0,n.basename)(e,`.json`)})}get length(){return Object.keys(this.#store.store).length}clear(){this.#store.clear()}getItem(e){return this.#store.get(e)??null}key(e){return Object.keys(this.#store.store).at(e)??null}removeItem(e){this.#store.delete(e)}setItem(e,t){this.#store.set(e,t)}};const $=()=>{switch(t.default.type()){case`Darwin`:return`macOS`;case`Windows_NT`:return`Windows`;default:return`Linux`}};Object.defineProperties(Uint8Array.prototype,{toBase64:{value:function(){return Buffer.from(this).toString(`base64`)},writable:!0,configurable:!0},toHex:{value:function(){return Buffer.from(this).toString(`hex`)},writable:!0,configurable:!0}}),Object.defineProperties(Uint8Array,{fromBase64:{value:function(e){return new Uint8Array(Buffer.from(e,`base64`))},writable:!0,configurable:!0},fromHex:{value:function(e){return new Uint8Array(Buffer.from(e,`hex`))},writable:!0,configurable:!0}});const Ne=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`]]]),Pe=()=>{let e=Number(t.default.release().split(`.`)[0]),[n,r]=Ne.get(e)||[`Unknown`,``];return{name:n,version:r}},Fe=()=>{switch($()){case`macOS`:return Pe().version;case`Windows`:return t.default.release();case`Linux`:return t.default.release()}},Ie=()=>{let e=[{brand:`Azot`,version:T.version.split(`.`).slice(0,2).join(`.`)},{brand:`Node.js`,version:process.version.replace(`v`,``).split(`.`).slice(0,1).join(`.`)}];return{mobile:!1,platform:$(),brands:e,getHighEntropyValues:async n=>{let r={mobile:!1,platform:$(),brands:e};return n.includes(`architecture`)&&(r.architecture=t.default.arch()),n.includes(`platform`)&&(r.platform=$()),n.includes(`platformVersion`)&&(r.platformVersion=Fe()),n.includes(`fullVersionList`)&&(r.fullVersionList=[{brand:`Azot`,version:T.version},{brand:`Node.js`,version:process.version}]),r}}},Le=({name:e=`extension`,dir:t=process.cwd()}={})=>{let i=j((0,n.join)(t,e)),a=new Me({storagePath:(0,n.join)(i,`storage.json`)}),o=new X({storagePath:(0,n.join)(i,`cookies.json`)}),s=new Z({cookieStore:o}),c=(e,t,n)=>e.split(t)[1]?.split(n)[0]?.trim(),l={sanitizeString:W,execUrlPatterns:G,extendEpisodes:K,between:c,getRandomElements:Q},u={defineExtension:e=>e,version:T.version,input:we,sleep:r.setTimeout,sanitizeString:W,execUrlPatterns:G,extendEpisodes:K,between:c,getRandomElements:Q,utils:l,prompt:q.ask.bind(q)};class d{get cookie(){return o.toString()}}let f={fetch:s.fetch.bind(s),Response,Request,Headers,AbortController,AbortSignal,URL,URLSearchParams,URLPattern,Blob,structuredClone,btoa,atob,TextEncoder,TextDecoder,Uint8Array,crypto,console:U,prompt:Ee,alert:e=>{U.warn(e)},Event,EventTarget,localStorage:a,cookieStore:o,document:new d,eval:e=>Ae(e)?.exports,navigator:{appName:`Azot`,appVersion:T.version,platform:process.platform,userAgentData:Ie()}},p={http:s,question:q,common:l,Streamyx:u,Azot:u,window:f,...f};return p};exports.createContext=Le;
package/package.json CHANGED
@@ -1,15 +1,28 @@
1
1
  {
2
2
  "name": "azot",
3
3
  "productName": "Azot",
4
- "version": "5.0.0-alpha.1",
5
- "main": "out/main.js",
4
+ "version": "5.0.0-alpha.2",
5
+ "main": "./out/main.js",
6
+ "types": "./types/main.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./types/main.d.ts",
10
+ "import": "./out/main.js",
11
+ "require": "./out/main.js"
12
+ },
13
+ "./test": {
14
+ "types": "./types/test.d.ts",
15
+ "import": "./out/test.js",
16
+ "require": "./out/test.js"
17
+ }
18
+ },
6
19
  "bin": {
7
20
  "azt": "out/azt.js"
8
21
  },
9
- "types": "azot.d.ts",
10
22
  "files": [
11
23
  "out",
12
24
  "azot.d.ts",
25
+ "types",
13
26
  ".npmrc"
14
27
  ],
15
28
  "author": "Vitaly Gashkov <vitalygashkov@vk.com>",
@@ -33,6 +46,7 @@
33
46
  "build:win": "npm run bundle && electron-builder build --win --config electron-builder.config.js",
34
47
  "build:linux": "npm run bundle && electron-builder build --linux --config electron-builder.config.js",
35
48
  "publish": "npm run bundle && electron-builder build --publish always --config electron-builder.config.js",
49
+ "publish:lib": "npm run bundle:lib && npm publish --tag alpha",
36
50
  "typecheck": "npm run typecheck:node && npm run typecheck:web",
37
51
  "typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
38
52
  "typecheck:web": "vue-tsc --noEmit -p tsconfig.web.json --composite false",
@@ -0,0 +1,203 @@
1
+ import type { VideoCodec, DynamicRange, AudioCodec } from 'dasha';
2
+
3
+ export interface ExtensionConfig {
4
+ id: string;
5
+ version: string;
6
+ name: string;
7
+ tag?: string;
8
+ icon?: string;
9
+ }
10
+
11
+ export interface Extension {
12
+ /**
13
+ * Can handle URL or URL pattern
14
+ */
15
+ canHandle?: ((url: string) => boolean | Promise<boolean>) | string;
16
+
17
+ /**
18
+ * Performs initialization of extension (e.g. token refresh)
19
+ */
20
+ init?(): void | Promise<void>;
21
+
22
+ isAuthenticated?(): Promise<boolean>;
23
+ login?(username?: string, password?: string): Promise<void>;
24
+ logout?(): Promise<void>;
25
+
26
+ /**
27
+ * Fetches content metadata from URL
28
+ */
29
+ fetchContentMetadata: (url: string, options: Options) => Promise<ContentMetadata[]>;
30
+
31
+ /**
32
+ * Fetches data about content source (e.g. manifest URL, external subtitles, etc.)
33
+ */
34
+ fetchContentSource?: (contentId: string, options: Options) => Promise<ContentSource | null>;
35
+
36
+ /**
37
+ * Fetches just content DRM config (e.g. license server URL, request headers, etc.)
38
+ */
39
+ fetchContentDrm?: (payload: any, options: Options) => Promise<DrmConfig>;
40
+
41
+ onDownloadFinished?(): Promise<void>;
42
+
43
+ /**
44
+ * Extension name (e.g. Netflix, Prime Video, Apple TV+, etc.)
45
+ * @deprecated Use `config.title` field in package.json
46
+ */
47
+ name?: string;
48
+
49
+ /**
50
+ * Short tag which will be used in filename (e.g. NF, AMZN, ATVP, etc.)
51
+ * @deprecated Use `config.tag` field in package.json
52
+ */
53
+ tag?: string;
54
+
55
+ /**
56
+ * Logo icon URL
57
+ * @deprecated Use `config.icon` field in package.json
58
+ */
59
+ icon?: string;
60
+
61
+ /**
62
+ * Substring pattern to match URL host handled by this plugin
63
+ * @deprecated
64
+ */
65
+ match?: string;
66
+ }
67
+
68
+ export type Options = {
69
+ videoQuality?: string;
70
+ videoCodecs?: VideoCodec[];
71
+ videoRange?: DynamicRange;
72
+ videoBitrate?: number;
73
+ videoDimension?: '2D' | '3D';
74
+
75
+ audioCodecs?: AudioCodec[];
76
+ audioChannels?: number;
77
+ audioBitrate?: number;
78
+
79
+ subtitleFormat?: string;
80
+ subtitleLanguages?: string[];
81
+
82
+ languages?: string[];
83
+
84
+ skipVideo?: boolean;
85
+ skipAudio?: boolean;
86
+ skipSubtitles?: boolean;
87
+ skipMux?: boolean;
88
+
89
+ experimentalSelectTracks?: boolean;
90
+
91
+ episodes?: Map<number, Set<number>>;
92
+ retry?: number;
93
+ connections?: number;
94
+ proxy?: string | null;
95
+ proxyMeta?: string | null;
96
+ proxyMedia?: string | null;
97
+
98
+ movieTemplate?: string;
99
+ episodeTemplate?: string;
100
+ hardsub?: boolean;
101
+ trimBegin?: string;
102
+ trimEnd?: string;
103
+
104
+ pssh?: string;
105
+ drmTemplate?: string;
106
+ header?: Record<string, string>;
107
+
108
+ http2?: boolean;
109
+ keys?: { kid: string; key: string }[];
110
+ debug?: boolean;
111
+ };
112
+
113
+ export interface MediaInfo {
114
+ id: string;
115
+ type?: 'movie' | 'tv';
116
+ title?: string;
117
+ description?: string;
118
+ thumbnailUrl?: string;
119
+ author?: string;
120
+ year?: number;
121
+
122
+ season?: number;
123
+ episode?: number;
124
+ episodeTitle?: string;
125
+
126
+ sources: (MediaSource | string)[];
127
+
128
+ [key: string]: any;
129
+ }
130
+
131
+ export interface MediaSource {
132
+ url: string;
133
+
134
+ headers?: Record<string, string>;
135
+ drm?: string | MediaDrm | MediaDrm[];
136
+ type?: 'progressive' | 'direct' | 'hls' | 'dash';
137
+
138
+ language?: string;
139
+ size?: number;
140
+ }
141
+
142
+ export interface MediaDrm {
143
+ type?: 'widevine' | 'playready';
144
+ server: string;
145
+
146
+ headers?: Record<string, string>;
147
+
148
+ transformRequest?(request: Request): Request;
149
+ transformResponse?(response: Response): Response;
150
+
151
+ fetchCertificate?(message: Uint8Array, sessionId: string): Promise<Uint8Array>;
152
+ fetchLicense?(message: Uint8Array, sessionId: string): Promise<Uint8Array>;
153
+ }
154
+
155
+ export { Options };
156
+
157
+ export interface CommonContentMetadata {
158
+ tag?: string;
159
+ /**
160
+ * Required if no `fetchContentSource` method is provided
161
+ */
162
+ source?: ContentSource;
163
+ }
164
+
165
+ export interface MovieMetadata extends CommonContentMetadata {
166
+ id?: string;
167
+ title?: string;
168
+ }
169
+
170
+ export interface EpisodeMetadata extends CommonContentMetadata {
171
+ id?: string;
172
+ title?: string;
173
+ episodeNumber: number;
174
+ seasonNumber?: number;
175
+ episodeTitle?: string;
176
+ }
177
+
178
+ export type ContentMetadata = MovieMetadata | EpisodeMetadata;
179
+
180
+ export type ContentSource = {
181
+ /**
182
+ * URL of the content: manifest URL / playlist URL / direct link to media file
183
+ */
184
+ url: string;
185
+ headers?: Record<string, string>;
186
+ http2?: boolean;
187
+ type?: 'video' | 'audio' | 'subtitle' | 'any';
188
+ audioLanguage?: string;
189
+ audioType?: string;
190
+ subtitles?: any[];
191
+ drm?: DrmConfig;
192
+ };
193
+
194
+ export type DrmConfig =
195
+ | {
196
+ server: string;
197
+ headers?: Record<string, string>;
198
+ params?: object;
199
+ template?: string;
200
+ http2?: boolean;
201
+ }
202
+ | { payload: any }
203
+ | { keys: { kid: string; key: string }[] };
@@ -0,0 +1,15 @@
1
+ export interface DialogOptions<T extends string> {
2
+ title?: string;
3
+ fields?: Record<T, InputField>;
4
+ }
5
+
6
+ export type InputType = 'text' | 'password' | 'number' | 'checkbox' | 'select' | 'date' | 'confirm';
7
+
8
+ export type InputField = {
9
+ type?: InputType;
10
+ label: string;
11
+ placeholder?: string;
12
+ defaultValue?: string;
13
+ required?: boolean;
14
+ options?: string[];
15
+ };
@@ -1,5 +1,7 @@
1
- import { Extension } from './types/extension';
2
- import { DialogOptions } from './types/input';
1
+ import { Extension } from './extension';
2
+ import { DialogOptions } from './input';
3
+
4
+ export * from './extension';
3
5
 
4
6
  /**
5
7
  * Simple wrapper to support type checking
@@ -139,9 +141,3 @@ declare global {
139
141
  fromHex(hexString: string): Uint8Array;
140
142
  }
141
143
  }
142
-
143
- /**
144
- * Create a new context for extension script
145
- * Only for testing purposes
146
- */
147
- export function createContext(options?: { name?: string; dir?: string }): Record<string, any>;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Create a new context for extension script
3
+ */
4
+ export function createContext(options?: { name?: string; dir?: string }): Record<string, any>;