azot 5.0.0-alpha.1 → 5.0.0-alpha.3

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/azt.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- const e=require(`./chunk-nOFOJqeH.js`),t=e.__toESM(require(`node:path`)),n=e.__toESM(require(`node:fs`)),r=e.__toESM(require(`node:util`)),i=e.__toESM(require(`tsdown`)),a=e.__toESM(require(`node:crypto`)),o=e.__toESM(require(`javascript-obfuscator`)),s=Buffer.from(`STX`,`utf8`),c=(e,t,r)=>{let i=(0,a.randomBytes)(32),o=(0,a.randomBytes)(16),c=(0,n.readFileSync)(t),l=(0,a.createCipheriv)(`aes-256-cbc`,i,o),u=Buffer.concat([l.update(c),l.final()]),d=(0,a.publicEncrypt)(e,i),f=Buffer.concat([s,o,d,u]);return r&&(0,n.writeFileSync)(r,f),{aesIv:o,encryptedAesKey:d,encryptedCode:u}},l=(e,t,r)=>{let i=(0,n.readFileSync)(t),o=s.byteLength,c=i.subarray(0,o);if(!c.equals(s))throw Error(`Incorrect file format`);let l=o,u=l+16,d=u+512,f=i.subarray(l,u),p=i.subarray(u,d),m=i.subarray(d),h=(0,a.privateDecrypt)(e,p),g=(0,a.createDecipheriv)(`aes-256-cbc`,h,f),_=Buffer.concat([g.update(m),g.final()]),v=_.toString(`utf8`);return r&&(0,n.writeFileSync)(r,v),v},u=(e,t)=>{let r=(0,n.readFileSync)(e,`utf8`);console.log(`Obfuscating...`),console.time(`Obfuscation complete in`);let i=o.default.obfuscate(r,{target:`node`,compact:!0,controlFlowFlattening:!0,controlFlowFlatteningThreshold:1,deadCodeInjection:!0,debugProtection:!0,identifierNamesGenerator:`hexadecimal`,numbersToExpressions:!0,selfDefending:!0,simplify:!0,splitStrings:!0,splitStringsChunkLength:5,stringArray:!0,stringArrayCallsTransform:!0,stringArrayCallsTransformThreshold:1,stringArrayEncoding:[`base64`],stringArrayIndexShift:!0,stringArrayRotate:!0,stringArrayShuffle:!0,stringArrayWrappersCount:2,stringArrayWrappersChainedCalls:!0,stringArrayWrappersType:`function`,stringArrayThreshold:1,transformObjectKeys:!0,unicodeEscapeSequence:!1});console.timeEnd(`Obfuscation complete in`);let a=i.getObfuscatedCode();return(0,n.writeFileSync)(t||e,a),a},d=(0,r.parseArgs)({allowPositionals:!0,allowNegative:!0,options:{input:{type:`string`,short:`i`,description:`Path to the input file`},key:{type:`string`,short:`k`,description:`Path to the key file (public for encrypt, private for decrypt)`},output:{type:`string`,short:`o`,description:`Path to the output file`},format:{type:`string`,short:`f`,description:`Output format`},watch:{type:`boolean`,description:`Watch file changes`},minify:{type:`boolean`,description:`Minify output`},obfuscate:{type:`boolean`,description:`Obfuscate output`},encrypt:{type:`boolean`,description:`Encrypt extension source code (.js will be packed inside .stx)`},decrypt:{type:`boolean`,description:`Decrypt encrypted extension`}}}),f=()=>{let e=[process.cwd(),t.default.join(process.cwd(),`src`),t.default.join(process.cwd(),`lib`)];for(let r of e){let e=(0,n.readdirSync)(r),i=e.filter(e=>!e.endsWith(`.d.ts`)).filter(e=>new Set([`.ts`,`.js`]).has(t.default.extname(e))),a=e=>t.default.basename(e,t.default.extname(e)),o=i.find(e=>a(e)===`index`)||i.find(e=>a(e)===`main`)||i[0];if(o)return t.default.join(r,o)}};(async()=>{let[e,...r]=d.positionals,a=d.values.input||r[0]||f();if(!a)throw Error(`No entry file found`);if(e===`build`||e===`pack`){let r=typeof d.values.minify==`boolean`?d.values.minify:!0;await(0,i.build)({entry:a,format:d.values.format??`cjs`,platform:`node`,target:`node22`,watch:d.values.watch,minify:r}),d.values.input=t.default.join(process.cwd(),`dist`,t.default.basename(a).replace(/\.ts$/,`.js`));let o=require(t.default.join(process.cwd(),`package.json`)),s=typeof d.values.obfuscate==`boolean`,l=s?d.values.obfuscate:o.private;l&&u(d.values.input,d.values.input);let f=d.values.encrypt||e===`pack`;if(f){let e=(0,n.readFileSync)(d.values.key||t.default.join(__dirname,`../public.pem`),`utf8`),r=d.values.output||d.values.input.replace(/\.js$/,`-${o.version}.stx`);c(e,d.values.input,r),(0,n.rmSync)(d.values.input)}}else if(e===`decrypt`){let e=(0,n.readFileSync)(d.values.key||t.default.join(__dirname,`../private.pem`),`utf8`),r=d.values.output||a.replace(/\.stx$/,`.js`);l(e,a,r),d.values.input&&(0,n.rmSync)(d.values.input)}else if(e===`dev`||e===`develop`||!e){let e=typeof d.values.minify==`boolean`?d.values.minify:!1;await(0,i.build)({entry:a,format:d.values.format??`cjs`,platform:`node`,target:`node20`,watch:!0,minify:e})}})();
2
+ const e=require(`./chunk-nOFOJqeH.js`),t=e.__toESM(require(`node:util`)),n=e.__toESM(require(`node:fs`)),r=e.__toESM(require(`node:path`)),i=e.__toESM(require(`tsdown`)),a=e.__toESM(require(`node:crypto`)),o=e.__toESM(require(`javascript-obfuscator`)),s=Buffer.from(`STX`,`utf8`),c=(e,t,r)=>{let i=(0,a.randomBytes)(32),o=(0,a.randomBytes)(16),c=(0,n.readFileSync)(t),l=(0,a.createCipheriv)(`aes-256-cbc`,i,o),u=Buffer.concat([l.update(c),l.final()]),d=(0,a.publicEncrypt)(e,i),f=Buffer.concat([s,o,d,u]);return r&&(0,n.writeFileSync)(r,f),{aesIv:o,encryptedAesKey:d,encryptedCode:u}},l=(e,t,r)=>{let i=(0,n.readFileSync)(t),o=s.byteLength,c=i.subarray(0,o);if(!c.equals(s))throw Error(`Incorrect file format`);let l=o,u=l+16,d=u+512,f=i.subarray(l,u),p=i.subarray(u,d),m=i.subarray(d),h=(0,a.privateDecrypt)(e,p),g=(0,a.createDecipheriv)(`aes-256-cbc`,h,f),_=Buffer.concat([g.update(m),g.final()]),v=_.toString(`utf8`);return r&&(0,n.writeFileSync)(r,v),v},u=(e,t)=>{let r=(0,n.readFileSync)(e,`utf8`);console.log(`Obfuscating...`),console.time(`Obfuscation complete in`);let i=o.default.obfuscate(r,{target:`node`,compact:!0,controlFlowFlattening:!0,controlFlowFlatteningThreshold:1,deadCodeInjection:!0,debugProtection:!0,identifierNamesGenerator:`hexadecimal`,numbersToExpressions:!0,selfDefending:!0,simplify:!0,splitStrings:!0,splitStringsChunkLength:5,stringArray:!0,stringArrayCallsTransform:!0,stringArrayCallsTransformThreshold:1,stringArrayEncoding:[`base64`],stringArrayIndexShift:!0,stringArrayRotate:!0,stringArrayShuffle:!0,stringArrayWrappersCount:2,stringArrayWrappersChainedCalls:!0,stringArrayWrappersType:`function`,stringArrayThreshold:1,transformObjectKeys:!0,unicodeEscapeSequence:!1});console.timeEnd(`Obfuscation complete in`);let a=i.getObfuscatedCode();return(0,n.writeFileSync)(t||e,a),a},d=(0,t.parseArgs)({allowPositionals:!0,allowNegative:!0,options:{input:{type:`string`,short:`i`,description:`Path to the input file`},key:{type:`string`,short:`k`,description:`Path to the key file (public for encrypt, private for decrypt)`},output:{type:`string`,short:`o`,description:`Path to the output file`},format:{type:`string`,short:`f`,description:`Output format`},watch:{type:`boolean`,description:`Watch file changes`},minify:{type:`boolean`,description:`Minify output`},obfuscate:{type:`boolean`,description:`Obfuscate output`},encrypt:{type:`boolean`,description:`Encrypt extension source code (.js will be packed inside .stx)`},decrypt:{type:`boolean`,description:`Decrypt encrypted extension`}}}),f=()=>{let e=[process.cwd(),r.default.join(process.cwd(),`src`),r.default.join(process.cwd(),`lib`)];for(let t of e){let e=(0,n.readdirSync)(t),i=e.filter(e=>!e.endsWith(`.d.ts`)).filter(e=>new Set([`.ts`,`.js`]).has(r.default.extname(e))),a=e=>r.default.basename(e,r.default.extname(e)),o=i.find(e=>a(e)===`index`)||i.find(e=>a(e)===`main`)||i[0];if(o)return r.default.join(t,o)}};(async()=>{let[e,...t]=d.positionals,a=d.values.input||t[0]||f();if(!a)throw Error(`No entry file found`);if(e===`build`||e===`pack`){let t=typeof d.values.minify==`boolean`?d.values.minify:!0;await(0,i.build)({entry:a,format:d.values.format??`cjs`,platform:`node`,target:`node22`,watch:d.values.watch,minify:t}),d.values.input=r.default.join(process.cwd(),`dist`,r.default.basename(a).replace(/\.ts$/,`.js`));let o=require(r.default.join(process.cwd(),`package.json`)),s=typeof d.values.obfuscate==`boolean`,l=s?d.values.obfuscate:o.private;l&&u(d.values.input,d.values.input);let f=d.values.encrypt||e===`pack`;if(f){let e=(0,n.readFileSync)(d.values.key||r.default.join(__dirname,`../public.pem`),`utf8`),t=d.values.output||d.values.input.replace(/\.js$/,`-${o.version}.stx`);c(e,d.values.input,t),(0,n.rmSync)(d.values.input)}}else if(e===`decrypt`){let e=(0,n.readFileSync)(d.values.key||r.default.join(__dirname,`../private.pem`),`utf8`),t=d.values.output||a.replace(/\.stx$/,`.js`);l(e,a,t),d.values.input&&(0,n.rmSync)(d.values.input)}else if(e===`dev`||e===`develop`||!e){let e=typeof d.values.minify==`boolean`?d.values.minify:!1;await(0,i.build)({entry:a,format:d.values.format??`cjs`,platform:`node`,target:`node20`,watch:!0,minify:e})}})();
package/out/azt.mjs ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import{createRequire as e}from"node:module";import{parseArgs as t}from"node:util";import{readFileSync as n,readdirSync as r,rmSync as i,writeFileSync as a}from"node:fs";import o from"node:path";import{build as s}from"tsdown";import{createCipheriv as c,createDecipheriv as l,privateDecrypt as u,publicEncrypt as d,randomBytes as f}from"node:crypto";import p from"javascript-obfuscator";var m=e(import.meta.url);const h=Buffer.from(`STX`,`utf8`),g=(e,t,r)=>{let i=f(32),o=f(16),s=n(t),l=c(`aes-256-cbc`,i,o),u=Buffer.concat([l.update(s),l.final()]),p=d(e,i),m=Buffer.concat([h,o,p,u]);return r&&a(r,m),{aesIv:o,encryptedAesKey:p,encryptedCode:u}},_=(e,t,r)=>{let i=n(t),o=h.byteLength,s=i.subarray(0,o);if(!s.equals(h))throw Error(`Incorrect file format`);let c=o,d=c+16,f=d+512,p=i.subarray(c,d),m=i.subarray(d,f),g=i.subarray(f),_=u(e,m),v=l(`aes-256-cbc`,_,p),y=Buffer.concat([v.update(g),v.final()]),b=y.toString(`utf8`);return r&&a(r,b),b},v=(e,t)=>{let r=n(e,`utf8`);console.log(`Obfuscating...`),console.time(`Obfuscation complete in`);let i=p.obfuscate(r,{target:`node`,compact:!0,controlFlowFlattening:!0,controlFlowFlatteningThreshold:1,deadCodeInjection:!0,debugProtection:!0,identifierNamesGenerator:`hexadecimal`,numbersToExpressions:!0,selfDefending:!0,simplify:!0,splitStrings:!0,splitStringsChunkLength:5,stringArray:!0,stringArrayCallsTransform:!0,stringArrayCallsTransformThreshold:1,stringArrayEncoding:[`base64`],stringArrayIndexShift:!0,stringArrayRotate:!0,stringArrayShuffle:!0,stringArrayWrappersCount:2,stringArrayWrappersChainedCalls:!0,stringArrayWrappersType:`function`,stringArrayThreshold:1,transformObjectKeys:!0,unicodeEscapeSequence:!1});console.timeEnd(`Obfuscation complete in`);let o=i.getObfuscatedCode();return a(t||e,o),o},y=t({allowPositionals:!0,allowNegative:!0,options:{input:{type:`string`,short:`i`,description:`Path to the input file`},key:{type:`string`,short:`k`,description:`Path to the key file (public for encrypt, private for decrypt)`},output:{type:`string`,short:`o`,description:`Path to the output file`},format:{type:`string`,short:`f`,description:`Output format`},watch:{type:`boolean`,description:`Watch file changes`},minify:{type:`boolean`,description:`Minify output`},obfuscate:{type:`boolean`,description:`Obfuscate output`},encrypt:{type:`boolean`,description:`Encrypt extension source code (.js will be packed inside .stx)`},decrypt:{type:`boolean`,description:`Decrypt encrypted extension`}}}),b=()=>{let e=[process.cwd(),o.join(process.cwd(),`src`),o.join(process.cwd(),`lib`)];for(let t of e){let e=r(t),n=e.filter(e=>!e.endsWith(`.d.ts`)).filter(e=>new Set([`.ts`,`.js`]).has(o.extname(e))),i=e=>o.basename(e,o.extname(e)),a=n.find(e=>i(e)===`index`)||n.find(e=>i(e)===`main`)||n[0];if(a)return o.join(t,a)}};(async()=>{let[e,...t]=y.positionals,r=y.values.input||t[0]||b();if(!r)throw Error(`No entry file found`);if(e===`build`||e===`pack`){let t=typeof y.values.minify==`boolean`?y.values.minify:!0;await s({entry:r,format:y.values.format??`cjs`,platform:`node`,target:`node22`,watch:y.values.watch,minify:t}),y.values.input=o.join(process.cwd(),`dist`,o.basename(r).replace(/\.ts$/,`.js`));let a=m(o.join(process.cwd(),`package.json`)),c=typeof y.values.obfuscate==`boolean`,l=c?y.values.obfuscate:a.private;l&&v(y.values.input,y.values.input);let u=y.values.encrypt||e===`pack`;if(u){let e=n(y.values.key||o.join(__dirname,`../public.pem`),`utf8`),t=y.values.output||y.values.input.replace(/\.js$/,`-${a.version}.stx`);g(e,y.values.input,t),i(y.values.input)}}else if(e===`decrypt`){let e=n(y.values.key||o.join(__dirname,`../private.pem`),`utf8`),t=y.values.output||r.replace(/\.stx$/,`.js`);_(e,r,t),y.values.input&&i(y.values.input)}else if(e===`dev`||e===`develop`||!e){let e=typeof y.values.minify==`boolean`?y.values.minify:!1;await s({entry:r,format:y.values.format??`cjs`,platform:`node`,target:`node20`,watch:!0,minify:e})}})();export{};
@@ -0,0 +1,3 @@
1
+ import{existsSync as e,mkdirSync as t,readSync as n,writeSync as r}from"node:fs";import i,{basename as a,dirname as o,join as s}from"node:path";import c,{EOL as l,homedir as u,tmpdir as d}from"node:os";import{setTimeout as f}from"node:timers/promises";import{readFile as p,rm as m,stat as h,writeFile as g}from"node:fs/promises";import{configureSync as te,getConsoleSink as ne,getLogger as re,withFilter as ie}from"@logtape/logtape";import{getFileSink as ae}from"@logtape/file";import{getPrettyFormatter as oe}from"@logtape/pretty";import{arch as se,platform as ce,stdin as le,stdout as ue,version as de}from"node:process";import"urlpattern-polyfill";import{EventEmitter as fe}from"node:events";import{createInterface as pe}from"node:readline/promises";import{URL as me}from"node:url";import{Agent as he,ProxyAgent as ge,fetch as _e,interceptors as ve,parseCookie as ye}from"undici";import{Impit as _}from"impit";import v from"metavm";import"picocolors";import"nanospinner";import y from"conf";var b=`azot`,x=`Azot`,S=`5.0.0-alpha.3`,C=`./out/main.js`,w=`./types/main.d.ts`,exports={".":{types:`./types/main.d.ts`,import:`./out/main.js`,require:`./out/main.js`},"./context":{types:`./types/context.d.ts`,import:`./out/context.js`,require:`./out/context.js`},"./vitest":{import:`./out/vitest.mjs`,require:`./out/vitest.js`}},T={azt:`out/azt.js`},E=[`out`,`azot.d.ts`,`types`,`.npmrc`],D=`Vitaly Gashkov <vitalygashkov@vk.com>`,O=`A powerful, extensible app for downloading videos`,k={type:`git`,url:`https://github.com/azot-labs/azot.git`},A=`https://azot.so`,j={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:desktop":`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`},M={node:`22`},N=[`darwin`,`linux`,`win32`],P=[{type:`individual`,url:`https://t.me/tribute/app?startapp=dqW2`}],F={"@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`},be={"@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`},xe={vitest:`>=3.2.0`},I={name:b,productName:x,version:S,main:C,types:w,exports,bin:T,files:E,author:D,description:O,repository:k,homepage:A,scripts:j,engines:M,os:N,funding:P,dependencies:F,devDependencies:be,peerDependencies:xe};`pkg`in process&&process.pkg;const Se=!!process.versions.electron&&!1,Ce=!Se;`${I.version}${ce}${se}${de}`,`${I.version}`,I.name;const L=I.productName,we={darwin:`macOS`,win32:`Windows`,linux:`Linux`},Te=we[process.platform],R=n=>{let r=typeof n==`string`?n:n[Te];return e(r)||t(r,{recursive:!0}),r},z=u(),Ee=d(),B=R({Windows:process.env.APPDATA||s(z,`AppData`,`Roaming`),macOS:s(z,`Library`,`Application Support`),Linux:process.env.XDG_DATA_HOME||s(z,`.local`,`share`)}),V=R({Windows:process.env.APPDATA||s(z,`AppData`,`Roaming`),macOS:s(z,`Library`,`Application Support`),Linux:process.env.XDG_CONFIG_HOME||s(z,`.config`)});R({Windows:process.env.LOCALAPPDATA||s(z,`AppData`,`Local`),macOS:s(z,`Library`,`Caches`),Linux:process.env.XDG_CACHE_HOME||s(z,`.cache`)}),R({Windows:s(z,`Downloads`),macOS:s(z,`Downloads`),Linux:process.env.XDG_DOWNLOAD_DIR||s(z,`Downloads`)});const De=R({Windows:s(B,L),macOS:s(B,L),Linux:s(B,L.toLowerCase())}),Oe=R({Windows:s(V,L),macOS:s(V,L),Linux:s(V,L.toLowerCase())}),ke=R({Windows:s(V,L,`logs`),macOS:s(z,`Library`,`Logs`,L),Linux:s(V,L.toLowerCase(),`logs`)});s(Ee,L.toLowerCase());const H=R(s(De,`extensions`));R(s(H,`installed`)),R(s(H,`work`)),s(Oe,`settings.json`);const Ae=process.argv.includes(`-d`)||process.argv.includes(`--debug`)||process.env.NODE_ENV_ELECTRON_VITE===`development`||!!process.env.ELECTRON_CLI_ARGS,je=()=>{let e=new Date().toISOString().split(`.`)[0].replace(`T`,`_`).replaceAll(`-`,``).replaceAll(`:`,``);return`Azot_${e}.log`},Me=()=>s(ke,je()),Ne=oe({timestamp:`time`,levelStyle:null,icons:!1,colors:!0,level:`FULL`,categoryWidth:0,categoryStyle:null,categoryTruncate:`end`,wordWrap:!0});te({sinks:{console:ie(ne({formatter:Ne}),Ae?`debug`:`info`),file:ae(Me(),{flushInterval:0})},loggers:[{category:[],lowestLevel:`trace`,sinks:[`console`,`file`]},{category:[`logtape`,`meta`],lowestLevel:`error`,sinks:[`console`]}]});const U=re([]),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}};new Intl.DateTimeFormat(`en-US`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1}),new Intl.DateTimeFormat(`en-US`,{hour:`2-digit`,minute:`2-digit`,second:`2-digit`,hour12:!1});var Pe=class e extends fe{static{this.requestEventName=`form`}static{this.responseEventName=`form:response`}constructor(){super(),Ce&&this.listen(async e=>{let t=pe({input:le,output:ue}),{title:n,description:r,fields:i,...a}=e,o={};for(let[e,{label:s,type:c}]of Object.entries(i||a)){let i=c===`confirm`,a=[n,r,s].filter(Boolean).join(`. `)+(i?` (y/n)`:``)+`: `,l=await Promise.race([t.question(a),f(J,``)]);o[e]=l}return t.close(),o})}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 Pe,Fe=async(e,t)=>{let n=t?.fields??{answer:{label:e}},r=await q.ask({title:t?.title,description:e,fields:n});return r},J=12e4,Ie=(e,t)=>{r(1,e||``);let i=Buffer.alloc(1),a=``;for(;;){try{n(0,i,0,1,null)}catch(e){if(e.code===`EOF`)break;throw e}let e=i.toString(`utf-8`);if(e===`
2
+ `||e===`\r`){if(e===`\r`)try{n(0,i,0,1,null),i.toString(`utf-8`)}catch(e){if(e.code===`EOF`)break;throw e}break}a+=e}return a.trim()||t},Le=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}},Y=e=>{let t=[];for(let n of e)try{let e=ye(n);e&&t.push(Le(e))}catch(e){U.debug(e)}return t},Re=async e=>{let t=await p(e,`utf8`).catch(()=>``);if(!t)return[];let n=t.split(l).flatMap(e=>e.split(`
3
+ `)),r=n.filter(e=>!!e.trim()&&!e.startsWith(`# `)),i=r.map(e=>e.split(` `)),a=[];for(let e of i){let[t,n,r,i,o,s,c]=e;a.push({name:s,value:c,expires:Number(o),maxAge:void 0,domain:t.replace(`#HttpOnly_`,``),path:r,secure:i===`TRUE`,httpOnly:void 0,sameSite:void 0,unparsed:e})}return a};var X=class{#data={};#cookies;#storagePath;#hasBeenRead=!1;static parse(e){return Y(e)}constructor({storagePath:e}={}){this.#storagePath=e,this.#cookies=[]}async import(e){let t=await h(e).catch(()=>null);t?.isFile()&&(this.#cookies=await Re(e),await m(e,{recursive:!0,force:!0}))}async#read(){if(!this.#storagePath||this.#hasBeenRead)return;let e=await h(this.#storagePath).catch(()=>null);if(e?.isFile()){let e=await p(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 g(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 _({browser:`chrome`,ignoreTlsErrors:!0,proxyUrl:e,followRedirects:!0,maxRedirects:n});let{redirect:a,retry:o}=ve;e?this.#agent=new ge({uri:e,allowH2:t}).compose(a({maxRedirections:n}),o({maxRetries:r})):this.#agent=new he({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 me(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?_e(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]=Y([e]);n&&t.push(n)}else if(Array.isArray(e)&&typeof e.at(0)==`string`){let n=Y(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)}};new Z;const{COMMON_CONTEXT:ze}=v,Be=(e,t=`Eval`)=>{try{let n=v.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[]},Ve=e=>{let t=`default`in y?y.default:y;return new t(e)};var He=class{#store;constructor({storagePath:e}){this.#store=Ve({cwd:o(e),configName:a(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(c.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 Ue=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`]]]),We=()=>{let e=Number(c.release().split(`.`)[0]),[t,n]=Ue.get(e)||[`Unknown`,``];return{name:t,version:n}},Ge=()=>{switch($()){case`macOS`:return We().version;case`Windows`:return c.release();case`Linux`:return c.release()}},Ke=()=>{let e=[{brand:`Azot`,version:I.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 t=>{let n={mobile:!1,platform:$(),brands:e};return t.includes(`architecture`)&&(n.architecture=c.arch()),t.includes(`platform`)&&(n.platform=$()),t.includes(`platformVersion`)&&(n.platformVersion=Ge()),t.includes(`fullVersionList`)&&(n.fullVersionList=[{brand:`Azot`,version:I.version},{brand:`Node.js`,version:process.version}]),n}}},qe=({name:e=`extension`,dir:t=process.cwd()}={})=>{let n=R(s(t,e)),r=new He({storagePath:s(n,`storage.json`)}),i=new X({storagePath:s(n,`cookies.json`)}),a=new Z({cookieStore:i}),o=(e,t,n)=>e.split(t)[1]?.split(n)[0]?.trim(),c={sanitizeString:W,execUrlPatterns:G,extendEpisodes:K,between:o,getRandomElements:Q},l={defineExtension:e=>e,version:I.version,input:Fe,sleep:f,sanitizeString:W,execUrlPatterns:G,extendEpisodes:K,between:o,getRandomElements:Q,utils:c,prompt:q.ask.bind(q)};class u{get cookie(){return i.toString()}}let d={fetch:a.fetch.bind(a),Response,Request,Headers,AbortController,AbortSignal,URL,URLSearchParams,URLPattern,Blob,structuredClone,btoa,atob,TextEncoder,TextDecoder,Uint8Array,crypto,console:Object.assign(U,{log:console.log}),prompt:Ie,alert:e=>{U.warn(e)},Event,EventTarget,localStorage:r,cookieStore:i,document:new u,eval:e=>Be(e)?.exports,navigator:{appName:`Azot`,appVersion:I.version,platform:process.platform,userAgentData:Ke()}},p={http:a,question:q,common:c,Streamyx:l,Azot:l,window:d,...d};return p};export{qe as createContext};
@@ -0,0 +1,3 @@
1
+ const e=require(`./chunk-nOFOJqeH.js`),t=e.__toESM(require(`node:fs`)),n=e.__toESM(require(`node:path`)),r=e.__toESM(require(`node:os`)),i=e.__toESM(require(`node:timers/promises`)),a=e.__toESM(require(`node:fs/promises`)),o=e.__toESM(require(`@logtape/logtape`)),s=e.__toESM(require(`@logtape/file`)),c=e.__toESM(require(`@logtape/pretty`)),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.3`,ee=`./out/main.js`,te=`./types/main.d.ts`,ne={".":{types:`./types/main.d.ts`,import:`./out/main.js`,require:`./out/main.js`},"./context":{types:`./types/context.d.ts`,import:`./out/context.js`,require:`./out/context.js`},"./vitest":{import:`./out/vitest.mjs`,require:`./out/vitest.js`}},re={azt:`out/azt.js`},ie=[`out`,`azot.d.ts`,`types`,`.npmrc`],b=`Vitaly Gashkov <vitalygashkov@vk.com>`,x=`A powerful, extensible app for downloading videos`,S={type:`git`,url:`https://github.com/azot-labs/azot.git`},C=`https://azot.so`,w={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:desktop":`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`},ae={node:`22`},oe=[`darwin`,`linux`,`win32`],se=[{type:`individual`,url:`https://t.me/tribute/app?startapp=dqW2`}],ce={"@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`},le={"@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={vitest:`>=3.2.0`},E={name:_,productName:v,version:y,main:ee,types:te,exports:ne,bin:re,files:ie,author:b,description:x,repository:S,homepage:C,scripts:w,engines:ae,os:oe,funding:se,dependencies:ce,devDependencies:le,peerDependencies:T};const ue=`pkg`in process&&process.pkg!==void 0,D=!!process.versions.electron&&!1,O=!D,de=`v${E.version} ${l.platform}-${l.arch} node-${l.version}`,fe=`v${E.version}`,pe=E.name,k=E.productName,A={darwin:`macOS`,win32:`Windows`,linux:`Linux`},j=A[process.platform],M=e=>{let n=typeof e==`string`?e:e[j];return(0,t.existsSync)(n)||(0,t.mkdirSync)(n,{recursive:!0}),n},N=(0,r.homedir)(),P=(0,r.tmpdir)(),F=M({Windows:process.env.APPDATA||(0,n.join)(N,`AppData`,`Roaming`),macOS:(0,n.join)(N,`Library`,`Application Support`),Linux:process.env.XDG_DATA_HOME||(0,n.join)(N,`.local`,`share`)}),I=M({Windows:process.env.APPDATA||(0,n.join)(N,`AppData`,`Roaming`),macOS:(0,n.join)(N,`Library`,`Application Support`),Linux:process.env.XDG_CONFIG_HOME||(0,n.join)(N,`.config`)}),me=M({Windows:process.env.LOCALAPPDATA||(0,n.join)(N,`AppData`,`Local`),macOS:(0,n.join)(N,`Library`,`Caches`),Linux:process.env.XDG_CACHE_HOME||(0,n.join)(N,`.cache`)}),he=M({Windows:(0,n.join)(N,`Downloads`),macOS:(0,n.join)(N,`Downloads`),Linux:process.env.XDG_DOWNLOAD_DIR||(0,n.join)(N,`Downloads`)}),L=M({Windows:(0,n.join)(F,k),macOS:(0,n.join)(F,k),Linux:(0,n.join)(F,k.toLowerCase())}),R=M({Windows:(0,n.join)(I,k),macOS:(0,n.join)(I,k),Linux:(0,n.join)(I,k.toLowerCase())}),z=M({Windows:(0,n.join)(I,k,`logs`),macOS:(0,n.join)(N,`Library`,`Logs`,k),Linux:(0,n.join)(I,k.toLowerCase(),`logs`)}),ge=(0,n.join)(P,k.toLowerCase()),B=M((0,n.join)(L,`extensions`)),_e=M((0,n.join)(B,`installed`)),ve=M((0,n.join)(B,`work`)),ye=(0,n.join)(R,`settings.json`),V=process.argv.includes(`-d`)||process.argv.includes(`--debug`)||process.env.NODE_ENV_ELECTRON_VITE===`development`||!!process.env.ELECTRON_CLI_ARGS,be=()=>{let e=new Date().toISOString().split(`.`)[0].replace(`T`,`_`).replaceAll(`-`,``).replaceAll(`:`,``);return`Azot_${e}.log`},H=()=>(0,n.join)(z,be()),U=(0,c.getPrettyFormatter)({timestamp:`time`,levelStyle:null,icons:!1,colors:!0,level:`FULL`,categoryWidth:0,categoryStyle:null,categoryTruncate:`end`,wordWrap:!0});(0,o.configureSync)({sinks:{console:(0,o.withFilter)((0,o.getConsoleSink)({formatter:U}),V?`debug`:`info`),file:(0,s.getFileSink)(H(),{flushInterval:0})},loggers:[{category:[],lowestLevel:`trace`,sinks:[`console`,`file`]},{category:[`logtape`,`meta`],lowestLevel:`error`,sinks:[`console`]}]});const W=(0,o.getLogger)([]),G=e=>{let t=[`}`,`{`,`%`,`>`,`<`,`^`,`;`,"`",`$`,`"`,`@`,`=`],n=e;for(let e in t)n=n.replaceAll(`/`,`_`).replaceAll(t[e],``);return n},K=(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}},q=(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(),O&&this.listen(async e=>{let t=(0,d.createInterface)({input:l.stdin,output:l.stdout}),{title:n,description:r,fields:a,...o}=e,s={};for(let[e,{label:c,type:l}]of Object.entries(a||o)){let a=l===`confirm`,o=[n,r,c].filter(Boolean).join(`. `)+(a?` (y/n)`:``)+`: `,u=await Promise.race([t.question(o),(0,i.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 J=new Ce,we=async(e,t)=>{let n=t?.fields??{answer:{label:e}},r=await J.ask({title:t?.title,description:e,fields:n});return r},Te=12e4,Ee=(e,n)=>{(0,t.writeSync)(1,e||``);let r=Buffer.alloc(1),i=``;for(;;){try{(0,t.readSync)(0,r,0,1,null)}catch(e){if(e.code===`EOF`)break;throw e}let e=r.toString(`utf-8`);if(e===`
2
+ `||e===`\r`){if(e===`\r`)try{(0,t.readSync)(0,r,0,1,null),r.toString(`utf-8`)}catch(e){if(e.code===`EOF`)break;throw e}break}i+=e}return i.trim()||n},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}},Y=e=>{let t=[];for(let n of e)try{let e=(0,p.parseCookie)(n);e&&t.push(De(e))}catch(e){W.debug(e)}return t},Oe=async e=>{let t=await(0,a.readFile)(e,`utf8`).catch(()=>``);if(!t)return[];let n=t.split(r.EOL).flatMap(e=>e.split(`
3
+ `)),i=n.filter(e=>!!e.trim()&&!e.startsWith(`# `)),o=i.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 Y(e)}constructor({storagePath:e}={}){this.#storagePath=e,this.#cookies=[]}async import(e){let t=await(0,a.stat)(e).catch(()=>null);t?.isFile()&&(this.#cookies=await Oe(e),await(0,a.rm)(e,{recursive:!0,force:!0}))}async#read(){if(!this.#storagePath||this.#hasBeenRead)return;let e=await(0,a.stat)(this.#storagePath).catch(()=>null);if(e?.isFile()){let e=await(0,a.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,a.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),W.debug(await r.text()),W.debug(String(r.status)),this.withRetry(e,t,n)):r}catch(r){let i=r;if(W.debug(i.stack),W.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]=Y([e]);n&&t.push(n)}else if(Array.isArray(e)&&typeof e.at(0)==`string`){let n=Y(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),W.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 ke=new Z,{COMMON_CONTEXT:Ae}=h.default,je=(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[]},Me=e=>{let t=`default`in g.default?g.default.default:g.default;return new t(e)};var Ne=class{#store;constructor({storagePath:e}){this.#store=Me({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(r.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 Pe=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`]]]),Fe=()=>{let e=Number(r.default.release().split(`.`)[0]),[t,n]=Pe.get(e)||[`Unknown`,``];return{name:t,version:n}},Ie=()=>{switch($()){case`macOS`:return Fe().version;case`Windows`:return r.default.release();case`Linux`:return r.default.release()}},Le=()=>{let e=[{brand:`Azot`,version:E.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 t=>{let n={mobile:!1,platform:$(),brands:e};return t.includes(`architecture`)&&(n.architecture=r.default.arch()),t.includes(`platform`)&&(n.platform=$()),t.includes(`platformVersion`)&&(n.platformVersion=Ie()),t.includes(`fullVersionList`)&&(n.fullVersionList=[{brand:`Azot`,version:E.version},{brand:`Node.js`,version:process.version}]),n}}},Re=({name:e=`extension`,dir:t=process.cwd()}={})=>{let r=M((0,n.join)(t,e)),a=new Ne({storagePath:(0,n.join)(r,`storage.json`)}),o=new X({storagePath:(0,n.join)(r,`cookies.json`)}),s=new Z({cookieStore:o}),c=(e,t,n)=>e.split(t)[1]?.split(n)[0]?.trim(),l={sanitizeString:G,execUrlPatterns:K,extendEpisodes:q,between:c,getRandomElements:Q},u={defineExtension:e=>e,version:E.version,input:we,sleep:i.setTimeout,sanitizeString:G,execUrlPatterns:K,extendEpisodes:q,between:c,getRandomElements:Q,utils:l,prompt:J.ask.bind(J)};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:Object.assign(W,{log:console.log}),prompt:Ee,alert:e=>{W.warn(e)},Event,EventTarget,localStorage:a,cookieStore:o,document:new d,eval:e=>je(e)?.exports,navigator:{appName:`Azot`,appVersion:E.version,platform:process.platform,userAgentData:Le()}},p={http:s,question:J,common:l,Streamyx:u,Azot:u,window:f,...f};return p};Object.defineProperty(exports,`createContext`,{enumerable:!0,get:function(){return Re}});
package/out/context.js ADDED
@@ -0,0 +1 @@
1
+ const e=require(`./context-DYv2PCKF.js`);exports.createContext=e.createContext;
@@ -0,0 +1 @@
1
+ import{createContext as e}from"./context-DTSYpvwR.mjs";export{e as createContext};
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/main.mjs ADDED
@@ -0,0 +1 @@
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};export{n as default};
package/out/vitest.js ADDED
@@ -0,0 +1 @@
1
+ const e=require(`./chunk-nOFOJqeH.js`),t=require(`./context-DYv2PCKF.js`),n=e.__toESM(require(`vitest`));n.vi.mock(`azot`,()=>{let e=t.createContext();return Object.entries(e).forEach(([e,t])=>{n.vi.stubGlobal(e,t)}),e.Azot});
package/out/vitest.mjs ADDED
@@ -0,0 +1 @@
1
+ import{createContext as e}from"./context-DTSYpvwR.mjs";import{vi as t}from"vitest";t.mock(`azot`,()=>{let n=e();return Object.entries(n).forEach(([e,n])=>{t.stubGlobal(e,n)}),n.Azot});export{};
package/package.json CHANGED
@@ -1,15 +1,32 @@
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.3",
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
+ "./context": {
14
+ "types": "./types/context.d.ts",
15
+ "import": "./out/context.js",
16
+ "require": "./out/context.js"
17
+ },
18
+ "./vitest": {
19
+ "import": "./out/vitest.mjs",
20
+ "require": "./out/vitest.js"
21
+ }
22
+ },
6
23
  "bin": {
7
24
  "azt": "out/azt.js"
8
25
  },
