From 0c48d42c2dc2e6254fea004f8226887a402a985c Mon Sep 17 00:00:00 2001 From: Huskydog9988 <39809509+Huskydog9988@users.noreply.github.com> Date: Thu, 8 May 2025 11:57:13 -0400 Subject: [PATCH] fix: missing metadata preventing game import when a metadata provider fails to import a game's developer / publisher, the import is no longer blocked. the imports usally fail because there isn't a page for these compaines --- server/internal/metadata/giantbomb.ts | 8 ++++++-- server/internal/metadata/igdb.ts | 16 +++++++++++----- server/internal/metadata/index.ts | 22 ++++++++++++++-------- server/internal/metadata/pcgamingwiki.ts | 10 +++++++--- server/internal/metadata/types.d.ts | 4 ++-- 5 files changed, 40 insertions(+), 20 deletions(-) diff --git a/server/internal/metadata/giantbomb.ts b/server/internal/metadata/giantbomb.ts index 9ff186a..2fa4d09 100644 --- a/server/internal/metadata/giantbomb.ts +++ b/server/internal/metadata/giantbomb.ts @@ -175,14 +175,18 @@ export class GiantBombProvider implements MetadataProvider { const publishers: Publisher[] = []; if (gameData.publishers) { for (const pub of gameData.publishers) { - publishers.push(await publisher(pub.name)); + const res = await publisher(pub.name); + if (res === undefined) continue; + publishers.push(res); } } const developers: Developer[] = []; if (gameData.developers) { for (const dev of gameData.developers) { - developers.push(await developer(dev.name)); + const res = await developer(dev.name); + if (res === undefined) continue; + developers.push(res); } } diff --git a/server/internal/metadata/igdb.ts b/server/internal/metadata/igdb.ts index d3682ec..ed7718a 100644 --- a/server/internal/metadata/igdb.ts +++ b/server/internal/metadata/igdb.ts @@ -334,10 +334,16 @@ export class IGDBProvider implements MetadataProvider { for (const company of findCompanyResponse) { // if company was a dev or publisher // CANNOT use else since a company can be both - if (foundInvolved.developer) - developers.push(await developer(company.name)); - if (foundInvolved.publisher) - publishers.push(await publisher(company.name)); + if (foundInvolved.developer) { + const res = await developer(company.name); + if (res === undefined) continue; + developers.push(res); + } + if (foundInvolved.publisher) { + const res = await publisher(company.name); + if (res === undefined) continue; + publishers.push(res); + } } } } @@ -403,7 +409,7 @@ export class IGDBProvider implements MetadataProvider { return metadata; } - throw new Error("No results found"); + throw new Error(`igdb failed to find publisher/developer ${query}`); } async fetchDeveloper( params: _FetchDeveloperMetadataParams, diff --git a/server/internal/metadata/index.ts b/server/internal/metadata/index.ts index daddd65..b16edbe 100644 --- a/server/internal/metadata/index.ts +++ b/server/internal/metadata/index.ts @@ -39,10 +39,10 @@ export abstract class MetadataProvider { abstract fetchGame(params: _FetchGameMetadataParams): Promise; abstract fetchPublisher( params: _FetchPublisherMetadataParams, - ): Promise; + ): Promise; abstract fetchDeveloper( params: _FetchDeveloperMetadataParams, - ): Promise; + ): Promise; } export class MetadataHandler { @@ -192,7 +192,7 @@ export class MetadataHandler { query, "fetchDeveloper", "developer", - )) as Developer; + )) as Developer | undefined; } async fetchPublisher(query: string) { @@ -200,7 +200,7 @@ export class MetadataHandler { query, "fetchPublisher", "publisher", - )) as Publisher; + )) as Publisher | undefined; } // Careful with this function, it has no typechecking @@ -226,9 +226,14 @@ export class MetadataHandler { {}, ["internal:read"], ); - let result: PublisherMetadata; + let result: PublisherMetadata | undefined; try { result = await provider[functionName]({ query, createObject }); + if (result === undefined) { + throw new Error( + `${provider.source()} failed to find a ${databaseName} for "${query}`, + ); + } } catch (e) { console.warn(e); dumpObjects(); @@ -257,9 +262,10 @@ export class MetadataHandler { return object; } - throw new Error( - `No metadata provider found a ${databaseName} for "${query}"`, - ); + // throw new Error( + // `No metadata provider found a ${databaseName} for "${query}"`, + // ); + return undefined; } } diff --git a/server/internal/metadata/pcgamingwiki.ts b/server/internal/metadata/pcgamingwiki.ts index 7e94f67..e2511ec 100644 --- a/server/internal/metadata/pcgamingwiki.ts +++ b/server/internal/metadata/pcgamingwiki.ts @@ -171,7 +171,9 @@ export class PCGamingWikiProvider implements MetadataProvider { if (game.Publishers !== null) { const pubListClean = this.parseCompanyStr(game.Publishers); for (const pub of pubListClean) { - publishers.push(await publisher(pub)); + const res = await publisher(pub); + if (res === undefined) continue; + publishers.push(res); } } @@ -179,7 +181,9 @@ export class PCGamingWikiProvider implements MetadataProvider { if (game.Developers !== null) { const devListClean = this.parseCompanyStr(game.Developers); for (const dev of devListClean) { - developers.push(await developer(dev)); + const res = await developer(dev); + if (res === undefined) continue; + developers.push(res); } } @@ -249,7 +253,7 @@ export class PCGamingWikiProvider implements MetadataProvider { return metadata; } - throw new Error("Error in pcgamingwiki, no publisher"); + throw new Error(`pcgamingwiki failed to find publisher/developer ${query}`); } async fetchDeveloper( diff --git a/server/internal/metadata/types.d.ts b/server/internal/metadata/types.d.ts index 97db57d..251060a 100644 --- a/server/internal/metadata/types.d.ts +++ b/server/internal/metadata/types.d.ts @@ -57,8 +57,8 @@ export interface _FetchGameMetadataParams { id: string; name: string; - publisher: (query: string) => Promise; - developer: (query: string) => Promise; + publisher: (query: string) => Promise; + developer: (query: string) => Promise; createObject: (data: TransactionDataType) => ObjectReference; }