chore: initial commit

This commit is contained in:
WebStreamr 2025-05-07 21:09:18 +00:00
commit 1494b2524e
No known key found for this signature in database
40 changed files with 13571 additions and 0 deletions

9
.editorconfig Normal file
View file

@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true

29
.github/workflows/tests.yml vendored Normal file
View file

@ -0,0 +1,29 @@
name: Tests
on: push
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
- name: Cache node modules
uses: actions/cache@v4
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Install Dependencies
run: npm install
- name: Tests
run: npm run ci

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
/.idea
/coverage/
/dist/
/node_modules/

32
Dockerfile Normal file
View file

@ -0,0 +1,32 @@
FROM node:22.15 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY tsconfig.json ./
COPY src ./src
RUN npm run build
RUN npm ci --only=production
FROM node:22.15
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
ARG PORT
ARG MANIFEST_ID
RUN test -n "$MANIFEST_ID" || (echo "MANIFEST_ID is not set" && exit 1)
ARG MANIFEST_NAME
RUN test -n "$MANIFEST_NAME" || (echo "MANIFEST_NAME is not set" && exit 1)
ENV MANIFEST_ID=$MANIFEST_ID
ENV MANIFEST_NAME=$MANIFEST_NAME
ENV NODE_ENV=production
ENV PORT=$PORT
CMD ["node", "dist/server.js"]

21
LICENSE.txt Normal file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 WebStreamr
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

16
eslint.config.mjs Normal file
View file

@ -0,0 +1,16 @@
import eslint from '@eslint/js';
import stylistic from '@stylistic/eslint-plugin';
import tseslint from 'typescript-eslint';
export default tseslint.config(
eslint.configs.recommended,
tseslint.configs.strict,
tseslint.configs.stylistic,
stylistic.configs.customize({
braceStyle: '1tbs',
semi: true,
}),
{
ignores: ['./dist'],
},
);

31
jest.config.ts Normal file
View file

@ -0,0 +1,31 @@
import type { Config } from 'jest';
const config: Config = {
cacheDirectory: './cache/jest',
collectCoverage: true,
collectCoverageFrom: [
'./src/**/*.ts',
'!./src/**/index.ts',
'!./src/**/types.ts',
'!./src/addon.ts',
'!./src/server.ts',
],
coverageDirectory: 'coverage',
coverageProvider: 'babel',
coverageThreshold: {
global: {
branches: 100,
functions: 100,
lines: 100,
statements: 100,
},
},
restoreMocks: true,
setupFilesAfterEnv: ['./jest.setup.ts'],
testEnvironment: 'node',
transform: {
'^.+.tsx?$': ['ts-jest', {}],
},
};
export default config;

2
jest.setup.ts Normal file
View file

@ -0,0 +1,2 @@
process.env['MANIFEST_ID'] = 'community.webstreamr';
process.env['MANIFEST_NAME'] = 'WebStreamr';

8875
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

58
package.json Normal file
View file

@ -0,0 +1,58 @@
{
"name": "webstreamr",
"description": "Provides HTTP streams from scraped websites.",
"version": "0.0.1",
"type": "commonjs",
"scripts": {
"analyse": "tsc --noEmit",
"build": "rm -rf ./dist && tsc",
"dev": "nodemon src/server.ts",
"lint": "eslint",
"lint:fix": "eslint --fix",
"start": "node dist/server.js",
"test": "jest",
"ci": "npm run lint && npm run analyse && npm run test"
},
"repository": {
"type": "git",
"url": "https://github.com/webstreamr/webstreamr.git"
},
"keywords": [
"stremio",
"stream"
],
"author": "WebStreamr",
"license": "MIT",
"bugs": {
"url": "https://github.com/webstreamr/webstreamr/issues"
},
"engines": {
"node": "^22.0.0"
},
"dependencies": {
"cheerio": "^1.0.0",
"make-fetch-happen": "^14.0.3",
"slugify": "^1.6.6",
"stremio-addon-sdk": "^1.6.10",
"unpacker": "^1.0.1"
},
"devDependencies": {
"@eslint/js": "^9.26.0",
"@stylistic/eslint-plugin": "^4.2.0",
"@types/bytes": "^3.1.5",
"@types/jest": "^29.5.14",
"@types/make-fetch-happen": "^10.0.4",
"@types/node": "^22.15.3",
"@types/stremio-addon-sdk": "^1.6.11",
"babel-jest": "^29.7.0",
"beamup-cli": "^1.3.2",
"eslint": "^9.26.0",
"jest": "^29.7.0",
"nodemon": "^3.1.10",
"ts-jest": "^29.3.2",
"ts-node": "^10.9.2",
"typescript": "^5.8.3",
"typescript-eslint": "^8.31.1"
},
"private": true
}

11
src/addon.test.ts Normal file
View file

@ -0,0 +1,11 @@
import addon from './addon';
describe('addon', () => {
test('manifest can be retrieved', () => {
expect(addon.manifest).toStrictEqual(
expect.objectContaining({
id: 'community.webstreamr',
}),
);
});
});

88
src/addon.ts Normal file
View file

@ -0,0 +1,88 @@
import { ContentType, Manifest, addonBuilder } from 'stremio-addon-sdk';
import { Handler, HandlerStream, handleKinoKiste, handleMeineCloud } from './handler';
import { fulfillAllPromises, logInfo } from './utils';
const manifest: Manifest = {
id: process.env['MANIFEST_ID'] || '',
version: '0.0.1',
name: process.env['MANIFEST_NAME'] || '',
description: 'Provides HTTP streams from scraped websites. Currently supports KinoKiste (DE) and MeineCloud (DE).',
resources: [
'stream',
],
types: [
'movie',
'series',
],
catalogs: [],
idPrefixes: ['tt'],
behaviorHints: {
p2p: false,
configurable: true,
configurationRequired: true,
},
config: [
{
key: 'de',
type: 'checkbox',
title: '🇩🇪 DE | KinoKiste, MeineCloud',
},
],
};
const builder = new addonBuilder(manifest);
type RequestConfig = Record<string, boolean | string | number>;
const collectHandlers = (config: RequestConfig): Handler[] => {
const handlers: Handler[] = [];
if ('de' in config) {
handlers.push(handleKinoKiste, handleMeineCloud);
}
return handlers;
};
const sortStreams = (streams: HandlerStream[]): void => {
streams.sort((a, b) => {
const resolutionComparison = parseInt(b.resolution) - parseInt(a.resolution);
if (resolutionComparison !== 0) {
return resolutionComparison;
}
return parseFloat(b.size) - parseFloat(a.size);
});
};
builder.defineStreamHandler(async (args: { type: ContentType; id: string; config?: RequestConfig }) => {
logInfo(`Search stream for type "${args.type}" and id "${args.id}"`);
const handlers = collectHandlers(args.config || {});
if (handlers.length === 0) {
logInfo('No handlers configured, bail out');
return {
streams: [{
name: 'WebStreamr',
title: '⚠️ No handlers configured. Please re-configure the plugin.',
ytId: 'E4WlUXrJgy4',
}],
};
}
const streams: HandlerStream[] = [];
const handlerPromises = handlers.map(async (handler) => {
const handlerStreams = await handler(args);
logInfo(`${handler.name} returned ${handlerStreams.length} streams`);
streams.push(...handlerStreams);
});
await fulfillAllPromises(handlerPromises);
sortStreams(streams);
logInfo(`Return ${streams.length} streams`);
return { streams };
});
export default builder.getInterface();

View file