9
- "types": "azot.d.ts",
10
26
  "files": [
11
27
  "out",
12
28
  "azot.d.ts",
29
+ "types",
13
30
  ".npmrc"
14
31
  ],
15
32
  "author": "Vitaly Gashkov <vitalygashkov@vk.com>",
@@ -32,7 +49,8 @@
32
49
  "build:mac": "npm run bundle && electron-builder build --mac --config electron-builder.config.js",
33
50
  "build:win": "npm run bundle && electron-builder build --win --config electron-builder.config.js",
34
51
  "build:linux": "npm run bundle && electron-builder build --linux --config electron-builder.config.js",
35
- "publish": "npm run bundle && electron-builder build --publish always --config electron-builder.config.js",
52
+ "publish:desktop": "npm run bundle && electron-builder build --publish always --config electron-builder.config.js",
53
+ "publish:lib": "npm run bundle:lib && npm publish --tag alpha",
36
54
  "typecheck": "npm run typecheck:node && npm run typecheck:web",
37
55
  "typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
38
56
  "typecheck:web": "vue-tsc --noEmit -p tsconfig.web.json --composite false",
@@ -136,5 +154,8 @@
136
154
  "vue-sonner": "^1.3.0",
137
155
  "vue-tsc": "^3.0.6",
138
156
  "zod": "^3.25.42"
157
+ },
158
+ "peerDependencies": {
159
+ "vitest": ">=3.2.0"
139
160
  }
140
161
  }
@@ -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>;
@@ -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>;