diff --git a/package-lock.json b/package-lock.json index b39220eac..59c594c47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,11 +35,10 @@ "@types/lodash.uniqby": "^4.7.9", "@types/node": "^25.5.2", "@types/node-cleanup": "^2.1.5", - "@types/numeral": "^2.0.5", "@types/pako": "^2.0.4", "@typescript-eslint/eslint-plugin": "^8.58.1", "@typescript-eslint/parser": "^8.58.1", - "axios": "^1.14.0", + "axios": "^1.15.0", "axios-cookiejar-support": "^6.0.5", "chalk": "^5.6.2", "cheerio": "^1.2.0", @@ -71,14 +70,9 @@ "lodash.sortby": "^4.7.0", "lodash.startcase": "^4.4.0", "lodash.uniqby": "^4.7.0", - "luxon": "^3.7.2", - "mockdate": "^3.0.5", "nedb-promises": "^6.2.3", - "node-cleanup": "^2.1.2", - "numeral": "^2.0.6", "pako": "^2.1.0", "parse-duration": "^2.1.6", - "pdf-parse": "^2.4.5", "pm2": "^6.0.14", "readline": "^1.3.0", "run-script-os": "^1.1.6", @@ -2861,205 +2855,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@napi-rs/canvas": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz", - "integrity": "sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==", - "license": "MIT", - "workspaces": [ - "e2e/*" - ], - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@napi-rs/canvas-android-arm64": "0.1.80", - "@napi-rs/canvas-darwin-arm64": "0.1.80", - "@napi-rs/canvas-darwin-x64": "0.1.80", - "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.80", - "@napi-rs/canvas-linux-arm64-gnu": "0.1.80", - "@napi-rs/canvas-linux-arm64-musl": "0.1.80", - "@napi-rs/canvas-linux-riscv64-gnu": "0.1.80", - "@napi-rs/canvas-linux-x64-gnu": "0.1.80", - "@napi-rs/canvas-linux-x64-musl": "0.1.80", - "@napi-rs/canvas-win32-x64-msvc": "0.1.80" - } - }, - "node_modules/@napi-rs/canvas-android-arm64": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz", - "integrity": "sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-darwin-arm64": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz", - "integrity": "sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-darwin-x64": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz", - "integrity": "sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz", - "integrity": "sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-arm64-gnu": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz", - "integrity": "sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-arm64-musl": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz", - "integrity": "sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-riscv64-gnu": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz", - "integrity": "sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==", - "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-x64-gnu": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz", - "integrity": "sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-linux-x64-musl": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz", - "integrity": "sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/canvas-win32-x64-msvc": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz", - "integrity": "sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -4023,12 +3818,6 @@ "integrity": "sha512-+82RAk5uYiqiMoEv2fPeh03AL4pB5d3TL+Pf+hz31Mme6ECFI1kRlgmxYjdSlHzDbJ9yLorTnKi4Op5FA54kQQ==", "license": "MIT" }, - "node_modules/@types/numeral": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-2.0.5.tgz", - "integrity": "sha512-kH8I7OSSwQu9DS9JYdFWbuvhVzvFRoCPCkGxNwoGgaPeDfEPJlcxNvEOypZhQ3XXHsGbfIuYcxcJxKUfJHnRfw==", - "license": "MIT" - }, "node_modules/@types/pako": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", @@ -4902,9 +4691,9 @@ } }, "node_modules/axios": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", - "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -9971,15 +9760,6 @@ "yallist": "^3.0.2" } }, - "node_modules/luxon": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -10102,11 +9882,6 @@ "node": ">=10" } }, - "node_modules/mockdate": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/mockdate/-/mockdate-3.0.5.tgz", - "integrity": "sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ==" - }, "node_modules/module-details-from-path": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", @@ -10214,11 +9989,6 @@ "node": ">= 0.4.0" } }, - "node_modules/node-cleanup": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", - "integrity": "sha1-esGavSl+Caf3KnFUXZUbUX5N3iw=" - }, "node_modules/node-cron": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.2.1.tgz", @@ -10280,14 +10050,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/numeral": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", - "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==", - "engines": { - "node": "*" - } - }, "node_modules/object-code": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/object-code/-/object-code-1.3.3.tgz", @@ -10615,38 +10377,6 @@ "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", "license": "MIT" }, - "node_modules/pdf-parse": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-2.4.5.tgz", - "integrity": "sha512-mHU89HGh7v+4u2ubfnevJ03lmPgQ5WU4CxAVmTSh/sxVTEDYd1er/dKS/A6vg77NX47KTEoihq8jZBLr8Cxuwg==", - "license": "Apache-2.0", - "dependencies": { - "@napi-rs/canvas": "0.1.80", - "pdfjs-dist": "5.4.296" - }, - "bin": { - "pdf-parse": "bin/cli.mjs" - }, - "engines": { - "node": ">=20.16.0 <21 || >=22.3.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/mehmet-kozan" - } - }, - "node_modules/pdfjs-dist": { - "version": "5.4.296", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.296.tgz", - "integrity": "sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=20.16.0 || >=22.3.0" - }, - "optionalDependencies": { - "@napi-rs/canvas": "^0.1.80" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -14382,83 +14112,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@napi-rs/canvas": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas/-/canvas-0.1.80.tgz", - "integrity": "sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==", - "requires": { - "@napi-rs/canvas-android-arm64": "0.1.80", - "@napi-rs/canvas-darwin-arm64": "0.1.80", - "@napi-rs/canvas-darwin-x64": "0.1.80", - "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.80", - "@napi-rs/canvas-linux-arm64-gnu": "0.1.80", - "@napi-rs/canvas-linux-arm64-musl": "0.1.80", - "@napi-rs/canvas-linux-riscv64-gnu": "0.1.80", - "@napi-rs/canvas-linux-x64-gnu": "0.1.80", - "@napi-rs/canvas-linux-x64-musl": "0.1.80", - "@napi-rs/canvas-win32-x64-msvc": "0.1.80" - } - }, - "@napi-rs/canvas-android-arm64": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz", - "integrity": "sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==", - "optional": true - }, - "@napi-rs/canvas-darwin-arm64": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz", - "integrity": "sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==", - "optional": true - }, - "@napi-rs/canvas-darwin-x64": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz", - "integrity": "sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==", - "optional": true - }, - "@napi-rs/canvas-linux-arm-gnueabihf": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz", - "integrity": "sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==", - "optional": true - }, - "@napi-rs/canvas-linux-arm64-gnu": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz", - "integrity": "sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==", - "optional": true - }, - "@napi-rs/canvas-linux-arm64-musl": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz", - "integrity": "sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==", - "optional": true - }, - "@napi-rs/canvas-linux-riscv64-gnu": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz", - "integrity": "sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==", - "optional": true - }, - "@napi-rs/canvas-linux-x64-gnu": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz", - "integrity": "sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==", - "optional": true - }, - "@napi-rs/canvas-linux-x64-musl": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz", - "integrity": "sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==", - "optional": true - }, - "@napi-rs/canvas-win32-x64-msvc": { - "version": "0.1.80", - "resolved": "https://registry.npmjs.org/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz", - "integrity": "sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==", - "optional": true - }, "@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -15121,11 +14774,6 @@ "resolved": "https://registry.npmjs.org/@types/node-cleanup/-/node-cleanup-2.1.5.tgz", "integrity": "sha512-+82RAk5uYiqiMoEv2fPeh03AL4pB5d3TL+Pf+hz31Mme6ECFI1kRlgmxYjdSlHzDbJ9yLorTnKi4Op5FA54kQQ==" }, - "@types/numeral": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/numeral/-/numeral-2.0.5.tgz", - "integrity": "sha512-kH8I7OSSwQu9DS9JYdFWbuvhVzvFRoCPCkGxNwoGgaPeDfEPJlcxNvEOypZhQ3XXHsGbfIuYcxcJxKUfJHnRfw==" - }, "@types/pako": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", @@ -15604,9 +15252,9 @@ } }, "axios": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", - "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "requires": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", @@ -19011,11 +18659,6 @@ "yallist": "^3.0.2" } }, - "luxon": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==" - }, "make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -19098,11 +18741,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, - "mockdate": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/mockdate/-/mockdate-3.0.5.tgz", - "integrity": "sha512-iniQP4rj1FhBdBYS/+eQv7j1tadJ9lJtdzgOpvsOHng/GbcDh2Fhdeq+ZRldrPYdXvCyfFUmFeEwEGXZB5I/AQ==" - }, "module-details-from-path": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", @@ -19179,11 +18817,6 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==" }, - "node-cleanup": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/node-cleanup/-/node-cleanup-2.1.2.tgz", - "integrity": "sha1-esGavSl+Caf3KnFUXZUbUX5N3iw=" - }, "node-cron": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-4.2.1.tgz", @@ -19225,11 +18858,6 @@ "boolbase": "^1.0.0" } }, - "numeral": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", - "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==" - }, "object-code": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/object-code/-/object-code-1.3.3.tgz", @@ -19461,23 +19089,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" }, - "pdf-parse": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-2.4.5.tgz", - "integrity": "sha512-mHU89HGh7v+4u2ubfnevJ03lmPgQ5WU4CxAVmTSh/sxVTEDYd1er/dKS/A6vg77NX47KTEoihq8jZBLr8Cxuwg==", - "requires": { - "@napi-rs/canvas": "0.1.80", - "pdfjs-dist": "5.4.296" - } - }, - "pdfjs-dist": { - "version": "5.4.296", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-5.4.296.tgz", - "integrity": "sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==", - "requires": { - "@napi-rs/canvas": "^0.1.80" - } - }, "picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", diff --git a/package.json b/package.json index 7ce9276da..8167063b9 100644 --- a/package.json +++ b/package.json @@ -65,11 +65,10 @@ "@types/lodash.uniqby": "^4.7.9", "@types/node": "^25.5.2", "@types/node-cleanup": "^2.1.5", - "@types/numeral": "^2.0.5", "@types/pako": "^2.0.4", "@typescript-eslint/eslint-plugin": "^8.58.1", "@typescript-eslint/parser": "^8.58.1", - "axios": "^1.14.0", + "axios": "^1.15.0", "axios-cookiejar-support": "^6.0.5", "chalk": "^5.6.2", "cheerio": "^1.2.0", @@ -101,14 +100,9 @@ "lodash.sortby": "^4.7.0", "lodash.startcase": "^4.4.0", "lodash.uniqby": "^4.7.0", - "luxon": "^3.7.2", - "mockdate": "^3.0.5", "nedb-promises": "^6.2.3", - "node-cleanup": "^2.1.2", - "numeral": "^2.0.6", "pako": "^2.1.0", "parse-duration": "^2.1.6", - "pdf-parse": "^2.4.5", "pm2": "^6.0.14", "readline": "^1.3.0", "run-script-os": "^1.1.6", diff --git a/scripts/commands/channels/edit.ts b/scripts/commands/channels/edit.ts index 9e172a656..552107777 100644 --- a/scripts/commands/channels/edit.ts +++ b/scripts/commands/channels/edit.ts @@ -5,7 +5,6 @@ import { select, input } from '@inquirer/prompts' import { generateChannelsXML } from '../../core' import { Storage } from '@freearhey/storage-js' import { Channel } from '../../models' -import nodeCleanup from 'node-cleanup' import * as sdk from '@iptv-org/sdk' import { Command } from 'commander' import readline from 'readline' @@ -42,8 +41,14 @@ const storage = new Storage() let channelsFromXML = new Collection() main(filepath) -nodeCleanup(() => { +process.on('SIGINT', () => { save(filepath, channelsFromXML) + process.exit(0) +}) + +process.on('SIGTERM', () => { + save(filepath, channelsFromXML) + process.exit(0) }) export default async function main(filepath: string) { diff --git a/sites/andorradifusio.ad/andorradifusio.ad.config.js b/sites/andorradifusio.ad/andorradifusio.ad.config.js index cf3e5a5de..097b2dee6 100644 --- a/sites/andorradifusio.ad/andorradifusio.ad.config.js +++ b/sites/andorradifusio.ad/andorradifusio.ad.config.js @@ -1,5 +1,9 @@ const cheerio = require('cheerio') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'andorradifusio.ad', @@ -15,12 +19,12 @@ module.exports = { let start = parseStart(item, date) if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) + start = start.add(1, 'd') date = date.add(1, 'd') } prev.stop = start } - const stop = start.plus({ hours: 1 }) + const stop = start.add(1, 'h') programs.push({ title: item.title, start, @@ -35,12 +39,12 @@ module.exports = { function parseStart(item, date) { const dateString = `${date.format('MM/DD/YYYY')} ${item.time}` - return DateTime.fromFormat(dateString, 'MM/dd/yyyy HH:mm', { zone: 'Europe/Madrid' }).toUTC() + return dayjs.tz(dateString, 'MM/DD/YYYY HH:mm', 'Europe/Madrid').utc() } function parseItems(content, date) { const $ = cheerio.load(content) - const day = DateTime.fromMillis(date.valueOf()).setLocale('ca').toFormat('dd LLLL').toLowerCase() + const day = dayjs(date.valueOf()).locale('ca').format('DD MMMM').toLowerCase() const column = $('.programacio-dia > h3 > .dia') .filter((i, el) => $(el).text() === day.slice(0, 6) + '.') .first() diff --git a/sites/arianatelevision.com/arianatelevision.com.config.js b/sites/arianatelevision.com/arianatelevision.com.config.js index d6284e46f..653489609 100644 --- a/sites/arianatelevision.com/arianatelevision.com.config.js +++ b/sites/arianatelevision.com/arianatelevision.com.config.js @@ -1,5 +1,9 @@ const cheerio = require('cheerio') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'arianatelevision.com', @@ -13,12 +17,12 @@ module.exports = { let start = parseStart(item, date) if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + start = start.add(1, 'day') + date = date.add(1, 'day') } prev.stop = start } - const stop = start.plus({ minutes: 30 }) + const stop = start.add(30, 'minute') programs.push({ title: item.title, start, @@ -33,7 +37,7 @@ module.exports = { function parseStart(item, date) { const time = `${date.format('YYYY-MM-DD')} ${item.start}` - return DateTime.fromFormat(time, 'yyyy-MM-dd H:mm', { zone: 'Asia/Kabul' }).toUTC() + return dayjs.tz(time, 'YYYY-MM-DD H:mm', 'Asia/Kabul').utc() } function parseItems(content, date) { diff --git a/sites/awilime.com/awilime.com.config.js b/sites/awilime.com/awilime.com.config.js index 7e19b5b5f..c57647093 100644 --- a/sites/awilime.com/awilime.com.config.js +++ b/sites/awilime.com/awilime.com.config.js @@ -1,6 +1,10 @@ const cheerio = require('cheerio') const axios = require('axios') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'awilime.com', @@ -25,7 +29,7 @@ module.exports = { if (prev) { prev.stop = start } - const stop = start.plus({ minute: 30 }) + const stop = start.add(30, 'minute') programs.push({ title: parseTitle($item), @@ -87,7 +91,7 @@ function parseStart($item, date) { if (!time || !/^\d/.test(time)) return null time = `${date.format('YYYY-MM-DD')} ${time}` - return DateTime.fromFormat(time, 'yyyy-MM-dd HH:mm', { zone: 'Europe/Budapest' }).toUTC() + return dayjs.tz(time, 'YYYY-MM-DD HH:mm', 'Europe/Budapest').utc() } function parseItems(content) { diff --git a/sites/bein.com/bein.com.config.js b/sites/bein.com/bein.com.config.js index 463e10265..5377d4c57 100644 --- a/sites/bein.com/bein.com.config.js +++ b/sites/bein.com/bein.com.config.js @@ -1,7 +1,10 @@ const axios = require('axios') const dayjs = require('dayjs') const cheerio = require('cheerio') -const { DateTime } = require('luxon') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'bein.com', @@ -24,7 +27,7 @@ module.exports = { parser: function ({ content, channel, date }) { let programs = [] const items = parseItems(content, channel) - date = DateTime.fromMillis(date.valueOf()).minus({ days: 1 }) + date = dayjs(date.valueOf()).subtract(1, 'day') items.forEach(item => { const $item = cheerio.load(item) const title = parseTitle($item) @@ -34,14 +37,14 @@ module.exports = { let start = parseTime($item, date) if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) - date = date.plus({ days: 1 }) + start = start.add(1, 'day') + date = date.add(1, 'day') } prev.stop = start } let stop = parseTime($item, start) if (stop < start) { - stop = stop.plus({ days: 1 }) + stop = stop.add(1, 'day') } programs.push({ title, @@ -97,9 +100,9 @@ function parseTime($item, date) { .text() .match(/^(\d{2}:\d{2})/) || [null, null] if (!time) return null - time = `${date.toFormat('yyyy-MM-dd')} ${time}` + time = `${date.format('YYYY-MM-DD')} ${time}` - return DateTime.fromFormat(time, 'yyyy-MM-dd HH:mm', { zone: 'Asia/Qatar' }).toUTC() + return dayjs.tz(time, 'YYYY-MM-DD HH:mm', 'Asia/Qatar').utc() } function parseItems(content, channel) { diff --git a/sites/clickthecity.com/clickthecity.com.config.js b/sites/clickthecity.com/clickthecity.com.config.js index 9882af558..b65096349 100644 --- a/sites/clickthecity.com/clickthecity.com.config.js +++ b/sites/clickthecity.com/clickthecity.com.config.js @@ -1,6 +1,10 @@ const cheerio = require('cheerio') const axios = require('axios') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'clickthecity.com', @@ -17,7 +21,7 @@ module.exports = { const params = new URLSearchParams() params.append( 'optDate', - DateTime.fromMillis(date.valueOf()).setZone('Asia/Manila').toFormat('yyyy-MM-dd') + dayjs(date.valueOf()).tz('Asia/Manila').format('YYYY-MM-DD') ) params.append('optTime', '00:00:00') @@ -33,7 +37,7 @@ module.exports = { let stop = parseStop($item, date) if (!start || !stop) return if (start > stop) { - stop = stop.plus({ days: 1 }) + stop = stop.add(1, 'day') } programs.push({ @@ -77,7 +81,7 @@ function parseStart($item, date) { if (!time) return null time = `${date.format('YYYY-MM-DD')} ${time.replace('%3A', ':').replace('+', ' ')}` - return DateTime.fromFormat(time, 'yyyy-MM-dd h:mm a', { zone: 'Asia/Manila' }).toUTC() + return dayjs.tz(time, 'YYYY-MM-DD h:mm A', 'Asia/Manila').utc() } function parseStop($item, date) { @@ -86,7 +90,7 @@ function parseStop($item, date) { if (!time) return null time = `${date.format('YYYY-MM-DD')} ${time.replace('%3A', ':').replace('+', ' ')}` - return DateTime.fromFormat(time, 'yyyy-MM-dd h:mm a', { zone: 'Asia/Manila' }).toUTC() + return dayjs.tz(time, 'YYYY-MM-DD h:mm A', 'Asia/Manila').utc() } function parseItems(content) { diff --git a/sites/entertainment.ie/entertainment.ie.config.js b/sites/entertainment.ie/entertainment.ie.config.js index 04ff4ec6e..6d2f1cd76 100644 --- a/sites/entertainment.ie/entertainment.ie.config.js +++ b/sites/entertainment.ie/entertainment.ie.config.js @@ -1,6 +1,10 @@ const axios = require('axios') const cheerio = require('cheerio') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'entertainment.ie', @@ -19,10 +23,10 @@ module.exports = { let start = parseStart($item, date) if (!start) return if (prev && start < prev.start) { - start = start.plus({ days: 1 }) + start = start.add(1, 'day') } const duration = parseDuration($item) - const stop = start.plus({ minutes: duration }) + const stop = start.add(duration, 'minute') programs.push({ title: parseTitle($item), description: parseDescription($item), @@ -77,9 +81,7 @@ function parseStart($item, date) { let [, time] = d ? d.split(', ') : [null, null] return time - ? DateTime.fromFormat(`${date.format('YYYY-MM-DD')} ${time}`, 'yyyy-MM-dd HH:mm', { - zone: 'UTC' - }).toUTC() + ? dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'UTC').utc() : null } diff --git a/sites/gatotv.com/gatotv.com.config.js b/sites/gatotv.com/gatotv.com.config.js index b814da0a7..cf1b34e0a 100644 --- a/sites/gatotv.com/gatotv.com.config.js +++ b/sites/gatotv.com/gatotv.com.config.js @@ -2,7 +2,11 @@ const axios = require('axios') const cheerio = require('cheerio') const url = require('url') const path = require('path') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'gatotv.com', @@ -13,18 +17,18 @@ module.exports = { parser({ content, date }) { let programs = [] const items = parseItems(content) - date = date.subtract(1, 'd') + date = date.subtract(1, 'day') items.forEach((item, i) => { const $item = cheerio.load(item) let start = parseStart($item, date) - if (i === 0 && start.hour >= 5) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + if (i === 0 && start.hour() >= 5) { + start = start.add(1, 'day') + date = date.add(1, 'day') } let stop = parseStop($item, date) if (stop < start) { - stop = stop.plus({ days: 1 }) - date = date.add(1, 'd') + stop = stop.add(1, 'day') + date = date.add(1, 'day') } programs.push({ @@ -78,17 +82,13 @@ function parseImage($item) { function parseStart($item, date) { const time = $item('td:nth-child(1) > div > time').attr('datetime') - return DateTime.fromFormat(`${date.format('YYYY-MM-DD')} ${time}`, 'yyyy-MM-dd HH:mm', { - zone: 'EST' - }).toUTC() + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'EST').utc() } function parseStop($item, date) { const time = $item('td:nth-child(2) > div > time').attr('datetime') - return DateTime.fromFormat(`${date.format('YYYY-MM-DD')} ${time}`, 'yyyy-MM-dd HH:mm', { - zone: 'EST' - }).toUTC() + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'EST').utc() } function parseItems(content) { diff --git a/sites/i.mjh.nz/i.mjh.nz.test.js b/sites/i.mjh.nz/i.mjh.nz.test.js index d3d3f879c..a63119e7b 100644 --- a/sites/i.mjh.nz/i.mjh.nz.test.js +++ b/sites/i.mjh.nz/i.mjh.nz.test.js @@ -29,7 +29,7 @@ it('can parse response', () => { start: '2023-06-23T07:14:32.000Z', stop: '2023-06-23T09:09:36.000Z', title: 'Killers Within', - date: '20180101', + date: '2018-01-01T00:00:00.000Z', description: 'With her son being held captive by a criminal gang, police officer Amanda Doyle, together with her ex-husband and three unlikely allies, takes part in a desperate plot to hold a wealthy banker and his family to ransom. But this is no ordinary family.', icon: 'https://provider-static.plex.tv/epg/images/thumbnails/darkmatter-tv-fallback.jpg', diff --git a/sites/jiotv.com/jiotv.com.test.js b/sites/jiotv.com/jiotv.com.test.js index 5738c9307..5732a555d 100644 --- a/sites/jiotv.com/jiotv.com.test.js +++ b/sites/jiotv.com/jiotv.com.test.js @@ -3,11 +3,13 @@ const fs = require('fs') const path = require('path') const dayjs = require('dayjs') const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') const customParseFormat = require('dayjs/plugin/customParseFormat') dayjs.extend(customParseFormat) dayjs.extend(utc) +dayjs.extend(timezone) -jest.useFakeTimers().setSystemTime(new Date('2025-01-15')) +jest.useFakeTimers().setSystemTime(dayjs.utc('2025-01-15').valueOf()) const date = dayjs.utc('2025-01-17', 'YYYY-MM-DD').startOf('d') const channel = { diff --git a/sites/m.tv.sms.cz/m.tv.sms.cz.config.js b/sites/m.tv.sms.cz/m.tv.sms.cz.config.js index 92861212a..e2025f918 100644 --- a/sites/m.tv.sms.cz/m.tv.sms.cz.config.js +++ b/sites/m.tv.sms.cz/m.tv.sms.cz.config.js @@ -1,6 +1,10 @@ const cheerio = require('cheerio') const iconv = require('iconv-lite') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'm.tv.sms.cz', @@ -19,12 +23,12 @@ module.exports = { let start = parseStart($item, date) if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + start = start.add(1, 'day') + date = date.add(1, 'day') } prev.stop = start } - const stop = start.plus({ hours: 1 }) + const stop = start.add(1, 'hour') programs.push({ title: parseTitle($item), description: parseDescription($item), @@ -65,7 +69,7 @@ function parseStart($item, date) { const timeString = $item('div > span').text().trim() const dateString = `${date.format('MM/DD/YYYY')} ${timeString}` - return DateTime.fromFormat(dateString, 'MM/dd/yyyy HH.mm', { zone: 'Europe/Prague' }).toUTC() + return dayjs.tz(dateString, 'MM/DD/YYYY HH.mm', 'Europe/Prague').utc() } function parseDescription($item) { diff --git a/sites/meo.pt/meo.pt.config.js b/sites/meo.pt/meo.pt.config.js index e5c9f2b0f..34aba30b7 100644 --- a/sites/meo.pt/meo.pt.config.js +++ b/sites/meo.pt/meo.pt.config.js @@ -1,4 +1,8 @@ -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'meo.pt', @@ -33,7 +37,7 @@ module.exports = { const start = parseStart(item) let stop = parseStop(item) if (stop < start) { - stop = stop.plus({ days: 1 }) + stop = stop.add(1, 'day') } let description = '' @@ -94,15 +98,11 @@ module.exports = { } function parseStart(item) { - return DateTime.fromFormat(`${item.date} ${item.timeIni}`, 'd-M-yyyy HH:mm', { - zone: 'Europe/Lisbon' - }).toUTC() + return dayjs.tz(`${item.date} ${item.timeIni}`, 'D-M-YYYY HH:mm', 'Europe/Lisbon').utc() } function parseStop(item) { - return DateTime.fromFormat(`${item.date} ${item.timeEnd}`, 'd-M-yyyy HH:mm', { - zone: 'Europe/Lisbon' - }).toUTC() + return dayjs.tz(`${item.date} ${item.timeEnd}`, 'D-M-YYYY HH:mm', 'Europe/Lisbon').utc() } function parseItems(content) { diff --git a/sites/programtv.onet.pl/programtv.onet.pl.config.js b/sites/programtv.onet.pl/programtv.onet.pl.config.js index 64ff12df0..c15c99fc2 100644 --- a/sites/programtv.onet.pl/programtv.onet.pl.config.js +++ b/sites/programtv.onet.pl/programtv.onet.pl.config.js @@ -1,12 +1,16 @@ const cheerio = require('cheerio') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { delay: 5000, site: 'programtv.onet.pl', days: 2, url: function ({ date, channel }) { - const currDate = DateTime.now().toUTC().startOf('day') + const currDate = dayjs().utc().startOf('day') const day = date.diff(currDate, 'd') return `https://programtv.onet.pl/program-tv/${channel.site_id}?dzien=${day}` @@ -20,12 +24,12 @@ module.exports = { let start = parseStart($item, date) if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + start = start.add(1, 'day') + date = date.add(1, 'day') } prev.stop = start } - const stop = start.plus({ hours: 1 }) + const stop = start.add(1, 'hour') programs.push({ title: parseTitle($item), description: parseDescription($item), @@ -67,7 +71,7 @@ function parseStart($item, date) { const timeString = $item('.hours > .hour').text() const dateString = `${date.format('MM/DD/YYYY')} ${timeString}` - return DateTime.fromFormat(dateString, 'MM/dd/yyyy HH:mm', { zone: 'Europe/Warsaw' }).toUTC() + return dayjs.tz(dateString, 'MM/DD/YYYY HH:mm', 'Europe/Warsaw').utc() } function parseCategory($item) { diff --git a/sites/programtv.onet.pl/programtv.onet.pl.test.js b/sites/programtv.onet.pl/programtv.onet.pl.test.js index 3cfca2bfe..928f830be 100644 --- a/sites/programtv.onet.pl/programtv.onet.pl.test.js +++ b/sites/programtv.onet.pl/programtv.onet.pl.test.js @@ -1,4 +1,3 @@ -const MockDate = require('mockdate') const { parser, url } = require('./programtv.onet.pl.config.js') const fs = require('fs') const path = require('path') @@ -14,20 +13,26 @@ const channel = { xmltv_id: '13thStreet.de' } +beforeEach(() => { + jest.useFakeTimers() +}) + +afterEach(() => { + jest.useRealTimers() +}) + it('can generate valid url', () => { - MockDate.set(dayjs.utc('2021-11-24', 'YYYY-MM-DD').startOf('d')) + jest.setSystemTime(dayjs.utc('2021-11-24', 'YYYY-MM-DD').startOf('d').valueOf()) expect(url({ channel, date })).toBe( 'https://programtv.onet.pl/program-tv/13th-street-250?dzien=0' ) - MockDate.reset() }) it('can generate valid url for next day', () => { - MockDate.set(dayjs.utc('2021-11-23', 'YYYY-MM-DD').startOf('d')) + jest.setSystemTime(dayjs.utc('2021-11-23', 'YYYY-MM-DD').startOf('d').valueOf()) expect(url({ channel, date })).toBe( 'https://programtv.onet.pl/program-tv/13th-street-250?dzien=1' ) - MockDate.reset() }) it('can parse response', () => { diff --git a/sites/superguidatv.it/superguidatv.it.config.js b/sites/superguidatv.it/superguidatv.it.config.js index 6a89e9fe5..ae7b6ea00 100644 --- a/sites/superguidatv.it/superguidatv.it.config.js +++ b/sites/superguidatv.it/superguidatv.it.config.js @@ -1,12 +1,16 @@ const cheerio = require('cheerio') const axios = require('axios') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'superguidatv.it', days: 3, url({ channel, date }) { - let diff = date.diff(DateTime.now().toUTC().startOf('day'), 'd') + let diff = date.diff(dayjs().utc().startOf('day'), 'd') let day = { 0: 'oggi', 1: 'domani', @@ -24,12 +28,12 @@ module.exports = { let start = parseStart($item, date) if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + start = start.add(1, 'day') + date = date.add(1, 'day') } prev.stop = start } - const stop = start.plus({ minutes: 30 }) + const stop = start.add(30, 'minute') programs.push({ title: parseTitle($item), category: parseCategory($item), @@ -92,9 +96,7 @@ function parseStart($item, date) { .text() .trim() - return DateTime.fromFormat(`${date.format('YYYY-MM-DD')} ${hours}`, 'yyyy-MM-dd HH:mm', { - zone: 'Europe/Rome' - }).toUTC() + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${hours}`, 'YYYY-MM-DD HH:mm', 'Europe/Rome').utc() } function parseTitle($item) { diff --git a/sites/tivu.tv/tivu.tv.config.js b/sites/tivu.tv/tivu.tv.config.js index 7849be39a..d57df08ca 100644 --- a/sites/tivu.tv/tivu.tv.config.js +++ b/sites/tivu.tv/tivu.tv.config.js @@ -1,5 +1,9 @@ const cheerio = require('cheerio') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'tivu.tv', @@ -10,7 +14,7 @@ module.exports = { } }, url({ date }) { - const diff = date.diff(DateTime.now().toUTC().startOf('day'), 'd') + const diff = date.diff(dayjs().utc().startOf('day'), 'd') return `https://www.tivu.tv/epg_ajax_sat.aspx?d=${diff}` }, @@ -24,12 +28,12 @@ module.exports = { if (!start) return if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + start = start.add(1, 'day') + date = date.add(1, 'day') } prev.stop = start } - const stop = start.plus({ minutes: 30 }) + const stop = start.add(30, 'minute') programs.push({ title: parseTitle($item), start, @@ -76,9 +80,7 @@ function parseStart($item, date) { const [, , time] = $item('a').html().split('
') if (!time) return null - return DateTime.fromFormat(`${date.format('YYYY-MM-DD')} ${time}`, 'yyyy-MM-dd HH:mm', { - zone: 'Europe/Rome' - }).toUTC() + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'Europe/Rome').utc() } function parseItems(content, channel) { diff --git a/sites/turksatkablo.com.tr/turksatkablo.com.tr.config.js b/sites/turksatkablo.com.tr/turksatkablo.com.tr.config.js index 12edc6239..8e1cae196 100644 --- a/sites/turksatkablo.com.tr/turksatkablo.com.tr.config.js +++ b/sites/turksatkablo.com.tr/turksatkablo.com.tr.config.js @@ -1,4 +1,8 @@ -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'turksatkablo.com.tr', @@ -21,13 +25,13 @@ module.exports = { const prev = programs[programs.length - 1] let start = parseStart(item, date) if (prev && start < prev.start) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + start = start.add(1, 'day') + date = date.add(1, 'day') } let stop = parseStop(item, date) if (prev && stop < start) { - stop = stop.plus({ days: 1 }) - date = date.add(1, 'd') + stop = stop.add(1, 'day') + date = date.add(1, 'day') } programs.push({ title: item.b, @@ -65,13 +69,13 @@ module.exports = { function parseStart(item, date) { const time = `${date.format('YYYY-MM-DD')} ${item.c}` - return DateTime.fromFormat(time, 'yyyy-MM-dd HH:mm', { zone: 'Europe/Istanbul' }).toUTC() + return dayjs.tz(time, 'YYYY-MM-DD HH:mm', 'Europe/Istanbul').utc() } function parseStop(item, date) { const time = `${date.format('YYYY-MM-DD')} ${item.d}` - return DateTime.fromFormat(time, 'yyyy-MM-dd HH:mm', { zone: 'Europe/Istanbul' }).toUTC() + return dayjs.tz(time, 'YYYY-MM-DD HH:mm', 'Europe/Istanbul').utc() } function parseItems(content, channel) { diff --git a/sites/tv-programme.telecablesat.fr/tv-programme.telecablesat.fr.config.js b/sites/tv-programme.telecablesat.fr/tv-programme.telecablesat.fr.config.js index 87f976933..081f4e9dd 100644 --- a/sites/tv-programme.telecablesat.fr/tv-programme.telecablesat.fr.config.js +++ b/sites/tv-programme.telecablesat.fr/tv-programme.telecablesat.fr.config.js @@ -1,6 +1,10 @@ const cheerio = require('cheerio') const axios = require('axios') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) const API_ENDPOINT = 'https://tv-programme.telecablesat.fr/chaine' const headers = { @@ -41,12 +45,12 @@ module.exports = { let start = parseStart($item, date) if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + start = start.add(1, 'day') + date = date.add(1, 'day') } prev.stop = start } - const stop = start.plus({ hours: 1 }) + const stop = start.add(1, 'hour') programs.push({ title: parseTitle($item), description: parseDescription($item), @@ -87,9 +91,7 @@ function parseStart($item, date) { const timeString = $item('.schedule-hour').text() if (!timeString) return null - return DateTime.fromFormat(`${date.format('YYYY-MM-DD')} ${timeString}`, 'yyyy-MM-dd HH:mm', { - zone: 'Europe/Paris' - }).toUTC() + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${timeString}`, 'YYYY-MM-DD HH:mm', 'Europe/Paris').utc() } function parseImage($item) { diff --git a/sites/tv.mail.ru/tv.mail.ru.config.js b/sites/tv.mail.ru/tv.mail.ru.config.js index 3024f3abc..846365c51 100644 --- a/sites/tv.mail.ru/tv.mail.ru.config.js +++ b/sites/tv.mail.ru/tv.mail.ru.config.js @@ -1,6 +1,10 @@ -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') const axios = require('axios') const uniqBy = require('lodash.uniqby') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'tv.mail.ru', @@ -19,12 +23,12 @@ module.exports = { let start = parseStart(item, date) if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + start = start.add(1, 'day') + date = date.add(1, 'day') } prev.stop = start } - const stop = start.plus({ hours: 1 }) + const stop = start.add(1, 'hour') programs.push({ title: item.name, category: parseCategory(item), @@ -84,7 +88,7 @@ async function getTotalPageCount(region) { function parseStart(item, date) { const dateString = `${date.format('YYYY-MM-DD')} ${item.start}` - return DateTime.fromFormat(dateString, 'yyyy-MM-dd HH:mm', { zone: 'Europe/Moscow' }).toUTC() + return dayjs.tz(dateString, 'YYYY-MM-DD HH:mm', 'Europe/Moscow').utc() } function parseCategory(item) { diff --git a/sites/tvgids.nl/tvgids.nl.config.js b/sites/tvgids.nl/tvgids.nl.config.js index 4df422070..0b54e27f1 100644 --- a/sites/tvgids.nl/tvgids.nl.config.js +++ b/sites/tvgids.nl/tvgids.nl.config.js @@ -1,13 +1,17 @@ const cheerio = require('cheerio') const axios = require('axios') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'tvgids.nl', days: 2, url: function ({ date, channel }) { const path = - DateTime.utc().day === DateTime.fromMillis(date.valueOf()).day + dayjs().utc().day() === dayjs(date).utc().day() ? '' : `${date.format('DD-MM-YYYY')}/` @@ -23,12 +27,12 @@ module.exports = { let start = parseStart($item, date) if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + start = start.add(1, 'day') + date = date.add(1, 'day') } prev.stop = start } - const stop = start.plus({ minutes: 30 }) + const stop = start.add(30, 'minute') programs.push({ title: parseTitle($item), description: parseDescription($item), @@ -75,9 +79,7 @@ function parseImage($item) { function parseStart($item, date) { const time = $item('.program__starttime').clone().children().remove().end().text().trim() - return DateTime.fromFormat(`${date.format('YYYY-MM-DD')} ${time}`, 'yyyy-MM-dd HH:mm', { - zone: 'Europe/Amsterdam' - }).toUTC() + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'Europe/Amsterdam').utc() } function parseItems(content) { diff --git a/sites/tvgids.nl/tvgids.nl.test.js b/sites/tvgids.nl/tvgids.nl.test.js index 88da3f0a7..d316899e9 100644 --- a/sites/tvgids.nl/tvgids.nl.test.js +++ b/sites/tvgids.nl/tvgids.nl.test.js @@ -14,7 +14,7 @@ const channel = { } it('can generate valid url', () => { - jest.useFakeTimers().setSystemTime(new Date('2025-01-17')) + jest.useFakeTimers().setSystemTime(dayjs('2025-01-17').valueOf()) expect(url({ date, channel })).toBe('https://www.tvgids.nl/gids/19-01-2025/npo1') }) diff --git a/sites/tvhebdo.com/tvhebdo.com.config.js b/sites/tvhebdo.com/tvhebdo.com.config.js index c77c239d1..e56ff1db2 100644 --- a/sites/tvhebdo.com/tvhebdo.com.config.js +++ b/sites/tvhebdo.com/tvhebdo.com.config.js @@ -1,7 +1,11 @@ const cheerio = require('cheerio') const axios = require('axios') -const { DateTime } = require('luxon') const uniqBy = require('lodash.uniqby') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'tvhebdo.com', @@ -20,11 +24,11 @@ module.exports = { let start = parseStart($item, date) if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) + start = start.add(1, 'day') } prev.stop = start } - let stop = start.plus({ minutes: 30 }) + let stop = start.add(30, 'minute') programs.push({ title: parseTitle($item), start, @@ -83,9 +87,7 @@ function parseTitle($item) { function parseStart($item, date) { const time = $item('.heure').text() - return DateTime.fromFormat(`${date.format('YYYY-MM-DD')} ${time}`, 'yyyy-MM-dd HH:mm', { - zone: 'America/Toronto' - }).toUTC() + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'America/Toronto').utc() } function parseItems(content) { diff --git a/sites/tvinsider.com/tvinsider.com.config.js b/sites/tvinsider.com/tvinsider.com.config.js index 2ac33b164..9f115b4fd 100644 --- a/sites/tvinsider.com/tvinsider.com.config.js +++ b/sites/tvinsider.com/tvinsider.com.config.js @@ -1,6 +1,10 @@ const cheerio = require('cheerio') const axios = require('axios') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'tvinsider.com', @@ -20,7 +24,7 @@ module.exports = { if (prev) { prev.stop = start } - const stop = start.plus({ minute: 30 }) + const stop = start.add(30, 'minute') programs.push({ title: parseTitle($item), @@ -114,7 +118,7 @@ function parseStart($item, date) { let time = $item('time').text().trim() time = `${date.format('YYYY-MM-DD')} ${time}` - return DateTime.fromFormat(time, 'yyyy-MM-dd t', { zone: 'America/New_York' }).toUTC() + return dayjs.tz(time, 'YYYY-MM-DD h:mm A', 'EST').utc() } function parseItems(content, date) { diff --git a/sites/tvmustra.hu/tvmustra.hu.config.js b/sites/tvmustra.hu/tvmustra.hu.config.js index ca59ea391..33c59ca41 100644 --- a/sites/tvmustra.hu/tvmustra.hu.config.js +++ b/sites/tvmustra.hu/tvmustra.hu.config.js @@ -1,6 +1,10 @@ const cheerio = require('cheerio') const axios = require('axios') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'tvmustra.hu', @@ -18,12 +22,12 @@ module.exports = { if (!start) return if (prev) { if (start < prev.start) { - start = start.plus({ days: 1 }) - date = date.add(1, 'd') + start = start.add(1, 'day') + date = date.add(1, 'day') } prev.stop = start } - const stop = start.plus({ minute: 30 }) + const stop = start.add(30, 'minute') programs.push({ title: parseTitle($item), @@ -66,9 +70,7 @@ function parseTitle($item) { function parseStart($item, date) { const time = $item('.musor_lista_idopont, .musor_lista_idopont2').text().trim() - return DateTime.fromFormat(`${date.format('YYYY-MM-DD')} ${time}`, 'yyyy-MM-dd HH:mm', { - zone: 'Europe/Budapest' - }).toUTC() + return dayjs.tz(`${date.format('YYYY-MM-DD')} ${time}`, 'YYYY-MM-DD HH:mm', 'Europe/Budapest').utc() } function parseItems(content) { diff --git a/sites/vodafone.pt/vodafone.pt.config.js b/sites/vodafone.pt/vodafone.pt.config.js index e4071e7e7..7d1c07ede 100644 --- a/sites/vodafone.pt/vodafone.pt.config.js +++ b/sites/vodafone.pt/vodafone.pt.config.js @@ -1,5 +1,9 @@ -const { DateTime } = require('luxon') const axios = require('axios') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) const API_ENDPOINT = 'https://cdn.pt.vtv.vodafone.com/epg' @@ -18,25 +22,25 @@ module.exports = { headers }, url: function ({ channel, date }) { - const datetime = DateTime.fromJSDate(date.toDate()).setZone('Europe/Lisbon') - const formattedMonth = datetime.month < 10 ? `0${datetime.month}` : datetime.month - const formattedDay = datetime.day < 10 ? `0${datetime.day}` : datetime.day - return `${API_ENDPOINT}/${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/00-06` + const datetime = dayjs(date.toDate()).tz('Europe/Lisbon') + const formattedMonth = datetime.month() + 1 < 10 ? `0${datetime.month() + 1}` : datetime.month() + 1 + const formattedDay = datetime.date() < 10 ? `0${datetime.date()}` : datetime.date() + return `${API_ENDPOINT}/${channel.site_id}/${datetime.year()}/${formattedMonth}/${formattedDay}/00-06` }, async parser({ content, date, channel }) { let programs = [] let items = parseItems(content) if (items.length === 0) return programs - const datetime = DateTime.fromJSDate(date.toDate()).setZone('Europe/Lisbon') - const formattedMonth = datetime.month < 10 ? `0${datetime.month}` : datetime.month - const formattedDay = datetime.day < 10 ? `0${datetime.day}` : datetime.day + const datetime = dayjs(date.toDate()).tz('Europe/Lisbon') + const formattedMonth = datetime.month() + 1 < 10 ? `0${datetime.month() + 1}` : datetime.month() + 1 + const formattedDay = datetime.date() < 10 ? `0${datetime.date()}` : datetime.date() // Fetch the remaining 3 periods to get a full day schedule const promises = [ - axios.get(`${API_ENDPOINT}/${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/06-12`, { headers }), - axios.get(`${API_ENDPOINT}/${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/12-18`, { headers }), - axios.get(`${API_ENDPOINT}/${channel.site_id}/${date.year()}/${formattedMonth}/${formattedDay}/18-00`, { headers }) + axios.get(`${API_ENDPOINT}/${channel.site_id}/${datetime.year()}/${formattedMonth}/${formattedDay}/06-12`, { headers }), + axios.get(`${API_ENDPOINT}/${channel.site_id}/${datetime.year()}/${formattedMonth}/${formattedDay}/12-18`, { headers }), + axios.get(`${API_ENDPOINT}/${channel.site_id}/${datetime.year()}/${formattedMonth}/${formattedDay}/18-00`, { headers }) ] await Promise.allSettled(promises).then(results => { @@ -49,10 +53,10 @@ module.exports = { for (let item of items) { if (!item.startDate || !item.endDate) continue - let start = DateTime.fromSeconds(item.startDate, { zone: 'UTC' }).toUTC() - let stop = DateTime.fromSeconds(item.endDate, { zone: 'UTC' }).toUTC() + let start = dayjs.unix(item.startDate).utc() + let stop = dayjs.unix(item.endDate).utc() if (stop < start) { - stop = stop.plus({ days: 1 }) + stop = stop.add(1, 'day') } const prog = { title: item.name || 'Sem título', diff --git a/sites/wavve.com/wavve.com.config.js b/sites/wavve.com/wavve.com.config.js index 59755129f..cccba4fe9 100644 --- a/sites/wavve.com/wavve.com.config.js +++ b/sites/wavve.com/wavve.com.config.js @@ -1,5 +1,9 @@ const axios = require('axios') -const { DateTime } = require('luxon') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'wavve.com', @@ -47,11 +51,11 @@ module.exports = { } function parseStart(item) { - return DateTime.fromFormat(item.starttime, 'yyyy-MM-dd HH:mm', { zone: 'Asia/Seoul' }).toUTC() + return dayjs.tz(item.starttime, 'YYYY-MM-DD HH:mm', 'Asia/Seoul').utc() } function parseStop(item) { - return DateTime.fromFormat(item.endtime, 'yyyy-MM-dd HH:mm', { zone: 'Asia/Seoul' }).toUTC() + return dayjs.tz(item.endtime, 'YYYY-MM-DD HH:mm', 'Asia/Seoul').utc() } function parseItems(content) { diff --git a/sites/zap.co.ao/zap.co.ao.config.js b/sites/zap.co.ao/zap.co.ao.config.js index 267ac8595..6b0860c6a 100644 --- a/sites/zap.co.ao/zap.co.ao.config.js +++ b/sites/zap.co.ao/zap.co.ao.config.js @@ -1,5 +1,9 @@ -const { DateTime } = require('luxon') const axios = require('axios') +const dayjs = require('dayjs') +const utc = require('dayjs/plugin/utc') +const timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) module.exports = { site: 'zap.co.ao', @@ -18,8 +22,8 @@ module.exports = { title: item.programName, description: item.programDescription, category: item.categoryName, - start: DateTime.fromSeconds(item.utcBeginDate).toUTC(), - stop: DateTime.fromSeconds(item.utcEndDate).toUTC() + start: dayjs.unix(item.utcBeginDate).utc(), + stop: dayjs.unix(item.utcEndDate).utc() }) })