@ -0,0 +1,502 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Dropload - Revolution Video Hosting</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#FFF">
<meta name="format-detection" conten="telephone=no">
<link rel="apple-touch-icon" href="https://dropload.io/assets2/images/favicon/apple-touch-icon.png" sizes="180x180">
<link rel="icon" href="https://dropload.io/assets2/images/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" href="https://dropload.io/assets2/images/favicon/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="https://dropload.io/assets2/images/favicon/manifest.json">
<link rel="icon" href="https://dropload.io/assets2/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="https://dropload.io/assets2/css/style.css?v=2" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.2.1.min.js" type="9b8fc36527c5f13e36cf0814-text/javascript"></script>
<script src="https://dropload.io/assets2/js/bootstrap.bundle.min.js" type="9b8fc36527c5f13e36cf0814-text/javascript"></script>
<script src="https://dropload.io/assets2/js/xupload.js?v=13" type="9b8fc36527c5f13e36cf0814-text/javascript"></script>
<script src="https://dropload.io/assets2/js/app.js" type="9b8fc36527c5f13e36cf0814-text/javascript"></script>
</head>
<body>
<header class="header">
<div class="container">
<div class="row align-items-center flex-nowrap">
<div class="col-auto d-lg-none me-auto">
<div class="dropdown">
<button class="btn icon-btn text-primary" data-bs-toggle="dropdown" data-bs-offset="0, 16">
<i class="icon icon-menu icon-size-18"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<a href="/?op=registration" class="dropdown-item">Upload</a>
<a href="/make_money.html" class="dropdown-item">Earn money</a>
<a href="/api.html" class="dropdown-item">Service API</a>
<a href="/tos" class="dropdown-item">Terms and Conditions</a>
<a href="/contact" class="dropdown-item">Contacts</a>
</ul>
</div>
</div>
<div class="col-auto me-lg-5">
<a href="/">
<img src="https://dropload.io/assets2/images/logo.svg" class="logo" alt="Dropload.io - ">
</a>
</div>
<div class="col-auto d-none d-lg-block">
<nav class="nav">
<a href="/?op=registration" class="nav-link">Upload</a>
<a href="/make_money.html" class="nav-link">Earn money</a>
</nav>
</div>
<div class="col-auto d-none d-lg-block ms-auto">
<a href="/login.html" class="btn login-btn me-2">
<i class="icon icon-account me-2"></i>Login</a>
<a href="/?op=registration" class="btn reg-btn">Create an Account</a>
</div>
<div class="col-auto d-lg-none ms-auto">
<div class="dropdown">
<button class="btn icon-btn text-primary" data-bs-toggle="dropdown" data-bs-offset="0, 16">
<i class="icon icon-account icon-size-18"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="/login.html">Login</a>
</li>
<li>
<a class="dropdown-item" href="/?op=registration">Create an Account</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</header>
<main>
<script src="https://dropload.io/js/jquery.cookie.js" type="9b8fc36527c5f13e36cf0814-text/javascript"></script>
<script type="9b8fc36527c5f13e36cf0814-text/javascript">
$.cookie('file_id', '35986', { expires: 10 });
$.cookie('aff', '2', { expires: 10 });
</script>
<section class="mb-5 mb-lg-7">
<div class="container">
<div class="videoplayer">
<div class="videoplayer-embed">
<div id="pdiv" style="position: absolute;left:0;top:0;width: 100%;height:100%;">
<!-- Over player banner ADs code start here -->
<!-- Over player banner ADs code end here -->
<!--div id="adbd" class="overdiv">
<div>Disable ADBlock plugin and allow pop-ups in your browser to watch video</div>
</div-->
<!-- <div id="play_limit_box" class="d-flex flex-column justify-content-center p-3 text-center" style="position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.55);z-index:10;">
<div class="mb-2">
<a class="btn btn-gradient" href="/premium.html">Upgrade your account</a>
</div>
to watch videos with no limits!
</div> -->
<script type="9b8fc36527c5f13e36cf0814-text/javascript" src='https://dropload.io/player/jw8/jwplayer.js'></script>
<script type="9b8fc36527c5f13e36cf0814-text/javascript">jwplayer.key="";</script>
<style>
.jw-text-track-cue {
text-shadow: 1px 1px 2px transparent !important;
line-height: 1.53em;
padding-left: 0.3em !important;
padding-right: 0.3em !important;
padding-bottom: 0.2em !important;
border-radius: 6px;
}
</style><script src="/js/localstorage-slim.js" type="9b8fc36527c5f13e36cf0814-text/javascript"></script><script src="https://dropload.io/js/dnsads.js?dfp=1&ad_code=2&adsrc=3" type="9b8fc36527c5f13e36cf0814-text/javascript"></script>
<div id='vplayer' style="width:100%;height:100%;text-align:center;"><img src='/images/back2.jpg' style='width:100%;height:100%;'></div>
</div>
<button type="button" class="btn lightdown"></button>
</div>
<div class="lightdown-backdrop"></div>
<h1>Black Mirror 2x4 </h1>
<div class="videoplayer-controlbar">
<div class="row g-1">
<div class="col-auto flex-grow-1 flex-shrink-1 mw-0">
<div class="videoplayer-details">
<div class="row align-items-center flex-nowrap">
<div class="col-auto flex-shrink-1 mw-0">
<div class="row flex-lg-nowrap">
<div class="col-auto d-flex align-items-center">
<i class="icon icon-clock icon-size-16 me-2 opacity-50"></i>
on Jan 24, 2023
</div>
<div class="col-auto d-flex align-items-center">
<i class="icon icon-download2 icon-size-16 me-2 opacity-50"></i>
<span id="size"></span>
</div>
<div class="col-auto d-flex align-items-center">
<i class="icon icon-clock icon-size-16 me-2 opacity-50"></i>
01:14:05
</div>
</div>
</div>
<div class="col-auto d-flex align-items-center">
<button class="btn icon-btn me-4" data-bs-toggle="modal" data-bs-target="#modal_addplaylist">
<i class="icon icon-addlist icon-size-16"></i>
</button>
<button type="button" class="btn icon-btn text-danger" data-bs-toggle="modal" data-bs-target="#modal_flag">
<i class="icon icon-flag icon-size-16"></i>
</button>
</div>
</div>
</div>
</div>
<div class="col-auto">
<button class="btn btn-like border-0" onclick="if (!window.__cfRLUnblockHandlers) return false; return jah('/?op=vote&file_code=jvjwrkpijr0f&v=up')" title="Like" data-cf-modified-9b8fc36527c5f13e36cf0814-="">
<i class="icon icon-like icon-size-16 me-2"></i>
<span id="likes_num">0</span>
</button>
</div>
<div class="col-auto">
<button class="btn btn-dislike border-0" onclick="if (!window.__cfRLUnblockHandlers) return false; return jah('/?op=vote&file_code=jvjwrkpijr0f&v=down')" title="Don&#39;t Like" data-cf-modified-9b8fc36527c5f13e36cf0814-="">
<i class="icon icon-dislike icon-size-16 me-2"></i>
<span id="dislikes_num">0</span>
</button>
</div>
</div>
</div>
<div class="mb-5">
<div class="row justify-content-center justify-content-lg-between">
<div class="col-auto order-lg-last mb-3">
<div class="dropdown">
<a class="btn btn-gradient videoplayer-download" data-bs-toggle="dropdown">
Download<i class="icon icon-download icon-size-20 ms-2"></i>
</a>
<div class="dropdown-menu w-100 py-0 shadow">
<a href="https://dropload.io/d/jvjwrkpijr0f_h" class="dropdown-item d-flex align-items-center">
<span class="flex-grow-1 pe-3 text-white">
<b>HD quality</b> <br> <span class="xsmall text-light">1280x720, <span class="download-size">699.8 MB</span></span>
</span>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="18"><defs><linearGradient id="a" x1="0%" x2="100%" y1="0%" y2="0%"><stop offset="0%" stop-color="#3DB6D4"/><stop offset="100%" stop-color="#6BCFA4"/></linearGradient></defs><path fill-rule="evenodd" fill="#3DB6D4" d="M13 6V0H7v6H2l8 8 8-8h-5ZM0 16h20v2H0v-2Z"/><path fill="url(#a)" d="M13 6V0H7v6H2l8 8 8-8h-5ZM0 16h20v2H0v-2Z"/></svg>
</a>
</div>
</div>
</div>
<script type="9b8fc36527c5f13e36cf0814-text/javascript">
$(function(){
var a = $('.dropdown-menu a:first-child .download-size');
$('#size').append(a);
})
</script>
<div class="col-12 col-lg-7 mb-3">
<div class="copybox">
<textarea class="form-control copy-source" rows="6"><IFRAME SRC="https://dropload.io/e/jvjwrkpijr0f" FRAMEBORDER=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=NO WIDTH=640 HEIGHT=360 allowfullscreen></IFRAME></textarea>
<button class="btn btn-primary" onclick="if (!window.__cfRLUnblockHandlers) return false; copy(this);" data-cf-modified-9b8fc36527c5f13e36cf0814-="">Copy</button>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<div class="modal fade" id="modal_flag" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">Flag</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body pt-0">
<form method="POST" action="/" onsubmit="if (!window.__cfRLUnblockHandlers) return false; $.post('/',$(this).serialize(),function(code){ eval(code); } );return false;" data-cf-modified-9b8fc36527c5f13e36cf0814-="">
<input type="hidden" name="op" value="report_file">
<input type="hidden" name="file_code" value="jvjwrkpijr0f">
<div class="mb-3">
<label class="form-label">Reason:</label>
<select class="form-select" name="report_type">
<option>Broken video</option>
<option>Wrong title/description</option>
<option>Copyright restriction</option>
<option>Other</option>
</select>
</div>
<div class="mb-3">
<textarea name="report_info" class="form-control" rows="2" placeholder="Details"></textarea>
</div>
<div class="text-center">
<input type="submit" name="add" value="Send Report" class="btn btn-gradient submit-btn">
</div>
</form>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modal_addplaylist" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">Add to</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body pt-0">
</div>
</div>
</div>
</div>
<div class="modal fade" id="modal_share" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">Share</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body pt-0">
Share code
</div>
</div>
</div>
</div>
<script type="9b8fc36527c5f13e36cf0814-text/javascript">eval(function(p,a,c,k,e,d){while(c--)if(k[c])p=p.replace(new RegExp('\\b'+c.toString(a)+'\\b','g'),k[c]);return p}('1e("5v").5u({5t:{2k:"/5s/2n/2m-p.2n?v=3",r:"2m-p"},5r:[{2l:"14://5q.p.13/5p/5o/5n/5m/5l.5k?t=5j-8&s=21&e=5i&f=26&i=0.0&5h=0&5g=23.22.5f.5e"}],5d:"1l%",5c:"1l%",5b:"5a",59:"58.1i",57:\'56\',55:"z",b:[{2l:"/29?28=54&l=53&2k=14://2j.p.13/52.2i",51:"50"}],1u:{4z:1,2h:\'#4y\',4x:\'#4w\',4v:"4u",4t:30,4s:\'1l\',},\'4r\':{"4q":"4p"},4o:"4n",4m:"14://p.13/",4l:{},4k:z,1t:[1,1.25,1.5,2],4j:\'14://2j.p.13/27.2i\'}).h(\'1v\',9(){g o=2f.4i("12");o.4h="o";o.2g(\'4g\',\'4-1k 4-1k-4f 4-2e-2h 4-4e 4-1k-4d\');o.2g(\'4c\',\'6.1d(6.4b()+10)\');2f.4a(\'.4-2e-49\').48(o)});g 1h,1j;g 47=0,46=0;g 6=1e();g 2d=0,45=0,44=0,k=0;$.43({42:{\'41-40\':\'3z-3y\'}});6.h(\'3x\',9(x){a(5>0&&x.q>=5&&1j!=1){1j=1;$(\'12.3w\').3v(\'3u\')}a(x.q>=k+5||x.q<k){k=x.q;1g.3t(\'1f\',3s.3r(k),{3q:1i*1i*24*7})}});6.h(\'1d\',9(x){2d=x.q});6.h(\'3p\',9(x){2c(x)});6.h(\'3o\',9(){$(\'12.2b\').3n();1g.3m(\'1f\')});6.h(\'3l\',9(x){});9 2c(x){$(\'12.2b\').2a();$(\'#3k\').2a();a(1h)16;1h=1;11=0;a(3j.3i===3h){11=1}$.1z(\'/29?28=3g&3f=27&3e=26-23-22-21-3d&3c=&11=\'+11,9(20){$(\'#3b\').3a(20)});g k=1g.1z(\'1f\');a(k>0){1e().1d(k)}}9 39(){g b=6.17(1y);1x.1w(b);a(b.l>1){1o(i=0;i<b.l;i++){a(b[i].r==1y){1x.1w(\'!!=\'+i);6.1m(i)}}}}6.h(\'1v\',9(){});6.h("j",9(u){g b=6.17();a(b.l<2)16;$(\'.4-d-38-37\').36(9(){$(\'#4-d-c-j\').1a(\'4-d-c-w\');$(\'.4-c-j\').n(\'m-1b\',\'y\')});6.35("/34/33.32","31 2z",9(){$(\'.4-1s\').2y(\'4-d-1r\');$(\'.4-d-1u, .4-d-1t\').n(\'m-1c\',\'y\');a($(\'.4-1s\').2x(\'4-d-1r\')){$(\'.4-c-j\').n(\'m-1c\',\'z\');$(\'.4-c-j\').n(\'m-1b\',\'z\');$(\'.4-d-c-2w\').1a(\'4-d-c-w\');$(\'.4-d-c-j\').2v(\'4-d-c-w\')}2u{$(\'.4-c-j\').n(\'m-1c\',\'y\');$(\'.4-c-j\').n(\'m-1b\',\'y\');$(\'.4-d-c-j\').1a(\'4-d-c-w\')}},"2t");6.h("2s",9(u){19.2r(\'18\',u.b[u.2q].r)});a(19.1q(\'18\')){2p("1p(19.1q(\'18\'));",2o)}});g 15;9 1p(1n){g b=6.17();a(b.l>1){1o(i=0;i<b.l;i++){a(b[i].r==1n){a(i==15){16}15=i;6.1m(i)}}}}',36,212,'||||jw||player|||function|if|tracks|submenu|settings|||var|on||audioTracks|lastt|length|aria|attr|newButton|dropload|position|name|||event||active||false|true||adb|div|io|https|current_audio|return|getAudioTracks|default_audio|localStorage|removeClass|expanded|checked|seek|jwplayer|ttjvjwrkpijr0f|ls|vvplay|60|vvad|icon|100|setCurrentAudioTrack|audio_name|for|audio_set|getItem|open|controls|playbackRates|captions|ready|log|console|track_name|get|data|1746646911|61|130|||35986|jvjwrkpijr0f|op|dl|hide|video_ad|doPlay|prevt|button|document|setAttribute|color|jpg|img|url|file|jw8|css|300|setTimeout|currentTrack|setItem|audioTrackChanged|dualSound|else|addClass|quality|hasClass|toggleClass|Track||Audio|svg|dualy|images|addButton|mousedown|buttons|topbar|set_audio_track|html|fviews|embed|a54b12bc8796bbc90ce5acb25f6ce1f5|hash|file_code|view|undefined|cRAds|window|over_player_msg|pause|remove|show|complete|play|ttl|round|Math|set|slow|fadeIn|video_ad_fadein|time|cache|no|Cache|Content|headers|ajaxSetup|v2done|tott|vastdone2|vastdone1|appendChild|container|querySelector|getPosition|onclick|forward|reset|inline|class|id|createElement|image|playbackRateControls|cast|aboutlink|DropLoad|abouttext|HD|1313|qualityLabels|fontOpacity|backgroundOpacity|Tahoma|fontFamily|303030|backgroundColor|FFFFFF|userFontScale|thumbnails|kind|jvjwrkpijr0f0000|4445|get_slides|androidhls|metadata|preload|4444|duration|uniform|stretching|height|width|204|236|ii|sp|14400|i3MocvatkrgMvC0SWVHbsllbwbn_plZsTKscZ1FiV|m3u8|master|jvjwrkpijr0f_h|00007|01|hls2|srv27|sources|assets2|skin|setup|vplayer'.split('|')))
</script>
<style media="screen">
.lightdown {
position: absolute;
top: 20px;
right: 20px;
width: 40px;
height: 40px;
border: 0;
padding: 0;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath fill-rule='evenodd' fill='%23FFF' d='M10 20c-1.654 0-3-1.346-3-3v-.531c0-.625-.254-1.237-.695-1.679l-.548-.548A5.96 5.96 0 0 1 4 10c0-1.603.624-3.109 1.757-4.243A5.961 5.961 0 0 1 10 4a5.96 5.96 0 0 1 4.242 1.757A5.96 5.96 0 0 1 16 10a5.957 5.957 0 0 1-1.758 4.242l-.546.547a2.396 2.396 0 0 0-.696 1.68V17c0 1.654-1.346 3-3 3Zm-1.025-4c.017.154.025.311.025.469V17a1.001 1.001 0 0 0 2 0v-.531c0-.158.008-.315.024-.469H8.975Zm-.737-2h3.524c.152-.222.325-.431.519-.624l.546-.547A3.974 3.974 0 0 0 14 10a3.975 3.975 0 0 0-1.172-2.829c-1.512-1.51-4.146-1.51-5.657 0A3.978 3.978 0 0 0 6 10c0 1.068.416 2.072 1.171 2.828h.001l.547.548c.194.194.367.402.519.624ZM19 11h-1a1 1 0 1 1 0-2h1a1 1 0 1 1 0 2ZM2 11H1a1 1 0 1 1 0-2h1a1 1 0 0 1 0 2Zm13.657-5.657a.999.999 0 0 1-.707-1.707l.707-.707a1 1 0 0 1 1.414 1.414l-.707.707a.993.993 0 0 1-.707.293Zm-11.314 0a.993.993 0 0 1-.707-.293l-.707-.707a.999.999 0 1 1 1.414-1.414l.707.707a.999.999 0 0 1-.707 1.707ZM10 3a1 1 0 0 1-1-1V1a1 1 0 0 1 2 0v1a1 1 0 0 1-1 1Z'/%3E%3C/svg%3E") no-repeat center;
background-color: rgba(28,37,52,.75);
transition: .25s;
opacity: 0;
}
.videoplayer-embed:hover .lightdown {
opacity: 1;
}
.body-lightdown .lightdown {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath fill-rule='evenodd' fill='%233DB6D4' d='M10 20c-1.654 0-3-1.346-3-3v-.531c0-.625-.254-1.237-.695-1.679l-.548-.548A5.96 5.96 0 0 1 4 10c0-1.603.624-3.109 1.757-4.243A5.961 5.961 0 0 1 10 4a5.96 5.96 0 0 1 4.242 1.757A5.96 5.96 0 0 1 16 10a5.957 5.957 0 0 1-1.758 4.242l-.546.547a2.396 2.396 0 0 0-.696 1.68V17c0 1.654-1.346 3-3 3Zm-1.025-4c.017.154.025.311.025.469V17a1.001 1.001 0 0 0 2 0v-.531c0-.158.008-.315.024-.469H8.975Zm-.737-2h3.524c.152-.222.325-.431.519-.624l.546-.547A3.974 3.974 0 0 0 14 10a3.975 3.975 0 0 0-1.172-2.829c-1.512-1.51-4.146-1.51-5.657 0A3.978 3.978 0 0 0 6 10c0 1.068.416 2.072 1.171 2.828h.001l.547.548c.194.194.367.402.519.624ZM19 11h-1a1 1 0 1 1 0-2h1a1 1 0 1 1 0 2ZM2 11H1a1 1 0 1 1 0-2h1a1 1 0 0 1 0 2Zm13.657-5.657a.999.999 0 0 1-.707-1.707l.707-.707a1 1 0 0 1 1.414 1.414l-.707.707a.993.993 0 0 1-.707.293Zm-11.314 0a.993.993 0 0 1-.707-.293l-.707-.707a.999.999 0 1 1 1.414-1.414l.707.707a.999.999 0 0 1-.707 1.707ZM10 3a1 1 0 0 1-1-1V1a1 1 0 0 1 2 0v1a1 1 0 0 1-1 1Z'/%3E%3C/svg%3E");
}
.lightdown-backdrop {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,.9);
display: none;
z-index: 1999;
}
.body-lightdown .lightdown-backdrop {
display: block;
}
.body-lightdown .videoplayer-embed {
z-index: 2000;
}
</style>
<script type="9b8fc36527c5f13e36cf0814-text/javascript">
$('.lightdown').on('click', function(){
$('body').toggleClass('body-lightdown');
})
</script>
<Script type="9b8fc36527c5f13e36cf0814-text/javascript">
$("#embed_div textarea").focus(function (){ $(this).select(); })
var tab_cookie='tab_down';
$('ul.tabs').on('click', 'li:not(.current)', function() {
$(this).addClass('current').siblings().removeClass('current')
.parents('div.section').find('div.box').eq($(this).index()).fadeIn(150).siblings('div.box').hide();
});
$("#iew,#ieh").change(function (){
var ww = $("#iew").val();
var hh = $("#ieh").val();
ww = ww.replace(/\D/g,'');
hh = hh.replace(/\D/g,'');
if(!ww)ww=640;
if(!hh)hh=360;
tt = $("#iet").val();
tt = tt.replace(/ WIDTH=\d+ HEIGHT=\d+ /,' WIDTH='+ww+' HEIGHT='+hh+' ');
$("#iet").val(tt);
});
</Script>
<script src="https://dropload.io/js/tabber.js" type="9b8fc36527c5f13e36cf0814-text/javascript"></script>
<Script type="9b8fc36527c5f13e36cf0814-text/javascript">
$(function() {
});
</Script>
<script data-cfasync="false" async type="text/javascript" src="//sx.impubicpuddly.com/rO7FQr7AANJdtg/111561"></script>
<script src='https://dropload.io/tag2.js' type="9b8fc36527c5f13e36cf0814-text/javascript"></script>
<script src='https://dropload.io/tag1.js' type="9b8fc36527c5f13e36cf0814-text/javascript"></script>
<!-- Javascript Alt Ads code start -->
<!-- Javascript Alt Ads code end -->
</main>
<footer class="footer">
<div class="container">
<div class="row text-center text-lg-start flex-lg-nowrap">
<div class="col">
<div class="mb-3">
<a href="/">
<img src="https://dropload.io/assets2/images/logo.svg" alt="">
</a>
</div>
<div class="text-muted mb-4 small">© 2025 Dropload - Revolution Video Hosting. All rights reserved.</div>
</div>
<div class="col d-none d-lg-block">
<div class="nav flex-column mb-3">
<a href="/faq" class="nav-link">FAQ</a>
<a href="/contact" class="nav-link">Contact Us</a>
</div>
</div>
<div class="col d-none d-lg-block">
<div class="nav flex-column mb-3">
<a href="/tos" class="nav-link">Terms of service</a>
<a href="#" class="nav-link">Privacy Policy</a>
<a href="#" class="nav-link">Copyright Policy</a>
</div>
</div>
<div class="col d-none d-lg-block">
<div class="nav flex-column mb-3">
<a href="/api.html" class="nav-link">API</a>
<a href="/make_money.html" class="nav-link">Make Money</a>
</div>
</div>
</div>
</div>
</footer>
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="9b8fc36527c5f13e36cf0814-|49" defer></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

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,401 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>
Watch Black Mirror 2x4
</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Watch video Black Mirror 2x4">
<meta name="keywords" content="black, mirror, 2x4">
<link rel="stylesheet" href="https://supervideo.cc/assets/css/style.css?v=130">
<!-- jsdata -->
<script src="https://supervideo.cc/assets/js/libs.min.js?v=2" type="42cae66dfbde55b74a18efcc-text/javascript"></script>
<script src="https://supervideo.cc/assets/js/common.js?v=2" type="42cae66dfbde55b74a18efcc-text/javascript"></script>
<script src="https://supervideo.cc/js/xupload.js?v=4" type="42cae66dfbde55b74a18efcc-text/javascript"></script>
<!-- favicon -->
<link rel="apple-touch-icon" href="https://supervideo.cc/assets/images/favicon/apple-touch-icon.png" sizes="180x180">
<link rel="icon" href="https://supervideo.cc/assets/images/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" href="https://supervideo.cc/assets/images/favicon/favicon-16x16.png" sizes="16x16">
<!-- <link rel="manifest" href="https://supervideo.cc/assets/images/favicon/manifest.json">-->
<link rel="icon" href="https://supervideo.cc/assets/images/favicon/favicon.ico">
</head>
<body class="
">
<header class="header">
<div class="container-fluid">
<div class="header__bar flex-start">
<div class="flex-grow-1">
<a href="/" class="logo"></a>
</div>
<div class="header__right"><a href="/login.html" class="btn btn_border_default header__btn">
Login
</a><a href="/?op=registration" class="btn btn_secondary header__btn">
Sign Up
</a></div>
<div class="header-mobile">
<button type="button" class="btn-toggle" data-toggle="dropdown">
<i class="icon icon_user icon_size_18"></i>
</button>
<div class="dropdown-menu dropdown-menu-right header-mobile__dropdown-menu">
<a href="/login.html" class="btn btn_block btn_border_default">
Login
</a><a href="/?op=registration" class="btn btn_block btn_secondary">
Sign Up
</a>
</div>
</div>
</div>
</div>
</header>
<style>
.modal {
color: #333;
}
.download-codes__copy {
position: relative;
margin-bottom: 15px;
margin-top: 10px;
float: right;
}
.download__player {
position: relative;
padding-top: 56.25%;
}
.download__info-item {
margin-bottom: 15px;
font-size: 14px;
}
.download__info-item a {
color: inherit;
}
.download__info-tags {
margin-bottom: 15px;
}
.downloadbox__dropdown-menu li a {
-webkit-flex-wrap: nowrap;
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
}
.downloadbox__quality {
margin-right: 5px;
}
.downloadbox__size {font-size: 13px;}
</style>
<!--25% ads-->
<script src="/9271593.js" type="42cae66dfbde55b74a18efcc-text/javascript"></script>
<script src="/9271609.js" type="42cae66dfbde55b74a18efcc-text/javascript"></script>
<script data-cfasync="false" async type="text/javascript" src="//zm.nostocbark.com/rljPIWhbr4xr/115547"></script>
<script language="JavaScript" type="42cae66dfbde55b74a18efcc-text/javascript" CHARSET="UTF-8" src="https://supervideo.cc/js/jquery.cookie.js"></script>
<script type="42cae66dfbde55b74a18efcc-text/javascript">
$.cookie('file_id', '1396174', { expires: 10 });
$.cookie('aff', '14532', { expires: 10 });
</script>
<div class="container-fluid">
<div class="download">
<div class="download__top" style="background-image: url(https://supervideo.cc/assets/images/bg_download.png);">
<div class="container">
<div class="download__player">
<div class="overlay " >
<script type="42cae66dfbde55b74a18efcc-text/javascript" src='https://supervideo.cc/player8/jwplayer.js'></script>
<script type="42cae66dfbde55b74a18efcc-text/javascript">jwplayer.key="9dOyFG96QFb9AWbR+FhhislXHfV1gIhrkaxLYfLydfiYyC0s";</script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-46849459-36" type="42cae66dfbde55b74a18efcc-text/javascript"></script>
<script type="42cae66dfbde55b74a18efcc-text/javascript">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-46849459-36');
</script>
<link rel="stylesheet" type="text/css" href="https://supervideo.cc/assets/player/myskinfile.css?v=11">
<script src="https://supervideo.cc/js/pop.js" type="42cae66dfbde55b74a18efcc-text/javascript"></script>
<div id='vplayer' style="width:100%;height:100%;text-align:center;"><img src="https://i.serversicuro.cc/22go50mon0ke_xt.jpg" style="width:100%;height:100%;"></div>
</div>
</div>
<div class="row justify-content-center align-items-center">
<div class="col-sm-8 mr-auto">
<h1 class="download__title">
Black Mirror 2x4
</h1>
<ul class="download__info">
<li><i class="icon icon_clock icon_align_left"></i>
on
Jan 24, 2023
</li>
<li><i class="icon icon_user icon_align_left"></i><a href="/users/germanserien">
germanserien
</a></li>
<li><i class="icon icon_eye icon_align_left"></i>
623 views
</li>
<li><button type="button" class="btn download__flag" data-toggle="modal" data-target="#vid-flag"><i class="icon icon_flag"></i></button>
<div class="modal fade" id="vid-flag" tabindex="-1" role="dialog" aria-labelledby="modal-title" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modal-title">Flag:</h5>
<button type="button" class="modal-close" data-dismiss="modal" aria-label="Close">
<i class="icon icon_round-close icon_size_20"></i>
</button>
</div>
<div class="modal-body" id="id_flag">
<form class="form" method="POST" action="/" onsubmit="if (!window.__cfRLUnblockHandlers) return false; $.post('/',$(this).serialize(),function(code){ eval(code); $('#id_flag').wrapInner('<span></span>').addClass('alert alert-success'); } );return false;" data-cf-modified-42cae66dfbde55b74a18efcc-="">
<input type="hidden" name="op" value="report_file">
<input type="hidden" name="file_code" value="22go50mon0ke">
<div class="form__group">
<label class="form__label">
Reason
</label>
<select class="input" name="report_type">
<option>
Broken video
</option>
<option>
Wrong title/description
</option>
<option>
Copyright restriction
</option>
<option>
Other
</option>
</select></div>
<div class="form__group">
<textarea name="report_info" class="input" id="msg" rows="2" placeholder="Details"></textarea>
</div>
<input type="submit" name="add" value="Send Report" class="btn btn_primary">
<button type="submit" class="btn btn_default" data-dismiss="modal">Cancel</button>
</form>
</div>
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="col-sm-auto">
<ul class="download-social">
<li><a class="download-social__item download-social__item_facebook" onclick="if (!window.__cfRLUnblockHandlers) return false; window.open(this.href, 'Share Facebook', 'width=640,height=436,toolbar=0,status=0'); return false" href="https://www.facebook.com/sharer/sharer.php?u=/22go50mon0ke" data-cf-modified-42cae66dfbde55b74a18efcc-=""><i class="icon icon_facebook"></i></a></li>
<li><a class="download-social__item download-social__item_twitter" onclick="if (!window.__cfRLUnblockHandlers) return false; window.open(this.href, 'Share Twitter', 'width=640,height=436,toolbar=0,status=0'); return false" href="https://twitter.com/intent/tweet?text=Black Mirror 2x4" data-cf-modified-42cae66dfbde55b74a18efcc-=""><i class="icon icon_twitter"></i></a></li>
</ul>
</div>
<div class="col-auto">
<div class="dowonload-rating" id="vote">
<button type="button" class="btn dowonload-rating__btn dowonload-rating__btn_plus" onclick="if (!window.__cfRLUnblockHandlers) return false; return jah('/?op=vote&file_code=22go50mon0ke&v=up')" title="Like" data-cf-modified-42cae66dfbde55b74a18efcc-=""><i
class="icon icon_like icon_align_left icon-size_20 dowonload-rating__icon"></i><span id="likes_num">
0
</span></button>
<span class="dowonload-rating__divider"></span>
<button type="button" class="btn dowonload-rating__btn dowonload-rating__btn_minus" onclick="if (!window.__cfRLUnblockHandlers) return false; return jah('/?op=vote&file_code=22go50mon0ke&v=down')" title="Don&#39;t Like" data-cf-modified-42cae66dfbde55b74a18efcc-=""><i
class="icon icon_dislike icon_align_left icon-size_20 dowonload-rating__icon"></i><span id="dislikes_num">
0
</span></button>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-sm-auto">
<div class="downloadbox">
<a href="#" data-toggle="dropdown" class="downloadbox__btn"> <i class="icon icon_download downloadbox__icon"></i> <span> <strong class="downloadbox__title">FREE DOWNLOAD</strong> Click to start Download </span> </a>
<ul class="dropdown-menu downloadbox__dropdown-menu">
<li>
<a href="#" onclick="if (!window.__cfRLUnblockHandlers) return false; download_video('22go50mon0ke','n','1396174-130-61-1746646836-0284dd84d32b999da0164b49232f21fe')" data-cf-modified-42cae66dfbde55b74a18efcc-=""><i
class="icon icon_download icon_size_18 icon_align_left"></i><b class="downloadbox__quality">
Normal quality
</b><span class="downloadbox__size">
1280x720, 699.8 MB
</span></a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-lg-8 order-2 order-lg-1">
</div>
<div class="col-lg-4 order-1 order-lg-2">
<div class="dsh-block">
<ul class="dsh-block__tabs nav">
<li><a class="active" data-toggle="tab" href="#tab-link">
Download Link
</a></li>
<li><a data-toggle="tab" href="#tab-forum">
Forum Code
</a></li>
<li><a data-toggle="tab" href="#tab-html">HTML</a></li>
<li><a data-toggle="tab" href="#tab-embed">Embed</a></li>
</ul>
<div class="dsh-block__body tab-content clearfix">
<div class="tab-pane fade show active" id="tab-link">
<div class="download-codes js-codes">
<textarea class="input download-codes__area">/22go50mon0ke</textarea>
<button type="button" class="btn btn_link btn_sm download-codes__copy js-copy-codes"><i class="icon icon_copy icon_align_left"></i><span>Copy</span></button>
</div>
</div>
<div class="tab-pane fade" id="tab-forum">
<div class="download-codes js-codes">
<textarea class="input download-codes__area">[URL=/22go50mon0ke][IMG]https://i.serversicuro.cc/22go50mon0ke_t.jpg[/IMG]
Black Mirror 2x4[/URL]
[1280x720, 01:14:04]</textarea>
<button type="button" class="btn btn_link btn_sm download-codes__copy js-copy-codes"><i class="icon icon_copy icon_align_left"></i><span>Copy</span></button>
</div>
</div>
<div class="tab-pane fade" id="tab-html">
<div class="download-codes js-codes">
<textarea
class="input download-codes__area"><a href="/22go50mon0ke"><img src="https://i.serversicuro.cc/22go50mon0ke_t.jpg" border=0><br>Black Mirror 2x4</a><br>[1280x720, 01:14:04]</textarea>
<button type="button" class="btn btn_link btn_sm download-codes__copy js-copy-codes"><i class="icon icon_copy icon_align_left"></i><span>Copy</span></button>
</div>
</div>
<div class="tab-pane fade" id="tab-embed">
<div class="form__group">
<div class="row align-items-center text-center justify-content-center">
<div class="col-12">
<label class="form__label">Embed size: </label>
</div>
<div class="col-auto">
<div class="row no-gutters align-items-center">
<div class="col-auto">
<input type="text" class="input" id="iew" value="640" size="3">
</div>
<div class="col-auto text-muted"><i class="icon icon_close icon_size_8 icon_align_left icon_align_right"></i></div>
<div class="col-auto"><input class="input" type="text" id="ieh" value="360" size="3"></div>
</div>
</div>
</div>
</div>
<div class="download-codes js-codes">
<textarea id="iet" class="input download-codes__area"><div style="position:relative;padding-bottom:56%;padding-top:20px;height:0;"><irame src="/e/22go50mon0ke" frameborder=0 marginwidth=0 marginheight=0 scrolling=no width=640 height=360 allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%;"></iframe></div></textarea>
<button type="button" class="btn btn_link btn_sm download-codes__copy js-copy-codes"><i class="icon icon_copy icon_align_left"></i><span>Copy</span></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="42cae66dfbde55b74a18efcc-text/javascript">eval(function(p,a,c,k,e,d){while(c--)if(k[c])p=p.replace(new RegExp('\\b'+c.toString(a)+'\\b','g'),k[c]);return p}('e("3m").3l({3k:[{m:"6://3j.n.4/3i/,3h,.3g/3f.3e"}],3d:"6://i.n.4/3c.10",3b:"14%",3a:"14%",39:"38",37:"13.11",36:\'35\',34:"l",33:"l",32:"31",30:"2z",2y:[0.25,0.5,0.2x,1,1.25,1.5,2],2w:{2v:"2u"},2t:[{m:"/2s?t=2r&2q=13.11&2p=6://i.n.4/2o.10",2n:"2m"}],2l:{2k:\'#2j\',2i:12,2h:"2g",2f:0,2e:\'2d\',2c:2b},2a:"29",28:"",27:{m:"6://d.4/r/26.q",24:"6://d.4/c",8:"o-23",22:"5",u:l},21:{}});k f,j,h=0;k 20=0,1z=0;k 7=e();7.9(\'1y\',3(x){b(5>0&&x.8>=5&&j!=1){j=1;$(\'g.1x\').1w(\'1v\')}b(h==0&&x.8>=z&&x.8<=(z+2)){h=x.8}});7.9(\'1u\',3(x){y(x)});7.9(\'1t\',3(){$(\'g.w\').1s()});3 y(x){$(\'g.w\').u();b(f)1r;f=1;a=0;b(p.1q===1p){a=1}$.1o(\'/1n?t=1m&1l=c&1k=1j-1i-1h-1g-1f&1e=&a=\'+a,3(s){$(\'#1d\').1c(s)})}7.9(\'1b\',3(){});e().1a("6://d.4/r/19.q","18",3(){p.o.17.16=\'/v/c\'},"15");',36,131,'|||function|cc||https|player|position|on|adb|if|22go50mon0ke|supervideo|jwplayer|vvplay|div|x2ok||vvad|var|true|file|serversicuro|top|window|png|images|data|op|hide||video_ad||doPlay|1111|jpg|60||4444|100|download11|href|location|Download|download2|addButton|ready|html|fviews|embed|49962ceb3bba76bd843b7b7aeef61c46|1746646835|61|130|1396174|hash|file_code|view|dl|get|undefined|cRAds|return|show|complete|play|slow|fadeIn|video_ad_fadein|time|vastdone2|vastdone1|cast|margin|right|link||logo_p|logo|aboutlink|xvs|abouttext|90|fontOpacity|none|edgeStyle|backgroundOpacity|Verdana|fontFamily|fontSize|FFFFFF|color|captions|thumbnails|kind|22go50mon0ke0000|url|length|get_slides|dlf|tracks|myskin|name|skin|75|playbackRateControls|start|startparam|html5|primary|hlshtml|androidhls|metadata|preload|duration|uniform|stretching|height|width|22go50mon0ke_xt|image|m3u8|master|urlset|dnzpervt3xg4a3gyvdix52ttsqpj5jgxs7keazdmhvru2uyin5gujtxe5u4a|hls|hfs279|sources|setup|vplayer'.split('|')))
</script>
<script type="42cae66dfbde55b74a18efcc-text/javascript">
</script>
<footer class="footer">
<div class="container-fluid">
<div class="footer__copyright">© 2017 - 2025 SuperVideo | Fast HLS Video Streaming Service
</div>
<ul class="footer__menu">
<li><a href="">
Home
</a></li>
<li><a href="/faq">
FAQ
</a></li>
<li><a href="/tos">
Terms of service
</a></li>
<li><a href="/premium">
Trust Uploader
</a></li>
<li><a href="/make_money.html">
Make Money
</a></li>
<li><a href="/checkfiles.html">
Link Checker
</a></li>
<li><a href="/contacts">
Contact Us
</a></li>
</ul>
<div class="text-center" style="padding-top: 8px;">
<!-- <a href="http://www.xvstheme.com/" rel="nofollow" title="Designed by XVSTheme" class="small text-reset" style="display:inline-flex; align-items: center">
<span style="margin-right: 4px;">Designed by</span>
<svg xmlns="http://www.w3.org/2000/svg" width="78.1" height="11" viewBox="0 0 78.1 11" xml:space="preserve"><path d="M73.5 7.5h-5.7c0 1.2.7 1.9 1.8 1.9.8 0 1.4-.4 1.6-1h2.4c-.6 1.7-1.9 2.6-3.9 2.6-2.8 0-4.2-1.4-4.2-4.1 0-2.8 1.3-4.1 4.1-4.1 2.7 0 4 1.3 4 3.8 0 .3 0 .6-.1.9zm-3.9-3.1c-1.1 0-1.6.4-1.7 1.6h3.4c-.2-1.1-.7-1.6-1.7-1.6zM62 6.3c0-1-.4-1.4-1.3-1.4-1 0-1.5.5-1.5 1.6v4.2h-2.3V6.3c0-1-.4-1.4-1.3-1.4-1 0-1.5.5-1.5 1.6v4.2h-2.3V3.1l2.1-.1.2 1c.4-.7 1.2-1.1 2.2-1.1 1.3 0 2.2.5 2.6 1.4.5-.9 1.3-1.4 2.5-1.4 2 0 3 1.1 3 3.4v4.5H62V6.3zM44.6 7.5c0 1.2.7 1.9 1.8 1.9.8 0 1.4-.4 1.6-1h2.4c-.5 1.7-1.8 2.6-3.8 2.6-2.8 0-4.2-1.4-4.2-4.1 0-2.8 1.3-4.1 4.1-4.1 2.7 0 4 1.3 4 3.8 0 .3 0 .6-.1.9h-5.8zm1.8-3.1c-1.1 0-1.6.4-1.7 1.6H48c-.1-1.1-.6-1.6-1.6-1.6zm-7.6 1.9c0-1-.4-1.4-1.4-1.4-1.2 0-1.6.5-1.6 1.6v4.2h-2.3V0h2.3v3.8c.4-.6 1.2-1 2.2-1 2.1 0 3.1 1.1 3.1 3.4v4.5h-2.4c.1.1.1-4.4.1-4.4zM27.4 7.6V5.2h-1.1V3.5l1.1-.4V1.4h2.3v1.7H32v2.1h-2.3v2.3c0 .9.3 1.2 1.2 1.2h1v2.1h-1.3c-2.3 0-3.2-.9-3.2-3.2zm-4.6-1.5c2.2.4 2.8.9 2.8 2.4S24.1 11 22 11c-2.4 0-3.8-.9-4.1-2.6h2.3c.2.6.7 1 1.7 1 .8 0 1.3-.4 1.3-.8 0-.5-.2-.7-1.2-.8l-1.5-.2c-1.8-.3-2.6-1-2.6-2.1C17.9 4 19.3 3 21.5 3c2.3 0 3.7.9 3.8 2.4h-2.4c-.1-.5-.7-.8-1.6-.8-.7 0-1.2.3-1.2.8 0 .4.2.6 1 .7.3-.1 1.7 0 1.7 0zM13.2 11c-2.2 0-3.1-1-3.5-3.5L9 3.1h2.3l.7 4.3c.2 1.1.5 1.5 1.2 1.5s1-.4 1.2-1.5l.6-4.3h2.4l-.7 4.4c-.4 2.5-1.4 3.5-3.5 3.5zm-7.3-.2L4.4 8.4l-1.6 2.3H0l2.8-3.9L.1 3.1h2.8l1.4 2.3 1.4-2.3h2.8L6 6.9l2.8 3.9H5.9z" fill="#000222"/><path d="M78.1 8.7h-2.6V11h2.6V8.7z" fill="#28e98c"/></svg>
</a> -->
</div>
</div>
</footer>
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="42cae66dfbde55b74a18efcc-|49" defer></script></body>
</html>

