@vyla-entertainment/sdk 1.6.0 → 1.9.0
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/README.md +12 -10
- package/package.json +1 -1
- package/src/config.js +116 -48
- package/src/sdk.d.ts +1 -1
- package/src/sources/1embed.js +34 -11
- package/src/sources/anihq.js +14 -2
- package/src/sources/anikoto.js +198 -0
- package/src/sources/anineko.js +122 -15
- package/src/sources/anizone.js +109 -0
- package/src/sources/cinesu.js +94 -0
- package/src/sources/flaxmovies.js +21 -9
- package/src/sources/fsonic.js +2 -2
- package/src/sources/fsonline.js +2 -2
- package/src/sources/kickassanime.js +107 -0
- package/src/sources/lmscript.js +43 -0
- package/src/sources/meowtv.js +1 -8
- package/src/sources/reanime.js +324 -0
- package/src/sources/videasy.js +6 -12
- package/src/sources/vidvault.js +114 -0
- package/src/sources/vidzee.js +210 -101
- package/src/sources/vixsrc.js +28 -14
- package/src/subtitles.js +0 -18
- package/src/utils/helpers.js +56 -20
- package/src/sources/goated.js +0 -262
- package/src/sources/nebula.js +0 -62
package/src/sources/vidzee.js
CHANGED
|
@@ -1,120 +1,229 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { USER_AGENT } from "../utils/helpers.js";
|
|
2
|
+
|
|
3
|
+
const PLAYER_ORIGIN = "https://player.vidzee.wtf";
|
|
4
|
+
const CORE_ORIGIN = "https://core.vidzee.wtf";
|
|
5
|
+
|
|
6
|
+
const SERVERS = [
|
|
7
|
+
{ id: "tik", name: "TCloud" },
|
|
8
|
+
{ id: "ipcloud", name: "IPcloud" },
|
|
9
|
+
{ id: "v6:Hindi", name: "Hindi v3" },
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
const WASM_B64 = "AGFzbQEAAAABPgtgAX8Bf2ACf38Bf2ABfwBgAn9/AGADf39/AGAAAGAEf39/fwBgBH9/f38Bf2ADf39/AX9gA39/fgBgAAF/Ag0BA2VudgVhYm9ydAAGAygnAgEAAAQBAAEDBAADBQAAAgMHAAEAAAQIAwEJAgIBBQAAAgEABQoBBQMBAAEGJgd/AUEAC38BQQALfwFBAAt/AUEAC38BQQALfwFBAAt/AEGA2wALB0gHB2RlY3J5cHQAJwVfX25ldwAGBV9fcGluACQHX191bnBpbgAiCV9fY29sbGVjdAAlC19fcnR0aV9iYXNlAwYGbWVtb3J5AgAIAR8MAqkBCogkJyUAIABFBEAPCyAAQRRrIgAQByMCRgRAIAAQECAAIwUjAkUQCgsLCgAgACABai0AAAsKACAAKAIEQXxxCw0AIABBFGsoAhBBAXYLDAAgACABaiACOgAAC1MBAX8gAEHs////A0sEQEHwDEGwDUH9AEEeEAAACyMARQRAEA0LIwAgAEEQahAaIgIgATYCDCACIAA2AhAgAiMBIwIQCiACEAsjA2okAyACQRRqCwoAIAAoAgRBA3ELKQAgACAAIAFBCHZqLQAAQQV0aiABQf8BcUEDdmotAAAgAUEHcXZBAXELwwEBBH8gASgCAEF8cSIDQYACSQR/IANBBHYFQR9B/P///wMgAyADQfz///8DTxsiA2drIgRBB2shAiADIARBBGt2QRBzCyEEIAEoAgghBSABKAIEIgMEQCADIAU2AggLIAUEQCAFIAM2AgQLIAEgACACQQR0IARqQQJ0aiIBKAJgRgRAIAEgBTYCYCAFRQRAIAAgAkECdGoiASgCBEF+IAR3cSEDIAEgAzYCBCADRQRAIAAgACgCAEF+IAJ3cTYCAAsLCwspAQF/IAEoAgghAyAAIAEgAnI2AgQgACADNgIIIAMgABARIAEgADYCCAsNACAAKAIAQXxxQQRqC7wCAQV/IAEoAgAhAyABQQRqIAEoAgBBfHFqIgQoAgAiAkEBcQRAIAAgBBAJIAEgA0EEaiACQXxxaiIDNgIAIAFBBGogASgCAEF8cWoiBCgCACECCyADQQJxBEAgAUEEaygCACIBKAIAIQYgACABEAkgASAGQQRqIANBfHFqIgM2AgALIAQgAkECcjYCACAEQQRrIAE2AgAgACADQXxxIgJBgAJJBH8gAkEEdgVBH0H8////AyACIAJB/P///wNPGyICZ2siA0EHayEFIAIgA0EEa3ZBEHMLIgIgBUEEdGpBAnRqKAJgIQMgAUEANgIEIAEgAzYCCCADBEAgAyABNgIECyAAIAVBBHQgAmpBAnRqIAE2AmAgACAAKAIAQQEgBXRyNgIAIAAgBUECdGoiACAAKAIEQQEgAnRyNgIEC5cBAQJ/PwAiAEEATAR/QQEgAGtAAEEASAVBAAsEQAALQbDbAEEANgIAQdDnAEEANgIAA0AgAUEXSQRAIAFBAnRBsNsAakEANgIEQQAhAANAIABBEEkEQCABQQR0IABqQQJ0QbDbAGpBADYCYCAAQQFqIQAMAQsLIAFBAWohAQwBCwtBsNsAQdTnAD8ArEIQhhAbQbDbACQACyYBAX8gAEEEayEBIABBD3FBASAAGwR/QQEFIAEoAgBBAXELGiABCxIAIAAgADYCBCAAIAA2AgggAAsnAQF/IAAQAyIBRQRAIAAoAggaDwsgASAAKAIIIgA2AgggACABEBELEgAgACABIAAoAgRBA3FyNgIEC0kBAX8gACABQQF0aiEBA0AgAyIAQQFrIQMgAARAIAEvAQAiACACLwEAIgRHBEAgACAEaw8LIAFBAmohASACQQJqIQIMAQsLQQALbgECf0EMQQYQBiIBRQRAQQxBAxAGIQELIAFBADYCACABQQA2AgQgAUEANgIIIABB/P///wNLBEBB4NcAQZDYAEETQTkQAAALIABBARAGIgJBACAA/AsAIAEgAjYCACABIAI2AgQgASAANgIIIAELjgEBAn8gAUGAAkkEfyABQQR2BUEfIAEQFSIBZ2siA0EHayECIAEgA0EEa3ZBEHMLIQEgACACQQJ0aigCBEF/IAF0cSIBBH8gACABaCACQQR0akECdGooAmAFIAAoAgBBfyACQQFqdHEiAQR/IAAgACABaCIAQQJ0aigCBGggAEEEdGpBAnRqKAJgBUEACwsLHQAgAEEBQRsgAGdrdGpBAWsgACAAQf7///8BSRsLLwAgAEH8////A0sEQEHwDEHwDUHNA0EdEAAAC0EMIABBE2pBcHFBBGsgAEEMTRsLZwECfyABKAIAIgNBfHEgAmsiBEEQTwRAIAEgAiADQQJxcjYCACABQQRqIAJqIgEgBEEEa0EBcjYCACAAIAEQDAUgASADQX5xNgIAIAFBBGogASgCAEF8cWoiACAAKAIAQX1xNgIACwswACAAIAIQGiICQQRqIAFBBGogASgCAEF8cfwKAAAgAUGk2wBPBEAgACABEBkLIAILFQAgASABKAIAQQFyNgIAIAAgARAMC48BAQJ/IAAgARAWIgIQFCIBRQRAQQQgACgCoAw/ACIBQRB0QQRrR3QgAhAVIAIgAkGAAk8bakH//wNqQYCAfHFBEHYhAyABIAMgASADShtAAEEASARAIANAAEEASARAAAsLIAAgAUEQdD8ArEIQhhAbIAAgAhAUIQELIAEoAgAaIAAgARAJIAAgASACEBcgAQuGAQEDfyABQRNqQXBxQQRrIQEgACgCoAwiAwRAIAFBEGsiBSADRgRAIAMoAgAhBCAFIQELCyACp0FwcSABayIDQRRJBEAPCyABIARBAnEgA0EIayIDQQFycjYCACABQQA2AgQgAUEANgIIIAFBBGogA2oiA0ECNgIAIAAgAzYCoAwgACABEAwLhQEBA38CQAJAAkACQAJAAkACQAJAAkAgAEEIaygCAA4IAAECAwQFBgcICw8LDwsPCyAAEB0PCyAAKAIAEAEPCyAAKAIEIgEgACgCDEECdGohAgNAIAEgAkkEQCABKAIAIgMEQCADEAELIAFBBGohAQwBCwsgACgCABABDwsgABAdDwsPCwALCQAgACgCABABC0MAIAEgACgCDE8EQEHw1QBBsNYAQfIAQSoQAAALIAAoAgQgAUECdGooAgAiAEUEQEHg1gBBsNYAQfYAQSgQAAALIAALGQBBoA4QDyQBQYDaABAPJARB4NoAEA8kBQv9AQEGfyAAIgFBCHYiAkHMzgBqLQAAIAJBlDJqLQAAQdYAbEGUMmogAEH/AXEiA0EDbmotAAAgA0EDcEECdEGAxwBqKAIAbEELdkEGcGpBAnRBjMcAaigCACICQf8BcSEAIAJBCHUhAgJAIABBAkkNACACQf8BcSEAIAJBCHYhAgNAIAAEQCAAQQF2IgYgAmpBAXRBzNIAaiIELQAAIgUgA0YEfyAELQABQQJ0QYzHAGooAgAiAkH/AXEhACACQQh1IQIgAEECSQ0DIAFBAWoPBSADIAVJBH8gBgUgAiAGaiECIAAgBmsLCyEADAELCyABDwsgASACQQAgAGtxagvABgEKfyAAEAQiCEUEQCAADwsgCEECdEECEAYhBwNAIAMgCEkEQCAAIANBAXRqIgEvAQAiAkEHdgRAAkAgAkH/rwNrQYEISSADIAhBAWtJcQRAIAEvAQIiBEH/twNrQYEISQRAIANBAWohAyAEQf8HcSACIgFB/wdxQQp0ckGAgARqIgJBgIAITwRAIAcgBUEBdGogASAEQRB0cjYCACAFQQFqIQUMAwsLCyACQbACRgRAIAcgBUEBdGpB6YCcGDYCACAFQQFqIQUFIAJBowdGBEAgCEEBSwRAQQAhASADIgJBHmsiBEEAIARBAE4bIQkCQANAIAIgCUoEQEF/IQYCQCACQQBMDQAgACACQQFrQQF0ai8BACIEQYD4A3FBgLgDRiACQQJrIgZBAE5xBEAgBEH/B3EgACAGQQF0ai8BACIKQf8HcUEKdGpBgIAEaiEGIApBgPgDcUGAsANGDQELQf3/AyAEIARBgPADcUGAsANGGyEGCyAGQfCDOEkEf0G0DiAGEAgFQQALRQRAQQAhBCAGQYrjB0kEf0H0JSAGEAgFQQALRQ0DQQEhAQsgAiAGQYCABE5BAWprIQIMAQsLQQAhBCABRQ0AIANBAWoiAkEeaiIBIAggASAISBshBANAIAIgBEgEQCAAIAJBAXRqIgYvAQAiAUGA+ANxQYCwA0YgAkEBaiAIR3EEQCAGLwECIgZBgPgDcUGAuANGBEAgAUEKdCAGakGAuP8aayEBCwsgAUHwgzhJBH9BtA4gARAIBUEAC0UEQCABQYrjB0kEf0H0JSABEAgFQQALRSEEDAMLIAIgAUGAgARPQQFqaiECDAELC0EBIQQLBUEAIQQLIAcgBUEBdGpBwgdBwwcgBBs7AQAFIAJBtskAa0EZTQRAIAcgBUEBdGogAkEaajsBAAUgAhAgQf///wBxIgFBgIAESQRAIAcgBUEBdGogATsBAAUgByAFQQF0aiABQYCABGsiAUEKdkGAsANyIAFB/wdxQYC4A3JBEHRyNgIAIAVBAWohBQsLCwsLBSAHIAVBAXRqIAIgAkHBAGtBGklBBXRyOwEACyADQQFqIQMgBUEBaiEFDAELCyAHIAVBAXQQIwszACAARQRADwsgAEEUayIAEAdBA0cEQEGw2gBBsA1BwwFBBRAAAAsgABAQIAAjASMCEAoLsAIBB38gAEEUayECIABBpNsASQRAIAEgAigCDBAGIgMgACABIAIoAhAiACAAIAFLG/wKAAAgAw8LIAFB7P///wNLBEBB8AxBsA1BjwFBHhAAAAsjAyACEAtrJAMjAEUEQBANCyABQRBqIQMgAEEQayIAQaTbAEkEQCMAIAAQDiADEBghAAUjACEEIAAQDiEAAkACQCADEBYiBiAAKAIAIgdBfHEiBU0NACAAQQRqIAAoAgBBfHFqIgIoAgAiCEEBcQRAIAVBBGogCEF8cWoiBSAGTwRAIAQgAhAJIAAgB0EDcSAFcjYCAAwCCwsgBCAAIAMQGCEADAELIAQgACAGEBcLCyAAQRRqIgBBFGsiAiABNgIQIAIQAyACNgIIIAIoAgggAhARIAIQCyMDaiQDIAALNQEBfyAABEAgAEEUayIBEAdBA0YEQEHQ2QBBsA1BtQFBBxAAAAsgARAQIAEjBEEDEAoLIAALgAIBBX9B4AgQAUHQChABQcAMEAFB8NUAEAFB4NcAEAFB4NYAEAFB8AwQAUHQ2QAQAUGw2gAQASMEIgEQAyEAA0AgACABRwRAIAAQBxogAEEUahAcIAAQAyEADAELCyMCRSMFIgMQAyEAA0AgACADRwRAIAAQBxogAEEUahAcIAAQAyEADAELCyMBIgQQAyEAA0AgACAERwRAIAAQBxogABADIABBpNsASQRAIABBADYCBCAAQQA2AggFIwMgABALayQDIABBBGoiAEGk2wBPBEAjAEUEQBANCyMAIAAQDhAZCwshAAwBCwsgBCAENgIEIAQgBDYCCCADJAEgBCQFJAILqAEBBX9BgAJBBxAGIgFBAEGAAvwLAANAIABBgAJIBEAgASAAIAAQBSAAQQFqIQAMAQsLQQAhAANAIABBgAJIBEAgASAAEAIgAmohBCAAQSBvIgJB7AgoAgBPBEBB8NUAQbDWAEHyAEEqEAAACyABIAAQAiEDIAEgACABIAQgAkHkCCgCAGotAABqQf8BcSICEAIQBSABIAIgAxAFIABBAWohAAwBCwsgAQuFBAEGfyABECEhAQNAIAJB3AooAgBIBEACQAJ/QQFB0AogAhAeIgUgAUYNABpBACAFRSABRXINABpBACAFEAQgARAEIgZHDQAaIAFBACAFIAYQEkULBEBBASEDDAELIAJBAWohAgwCCwsLIANFBEBBACECA0AgAkHMDCgCAEgEQAJAQcAMIAIQHiEFIAEQBCAFEARKBH9B/v///wEgARAEIgYgBkH+////AUobIAUQBCIGayIHQQBIBH9BAQUgASAHIAUgBhASCwVBAQtFBEBBASEDDAELIAJBAWohAgwCCwsLCyADRQRAQQAQEw8LECYhAkEAIQNBACEBA0AgAUGAEEgEQCACIARBAWpB/wFxIgQQAiADakH/AXEhAyACIAQQAiEFIAIgBCACIAMQAhAFIAIgAyAFEAUgAUEBaiEBDAELCyAAKAIIIgUQEyEGQQAhAQNAIAEgBUgEQCACIARBAWpB/wFxIgQQAiADakH/AXEhAyACIAQQAiEHIAIgBCACIAMQAhAFIAIgAyAHEAUgASAAKAIITwRAQfDVAEGQ2QBBpwFBLRAAAAsgAiACIAQQAiACIAMQAmpB/wFxEAIgASAAKAIEai0AAHNB/wFxIQcgASAGKAIITwRAQfDVAEGQ2QBBsgFBLRAAAAsgASAGKAIEaiAHOgAAIAFBAWohAQwBCwsgBgsLgT6pAQBBjAgLATwAQZgICygBAAAAIAAAAOT5sn2MGm71A325isVOIfC51sOngf5CrWXA6bc/FIotAEHMCAsBLABB2AgLFQQAAAAQAAAAIAQAACAEAAAgAAAAIABB/AgLATwAQYgJCykCAAAAIgAAAHAAbABhAHkAZQByAC4AdgBpAGQAegBlAGUALgB3AHQAZgBBvAkLASwAQcgJCxkCAAAAEgAAAGwAbwBjAGEAbABoAG8AcwB0AEHsCQsBLABB+AkLGQIAAAASAAAAMQAyADcALgAwAC4AMAAuADEAQZwKCwEcAEGoCgsSAQAAAAwAAACQBAAA0AQAAAAFAEG8CgsBLABByAoLFQUAAAAQAAAAMAUAADAFAAAMAAAAAwBB7AoLASwAQfgKCx8CAAAAGAAAAC4AbABvAHYAYQBiAGwAZQAuAGEAcABwAEGcCwsBPABBqAsLLQIAAAAmAAAALgBsAG8AdgBhAGIAbABlAHAAcgBvAGoAZQBjAHQALgBjAG8AbQBB3AsLASwAQegLCx0CAAAAFgAAAC4AdgBpAGQAegBlAGUALgB3AHQAZgBBjAwLARwAQZgMCxIBAAAADAAAAIAFAACwBQAA8AUAQawMCwEsAEG4DAsVBQAAABAAAAAgBgAAIAYAAAwAAAADAEHcDAsBPABB6AwLLwIAAAAoAAAAQQBsAGwAbwBjAGEAdABpAG8AbgAgAHQAbwBvACAAbABhAHIAZwBlAEGcDQsBPABBqA0LJQIAAAAeAAAAfgBsAGkAYgAvAHIAdAAvAHQAYwBtAHMALgB0AHMAQdwNCwE8AEHoDQslAgAAAB4AAAB+AGwAaQBiAC8AcgB0AC8AdABsAHMAZgAuAHQAcwBBtA4LgAQSEBMUFRYXGBkaGxwdHh8gIRAQIhAQECMkJSYnKCkQKisQEBAQEBAQEBAQECwtLhAvEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQMBAQEDEQMjM0NTY3EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEDgQEDk6EDs8PRAQEBAQED4QED9AQUJDREVGR0hJSktMEE1OTxAQEBAQEBAQEBAQEBAQEBAQEBAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEFFSEBAQUxAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBUEBAQEBAQEBAQEBAQEBAQEBAQEBBVVhAQEBAQEBBXEBAQEBBYWVoQEBAQEFtcEBAQEBAQEBAQXRAQEBAQEBAQEBAQEABB1BILOP//////////////////////////////////////////AAAAAIBAAAQAAABAAQAAAAAAAAAAoZABAEGqEwsb////////////////////////////////MASwAEHkEwsC+AMAQf8TCySCAAAAAAAA/v////+/tgAAAAAAEAA/AP8XAAAAAAH4//8AAAEAQa4UCxDAv/89AAAAgAIAAAD///8HAEHIFAsYwP8BAAAAAAAA+D8kAADA//8/AAAAAAAOAEHuFAuhAfj//////wcAAAAAAAAU/iH+AAwAAgACAAAAAAAAEB4gAAAMAABABgAAAAAAABCGOQIAAAAjAAYAAAAAAAAQviEAAAwAAPwCAAAAAAAAkB4gYAAMAAAABAAAAAAAAAABIAAAAAAAABEAAAAAAADAwT1gAAwAAAACAAAAAAAAkEAwAAAMAAAAAwAAAAAAABgeIAAADAAAAAIAAAAAAAAAAARcAEGaFgsE8gfAfwBBqhYLBPIfQD8AQbcWCxYDAACgAgAAAAAAAP5/3+D//v///x9AAEHZFgsP4P1mAAAAwwEAHgBkIAAgAEHzFgsBEABB/xYLAeAAQZYXCzQcAAAAHAAAAAwAAAAMAAAAAAAAALA/QP6PIAAAAAAAeAAAAAAAAAgAAAAAAAAAYAAAAAACAEHYFwsEhwEEDgBB9hcLToAJAAAAAAAAQH/lH/ifAAAAAIAA//8BAAAAAAAAAA8AAAAAANAXBAAAAAD4DwADAAAAPDsAAAAAAABAowMAAAAAAADwzwAAAAAAAAAAPwBBzhgLJvf//SEQAwAAAAAA8P////////8HAAEAAAD4///////////////7AEGLGQsooAPgAOAA4ABgAPgAA5B8AAAAAAAA3/8CgAAA/x8AAAAAAAD/////AQBBwxkLATAAQdEZCwKAAwBB4RkLA4AAgABB8BkLCv////8AAAAAAIAAQZQaCwggAAAAADw+CABBpxoLAX4AQbMaCwRwAAAgAEHzGgsDPwAQAEGBGwsHgPe/AAAA8ABBkhsLBwMA/////wMAQaIbCwQBAAAHAEGzGwsHA0QIAABgEABBzBsLRzAAAAD//wOAAAAAAMA/AACA/wMAAAAAAAcAAAAAAMgzAIAAAGAAAAAAAAAAAH5mAAgQAAAAAAEQAAAAAAAAncECAAAgADBYAEGfHAsD+AAOAEGwHAsIICEAAAAAAEAAQcocCxX8/wMAAAAAAAAA//8IAP//AAAAACQAQfMcCyGAgEAABAAAAEABAAAAAAABAAAAAMAAAAAAAAAAAAgAAA4AQbMdCwEgAEHQHQsBAQBB4h0LAsAHAEH0HQsIbvAAAAAAAIcAQZAeCwlgAAAAAAAAAPAAQckeCwEYAEHcHgsDwP8BAEH0Hgs6AgAAAAAAAP9/AAAAAAAAgAMAAAAAAHgmACAAAAAAAAAHAAAAgO8fAAAAAAAAAAgAAwAAAAAAwH8AngBBuR8LA4DTQABBzx8LFID4BwAAAwAAAAAAABgBAAAAwB8fAEH7HwsF/1wAAEAAQYogCwP4hQ0AQaogCwY8sAEAADAAQbogCwP4pwEAQckgCwIovwBB1yALA+C8DwBB+SALA4D/BgBBmyELAlgIAEGuIQsa8AwBAAAA/gcAAAAA+HmAAH4OAAAAAAD8fwMAQdohCwJ/vwBB5iELBfz///xtAEH6IQsDfrS/AEGGIgsBowBBsiILChgAAAAAAAAA/wEAQfIiCwsfAAAAAAAAAH8ADwBBnSMLFIAAAAAAAAAAgP//AAAAAAAAAAAbAEHHIwsCYA8AQeAjCwqAA/j/5w8AAAA8AEH8IwsBHABBlCQLFv///////3/4//////8fIAAQAAD4/v8AQbQkCwZ////52wcAQdokCwL/PwBBkSULAfAAQa4lCwF/AEG8JQsC8A8AQfMlCwH4AEH0JQuABBITFBUWFxAQEBAQEBAQEBAYEBAZEBAQEBAQEBAaGxEcHR4QEB8QEBAQEBAQICEQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAiIxAQECQQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQJRAQECYQEBAQJxAQEBAQEBAoEBAQEBAQEBAQEBApEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECoQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECssLS4QEBAQEBAQEBAQEBAQEBAQEC8QEBAQEBAQMBAQEBAQEBAQEBAQEBAQAEGUKgt9//////////////////////////////////////////8AAAAAAAAAAP7//wf+//8HAAAAAAAEIAT//3////9/////////////////////////////////9/D/////////////////////////////////7/////8BAwAAAB8AQZwrC0ogAAAAAADPvEDX///7////////////v///////////////////////A/z///////////////////////////7///9/AP//////AQBBiCwLDP////+/IP//////5wBBqCwLDP////////////8/PwBBxCwLUP8B///////nAAAAAAAAAAD///////////////////////////////8AAAAAAAAAAP//Pz//////Pz//qv///z/////////fX9wfzw//H9wfAEGiLQsGAoAAAP8fAEG0LQsRhPwvPlC9H/LgQwAA/////xgAQeotCzDA////////AwAA//////9///////9//////////////////////x94DAD/////vyAAQbwuCwz//////z8AAP///z8AQdguCz/8////////////////eP////////wHAAAAAGAHAAAAAAAA///////3/wH/////////////AAAAAAAAAAB/APgAQbgvCwj+//8H/v//BwBB1C8LCv////////////8AQeovCwr/////D/////8PAEGEMAsP////////BwD///////8HAEGoMAsI//////////8AQbwwCwj//////////wBB1DALiQH/////////////3///////////32Te/+vv/////////7/n39////97X/z9//////////////////////////////////////////////////////8//////f//9/////f//9/////f//9/////f/////3////9///3DwAAAAAAAP//////////DwBB+jELDP///wP///8D////AwBBlDILgAQHCAkKCwwGBgYGBgYGBgYGDQYGDgYGBgYGBgYGDxAREgYTBgYGBgYGBgYGBhQVBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGFhcGBgYYBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYZBgYGBhoGBgYGBgYGGwYGBgYGBgYGBgYGHAYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYdBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYeBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgBBgzcLFCQrKysrKysrKwEAVFZWVlZWVlZWAEGqNwufAxgAAAArKysrKysrBysrW1ZWVlZWVlZKVlYFMVAxUDFQMVAxUDFQMVAxUCRQeTFQMVAxOFAxUDFQMVAxUDFQMVAxUE4xAk4NDU4DTgAkbgBOMSZuUU4kUE45FIEbHR1TMVAxUA0xUDFQMVAbUyRQMQJce1x7XHtce1x7FHlce1x7XC0rSQNIA3hcexQAlgoBKygGBgAqBioqKwe7tSseACsHKysrASsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrASsrKysrKysrKysrKysrKysrKysrKysrKisrKysrKysrKysrKyvNRs0rACUrBwEGAVVWVlZWVlVWVgIkgYGBgYEVgYGBAAArALLRstGy0bLRAADNzAEA19fX19eDgYGBgYGBgYGBgaysrKysrKysrKwcAAAAAAAxUDFQMVAxUDFQMQIAADFQMVAxUDFQMVAxUDFQMVAxUE4xUDFQTjFQMVAxUDFQMVAxUDFQMQKHpoemh6aHpoemh6aHpoemKisrKysrKysrKysrKwAAAFRWVlZWVlZWVlZWVlYAQac7CyFUVlZWVlZWVlZWVlZWDAAMKisrKysrKysrKysrKysHKgEAQf07C3cqKysrKysrKysrKysrKysrKysrKysrKysrKytWVmyBFQArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysHbANBKytWVlZWVlZWVlZWVlZWVixWKysrKysrKysrKysrKysrKysrKysrAQBBnD0LCAxsAAAAAAAGAEHKPQvoAgYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlVnqeJgYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYlBiUGJQYBKytPVlYsK39WVjkrK1VWVisrT1ZWLCt/VlaBN3Vbe1wrK09WVgKsBAAAOSsrVVZWKytPVlYsKytWVjITgVcAb4F+ydd+LYGBDn45f29XAIGBfhUAfgMrKysrKysrKysrKysHKyQrlysrKysrKysrKyorKysrK1ZWVlZWgIGBgYE5uyorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrAYGBgYGBgYGBgYGBgYGBgcmsrKysrKysrKysrKysrKzQDQBOMQK0wcHX1yRQMVAxUDFQMVAxUDFQMVAxUDFQMVAxUDFQMVAxUDFQMVDX11PBR9TX19cFKysrKysrKysrKysrBwEAAQBBjcEACx9OMVAxUDFQMVAxUDFQMVANAAAAAAAkUDFQMVAxUDFQAEHOwQALVisrKysrKysrKysreVx7XHtPe1x7XHtce1x7XHtce1x7XHtce1wtKyt5FFx7XC15KlwnXHtce1x7pAAKtFx7XHtPA3g4KysrKysrKysrKysrK08tKysBAEG/wgALAUgAQcnCAAsbKisrKysrKysrKysrKysrKysrKysrKysrKysrAEGFwwALFCsrKysrKysrBwBIVlZWVlZWVlYCAEHQwwALGysrKysrKysrKysrKytVVlZWVlZWVlZWVlZWDgBBisQACxokKysrKysrKysrKysHAFZWVlZWVlZWVlZWVgBB0MQACyckKysrKysrKysrKysrKysrKwcAAAAAVlZWVlZWVlZWVlZWVlZWVlYAQbHFAAsWKisrKysrKysrKytWVlZWVlZWVlZWDgBB58UACxYqKysrKysrKysrK1ZWVlZWVlZWVlYOAEGoxgALFysrKysrKysrKysrVVZWVlZWVlZWVlYOAEGBxwALCAgAAFYBAAA5AEGQxwALvAcBIAAAAOD//wC/HQAA5wIAAHkAAAIkAAABAQAAAP///wAAAAABAgAAAP7//wE5//8AGP//AYf//wDU/v8AwwAAAdIAAAHOAAABzQAAAU8AAAHKAAABywAAAc8AAABhAAAB0wAAAdEAAACjAAAB1QAAAIIAAAHWAAAB2gAAAdkAAAHbAAAAOAAAAwAAAACx//8Bn///Acj//wIoJAAAAAAAAQEAAAD///8AM///ACb//wF+//8BKyoAAV3//wEoKgAAPyoAAT3//wFFAAABRwAAAB8qAAAcKgAAHioAAC7//wAy//8ANv//ADX//wBPpQAAS6UAADH//wAopQAARKUAAC///wAt//8A9ykAAEGlAAD9KQAAK///ACr//wDnKQAAQ6UAACqlAAC7//8AJ///ALn//wAl//8AFaUAABKlAAIkTAAAAAAAASAAAADg//8BAQAAAP///wBUAAABdAAAASYAAAElAAABQAAAAT8AAADa//8A2///AOH//wDA//8Awf//AQgAAADC//8Ax///ANH//wDK//8A+P//AKr//wCw//8ABwAAAIz//wHE//8AoP//Afn//wIacAABAQAAAP///wEgAAAA4P//AVAAAAEPAAAA8f//AAAAAAEwAAAA0P//AQEAAAD///8AAAAAAMALAAFgHAAAAAAAAdCXAAEIAAAA+P//AgWKAAAAAAABQPT/AJ7n/wDCiQAA2+f/AJLn/wCT5/8AnOf/AJ3n/wCk5/8AAAAAADiKAAAEigAA5g4AAQEAAAD///8AAAAAAMX//wFB4v8CHY8AAAgAAAH4//8AAAAAAFYAAAGq//8ASgAAAGQAAACAAAAAcAAAAH4AAAAJAAABtv//Aff//wDb4/8BnP//AZD//wGA//8Bgv//AgWsAAAAAAABEAAAAPD//wEcAAABAQAAAaPi/wFB3/8But//AOT//wILsQABAQAAAP///wEwAAAA0P//AAAAAAEJ1v8BGvH/ARnW/wDV1f8A2NX/AeTV/wED1v8B4dX/AeLV/wHB1f8AAAAAAKDj/wAAAAABAQAAAP///wIMvAAAAAAAAQEAAAD///8BvFr/AaADAAH8df8B2Fr/ADAAAAGxWv8BtVr/Ab9a/wHuWv8B1lr/Aeta/wHQ//8BvVr/Ach1/wAAAAAAMGj/AGD8/wAAAAABIAAAAOD//wAAAAABKAAAANj//wAAAAABQAAAAMD//wAAAAABIAAAAOD//wAAAAABIAAAAOD//wAAAAABIgAAAN7//wBBzc4ACwUGJ1FvdwBB3M4ACxJ8AAB/AAAAAAAAAACDjpKXAKoAQfjOAAsCtMQAQfLPAAsGxskAAADbAEHL0AALDt4AAAAA4QAAAAAAAADkAEHk0AALAecAQbrRAAsB6gBBtdIACwHtAEHM0gALkAMwDDENeA5/D4AQgRGGEokTihOOFI8VkBaTE5QXlRiWGZcamhucGZ0cnh2fHqYfqR+uH7EgsiC3Ib8ixSPII8sj3STyI/Yl9yYgLTouPS8+MD8xQDFDMkQzRTRQNVE2UjdTOFQ5WTpbO1w8YT1jPmU/ZkBoQWlCakBrQ2xEb0JxRXJGdUd9SIJJh0qJS4pMi0yMTZJOnU+eUEVXex18HX0df1iGWYhaiVqKWoxbjlyPXKxdrV6uXq9ewl/MYM1hzmHPYtBj0WTVZdZm12fwaPFp8mrza/Rs9W35bv0t/i3/LVBpUWlSaVNpVGlVaVZpV2lYaVlpWmlbaVxpXWleaV9pggCDAIQAhQCGAIcAiACJAMB1z3aAiYGKgouFjIaNcJ1xnXaed554n3mfeqB7oHyhfaGzorqju6O8pL6lw6LMpNqm26blauqn66fsbvOi+Kj5qPqp+6n8pCawKrErsk6zhAhiumO7ZLxlvWa+bb9uwG/BcMJ+w3/Dfc+N0JTRq9Ks063UsNWx1rLXxNjF2cbaAEHc1QALATwAQejVAAsrAgAAACQAAABJAG4AZABlAHgAIABvAHUAdAAgAG8AZgAgAHIAYQBuAGcAZQBBnNYACwEsAEGo1gALIQIAAAAaAAAAfgBsAGkAYgAvAGEAcgByAGEAeQAuAHQAcwBBzNYACwF8AEHY1gALZQIAAABeAAAARQBsAGUAbQBlAG4AdAAgAHQAeQBwAGUAIABtAHUAcwB0ACAAYgBlACAAbgB1AGwAbABhAGIAbABlACAAaQBmACAAYQByAHIAYQB5ACAAaQBzACAAaABvAGwAZQB5AEHM1wALASwAQdjXAAsjAgAAABwAAABJAG4AdgBhAGwAaQBkACAAbABlAG4AZwB0AGgAQfzXAAsBPABBiNgACy0CAAAAJgAAAH4AbABpAGIALwBhAHIAcgBhAHkAYgB1AGYAZgBlAHIALgB0AHMAQbzYAAsBPABByNgACy0CAAAAJgAAAH4AbABpAGIALwBzAHQAYQB0AGkAYwBhAHIAcgBhAHkALgB0AHMAQfzYAAsBPABBiNkACysCAAAAJAAAAH4AbABpAGIALwB0AHkAcABlAGQAYQByAHIAYQB5AC4AdABzAEG82QALATwAQcjZAAsxAgAAACoAAABPAGIAagBlAGMAdAAgAGEAbAByAGUAYQBkAHkAIABwAGkAbgBuAGUAZABBnNoACwE8AEGo2gALLwIAAAAoAAAATwBiAGoAZQBjAHQAIABpAHMAIABuAG8AdAAgAHAAaQBuAG4AZQBkAEGA2wALIQgAAAAgAAAAIAAAACAAAAAAAAAAQgAAAAJBAABBAAAAZA==";
|
|
13
|
+
|
|
14
|
+
function base64ToU8(b64) {
|
|
15
|
+
const cleaned = b64.replace(/\s+/g, "");
|
|
16
|
+
if (typeof Buffer !== "undefined") {
|
|
17
|
+
const node = Buffer.from(cleaned, "base64");
|
|
18
|
+
const copy = new Uint8Array(node.length);
|
|
19
|
+
copy.set(node);
|
|
20
|
+
return copy;
|
|
21
|
+
}
|
|
22
|
+
const bin = atob(cleaned);
|
|
23
|
+
const out = new Uint8Array(bin.length);
|
|
24
|
+
for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
3
27
|
|
|
4
|
-
|
|
5
|
-
|
|
28
|
+
let wasmInstancePromise = null;
|
|
29
|
+
|
|
30
|
+
async function initWasmCrypto() {
|
|
31
|
+
if (wasmInstancePromise) return wasmInstancePromise;
|
|
32
|
+
|
|
33
|
+
wasmInstancePromise = (async () => {
|
|
34
|
+
if (typeof WebAssembly === "undefined") return null;
|
|
35
|
+
try {
|
|
36
|
+
const u8 = base64ToU8(WASM_B64);
|
|
37
|
+
const ab = new ArrayBuffer(u8.byteLength);
|
|
38
|
+
new Uint8Array(ab).set(u8);
|
|
39
|
+
const module = await WebAssembly.compile(ab);
|
|
40
|
+
|
|
41
|
+
let E;
|
|
42
|
+
let Q;
|
|
43
|
+
let s;
|
|
44
|
+
|
|
45
|
+
function L(A, B) {
|
|
46
|
+
try {
|
|
47
|
+
s.setUint32(A, B, true);
|
|
48
|
+
} catch {
|
|
49
|
+
s = new DataView(E.buffer);
|
|
50
|
+
s.setUint32(A, B, true);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
6
53
|
|
|
7
|
-
|
|
54
|
+
function U(A) {
|
|
55
|
+
try {
|
|
56
|
+
return s.getUint32(A, true);
|
|
57
|
+
} catch {
|
|
58
|
+
s = new DataView(E.buffer);
|
|
59
|
+
return s.getUint32(A, true);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
8
62
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
63
|
+
function H(A) {
|
|
64
|
+
if (!A) return null;
|
|
65
|
+
const B = (A + new Uint32Array(E.buffer)[(A - 4) >>> 2]) >>> 1;
|
|
66
|
+
const C = new Uint16Array(E.buffer);
|
|
67
|
+
let I = A >>> 1;
|
|
68
|
+
let G = "";
|
|
69
|
+
while (B - I > 1024) {
|
|
70
|
+
G += String.fromCharCode(...C.subarray(I, (I += 1024)));
|
|
71
|
+
}
|
|
72
|
+
return G + String.fromCharCode(...C.subarray(I, B));
|
|
73
|
+
}
|
|
12
74
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
75
|
+
function i(A) {
|
|
76
|
+
if (A == null) return 0;
|
|
77
|
+
const B = A.length;
|
|
78
|
+
const C = Q.__new(B << 1, 2) >>> 0;
|
|
79
|
+
const I = new Uint16Array(E.buffer);
|
|
80
|
+
for (let G = 0; G < B; ++G) I[(C >>> 1) + G] = A.charCodeAt(G);
|
|
81
|
+
return C;
|
|
82
|
+
}
|
|
18
83
|
|
|
19
|
-
|
|
20
|
-
|
|
84
|
+
function F(A, B) {
|
|
85
|
+
return B ? new A(E.buffer, U(B + 4), s.getUint32(B + 8, true) / A.BYTES_PER_ELEMENT).slice() : null;
|
|
86
|
+
}
|
|
21
87
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
88
|
+
function e(A, B, C, I) {
|
|
89
|
+
if (I == null) return 0;
|
|
90
|
+
const G = I.length;
|
|
91
|
+
const y = Q.__pin(Q.__new(G << C, 1)) >>> 0;
|
|
92
|
+
const D = Q.__new(12, B) >>> 0;
|
|
93
|
+
L(D + 0, y);
|
|
94
|
+
s.setUint32(D + 4, y, true);
|
|
95
|
+
s.setUint32(D + 8, G << C, true);
|
|
96
|
+
new A(E.buffer, y, G).set(I);
|
|
97
|
+
Q.__unpin(y);
|
|
98
|
+
return D;
|
|
99
|
+
}
|
|
25
100
|
|
|
26
|
-
|
|
27
|
-
const key = await webcrypto.subtle.importKey('raw', keyMat, { name: 'AES-GCM' }, false, ['decrypt']);
|
|
101
|
+
const r = new Map();
|
|
28
102
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
cachedKeyTs = now;
|
|
38
|
-
return cachedKey;
|
|
39
|
-
} catch (err) {
|
|
40
|
-
throw new Error('Failed to decrypt Vidzee master key');
|
|
41
|
-
}
|
|
42
|
-
}
|
|
103
|
+
function n(A) {
|
|
104
|
+
if (A) {
|
|
105
|
+
const B = r.get(A);
|
|
106
|
+
if (B) r.set(A, B + 1);
|
|
107
|
+
else r.set(Q.__pin(A), 1);
|
|
108
|
+
}
|
|
109
|
+
return A;
|
|
110
|
+
}
|
|
43
111
|
|
|
44
|
-
function
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const decrypted = CryptoJS.AES.decrypt(
|
|
55
|
-
ciphertext,
|
|
56
|
-
CryptoJS.enc.Utf8.parse(keyPadded),
|
|
57
|
-
{
|
|
58
|
-
iv: CryptoJS.enc.Base64.parse(ivBase64),
|
|
59
|
-
mode: CryptoJS.mode.CBC,
|
|
60
|
-
padding: CryptoJS.pad.Pkcs7
|
|
112
|
+
function c(A) {
|
|
113
|
+
if (A) {
|
|
114
|
+
const B = r.get(A);
|
|
115
|
+
if (B === 1) {
|
|
116
|
+
Q.__unpin(A);
|
|
117
|
+
r.delete(A);
|
|
118
|
+
} else if (B) {
|
|
119
|
+
r.set(A, B - 1);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
61
122
|
}
|
|
62
|
-
);
|
|
63
123
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
124
|
+
const importObject = {
|
|
125
|
+
env: Object.setPrototypeOf(
|
|
126
|
+
{
|
|
127
|
+
abort(A, B, C, I) {
|
|
128
|
+
A = H(A >>> 0) >>> 0;
|
|
129
|
+
B = H(B >>> 0) >>> 0;
|
|
130
|
+
C = C >>> 0;
|
|
131
|
+
I = I >>> 0;
|
|
132
|
+
throw new Error(`abort: ${A} in ${B}:${C}:${I}`);
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
Object.create(globalThis)
|
|
136
|
+
),
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
const instance = await WebAssembly.instantiate(module, importObject);
|
|
140
|
+
Q = instance.exports;
|
|
141
|
+
E = Q.memory;
|
|
142
|
+
s = new DataView(E.buffer);
|
|
143
|
+
|
|
144
|
+
return {
|
|
145
|
+
decrypt(rawPayload, domain) {
|
|
146
|
+
const ptrA = n(e(Uint8Array, 6, 0, rawPayload));
|
|
147
|
+
const ptrB = i(domain);
|
|
148
|
+
try {
|
|
149
|
+
return F(Uint8Array, Q.decrypt(ptrA, ptrB) >>> 0);
|
|
150
|
+
} finally {
|
|
151
|
+
c(ptrA);
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
} catch {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
})();
|
|
159
|
+
|
|
160
|
+
return wasmInstancePromise;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function decryptWasmPayload(payloadB64) {
|
|
164
|
+
const decrypter = await initWasmCrypto();
|
|
165
|
+
if (!decrypter) return null;
|
|
166
|
+
try {
|
|
167
|
+
const raw = base64ToU8(payloadB64);
|
|
168
|
+
const domain = "player.vidzee.wtf";
|
|
169
|
+
const decryptedBytes = decrypter.decrypt(raw, domain);
|
|
170
|
+
if (!decryptedBytes || !decryptedBytes.length) return null;
|
|
171
|
+
const jsonStr = new TextDecoder().decode(decryptedBytes);
|
|
172
|
+
return JSON.parse(jsonStr);
|
|
173
|
+
} catch {
|
|
174
|
+
return null;
|
|
67
175
|
}
|
|
68
176
|
}
|
|
69
177
|
|
|
70
|
-
export async function getStream(
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
'Accept': 'application/json',
|
|
74
|
-
'Referer': PLAYER_URL,
|
|
75
|
-
'Origin': PLAYER_URL,
|
|
76
|
-
...(clientIP && { 'X-Forwarded-For': clientIP })
|
|
77
|
-
};
|
|
178
|
+
export async function getStream(args) {
|
|
179
|
+
const { id, s, e } = args;
|
|
180
|
+
const isTv = s != null && e != null;
|
|
78
181
|
|
|
79
182
|
try {
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
183
|
+
const streamPromises = SERVERS.map(async (server) => {
|
|
184
|
+
const endpoint = isTv
|
|
185
|
+
? `${CORE_ORIGIN}/streams/tv/${encodeURIComponent(id)}/${encodeURIComponent(s)}/${encodeURIComponent(e)}?s=${encodeURIComponent(server.id)}&e=1`
|
|
186
|
+
: `${CORE_ORIGIN}/streams/movie/${encodeURIComponent(id)}?s=${encodeURIComponent(server.id)}&e=1`;
|
|
187
|
+
|
|
188
|
+
const res = await fetch(endpoint, {
|
|
189
|
+
headers: {
|
|
190
|
+
"User-Agent": USER_AGENT,
|
|
191
|
+
"Accept": "application/json, text/plain, */*",
|
|
192
|
+
"Referer": `${PLAYER_ORIGIN}/`,
|
|
193
|
+
"Origin": PLAYER_ORIGIN,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
if (!res.ok) return null;
|
|
198
|
+
const data = await res.json();
|
|
199
|
+
if (!data?.c) return null;
|
|
200
|
+
|
|
201
|
+
const decoded = await decryptWasmPayload(data.c);
|
|
202
|
+
if (!decoded?.url) return null;
|
|
203
|
+
|
|
204
|
+
const streamUrl = decoded.url;
|
|
205
|
+
const isM3U8 = streamUrl.toLowerCase().includes(".m3u8");
|
|
206
|
+
|
|
207
|
+
return {
|
|
208
|
+
quality: server.name,
|
|
209
|
+
url: streamUrl,
|
|
210
|
+
type: isM3U8 ? "hls" : "mp4",
|
|
211
|
+
headers: {
|
|
212
|
+
"User-Agent": USER_AGENT,
|
|
213
|
+
"Referer": `${PLAYER_ORIGIN}/`,
|
|
214
|
+
"Origin": PLAYER_ORIGIN,
|
|
215
|
+
...(decoded.headers || {}),
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
const results = await Promise.allSettled(streamPromises);
|
|
221
|
+
const allUrls = results
|
|
222
|
+
.filter((r) => r.status === "fulfilled" && r.value)
|
|
223
|
+
.map((r) => r.value);
|
|
224
|
+
|
|
225
|
+
return allUrls.length ? { allUrls } : null;
|
|
226
|
+
} catch {
|
|
118
227
|
return null;
|
|
119
228
|
}
|
|
120
229
|
}
|
package/src/sources/vixsrc.js
CHANGED
|
@@ -13,7 +13,11 @@ const HEADERS = {
|
|
|
13
13
|
function extract(regex, text) {
|
|
14
14
|
const m = text?.match(regex);
|
|
15
15
|
if (!m) return null;
|
|
16
|
-
|
|
16
|
+
let val = m[1];
|
|
17
|
+
val = val.replace(/\\u0026/gi, '&');
|
|
18
|
+
val = val.replace(/\\\//g, '/');
|
|
19
|
+
val = val.replace(/\\/g, '');
|
|
20
|
+
return val;
|
|
17
21
|
}
|
|
18
22
|
|
|
19
23
|
export async function getStream({ id, s, e, absoluteBase }) {
|
|
@@ -22,36 +26,40 @@ export async function getStream({ id, s, e, absoluteBase }) {
|
|
|
22
26
|
? `${BASE_URL}/api/tv/${id}/${s}/${e}`
|
|
23
27
|
: `${BASE_URL}/api/movie/${id}`;
|
|
24
28
|
|
|
25
|
-
const apiProxy = absoluteBase
|
|
29
|
+
const apiProxy = absoluteBase && absoluteBase !== '/'
|
|
26
30
|
? `${absoluteBase.replace(/^https:\/\/(localhost|127\.0\.0\.1)/, 'http://$1')}/api?url=${encodeURIComponent(apiUrl)}&proxyHeaders=${encodeURIComponent(JSON.stringify(HEADERS))}`
|
|
27
31
|
: apiUrl;
|
|
28
32
|
|
|
29
|
-
const apiText = await fetchText(apiProxy).catch(() => null);
|
|
33
|
+
const apiText = await fetchText(apiProxy, { headers: HEADERS }).catch(() => null);
|
|
30
34
|
const apiData = JSON.parse(apiText || '{}');
|
|
31
35
|
if (!apiData.src) return null;
|
|
32
36
|
|
|
33
37
|
const embedUrl = apiData.src.startsWith('http') ? apiData.src : `${BASE_URL}${apiData.src}`;
|
|
34
|
-
const embedProxy = absoluteBase
|
|
38
|
+
const embedProxy = absoluteBase && absoluteBase !== '/'
|
|
35
39
|
? `${absoluteBase.replace(/^https:\/\/(localhost|127\.0\.0\.1)/, 'http://$1')}/api?url=${encodeURIComponent(embedUrl)}&proxyHeaders=${encodeURIComponent(JSON.stringify(HEADERS))}`
|
|
36
40
|
: embedUrl;
|
|
37
41
|
|
|
38
|
-
const html = await fetchText(embedProxy).catch(() => null);
|
|
42
|
+
const html = await fetchText(embedProxy, { headers: HEADERS }).catch(() => null);
|
|
39
43
|
if (!html) return null;
|
|
40
44
|
|
|
41
45
|
const token = extract(/token["']\s*:\s*["']([^"']+)/, html);
|
|
42
46
|
const expires = extract(/expires["']\s*:\s*["']([^"']+)/, html);
|
|
43
47
|
let playlist = extract(/url["']\s*:\s*["']([^"']+)/, html);
|
|
48
|
+
|
|
44
49
|
if (!token || !expires || !playlist) return null;
|
|
45
50
|
|
|
46
|
-
|
|
51
|
+
if (playlist.startsWith('/')) {
|
|
52
|
+
playlist = `${BASE_URL}${playlist}`;
|
|
53
|
+
}
|
|
54
|
+
|
|
47
55
|
const lang = extract(/lang(?:uage)?["']\s*:\s*["']([a-z]{2,5})/i, html) || 'en';
|
|
48
56
|
const rawMasterUrl = `${playlist}${playlist.includes('?') ? '&' : '?'}token=${token}&expires=${expires}&h=1&lang=${lang}`;
|
|
49
57
|
|
|
50
|
-
const masterProxy = absoluteBase
|
|
51
|
-
? `${absoluteBase.replace(/^https:\/\/(localhost|127\.0\.0\.1)/, 'http://$1')}/api?url=${encodeURIComponent(rawMasterUrl)}&proxyHeaders=${encodeURIComponent(JSON.stringify(HEADERS))}`
|
|
58
|
+
const masterProxy = absoluteBase && absoluteBase !== '/'
|
|
59
|
+
? `${absoluteBase.replace(/^https:\/\/(localhost|127\.0\.0\.1)/, 'http://$1')}/api?url=${encodeURIComponent(rawMasterUrl)}&proxyHeaders=${encodeURIComponent(JSON.stringify({ ...HEADERS, Referer: embedUrl }))}`
|
|
52
60
|
: rawMasterUrl;
|
|
53
61
|
|
|
54
|
-
const playlistText = await fetchText(
|
|
62
|
+
const playlistText = await fetchText(masterProxy, { headers: { ...HEADERS, 'Referer': embedUrl } }).catch(() => null);
|
|
55
63
|
if (!playlistText?.includes('#EXTM3U')) return null;
|
|
56
64
|
|
|
57
65
|
let finalUrl = null;
|
|
@@ -74,17 +82,23 @@ export async function getStream({ id, s, e, absoluteBase }) {
|
|
|
74
82
|
if (!finalUrl) finalUrl = rawMasterUrl;
|
|
75
83
|
|
|
76
84
|
if (!finalUrl.startsWith('http')) {
|
|
77
|
-
const
|
|
78
|
-
|
|
85
|
+
const baseMatch = rawMasterUrl.match(/^(https?:\/\/[^\/]+)/);
|
|
86
|
+
const base = baseMatch ? baseMatch[1] : BASE_URL;
|
|
87
|
+
if (finalUrl.startsWith('/')) {
|
|
88
|
+
finalUrl = `${base}${finalUrl}`;
|
|
89
|
+
} else {
|
|
90
|
+
const pathParts = rawMasterUrl.split('/');
|
|
91
|
+
pathParts.pop();
|
|
92
|
+
finalUrl = `${pathParts.join('/')}/${finalUrl}`;
|
|
93
|
+
}
|
|
79
94
|
}
|
|
80
95
|
|
|
81
|
-
const alreadyProxied = /^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?\/api\?url=/.test(finalUrl);
|
|
82
|
-
|
|
83
96
|
return {
|
|
84
97
|
allUrls: [
|
|
85
98
|
{
|
|
86
99
|
url: finalUrl,
|
|
87
|
-
|
|
100
|
+
server: 'VixSrc',
|
|
101
|
+
skipProxy: true,
|
|
88
102
|
headers: {
|
|
89
103
|
...HEADERS,
|
|
90
104
|
'Referer': `${BASE_URL}/`
|
package/src/subtitles.js
CHANGED
|
@@ -3,7 +3,6 @@ import { getUA } from './utils/helpers.js';
|
|
|
3
3
|
const SUBTITLE_BASES = [
|
|
4
4
|
'https://sub.vdrk.site/v1',
|
|
5
5
|
'https://sub.vdrk.site/v2',
|
|
6
|
-
'https://fed-subs.pstream.mov'
|
|
7
6
|
];
|
|
8
7
|
const VYLIAN_MESSAGES = [
|
|
9
8
|
"Thanks for using Vyla!"
|
|
@@ -63,23 +62,6 @@ export async function fetchSubtitles(paths = []) {
|
|
|
63
62
|
: [];
|
|
64
63
|
}
|
|
65
64
|
|
|
66
|
-
if (base.includes('fed-subs.pstream.mov')) {
|
|
67
|
-
if (!data?.subtitles || typeof data.subtitles !== 'object') return [];
|
|
68
|
-
|
|
69
|
-
return Object.entries(data.subtitles)
|
|
70
|
-
.map(([language, sub]) => {
|
|
71
|
-
if (!sub?.subtitle_link) return null;
|
|
72
|
-
const ext = sub.subtitle_link.split('.').pop()?.toLowerCase();
|
|
73
|
-
return {
|
|
74
|
-
label: sub.subtitle_name || language,
|
|
75
|
-
file: sub.subtitle_link,
|
|
76
|
-
type: ext === 'vtt' ? 'vtt' : 'srt',
|
|
77
|
-
source: 'febbox'
|
|
78
|
-
};
|
|
79
|
-
})
|
|
80
|
-
.filter(Boolean);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
65
|
const v1 = Array.isArray(data) ? data : [];
|
|
84
66
|
return v1.map(x => ({
|
|
85
67
|
label: x.label,
|
package/src/utils/helpers.js
CHANGED
|
@@ -67,8 +67,7 @@ function cacheGet(cache, key) {
|
|
|
67
67
|
|
|
68
68
|
function cacheSet(cache, key, val, ttl) { cache.set(key, { val, ts: Date.now(), ttl }); }
|
|
69
69
|
|
|
70
|
-
export async function createStreamArgs(source, tmdbApiKey, id, s, e, clientIP=null) {
|
|
71
|
-
const getAbsoluteBase = host => (host.startsWith('localhost') || host.startsWith('127.0.0.1')) ? `http://${host}` : `https://${host}`;
|
|
70
|
+
export async function createStreamArgs(source, tmdbApiKey, id, s, e, clientIP = null) {
|
|
72
71
|
const audio = /dub$/.test(source.key) ? 'dub' : 'sub';
|
|
73
72
|
return {
|
|
74
73
|
id: id,
|
|
@@ -83,13 +82,25 @@ export async function createStreamArgs(source, tmdbApiKey, id, s, e, clientIP=nu
|
|
|
83
82
|
}
|
|
84
83
|
|
|
85
84
|
export async function validateTmdbId(tmdbApiKey, tmdbId, mediaType = 'movie') {
|
|
86
|
-
|
|
85
|
+
let apiKey = tmdbApiKey;
|
|
86
|
+
let id = tmdbId;
|
|
87
|
+
let type = mediaType;
|
|
88
|
+
if (id === 'movie' || id === 'tv' || !id) {
|
|
89
|
+
if (apiKey && apiKey !== 'movie' && apiKey !== 'tv') {
|
|
90
|
+
type = id || 'movie';
|
|
91
|
+
id = apiKey;
|
|
92
|
+
apiKey = process.env.TMDB_API_KEY;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!apiKey) {
|
|
96
|
+
apiKey = process.env.TMDB_API_KEY;
|
|
97
|
+
}
|
|
98
|
+
const key = `${id}-${type}`;
|
|
87
99
|
const cached = cacheGet(tmdbValidationCache, key);
|
|
88
100
|
if (cached !== undefined) return cached;
|
|
89
|
-
|
|
90
|
-
if (!k) return { valid: false, error: 'TMDB API key not configured' };
|
|
101
|
+
if (!apiKey) return { valid: false, error: 'TMDB API key not configured' };
|
|
91
102
|
try {
|
|
92
|
-
const res = await fetch(`https://api.themoviedb.org/3/${
|
|
103
|
+
const res = await fetch(`https://api.themoviedb.org/3/${type}/${id}?api_key=${apiKey}`, { signal: AbortSignal.timeout(5000) });
|
|
93
104
|
if (res.ok) {
|
|
94
105
|
const data = await res.json();
|
|
95
106
|
const isValid = !!(data?.id && (data?.title || data?.name));
|
|
@@ -108,15 +119,30 @@ export async function validateTmdbId(tmdbApiKey, tmdbId, mediaType = 'movie') {
|
|
|
108
119
|
}
|
|
109
120
|
|
|
110
121
|
export async function getTmdbInfo(tmdbApiKey, tmdbId, mediaType, season) {
|
|
111
|
-
|
|
122
|
+
let apiKey = tmdbApiKey;
|
|
123
|
+
let id = tmdbId;
|
|
124
|
+
let type = mediaType;
|
|
125
|
+
let s = season;
|
|
126
|
+
if (apiKey === 'movie' || apiKey === 'tv') {
|
|
127
|
+
type = apiKey;
|
|
128
|
+
id = tmdbId;
|
|
129
|
+
apiKey = process.env.TMDB_API_KEY;
|
|
130
|
+
} else if (id === 'movie' || id === 'tv') {
|
|
131
|
+
type = id;
|
|
132
|
+
id = apiKey;
|
|
133
|
+
apiKey = process.env.TMDB_API_KEY;
|
|
134
|
+
}
|
|
135
|
+
if (!apiKey) {
|
|
136
|
+
apiKey = process.env.TMDB_API_KEY;
|
|
137
|
+
}
|
|
138
|
+
const key = `${id}-${type}-${s || ''}`;
|
|
112
139
|
const cached = cacheGet(tmdbInfoCache, key);
|
|
113
140
|
if (cached !== undefined) return cached;
|
|
114
|
-
|
|
115
|
-
if (!k) return { isAnime: false, titles: [], year: null, imdbId: null };
|
|
141
|
+
if (!apiKey) return { isAnime: false, titles: [], year: null, imdbId: null };
|
|
116
142
|
try {
|
|
117
143
|
const [mainRes, seasonRes] = await Promise.all([
|
|
118
|
-
fetch(`https://api.themoviedb.org/3/${
|
|
119
|
-
|
|
144
|
+
fetch(`https://api.themoviedb.org/3/${type}/${id}?api_key=${apiKey}&append_to_response=external_ids`, { signal: AbortSignal.timeout(5000) }),
|
|
145
|
+
s && type === 'tv' ? fetch(`https://api.themoviedb.org/3/tv/${id}/season/${s}?api_key=${apiKey}`, { signal: AbortSignal.timeout(5000) }) : Promise.resolve(null),
|
|
120
146
|
]);
|
|
121
147
|
let mainData = null, seasonData = null;
|
|
122
148
|
if (mainRes.ok) mainData = await mainRes.json(); else mainRes.body?.cancel();
|
|
@@ -125,10 +151,10 @@ export async function getTmdbInfo(tmdbApiKey, tmdbId, mediaType, season) {
|
|
|
125
151
|
const isAnime = genres.some(g => g.id === 16) && ((mainData?.origin_country || []).includes('JP') || mainData?.original_language === 'ja');
|
|
126
152
|
const titles = [];
|
|
127
153
|
if (seasonData?.name) titles.push(seasonData.name);
|
|
128
|
-
const
|
|
154
|
+
const titleText = mainData?.title || mainData?.name || '';
|
|
129
155
|
const ot = mainData?.original_title || mainData?.original_name || '';
|
|
130
|
-
if (
|
|
131
|
-
if (ot && ot !==
|
|
156
|
+
if (titleText) titles.push(titleText);
|
|
157
|
+
if (ot && ot !== titleText) titles.push(ot);
|
|
132
158
|
const dateStr = seasonData?.air_date || mainData?.release_date || mainData?.first_air_date || '';
|
|
133
159
|
const result = { isAnime, titles: [...new Set(titles.filter(Boolean))], year: dateStr ? parseInt(dateStr.slice(0, 4), 10) : null, imdbId: mainData?.imdb_id || mainData?.external_ids?.imdb_id || null };
|
|
134
160
|
cacheSet(tmdbInfoCache, key, result, 600000);
|
|
@@ -178,16 +204,26 @@ export async function tmdbToAnilist(tmdbId, mediaType, season, titles = [], year
|
|
|
178
204
|
}
|
|
179
205
|
|
|
180
206
|
export async function imdbToTmdb(tmdbApiKey, imdbId, mediaType = 'movie') {
|
|
181
|
-
|
|
207
|
+
let apiKey = tmdbApiKey;
|
|
208
|
+
let id = imdbId;
|
|
209
|
+
let type = mediaType;
|
|
210
|
+
if (id === 'movie' || id === 'tv') {
|
|
211
|
+
type = id;
|
|
212
|
+
id = apiKey;
|
|
213
|
+
apiKey = process.env.TMDB_API_KEY;
|
|
214
|
+
}
|
|
215
|
+
if (!apiKey) {
|
|
216
|
+
apiKey = process.env.TMDB_API_KEY;
|
|
217
|
+
}
|
|
218
|
+
const key = `imdb-${id}`;
|
|
182
219
|
const cached = cacheGet(tmdbInfoCache, key);
|
|
183
220
|
if (cached !== undefined) return cached;
|
|
184
|
-
|
|
185
|
-
if (!k) return null;
|
|
221
|
+
if (!apiKey) return null;
|
|
186
222
|
try {
|
|
187
|
-
const data = await fetchJson(`https://api.themoviedb.org/3/find/${
|
|
223
|
+
const data = await fetchJson(`https://api.themoviedb.org/3/find/${id}?api_key=${apiKey}&external_source=imdb_id`, { signal: AbortSignal.timeout(5000) });
|
|
188
224
|
let result = null;
|
|
189
|
-
if (
|
|
190
|
-
else if (
|
|
225
|
+
if (type === 'movie' && data.movie_results?.length) result = data.movie_results[0].id;
|
|
226
|
+
else if (type === 'tv' && data.tv_results?.length) result = data.tv_results[0].id;
|
|
191
227
|
if (result) cacheSet(tmdbInfoCache, key, result, 600000);
|
|
192
228
|
return result;
|
|
193
229
|
} catch { return null; }
|