diff --git a/README.md b/README.md index a737756e..a0f3d5b0 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,9 @@ pip install -r requirements.txt ## Environment variables You'll need an SteamGridDB API Key in order to fetch the game icons on installation. -Once you have it, you can paste the `.env.example` file and put it on `STEAMGRIDDB_API_KEY`. +If you want to have onlinefix as a repacker you'll need to add your credentials to the .env + +Once you have it, you can paste the `.env.example` file and put it on `STEAMGRIDDB_API_KEY`, `ONLINEFIX_USERNAME`, `ONLINEFIX_PASSWORD`. ## Running @@ -66,7 +68,7 @@ yarn start Build the bittorrent client by using this command: ```bash -python torrent-client/setup.py build +pyinstaller torrent-client/main.py --distpath resources/dist --icon=images/icon.ico -n hydra-download-manager ``` ### Build the Electron application diff --git a/package.json b/package.json index 94e96111..6eb038ff 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "@types/react-dom": "^18.2.22", "@types/uuid": "^9.0.8", "@types/webtorrent": "^0.109.8", + "@types/windows-1251": "^0.1.22", "@typescript-eslint/eslint-plugin": "^7.3.1", "@typescript-eslint/parser": "^7.3.1", "@vanilla-extract/webpack-plugin": "^2.3.7", @@ -80,6 +81,7 @@ "date-fns": "^3.5.0", "electron-squirrel-startup": "^1.0.0", "flexsearch": "^0.7.43", + "got-scraping": "^4.0.5", "i18next": "^23.10.1", "i18next-browser-languagedetector": "^7.2.0", "jsdom": "^24.0.0", @@ -87,6 +89,7 @@ "lottie-react": "^2.4.0", "parse-torrent": "9.1.5", "ps-list": "^8.1.1", + "qs": "^6.12.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-i18next": "^14.1.0", @@ -95,9 +98,11 @@ "react-router-dom": "^6.22.3", "sqlite3": "^5.1.7", "tasklist": "^5.0.0", + "tough-cookie": "^4.1.3", "typeorm": "^0.3.20", "update-electron-app": "^3.0.0", "uuid": "^9.0.1", + "windows-1251": "^3.0.4", "winston": "^3.12.0", "yaml": "^2.4.1" } diff --git a/resources/hydra.db b/resources/hydra.db index f673b2e7..7db97249 100644 Binary files a/resources/hydra.db and b/resources/hydra.db differ diff --git a/src/main/constants.ts b/src/main/constants.ts index acd43076..43d9d44e 100644 --- a/src/main/constants.ts +++ b/src/main/constants.ts @@ -16,6 +16,7 @@ export const repackers = [ "CPG", "TinyRepacks", "GOG", + "onlinefix", ] as const; export const months = [ diff --git a/src/main/helpers/formatters.ts b/src/main/helpers/formatters.ts index 75393146..6ad67625 100644 --- a/src/main/helpers/formatters.ts +++ b/src/main/helpers/formatters.ts @@ -49,6 +49,8 @@ export const xatabFormatter = (title: string) => .replace(/(v\.?([0-9]| )+)+([0-9]|\.|-|_|\/|[a-zA-Z]| )+/, ""); export const tinyRepacksFormatter = (title: string) => title; +export const onlinefixFormatter = (title: string) => + title.replace("по сети", "").trim(); export const gogFormatter = (title: string) => title.replace(/(v\.[0-9]+|v[0-9]+\.|v[0-9]{4})+.+/, ""); diff --git a/src/main/helpers/index.ts b/src/main/helpers/index.ts index 8def0abb..93b79229 100644 --- a/src/main/helpers/index.ts +++ b/src/main/helpers/index.ts @@ -11,6 +11,7 @@ import { xatabFormatter, tinyRepacksFormatter, gogFormatter, + onlinefixFormatter, } from "./formatters"; import { months, repackers } from "../constants"; @@ -40,6 +41,7 @@ export const repackerFormatter: Record< CPG: (title: string) => title, TinyRepacks: tinyRepacksFormatter, GOG: gogFormatter, + onlinefix: onlinefixFormatter, }; export const formatUploadDate = (str: string) => { diff --git a/src/main/index.ts b/src/main/index.ts index e33a3d21..e1d20a99 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -5,6 +5,7 @@ import { getNewRepacksFromCPG, getNewRepacksFromUser, getNewRepacksFromXatab, + getNewRepacksFromOnlineFix, readPipe, startProcessWatcher, writePipe, @@ -77,6 +78,9 @@ const checkForNewRepacks = async () => { getNewRepacksFromCPG( existingRepacks.filter((repack) => repack.repacker === "CPG") ), + getNewRepacksFromOnlineFix( + existingRepacks.filter((repack) => repack.repacker === "onlinefix") + ), track1337xUsers(existingRepacks), ]).then(() => { repackRepository.count().then((count) => { diff --git a/src/main/services/repack-tracker/index.ts b/src/main/services/repack-tracker/index.ts index d03ad7bd..7bd3ce31 100644 --- a/src/main/services/repack-tracker/index.ts +++ b/src/main/services/repack-tracker/index.ts @@ -2,3 +2,4 @@ export * from "./1337x"; export * from "./xatab"; export * from "./cpg-repacks"; export * from "./gog"; +export * from "./online-fix"; diff --git a/src/main/services/repack-tracker/online-fix.ts b/src/main/services/repack-tracker/online-fix.ts new file mode 100644 index 00000000..85583d64 --- /dev/null +++ b/src/main/services/repack-tracker/online-fix.ts @@ -0,0 +1,208 @@ +import { Repack } from "@main/entity"; +import { savePage } from "./helpers"; +import type { GameRepackInput } from "./helpers"; +import { logger } from "../logger"; +import { stringify } from "qs"; +import parseTorrent, { + toMagnetURI, + Instance as TorrentInstance, +} from "parse-torrent"; +import { JSDOM } from "jsdom"; +import { gotScraping } from "got-scraping"; +import { CookieJar } from "tough-cookie"; + +import { format, parse, sub } from "date-fns"; +import { ru } from "date-fns/locale"; +import { decode } from "windows-1251"; +import { onlinefixFormatter } from "@main/helpers"; + +export const getNewRepacksFromOnlineFix = async ( + existingRepacks: Repack[] = [], + page = 1, + cookieJar = new CookieJar() +): Promise => { + const hasCredentials = + process.env.ONLINEFIX_USERNAME && process.env.ONLINEFIX_PASSWORD; + if (!hasCredentials) return; + + const http = gotScraping.extend({ + headerGeneratorOptions: { + browsers: [ + { + name: "chrome", + minVersion: 87, + maxVersion: 89, + }, + ], + devices: ["desktop"], + locales: ["en-US"], + operatingSystems: ["windows", "linux"], + }, + cookieJar: cookieJar, + }); + + if (page === 1) { + await http.get("https://online-fix.me/"); + const preLogin = + ((await http + .get("https://online-fix.me/engine/ajax/authtoken.php", { + headers: { + "X-Requested-With": "XMLHttpRequest", + Referer: "https://online-fix.me/", + }, + }) + .json()) as { + field: string; + value: string; + }) || undefined; + + if (!preLogin.field || !preLogin.value) return; + + const tokenField = preLogin.field; + const tokenValue = preLogin.value; + + await http + .post("https://online-fix.me/", { + encoding: "binary", + headers: { + Referer: "https://online-fix.me", + Origin: "https://online-fix.me", + "Content-Type": "application/x-www-form-urlencoded", + }, + body: stringify({ + login_name: process.env.ONLINEFIX_USERNAME, + login_password: process.env.ONLINEFIX_PASSWORD, + login: "submit", + [tokenField]: tokenValue, + }), + }) + .text(); + } + + const pageParams = page > 1 ? `${`/page/${page}`}` : ""; + + const home = await http.get(`https://online-fix.me${pageParams}`, { + encoding: "binary", + }); + const document = new JSDOM(home.body).window.document; + + const repacks: GameRepackInput[] = []; + const articles = Array.from(document.querySelectorAll(".news")); + const totalPages = Number( + document.querySelector("nav > a:nth-child(13)").textContent + ); + + try { + await Promise.all( + articles.map(async (article) => { + const gameName = onlinefixFormatter( + decode(article.querySelector("h2.title")?.textContent?.trim()) + ); + + const gameLink = article.querySelector("a")?.getAttribute("href"); + + if (!gameLink) return; + + const gamePage = await http + .get(gameLink, { + encoding: "binary", + }) + .text(); + + const gameDocument = new JSDOM(gamePage).window.document; + + const uploadDateText = gameDocument.querySelector("time").textContent; + + let decodedDateText = decode(uploadDateText); + + // "Вчера" means yesterday. + if (decodedDateText.includes("Вчера")) { + const yesterday = sub(new Date(), { days: 1 }); + const formattedYesterday = format(yesterday, "d LLLL yyyy", { + locale: ru, + }); + decodedDateText = decodedDateText.replace( + "Вчера", // "Change yesterday to the default expected date format" + formattedYesterday + ); + } + + const uploadDate = parse( + decodedDateText, + "d LLLL yyyy, HH:mm", + new Date(), + { + locale: ru, + } + ); + + const torrentButtons = Array.from( + gameDocument.querySelectorAll("a") + ).filter((a) => a.textContent?.includes("Torrent")); + + const torrentPrePage = torrentButtons[0]?.getAttribute("href"); + if (!torrentPrePage) return; + + const torrentPage = await http + .get(torrentPrePage, { + encoding: "binary", + headers: { + Referer: gameLink, + }, + }) + .text(); + + const torrentDocument = new JSDOM(torrentPage).window.document; + + const torrentLink = torrentDocument + .querySelector("a:nth-child(2)") + ?.getAttribute("href"); + + const torrentFile = Buffer.from( + await http + .get(`${torrentPrePage}/${torrentLink}`, { + responseType: "buffer", + }) + .buffer() + ); + + const torrent = parseTorrent(torrentFile) as TorrentInstance; + const magnetLink = toMagnetURI({ + infoHash: torrent.infoHash, + }); + + const torrentSizeInBytes = torrent.length; + const fileSizeFormatted = + torrentSizeInBytes >= 1024 ** 3 + ? `${(torrentSizeInBytes / 1024 ** 3).toFixed(1)}GBs` + : `${(torrentSizeInBytes / 1024 ** 2).toFixed(1)}MBs`; + + repacks.push({ + fileSize: fileSizeFormatted, + magnet: magnetLink, + page: 1, + repacker: "onlinefix", + title: gameName, + uploadDate: uploadDate, + }); + }) + ); + } catch (err) { + logger.error(err.message, { method: "getNewRepacksFromOnlineFix" }); + } + + const newRepacks = repacks.filter( + (repack) => + repack.uploadDate && + !existingRepacks.some( + (existingRepack) => existingRepack.title === repack.title + ) + ); + + if (!newRepacks.length) return; + if (page === totalPages) return; + + await savePage(newRepacks); + + return getNewRepacksFromOnlineFix(existingRepacks, page + 1, cookieJar); +}; diff --git a/yarn.lock b/yarn.lock index 0dab0752..5d34214e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2511,11 +2511,16 @@ unplugin "1.0.1" uuid "^9.0.0" -"@sindresorhus/is@^4.0.0": +"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.2.0": version "4.6.0" - resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== +"@sindresorhus/is@^5.2.0", "@sindresorhus/is@^5.3.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== + "@sqltools/formatter@^1.2.5": version "1.2.5" resolved "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz" @@ -2634,6 +2639,13 @@ dependencies: defer-to-connect "^2.0.0" +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" @@ -2805,9 +2817,9 @@ resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== -"@types/http-cache-semantics@*": +"@types/http-cache-semantics@*", "@types/http-cache-semantics@^4.0.2": version "4.0.4" - resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== "@types/http-errors@*": @@ -3015,6 +3027,11 @@ "@types/parse-torrent" "*" "@types/simple-peer" "*" +"@types/windows-1251@^0.1.22": + version "0.1.22" + resolved "https://registry.yarnpkg.com/@types/windows-1251/-/windows-1251-0.1.22.tgz#c68d7ccdd2b931cd122be90e5cdca24b43908499" + integrity sha512-8dGTgUZkPlCxoslJkxZJfSLzICvo45N57cmqOc/fPxPPlCJQn4Pp1vuEB/+VZ2pey9JyFprmrlbyG633iEging== + "@types/ws@^8.5.5": version "8.5.10" resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz" @@ -3395,6 +3412,11 @@ acorn@^8.11.3, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8. resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +adm-zip@^0.5.9: + version "0.5.12" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.12.tgz#87786328e91d54b37358d8a50f954c4cd73ba60b" + integrity sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ== + agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" @@ -3893,9 +3915,9 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0: +browserslist@^4.21.1, browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0: version "4.23.0" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: caniuse-lite "^1.0.30001587" @@ -3997,6 +4019,24 @@ cacheable-lookup@^5.0.3: resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== +cacheable-lookup@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" + integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== + +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== + dependencies: + "@types/http-cache-semantics" "^4.0.2" + get-stream "^6.0.1" + http-cache-semantics "^4.1.1" + keyv "^4.5.3" + mimic-response "^4.0.0" + normalize-url "^8.0.0" + responselike "^3.0.0" + cacheable-request@^7.0.2: version "7.0.4" resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz" @@ -4021,11 +4061,16 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" -callsites@^3.0.0: +callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +callsites@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.1.0.tgz#de72b98612eed4e1e2564c952498677faa9d86c2" + integrity sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw== + camel-case@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" @@ -4719,9 +4764,9 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -defer-to-connect@^2.0.0: +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== define-data-property@^1.0.1, define-data-property@^1.1.4: @@ -4906,6 +4951,20 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +dot-prop@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-7.2.0.tgz#468172a3529779814d21a779c1ba2f6d76609809" + integrity sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA== + dependencies: + type-fest "^2.11.2" + dotenv-defaults@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz" @@ -5960,6 +6019,11 @@ fork-ts-checker-webpack-plugin@^7.2.13: semver "^7.3.5" tapable "^2.2.1" +form-data-encoder@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" + integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== + form-data@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" @@ -6120,6 +6184,14 @@ gauge@^4.0.3: strip-ansi "^6.0.1" wide-align "^1.1.5" +generative-bayesian-network@^2.1.50: + version "2.1.50" + resolved "https://registry.yarnpkg.com/generative-bayesian-network/-/generative-bayesian-network-2.1.50.tgz#a576130befe0e30ccfebe5280fb2550649abadc9" + integrity sha512-iVmmQ4lpa41xqtrg6cbWuH1Qa2+C6tndb2dJmJazBEIQcnvz29ZYxbnqB1DAvbico3nGIVzF2Hvj2gZU9EewAQ== + dependencies: + adm-zip "^0.5.9" + tslib "^2.4.0" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" @@ -6185,9 +6257,9 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-stream@^6.0.0: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-symbol-description@^1.0.2: @@ -6344,6 +6416,19 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +got-scraping@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/got-scraping/-/got-scraping-4.0.5.tgz#e1cab8ff2420d9c9f406bac405c10e8b324ec4ec" + integrity sha512-g+cMC5WOVOHd6S3JdTtm+zCwpWdd3jA1MYnkOwVF7MpbKP7EWv7ORUfXDcG3gTANJ1zYj9XffCrAjbH8ssHmfw== + dependencies: + got "^13.0.0" + header-generator "^2.1.41" + http2-wrapper "^2.2.0" + mimic-response "^4.0.0" + ow "^1.1.1" + quick-lru "^7.0.0" + tslib "^2.6.2" + got@^11.7.0, got@^11.8.2, got@^11.8.5: version "11.8.6" resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" @@ -6361,6 +6446,23 @@ got@^11.7.0, got@^11.8.2, got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" +got@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/got/-/got-13.0.0.tgz#a2402862cef27a5d0d1b07c0fb25d12b58175422" + integrity sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA== + dependencies: + "@sindresorhus/is" "^5.2.0" + "@szmarczak/http-timer" "^5.0.1" + cacheable-lookup "^7.0.0" + cacheable-request "^10.2.8" + decompress-response "^6.0.0" + form-data-encoder "^2.1.2" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^3.0.0" + graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" @@ -6432,6 +6534,16 @@ he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +header-generator@^2.1.41: + version "2.1.50" + resolved "https://registry.yarnpkg.com/header-generator/-/header-generator-2.1.50.tgz#338fd7d92131dcaf71918b6ac8b9a26d6bb6acc0" + integrity sha512-Z37QBqcPzEqCCFQcOv1Kth1My3h4Vx+2V+aBipjrefZ2MFbVfYB/mo1v+OxiEJir5zSp9rX/z+BoqTuSAIGBLQ== + dependencies: + browserslist "^4.21.1" + generative-bayesian-network "^2.1.50" + ow "^0.28.1" + tslib "^2.4.0" + highlight.js@^10.7.1: version "10.7.3" resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" @@ -6529,9 +6641,9 @@ htmlparser2@^8.0.1: domutils "^3.0.1" entities "^4.4.0" -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: @@ -6619,6 +6731,14 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" +http2-wrapper@^2.1.10, http2-wrapper@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" @@ -6936,6 +7056,11 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" @@ -7369,6 +7494,11 @@ lodash.get@^4.0.0: resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" @@ -7461,6 +7591,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + lru-cache@^10.2.0: version "10.2.0" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz" @@ -7678,6 +7813,11 @@ mimic-response@^3.1.0: resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +mimic-response@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" + integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== + minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" @@ -8045,6 +8185,11 @@ normalize-url@^6.0.1: resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== +normalize-url@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.0.1.tgz#9b7d96af9836577c58f5883e939365fa15623a4a" + integrity sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w== + npm-normalize-package-bin@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" @@ -8250,11 +8395,38 @@ outdent@^0.8.0: resolved "https://registry.npmjs.org/outdent/-/outdent-0.8.0.tgz" integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A== +ow@^0.28.1: + version "0.28.2" + resolved "https://registry.yarnpkg.com/ow/-/ow-0.28.2.tgz#782b28102124e665c49ec7725e2066a129acf6bf" + integrity sha512-dD4UpyBh/9m4X2NVjA+73/ZPBRF+uF4zIMFvvQsabMiEK8x41L3rQ8EENOi35kyyoaJwNxEeJcP6Fj1H4U409Q== + dependencies: + "@sindresorhus/is" "^4.2.0" + callsites "^3.1.0" + dot-prop "^6.0.1" + lodash.isequal "^4.5.0" + vali-date "^1.0.0" + +ow@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ow/-/ow-1.1.1.tgz#354a0f7df9d8d0cf961b29116daf972ef6be1632" + integrity sha512-sJBRCbS5vh1Jp9EOgwp1Ws3c16lJrUkJYlvWTYC03oyiYVwS/ns7lKRWow4w4XjDyTrA2pplQv4B2naWSR6yDA== + dependencies: + "@sindresorhus/is" "^5.3.0" + callsites "^4.0.0" + dot-prop "^7.2.0" + lodash.isequal "^4.5.0" + vali-date "^1.0.0" + p-cancelable@^2.0.0: version "2.1.1" resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz" @@ -8722,6 +8894,13 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +qs@^6.12.0: + version "6.12.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" + integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== + dependencies: + side-channel "^1.0.6" + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" @@ -8737,6 +8916,11 @@ quick-lru@^5.1.1: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +quick-lru@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-7.0.0.tgz#447f6925b33ae4d2d637e211967d74bae4b99c3f" + integrity sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" @@ -9048,9 +9232,9 @@ reselect@^5.0.1: resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz" integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== -resolve-alpn@^1.0.0: +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: version "1.2.1" - resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== resolve-dir@^1.0.0: @@ -9098,6 +9282,13 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +responselike@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" + integrity sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg== + dependencies: + lowercase-keys "^3.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" @@ -10146,7 +10337,7 @@ tslib@^1.8.1: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.5.0: +tslib@^2.0.3, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -10187,6 +10378,11 @@ type-fest@^1.0.2: resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== +type-fest@^2.11.2: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" @@ -10468,6 +10664,11 @@ v8-compile-cache@^2.0.3: resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz" integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + integrity sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" @@ -10761,6 +10962,11 @@ wildcard@^2.0.0: resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== +windows-1251@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/windows-1251/-/windows-1251-3.0.4.tgz#984b9f2e76befd9ec2e825f9fe77b681fadcdb55" + integrity sha512-H6W68MVertlR74xVuwa2pdQ1jR5qksk+oZX6QXFhL5OYj/ZZxViob8UyGLfXPwsCijuaV7NUYOYkK0oXSaWW5g== + winston-transport@^4.7.0: version "4.7.0" resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz"