Compare commits

..

No commits in common. "main" and "v3.1.4" have entirely different histories.
main ... v3.1.4

4 changed files with 254 additions and 1840 deletions

1975
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "stream-bypass", "name": "stream-bypass",
"version": "3.1.6", "version": "3.1.4",
"displayName": "Stream Bypass", "displayName": "Stream Bypass",
"author": "bytedream", "author": "bytedream",
"description": "Multi-browser addon for multiple streaming providers which redirects directly to the source video", "description": "Multi-browser addon for multiple streaming providers which redirects directly to the source video",
@ -29,23 +29,23 @@
"@samrum/vite-plugin-web-extension": "^5.1.1", "@samrum/vite-plugin-web-extension": "^5.1.1",
"@sveltejs/vite-plugin-svelte": "^5.0.3", "@sveltejs/vite-plugin-svelte": "^5.0.3",
"@tsconfig/svelte": "^5.0.4", "@tsconfig/svelte": "^5.0.4",
"@types/chrome": "^0.0.320", "@types/chrome": "^0.0.313",
"@types/firefox-webext-browser": "^120.0.4", "@types/firefox-webext-browser": "^120.0.4",
"eslint": "^9.26.0", "eslint": "^9.23.0",
"eslint-config-prettier": "^10.1.3", "eslint-config-prettier": "^10.1.1",
"eslint-plugin-svelte": "^3.5.1", "eslint-plugin-svelte": "^3.5.0",
"hls.js": "^1.6.2", "hls.js": "^1.6.0",
"prettier": "^3.5.3", "prettier": "^3.5.3",
"prettier-plugin-svelte": "^3.3.3", "prettier-plugin-svelte": "^3.3.3",
"sass": "^1.87.0", "sass": "^1.86.2",
"svelte": "^5.28.2", "svelte": "^5.25.6",
"svelte-check": "^4.1.7", "svelte-check": "^4.1.5",
"svelte-preprocess": "^6.0.3", "svelte-preprocess": "^6.0.3",
"tslib": "^2.8.1", "tslib": "^2.8.1",
"typescript": "^5.8.3", "typescript": "^5.8.2",
"typescript-eslint": "^8.32.0", "typescript-eslint": "^8.29.0",
"vite": "^6.3.5", "vite": "^6.2.5",
"web-ext": "^8.6.0" "web-ext": "^8.5.0"
}, },
"type": "module" "type": "module"
} }

View File