View file

@ -0,0 +1,502 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Dropload - Revolution Video Hosting</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#FFF">
<meta name="format-detection" conten="telephone=no">
<link rel="apple-touch-icon" href="https://dropload.io/assets2/images/favicon/apple-touch-icon.png" sizes="180x180">
<link rel="icon" href="https://dropload.io/assets2/images/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" href="https://dropload.io/assets2/images/favicon/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="https://dropload.io/assets2/images/favicon/manifest.json">
<link rel="icon" href="https://dropload.io/assets2/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="https://dropload.io/assets2/css/style.css?v=2" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.2.1.min.js" type="b402dc6aa066e52050d893f1-text/javascript"></script>
<script src="https://dropload.io/assets2/js/bootstrap.bundle.min.js" type="b402dc6aa066e52050d893f1-text/javascript"></script>
<script src="https://dropload.io/assets2/js/xupload.js?v=13" type="b402dc6aa066e52050d893f1-text/javascript"></script>
<script src="https://dropload.io/assets2/js/app.js" type="b402dc6aa066e52050d893f1-text/javascript"></script>
</head>
<body>
<header class="header">
<div class="container">
<div class="row align-items-center flex-nowrap">
<div class="col-auto d-lg-none me-auto">
<div class="dropdown">
<button class="btn icon-btn text-primary" data-bs-toggle="dropdown" data-bs-offset="0, 16">
<i class="icon icon-menu icon-size-18"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<a href="/?op=registration" class="dropdown-item">Upload</a>
<a href="/make_money.html" class="dropdown-item">Earn money</a>
<a href="/api.html" class="dropdown-item">Service API</a>
<a href="/tos" class="dropdown-item">Terms and Conditions</a>
<a href="/contact" class="dropdown-item">Contacts</a>
</ul>
</div>
</div>
<div class="col-auto me-lg-5">
<a href="/">
<img src="https://dropload.io/assets2/images/logo.svg" class="logo" alt="Dropload.io - ">
</a>
</div>
<div class="col-auto d-none d-lg-block">
<nav class="nav">
<a href="/?op=registration" class="nav-link">Upload</a>
<a href="/make_money.html" class="nav-link">Earn money</a>
</nav>
</div>
<div class="col-auto d-none d-lg-block ms-auto">
<a href="/login.html" class="btn login-btn me-2">
<i class="icon icon-account me-2"></i>Login</a>
<a href="/?op=registration" class="btn reg-btn">Create an Account</a>
</div>
<div class="col-auto d-lg-none ms-auto">
<div class="dropdown">
<button class="btn icon-btn text-primary" data-bs-toggle="dropdown" data-bs-offset="0, 16">
<i class="icon icon-account icon-size-18"></i>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="/login.html">Login</a>
</li>
<li>
<a class="dropdown-item" href="/?op=registration">Create an Account</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</header>
<main>
<script src="https://dropload.io/js/jquery.cookie.js" type="b402dc6aa066e52050d893f1-text/javascript"></script>
<script type="b402dc6aa066e52050d893f1-text/javascript">
$.cookie('file_id', '987607', { expires: 10 });
$.cookie('aff', '4', { expires: 10 });
</script>
<section class="mb-5 mb-lg-7">
<div class="container">
<div class="videoplayer">
<div class="videoplayer-embed">
<div id="pdiv" style="position: absolute;left:0;top:0;width: 100%;height:100%;">
<!-- Over player banner ADs code start here -->
<!-- Over player banner ADs code end here -->
<!--div id="adbd" class="overdiv">
<div>Disable ADBlock plugin and allow pop-ups in your browser to watch video</div>
</div-->
<!-- <div id="play_limit_box" class="d-flex flex-column justify-content-center p-3 text-center" style="position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(0,0,0,.55);z-index:10;">
<div class="mb-2">
<a class="btn btn-gradient" href="/premium.html">Upgrade your account</a>
</div>
to watch videos with no limits!
</div> -->
<script type="b402dc6aa066e52050d893f1-text/javascript" src='https://dropload.io/player/jw8/jwplayer.js'></script>
<script type="b402dc6aa066e52050d893f1-text/javascript">jwplayer.key="";</script>
<style>
.jw-text-track-cue {
text-shadow: 1px 1px 2px transparent !important;
line-height: 1.53em;
padding-left: 0.3em !important;
padding-right: 0.3em !important;
padding-bottom: 0.2em !important;
border-radius: 6px;
}
</style><script src="/js/localstorage-slim.js" type="b402dc6aa066e52050d893f1-text/javascript"></script><script src="https://dropload.io/js/dnsads.js?dfp=1&ad_code=2&adsrc=3" type="b402dc6aa066e52050d893f1-text/javascript"></script>
<div id='vplayer' style="width:100%;height:100%;text-align:center;"><img src='/images/back2.jpg' style='width:100%;height:100%;'></div>
</div>
<button type="button" class="btn lightdown"></button>
</div>
<div class="lightdown-backdrop"></div>
<h1>des-teufels-bad-2024 </h1>
<div class="videoplayer-controlbar">
<div class="row g-1">
<div class="col-auto flex-grow-1 flex-shrink-1 mw-0">
<div class="videoplayer-details">
<div class="row align-items-center flex-nowrap">
<div class="col-auto flex-shrink-1 mw-0">
<div class="row flex-lg-nowrap">
<div class="col-auto d-flex align-items-center">
<i class="icon icon-clock icon-size-16 me-2 opacity-50"></i>
on Jun 27, 2024
</div>
<div class="col-auto d-flex align-items-center">
<i class="icon icon-download2 icon-size-16 me-2 opacity-50"></i>
<span id="size"></span>
</div>
<div class="col-auto d-flex align-items-center">
<i class="icon icon-clock icon-size-16 me-2 opacity-50"></i>
02:00:59
</div>
</div>
</div>
<div class="col-auto d-flex align-items-center">
<button class="btn icon-btn me-4" data-bs-toggle="modal" data-bs-target="#modal_addplaylist">
<i class="icon icon-addlist icon-size-16"></i>
</button>
<button type="button" class="btn icon-btn text-danger" data-bs-toggle="modal" data-bs-target="#modal_flag">
<i class="icon icon-flag icon-size-16"></i>
</button>
</div>
</div>
</div>
</div>
<div class="col-auto">
<button class="btn btn-like border-0" onclick="if (!window.__cfRLUnblockHandlers) return false; return jah('/?op=vote&file_code=lyo2h1snpe5c&v=up')" title="Like" data-cf-modified-b402dc6aa066e52050d893f1-="">
<i class="icon icon-like icon-size-16 me-2"></i>
<span id="likes_num">0</span>
</button>
</div>
<div class="col-auto">
<button class="btn btn-dislike border-0" onclick="if (!window.__cfRLUnblockHandlers) return false; return jah('/?op=vote&file_code=lyo2h1snpe5c&v=down')" title="Don&#39;t Like" data-cf-modified-b402dc6aa066e52050d893f1-="">
<i class="icon icon-dislike icon-size-16 me-2"></i>
<span id="dislikes_num">0</span>
</button>
</div>
</div>
</div>
<div class="mb-5">
<div class="row justify-content-center justify-content-lg-between">
<div class="col-auto order-lg-last mb-3">
<div class="dropdown">
<a class="btn btn-gradient videoplayer-download" data-bs-toggle="dropdown">
Download<i class="icon icon-download icon-size-20 ms-2"></i>
</a>
<div class="dropdown-menu w-100 py-0 shadow">
<a href="https://dropload.io/d/lyo2h1snpe5c_h" class="dropdown-item d-flex align-items-center">
<span class="flex-grow-1 pe-3 text-white">
<b>HD quality</b> <br> <span class="xsmall text-light">1920x1080, <span class="download-size">1.3 GB</span></span>
</span>
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="18"><defs><linearGradient id="a" x1="0%" x2="100%" y1="0%" y2="0%"><stop offset="0%" stop-color="#3DB6D4"/><stop offset="100%" stop-color="#6BCFA4"/></linearGradient></defs><path fill-rule="evenodd" fill="#3DB6D4" d="M13 6V0H7v6H2l8 8 8-8h-5ZM0 16h20v2H0v-2Z"/><path fill="url(#a)" d="M13 6V0H7v6H2l8 8 8-8h-5ZM0 16h20v2H0v-2Z"/></svg>
</a>
</div>
</div>
</div>
<script type="b402dc6aa066e52050d893f1-text/javascript">
$(function(){
var a = $('.dropdown-menu a:first-child .download-size');
$('#size').append(a);
})
</script>
<div class="col-12 col-lg-7 mb-3">
<div class="copybox">
<textarea class="form-control copy-source" rows="6"><IFRAME SRC="https://dropload.io/e/lyo2h1snpe5c" FRAMEBORDER=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=NO WIDTH=640 HEIGHT=360 allowfullscreen></IFRAME></textarea>
<button class="btn btn-primary" onclick="if (!window.__cfRLUnblockHandlers) return false; copy(this);" data-cf-modified-b402dc6aa066e52050d893f1-="">Copy</button>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<div class="modal fade" id="modal_flag" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">Flag</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body pt-0">
<form method="POST" action="/" onsubmit="if (!window.__cfRLUnblockHandlers) return false; $.post('/',$(this).serialize(),function(code){ eval(code); } );return false;" data-cf-modified-b402dc6aa066e52050d893f1-="">
<input type="hidden" name="op" value="report_file">
<input type="hidden" name="file_code" value="lyo2h1snpe5c">
<div class="mb-3">
<label class="form-label">Reason:</label>
<select class="form-select" name="report_type">
<option>Broken video</option>
<option>Wrong title/description</option>
<option>Copyright restriction</option>
<option>Other</option>
</select>
</div>
<div class="mb-3">
<textarea name="report_info" class="form-control" rows="2" placeholder="Details"></textarea>
</div>
<div class="text-center">
<input type="submit" name="add" value="Send Report" class="btn btn-gradient submit-btn">
</div>
</form>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modal_addplaylist" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">Add to</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body pt-0">
</div>
</div>
</div>
</div>
<div class="modal fade" id="modal_share" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5">Share</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body pt-0">
Share code
</div>
</div>
</div>
</div>
<script type="b402dc6aa066e52050d893f1-text/javascript">eval(function(p,a,c,k,e,d){while(c--)if(k[c])p=p.replace(new RegExp('\\b'+c.toString(a)+'\\b','g'),k[c]);return p}('1d("5w").5v({5u:{2i:"/5t/2l/2k-o.2l?v=3",q:"2k-o"},5s:[{2j:"13://5r.o.12/5q/5p/5o/5n/5m.5l?t=5k&s=1z&e=5j&f=22&i=0.0&5i=0&5h=21.20.5g.5f"}],5e:"1j%",5d:"1j%",5c:"5b",5a:"59.56",58:\'57\',55:"y",a:[{2j:"/26?23=54&k=53&2i=13://2h.o.12/52.2g",51:"50"}],1s:{4z:1,2f:\'#4y\',4x:\'#4w\',4v:"4u",4t:30,4s:\'1j\',},\'4r\':{"4q":"4p"},4o:"4n",4m:"13://o.12/",4l:{},4k:y,1r:[1,1.25,1.5,2],4j:\'13://2h.o.12/4i.2g\'}).g(\'1t\',8(){d n=2d.4h("11");n.4g="n";n.2e(\'4f\',\'4-1i 4-1i-4e 4-2c-2f 4-4d 4-1i-4c\');n.2e(\'4b\',\'6.1c(6.4a()+10)\');2d.49(\'.4-2c-48\').47(n)});d 1g,1h;d 46=0,45=0;d 6=1d();d 2a=0,44=0,43=0,j=0;$.42({41:{\'40-3z\':\'3y-3x\'}});6.g(\'3w\',8(x){9(5>0&&x.p>=5&&1h!=1){1h=1;$(\'11.3v\').3u(\'3t\')}9(x.p>=j+5||x.p<j){j=x.p;1f.3s(\'1e\',3r.3q(j),{3p:2b*2b*24*7})}});6.g(\'1c\',8(x){2a=x.p});6.g(\'3o\',8(x){29(x)});6.g(\'3n\',8(){$(\'11.28\').3m();1f.3l(\'1e\')});6.g(\'3k\',8(x){});8 29(x){$(\'11.28\').27();$(\'#3j\').27();9(1g)15;1g=1;z=0;9(3i.3h===3g){z=1}$.1x(\'/26?23=3f&3e=3d&3c=22-21-20-1z-3b&3a=&z=\'+z,8(1y){$(\'#39\').38(1y)});d j=1f.1x(\'1e\');9(j>0){1d().1c(j)}}8 37(){d a=6.16(1w);1v.1u(a);9(a.k>1){1m(i=0;i<a.k;i++){9(a[i].q==1w){1v.1u(\'!!=\'+i);6.1k(i)}}}}6.g(\'1t\',8(){});6.g("h",8(r){d a=6.16();9(a.k<2)15;$(\'.4-c-36-35\').34(8(){$(\'#4-c-b-h\').19(\'4-c-b-u\');$(\'.4-b-h\').m(\'l-1a\',\'w\')});6.33("/32/31.2z","2y 2x",8(){$(\'.4-1q\').2w(\'4-c-1p\');$(\'.4-c-1s, .4-c-1r\').m(\'l-1b\',\'w\');9($(\'.4-1q\').2v(\'4-c-1p\')){$(\'.4-b-h\').m(\'l-1b\',\'y\');$(\'.4-b-h\').m(\'l-1a\',\'y\');$(\'.4-c-b-2u\').19(\'4-c-b-u\');$(\'.4-c-b-h\').2t(\'4-c-b-u\')}2s{$(\'.4-b-h\').m(\'l-1b\',\'w\');$(\'.4-b-h\').m(\'l-1a\',\'w\');$(\'.4-c-b-h\').19(\'4-c-b-u\')}},"2r");6.g("2q",8(r){18.2p(\'17\',r.a[r.2o].q)});9(18.1o(\'17\')){2n("1n(18.1o(\'17\'));",2m)}});d 14;8 1n(1l){d a=6.16();9(a.k>1){1m(i=0;i<a.k;i++){9(a[i].q==1l){9(i==14){15}14=i;6.1k(i)}}}}',36,213,'||||jw||player||function|if|tracks|submenu|settings|var|||on|audioTracks||lastt|length|aria|attr|newButton|dropload|position|name|event|||active||false||true|adb||div|io|https|current_audio|return|getAudioTracks|default_audio|localStorage|removeClass|expanded|checked|seek|jwplayer|ttlyo2h1snpe5c|ls|vvplay|vvad|icon|100|setCurrentAudioTrack|audio_name|for|audio_set|getItem|open|controls|playbackRates|captions|ready|log|console|track_name|get|data|1746644167|61|130|987607|op|||dl|hide|video_ad|doPlay|prevt|60|button|document|setAttribute|color|jpg|img|url|file|jw8|css|300|setTimeout|currentTrack|setItem|audioTrackChanged|dualSound|else|addClass|quality|hasClass|toggleClass|Track|Audio|svg||dualy|images|addButton|mousedown|buttons|topbar|set_audio_track|html|fviews|embed|dfd8c020bb0d74e1c9d98c1a09212cef|hash|lyo2h1snpe5c|file_code|view|undefined|cRAds|window|over_player_msg|pause|remove|show|complete|play|ttl|round|Math|set|slow|fadeIn|video_ad_fadein|time|cache|no|Cache|Content|headers|ajaxSetup|v2done|tott|vastdone2|vastdone1|appendChild|container|querySelector|getPosition|onclick|forward|reset|inline|class|id|createElement|lyo2h1snpe5c_xt|image|playbackRateControls|cast|aboutlink|DropLoad|abouttext|HD|1557|qualityLabels|fontOpacity|backgroundOpacity|Tahoma|fontFamily|303030|backgroundColor|FFFFFF|userFontScale|thumbnails|kind|lyo2h1snpe5c0000|7259|get_slides|androidhls||metadata|preload|7258|duration|uniform|stretching|height|width|204|236|ii|sp|14400|EIGVExKNGKfXGRFbZEiW12CdAXoqbqvCxk4p2qLrRdQ|m3u8|master|lyo2h1snpe5c_h|00197|01|hls2|srv27|sources|assets2|skin|setup|vplayer'.split('|')))
</script>
<style media="screen">
.lightdown {
position: absolute;
top: 20px;
right: 20px;
width: 40px;
height: 40px;
border: 0;
padding: 0;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath fill-rule='evenodd' fill='%23FFF' d='M10 20c-1.654 0-3-1.346-3-3v-.531c0-.625-.254-1.237-.695-1.679l-.548-.548A5.96 5.96 0 0 1 4 10c0-1.603.624-3.109 1.757-4.243A5.961 5.961 0 0 1 10 4a5.96 5.96 0 0 1 4.242 1.757A5.96 5.96 0 0 1 16 10a5.957 5.957 0 0 1-1.758 4.242l-.546.547a2.396 2.396 0 0 0-.696 1.68V17c0 1.654-1.346 3-3 3Zm-1.025-4c.017.154.025.311.025.469V17a1.001 1.001 0 0 0 2 0v-.531c0-.158.008-.315.024-.469H8.975Zm-.737-2h3.524c.152-.222.325-.431.519-.624l.546-.547A3.974 3.974 0 0 0 14 10a3.975 3.975 0 0 0-1.172-2.829c-1.512-1.51-4.146-1.51-5.657 0A3.978 3.978 0 0 0 6 10c0 1.068.416 2.072 1.171 2.828h.001l.547.548c.194.194.367.402.519.624ZM19 11h-1a1 1 0 1 1 0-2h1a1 1 0 1 1 0 2ZM2 11H1a1 1 0 1 1 0-2h1a1 1 0 0 1 0 2Zm13.657-5.657a.999.999 0 0 1-.707-1.707l.707-.707a1 1 0 0 1 1.414 1.414l-.707.707a.993.993 0 0 1-.707.293Zm-11.314 0a.993.993 0 0 1-.707-.293l-.707-.707a.999.999 0 1 1 1.414-1.414l.707.707a.999.999 0 0 1-.707 1.707ZM10 3a1 1 0 0 1-1-1V1a1 1 0 0 1 2 0v1a1 1 0 0 1-1 1Z'/%3E%3C/svg%3E") no-repeat center;
background-color: rgba(28,37,52,.75);
transition: .25s;
opacity: 0;
}
.videoplayer-embed:hover .lightdown {
opacity: 1;
}
.body-lightdown .lightdown {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20'%3E%3Cpath fill-rule='evenodd' fill='%233DB6D4' d='M10 20c-1.654 0-3-1.346-3-3v-.531c0-.625-.254-1.237-.695-1.679l-.548-.548A5.96 5.96 0 0 1 4 10c0-1.603.624-3.109 1.757-4.243A5.961 5.961 0 0 1 10 4a5.96 5.96 0 0 1 4.242 1.757A5.96 5.96 0 0 1 16 10a5.957 5.957 0 0 1-1.758 4.242l-.546.547a2.396 2.396 0 0 0-.696 1.68V17c0 1.654-1.346 3-3 3Zm-1.025-4c.017.154.025.311.025.469V17a1.001 1.001 0 0 0 2 0v-.531c0-.158.008-.315.024-.469H8.975Zm-.737-2h3.524c.152-.222.325-.431.519-.624l.546-.547A3.974 3.974 0 0 0 14 10a3.975 3.975 0 0 0-1.172-2.829c-1.512-1.51-4.146-1.51-5.657 0A3.978 3.978 0 0 0 6 10c0 1.068.416 2.072 1.171 2.828h.001l.547.548c.194.194.367.402.519.624ZM19 11h-1a1 1 0 1 1 0-2h1a1 1 0 1 1 0 2ZM2 11H1a1 1 0 1 1 0-2h1a1 1 0 0 1 0 2Zm13.657-5.657a.999.999 0 0 1-.707-1.707l.707-.707a1 1 0 0 1 1.414 1.414l-.707.707a.993.993 0 0 1-.707.293Zm-11.314 0a.993.993 0 0 1-.707-.293l-.707-.707a.999.999 0 1 1 1.414-1.414l.707.707a.999.999 0 0 1-.707 1.707ZM10 3a1 1 0 0 1-1-1V1a1 1 0 0 1 2 0v1a1 1 0 0 1-1 1Z'/%3E%3C/svg%3E");
}
.lightdown-backdrop {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,.9);
display: none;
z-index: 1999;
}
.body-lightdown .lightdown-backdrop {
display: block;
}
.body-lightdown .videoplayer-embed {
z-index: 2000;
}
</style>
<script type="b402dc6aa066e52050d893f1-text/javascript">
$('.lightdown').on('click', function(){
$('body').toggleClass('body-lightdown');
})
</script>
<Script type="b402dc6aa066e52050d893f1-text/javascript">
$("#embed_div textarea").focus(function (){ $(this).select(); })
var tab_cookie='tab_down';
$('ul.tabs').on('click', 'li:not(.current)', function() {
$(this).addClass('current').siblings().removeClass('current')
.parents('div.section').find('div.box').eq($(this).index()).fadeIn(150).siblings('div.box').hide();
});
$("#iew,#ieh").change(function (){
var ww = $("#iew").val();
var hh = $("#ieh").val();
ww = ww.replace(/\D/g,'');
hh = hh.replace(/\D/g,'');
if(!ww)ww=640;
if(!hh)hh=360;
tt = $("#iet").val();
tt = tt.replace(/ WIDTH=\d+ HEIGHT=\d+ /,' WIDTH='+ww+' HEIGHT='+hh+' ');
$("#iet").val(tt);
});
</Script>
<script src="https://dropload.io/js/tabber.js" type="b402dc6aa066e52050d893f1-text/javascript"></script>
<Script type="b402dc6aa066e52050d893f1-text/javascript">
$(function() {
});
</Script>
<script data-cfasync="false" async type="text/javascript" src="//sx.impubicpuddly.com/rO7FQr7AANJdtg/111561"></script>
<script src='https://dropload.io/tag2.js' type="b402dc6aa066e52050d893f1-text/javascript"></script>
<script src='https://dropload.io/tag1.js' type="b402dc6aa066e52050d893f1-text/javascript"></script>
<!-- Javascript Alt Ads code start -->
<!-- Javascript Alt Ads code end -->
</main>
<footer class="footer">
<div class="container">
<div class="row text-center text-lg-start flex-lg-nowrap">
<div class="col">
<div class="mb-3">
<a href="/">
<img src="https://dropload.io/assets2/images/logo.svg" alt="">
</a>
</div>
<div class="text-muted mb-4 small">© 2025 Dropload - Revolution Video Hosting. All rights reserved.</div>
</div>
<div class="col d-none d-lg-block">
<div class="nav flex-column mb-3">
<a href="/faq" class="nav-link">FAQ</a>
<a href="/contact" class="nav-link">Contact Us</a>
</div>
</div>
<div class="col d-none d-lg-block">
<div class="nav flex-column mb-3">
<a href="/tos" class="nav-link">Terms of service</a>
<a href="#" class="nav-link">Privacy Policy</a>
<a href="#" class="nav-link">Copyright Policy</a>
</div>
</div>
<div class="col d-none d-lg-block">
<div class="nav flex-column mb-3">
<a href="/api.html" class="nav-link">API</a>
<a href="/make_money.html" class="nav-link">Make Money</a>
</div>
</div>
</div>
</div>
</footer>
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="b402dc6aa066e52050d893f1-|49" defer></script></body>
</html>

