import ImageProvider, {ProvidedImage} from "./ImageProvider"; import BaseUIElement from "../../UI/BaseUIElement"; import Svg from "../../Svg"; import {WikimediaImageProvider} from "./WikimediaImageProvider"; import Wikidata from "../Web/Wikidata"; export class WikidataImageProvider extends ImageProvider { public static readonly singleton = new WikidataImageProvider() public readonly defaultKeyPrefixes = ["wikidata"] private constructor() { super() } public SourceIcon(backlinkSource?: string): BaseUIElement { throw Svg.wikidata_svg(); } public async ExtractUrls(key: string, value: string): Promise[]> { const entity = await Wikidata.LoadWikidataEntryAsync(value) if (entity === undefined) { return [] } const allImages: Promise[] = [] // P18 is the claim 'depicted in this image' for (const img of Array.from(entity.claims.get("P18") ?? [])) { const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined, img) allImages.push(...promises) } // P373 is 'commons category' for (let cat of Array.from(entity.claims.get("P373") ?? [])) { if (!cat.startsWith("Category:")) { cat = "Category:" + cat } const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined, cat) allImages.push(...promises) } const commons = entity.commons if (commons !== undefined && (commons.startsWith("Category:") || commons.startsWith("File:"))) { const promises = await WikimediaImageProvider.singleton.ExtractUrls(undefined, commons) allImages.push(...promises) } return allImages } protected DownloadAttribution(url: string): Promise { throw new Error("Method not implemented; shouldn't be needed!"); } }