import {Mapillary} from "./Mapillary"; import {WikimediaImageProvider} from "./WikimediaImageProvider"; import {Imgur} from "./Imgur"; import GenericImageProvider from "./GenericImageProvider"; import {UIEventSource} from "../UIEventSource"; import ImageProvider, {ProvidedImage} from "./ImageProvider"; import {WikidataImageProvider} from "./WikidataImageProvider"; /** * A generic 'from the interwebz' image picker, without attribution */ export default class AllImageProviders { public static ImageAttributionSource: ImageProvider[] = [ Imgur.singleton, Mapillary.singleton, WikidataImageProvider.singleton, WikimediaImageProvider.singleton, new GenericImageProvider([].concat(...Imgur.defaultValuePrefix, WikimediaImageProvider.commonsPrefix, ...Mapillary.valuePrefixes))] private static _cache: Map> = new Map>() public static LoadImagesFor(tags: UIEventSource, imagePrefix?: string): UIEventSource { const id = tags.data.id if (id === undefined) { return undefined; } const cached = this._cache.get(tags.data.id) if (cached !== undefined) { return cached } const source = new UIEventSource([]) this._cache.set(id, source) const allSources = [] for (const imageProvider of AllImageProviders.ImageAttributionSource) { let prefixes = imageProvider.defaultKeyPrefixes if(imagePrefix !== undefined){ prefixes = [...prefixes] if(prefixes.indexOf("image") >= 0){ prefixes.splice(prefixes.indexOf("image"), 1) } prefixes.push(imagePrefix) } const singleSource = imageProvider.GetRelevantUrls(tags, { prefixes: prefixes }) allSources.push(singleSource) singleSource.addCallbackAndRunD(_ => { const all : ProvidedImage[] = [].concat(...allSources.map(source => source.data)) const uniq = [] const seen = new Set() for (const img of all) { if(seen.has(img.url)){ continue } seen.add(img.url) uniq.push(img) } source.setData(uniq) }) } return source; } }