View file

@ -0,0 +1 @@
not found tt12345678

View file

@ -0,0 +1,109 @@
 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Movie tt29141112</title>
<meta name="description" content="Movie tt29141112">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="/static/css/bootstrap.min.css" />
<link rel="stylesheet" href="/static/css/main.css?v=1.2.7" />
<link rel="stylesheet" href="/static/css/dl.css?v=4" />
</head>
<body>
<link rel="stylesheet" href="/static/css/_player.css?v=46" />
<div class="_player">
<ul class="_player-mirrors">
<li class="active" data-link="//supervideo.cc/e/q7i0sw1oytw3">
supervideo </li>
<li class="" data-link="//dropload.io/embed-lyo2h1snpe5c.html">
dropload </li>
<li class="fullhd" data-link="https://meinecloud.click/fullhd/index.php?code=tt29141112">
4K Server
</li>
<div class="_hidden-mirrors-wrapper">
<div class="_show_hidden-mirrors" data-link="">
andere Server
</div>
<div class="_hidden-mirrors">
<li class="" data-link="//mixdrop.ag/e/3nzwveprim63or6">
mixdrop </li>
<li class="" data-link="//dood.to/e/sk1m9eumzyjj">
doodstream </li>
</div>
</div>
</ul>
<div class="_player-container" style="">
<a href="#" class="_player-play">
<span><span>
<svg xmlns="http://www.w3.org/2000/svg" width="35.3" height="38" viewBox="0 0 35.3 38">
<path d="M33.5 22l-28 15.6c-2.4 1.3-5.5-.3-5.5-3V3.4C0 .7 3-.9 5.4.5l28 15.6c1.7.9 2.3 3 1.3 4.6-.2.5-.7 1-1.2 1.3z" fill="#fff" /></svg>
</span></span>
</a>
<div class="_player-bar">
<div class="_player-time">
<span>0:00</span>
<span class="_player-time-bar"></span>
<span>120:43</span>
</div>
<div class="_player-btns">
<a href="#" onclick="if (!window.__cfRLUnblockHandlers) return false; return false" data-cf-modified-439eff7a0cccd973bece8aa1-="">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="14" viewBox="0 0 13 14">
<path d="M12.3 8.1L2 13.9c-.9.5-2-.1-2-1.1V1.3C0 .3 1.1-.3 2 .2L12.3 6c.7.3.9 1 .5 1.6-.1.2-.2.4-.5.5z" fill="#00c6ff" /></svg>
</a>
<a href="#" onclick="if (!window.__cfRLUnblockHandlers) return false; return false" data-cf-modified-439eff7a0cccd973bece8aa1-="">
<svg xmlns="http://www.w3.org/2000/svg" width="17.9" height="16" viewBox="0 0 17.9 16">
<path
d="M12.5 4l-1.3 1.3c.6.7 1 1.7 1 2.7s-.4 2-1.1 2.7l1.3 1.3c1-1 1.7-2.4 1.7-4s-.6-3-1.6-4zm2.6-2.7l-1.3 1.3C15.2 4 16 5.9 16 8s-.8 4-2.2 5.3l1.3 1.3c1.7-1.7 2.8-4.1 2.8-6.7s-1.1-4.8-2.8-6.6zM2.4 5.2H0v5.6h2.4L7.5 16h1.9V0H7.5L2.4 5.2zm5.1 8.1L3.1 8.9H1.9V7.1h1.3l4.4-4.4v10.6z"
fill="#fff" /></svg>
</a>
<a href="#" onclick="if (!window.__cfRLUnblockHandlers) return false; return false" data-cf-modified-439eff7a0cccd973bece8aa1-="">
<svg xmlns="http://www.w3.org/2000/svg" width="34.3" height="14" viewBox="0 0 34.3 14">
<path
d="M7 0C3.1 0 0 3.1 0 7s3.1 7 7 7c2.6 0 4.8-1.4 6-3.5l-1.4-.8c-.9 1.6-2.6 2.7-4.6 2.7-3 0-5.4-2.4-5.4-5.4C1.6 4 4 1.6 7 1.6c1.5 0 2.8.6 3.8 1.6L9 5h4.6V.3L11.9 2C10.6.8 8.9 0 7 0zm14.2 5.1h-1.3V7h-1.8v1.3h1.8v2h1.3v-2H23V7h-1.8V5.1zm2.9-.2V6l1.7-.5V11h1.4V3.9H27l-2.9 1zm9.5-.3c-.4-.5-1-.8-1.8-.8s-1.4.3-1.8.8c-.4.5-.6 1.3-.6 2.3v1.3c0 1 .2 1.7.6 2.2.4.5 1 .8 1.8.8s1.4-.3 1.8-.8c.4-.5.6-1.3.6-2.3V6.8c.1-1-.1-1.7-.6-2.2zm-.7 3.7c0 .6-.1 1-.2 1.2-.2.3-.4.4-.7.4-.3 0-.6-.1-.8-.4-.2-.3-.2-.7-.2-1.3V6.5c0-.5.1-.9.3-1.2.2-.3.4-.4.7-.4.3 0 .6.1.8.4.2.3.2.7.2 1.3v1.7z"
fill="#fff" /></svg>
</a>
<div class="space"></div>
<a href="#" onclick="if (!window.__cfRLUnblockHandlers) return false; return false" data-cf-modified-439eff7a0cccd973bece8aa1-="">
<svg xmlns="http://www.w3.org/2000/svg" width="20.5" height="16" viewBox="0 0 20.5 16">
<path
d="M2.2 12.2c.5 0 1-.4 1-1V4.8c0-.4-.2-.7-.6-.9-.4-.1-.8-.1-1 .2L.3 5.4c-.4.4-.4 1 0 1.4.3.2.6.3 1 .2v4.2c0 .5.4 1 .9 1zm3.7-8.4c-1 0-1.8.8-1.8 1.8v4.8c0 1 .8 1.8 1.8 1.8h1.3c1 0 1.8-.8 1.8-1.8V5.6c0-1-.8-1.8-1.8-1.8H5.9zM7 10.2H6V5.8h1v4.4zm4.7-6.4c-1 0-1.8.8-1.8 1.8v4.8c0 1 .8 1.8 1.8 1.8H13c1 0 1.8-.8 1.8-1.8V5.6c0-1-.8-1.8-1.8-1.8h-1.3zm1.1 6.4h-1V9h1v1.2zm0-3.2h-1V5.8h1V7zm5.9-3.2h-1.3c-1 0-1.8.8-1.8 1.8v4.8c0 1 .8 1.8 1.8 1.8h1.3c1 0 1.8-.8 1.8-1.8V5.6c0-1-.8-1.8-1.8-1.8zm-.2 6.4h-1V5.8h1v4.4zM1 1.9h18.5c.5 0 1-.4 1-1 0-.5-.4-1-1-1H1C.4 0 0 .4 0 1c0 .5.4.9 1 .9zm18.5 12.2H1c-.5 0-1 .4-1 1s.4 1 1 1h18.5c.5 0 1-.4 1-1s-.5-1-1-1z"
fill="#00c6ff" /></svg>
</a>
<a class="vedo">
<svg xmlns="http://www.w3.org/2000/svg" width="20.5" height="16" viewBox="0 0 20.5 16">
<path
d="M1 1.9h18.6c.5 0 1-.4 1-1 0-.5-.4-1-1-1H1C.4 0 0 .4 0 1c0 .5.4.9 1 .9zm18.5 12.2H1c-.5 0-1 .4-1 1s.4 1 1 1h18.6c.5 0 1-.4 1-1s-.5-1-1.1-1zM16 5.5c.4-.4.4-1 0-1.4-.4-.4-1-.4-1.4 0L12.8 6V4.8c0-.5-.4-1-1-1s-1 .4-1 1v6.4c0 .5.4 1 1 1s1-.4 1-1V10l1.9 1.9c.2.2.4.3.7.3.2 0 .5-.1.7-.3.4-.4.4-1 0-1.4l-2.1-2c-.1-.1-.2-.3-.2-.5s.1-.3.2-.5l2-2zm-7.4 6.7c.5 0 1-.4 1-1V4.8c0-.5-.4-1-1-1-.5 0-1 .4-1 1V7h-1V4.8c0-.5-.4-1-1-1-.5 0-1 .4-1 1V8c0 .5.4 1 1 1h1.9v2.2c.2.6.6 1 1.1 1z"
fill="#fff" /></svg>
</a>
<a href="#" class="fullsize">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<path
d="M5 0H1C.4 0 0 .4 0 1v4c0 .6.4 1 1 1s1-.4 1-1V2h3c.6 0 1-.4 1-1s-.4-1-1-1zm10 0h-4c-.6 0-1 .4-1 1s.4 1 1 1h3v3c0 .6.4 1 1 1s1-.4 1-1V1c0-.6-.4-1-1-1zM5 14H2v-3c0-.6-.4-1-1-1s-1 .4-1 1v4c0 .6.4 1 1 1h4c.6 0 1-.4 1-1 0-.5-.4-1-1-1zm10-4c-.6 0-1 .4-1 1v3h-3c-.6 0-1 .4-1 1s.4 1 1 1h4c.6 0 1-.4 1-1v-4c0-.6-.4-1-1-1z"
fill="#fff" /></svg>
</a>
</div>
</div>
</div>
<img src="https://m.media-amazon.com/images/M/MV5BMDRjNGJlNTQtYjU5Yy00OWEzLTk3MGMtYmNjZDYwYjJkZWI5XkEyXkFqcGc@._V1_QL75_UX820_.jpg" class="_player-cover" alt="">
<iframe id="_player" style="" allowfullscreen="" src="" scrolling="no" style="background-color:#fff"></iframe>
<div class="spinner-container" style="display:none"><div class="spinner-border"></div></div>
</div>
<script src="/static/js/jquery.min.js" type="439eff7a0cccd973bece8aa1-text/javascript"></script>
<script src="/static/js/bootstrap.bundle.min.js" type="439eff7a0cccd973bece8aa1-text/javascript"></script>
<script src="/static/js/main.js?v=12" type="439eff7a0cccd973bece8aa1-text/javascript"></script>
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="439eff7a0cccd973bece8aa1-|49" defer></script></body>
</html>

View file

@ -0,0 +1,401 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>
Watch des teufels bad 2024
</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Watch video des teufels bad 2024">
<meta name="keywords" content="des, teufels, bad, 2024">
<link rel="stylesheet" href="https://supervideo.cc/assets/css/style.css?v=130">
<!-- jsdata -->
<script src="https://supervideo.cc/assets/js/libs.min.js?v=2" type="984fd910af585e6bd302d264-text/javascript"></script>
<script src="https://supervideo.cc/assets/js/common.js?v=2" type="984fd910af585e6bd302d264-text/javascript"></script>
<script src="https://supervideo.cc/js/xupload.js?v=4" type="984fd910af585e6bd302d264-text/javascript"></script>
<!-- favicon -->
<link rel="apple-touch-icon" href="https://supervideo.cc/assets/images/favicon/apple-touch-icon.png" sizes="180x180">
<link rel="icon" href="https://supervideo.cc/assets/images/favicon/favicon-32x32.png" sizes="32x32">
<link rel="icon" href="https://supervideo.cc/assets/images/favicon/favicon-16x16.png" sizes="16x16">
<!-- <link rel="manifest" href="https://supervideo.cc/assets/images/favicon/manifest.json">-->
<link rel="icon" href="https://supervideo.cc/assets/images/favicon/favicon.ico">
</head>
<body class="
">
<header class="header">
<div class="container-fluid">
<div class="header__bar flex-start">
<div class="flex-grow-1">
<a href="/" class="logo"></a>
</div>
<div class="header__right"><a href="/login.html" class="btn btn_border_default header__btn">
Login
</a><a href="/?op=registration" class="btn btn_secondary header__btn">
Sign Up
</a></div>
<div class="header-mobile">
<button type="button" class="btn-toggle" data-toggle="dropdown">
<i class="icon icon_user icon_size_18"></i>
</button>
<div class="dropdown-menu dropdown-menu-right header-mobile__dropdown-menu">
<a href="/login.html" class="btn btn_block btn_border_default">
Login
</a><a href="/?op=registration" class="btn btn_block btn_secondary">
Sign Up
</a>
</div>
</div>
</div>
</div>
</header>
<style>
.modal {
color: #333;
}
.download-codes__copy {
position: relative;
margin-bottom: 15px;
margin-top: 10px;
float: right;
}
.download__player {
position: relative;
padding-top: 56.25%;
}
.download__info-item {
margin-bottom: 15px;
font-size: 14px;
}
.download__info-item a {
color: inherit;
}
.download__info-tags {
margin-bottom: 15px;
}
.downloadbox__dropdown-menu li a {
-webkit-flex-wrap: nowrap;
-ms-flex-wrap: nowrap;
flex-wrap: nowrap;
}
.downloadbox__quality {
margin-right: 5px;
}
.downloadbox__size {font-size: 13px;}
</style>
<!--100% ads-->
<script src="/9271593.js" type="984fd910af585e6bd302d264-text/javascript"></script>
<script src="/9271609.js" type="984fd910af585e6bd302d264-text/javascript"></script>
<script data-cfasync="false" async type="text/javascript" src="//zm.nostocbark.com/rljPIWhbr4xr/115547"></script>
<script language="JavaScript" type="984fd910af585e6bd302d264-text/javascript" CHARSET="UTF-8" src="https://supervideo.cc/js/jquery.cookie.js"></script>
<script type="984fd910af585e6bd302d264-text/javascript">
$.cookie('file_id', '2071851', { expires: 10 });
$.cookie('aff', '11057', { expires: 10 });
</script>
<div class="container-fluid">
<div class="download">
<div class="download__top" style="background-image: url(https://supervideo.cc/assets/images/bg_download.png);">
<div class="container">
<div class="download__player">
<div class="overlay " >
<script type="984fd910af585e6bd302d264-text/javascript" src='https://supervideo.cc/player8/jwplayer.js'></script>
<script type="984fd910af585e6bd302d264-text/javascript">jwplayer.key="9dOyFG96QFb9AWbR+FhhislXHfV1gIhrkaxLYfLydfiYyC0s";</script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-46849459-36" type="984fd910af585e6bd302d264-text/javascript"></script>
<script type="984fd910af585e6bd302d264-text/javascript">
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-46849459-36');
</script>
<link rel="stylesheet" type="text/css" href="https://supervideo.cc/assets/player/myskinfile.css?v=11">
<script src="https://supervideo.cc/js/pop.js" type="984fd910af585e6bd302d264-text/javascript"></script>
<div id='vplayer' style="width:100%;height:100%;text-align:center;"><img src="https://i.serversicuro.cc/q7i0sw1oytw3_xt.jpg" style="width:100%;height:100%;"></div>
</div>
</div>
<div class="row justify-content-center align-items-center">
<div class="col-sm-8 mr-auto">
<h1 class="download__title">
des-teufels-bad-2024
</h1>
<ul class="download__info">
<li><i class="icon icon_clock icon_align_left"></i>
on
Jun 27, 2024
</li>
<li><i class="icon icon_user icon_align_left"></i><a href="/users/germancloud123">
germancloud123
</a></li>
<li><i class="icon icon_eye icon_align_left"></i>
1830 views
</li>
<li><button type="button" class="btn download__flag" data-toggle="modal" data-target="#vid-flag"><i class="icon icon_flag"></i></button>
<div class="modal fade" id="vid-flag" tabindex="-1" role="dialog" aria-labelledby="modal-title" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modal-title">Flag:</h5>
<button type="button" class="modal-close" data-dismiss="modal" aria-label="Close">
<i class="icon icon_round-close icon_size_20"></i>
</button>
</div>
<div class="modal-body" id="id_flag">
<form class="form" method="POST" action="/" onsubmit="if (!window.__cfRLUnblockHandlers) return false; $.post('/',$(this).serialize(),function(code){ eval(code); $('#id_flag').wrapInner('<span></span>').addClass('alert alert-success'); } );return false;" data-cf-modified-984fd910af585e6bd302d264-="">
<input type="hidden" name="op" value="report_file">
<input type="hidden" name="file_code" value="q7i0sw1oytw3">
<div class="form__group">
<label class="form__label">
Reason
</label>
<select class="input" name="report_type">
<option>
Broken video
</option>
<option>
Wrong title/description
</option>
<option>
Copyright restriction
</option>
<option>
Other
</option>
</select></div>
<div class="form__group">
<textarea name="report_info" class="input" id="msg" rows="2" placeholder="Details"></textarea>
</div>
<input type="submit" name="add" value="Send Report" class="btn btn_primary">
<button type="submit" class="btn btn_default" data-dismiss="modal">Cancel</button>
</form>
</div>
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="col-sm-auto">
<ul class="download-social">
<li><a class="download-social__item download-social__item_facebook" onclick="if (!window.__cfRLUnblockHandlers) return false; window.open(this.href, 'Share Facebook', 'width=640,height=436,toolbar=0,status=0'); return false" href="https://www.facebook.com/sharer/sharer.php?u=/q7i0sw1oytw3" data-cf-modified-984fd910af585e6bd302d264-=""><i class="icon icon_facebook"></i></a></li>
<li><a class="download-social__item download-social__item_twitter" onclick="if (!window.__cfRLUnblockHandlers) return false; window.open(this.href, 'Share Twitter', 'width=640,height=436,toolbar=0,status=0'); return false" href="https://twitter.com/intent/tweet?text=des-teufels-bad-2024" data-cf-modified-984fd910af585e6bd302d264-=""><i class="icon icon_twitter"></i></a></li>
</ul>
</div>
<div class="col-auto">
<div class="dowonload-rating" id="vote">
<button type="button" class="btn dowonload-rating__btn dowonload-rating__btn_plus" onclick="if (!window.__cfRLUnblockHandlers) return false; return jah('/?op=vote&file_code=q7i0sw1oytw3&v=up')" title="Like" data-cf-modified-984fd910af585e6bd302d264-=""><i
class="icon icon_like icon_align_left icon-size_20 dowonload-rating__icon"></i><span id="likes_num">
0
</span></button>
<span class="dowonload-rating__divider"></span>
<button type="button" class="btn dowonload-rating__btn dowonload-rating__btn_minus" onclick="if (!window.__cfRLUnblockHandlers) return false; return jah('/?op=vote&file_code=q7i0sw1oytw3&v=down')" title="Don&#39;t Like" data-cf-modified-984fd910af585e6bd302d264-=""><i
class="icon icon_dislike icon_align_left icon-size_20 dowonload-rating__icon"></i><span id="dislikes_num">
0
</span></button>
</div>
</div>
</div>
<div class="row justify-content-center">
<div class="col-sm-auto">
<div class="downloadbox">
<a href="#" data-toggle="dropdown" class="downloadbox__btn"> <i class="icon icon_download downloadbox__icon"></i> <span> <strong class="downloadbox__title">FREE DOWNLOAD</strong> Click to start Download </span> </a>
<ul class="dropdown-menu downloadbox__dropdown-menu">
<li>
<a href="#" onclick="if (!window.__cfRLUnblockHandlers) return false; download_video('q7i0sw1oytw3','n','2071851-130-61-1746643877-522918f4433ccf39599ad14f728e96bf')" data-cf-modified-984fd910af585e6bd302d264-=""><i
class="icon icon_download icon_size_18 icon_align_left"></i><b class="downloadbox__quality">
Normal quality
</b><span class="downloadbox__size">
1280x720, 1.0 GB
</span></a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-lg-8 order-2 order-lg-1">
</div>
<div class="col-lg-4 order-1 order-lg-2">
<div class="dsh-block">
<ul class="dsh-block__tabs nav">
<li><a class="active" data-toggle="tab" href="#tab-link">
Download Link
</a></li>
<li><a data-toggle="tab" href="#tab-forum">
Forum Code
</a></li>
<li><a data-toggle="tab" href="#tab-html">HTML</a></li>
<li><a data-toggle="tab" href="#tab-embed">Embed</a></li>
</ul>
<div class="dsh-block__body tab-content clearfix">
<div class="tab-pane fade show active" id="tab-link">
<div class="download-codes js-codes">
<textarea class="input download-codes__area">/q7i0sw1oytw3</textarea>
<button type="button" class="btn btn_link btn_sm download-codes__copy js-copy-codes"><i class="icon icon_copy icon_align_left"></i><span>Copy</span></button>
</div>
</div>
<div class="tab-pane fade" id="tab-forum">
<div class="download-codes js-codes">
<textarea class="input download-codes__area">[URL=/q7i0sw1oytw3][IMG]https://i.serversicuro.cc/q7i0sw1oytw3_t.jpg[/IMG]
des-teufels-bad-2024[/URL]
[1280x720, 02:00:58]</textarea>
<button type="button" class="btn btn_link btn_sm download-codes__copy js-copy-codes"><i class="icon icon_copy icon_align_left"></i><span>Copy</span></button>
</div>
</div>
<div class="tab-pane fade" id="tab-html">
<div class="download-codes js-codes">
<textarea
class="input download-codes__area"><a href="/q7i0sw1oytw3"><img src="https://i.serversicuro.cc/q7i0sw1oytw3_t.jpg" border=0><br>des-teufels-bad-2024</a><br>[1280x720, 02:00:58]</textarea>
<button type="button" class="btn btn_link btn_sm download-codes__copy js-copy-codes"><i class="icon icon_copy icon_align_left"></i><span>Copy</span></button>
</div>
</div>
<div class="tab-pane fade" id="tab-embed">
<div class="form__group">
<div class="row align-items-center text-center justify-content-center">
<div class="col-12">
<label class="form__label">Embed size: </label>
</div>
<div class="col-auto">
<div class="row no-gutters align-items-center">
<div class="col-auto">
<input type="text" class="input" id="iew" value="640" size="3">
</div>
<div class="col-auto text-muted"><i class="icon icon_close icon_size_8 icon_align_left icon_align_right"></i></div>
<div class="col-auto"><input class="input" type="text" id="ieh" value="360" size="3"></div>
</div>
</div>
</div>
</div>
<div class="download-codes js-codes">
<textarea id="iet" class="input download-codes__area"><div style="position:relative;padding-bottom:56%;padding-top:20px;height:0;"><irame src="/e/q7i0sw1oytw3" frameborder=0 marginwidth=0 marginheight=0 scrolling=no width=640 height=360 allowfullscreen style="position:absolute;top:0;left:0;width:100%;height:100%;"></iframe></div></textarea>
<button type="button" class="btn btn_link btn_sm download-codes__copy js-copy-codes"><i class="icon icon_copy icon_align_left"></i><span>Copy</span></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="984fd910af585e6bd302d264-text/javascript">eval(function(p,a,c,k,e,d){while(c--)if(k[c])p=p.replace(new RegExp('\\b'+c.toString(a)+'\\b','g'),k[c]);return p}('e("3l").3k({3j:[{m:"6://3i.n.4/3h/,3g,.3f/3e.3d"}],3c:"6://i.n.4/3b.11",3a:"15%",39:"15%",38:"10",37:"14.13",36:\'35\',34:"l",33:"l",32:"31",30:"2z",2y:[0.25,0.5,0.2x,1,1.25,1.5,2],2w:{2v:"2u"},2t:[{m:"/2s?t=2r&2q=14.13&2p=6://i.n.4/2o.11",2n:"2m"}],2l:{2k:\'#2j\',2i:12,2h:"2g",2f:0,2e:\'10\',2d:2c},2b:"2a",29:"",28:{m:"6://d.4/r/27.q",26:"6://d.4/c",8:"o-24",23:"5",u:l},22:{}});k f,j,h=0;k 21=0,20=0;k 7=e();7.9(\'1z\',3(x){b(5>0&&x.8>=5&&j!=1){j=1;$(\'g.1y\').1x(\'1w\')}b(h==0&&x.8>=z&&x.8<=(z+2)){h=x.8}});7.9(\'1v\',3(x){y(x)});7.9(\'1u\',3(){$(\'g.w\').1t()});3 y(x){$(\'g.w\').u();b(f)1s;f=1;a=0;b(p.1r===1q){a=1}$.1p(\'/1o?t=1n&1m=c&1l=1k-1j-1i-1h-1g&1f=&a=\'+a,3(s){$(\'#1e\').1d(s)})}7.9(\'1c\',3(){});e().1b("6://d.4/r/1a.q","19",3(){p.o.18.17=\'/v/c\'},"16");',36,130,'|||function|cc||https|player|position|on|adb|if|q7i0sw1oytw3|supervideo|jwplayer|vvplay|div|x2ok||vvad|var|true|file|serversicuro|top|window|png|images|data|op|hide||video_ad||doPlay|1814|uniform|jpg||58|7258|100|download11|href|location|Download|download2|addButton|ready|html|fviews|embed|9b2d39efe6d0590778523b0549bd11ed|1746643876|61|130|2071851|hash|file_code|view|dl|get|undefined|cRAds|return|show|complete|play|slow|fadeIn|video_ad_fadein|time|vastdone2|vastdone1|cast|margin|right||link|logo_p|logo|aboutlink|xvs|abouttext|90|fontOpacity|edgeStyle|backgroundOpacity|Verdana|fontFamily|fontSize|FFFFFF|color|captions|thumbnails|kind|q7i0sw1oytw30000|url|length|get_slides|dlf|tracks|myskin|name|skin|75|playbackRateControls|start|startparam|html5|primary|hlshtml|androidhls|metadata|preload|duration|stretching|height|width|q7i0sw1oytw3_xt|image|m3u8|master|urlset|dnzpfi3d27g4a3gyvbmh5klwtl65qh654hyjtgupd6p56thhyquqzo3klbfa|hls|hfs290|sources|setup|vplayer'.split('|')))
</script>
<script type="984fd910af585e6bd302d264-text/javascript">
</script>
<footer class="footer">
<div class="container-fluid">
<div class="footer__copyright">© 2017 - 2025 SuperVideo | Fast HLS Video Streaming Service
</div>
<ul class="footer__menu">
<li><a href="">
Home
</a></li>
<li><a href="/faq">
FAQ
</a></li>
<li><a href="/tos">
Terms of service
</a></li>
<li><a href="/premium">
Trust Uploader
</a></li>
<li><a href="/make_money.html">
Make Money
</a></li>
<li><a href="/checkfiles.html">
Link Checker
</a></li>
<li><a href="/contacts">
Contact Us
</a></li>
</ul>
<div class="text-center" style="padding-top: 8px;">
<!-- <a href="http://www.xvstheme.com/" rel="nofollow" title="Designed by XVSTheme" class="small text-reset" style="display:inline-flex; align-items: center">
<span style="margin-right: 4px;">Designed by</span>
<svg xmlns="http://www.w3.org/2000/svg" width="78.1" height="11" viewBox="0 0 78.1 11" xml:space="preserve"><path d="M73.5 7.5h-5.7c0 1.2.7 1.9 1.8 1.9.8 0 1.4-.4 1.6-1h2.4c-.6 1.7-1.9 2.6-3.9 2.6-2.8 0-4.2-1.4-4.2-4.1 0-2.8 1.3-4.1 4.1-4.1 2.7 0 4 1.3 4 3.8 0 .3 0 .6-.1.9zm-3.9-3.1c-1.1 0-1.6.4-1.7 1.6h3.4c-.2-1.1-.7-1.6-1.7-1.6zM62 6.3c0-1-.4-1.4-1.3-1.4-1 0-1.5.5-1.5 1.6v4.2h-2.3V6.3c0-1-.4-1.4-1.3-1.4-1 0-1.5.5-1.5 1.6v4.2h-2.3V3.1l2.1-.1.2 1c.4-.7 1.2-1.1 2.2-1.1 1.3 0 2.2.5 2.6 1.4.5-.9 1.3-1.4 2.5-1.4 2 0 3 1.1 3 3.4v4.5H62V6.3zM44.6 7.5c0 1.2.7 1.9 1.8 1.9.8 0 1.4-.4 1.6-1h2.4c-.5 1.7-1.8 2.6-3.8 2.6-2.8 0-4.2-1.4-4.2-4.1 0-2.8 1.3-4.1 4.1-4.1 2.7 0 4 1.3 4 3.8 0 .3 0 .6-.1.9h-5.8zm1.8-3.1c-1.1 0-1.6.4-1.7 1.6H48c-.1-1.1-.6-1.6-1.6-1.6zm-7.6 1.9c0-1-.4-1.4-1.4-1.4-1.2 0-1.6.5-1.6 1.6v4.2h-2.3V0h2.3v3.8c.4-.6 1.2-1 2.2-1 2.1 0 3.1 1.1 3.1 3.4v4.5h-2.4c.1.1.1-4.4.1-4.4zM27.4 7.6V5.2h-1.1V3.5l1.1-.4V1.4h2.3v1.7H32v2.1h-2.3v2.3c0 .9.3 1.2 1.2 1.2h1v2.1h-1.3c-2.3 0-3.2-.9-3.2-3.2zm-4.6-1.5c2.2.4 2.8.9 2.8 2.4S24.1 11 22 11c-2.4 0-3.8-.9-4.1-2.6h2.3c.2.6.7 1 1.7 1 .8 0 1.3-.4 1.3-.8 0-.5-.2-.7-1.2-.8l-1.5-.2c-1.8-.3-2.6-1-2.6-2.1C17.9 4 19.3 3 21.5 3c2.3 0 3.7.9 3.8 2.4h-2.4c-.1-.5-.7-.8-1.6-.8-.7 0-1.2.3-1.2.8 0 .4.2.6 1 .7.3-.1 1.7 0 1.7 0zM13.2 11c-2.2 0-3.1-1-3.5-3.5L9 3.1h2.3l.7 4.3c.2 1.1.5 1.5 1.2 1.5s1-.4 1.2-1.5l.6-4.3h2.4l-.7 4.4c-.4 2.5-1.4 3.5-3.5 3.5zm-7.3-.2L4.4 8.4l-1.6 2.3H0l2.8-3.9L.1 3.1h2.8l1.4 2.3 1.4-2.3h2.8L6 6.9l2.8 3.9H5.9z" fill="#000222"/><path d="M78.1 8.7h-2.6V11h2.6V8.7z" fill="#28e98c"/></svg>
</a> -->
</div>
</div>
</footer>
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="984fd910af585e6bd302d264-|49" defer></script></body>
</html>

