From 1af05d447bd101795e62bc4341e5be961a32da5d Mon Sep 17 00:00:00 2001 From: Zurdi Date: Sun, 11 Feb 2024 00:36:56 +0100 Subject: [PATCH 01/61] add platform endpoint added --- backend/endpoints/platform.py | 11 ++++++++--- frontend/src/components/Dialog/Rom/UploadRom.vue | 4 +--- frontend/src/components/Drawer/Base.vue | 15 +++++++++++++++ frontend/src/services/api/platform.ts | 5 +++++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/backend/endpoints/platform.py b/backend/endpoints/platform.py index 9cadc9826..54bf31516 100644 --- a/backend/endpoints/platform.py +++ b/backend/endpoints/platform.py @@ -2,14 +2,14 @@ from endpoints.responses import MessageResponse from endpoints.responses.platform import PlatformSchema from fastapi import APIRouter, HTTPException, Request, status -from handler import db_platform_handler +from handler import db_platform_handler, igdb_handler from logger.logger import log router = APIRouter() @protected_route(router.post, "/platforms", ["platforms.write"]) -def add_platforms(request: Request) -> MessageResponse: +async def add_platforms(request: Request) -> MessageResponse: """Create platform endpoint Args: @@ -19,7 +19,12 @@ def add_platforms(request: Request) -> MessageResponse: MessageResponse: Standard message response """ - pass + data = await request.json() + fs_slug = data["fs_slug"] + platform = igdb_handler.get_platform(fs_slug) + log.debug(platform) + + return {"msg": f"Platform created successfully!"} @protected_route(router.get, "/platforms", ["platforms.read"]) diff --git a/frontend/src/components/Dialog/Rom/UploadRom.vue b/frontend/src/components/Dialog/Rom/UploadRom.vue index 5d25d4a0a..4f7249418 100644 --- a/frontend/src/components/Dialog/Rom/UploadRom.vue +++ b/frontend/src/components/Dialog/Rom/UploadRom.vue @@ -1,6 +1,5 @@ + + diff --git a/frontend/src/components/Gallery/AppBar/Base.vue b/frontend/src/components/Gallery/AppBar/Base.vue index 2581a5d8a..36b4ead2b 100644 --- a/frontend/src/components/Gallery/AppBar/Base.vue +++ b/frontend/src/components/Gallery/AppBar/Base.vue @@ -1,12 +1,10 @@ From a2d5e2d7490410fb866f7efb76c73e245a534edd Mon Sep 17 00:00:00 2001 From: Zurdi Date: Mon, 8 Apr 2024 23:45:36 +0200 Subject: [PATCH 34/61] fixed quick scan from gallery --- frontend/src/components/Dialog/Rom/UploadRom.vue | 15 +++++++++------ .../src/components/Gallery/AppBar/ScanBtn.vue | 2 +- frontend/src/services/api/rom.ts | 6 +++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/Dialog/Rom/UploadRom.vue b/frontend/src/components/Dialog/Rom/UploadRom.vue index 2a320aebd..48c36b1f3 100644 --- a/frontend/src/components/Dialog/Rom/UploadRom.vue +++ b/frontend/src/components/Dialog/Rom/UploadRom.vue @@ -31,16 +31,18 @@ async function uploadRoms() { if (!platform.value) return; show.value = false; scanningStore.set(true); + const platformId = platform.value.id emitter?.emit("snackbarShow", { msg: `Uploading ${romsToUpload.value.length} roms to ${platform.value.name}...`, icon: "mdi-loading mdi-spin", color: "romm-accent-1", }); + await romApi .uploadRoms({ romsToUpload: romsToUpload.value, - platform: platform.value.id, + platformId: platformId, }) .then(({ data }) => { const { uploaded_roms, skipped_roms } = data; @@ -64,7 +66,7 @@ async function uploadRoms() { if (!socket.connected) socket.connect(); setTimeout(() => { socket.emit("scan", { - platforms: [platform.value?.id], + platforms: [platformId], type: "quick", }); }, 2000); @@ -133,7 +135,7 @@ function closeDialog() { - + - + - - + + Cancel Upload diff --git a/frontend/src/components/Gallery/AppBar/ScanBtn.vue b/frontend/src/components/Gallery/AppBar/ScanBtn.vue index 7d90002bb..c74ab0c2e 100644 --- a/frontend/src/components/Gallery/AppBar/ScanBtn.vue +++ b/frontend/src/components/Gallery/AppBar/ScanBtn.vue @@ -14,7 +14,7 @@ async function scan() { socket.emit("scan", { platforms: [romsStore.platform.id], - type: "unidentified", + type: "quick", }); } diff --git a/frontend/src/services/api/rom.ts b/frontend/src/services/api/rom.ts index 09f55f79b..daf34fc7a 100644 --- a/frontend/src/services/api/rom.ts +++ b/frontend/src/services/api/rom.ts @@ -13,10 +13,10 @@ import type { Rom } from "@/stores/roms"; export const romApi = api; async function uploadRoms({ - platform, + platformId, romsToUpload, }: { - platform: number; + platformId: number; romsToUpload: File[]; }): Promise<{ data: AddRomsResponse }> { let formData = new FormData(); @@ -26,7 +26,7 @@ async function uploadRoms({ headers: { "Content-Type": "multipart/form-data", }, - params: { platform_id: platform }, + params: { platform_id: platformId }, }); } From 2e26d06e90d706799b479e3a10d46e0a8918b51d Mon Sep 17 00:00:00 2001 From: Zurdi Date: Tue, 9 Apr 2024 00:11:04 +0200 Subject: [PATCH 35/61] dialogs unified into home page --- frontend/src/components/Dashboard/Recent.vue | 11 - .../src/components/Dialog/Rom/MatchRom.vue | 383 ++++++++++++++++++ .../src/components/Dialog/Rom/SearchRom.vue | 350 ++++++++-------- .../components/Dialog/Rom/SearchRomGlobal.vue | 377 ----------------- frontend/src/components/Drawer/Base.vue | 18 +- .../src/components/Game/AdminMenu/Base.vue | 2 +- .../Settings/Config/ExclusionsCard.vue | 3 - .../Settings/Config/PlatformBindingCard.vue | 5 - .../Settings/Config/PlatformVersionsCard.vue | 5 - frontend/src/types/emitter.d.ts | 4 +- frontend/src/views/Details/Base.vue | 11 - frontend/src/views/Gallery/Base.vue | 14 - frontend/src/views/Home.vue | 35 ++ .../Settings/ControlPanel/Users/Base.vue | 17 +- 14 files changed, 606 insertions(+), 629 deletions(-) create mode 100644 frontend/src/components/Dialog/Rom/MatchRom.vue delete mode 100644 frontend/src/components/Dialog/Rom/SearchRomGlobal.vue diff --git a/frontend/src/components/Dashboard/Recent.vue b/frontend/src/components/Dashboard/Recent.vue index 7d9f8284c..3d6850846 100644 --- a/frontend/src/components/Dashboard/Recent.vue +++ b/frontend/src/components/Dashboard/Recent.vue @@ -1,9 +1,4 @@ + + + + diff --git a/frontend/src/components/Dialog/Rom/SearchRom.vue b/frontend/src/components/Dialog/Rom/SearchRom.vue index a6d98cf36..eead57557 100644 --- a/frontend/src/components/Dialog/Rom/SearchRom.vue +++ b/frontend/src/components/Dialog/Rom/SearchRom.vue @@ -1,103 +1,88 @@ - - - - diff --git a/frontend/src/components/Drawer/Base.vue b/frontend/src/components/Drawer/Base.vue index 7eb7deb89..550a2a05e 100644 --- a/frontend/src/components/Drawer/Base.vue +++ b/frontend/src/components/Drawer/Base.vue @@ -5,14 +5,11 @@ import type { Emitter } from "mitt"; import { inject, ref } from "vue"; import { useDisplay } from "vuetify"; -import AddPlatformDialog from "@/components/Dialog/Platform/AddPlatform.vue"; -import SearchRomGlobalDialog from "@/components/Dialog/Rom/SearchRomGlobal.vue"; import RailFooter from "@/components/Drawer/Footer.vue"; import DrawerHeader from "@/components/Drawer/Header.vue"; import PlatformListItem from "@/components/Platform/PlatformListItem.vue"; import storeAuth from "@/stores/auth"; import storePlatforms from "@/stores/platforms"; -import platformApi from "@/services/api/platform"; // Props const { lgAndUp } = useDisplay(); @@ -44,7 +41,7 @@ emitter?.on("toggleDrawerRail", () => { @@ -105,7 +102,10 @@ emitter?.on("toggleDrawerRail", () => { > - + Add platform @@ -115,7 +115,10 @@ emitter?.on("toggleDrawerRail", () => { > - + Upload roms @@ -158,7 +161,4 @@ emitter?.on("toggleDrawerRail", () => { - - - diff --git a/frontend/src/components/Game/AdminMenu/Base.vue b/frontend/src/components/Game/AdminMenu/Base.vue index 052a0550e..0f7c44ffe 100644 --- a/frontend/src/components/Game/AdminMenu/Base.vue +++ b/frontend/src/components/Game/AdminMenu/Base.vue @@ -15,7 +15,7 @@ const heartbeat = storeHeartbeat(); >("emitter"); @@ -220,8 +219,6 @@ const editable = ref(false); - - diff --git a/frontend/src/components/Settings/Config/PlatformBindingCard.vue b/frontend/src/components/Settings/Config/PlatformBindingCard.vue index 96e087deb..6be665d21 100644 --- a/frontend/src/components/Settings/Config/PlatformBindingCard.vue +++ b/frontend/src/components/Settings/Config/PlatformBindingCard.vue @@ -1,6 +1,4 @@ - + Upload diff --git a/frontend/src/services/api/platform.ts b/frontend/src/services/api/platform.ts index d1e7af6e3..0ab6a041c 100644 --- a/frontend/src/services/api/platform.ts +++ b/frontend/src/services/api/platform.ts @@ -21,6 +21,10 @@ async function getPlatform( return api.get(`/platforms/${id}`); } +async function getSupportedPlatforms(): Promise<{ data: PlatformSchema[] }> { + return api.get("/platforms/supported"); +} + async function updatePlatform({ platform, }: { @@ -41,5 +45,6 @@ export default { uploadPlatform, getPlatforms, getPlatform, + getSupportedPlatforms, deletePlatform, }; diff --git a/frontend/src/views/Library/Scan/Base.vue b/frontend/src/views/Library/Scan/Base.vue index 2b8dfd355..6cc82f718 100644 --- a/frontend/src/views/Library/Scan/Base.vue +++ b/frontend/src/views/Library/Scan/Base.vue @@ -93,7 +93,7 @@ watch(metadataOptions, (newOptions) => { - { - + Date: Thu, 11 Apr 2024 00:02:51 +0200 Subject: [PATCH 45/61] create platform when uploading roms if needed --- .../src/components/Dialog/Rom/UploadRom.vue | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/frontend/src/components/Dialog/Rom/UploadRom.vue b/frontend/src/components/Dialog/Rom/UploadRom.vue index 79658786e..db7ad9d76 100644 --- a/frontend/src/components/Dialog/Rom/UploadRom.vue +++ b/frontend/src/components/Dialog/Rom/UploadRom.vue @@ -32,6 +32,42 @@ async function uploadRoms() { if (!selectedPlatform.value) return; show.value = false; scanningStore.set(true); + + if (selectedPlatform.value.id == -1) { + await platformApi + .uploadPlatform({ fsSlug: selectedPlatform.value.fs_slug }) + .then(() => { + emitter?.emit("snackbarShow", { + msg: `Platform ${selectedPlatform.value?.name} created successfully!`, + icon: "mdi-check-bold", + color: "green", + timeout: 2000, + }); + + if (!socket.connected) socket.connect(); + setTimeout(() => { + socket.emit("scan", { + platforms: [], + type: "new_platforms", + }); + }, 2000); + }) + .catch((error) => { + console.log(error); + emitter?.emit("snackbarShow", { + msg: error.response.data.detail, + icon: "mdi-close-circle", + color: "red", + }); + return; + }) + .finally(() => { + emitter?.emit("showLoadingDialog", { loading: false, scrim: false }); + }); + } + + // TODO: wait for platform to be created to get the id + const platformId = selectedPlatform.value.id; emitter?.emit("snackbarShow", { msg: `Uploading ${romsToUpload.value.length} roms to ${selectedPlatform.value.name}...`, From d3864ff02b1cb08ce04b3ee9fc7dc54c31a40ae6 Mon Sep 17 00:00:00 2001 From: zurdi Date: Thu, 11 Apr 2024 01:39:58 +0200 Subject: [PATCH 46/61] create platform if not exists when adding roms fixed --- backend/endpoints/platform.py | 16 +-- backend/exceptions/fs_exceptions.py | 2 +- .../__generated__/models/PlatformSchema.ts | 2 +- .../Dialog/Platform/AddPlatform.vue | 118 ------------------ .../src/components/Dialog/Rom/UploadRom.vue | 72 ++++++----- frontend/src/components/Drawer/Base.vue | 13 -- .../src/components/Gallery/AppBar/ScanBtn.vue | 19 +++ .../src/components/Gallery/FabMenu/Base.vue | 27 +++- frontend/src/services/api/platform.ts | 2 +- frontend/src/views/Home.vue | 2 - 10 files changed, 91 insertions(+), 182 deletions(-) delete mode 100644 frontend/src/components/Dialog/Platform/AddPlatform.vue diff --git a/backend/endpoints/platform.py b/backend/endpoints/platform.py index f425a776c..fc92178ab 100644 --- a/backend/endpoints/platform.py +++ b/backend/endpoints/platform.py @@ -5,32 +5,32 @@ from fastapi import APIRouter, HTTPException, Request, status from handler import db_platform_handler, fs_platform_handler from handler.metadata_handler.igdb_handler import IGDB_PLATFORM_LIST +from handler.scan_handler import scan_platform from logger.logger import log router = APIRouter() @protected_route(router.post, "/platforms", ["platforms.write"]) -async def add_platforms(request: Request) -> MessageResponse: +async def add_platforms(request: Request) -> PlatformSchema: """Create platform endpoint Args: request (Request): Fastapi Request object Returns: - MessageResponse: Standard message response + PlatformSchema: Just created platform """ data = await request.json() fs_slug = data["fs_slug"] try: fs_platform_handler.add_platforms(fs_slug=fs_slug) - except PlatformAlreadyExistsException as e: - log.error(str(e)) - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e) - ) - return {"msg": f"Platform created successfully!"} + except PlatformAlreadyExistsException: + log.info(f"Detected platform: {fs_slug}") + scanned_platform = scan_platform(fs_slug, [fs_slug]) + platform = db_platform_handler.add_platform(scanned_platform) + return platform @protected_route(router.get, "/platforms", ["platforms.read"]) diff --git a/backend/exceptions/fs_exceptions.py b/backend/exceptions/fs_exceptions.py index f66697886..3b0f636b3 100644 --- a/backend/exceptions/fs_exceptions.py +++ b/backend/exceptions/fs_exceptions.py @@ -21,7 +21,7 @@ def __repr__(self): class PlatformAlreadyExistsException(Exception): def __init__(self, fs_slug: str): - self.message = f"Can't create platform {fs_slug}: already exists" + self.message = f"Platform {fs_slug} already exists" super().__init__(self.message) def __repr__(self): diff --git a/frontend/src/__generated__/models/PlatformSchema.ts b/frontend/src/__generated__/models/PlatformSchema.ts index efe93f9ca..9847878be 100644 --- a/frontend/src/__generated__/models/PlatformSchema.ts +++ b/frontend/src/__generated__/models/PlatformSchema.ts @@ -11,7 +11,7 @@ export type PlatformSchema = { sgdb_id?: (number | null); moby_id?: (number | null); name: string; - logo_path: string; + logo_path?: (string | null); rom_count: number; }; diff --git a/frontend/src/components/Dialog/Platform/AddPlatform.vue b/frontend/src/components/Dialog/Platform/AddPlatform.vue deleted file mode 100644 index 2877ac95b..000000000 --- a/frontend/src/components/Dialog/Platform/AddPlatform.vue +++ /dev/null @@ -1,118 +0,0 @@ - - - - - diff --git a/frontend/src/components/Dialog/Rom/UploadRom.vue b/frontend/src/components/Dialog/Rom/UploadRom.vue index db7ad9d76..ff14001ed 100644 --- a/frontend/src/components/Dialog/Rom/UploadRom.vue +++ b/frontend/src/components/Dialog/Rom/UploadRom.vue @@ -1,15 +1,16 @@ - - Add platform - - import socket from "@/services/socket"; +import storeHeartbeat from "@/stores/heartbeat"; import storeRoms from "@/stores/roms"; import storeScanning from "@/stores/scanning"; +import { computed, ref } from "vue"; // Props const scanningStore = storeScanning(); const romsStore = storeRoms(); +const heartbeat = storeHeartbeat(); +// Use a computed property to reactively update metadataOptions based on heartbeat +const metadataOptions = computed(() => [ + { + name: "IGDB", + value: "igdb", + disabled: !heartbeat.value.METADATA_SOURCES?.IGDB_API_ENABLED, + }, + { + name: "MobyGames", + value: "moby", + disabled: !heartbeat.value.METADATA_SOURCES?.MOBY_API_ENABLED, + }, +]); +// Use the computed metadataOptions to filter out disabled sources +const metadataSources = ref(metadataOptions.value.filter((s) => !s.disabled)); async function scan() { scanningStore.set(true); @@ -15,6 +33,7 @@ async function scan() { socket.emit("scan", { platforms: [romsStore.platform.id], type: "quick", + apis: metadataSources.value.map((s) => s.value), }); } diff --git a/frontend/src/components/Gallery/FabMenu/Base.vue b/frontend/src/components/Gallery/FabMenu/Base.vue index d5dae7ef1..ce34be48f 100644 --- a/frontend/src/components/Gallery/FabMenu/Base.vue +++ b/frontend/src/components/Gallery/FabMenu/Base.vue @@ -1,14 +1,14 @@ diff --git a/frontend/src/components/Gallery/FabMenu/Base.vue b/frontend/src/components/Gallery/FabMenu/Base.vue index ce34be48f..414c63973 100644 --- a/frontend/src/components/Gallery/FabMenu/Base.vue +++ b/frontend/src/components/Gallery/FabMenu/Base.vue @@ -19,21 +19,6 @@ const romsStore = storeRoms(); const scanningStore = storeScanning(); const route = useRoute(); const heartbeat = storeHeartbeat(); -// Use a computed property to reactively update metadataOptions based on heartbeat -const metadataOptions = computed(() => [ - { - name: "IGDB", - value: "igdb", - disabled: !heartbeat.value.METADATA_SOURCES?.IGDB_API_ENABLED, - }, - { - name: "MobyGames", - value: "moby", - disabled: !heartbeat.value.METADATA_SOURCES?.MOBY_API_ENABLED, - }, -]); -// Use the computed metadataOptions to filter out disabled sources -const metadataSources = ref(metadataOptions.value.filter((s) => !s.disabled)); // Functions async function onScan() { @@ -49,7 +34,7 @@ async function onScan() { platforms: [route.params.platform], roms: romsStore.selectedRoms, type: "partial", - apis: metadataSources.value.map((s) => s.value), + apis: heartbeat.getMetadataOptions().map((s) => s.value), }); } diff --git a/frontend/src/stores/heartbeat.ts b/frontend/src/stores/heartbeat.ts index 916cfa7f3..fdae3a2a3 100644 --- a/frontend/src/stores/heartbeat.ts +++ b/frontend/src/stores/heartbeat.ts @@ -1,6 +1,6 @@ -import { defineStore } from "pinia"; - import type { HeartbeatResponse } from "@/__generated__"; +import { defineStore } from "pinia"; +import { computed } from "vue"; export default defineStore("heartbeat", { state: () => { @@ -11,5 +11,19 @@ export default defineStore("heartbeat", { set(data: HeartbeatResponse) { this.value = data; }, + getMetadataOptions() { + return computed(() => [ + { + name: "IGDB", + value: "igdb", + disabled: !this.value.METADATA_SOURCES?.IGDB_API_ENABLED, + }, + { + name: "MobyGames", + value: "moby", + disabled: !this.value.METADATA_SOURCES?.MOBY_API_ENABLED, + }, + ]).value.filter((s) => !s.disabled); + }, }, }); From 0cdab8679f694646ad805c5db94ef341b499549f Mon Sep 17 00:00:00 2001 From: zurdi Date: Thu, 11 Apr 2024 11:05:25 +0200 Subject: [PATCH 49/61] fixed mobygames cover update --- backend/endpoints/rom.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/endpoints/rom.py b/backend/endpoints/rom.py index 27701e8d7..e272bd29c 100644 --- a/backend/endpoints/rom.py +++ b/backend/endpoints/rom.py @@ -274,8 +274,8 @@ async def update_rom( platform_fs_slug = db_platform_handler.get_platforms(db_rom.platform_id).fs_slug cleaned_data = {} - cleaned_data["igdb_id"] = data.get("igdb_id", db_rom.igdb_id) or None - cleaned_data["moby_id"] = data.get("moby_id", db_rom.moby_id) or None + cleaned_data["igdb_id"] = data.get("igdb_id", None) + cleaned_data["moby_id"] = data.get("moby_id", None) if cleaned_data["moby_id"]: moby_rom = moby_handler.get_rom_by_id(cleaned_data["moby_id"]) @@ -325,6 +325,7 @@ async def update_rom( rom_name=cleaned_data["name"], platform_fs_slug=platform_fs_slug ) ) + cleaned_data.update({"url_cover": ""}) else: cleaned_data.update( fs_resource_handler.get_rom_cover( From 5108b224ebc25ce46de4dc082ce5037d3c92e2a5 Mon Sep 17 00:00:00 2001 From: zurdi Date: Thu, 11 Apr 2024 11:38:44 +0200 Subject: [PATCH 50/61] fixed sources metadata management --- backend/endpoints/rom.py | 4 ++++ frontend/src/components/Details/Title.vue | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/backend/endpoints/rom.py b/backend/endpoints/rom.py index e272bd29c..da245ee98 100644 --- a/backend/endpoints/rom.py +++ b/backend/endpoints/rom.py @@ -280,10 +280,14 @@ async def update_rom( if cleaned_data["moby_id"]: moby_rom = moby_handler.get_rom_by_id(cleaned_data["moby_id"]) cleaned_data.update(moby_rom) + else: + cleaned_data.update({"moby_metadata": {}}) if cleaned_data["igdb_id"]: igdb_rom = igdb_handler.get_rom_by_id(cleaned_data["igdb_id"]) cleaned_data.update(igdb_rom) + else: + cleaned_data.update({"igdb_metadata": {}}) cleaned_data["name"] = data.get("name", db_rom.name) cleaned_data["summary"] = data.get("summary", db_rom.summary) diff --git a/frontend/src/components/Details/Title.vue b/frontend/src/components/Details/Title.vue index 37b4c444a..efadf52c6 100644 --- a/frontend/src/components/Details/Title.vue +++ b/frontend/src/components/Details/Title.vue @@ -42,7 +42,10 @@ const { smAndDown } = useDisplay(); no-gutters > - + {{ platform.name }} @@ -99,7 +102,7 @@ const { smAndDown } = useDisplay(); style="text-decoration: none; color: inherit" :href="`https://www.mobygames.com/game/${rom.moby_id}`" target="_blank" - class="ml-2" + :class="{ 'ml-2': rom.igdb_id }" > Mobygames From d58d6514d5a5226a5ec2ae7703b1305b510322c0 Mon Sep 17 00:00:00 2001 From: zurdi Date: Thu, 11 Apr 2024 16:21:49 +0200 Subject: [PATCH 51/61] improved cover selection from multi-source --- backend/endpoints/responses/search.py | 3 +- backend/endpoints/rom.py | 3 +- backend/endpoints/search.py | 9 +- .../__generated__/models/SearchRomSchema.ts | 3 +- .../src/components/Details/Info/FileInfo.vue | 10 +- .../src/components/Details/Info/GameInfo.vue | 2 +- .../Dialog/Rom/{ => MatchRom}/MatchRom.vue | 45 ++++- .../Dialog/Rom/MatchRom/SelectSource.vue | 158 ++++++++++++++++++ frontend/src/services/api/rom.ts | 1 + frontend/src/types/emitter.d.ts | 3 +- frontend/src/views/Home.vue | 2 +- 11 files changed, 220 insertions(+), 19 deletions(-) rename frontend/src/components/Dialog/Rom/{ => MatchRom}/MatchRom.vue (88%) create mode 100644 frontend/src/components/Dialog/Rom/MatchRom/SelectSource.vue diff --git a/backend/endpoints/responses/search.py b/backend/endpoints/responses/search.py index 4cbb9a2d7..e18d4280a 100644 --- a/backend/endpoints/responses/search.py +++ b/backend/endpoints/responses/search.py @@ -6,5 +6,6 @@ class SearchRomSchema(BaseModel): slug: str name: str summary: str - url_cover: str + igdb_url_cover: str = "" + moby_url_cover: str = "" url_screenshots: list[str] diff --git a/backend/endpoints/rom.py b/backend/endpoints/rom.py index da245ee98..6c660c761 100644 --- a/backend/endpoints/rom.py +++ b/backend/endpoints/rom.py @@ -259,7 +259,7 @@ async def update_rom( request (Request): Fastapi Request object id (Rom): Rom internal id rename_as_igdb (bool, optional): Flag to rename rom file as matched IGDB game. Defaults to False. - artwork (Optional[UploadFile], optional): Custom artork to set as cover. Defaults to File(None). + artwork (UploadFile, optional): Custom artork to set as cover. Defaults to File(None). Raises: HTTPException: If a rom already have that name when enabling the rename_as_igdb flag @@ -331,6 +331,7 @@ async def update_rom( ) cleaned_data.update({"url_cover": ""}) else: + cleaned_data["url_cover"] = data.get("url_cover", db_rom.url_cover) cleaned_data.update( fs_resource_handler.get_rom_cover( overwrite=True, diff --git a/backend/endpoints/search.py b/backend/endpoints/search.py index c103d214b..3f9e88011 100644 --- a/backend/endpoints/search.py +++ b/backend/endpoints/search.py @@ -73,10 +73,14 @@ async def search_rom( search_term, rom.platform.moby_id ) - merged_dict = {item["name"]: item for item in igdb_matched_roms} + merged_dict = { + item["name"]: {**item, "igdb_url_cover": item.pop("url_cover", "")} + for item in igdb_matched_roms + } for item in moby_matched_roms: merged_dict[item["name"]] = { **item, + "moby_url_cover": item.pop("url_cover", ""), **merged_dict.get(item.get("name", ""), {}), } @@ -86,7 +90,8 @@ async def search_rom( "slug": "", "name": "", "summary": "", - "url_cover": "", + "igdb_url_cover": "", + "moby_url_cover": "", "url_screenshots": [], }, **item, diff --git a/frontend/src/__generated__/models/SearchRomSchema.ts b/frontend/src/__generated__/models/SearchRomSchema.ts index 354de245d..035818997 100644 --- a/frontend/src/__generated__/models/SearchRomSchema.ts +++ b/frontend/src/__generated__/models/SearchRomSchema.ts @@ -9,7 +9,8 @@ export type SearchRomSchema = { slug: string; name: string; summary: string; - url_cover: string; + igdb_url_cover?: string; + moby_url_cover?: string; url_screenshots: Array; }; diff --git a/frontend/src/components/Details/Info/FileInfo.vue b/frontend/src/components/Details/Info/FileInfo.vue index b639e7936..4991f2482 100644 --- a/frontend/src/components/Details/Info/FileInfo.vue +++ b/frontend/src/components/Details/Info/FileInfo.vue @@ -14,7 +14,7 @@ const downloadStore = storeDownload(); class="align-center my-3" no-gutters > - + Ver. @@ -22,7 +22,7 @@ const downloadStore = storeDownload(); - + File @@ -30,7 +30,7 @@ const downloadStore = storeDownload(); - + Files @@ -51,7 +51,7 @@ const downloadStore = storeDownload(); - + Size @@ -59,7 +59,7 @@ const downloadStore = storeDownload(); - + Tags diff --git a/frontend/src/components/Details/Info/GameInfo.vue b/frontend/src/components/Details/Info/GameInfo.vue index 83862fd53..2b4832a84 100644 --- a/frontend/src/components/Details/Info/GameInfo.vue +++ b/frontend/src/components/Details/Info/GameInfo.vue @@ -11,7 +11,7 @@ const galleryFilter = storeGalleryFilter();
{{ matchedRom.name }} @@ -342,9 +369,15 @@ onBeforeUnmount(() => { + + diff --git a/frontend/src/services/api/rom.ts b/frontend/src/services/api/rom.ts index daf34fc7a..7729ab7c4 100644 --- a/frontend/src/services/api/rom.ts +++ b/frontend/src/services/api/rom.ts @@ -156,6 +156,7 @@ async function updateRom({ formData.append("name", rom.name || ""); formData.append("file_name", rom.file_name); formData.append("summary", rom.summary || ""); + formData.append("url_cover", rom.url_cover || ""); if (rom.artwork) formData.append("artwork", rom.artwork[0]); return api.put(`/roms/${rom.id}`, formData, { diff --git a/frontend/src/types/emitter.d.ts b/frontend/src/types/emitter.d.ts index 429c83dc2..dfb0a5b4f 100644 --- a/frontend/src/types/emitter.d.ts +++ b/frontend/src/types/emitter.d.ts @@ -1,4 +1,4 @@ -import type { SaveSchema, StateSchema } from "@/__generated__"; +import type { SaveSchema, SearchRomSchema, StateSchema } from "@/__generated__"; import type { Platform } from "@/stores/platforms"; import type { Rom } from "@/stores/roms"; import type { User } from "@/stores/users"; @@ -18,6 +18,7 @@ export type SnackbarStatus = { export type Events = { showDeletePlatformDialog: Platform; showMatchRomDialog: Rom; + showSelectSourceDialog: SearchRomSchema; showSearchRomDialog: null; showEditRomDialog: Rom; showDeleteRomDialog: Rom[]; diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue index 7f821acc6..957a74b18 100644 --- a/frontend/src/views/Home.vue +++ b/frontend/src/views/Home.vue @@ -10,7 +10,7 @@ import LoadingDialog from "@/components/Dialog/Loading.vue"; import DeletePlatformDialog from "@/components/Dialog/Platform/DeletePlatform.vue"; import DeleteRomDialog from "@/components/Dialog/Rom/DeleteRom.vue"; import EditRomDialog from "@/components/Dialog/Rom/EditRom.vue"; -import MatchRomDialog from "@/components/Dialog/Rom/MatchRom.vue"; +import MatchRomDialog from "@/components/Dialog/Rom/MatchRom/MatchRom.vue"; import SearchRomDialog from "@/components/Dialog/Rom/SearchRom.vue"; import UploadRomDialog from "@/components/Dialog/Rom/UploadRom.vue"; import CreateUserDialog from "@/components/Dialog/User/CreateUser.vue"; From 6729a21b3f67a6d968e8ba511a3b51b2a5c0865e Mon Sep 17 00:00:00 2001 From: zurdi Date: Thu, 11 Apr 2024 18:48:46 +0200 Subject: [PATCH 52/61] source filter to match rom dialog added --- .../Dialog/Rom/MatchRom/MatchRom.vue | 63 +++++++++++++++++-- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/Dialog/Rom/MatchRom/MatchRom.vue b/frontend/src/components/Dialog/Rom/MatchRom/MatchRom.vue index 2f077aafd..861f9d942 100644 --- a/frontend/src/components/Dialog/Rom/MatchRom/MatchRom.vue +++ b/frontend/src/components/Dialog/Rom/MatchRom/MatchRom.vue @@ -1,8 +1,8 @@ diff --git a/frontend/src/components/Dialog/Rom/MatchRom/MatchRom.vue b/frontend/src/components/Dialog/Rom/MatchRom/MatchRom.vue index e20ce9fc1..6bf51de43 100644 --- a/frontend/src/components/Dialog/Rom/MatchRom/MatchRom.vue +++ b/frontend/src/components/Dialog/Rom/MatchRom/MatchRom.vue @@ -2,6 +2,7 @@ import type { SearchRomSchema } from "@/__generated__"; import SelectSourceDialog from "@/components/Dialog/Rom/MatchRom/SelectSource.vue"; import romApi from "@/services/api/rom"; +import storeHeartbeat from "@/stores/heartbeat"; import storeRoms, { type Rom } from "@/stores/roms"; import type { Events } from "@/types/emitter"; import type { Emitter } from "mitt"; @@ -21,6 +22,7 @@ const matchedRoms = ref([]); const filteredMatchedRoms = ref(); const theme = useTheme(); const emitter = inject>("emitter"); +const heartbeat = storeHeartbeat(); const isIGDBFiltered = ref(true); const isMobyFiltered = ref(true); emitter?.on("showMatchRomDialog", (romToSearch) => { @@ -184,6 +186,7 @@ onBeforeUnmount(() => { open-delay="500" >