fix(source): be resilient against missing heights in 4KHDHub

This commit is contained in:
WebStreamr 2026-01-15 20:05:03 +00:00
parent 26278aadba
commit 79c8e7fc32
No known key found for this signature in database
10 changed files with 2510 additions and 2 deletions

View file

@ -75,4 +75,9 @@ describe('FourKHDHub', () => {
const streams = await source.handle(ctx, 'movie', new TmdbId(299534, undefined, undefined));
expect(streams).toMatchSnapshot();
});
test('handle dust bunny', async () => {
const streams = await source.handle(ctx, 'movie', new TmdbId(1043197, undefined, undefined));
expect(streams).toMatchSnapshot();
});
});

View file

@ -99,14 +99,14 @@ export class FourKHDHub extends Source {
private readonly extractSourceResults = async (ctx: Context, $: CheerioAPI, el: BasicAcceptedElems<AnyNode>, countryCodes: CountryCode[]): Promise<SourceResult> => {
const localHtml = $(el).html() as string;
const sizeMatch = localHtml.match(/([\d.]+ ?[GM]B)/) as string[];
const sizeMatch = localHtml.match(/([\d.]+ ?[GM]B)/);
const heightMatch = localHtml.match(/\d{3,}p/) as string[];
const meta: Meta = {
countryCodes: [...new Set([...countryCodes, ...findCountryCodes(localHtml)])],
bytes: bytes.parse(sizeMatch[1] as string) as number,
height: parseInt(heightMatch[0] as string),
title: $('.file-title, .episode-file-title', el).text().trim(),
...(sizeMatch && { bytes: bytes.parse(sizeMatch[1] as string) as number }),
};
const redirectUrlHubCloud = $('a', el)

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,338 @@
<!DOCTYPE html>
<html lang="en" class="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Search - Dust Bunny - 4KHDHub</title>
<script>
!function(){try{"light"===localStorage.getItem("theme")?(document.documentElement.classList.remove("dark"),document.documentElement.classList.add("light")):(document.documentElement.classList.add("dark"),document.documentElement.classList.remove("light"))}catch(e){console.error("Theme initialization failed:",e)}}();
</script>
<meta name="description" content="Download high quality movies and TV shows in UHD, 4K HDR, 1080p and more formats">
<link rel="dns-prefetch" href="https://fonts.gstatic.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous">
<link rel="preload" href="/images/4KHDHUB-Dark-Logo.png" as="image" type="image/png" />
<link rel="preload" href="/images/4KHDHUB-Bright-Logo.png" as="image" type="image/png" />
<script data-cfasync="false" src="//dl4d3y1ajyv3q.cloudfront.net/?aydld=1221937"></script>
<link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet">
<link href="https://fonts.cdnfonts.com/css/trebuchet-ms-2" rel="stylesheet">
<link rel="stylesheet" href="/css/styles.css?v=0.14.69c19">
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<meta name="apple-mobile-web-app-title" content="4K-HDHub" />
<link rel="manifest" href="/site.webmanifest" />
<script type="text/javascript">
!function(e,n,t){"use strict";var o="https://fonts.googleapis.com/css?family=Open+Sans",r="__3perf_googleFonts_5fd56";function c(e){(n.head||n.body).appendChild(e)}function a(){var e=n.createElement("link");e.href=o,e.rel="stylesheet",c(e)}function f(e){if(!n.getElementById(r)){var t=n.createElement("style");t.id=r,c(t)}n.getElementById(r).innerHTML=e}e.FontFace&&e.FontFace.prototype.hasOwnProperty("display")?(t[r]&&f(t[r]),fetch(o).then(function(e){return e.text()}).then(function(e){return e.replace(/@font-face {/g,"@font-face{font-display:swap;")}).then(function(e){return t[r]=e}).then(f).catch(a)):a()}(window,document,localStorage);
</script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-LL0RL7VX47"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-LL0RL7VX47');
</script>
</head>
<body>
<div class="flex min-h-screen flex-col">
<header class="sticky top-0 z-50 w-full">
<div class="header">
<div class="container flex h-14 items-center justify-between">
<!-- Logo and mobile menu toggle -->
<div class="flex items-center">
<button id="menu-toggle" class="menu-toggle md:hidden">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="h-5 w-5">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
<span class="sr-only">Toggle menu</span>
</button>
<a href="/" class="navbar-brand">
<img id="logo" class="h-8 w-auto" src="/images/4KHDHUB-Bright-Logo.png" alt="4KHDHub logo">
</a>
</div>
<!-- SINGLE Navigation - Visible on desktop, hidden on mobile -->
<nav id="main-nav" class="main-nav">
<ul class="nav-list">
<li class="nav-item"><a href="/" class="nav-link">Home</a></li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle">
Movies
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="dropdown-indicator h-4 w-4">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</a>
<ul class="dropdown-menu">
<li><a href="/category/movies/" class="dropdown-item">Latest Movies</a></li>
<li><a href="/category/hindi-movies/" class="dropdown-item">Hindi Movies</a></li>
<li><a href="/category/english-movies/" class="dropdown-item">English Movies</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle">
Web Series
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="dropdown-indicator h-4 w-4">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</a>
<ul class="dropdown-menu">
<li><a href="/category/series/" class="dropdown-item">Latest Episodes</a></li>
<li><a href="/category/korean-series/" class="dropdown-item">Korean</a></li>
<li><a href="/category/drama-series/" class="dropdown-item">Drama</a></li>
<li><a href="/category/hindi-series/" class="dropdown-item">Hindi Series</a></li>
<li><a href="/category/english-series/" class="dropdown-item">English Series</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle">
OTT
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="dropdown-indicator h-4 w-4">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</a>
<ul class="dropdown-menu">
<li><a href="/category/netflix/" class="dropdown-item">Netflix</a></li>
<li><a href="/category/amazon_prime_video/" class="dropdown-item">Amazon Prime Video</a></li>
<li><a href="/category/jiohotstar/" class="dropdown-item">JioHotstar</a></li>
<li><a href="/category/disney/" class="dropdown-item">Disney+</a></li>
<li><a href="/category/Apple_TV/" class="dropdown-item">Apple TV+</a></li>
<li><a href="/category/hbo_max/" class="dropdown-item">HBO Max</a></li>
<li><a href="/category/hulu/" class="dropdown-item">Hulu</a></li>
<li><a href="/category/crave/" class="dropdown-item">Crave</a></li>
</ul>
</li>
<li class="nav-item"><a href="/category/anime/" class="nav-link">Anime</a></li>
<li class="nav-item"><a href="/category/2160p-HDR/" class="nav-link">4K HDR</a></li>
<li class="nav-item"><a href="/category/imdb/" class="nav-link">Top IMdb</a></li>
</ul>
</nav>
<!-- Search and Theme Toggle -->
<div class="flex items-center">
<button id="search-toggle" class="search-toggle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="h-5 w-5">
<circle cx="11" cy="11" r="8"></circle>
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
</svg>
<span class="sr-only">Search</span>
</button>
<div class="search-container hidden md:flex">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="search-icon h-4 w-4">
<circle cx="11" cy="11" r="8"></circle>
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
</svg>
for
<input type="search" id="search" placeholder="Search movies & series" class="search-input">
</div>
<button id="theme-toggle" class="theme-toggle">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="theme-icon h-5 w-5">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
<span class="sr-only">Toggle theme</span>
</button>
</div>
</div>
</div>
<!-- Mobile Menu Backdrop (only shown when menu is open) -->
<div id="mobile-menu-backdrop" class="fixed inset-0 bg-black/70 hidden"></div>
<!-- Close button for mobile menu (only shown when menu is open) -->
<button id="close-mobile-menu" class="fixed top-4 right-4 p-2 rounded-full z-[60] hidden">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="h-5 w-5">
<line x1="18" y1="6" x2="6" y2="18"></line>
<line x1="6" y1="6" x2="18" y2="18"></line>
</svg>
</button>
<!-- Search Overlay -->
<div id="search-overlay" class="fixed inset-0 z-50 hidden">
<div class="fixed" id="search-backdrop"></div>
<button id="close-search" class="absolute right-4 top-4 p-2 rounded-full">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="h-5 w-5">
<line x1="18" y1="6" x2="6" y2="18"></line>
<line x1="6" y1="6" x2="18" y2="18"></line>
</svg>
<span class="sr-only">Close</span>
</button>
<form action="/" method="get" class="search-form">
<div class="search-input-container">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="search-icon-overlay">
<circle cx="11" cy="11" r="8"></circle>
<line x1="21" y1="21" x2="16.65" y2="16.65"></line>
</svg>
<input type="search" name="s" placeholder="Search Movies & TV-Shows" class="search-input-overlay" autofocus autocomplete="off">
</div>
<button type="submit" class="search-submit">
Search
</button>
</form>
</div>
</header>
<main class="flex-1">
<div class="container">
<section class="latest-releases">
<div class="latest-releases-header">
<h2 class="latest-releases-title">
<span><svg style="vertical-align: bottom;" xmlns="http://www.w3.org/2000/svg" height="32px" viewBox="0 -960 960 960" width="32px" fill="#e3e3e3"><path d="M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z"/></svg></span> Search - Dust Bunny </h2>
</div>
<div class="card-grid">
<a href="/dust-bunny-movie-5300/" class="movie-card">
<div class="movie-card-image">
<img src="https://image.tmdb.org/t/p/w500/jMcT1Quf34qZWNNE1rAqep8f9DW.jpg" alt="Dust Bunny" class="w-full h-full object-cover">
<div class="movie-card-overlay">
<div class="movie-card-formats">
<span class="movie-card-format">Fantasy</span>
<span class="movie-card-format">Action</span>
<span class="movie-card-format">Thriller</span>
<span class="movie-card-format">English</span>
<span class="movie-card-format">2160p</span>
<span class="movie-card-format">1080p</span>
<span class="movie-card-format">HEVC</span>
<span class="movie-card-format">Movies</span>
<span class="movie-card-format">DV HDR</span>
<span class="movie-card-format">SDR</span>
</div>
</div>
</div>
<div class="movie-card-content">
<h3 class="movie-card-title">Dust Bunny</h3>
<p class="movie-card-meta">2025 </p>
</div>
</a>
</div>
</section>
<div class="pagination-container">
<div class="pagination-container">
<div class="pagination">
<a class='pagination-item active'>1</a>
</div>
</div>
</div>
</div>
</main>
<footer class="border-t bg-background">
<div class="container py-8 md:py-12">
<div class="grid grid-cols-1 gap-8 md:grid-cols-4 justify-center text-center md:text-left">
<div class="space-y-4">
<h3 class="text-lg font-semibold">4KHDHub</h3>
<p class="text-sm text-muted-foreground">
Your one-stop destination for high-quality movies and TV shows in various formats.
</p>
</div>
<div class="space-y-4">
<h3 class="text-lg font-semibold">Quick Links</h3>
<ul class="flex flex-wrap justify-center gap-4 text-sm">
<li>
<a href="/about" class="text-muted-foreground hover:text-primary">
About Us
</a>
</li>
<li>
<a href="/contact" class="text-muted-foreground hover:text-primary">
Contact Us
</a>
</li>
<li>
<a href="/dmca" class="text-muted-foreground hover:text-primary">
DMCA
</a>
</li>
<li>
<a href="/privacy-policy" class="text-muted-foreground hover:text-primary">
Privacy Policy
</a>
</li>
</ul>
</div>
<div class="space-y-4">
<h3 class="text-lg font-semibold">Connect</h3>
<p class="text-sm text-muted-foreground">Stay updated with the latest releases and news.</p>
</div>
</div>
<div class="mt-8 border-t pt-8 text-center">
<p class="text-xs text-muted-foreground">© <span id="current-year">2025</span> 4KHDHub - All rights reserved.</p>
</div>
</div>
</footer>
<button id="back-to-top" class="fixed bottom-6 right-6 z-50 rounded-full shadow-md transition-opacity duration-300 opacity-0 pointer-events-none bg-primary text-primary-foreground p-2" aria-label="Back to top">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="m18 15-6-6-6 6" />
</svg>
</button>
</div>
<script src="/js/main.js?v=0.14.69c19"></script>
</body>
</html>

View file

@ -0,0 +1 @@
{"adult":false,"backdrop_path":"/AecGG1XVCmkk7fT10ko3FC0dLIP.jpg","belongs_to_collection":null,"budget":0,"genres":[{"id":28,"name":"Action"},{"id":14,"name":"Fantasy"},{"id":53,"name":"Thriller"}],"homepage":"https://www.dustbunnyfilm.com/","id":1043197,"imdb_id":"tt23172090","origin_country":["US"],"original_language":"en","original_title":"Dust Bunny","overview":"Ten-year-old Aurora asks her hitman neighbor to kill the monster under her bed that she claims ate her family. To protect her, he must battle an onslaught of assassins while accepting that some monsters are real.","popularity":46.4937,"poster_path":"/vobigFZFvbYPf6ElYJu07P9rH8C.jpg","production_companies":[{"id":8147,"logo_path":"/q6HOAdSNgCbeOqwoMVRc6REgbXF.png","name":"Entertainment One","origin_country":"CA"},{"id":3528,"logo_path":"/cCzCClIzIh81Fa79hpW5nXoUsHK.png","name":"Thunder Road","origin_country":"US"},{"id":119153,"logo_path":"/4QVWLiNT8svS71FU2qsRErGeIar.png","name":"Hero Squared","origin_country":"HU"},{"id":103359,"logo_path":null,"name":"Living Dead Guy Productions","origin_country":"US"}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"},{"iso_3166_1":"CA","name":"Canada"},{"iso_3166_1":"HU","name":"Hungary"}],"release_date":"2025-12-11","revenue":928164,"runtime":106,"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Released","tagline":"Sometimes there really are monsters under your bed.","title":"Dust Bunny","video":false,"vote_average":7.192,"vote_count":35}

View file

@ -0,0 +1,20 @@
<html>
<head>
<title>Redirecting ...</title>
<meta name="referrer" content="no-referrer">
<meta name="robots" content="noindex, nofollow">
<meta name="author" content="s-b0t">
<meta name="googlebot" content="noindex,nofollow">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<style>#container{width:100%;aspect-ratio:100 / 29}@media only screen and (min-width: 992px){img{height:80%!important;width:50%!important}}@media only screen and (min-width: 1200px){img{height:80%!important;width:50%!important}}.relative{position:relative}.bottom-left{position:absolute}.PurpleTxt{color:#7e41ff!important;font-weight:600;margin-left:.5ch;margin-right:.5ch}</style>
</head>
<body>
Redirecting ..
<script type="text/javascript">
function stck(e,t,i){let n="";if(i){let o=new Date;o.setTime(o.getTime()+6e4*i),n="; expires="+o.toUTCString()}document.cookie=`${e}=${t}; path=/; SameSite=None; Secure${n}`}
function s(e,t,i){let n=new Date,m={value:t,expiry:n.getTime()+i};window.localStorage.setItem(e,JSON.stringify(m));stck('xla',"s4t",4);}s('o','Y214WE0xWjNZbXRhVUdwMmIxQldObFo2ZFRCeFZVOXRRbmxxYVV0UU9XRk1Ta1ZoVFV0RmJYRXlTWFpaWVhVMWNubHFhVzVVT1dkTlNtdDFiM3BGZVhCNWFtbFdkbXAyYjJ4V05sWjZVMVpJZDA5M1JsSXdNa2RWZURWdk1rVkxSbnBqZGtWdGVHdEtlRm94YjBwV2JFSlZUVzVHVW1OcVRWUXhTWEY2VjFWQ1VVVkRTVEJqTmt4NlkyVkJVMk5vUkVkSmJsb3hVelJXWVRBOQ==',180*1000);setTimeout(()=>window.location.href='https://gadgetsweb.xyz/homelander/', 2000);
</script>
</body></html>

View file

@ -0,0 +1,20 @@
<html>
<head>
<title>Redirecting ...</title>
<meta name="referrer" content="no-referrer">
<meta name="robots" content="noindex, nofollow">
<meta name="author" content="s-b0t">
<meta name="googlebot" content="noindex,nofollow">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<style>#container{width:100%;aspect-ratio:100 / 29}@media only screen and (min-width: 992px){img{height:80%!important;width:50%!important}}@media only screen and (min-width: 1200px){img{height:80%!important;width:50%!important}}.relative{position:relative}.bottom-left{position:absolute}.PurpleTxt{color:#7e41ff!important;font-weight:600;margin-left:.5ch;margin-right:.5ch}</style>
</head>
<body>
Redirecting ..
<script type="text/javascript">
function stck(e,t,i){let n="";if(i){let o=new Date;o.setTime(o.getTime()+6e4*i),n="; expires="+o.toUTCString()}document.cookie=`${e}=${t}; path=/; SameSite=None; Secure${n}`}
function s(e,t,i){let n=new Date,m={value:t,expiry:n.getTime()+i};window.localStorage.setItem(e,JSON.stringify(m));stck('xla',"s4t",4);}s('o','Y214WE0xWjNZbXRhVUdwMmIxQldObFo2ZFRCeFZVOXRRbmxxYVV0UU9XRk1Ta1ZoVFV0RmJYRXlTWFpaWVhVMWNubHFhVzVVT1dkTlNtdDFiM3BGZVhCNWFtbFdkbXAyYjJ4V05sWjZVMVpJZDA5M1JsSXdNa2RWZURWdk1rVkxSbnBqZGtWdGVHdEtlRm94YjBwV2JFSlZUVzVHVW1OcVRWUXhTWEY2UlZWTlZHdHVTVzFTTVUxU2RXcHdNa2xWVFZGUGVVa3dUVzFXWVRBOQ==',180*1000);setTimeout(()=>window.location.href='https://gadgetsweb.xyz/homelander/', 2000);
</script>
</body></html>

View file

@ -0,0 +1,20 @@
<html>
<head>
<title>Redirecting ...</title>
<meta name="referrer" content="no-referrer">
<meta name="robots" content="noindex, nofollow">
<meta name="author" content="s-b0t">
<meta name="googlebot" content="noindex,nofollow">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<style>#container{width:100%;aspect-ratio:100 / 29}@media only screen and (min-width: 992px){img{height:80%!important;width:50%!important}}@media only screen and (min-width: 1200px){img{height:80%!important;width:50%!important}}.relative{position:relative}.bottom-left{position:absolute}.PurpleTxt{color:#7e41ff!important;font-weight:600;margin-left:.5ch;margin-right:.5ch}</style>
</head>
<body>
Redirecting ..
<script type="text/javascript">
function stck(e,t,i){let n="";if(i){let o=new Date;o.setTime(o.getTime()+6e4*i),n="; expires="+o.toUTCString()}document.cookie=`${e}=${t}; path=/; SameSite=None; Secure${n}`}
function s(e,t,i){let n=new Date,m={value:t,expiry:n.getTime()+i};window.localStorage.setItem(e,JSON.stringify(m));stck('xla',"s4t",4);}s('o','Y214WE0xWjNZbXRhVUdwMmIxQldObFo2ZFRCeFZVOXRRbmxxYVV0UU9XRk1Ta1ZoVFV0RmJYRXlTWFpaWVhVMWNubHFhVzVVT1dkTlNtdDFiM3BGZVhCNWFtbFdkbXAyYjJ4V05sWjZVMVpJZDA5M1JsSXdNa2RWZURWdk1rVkxSbnBqZGtWdGVHdEtlRm94YjBwV2JFSlZUVzVHVW1OcVRWUXhTWEY1WW14dlZHdDFiMG80TVV4dFYySnllWGsyYjFWUFFuSjZXbTFXWVRBOQ==',180*1000);setTimeout(()=>window.location.href='https://gadgetsweb.xyz/homelander/', 2000);
</script>
</body></html>

View file

@ -0,0 +1,20 @@
<html>
<head>
<title>Redirecting ...</title>
<meta name="referrer" content="no-referrer">
<meta name="robots" content="noindex, nofollow">
<meta name="author" content="s-b0t">
<meta name="googlebot" content="noindex,nofollow">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<style>#container{width:100%;aspect-ratio:100 / 29}@media only screen and (min-width: 992px){img{height:80%!important;width:50%!important}}@media only screen and (min-width: 1200px){img{height:80%!important;width:50%!important}}.relative{position:relative}.bottom-left{position:absolute}.PurpleTxt{color:#7e41ff!important;font-weight:600;margin-left:.5ch;margin-right:.5ch}</style>
</head>
<body>
Redirecting ..
<script type="text/javascript">
function stck(e,t,i){let n="";if(i){let o=new Date;o.setTime(o.getTime()+6e4*i),n="; expires="+o.toUTCString()}document.cookie=`${e}=${t}; path=/; SameSite=None; Secure${n}`}
function s(e,t,i){let n=new Date,m={value:t,expiry:n.getTime()+i};window.localStorage.setItem(e,JSON.stringify(m));stck('xla',"s4t",4);}s('o','Y214WE0xWjNZbXRhVUdwMmIxQldObFo2ZFRCeFZVOXRRbmxxYVV0UU9XRk1Ta1ZoVFV0RmJYRXlTWFpaWVhVMWNubHFhVzVVT1dkTlNtdDFiM3BGZVhCNWFtbFdkbXAyYjJ4V05sWjZVMVpJZDA5M1JsSXdNa2RWZURWdk1rVkxSbnBqZGtWdGVHdEtlRm94YjBwV2JFSlZUVzVHVW1OcVRWUXhTWEY2U1ZWSVMzbDJiMGxYYVV4SmNXWnhTREZNVEcxRmJtOUlZMlZXWVRBOQ==',180*1000);setTimeout(()=>window.location.href='https://gadgetsweb.xyz/homelander/', 2000);
</script>
</body></html>

View file

@ -389,6 +389,58 @@ exports[`FourKHDHub handle dexter resurrection 2025 s01e01 1`] = `
]
`;
exports[`FourKHDHub handle dust bunny 1`] = `
[
{
"meta": {
"countryCodes": [
"multi",
"en",
],
"height": 1080,
"title": "Dust.Bunny.2025.1080p.iT.WEB-DL.English.DDP5.1.Atmos.H.264-4kHDHub.Com.mkv",
},
"url": "https://hubcloud.foo/drive/lo89bsn98fp9gt1",
},
{
"meta": {
"bytes": 19746112143,
"countryCodes": [
"multi",
"en",
],
"height": 2160,
"title": "Dust.Bunny.2025.2160p.iT.WEB-DL.English.DDP5.1.Atmos.DV.HDR.H.265-4kHDHub.Com.mkv",
},
"url": "https://hubcloud.foo/drive/tgeemytzlxgtyal",
},
{
"meta": {
"bytes": 12498354831,
"countryCodes": [
"multi",
"en",
],
"height": 2160,
"title": "Dust.Bunny.2025.2160p.AMZN.WEB-DL.English.DDP5.1.Atmos.H.265-4kHDHub.Com.mkv",
},
"url": "https://hubcloud.foo/drive/giejj9shsc9i777",
},
{
"meta": {
"bytes": 4155380858,
"countryCodes": [
"multi",
"en",
],
"height": 1080,
"title": "Dust.Bunny.2025.1080p.AMZN.WEB-DL.English.DDP5.1.Atmos.H.264-4kHDHub.Com.mkv",
},
"url": "https://hubcloud.foo/drive/xd2ndhiin1w8fbd",
},
]
`;
exports[`FourKHDHub handle f1 1`] = `
[
{