3
src/handler/index.ts Normal file
View file

@ -0,0 +1,3 @@
export * from './kinokiste';
export * from './meinecloud';
export * from './types';

View file

@ -0,0 +1,57 @@
import fs from 'node:fs';
import slugify from 'slugify';
import { cachedFetchText } from '../utils';
import { handleKinoKiste } from './kinokiste';
jest.mock('./../utils/fetch', () => ({
cachedFetchText: jest.fn(),
}));
(cachedFetchText as jest.Mock).mockImplementation(
(url: string) => fs.readFileSync(`${__dirname}/fixtures/kinokiste/${slugify(url)}`).toString(),
);
describe('KinoKiste', () => {
test('does not handle movies', async () => {
const streams = await handleKinoKiste({ type: 'movie', id: 'tt29141112' });
expect(streams).toHaveLength(0);
});
test('does not handle non imdb series', async () => {
const streams = await handleKinoKiste({ type: 'series', id: 'kitsu:123' });
expect(streams).toHaveLength(0);
});
test('handles non-existent series gracefully', async () => {
const streams = await handleKinoKiste({ type: 'series', id: 'tt12345678:1:1' });
expect(streams).toHaveLength(0);
});
test('handle imdb black mirror s2e4', async () => {
const streams = await handleKinoKiste({ type: 'series', id: 'tt2085059:2:4' });
expect(streams).toHaveLength(2);
expect(streams[0]).toStrictEqual({
behaviorHints: {
group: 'webstreamr-kinokiste-supervideo',
},
name: 'WebStreamr DE | 720p',
resolution: '720p',
size: '699.8 MB',
title: 'KinoKiste - supervideo | 💾 699.8 MB | 🇩🇪',
url: expect.stringMatching(/^https:\/\/.*?.m3u8/),
});
expect(streams[1]).toStrictEqual({
behaviorHints: {
group: 'webstreamr-kinokiste-dropload',
},
name: 'WebStreamr DE | 720p',
resolution: '720p',
size: '699.8 MB',
title: 'KinoKiste - dropload | 💾 699.8 MB | 🇩🇪',
url: expect.stringMatching(/^https:\/\/.*?.m3u8/),
});
});
});

