diff --git a/src/main/events/download-sources/validate-download-source.ts b/src/main/events/download-sources/validate-download-source.ts index 122eb49c..fdb67961 100644 --- a/src/main/events/download-sources/validate-download-source.ts +++ b/src/main/events/download-sources/validate-download-source.ts @@ -1,17 +1,12 @@ import { registerEvent } from "../register-event"; -import axios from "axios"; import { downloadSourceRepository } from "@main/repository"; -import { downloadSourceSchema } from "../helpers/validators"; import { RepacksManager } from "@main/services"; +import { downloadSourceWorker } from "@main/workers"; const validateDownloadSource = async ( _event: Electron.IpcMainInvokeEvent, url: string ) => { - const response = await axios.get(url); - - const source = downloadSourceSchema.parse(response.data); - const existingSource = await downloadSourceRepository.findOne({ where: { url }, }); @@ -21,14 +16,12 @@ const validateDownloadSource = async ( const repacks = RepacksManager.repacks; - const existingUris = source.downloads - .flatMap((download) => download.uris) - .filter((uri) => repacks.some((repack) => repack.magnet === uri)); - - return { - name: source.name, - downloadCount: source.downloads.length - existingUris.length, - }; + return downloadSourceWorker.run( + { url, repacks }, + { + name: "validateDownloadSource", + } + ); }; registerEvent("validateDownloadSource", validateDownloadSource); diff --git a/src/main/main.ts b/src/main/main.ts index ec95ccd5..fbabc56c 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -18,7 +18,7 @@ import { HydraApi } from "./services/hydra-api"; import { uploadGamesBatch } from "./services/library-sync"; const loadState = async (userPreferences: UserPreferences | null) => { - await RepacksManager.updateRepacks(); + RepacksManager.updateRepacks(); import("./events"); diff --git a/src/main/workers/download-source.worker.ts b/src/main/workers/download-source.worker.ts index cc33dd38..5ec37c7f 100644 --- a/src/main/workers/download-source.worker.ts +++ b/src/main/workers/download-source.worker.ts @@ -1,6 +1,6 @@ import { downloadSourceSchema } from "@main/events/helpers/validators"; import { DownloadSourceStatus } from "@shared"; -import type { DownloadSource } from "@types"; +import type { DownloadSource, GameRepack } from "@types"; import axios, { AxiosError, AxiosHeaders } from "axios"; import { z } from "zod"; @@ -48,3 +48,24 @@ export const getUpdatedRepacks = async (downloadSources: DownloadSource[]) => { return results; }; + +export const validateDownloadSource = async ({ + url, + repacks, +}: { + url: string; + repacks: GameRepack[]; +}) => { + const response = await axios.get(url); + + const source = downloadSourceSchema.parse(response.data); + + const existingUris = source.downloads + .flatMap((download) => download.uris) + .filter((uri) => repacks.some((repack) => repack.magnet === uri)); + + return { + name: source.name, + downloadCount: source.downloads.length - existingUris.length, + }; +}; diff --git a/src/renderer/src/pages/game-details/modals/repacks-modal.tsx b/src/renderer/src/pages/game-details/modals/repacks-modal.tsx index 1d368798..3ce87818 100644 --- a/src/renderer/src/pages/game-details/modals/repacks-modal.tsx +++ b/src/renderer/src/pages/game-details/modals/repacks-modal.tsx @@ -1,4 +1,4 @@ -import { useCallback, useContext, useEffect, useState } from "react"; +import { useCallback, useContext, useEffect, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import parseTorrent from "parse-torrent"; @@ -12,6 +12,7 @@ import { format } from "date-fns"; import { DownloadSettingsModal } from "./download-settings-modal"; import { gameDetailsContext } from "@renderer/context"; import { Downloader } from "@shared"; +import { orderBy } from "lodash-es"; export interface RepacksModalProps { visible: boolean; @@ -38,6 +39,10 @@ export function RepacksModal({ const { t } = useTranslation("game_details"); + const sortedRepacks = useMemo(() => { + return orderBy(repacks, (repack) => repack.uploadDate, "desc"); + }, [repacks]); + const getInfoHash = useCallback(async () => { const torrent = await parseTorrent(game?.uri ?? ""); @@ -47,10 +52,10 @@ export function RepacksModal({ }, [game]); useEffect(() => { - setFilteredRepacks(repacks); + setFilteredRepacks(sortedRepacks); if (game?.uri) getInfoHash(); - }, [repacks, visible, game, getInfoHash]); + }, [sortedRepacks, visible, game, getInfoHash]); const handleRepackClick = (repack: GameRepack) => { setRepack(repack); @@ -61,7 +66,7 @@ export function RepacksModal({ const term = event.target.value.toLocaleLowerCase(); setFilteredRepacks( - repacks.filter((repack) => { + sortedRepacks.filter((repack) => { const lowerCaseTitle = repack.title.toLowerCase(); const lowerCaseRepacker = repack.repacker.toLowerCase(); diff --git a/src/shared/index.ts b/src/shared/index.ts index ff556ad2..409bdbc9 100644 --- a/src/shared/index.ts +++ b/src/shared/index.ts @@ -51,10 +51,15 @@ export const removeSpecialEditionFromName = (name: string) => export const removeDuplicateSpaces = (name: string) => name.replace(/\s{2,}/g, " "); +export const replaceUnderscoreWithSpace = (name: string) => + name.replace(/_/g, " "); + export const formatName = pipe( removeReleaseYearFromName, - removeSymbolsFromName, removeSpecialEditionFromName, + replaceUnderscoreWithSpace, + (str) => str.replace(/DIRECTOR'S CUT/g, ""), + removeSymbolsFromName, removeDuplicateSpaces, (str) => str.trim() );