Compare commits

...

2 commits

Author SHA1 Message Date
WebStreamr
5c2d3bba01
WIP: refactor doodstream 2025-08-25 13:05:13 +00:00
WebStreamr
e8ad568327
hore(extractor): add more KinoGer domains 2025-08-24 13:40:47 +00:00
21 changed files with 61 additions and 39 deletions

View file

@ -1,3 +1,4 @@
import bytes from 'bytes';
import * as cheerio from 'cheerio';
import randomstring from 'randomstring';
import { NotFoundError } from '../error';
@ -20,13 +21,56 @@ export class DoodStream extends Extractor {
/** @see https://github.com/Gujal00/ResolveURL/blob/master/script.module.resolveurl/lib/resolveurl/plugins/doodstream.py */
public supports(_ctx: Context, url: URL): boolean {
return null !== url.host.match(/dood|do[0-9]go|doood|dooood|ds2play|ds2video|d0o0d|do0od|d0000d|d000d|vidply|all3do|doply|vide0|vvide0|d-s/);
return [
'all3do.com',
'd-s.io',
'd0000d.com',
'd000d.com',
'd0o0d.com',
'do0od.com',
'do7go.com',
'dood.cx',
'dood.la',
'dood.li',
'dood.pm',
'dood.re',
'dood.sh',
'dood.so',
'dood.stream',
'dood.to',
'dood.watch',
'dood.wf',
'dood.work',
'dood.ws',
'dood.yt',
'doodcdn.io',
'doods.pro',
'doodstream.co',
'doodstream.com',
'dooodster.com',
'dooood.com',
'doply.net',
'ds2play.com',
'ds2video.com',
'vide0.net',
'vidply.com',
'vvide0.com',
].includes(url.host);
};
public override normalize(url: URL): URL {
const supportedHosts = [
'all3do.com',
'd-s.io',
'doodstream.com',
'vide0.net',
'vidply.com',
];
const host = supportedHosts.includes(url.host) ? url.host : 'd-s.io';
const videoId = url.pathname.split('/').slice(-1)[0] as string;
return new URL(`http://dood.to/e/${videoId}`);
return new URL(`/d/${videoId}`, `${url.protocol}//${host}`);
};
protected async extractInternal(ctx: Context, url: URL, countryCode: CountryCode): Promise<UrlResult[]> {
@ -43,18 +87,11 @@ export class DoodStream extends Extractor {
const $ = cheerio.load(html);
const title = $('title').text().trim().replace(/ - DoodStream$/, '').trim();
const sizeMatch = html.match(/([\d.]+ ?[GM]B)/) as string[];
let mp4Url: URL;
let bytes: number | undefined;
if (baseUrl.includes('cloudflarestorage')) {
mp4Url = new URL(baseUrl);
} else {
mp4Url = new URL(`${baseUrl}${randomstring.generate(10)}?token=${token}&expiry=${Date.now()}`);
const mp4Head = await this.fetcher.head(ctx, mp4Url, { headers: { Referer: url.origin } });
if (mp4Head['content-length']) {
bytes = parseInt(mp4Head['content-length'] as string);
}
}
const mp4Url = baseUrl.includes('cloudflarestorage.')
? new URL(baseUrl) // TODO: headers needed here? compare with resolveurl
: new URL(`${baseUrl}${randomstring.generate(10)}?token=${token}&expiry=${Date.now()}`);
return [
{
@ -66,7 +103,7 @@ export class DoodStream extends Extractor {
meta: {
countryCodes: [countryCode],
title,
...(bytes && { bytes }),
bytes: bytes.parse(sizeMatch[1] as string) as number,
},
requestHeaders: {
Referer: url.origin,

View file

@ -21,6 +21,7 @@ export class KinoGer extends Extractor {
return [
'asianembed.cam',
'disneycdn.net',
'dzo.vidplayer.live',
'filedecrypt.link',
'kinoger.re',
'moflix.rpmplay.xyz',
@ -31,6 +32,7 @@ export class KinoGer extends Extractor {
'ultrastream.online',
'videoland.cfd',
'videoshar.uns.bio',
'w1tv.xyz',
'wasuytm.store',
].includes(url.host);
}

View file

@ -1 +0,0 @@
{"server":"nginx","date":"Sun, 08 Jun 2025 19:20:59 GMT","content-type":"video/mp4","content-length":791702409,"last-modified":"Wed, 03 Apr 2024 09:53:31 GMT","connection":"keep-alive","etag":"660d271b-2f306b89","access-control-allow-origin":"*","accept-ranges":"bytes"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
<!doctype html><html lang="en"><head> <meta charset="utf-8"> <title>Video not found | DoodStream</title> <link rel="preconnect" href="//i.doodcdn.io"><link rel="preconnect" href="//cdnjs.cloudflare.com"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <link rel="stylesheet" href="//i.doodcdn.io/theme_2/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="//i.doodcdn.io/theme_2/css/style.css" /></head><body> <style type="text/css"> .not_found img {height:250px !important;} @media (max-width: 768px){.not_found h1{font-size:1.8rem;}.not_found img {height:200px !important;margin: 0 auto 15px;}} @media (max-width: 480px){.not_found h1{font-size:1.4rem;}.not_found img {height:120px !important;margin: 0 auto 15px;}.not_found p{margin-top: -5px;}} </style> <div class="container pt-5 not_found"> <div class="row"> <div class="col-md-12 pt-2 text-center"> <img src="//i.doodcdn.io/img/no_video_3.svg"> <h1>Not Found</h1> <p>video you are looking for is not found.</p> </div> </div> </div><script data-cfasync="false" src="//d1f05vr3sjsuy7.cloudfront.net/?srvfd=908056"></script><script data-cfasync="false" async type="text/javascript" src="//faqirsgoliard.top/gHzOaAdOhbZ/71405"></script><script data-cfasync="false" async type="text/javascript" src="//faqirsgoliard.top/r67c0fc81985e5/70849"></script><script type="text/javascript" data-cfasync="false">/*<![CDATA[/* */(function(){var g=window,r="ca0967284e67bc53cb5b626985619403",w=[["siteId",317+185*82*507-3600486],["minBid",0],["popundersPerIP","0"],["delayBetween",300],["default","https://strettechoco.com/iYa7dlULceKw/27615"],["defaultPerDay",0],["topmostLayer","never"]],n=["d3d3LmJsb2NrYWRzbm90LmNvbS9iYWphLm1pbi5jc3M=","ZG5oZmk1bm4yZHQ2Ny5jbG91ZGZyb250Lm5ldC9RVHd0eC91YWxnZWJyYS5taW4uanM=","d3d3LmJibHZwbGd1b21hLmNvbS9mYWphLm1pbi5jc3M=","d3d3LndqZ3BzcGt4empiZGd1LmNvbS9NTmlIWS9rYWxnZWJyYS5taW4uanM="],f=-1,v,q,h=function(){clearTimeout(q);f++;if(n[f]&&!(1766620801000<(new Date).getTime()&&1<f)){v=g.document.createElement("script");v.type="text/javascript";v.async=!0;var o=g.document.getElementsByTagName("script")[0];v.src="https://"+atob(n[f]);v.crossOrigin="anonymous";v.onerror=h;v.onload=function(){clearTimeout(q);g[r.slice(0,16)+r.slice(0,16)]||h()};q=setTimeout(h,5E3);o.parentNode.insertBefore(v,o)}};if(!g[r]){try{Object.freeze(g[r]=w)}catch(e){}h()}})();/*]]>/* */</script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
https://ijs155l.cloudatacdn.com/u5kj2rz5qtdlsdgge4hrgj2flz5cjodea6auatveaphxogr2vvukxfzmwzva/egprvdjvpr~

View file

@ -1 +0,0 @@
https://ee317r.cloudatacdn.com/u5kj63yvxddlsdgge7qremqqka27irwiupc4k7o5cikbhjliz6xwv2xr53uq/lco4d3heif~

View file

@ -1 +0,0 @@
https://wec6bnh7rx7rw11bv9e9vslw4rud8nam.5f1ebd98099ce35faeeddb30c1752191.r2.cloudflarestorage.com/icxxqqdsfdc4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ab085b515b950aae0a86cae59456cacd%2F20250714%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20250714T154400Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=845ebfa5feedd840027e431f31e013513dd4c4f74364b4e75a2c8ddb213bd97a

View file

@ -1 +0,0 @@
https://aa360cc.cloudatacdn.com/u5kjv4jxytd3sdgge5uogji5dg4huat2pxrm2qibdbm5rlyusvl46iz3u3ta/1f4isxg0tw~

View file

@ -12,7 +12,7 @@ exports[`DoodStream can guess height from title 1`] = `
"title": "Black Mirror S04E02 FRENCH 720p WEB x264-RiPiT",
},
"requestHeaders": {
"Referer": "http://dood.to",
"Referer": "https://d-s.io",
},
"sourceId": "doodstream_fr",
"ttl": 900000,
@ -33,7 +33,7 @@ exports[`DoodStream cloudflare storage 1`] = `
"title": "241653--5bf448d3-184a-4b3f-a766-fa98d93c1300--bllz--2100527-doodstream",
},
"requestHeaders": {
"Referer": "http://dood.to",
"Referer": "https://doodstream.com",
},
"sourceId": "doodstream_mx",
"ttl": 900000,
@ -55,7 +55,7 @@ exports[`DoodStream dood.to 1`] = `
"title": "des-teufels-bad-2024",
},
"requestHeaders": {
"Referer": "http://dood.to",
"Referer": "http://d-s.io",
},
"sourceId": "doodstream_de",
"ttl": 900000,
@ -76,7 +76,7 @@ exports[`DoodStream doodster 1`] = `
"title": "Brokeback Mountain 2005",
},
"requestHeaders": {
"Referer": "http://dood.to",
"Referer": "https://d-s.io",
},
"sourceId": "doodstream_de",
"ttl": 900000,

View file

@ -1 +0,0 @@
<html><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Solaris 1972 PROPER 1080p BluRay x264-SADPANDA - ENG SUBS - tt0069293 - DoodStream.com</title> <link href="//i.doodcdn.io" rel="dns-prefetch" crossorigin><link href="" rel="dns-prefetch" crossorigin><link href="//cdnjs.cloudflare.com" rel="dns-prefetch" crossorigin><link href="//challenges.cloudflare.com" rel="dns-prefetch" crossorigin> <meta name="description" content="Solaris 1972 PROPER 1080p BluRay x264-SADPANDA - ENG SUBS - tt0069293 | DoodStream.com"> <meta name="og:title" content="Solaris 1972 PROPER 1080p BluRay x264-SADPANDA - ENG SUBS - tt0069293"> <meta name="og:description" content="Solaris 1972 PROPER 1080p BluRay x264-SADPANDA - ENG SUBS - tt0069293 | DoodStream.com"> <meta name="og:type" content="video.movie"> <meta name="og:sitename" content="DoodStream.com"> <meta name="og:image" content="https://postercdn.com/splash/imrtvtw9l3s7a5eq.jpg"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:title" content="Solaris 1972 PROPER 1080p BluRay x264-SADPANDA - ENG SUBS - tt0069293"> <meta name="twitter:description" content="Solaris 1972 PROPER 1080p BluRay x264-SADPANDA - ENG SUBS - tt0069293 | DoodStream.com"> <meta name="twitter:image" content="https://postercdn.com/splash/imrtvtw9l3s7a5eq.jpg"> <meta name="robots" content="nofollow, noindex"> <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//i.doodcdn.io/css/embed.css"/> <script src="//challenges.cloudflare.com/turnstile/v0/api.js" async defer></script> <style type="text/css"> .captcha-player{background:rgba(0,0,0,0.4);padding:12px 17px;border-radius:5px;position:absolute;z-index:100000;top:50%;transform:translateY(-50%);display:block;margin:auto;max-width:336px;left:0;right:0;display:none} </style> <body topmargin="0" leftmargin="0" style="background:transparent;" id="videoPlayerWrap"> <div style="width:100%;height:100%;text-align:center;"> <div class="video-js vjs-big-play-centered" id="video_player" tabindex="-1" lang="en-us" role="region" aria-label="Video Player" style="outline:none;"> <div class="vjs-poster" aria-disabled="false" style="background-image:url('https://postercdn.com/splash/imrtvtw9l3s7a5eq.jpg');"></div> <button class="vjs-big-play-button captcha_l" type="button" title="Play Video" aria-disabled="false"> <span aria-hidden="true" class="vjs-icon-placeholder"></span> </button> <div class="captcha-player"> <div class="g-recaptcha" id="v_validate"></div> </div> </div> </div> <script type="text/javascript"> $(document).ready(function() { $(".captcha_l").click(function(){ $(this).css('display', 'block'); $(this).html('<span aria-hidden="true" class="vjs-loading-spinner"></span>'); $('#video_player').addClass('vjs-waiting'); turnstile.render("#v_validate",{ "sitekey": "", "callback":function(response) { $.get("/dood?op=validate&gc_response="+response, function(data){ setTimeout(function(){ location.reload(); }, 500); }); } }); }); }); var tryCount = 0;var minimalUserResponseInMiliseconds = 200; function check(){console.clear();before = new Date().getTime();debugger;after = new Date().getTime(); if(after - before > minimalUserResponseInMiliseconds){document.write(" Dont open Developer Tools. ");self.location.replace(window.location.protocol + window.location.href.substring(window.location.protocol.length)); }else{before = null;after = null;delete before;delete after;}setTimeout(check, 100);}check(); window.onload = function(){document.addEventListener("contextmenu", function(e){e.preventDefault();}, false);document.addEventListener("keydown", function(e) { if(e.ctrlKey && e.shiftKey && e.keyCode == 73){disabledEvent(e);} if(e.ctrlKey && e.shiftKey && e.keyCode == 74){disabledEvent(e);} if(e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) {disabledEvent(e);} if(e.ctrlKey && e.keyCode == 85) {disabledEvent(e);} if(event.keyCode == 123) {disabledEvent(e);} }, false);function disabledEvent(e){if(e.stopPropagation){e.stopPropagation();} else if(window.event){window.event.cancelBubble = true;}e.preventDefault();return false;}}; </script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
https://aa360cc.cloudatacdn.com/u5kjv4jxytd3sdgge5uogji5dg4huat2pxrm2qibdbm5rlyusvlvslr3u3ta/bibyo6w0dm~

View file

@ -1 +0,0 @@
https://kk892as.cloudatacdn.com/u5kj7j7s27d3sdgge5woezkbi4pu672wktq3aqujw47rbx4declm2mk2k2gq/4msi5kvncy~

View file

@ -234,7 +234,7 @@ exports[`resolve returns sorted results 1`] = `
"notWebReady": true,
"proxyHeaders": {
"request": {
"Referer": "http://dood.to",
"Referer": "https://d-s.io",
},
},
"videoSize": 791702409,
@ -250,7 +250,7 @@ exports[`resolve returns sorted results 1`] = `
"notWebReady": true,
"proxyHeaders": {
"request": {
"Referer": "http://dood.to",
"Referer": "https://d-s.io",
},
},
},
@ -314,7 +314,7 @@ exports[`resolve returns sorted results 2`] = `
"notWebReady": true,
"proxyHeaders": {
"request": {
"Referer": "http://dood.to",
"Referer": "https://d-s.io",
},
},
"videoSize": 791702409,
@ -330,7 +330,7 @@ exports[`resolve returns sorted results 2`] = `
"notWebReady": true,
"proxyHeaders": {
"request": {
"Referer": "http://dood.to",
"Referer": "https://d-s.io",
},
},
},