66
src/handler/kinokiste.ts Normal file
View file

@ -0,0 +1,66 @@
import * as cheerio from 'cheerio';
import slugify from 'slugify';
import { ImdbId, cachedFetchText, fulfillAllPromises, parseImdbId, parsePackedEmbed } from '../utils';
import { Handler } from './types';
const fetchSeriesPageUrl = async (imdbId: ImdbId): Promise<string | undefined> => {
const html = await cachedFetchText(`https://kinokiste.live/serien/?do=search&subaction=search&story=${imdbId.id}`);
const $ = cheerio.load(html);
return $('.item-video a[href]:first')
.map((_i, el) => $(el).attr('href'))
.get(0);
};
const fetchStreamData = async (imdbId: ImdbId, seriesPageUrl: string): Promise<{ group: string; url: string }[]> => {
const html = await cachedFetchText(seriesPageUrl);
const $ = cheerio.load(html);
return $(`[data-num="${imdbId.series}x${imdbId.episode}"]`).map((_i, urlWrapperElement) => {
return $(urlWrapperElement).siblings('.mirrors').children('[data-link]')
.map((_i, urlElement) => ({
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
group: slugify($(urlElement).attr('data-m')!),
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
url: $(urlElement).attr('data-link')!
.replace(/^(https:)?\/\//, 'https://')
.replace('/e/', '/')
.replace('/embed-', '/'),
}))
.toArray()
.filter(({ url }) => url.match(/dropload|supervideo/));
}).toArray();
};
export const handleKinoKiste: Handler = async ({ type, id }) => {
if (type !== 'series' || !id.startsWith('tt')) {
return Promise.resolve([]);
}
const imdbId = parseImdbId(id);
const seriesPageUrl = await fetchSeriesPageUrl(imdbId);
if (!seriesPageUrl) {
return Promise.resolve([]);
}
const streamsPromises = (await fetchStreamData(imdbId, seriesPageUrl))
.map(async ({ group, url }) => {
const { url: finalUrl, resolution, size } = await parsePackedEmbed(url);
return {
url: finalUrl,
name: `WebStreamr DE | ${resolution}`,
title: `KinoKiste - ${group} | 💾 ${size} | 🇩🇪`,
behaviorHints: {
group: `webstreamr-kinokiste-${group}`,
},
resolution,
size,
};
});
return fulfillAllPromises(streamsPromises);
};

View file

@ -0,0 +1,57 @@
import fs from 'node:fs';
import slugify from 'slugify';
import { cachedFetchText } from '../utils';
import { handleMeineCloud } from './meinecloud';
jest.mock('./../utils/fetch', () => ({
cachedFetchText: jest.fn(),
}));
(cachedFetchText as jest.Mock).mockImplementation(
(url: string) => fs.readFileSync(`${__dirname}/fixtures/meinecloud/${slugify(url)}`).toString(),
);
describe('MeineCloud', () => {
test('does not handle series', async () => {
const streams = await handleMeineCloud({ type: 'series', id: 'tt2085059:2:4' });
expect(streams).toHaveLength(0);
});
test('does not handle non imdb movies', async () => {
const streams = await handleMeineCloud({ type: 'movie', id: 'kitsu:123' });
expect(streams).toHaveLength(0);
});
test('handles non-existent movies gracefully', async () => {
const streams = await handleMeineCloud({ type: 'movie', id: 'tt12345678' });
expect(streams).toHaveLength(0);
});
test('handle imdb the devil\'s bath', async () => {
const streams = await handleMeineCloud({ type: 'movie', id: 'tt29141112' });
expect(streams).toHaveLength(2);
expect(streams[0]).toStrictEqual({
behaviorHints: {
group: 'webstreamr-meinecloud-supervideo',
},
name: 'WebStreamr DE | 720p',
resolution: '720p',
size: '1.0 GB',
title: 'MeineCloud - supervideo | 💾 1.0 GB | 🇩🇪',
url: expect.stringMatching(/^https:\/\/.*?.m3u8/),
});
expect(streams[1]).toStrictEqual({
behaviorHints: {
group: 'webstreamr-meinecloud-dropload',
},
name: 'WebStreamr DE | 1080p',
resolution: '1080p',
size: '1.3 GB',
title: 'MeineCloud - dropload | 💾 1.3 GB | 🇩🇪',
url: expect.stringMatching(/^https:\/\/.*?.m3u8/),
});
});
});

42
src/handler/meinecloud.ts Normal file
View file

@ -0,0 +1,42 @@
import * as cheerio from 'cheerio';
import slugify from 'slugify';
import { Handler } from './types';
import { cachedFetchText, fulfillAllPromises, parseImdbId, parsePackedEmbed } from '../utils';
export const handleMeineCloud: Handler = async ({ type, id }) => {
if (type !== 'movie' || !id.startsWith('tt')) {
return Promise.resolve([]);
}
const imdbId = parseImdbId(id);
const html = await cachedFetchText(`https://meinecloud.click/movie/${imdbId.id}`);
const $ = cheerio.load(html);
const streamsPromises = $('[data-link!=""]')
.map((_i, el) => ({
group: slugify($(el).text()),
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
url: $(el).attr('data-link')!
.replace(/^(https:)?\/\//, 'https://')
.replace('/e/', '/')
.replace('/embed-', '/'),
}))
.toArray()
.filter(({ url }) => url.match(/dropload|supervideo/))
.map(async ({ group, url }) => {
const { url: finalUrl, resolution, size } = await parsePackedEmbed(url);
return {
url: finalUrl,
name: `WebStreamr DE | ${resolution}`,
title: `MeineCloud - ${group} | 💾 ${size} | 🇩🇪`,
behaviorHints: {
group: `webstreamr-meinecloud-${group}`,
},
resolution,
size,
};
});
return fulfillAllPromises(streamsPromises);
};

5
src/handler/types.ts Normal file
View file

@ -0,0 +1,5 @@
import { ContentType, Stream } from 'stremio-addon-sdk';
export type HandlerStream = Stream & { resolution: string; size: string };
export type Handler = (args: { type: ContentType; id: string }) => Promise<(HandlerStream)[]>;

5
src/server.ts Executable file
View file

@ -0,0 +1,5 @@
#!/usr/bin/env node
import { serveHTTP } from 'stremio-addon-sdk';
import addonInterface from './addon';
serveHTTP(addonInterface, { port: parseInt(process.env['PORT'] || '51546'), cacheMaxAge: 3600 });

54
src/utils/embed.test.ts Normal file
View file

@ -0,0 +1,54 @@
import { unpack } from 'unpacker';
import { cachedFetchText } from './fetch';
import { parsePackedEmbed } from './embed';
jest.mock('unpacker', () => ({
unpack: jest.fn(),
}));
jest.mock('./fetch', () => ({
cachedFetchText: jest.fn(),
}));
describe('unpackEmbedUrl', () => {
test('throw if no embed was found', async () => {
(cachedFetchText as jest.Mock).mockReturnValue(
Promise.resolve('<html></html>'),
);
await expect(parsePackedEmbed('https://some-url.test')).rejects.toThrow('No p.a.c.k.e.d string found on https://some-url.test');
});
test('throw if no link was found', async () => {
(unpack as jest.Mock).mockReturnValue('some-unexpected-data');
(cachedFetchText as jest.Mock).mockReturnValue(
Promise.resolve('<html><script>(eval(function(p,a,c,k,e,d){...}))</script></html>'),
);
await expect(parsePackedEmbed('https://some-url.test')).rejects.toThrow('Could not find a stream link on https://some-url.test');
});
test('finds link with resolution and size', async () => {
(unpack as jest.Mock).mockReturnValue('{sources:[{file:"https://streaming-url.mp4"}');
(cachedFetchText as jest.Mock).mockReturnValue(
Promise.resolve('<html><body>Something to stream;1280x720, 834.6 MB<script>(eval(function(p,a,c,k,e,d){...}))</script></body></html>'),
);
const { url, resolution, size } = await parsePackedEmbed('https://some-url.test');
expect(url).toBe('https://streaming-url.mp4');
expect(resolution).toBe('720p');
expect(size).toBe('834.6 MB');
});
test('resolution and size return "?" if not found', async () => {
(unpack as jest.Mock).mockReturnValue('{sources:[{file:"https://streaming-url.mp4"}');
(cachedFetchText as jest.Mock).mockReturnValue(
Promise.resolve('<html><body>Something to stream<script>(eval(function(p,a,c,k,e,d){...}))</script></body></html>'),
);
const { url, resolution, size } = await parsePackedEmbed('https://some-url.test');
expect(url).toBe('https://streaming-url.mp4');
expect(resolution).toBe('?');
expect(size).toBe('?');
});
});

48
src/utils/embed.ts Normal file
View file

@ -0,0 +1,48 @@
import { unpack } from 'unpacker';
import { cachedFetchText } from './fetch';
const LINK_REGEXPS = [
/sources:\[{file:"(.*?)"/, // dropload, supervideo
];
interface ParsePackedEmbedResult {
url: string;
resolution: string;
size: string;
}
const findResolution = (html: string): string => {
const match = html.match(/\d{3,}x(\d{3,}),/);
return match && match[1] ? `${match[1]}p` : '?';
};
const findSize = (html: string): string => {
const sizeMatch = html.match(/([\d.]+) ?([GM]B)/);
return sizeMatch && sizeMatch[1] && sizeMatch[2] ? `${sizeMatch[1]} ${sizeMatch[2]}` : '?';
};
export const parsePackedEmbed = async (url: string): Promise<ParsePackedEmbedResult> => {
const html = await cachedFetchText(url);
const evalMatch = html.match(/eval\(function\(p,a,c,k,e,d\).*\)\)/);
if (!evalMatch) {
throw new Error(`No p.a.c.k.e.d string found on ${url}`);
}
const unpacked = unpack(evalMatch[0]);
for (const linkRegexp of LINK_REGEXPS) {
const linkMatch = unpacked.match(linkRegexp);
if (linkMatch && linkMatch[1]) {
return {
url: 'https://' + linkMatch[1].replace(/^(https:)?\/\//, ''),
resolution: findResolution(html),
size: findSize(html),
};
}
}
throw new Error(`Could not find a stream link on ${url}`);
};

31
src/utils/fetch.test.ts Normal file
View file

@ -0,0 +1,31 @@
import { cachedFetchText } from './fetch';
global.console = {
...console,
error: jest.fn(),
info: jest.fn(),
};
const mockedFetch = jest.fn();
jest.mock('make-fetch-happen', () => ({
__esModule: true,
default: {
defaults: () => mockedFetch,
},
}));
describe('fetch', () => {
test('cachedFetchText throws if the response is not OK', async () => {
mockedFetch.mockResolvedValue({ ok: false, status: 500, statusText: 'some error happened' });
await expect(cachedFetchText('https://some-url.test')).rejects.toThrow(new Error('HTTP error: 500 - some error happened'));
});
test('cachedFetchText passes response through if it is OK', async () => {
mockedFetch.mockResolvedValue({ ok: true, text: () => Promise.resolve('some text') });
const responseText = await cachedFetchText('https://some-url.test');
expect(responseText).toBe('some text');
});
});

37
src/utils/fetch.ts Normal file
View file

@ -0,0 +1,37 @@
import makeFetchHappen from 'make-fetch-happen';
import { FetchInterface, FetchOptions } from 'make-fetch-happen';
import fs from 'node:fs';
import * as os from 'node:os';
import { Response } from 'node-fetch';
import { logInfo } from './log';
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
class MakeFetchHappenSingleton {
private static instance: FetchInterface;
public static getInstance(): FetchInterface {
if (!MakeFetchHappenSingleton.instance) {
MakeFetchHappenSingleton.instance = makeFetchHappen.defaults({
cachePath: `${fs.realpathSync(os.tmpdir())}/webstreamr`,
});
}
return MakeFetchHappenSingleton.instance;
}
}
const cachedFetch = async (uriOrRequest: string | Request, opts?: FetchOptions): Promise<Response> => {
logInfo(`Fetch ${uriOrRequest}`);
const fetch = MakeFetchHappenSingleton.getInstance();
return await fetch(uriOrRequest, opts);
};
export const cachedFetchText = async (uriOrRequest: string | Request, opts?: FetchOptions): Promise<string> => {
const response = await cachedFetch(uriOrRequest, opts);
if (!response.ok) {
throw new Error(`HTTP error: ${response.status} - ${response.statusText}`);
}
return await response.text();
};

39
src/utils/imdb.test.ts Normal file
View file

@ -0,0 +1,39 @@
import { parseImdbId } from './imdb';
describe('imdb id parsing', () => {
test('splits id properly', () => {
const { id, series, episode } = parseImdbId('tt2085059:2:4');
expect(id).toBe('tt2085059');
expect(series).toBe(2);
expect(episode).toBe(4);
});
test('handles weird 0 prefixes in series and episode', () => {
const { id, series, episode } = parseImdbId('tt2085059:02:04');
expect(id).toBe('tt2085059');
expect(series).toBe(2);
expect(episode).toBe(4);
});
test('supports movie with missing series and episode', () => {
const { id, series, episode } = parseImdbId('tt2085059');
expect(id).toBe('tt2085059');
expect(series).toBeUndefined();
expect(episode).toBeUndefined();
});
test('throws for empty ids', () => {
expect(() => {
parseImdbId('');
}).toThrow('IMDb ID "" is invalid');
});
test('throws for invalid ids', () => {
expect(() => {
parseImdbId('foo');
}).toThrow('IMDb ID "foo" is invalid');
});
});

15
src/utils/imdb.ts Normal file
View file

@ -0,0 +1,15 @@
export interface ImdbId { id: string; series: number | undefined; episode: number | undefined }
export const parseImdbId = (id: string): ImdbId => {
const idParts = id.split(':');
if (!idParts[0] || !idParts[0].startsWith('tt')) {
throw new Error(`IMDb ID "${id}" is invalid`);
}
return {
id: idParts[0],
series: idParts[1] ? parseInt(idParts[1]) : undefined,
episode: idParts[2] ? parseInt(idParts[2]) : undefined,
};
};

5
src/utils/index.ts Normal file
View file

@ -0,0 +1,5 @@
export * from './embed';
export * from './fetch';
export * from './imdb';
export * from './log';
export * from './promise';

21
src/utils/log.test.ts Normal file
View file

@ -0,0 +1,21 @@
import { logError, logInfo } from './log';
describe('log', () => {
test('logError logs via console.error', () => {
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => undefined);
logError('some error occurred');
expect(consoleErrorSpy).toHaveBeenCalled();
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('some error occurred'));
});
test('logInfo logs via console.info', () => {
const consoleInfoSpy = jest.spyOn(console, 'info').mockImplementation(() => undefined);
logInfo('something happened');
expect(consoleInfoSpy).toHaveBeenCalled();
expect(consoleInfoSpy).toHaveBeenCalledWith(expect.stringContaining('something happened'));
});
});

7
src/utils/log.ts Normal file
View file

@ -0,0 +1,7 @@
export const logError = (message: string) => {
console.error(`${new Date().toISOString()}, Error: ${message}`);
};
export const logInfo = (message: string) => {
console.info(`${new Date().toISOString()}, Info: ${message}`);
};

16
src/utils/promise.test.ts Normal file
View file

@ -0,0 +1,16 @@
import { fulfillAllPromises } from './promise';
describe('promise', () => {
test('fulfillAllPromises returns all resolved promise values and logs rejected ones', async () => {
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => undefined);
const results = await fulfillAllPromises([
Promise.resolve('ok'),
Promise.reject('not ok'),
]);
expect(results).toStrictEqual(['ok']);
expect(consoleErrorSpy).toHaveBeenCalled();
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Could not fulfill promise: not ok'));
});
});

16
src/utils/promise.ts Normal file
View file

@ -0,0 +1,16 @@
import { logError } from './log';
export const fulfillAllPromises = async <T>(promises: Promise<T>[]) => {
const resultValues: T[] = [];
(await Promise.allSettled(promises)).forEach((result) => {
if (result.status === 'fulfilled') {
resultValues.push(result.value);
return;
}
logError(`Could not fulfill promise: ${result.reason}`);
});
return resultValues;
};

32
tsconfig.json Normal file
View file

@ -0,0 +1,32 @@
{
"compilerOptions": {
"allowUnreachableCode": true,
"allowUnusedLabels": true,
"alwaysStrict": true,
"esModuleInterop": true,
"exactOptionalPropertyTypes": true,
"forceConsistentCasingInFileNames": true,
"module": "commonjs",
"noFallthroughCasesInSwitch": true,
"noImplicitAny": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noPropertyAccessFromIndexSignature": true,
"noUncheckedIndexedAccess": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"outDir": "./dist",
"skipLibCheck": true,
"strict": true,
"strictBindCallApply": true,
"strictBuiltinIteratorReturn": true,
"strictFunctionTypes": true,
"strictNullChecks": true,
"strictPropertyInitialization": true,
"target": "es6",
"useUnknownInCatchVariables": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "**/*.test.ts"]
}