@ -15,9 +15,6 @@ export interface Match {
): Promise< ): Promise<
string | { [MatchMediaType.Hls]: string } | { [MatchMediaType.Native]: string } | null string | { [MatchMediaType.Hls]: string } | { [MatchMediaType.Native]: string } | null
>; >;
// allow other properties that may be implemented by the objects that use this interface declaration
[other: string]: any;
} }
export enum MatchMediaType { export enum MatchMediaType {
@ -51,7 +48,7 @@ export const Doodstream: Match = {
replace: true, replace: true,
regex: [/(\/pass_md5\/.*?)'.*(\?token=.*?expiry=)/s], regex: [/(\/pass_md5\/.*?)'.*(\?token=.*?expiry=)/s],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
const response = await fetch(`https://${window.location.host}${match[1]}`, { const response = await fetch(`https://${window.location.host}${match[1]}`, {
headers: { headers: {
Range: 'bytes=0-' Range: 'bytes=0-'
@ -67,10 +64,10 @@ export const Doodstream: Match = {
export const DropLoad: Match = { export const DropLoad: Match = {
name: 'Dropload', name: 'Dropload',
id: 'dropload', id: 'dropload',
domains: ['dropload.io'], domains: ['dropload.ui'],
regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms], regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
const unpacked = await unpack(match[0]); const unpacked = await unpack(match[0]);
return unpacked.match(/(?<=file:").*(?=")/)![0]; return unpacked.match(/(?<=file:").*(?=")/)![0];
} }
@ -83,7 +80,7 @@ export const Filemoon: Match = {
regex: [/(?<=<iframe\s*src=")\S*(?=")/s, /eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms], regex: [/(?<=<iframe\s*src=")\S*(?=")/s, /eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms],
replace: true, replace: true,
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
if (window.location.host.startsWith('filemoon')) { if (window.location.host.startsWith('filemoon')) {
await TmpHost.set(new URL(match[0]).host, Filemoon); await TmpHost.set(new URL(match[0]).host, Filemoon);
return null; return null;
@ -102,7 +99,7 @@ export const GoodStream: Match = {
domains: ['goodstream.uno'], domains: ['goodstream.uno'],
regex: [/(?<=file:\s+").*(?=")/g], regex: [/(?<=file:\s+").*(?=")/g],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
return match[0]; return match[0];
} }
}; };
@ -113,7 +110,7 @@ export const Kwik: Match = {
domains: ['kwik.cx'], domains: ['kwik.cx'],
regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms], regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
const unpacked = await unpack(match[0]); const unpacked = await unpack(match[0]);
return unpacked.match(/(?<=source=').*(?=')/)![0]; return unpacked.match(/(?<=source=').*(?=')/)![0];
} }
@ -181,10 +178,10 @@ export const Luluvdo: Match = {
export const Mixdrop: Match = { export const Mixdrop: Match = {
name: 'Mixdrop', name: 'Mixdrop',
id: 'mixdrop', id: 'mixdrop',
domains: ['mixdrop.bz', 'mixdrop.ch', 'mixdrop.co', 'mixdrop.gl', 'mixdrop.my', 'mixdrop.to'], domains: ['mixdrop.co', 'mixdrop.to', 'mixdrop.ch', 'mixdrop.bz', 'mixdrop.gl'],
regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms], regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
const unpacked = await unpack(match[0]); const unpacked = await unpack(match[0]);
const url = unpacked.match(/(?<=MDCore.wurl=").*(?=")/)![0]; const url = unpacked.match(/(?<=MDCore.wurl=").*(?=")/)![0];
return `https:${url}`; return `https:${url}`;
@ -198,7 +195,7 @@ export const Mp4Upload: Match = {
replace: true, replace: true,
regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms], regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
const unpacked = await unpack(match[0]); const unpacked = await unpack(match[0]);
return unpacked.match(/(?<=player.src\(").*(?=")/)![0]; return unpacked.match(/(?<=player.src\(").*(?=")/)![0];
} }
@ -228,7 +225,7 @@ export const StreamA2z: Match = {
domains: ['streama2z.com', 'streama2z.xyz'], domains: ['streama2z.com', 'streama2z.xyz'],
regex: [/https?:\/\/\S*m3u8.+(?=['"])/gm], regex: [/https?:\/\/\S*m3u8.+(?=['"])/gm],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
if (StreamA2z.domains.indexOf(window.location.hostname) !== -1) { if (StreamA2z.domains.indexOf(window.location.hostname) !== -1) {
await Redirect.set(StreamA2z); await Redirect.set(StreamA2z);
return null; return null;
@ -243,7 +240,7 @@ export const Streamtape: Match = {
domains: ['streamtape.com', 'streamtape.net', 'shavetape.cash'], domains: ['streamtape.com', 'streamtape.net', 'shavetape.cash'],
regex: [/id=.*(?=')/gm], regex: [/id=.*(?=')/gm],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
let i = 0; let i = 0;
while (i < match.length) { while (i < match.length) {
if (match[++i - 1] == match[i]) { if (match[++i - 1] == match[i]) {
@ -262,7 +259,7 @@ export const Streamzz: Match = {
domains: ['streamzz.to', 'streamz.ws'], domains: ['streamzz.to', 'streamz.ws'],
regex: [/(?<=\|)\w{2,}/gm], regex: [/(?<=\|)\w{2,}/gm],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
return `https://get.${location.hostname.split('.')[0]}.tw/getlink-${ return `https://get.${location.hostname.split('.')[0]}.tw/getlink-${
match.sort((a, b) => b.length - a.length)[0] match.sort((a, b) => b.length - a.length)[0]
}.dll`; }.dll`;
@ -272,10 +269,10 @@ export const Streamzz: Match = {
export const SuperVideo: Match = { export const SuperVideo: Match = {
name: 'Supervideo', name: 'Supervideo',
id: 'supervideo', id: 'supervideo',
domains: ['supervideo.cc', 'supervideo.tv'], domains: ['supervideo.tv'],
regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms], regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
const unpacked = await unpack(match[0]); const unpacked = await unpack(match[0]);
return unpacked.match(/(?<=file:").*(?=")/)![0]; return unpacked.match(/(?<=file:").*(?=")/)![0];
} }
@ -287,7 +284,7 @@ export const Upstream: Match = {
domains: ['upstream.to'], domains: ['upstream.to'],
regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms], regex: [/eval\(function\(p,a,c,k,e,d\).*?(?=<\/script>)/gms],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
const unpacked = await unpack(match[0]); const unpacked = await unpack(match[0]);
return unpacked.match(/(?<=file:").*(?=")/)![0]; return unpacked.match(/(?<=file:").*(?=")/)![0];
} }
@ -300,7 +297,7 @@ export const Vidmoly: Match = {
regex: [/(?<=file:").+\.m3u8/gm], regex: [/(?<=file:").+\.m3u8/gm],
replace: true, replace: true,
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
return match[0]; return match[0];
} }
}; };
@ -312,7 +309,7 @@ export const Vidoza: Match = {
regex: [/(?<=src:\s?").+?(?=")/gm], regex: [/(?<=src:\s?").+?(?=")/gm],
replace: true, replace: true,
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
return match[0]; return match[0];
} }
}; };
@ -325,63 +322,17 @@ export const Voe: Match = {
// voe.sx // voe.sx
/(?<=window\.location\.href\s=\s')\S*(?=')/gm, /(?<=window\.location\.href\s=\s')\S*(?=')/gm,
// whatever site voe.sx redirects to // whatever site voe.sx redirects to
/(?<=<script type="application\/json">).*(?=<\/script>)/m /(?<='hls':\s*')\S*(?=')/gm
], ],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
if (window.location.host === 'voe.sx') { if (window.location.host === 'voe.sx') {
const redirectUrl = new URL(match[0]); const redirectUrl = new URL(match[0]);
await TmpHost.set(redirectUrl.host, Voe); await TmpHost.set(redirectUrl.host, Voe);
return null; return null;
} else { } else {
let json = match[0]; return atob(match[0]);
json = JSON.parse(json);
let deobfuscated = json[0];
deobfuscated = this.rot13(deobfuscated);
deobfuscated = this.removeSpecialSequences(deobfuscated);
deobfuscated = atob(deobfuscated);
deobfuscated = this.shiftString(deobfuscated);
deobfuscated = deobfuscated.split('').reverse().join('');
deobfuscated = atob(deobfuscated);
const payload = JSON.parse(deobfuscated);
return payload['source'];
} }
},
rot13: function (encrypted: string) {
let decrypted = '';
for (let i = 0; i < encrypted.length; i++) {
let char = encrypted.charCodeAt(i);
if (char >= 65 && char <= 90) {
char = ((char - 65 + 13) % 26) + 65;
} else if (char >= 97 && char <= 122) {
char = ((char - 97 + 13) % 26) + 97;
}
decrypted += String.fromCharCode(char);
}
return decrypted;
},
removeSpecialSequences: function (input: string) {
return input
.replaceAll(/@\$/g, '')
.replaceAll(/\^\^/g, '')
.replaceAll(/~@/g, '')
.replaceAll(/%\?/g, '')
.replaceAll(/\*~/g, '')
.replaceAll(/!!/g, '')
.replaceAll(/#&/g, '');
},
shiftString: function (input: string) {
let shifted = '';
for (let i = 0; i < input.length; i++) {
const char = input.charCodeAt(i);
const shiftedChar = char - 3;
shifted += String.fromCharCode(shiftedChar);
}
return shifted;
} }
}; };
@ -391,7 +342,7 @@ export const Vupload: Match = {
domains: ['vupload.com'], domains: ['vupload.com'],
regex: [/(?<=src:\s?").+?(?=")/gm], regex: [/(?<=src:\s?").+?(?=")/gm],
match: async function (match: RegExpMatchArray) { match: async (match: RegExpMatchArray) => {
return match[0]; return match[0];
} }
}; };

View File

@ -2,7 +2,7 @@
"extends": "@tsconfig/svelte/tsconfig.json", "extends": "@tsconfig/svelte/tsconfig.json",
"compilerOptions": { "compilerOptions": {
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,
"target": "es2021", "target": "es2019",
"module": "esnext", "module": "esnext",
"useDefineForClassFields": true, "useDefineForClassFields": true,
"resolveJsonModule": true, "resolveJsonModule": true,