forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			51 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								import {Utils} from "../../Utils";
							 | 
						||
| 
								 | 
							
								import ImageProvider, {ProvidedImage} from "./ImageProvider";
							 | 
						||
| 
								 | 
							
								import BaseUIElement from "../../UI/BaseUIElement";
							 | 
						||
| 
								 | 
							
								import Svg from "../../Svg";
							 | 
						||
| 
								 | 
							
								import {WikimediaImageProvider} from "./WikimediaImageProvider";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export class WikidataImageProvider extends ImageProvider {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public SourceIcon(backlinkSource?: string): BaseUIElement {
							 | 
						||
| 
								 | 
							
								        throw Svg.wikidata_svg();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static readonly singleton = new WikidataImageProvider()
							 | 
						||
| 
								 | 
							
								    public readonly defaultKeyPrefixes = ["wikidata"]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    private constructor() {
							 | 
						||
| 
								 | 
							
								        super()
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected DownloadAttribution(url: string): Promise<any> {
							 | 
						||
| 
								 | 
							
								        throw new Error("Method not implemented; shouldn't be needed!");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public async ExtractUrls(key: string, value: string): Promise<Promise<ProvidedImage>[]> {
							 | 
						||
| 
								 | 
							
								        const wikidataUrl = "https://www.wikidata.org/wiki/"
							 | 
						||
| 
								 | 
							
								        if (value.startsWith(wikidataUrl)) {
							 | 
						||
| 
								 | 
							
								            value = value.substring(wikidataUrl.length)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (!value.startsWith("Q")) {
							 | 
						||
| 
								 | 
							
								            value = "Q" + value
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        const url = "https://www.wikidata.org/wiki/Special:EntityData/" + value + ".json";
							 | 
						||
| 
								 | 
							
								        const response = await Utils.downloadJson(url)
							 | 
						||
| 
								 | 
							
								        const entity = response.entities[value];
							 | 
						||
| 
								 | 
							
								        const commons = entity.sitelinks.commonswiki;
							 | 
						||
| 
								 | 
							
								        // P18 is the claim 'depicted in this image'
							 | 
						||
| 
								 | 
							
								        const image = entity.claims.P18?.[0]?.mainsnak?.datavalue?.value;
							 | 
						||
| 
								 | 
							
								        const allImages = []
							 | 
						||
| 
								 | 
							
								        if (image !== undefined) {
							 | 
						||
| 
								 | 
							
								            // We found a 'File://' 
							 | 
						||
| 
								 | 
							
								            const promises = await WikimediaImageProvider.singleton.ExtractUrls(key, image)
							 | 
						||
| 
								 | 
							
								            allImages.push(...promises)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (commons !== undefined) {
							 | 
						||
| 
								 | 
							
								            const promises = await WikimediaImageProvider.singleton.ExtractUrls(commons, image)
							 | 
						||
| 
								 | 
							
								            allImages.push(...promises)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return allImages
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |