From 2014fc4bd7d72989cf063fcb709c89f23449235d Mon Sep 17 00:00:00 2001 From: Guilherme Date: Fri, 4 Aug 2023 15:34:35 -0300 Subject: [PATCH] api(giantbomb): support show more --- src/api/api.ts | 3 +-- src/api/giantbomb.ts | 31 +++++++++++++++++++++++++++---- src/api/index.ts | 2 +- src/api/jikan.ts | 2 +- src/types.d.ts | 1 + 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/api/api.ts b/src/api/api.ts index a89dad3..75ed7e9 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -44,8 +44,7 @@ export abstract class API { return results.filter(result => valid_results.has(result)) } - // eslint-disable-next-line - public async showMore(tab: string, selected: SearchResult): Promise { + public async showMore({} : { tab: string, selected: SearchResult }): Promise { return [] } } \ No newline at end of file diff --git a/src/api/giantbomb.ts b/src/api/giantbomb.ts index 8a328eb..5acd59d 100644 --- a/src/api/giantbomb.ts +++ b/src/api/giantbomb.ts @@ -12,28 +12,51 @@ interface APIResult { interface Result { id: number + guid: string name: string - image: { - original_url: string - } + image: Image +} + +interface Image { + original_url: string } export default class GiantBomb extends API { + readonly has_show_more = true readonly name = "giantbomb" readonly tabs = ["game", "character"] fetchURL(tab: string, query: string): { url: string } { return { - url: proxyImage(`https://www.giantbomb.com/api/search/?api_key=${api_key}&resources=${tab}&query=${encodeURI(query)}&format=json&field_list=id,name,image`) + url: proxyImage(`https://www.giantbomb.com/api/search/?api_key=${api_key}&resources=${tab}&query=${encodeURI(query)}&format=json&field_list=id,name,image,guid`) } } processResult(result: APIResult): SearchResult[] { return (result?.results ?? []).map((result: Result) => { return { + guid: result.guid, mal_id: result.id, title: result.name, image_url: proxyImage(result.image.original_url) } }) } + async showMore({ selected } : { selected: SearchResult}): Promise { + const id = ++this.last_id + const resp = await fetch(proxyImage(`https://www.giantbomb.com/api/images/${selected.guid}/?api_key=${api_key}&format=json&limit=30`)) + const result = await resp.json() + if (this.last_id > id) return [] + const image_set = new Set() + const fetch_result: SearchResult[] = (result.results ?? []).map((image: Image) => { + return { + title: selected.title, + image_url: proxyImage(image.original_url) + } + }).filter((result: SearchResult) => { + const is_duplicated = image_set.has(result.image_url) + image_set.add(result.image_url) + return !is_duplicated + }) + return fetch_result + } } diff --git a/src/api/index.ts b/src/api/index.ts index 8bc7fa5..4370028 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -78,7 +78,7 @@ const changeApi = async (newApi: string): Promise => { const showMore = async (tab: string): Promise => { if (selected.value == null) return - results.value = await api.showMore(tab, selected.value) + results.value = await api.showMore({ tab, selected: selected.value }) showing_more.value = true } diff --git a/src/api/jikan.ts b/src/api/jikan.ts index 7a22d4b..7f7bc34 100644 --- a/src/api/jikan.ts +++ b/src/api/jikan.ts @@ -41,7 +41,7 @@ export default class Jikan extends API { } }) } - async showMore(tab: string, selected: SearchResult): Promise { + async showMore({ tab, selected } : { tab: string, selected: SearchResult }): Promise { tab = this.denormalizeTab(tab) const id = ++this.last_id const resp = await fetch(`https://api.jikan.moe/v4/${tab}/${selected.mal_id}/pictures`) diff --git a/src/types.d.ts b/src/types.d.ts index c2d8abd..57542ea 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -5,6 +5,7 @@ export interface Update { } export interface SearchResult { + guid?: string mal_id: number title: string image_url: string