diff --git a/package-lock.json b/package-lock.json index cbe54bc..87845d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,19 +11,23 @@ "dependencies": { "@keyv/sqlite": "^4.0.5", "async-mutex": "^0.5.0", + "axios": "^1.13.2", + "axios-cache-interceptor": "^1.8.3", + "axios-mock-adapter": "^2.1.0", + "axios-retry": "^4.5.0", "bytes": "^3.1.2", "cacheable": "^2.0.0", "cheerio": "^1.0.0", "express": "^5.1.0", "fast-levenshtein": "^3.0.0", - "fetch-socks": "^1.3.2", - "http-cache-semantics": "^4.2.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", "minimatch": "^10.0.3", "randomstring": "^1.3.1", "rot13-cipher": "^1.0.0", "slugify": "^1.6.6", + "socks-proxy-agent": "^8.0.5", "tough-cookie": "^6.0.0", - "undici": "^7.10.0", "unpacker": "^1.0.1", "winston": "^3.17.0" }, @@ -34,9 +38,7 @@ "@types/bytes": "^3.1.5", "@types/express": "^5.0.1", "@types/fast-levenshtein": "^0.0.4", - "@types/http-cache-semantics": "^4.0.4", "@types/jest": "^30.0.0", - "@types/make-fetch-happen": "^10.0.4", "@types/node": "^24.0.0", "@types/randomstring": "^1.3.0", "@types/stremio-addon-sdk": "^1.6.11", @@ -85,7 +87,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1704,13 +1705,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/http-errors": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", @@ -1770,18 +1764,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/make-fetch-happen": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/@types/make-fetch-happen/-/make-fetch-happen-10.0.4.tgz", - "integrity": "sha512-jKzweQaEMMAi55ehvR1z0JF6aSVQm/h1BXBhPLOJriaeQBctjw5YbpIGs7zAx9dN0Sa2OO5bcXwCkrlgenoPEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-fetch": "*", - "@types/retry": "*", - "@types/ssri": "*" - } - }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -1795,22 +1777,10 @@ "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" - } - }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -1832,13 +1802,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/retry": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.5.tgz", - "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/send": { "version": "0.17.6", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", @@ -1862,16 +1825,6 @@ "@types/send": "<1" } }, - "node_modules/@types/ssri": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/ssri/-/ssri-7.1.5.tgz", - "integrity": "sha512-odD/56S3B51liILSk5aXJlnYt99S6Rt9EFDDqGtJM26rKHApHcwyU/UoYHrzKkdkHMAIquGWCuHtQTbes+FRQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -1955,7 +1908,6 @@ "integrity": "sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.48.0", "@typescript-eslint/types": "8.48.0", @@ -2482,7 +2434,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2514,16 +2465,12 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "license": "MIT", - "optional": true, - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/agentkeepalive": { @@ -2832,7 +2779,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, "license": "MIT" }, "node_modules/available-typed-arrays": { @@ -2851,6 +2797,62 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-cache-interceptor": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/axios-cache-interceptor/-/axios-cache-interceptor-1.8.3.tgz", + "integrity": "sha512-ifuSBoCEkVaiugg1UTjVuTdK+SjSOJ35pdv2OrzhRT3wDMr52QiayQxUqs7jd7GDsfPOjMcw3T3ek0TysbyZZw==", + "license": "MIT", + "dependencies": { + "cache-parser": "1.2.5", + "fast-defer": "1.1.8", + "object-code": "1.3.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/arthurfiorette/axios-cache-interceptor?sponsor=1" + }, + "peerDependencies": { + "axios": "^1" + } + }, + "node_modules/axios-mock-adapter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-2.1.0.tgz", + "integrity": "sha512-AZUe4OjECGCNNssH8SOdtneiQELsqTsat3SQQCWLPjN436/H+L9AjWfV7bF+Zg/YL9cgbhrz5671hoh+Tbn98w==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "is-buffer": "^2.0.5" + }, + "peerDependencies": { + "axios": ">= 0.17.0" + } + }, + "node_modules/axios-retry": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz", + "integrity": "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==", + "license": "Apache-2.0", + "dependencies": { + "is-retry-allowed": "^2.2.0" + }, + "peerDependencies": { + "axios": "0.x || 1.x" + } + }, "node_modules/babel-jest": { "version": "30.2.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", @@ -3110,7 +3112,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -3286,6 +3287,12 @@ "license": "ISC", "optional": true }, + "node_modules/cache-parser": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/cache-parser/-/cache-parser-1.2.5.tgz", + "integrity": "sha512-Md/4VhAHByQ9frQ15WD6LrMNiVw9AEl/J7vWIXw+sxT6fSOpbtt6LHTp76vy8+bOESPBO94117Hm2bIjlI7XjA==", + "license": "MIT" + }, "node_modules/cacheable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.0.tgz", @@ -3722,7 +3729,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -4009,7 +4015,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -4371,7 +4376,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4449,7 +4453,6 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -4904,7 +4907,12 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, + "license": "MIT" + }, + "node_modules/fast-defer": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/fast-defer/-/fast-defer-1.1.8.tgz", + "integrity": "sha512-lEJeOH5VL5R09j6AA0D4Uvq7AgsHw0dAImQQ+F3iSyHZuAxyQfWobsagGpTcOPvJr3urmKRHrs+Gs9hV+/Qm/Q==", "license": "MIT" }, "node_modules/fast-json-stable-stringify": { @@ -4966,16 +4974,6 @@ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", "license": "MIT" }, - "node_modules/fetch-socks": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fetch-socks/-/fetch-socks-1.3.2.tgz", - "integrity": "sha512-vkH5+Zgj2yEbU57Cei0iyLgTZ4OkEKJj56Xu3ViB5dpsl599JgEooQ3x6NVagIFRHWnWJ+7K0MO0aIV1TMgvnw==", - "license": "MIT", - "dependencies": { - "socks": "^2.8.2", - "undici": ">=6" - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -5076,6 +5074,26 @@ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", "license": "MIT" }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -5113,7 +5131,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -5130,7 +5147,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -5140,7 +5156,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -5658,7 +5673,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -5749,7 +5763,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true }, "node_modules/http-errors": { "version": "2.0.1", @@ -5772,32 +5787,29 @@ } }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "license": "MIT", - "optional": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", - "optional": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -6091,6 +6103,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -6319,6 +6354,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", @@ -6577,7 +6624,6 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -7245,7 +7291,6 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", "license": "MIT", - "peer": true, "dependencies": { "@keyv/serialize": "^1.1.1" } @@ -7405,6 +7450,48 @@ "node": ">= 10" } }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7441,6 +7528,21 @@ "node": ">= 0.6" } }, + "node_modules/make-fetch-happen/node_modules/socks-proxy-agent": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", + "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/make-fetch-happen/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -8136,6 +8238,12 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/object-code": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/object-code/-/object-code-1.3.3.tgz", + "integrity": "sha512-/Ds4Xd5xzrtUOJ+xJQ57iAy0BZsZltOHssnDgcZ8DOhgh41q1YJCnTPnWdWSLkNGNnxYzhYChjc5dgC9mEERCA==", + "license": "MIT" + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -8711,6 +8819,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -9524,18 +9638,17 @@ } }, "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "license": "MIT", - "optional": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": ">= 10" + "node": ">= 14" } }, "node_modules/source-map": { @@ -10277,7 +10390,6 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -10504,7 +10616,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/package.json b/package.json index c2f2f6c..90d539c 100644 --- a/package.json +++ b/package.json @@ -43,19 +43,23 @@ "dependencies": { "@keyv/sqlite": "^4.0.5", "async-mutex": "^0.5.0", + "axios": "^1.13.2", + "axios-cache-interceptor": "^1.8.3", + "axios-mock-adapter": "^2.1.0", + "axios-retry": "^4.5.0", "bytes": "^3.1.2", "cacheable": "^2.0.0", "cheerio": "^1.0.0", "express": "^5.1.0", "fast-levenshtein": "^3.0.0", - "fetch-socks": "^1.3.2", - "http-cache-semantics": "^4.2.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", "minimatch": "^10.0.3", "randomstring": "^1.3.1", "rot13-cipher": "^1.0.0", "slugify": "^1.6.6", + "socks-proxy-agent": "^8.0.5", "tough-cookie": "^6.0.0", - "undici": "^7.10.0", "unpacker": "^1.0.1", "winston": "^3.17.0" }, @@ -66,9 +70,7 @@ "@types/bytes": "^3.1.5", "@types/express": "^5.0.1", "@types/fast-levenshtein": "^0.0.4", - "@types/http-cache-semantics": "^4.0.4", "@types/jest": "^30.0.0", - "@types/make-fetch-happen": "^10.0.4", "@types/node": "^24.0.0", "@types/randomstring": "^1.3.0", "@types/stremio-addon-sdk": "^1.6.11", diff --git a/src/error/BlockedError.ts b/src/error/BlockedError.ts index 838198a..9207462 100644 --- a/src/error/BlockedError.ts +++ b/src/error/BlockedError.ts @@ -1,11 +1,12 @@ +import { AxiosResponse } from 'axios'; import { BlockedReason } from '../types'; export class BlockedError extends Error { public readonly url: URL; public readonly reason: BlockedReason; - public readonly headers: Record; + public readonly headers: AxiosResponse['headers']; - public constructor(url: URL, reason: BlockedReason, headers: Record) { + public constructor(url: URL, reason: BlockedReason, headers: AxiosResponse['headers']) { super(); this.url = url; diff --git a/src/error/HttpError.ts b/src/error/HttpError.ts index 8221f44..a6f5add 100644 --- a/src/error/HttpError.ts +++ b/src/error/HttpError.ts @@ -1,10 +1,12 @@ +import { AxiosResponse } from 'axios'; + export class HttpError extends Error { public readonly url: URL; public readonly status: number; public readonly statusText: string; - public readonly headers: Record; + public readonly headers: AxiosResponse['headers']; - public constructor(url: URL, status: number, statusText: string, headers: Record) { + public constructor(url: URL, status: number, statusText: string, headers: AxiosResponse['headers']) { super(); this.url = url; diff --git a/src/extractor/VixSrc.ts b/src/extractor/VixSrc.ts index 264c9ae..cef5ee3 100644 --- a/src/extractor/VixSrc.ts +++ b/src/extractor/VixSrc.ts @@ -1,6 +1,6 @@ import { Context, CountryCode, Format, Meta, UrlResult } from '../types'; import { - CustomRequestInit, + CustomRequestConfig, guessHeightFromPlaylist, hasMultiEnabled, iso639FromCountryCode, } from '../utils'; @@ -53,7 +53,7 @@ export class VixSrc extends Extractor { ]; }; - private async determineCountryCodesFromPlaylist(ctx: Context, playlistUrl: URL, init?: CustomRequestInit): Promise { + private async determineCountryCodesFromPlaylist(ctx: Context, playlistUrl: URL, init?: CustomRequestConfig): Promise { const playlist = await this.fetcher.text(ctx, playlistUrl, init); const countryCodes: CountryCode[] = [CountryCode.it]; diff --git a/src/index.ts b/src/index.ts index 1bd7a2b..fca5989 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,7 @@ import { randomUUID } from 'node:crypto'; +import axios from 'axios'; +import { setupCache } from 'axios-cache-interceptor'; +import axiosRetry from 'axios-retry'; import express, { NextFunction, Request, Response } from 'express'; import winston from 'winston'; import { ConfigureController, ManifestController, StreamController } from './controller'; @@ -33,7 +36,10 @@ process.on('unhandledRejection', (error: Error) => { logger.error(`Unhandled rejection: ${error}, cause: ${error.cause}, stack: ${error.stack}`); }); -const fetcher = new Fetcher(logger); +const cachedAxios = setupCache(axios); +axiosRetry(cachedAxios, { retries: 3, retryDelay: () => 333 }); + +const fetcher = new Fetcher(cachedAxios, logger); const sources = createSources(fetcher); const extractors = createExtractors(fetcher); @@ -96,7 +102,7 @@ addon.get('/live', async (req: Request, res: Response) => { const url = new URL(href); try { - await fetcher.head(ctx, url, { noCache: true }); + await fetcher.head(ctx, url); results.set(url.host, 'ok'); } catch (error) { if (error instanceof BlockedError) { diff --git a/src/source/MegaKino.ts b/src/source/MegaKino.ts index 375d97f..c32e911 100644 --- a/src/source/MegaKino.ts +++ b/src/source/MegaKino.ts @@ -14,7 +14,7 @@ export class MegaKino extends Source { public readonly countryCodes: CountryCode[] = [CountryCode.de]; - public readonly baseUrl = 'https://megakino.ms'; + public readonly baseUrl = 'https://w1.megakino.do'; // TODO: determine this more dynamically since cookie fetching does not work otherwise private readonly fetcher: Fetcher; @@ -29,10 +29,9 @@ export class MegaKino extends Source { const tokenResponse = await this.fetcher.fetch(ctx, new URL('/?yg=token', this.baseUrl), { method: 'HEAD' }); - const cookie = Cookie.parse(tokenResponse.headers['set-cookie'] as string) as Cookie; - const baseUrl = new URL('/', tokenResponse.url); + const cookie = Cookie.parse((tokenResponse.headers['set-cookie'] as string[])[0] as string) as Cookie; - const pageUrl = await this.fetchPageUrl(ctx, baseUrl, imdbId, cookie); + const pageUrl = await this.fetchPageUrl(ctx, imdbId, cookie); if (!pageUrl) { return []; } @@ -51,12 +50,14 @@ export class MegaKino extends Source { ); }; - private fetchPageUrl = async (ctx: Context, postUrl: URL, imdbId: ImdbId, cookie: Cookie): Promise => { + private fetchPageUrl = async (ctx: Context, imdbId: ImdbId, cookie: Cookie): Promise => { const form = new URLSearchParams(); form.append('do', 'search'); form.append('subaction', 'search'); form.append('story', `${imdbId.id}`); + const postUrl = new URL(this.baseUrl); + const html = await this.fetcher.textPost( ctx, postUrl, diff --git a/src/source/__fixtures__/MegaKino/head-https:megakino.msygtoken b/src/source/__fixtures__/MegaKino/head-https:megakino.msygtoken deleted file mode 100644 index 4d4e3c3..0000000 --- a/src/source/__fixtures__/MegaKino/head-https:megakino.msygtoken +++ /dev/null @@ -1 +0,0 @@ -{"alt-svc":"h3=\":443\"; ma=86400","cache-control":"no-store","cf-cache-status":"DYNAMIC","cf-ray":"99622f759bbabb4f-FRA","connection":"close","content-type":"text/html; charset=UTF-8","date":"Wed, 29 Oct 2025 11:03:16 GMT","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","referrer-policy":"strict-origin-when-cross-origin","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=65VjziHY1YIiW%2Fm4xdBGMfv%2FUVk9o3PgQshu1oR7itMDQ%2BZcb%2B6WXUMGsSOHKa1TwxdZBO2invaHs%2BayMi9WIT7cBoaZWrjpVmFqQHGQER8xlNTequSX\"}]}","server":"cloudflare","set-cookie":"yg_token=1761735796.c8a4765badd13fc70a9463002351f010b6eb19bc6b5b5a461f3ab22cc71edbaa; HttpOnly; SameSite=Lax; Secure; Path=/; Max-Age=900; Expires=Wed, 29 Oct 2025 11:18:16 GMT","x-frame-options":"SAMEORIGIN"} \ No newline at end of file diff --git a/src/source/__fixtures__/MegaKino/head-https:w1.megakino.doygtoken b/src/source/__fixtures__/MegaKino/head-https:w1.megakino.doygtoken new file mode 100644 index 0000000..3293ba9 --- /dev/null +++ b/src/source/__fixtures__/MegaKino/head-https:w1.megakino.doygtoken @@ -0,0 +1 @@ +{"date":"Fri, 28 Nov 2025 15:33:34 GMT","content-type":"text/html; charset=UTF-8","connection":"keep-alive","server":"cloudflare","cache-control":"no-store","x-frame-options":"SAMEORIGIN","referrer-policy":"strict-origin-when-cross-origin","cf-cache-status":"DYNAMIC","report-to":"{\"group\":\"cf-nel\",\"max_age\":604800,\"endpoints\":[{\"url\":\"https://a.nel.cloudflare.com/report/v4?s=Z3P3ma53jLoNL1nS2OgSVFL0Z86LI%2BVAIeczI8wymdDnpIsLm0EK3H2ieynG40Vge0HndkPIwVpumDWuiAlnbSteNvDJBiihA0%2BWqdhL\"}]}","nel":"{\"report_to\":\"cf-nel\",\"success_fraction\":0.0,\"max_age\":604800}","set-cookie":["yg_token=1764344014.6e2ad653a40ebd15f2825a18bf0674211e297fa8a0226950228753c9f95b1244; HttpOnly; SameSite=Lax; Secure; Path=/; Max-Age=900; Expires=Fri, 28 Nov 2025 15:48:34 GMT"],"cf-ray":"9a5aeca9496c9f29-FRA","alt-svc":"h3=\":443\"; ma=86400"} \ No newline at end of file diff --git a/src/source/__fixtures__/MegaKino/https:megakino.msadventure4804-the-lego-movie-2.html b/src/source/__fixtures__/MegaKino/https:w1.megakino.doadventure4804-the-lego-movie-2.html similarity index 75% rename from src/source/__fixtures__/MegaKino/https:megakino.msadventure4804-the-lego-movie-2.html rename to src/source/__fixtures__/MegaKino/https:w1.megakino.doadventure4804-the-lego-movie-2.html index 468c72f..fcdcfb5 100644 --- a/src/source/__fixtures__/MegaKino/https:megakino.msadventure4804-the-lego-movie-2.html +++ b/src/source/__fixtures__/MegaKino/https:w1.megakino.doadventure4804-the-lego-movie-2.html @@ -9,12 +9,12 @@ - - + + - - - + + + @@ -38,18 +38,16 @@ - + - - @@ -91,7 +89,7 @@
Was interessiert Sie?
@@ -100,27 +98,27 @@
Sammlung
- +
Die besten Weihnachtsfilme
- +
Batman Filme - Die Komplette Chronologie
- +
Marvel Filme - Die Komplette Chronologie
- +
Harry Potter - Die Komplette Chronologie
- +
Star Wars – Die Komplette Chronologie
- +
Fast and Furious - Die Komplette Chronologie
@@ -132,7 +130,7 @@
Genres
@@ -150,25 +148,25 @@
-
Eren
-
20.10.25
+
Madmax91
+
02.11.25
-
Ich finde es auch Mega cool auch die Grafick seh schön
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Das Ende ist offen und mehr fragen als Antworten ! Wer war es denn jetzt
+ This Is Not Hollywood - Staffel 1
-
Sung
-
19.10.25
+
Christian
+
02.11.25
-
Geistes krank war der film richtig gut bin hyped auf part 2
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Hatte mir etwas mehr versprochen aber sonst war der Film in Ordnung
+ Dracula - Die Auferstehung
-
Zebne
-
19.10.25
+
emily
+
02.11.25
-
Einfach nur ein geiler film selbst im jahr 2025
- Scream 5 +
toller und lustiger film auch die pinguine sind süß!!!
+ Mr. Poppers Pinguine
@@ -182,14 +180,14 @@
- MEGAKino Adventure The LEGO Movie 2 + MEGAKino Adventure The LEGO Movie 2
- + @@ -207,13 +205,13 @@

The LEGO Movie 2

The Lego Movie 2: The Second Part
-
Canada, Denmark, United States of America, 2019, 107 min
+
Canada, Denmark, United States of America, 2019, 107 min
Adventure / Animation / Filme
16+
6.681
-
+3446
+
+3650
Stream Anschauen
@@ -223,11 +221,11 @@
- +
The Lego Batman Movie
@@ -353,7 +351,7 @@
- +
3 Engel für Charlie
@@ -366,7 +364,7 @@
- +
Wir sind die Neuen
@@ -379,7 +377,7 @@
- +
Batman v Superman: Dawn of Justice
@@ -435,7 +433,7 @@
- +
Es gibt noch keine Kommentare. Willst du der Erste sein?
@@ -446,12 +444,12 @@
- + - + @@ -570,7 +568,7 @@ X - + - - @@ -91,7 +89,7 @@ @@ -100,27 +98,27 @@
Sammlung
- +
Die besten Weihnachtsfilme
- +
Batman Filme - Die Komplette Chronologie
- +
Marvel Filme - Die Komplette Chronologie
- +
Harry Potter - Die Komplette Chronologie
- +
Star Wars – Die Komplette Chronologie
- +
Fast and Furious - Die Komplette Chronologie
@@ -132,7 +130,7 @@
Genres
@@ -150,25 +148,25 @@
-
Eren
-
20.10.25
+
Madmax91
+
02.11.25
-
Ich finde es auch Mega cool auch die Grafick seh schön
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Das Ende ist offen und mehr fragen als Antworten ! Wer war es denn jetzt
+ This Is Not Hollywood - Staffel 1
-
Sung
-
19.10.25
+
Christian
+
02.11.25
-
Geistes krank war der film richtig gut bin hyped auf part 2
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Hatte mir etwas mehr versprochen aber sonst war der Film in Ordnung
+ Dracula - Die Auferstehung
-
Zebne
-
19.10.25
+
emily
+
02.11.25
-
Einfach nur ein geiler film selbst im jahr 2025
- Scream 5 +
toller und lustiger film auch die pinguine sind süß!!!
+ Mr. Poppers Pinguine
@@ -182,14 +180,14 @@
- MEGAKino Filme Baymax - Riesiges Robowabohu + MEGAKino Filme Baymax - Riesiges Robowabohu
- + @@ -207,13 +205,13 @@

Baymax - Riesiges Robowabohu

Big Hero 6
-
United States of America, 2014, 102 min
+
United States of America, 2014, 102 min
Filme / Animation / Action / Adventure / Comedy / Family
16+
7,8
-
+182248
+
+184252
Stream Anschauen
@@ -223,11 +221,11 @@
- +
Die Maske 2 - Die nächste Generation
@@ -357,7 +355,7 @@
- +
Harry Potter und die Heiligtümer des Todes - Teil 1
@@ -370,7 +368,7 @@
- +
Ramstein - Das durchstoßene Herz
@@ -383,7 +381,7 @@
- +
Drachenzähmen leicht gemacht
@@ -439,7 +437,7 @@
- +
Es gibt noch keine Kommentare. Willst du der Erste sein?
@@ -450,12 +448,12 @@
- + - + @@ -574,7 +572,7 @@ X - + - - @@ -91,7 +89,7 @@ @@ -100,27 +98,27 @@
Sammlung
- +
Die besten Weihnachtsfilme
- +
Batman Filme - Die Komplette Chronologie
- +
Marvel Filme - Die Komplette Chronologie
- +
Harry Potter - Die Komplette Chronologie
- +
Star Wars – Die Komplette Chronologie
- +
Fast and Furious - Die Komplette Chronologie
@@ -132,7 +130,7 @@
Genres
@@ -150,25 +148,25 @@
-
Eren
-
20.10.25
+
Madmax91
+
02.11.25
-
Ich finde es auch Mega cool auch die Grafick seh schön
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Das Ende ist offen und mehr fragen als Antworten ! Wer war es denn jetzt
+ This Is Not Hollywood - Staffel 1
-
Sung
-
19.10.25
+
Christian
+
02.11.25
-
Geistes krank war der film richtig gut bin hyped auf part 2
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Hatte mir etwas mehr versprochen aber sonst war der Film in Ordnung
+ Dracula - Die Auferstehung
-
Zebne
-
19.10.25
+
emily
+
02.11.25
-
Einfach nur ein geiler film selbst im jahr 2025
- Scream 5 +
toller und lustiger film auch die pinguine sind süß!!!
+ Mr. Poppers Pinguine
@@ -182,14 +180,14 @@
- MEGAKino Filme The Lego Movie + MEGAKino Filme The Lego Movie
- + @@ -207,13 +205,13 @@

The Lego Movie

The Lego Movie
-
Denmark, United States of America, 2014, 100 min
+
Denmark, United States of America, 2014, 100 min
Filme / Animation / Adventure / Comedy / Family / Fantasy
16+
7.4
-
+101151
+
+108158
Stream Anschauen
@@ -223,11 +221,11 @@
- +
Batman v Superman: Dawn of Justice
@@ -357,7 +355,7 @@
- +
Drachenzähmen leicht gemacht
@@ -370,7 +368,7 @@
- +
Die Tribute von Panem 3 - Mockingjay Teil 1
@@ -383,7 +381,7 @@
- +
Ramstein - Das durchstoßene Herz
@@ -439,7 +437,7 @@
- +
Es gibt noch keine Kommentare. Willst du der Erste sein?
@@ -450,12 +448,12 @@
- + - + @@ -574,7 +572,7 @@ X - + - - @@ -84,7 +82,7 @@ @@ -93,27 +91,27 @@
Sammlung
- +
Die besten Weihnachtsfilme
- +
Batman Filme - Die Komplette Chronologie
- +
Marvel Filme - Die Komplette Chronologie
- +
Harry Potter - Die Komplette Chronologie
- +
Star Wars – Die Komplette Chronologie
- +
Fast and Furious - Die Komplette Chronologie
@@ -125,7 +123,7 @@
Genres
@@ -143,25 +141,25 @@
-
Eren
-
20.10.25
+
Madmax91
+
02.11.25
-
Ich finde es auch Mega cool auch die Grafick seh schön
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Das Ende ist offen und mehr fragen als Antworten ! Wer war es denn jetzt
+ This Is Not Hollywood - Staffel 1
-
Sung
-
19.10.25
+
Christian
+
02.11.25
-
Geistes krank war der film richtig gut bin hyped auf part 2
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Hatte mir etwas mehr versprochen aber sonst war der Film in Ordnung
+ Dracula - Die Auferstehung
-
Zebne
-
19.10.25
+
emily
+
02.11.25
-
Einfach nur ein geiler film selbst im jahr 2025
- Scream 5 +
toller und lustiger film auch die pinguine sind süß!!!
+ Mr. Poppers Pinguine
@@ -180,7 +178,7 @@ -
+
@@ -313,7 +311,7 @@ X - + - - @@ -84,7 +82,7 @@
Was interessiert Sie?
@@ -93,27 +91,27 @@
Sammlung
- +
Die besten Weihnachtsfilme
- +
Batman Filme - Die Komplette Chronologie
- +
Marvel Filme - Die Komplette Chronologie
- +
Harry Potter - Die Komplette Chronologie
- +
Star Wars – Die Komplette Chronologie
- +
Fast and Furious - Die Komplette Chronologie
@@ -125,7 +123,7 @@
Genres
@@ -143,25 +141,25 @@
-
Eren
-
20.10.25
+
Madmax91
+
02.11.25
-
Ich finde es auch Mega cool auch die Grafick seh schön
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Das Ende ist offen und mehr fragen als Antworten ! Wer war es denn jetzt
+ This Is Not Hollywood - Staffel 1
-
Sung
-
19.10.25
+
Christian
+
02.11.25
-
Geistes krank war der film richtig gut bin hyped auf part 2
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Hatte mir etwas mehr versprochen aber sonst war der Film in Ordnung
+ Dracula - Die Auferstehung
-
Zebne
-
19.10.25
+
emily
+
02.11.25
-
Einfach nur ein geiler film selbst im jahr 2025
- Scream 5 +
toller und lustiger film auch die pinguine sind süß!!!
+ Mr. Poppers Pinguine
@@ -177,7 +175,7 @@ -
+
@@ -239,7 +237,7 @@ function full_submit(prm){ - +
The Lego Movie
HD
@@ -332,7 +330,7 @@ X - + - - @@ -84,7 +82,7 @@
@@ -93,27 +91,27 @@
Sammlung
- +
Die besten Weihnachtsfilme
- +
Batman Filme - Die Komplette Chronologie
- +
Marvel Filme - Die Komplette Chronologie
- +
Harry Potter - Die Komplette Chronologie
- +
Star Wars – Die Komplette Chronologie
- +
Fast and Furious - Die Komplette Chronologie
@@ -125,7 +123,7 @@
Genres
@@ -143,25 +141,25 @@
-
Eren
-
20.10.25
+
Madmax91
+
02.11.25
-
Ich finde es auch Mega cool auch die Grafick seh schön
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Das Ende ist offen und mehr fragen als Antworten ! Wer war es denn jetzt
+ This Is Not Hollywood - Staffel 1
-
Sung
-
19.10.25
+
Christian
+
02.11.25
-
Geistes krank war der film richtig gut bin hyped auf part 2
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Hatte mir etwas mehr versprochen aber sonst war der Film in Ordnung
+ Dracula - Die Auferstehung
-
Zebne
-
19.10.25
+
emily
+
02.11.25
-
Einfach nur ein geiler film selbst im jahr 2025
- Scream 5 +
toller und lustiger film auch die pinguine sind süß!!!
+ Mr. Poppers Pinguine
@@ -177,7 +175,7 @@ -
+
@@ -239,7 +237,7 @@ function full_submit(prm){ - +
Baymax - Riesiges Robowabohu
HD
@@ -332,7 +330,7 @@ X - + - - @@ -84,7 +82,7 @@
@@ -93,27 +91,27 @@
Sammlung
- +
Die besten Weihnachtsfilme
- +
Batman Filme - Die Komplette Chronologie
- +
Marvel Filme - Die Komplette Chronologie
- +
Harry Potter - Die Komplette Chronologie
- +
Star Wars – Die Komplette Chronologie
- +
Fast and Furious - Die Komplette Chronologie
@@ -125,7 +123,7 @@
Genres
@@ -143,25 +141,25 @@
-
Eren
-
20.10.25
+
Madmax91
+
02.11.25
-
Ich finde es auch Mega cool auch die Grafick seh schön
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Das Ende ist offen und mehr fragen als Antworten ! Wer war es denn jetzt
+ This Is Not Hollywood - Staffel 1
-
Sung
-
19.10.25
+
Christian
+
02.11.25
-
Geistes krank war der film richtig gut bin hyped auf part 2
- Demon Slayer: Kimetsu no Yaiba Infinity Castle - Teil 1 +
Hatte mir etwas mehr versprochen aber sonst war der Film in Ordnung
+ Dracula - Die Auferstehung
-
Zebne
-
19.10.25
+
emily
+
02.11.25
-
Einfach nur ein geiler film selbst im jahr 2025
- Scream 5 +
toller und lustiger film auch die pinguine sind süß!!!
+ Mr. Poppers Pinguine
@@ -177,7 +175,7 @@ -
+
@@ -239,7 +237,7 @@ function full_submit(prm){ - +
The LEGO Movie 2
HD
@@ -332,7 +330,7 @@ X