2023-06-14 20:39:36 +02:00
|
|
|
import { Mapillary } from "./Mapillary"
|
|
|
|
import { WikimediaImageProvider } from "./WikimediaImageProvider"
|
|
|
|
import { Imgur } from "./Imgur"
|
|
|
|
import GenericImageProvider from "./GenericImageProvider"
|
|
|
|
import { Store, UIEventSource } from "../UIEventSource"
|
|
|
|
import ImageProvider, { ProvidedImage } from "./ImageProvider"
|
|
|
|
import { WikidataImageProvider } from "./WikidataImageProvider"
|
2021-06-22 14:21:32 +02:00
|
|
|
|
2021-09-29 23:56:59 +02:00
|
|
|
/**
|
|
|
|
* A generic 'from the interwebz' image picker, without attribution
|
|
|
|
*/
|
2021-09-09 00:05:51 +02:00
|
|
|
export default class AllImageProviders {
|
2024-02-21 00:13:11 +01:00
|
|
|
private static dontLoadFromPrefixes = ["https://photos.app.goo.gl/"]
|
|
|
|
|
2024-07-27 12:59:38 +02:00
|
|
|
/**
|
|
|
|
* The 'genericImageProvider' is a fallback that scans various other tags for tags, unless the URL starts with one of the given prefixes
|
|
|
|
*/
|
|
|
|
public static genericImageProvider = new GenericImageProvider([
|
|
|
|
...Imgur.defaultValuePrefix,
|
|
|
|
...WikimediaImageProvider.commonsPrefixes,
|
|
|
|
...Mapillary.valuePrefixes,
|
|
|
|
...AllImageProviders.dontLoadFromPrefixes,
|
|
|
|
"Category:",
|
|
|
|
])
|
|
|
|
|
|
|
|
private static ImageAttributionSource: ImageProvider[] = [
|
2021-09-29 23:56:59 +02:00
|
|
|
Imgur.singleton,
|
|
|
|
Mapillary.singleton,
|
|
|
|
WikidataImageProvider.singleton,
|
|
|
|
WikimediaImageProvider.singleton,
|
2024-07-27 12:59:38 +02:00
|
|
|
AllImageProviders.genericImageProvider
|
2021-10-06 17:48:07 +02:00
|
|
|
]
|
2023-09-27 22:21:35 +02:00
|
|
|
public static apiUrls: string[] = [].concat(
|
|
|
|
...AllImageProviders.ImageAttributionSource.map((src) => src.apiUrls())
|
|
|
|
)
|
|
|
|
public static defaultKeys = [].concat(
|
|
|
|
AllImageProviders.ImageAttributionSource.map((provider) => provider.defaultKeyPrefixes)
|
|
|
|
)
|
2022-05-06 12:41:24 +02:00
|
|
|
private static providersByName = {
|
|
|
|
imgur: Imgur.singleton,
|
|
|
|
mapillary: Mapillary.singleton,
|
|
|
|
wikidata: WikidataImageProvider.singleton,
|
|
|
|
wikimedia: WikimediaImageProvider.singleton,
|
|
|
|
}
|
2021-09-29 23:56:59 +02:00
|
|
|
private static _cache: Map<string, UIEventSource<ProvidedImage[]>> = new Map<
|
|
|
|
string,
|
|
|
|
UIEventSource<ProvidedImage[]>
|
|
|
|
>()
|
|
|
|
|
2023-09-27 22:21:35 +02:00
|
|
|
public static byName(name: string) {
|
|
|
|
return AllImageProviders.providersByName[name.toLowerCase()]
|
|
|
|
}
|
|
|
|
|
2024-07-27 12:59:38 +02:00
|
|
|
public static async selectBestProvider(key: string, value: string): Promise<ImageProvider> {
|
|
|
|
|
|
|
|
for (const imageProvider of AllImageProviders.ImageAttributionSource) {
|
|
|
|
try{
|
|
|
|
|
|
|
|
const extracted = await Promise.all(await imageProvider.ExtractUrls(key, value))
|
|
|
|
if(extracted?.length > 0){
|
|
|
|
return imageProvider
|
|
|
|
}
|
|
|
|
}catch (e) {
|
|
|
|
console.warn("Provider gave an error while trying to determine a match:", e)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return AllImageProviders.genericImageProvider
|
|
|
|
}
|
|
|
|
|
2023-06-14 20:39:36 +02:00
|
|
|
public static LoadImagesFor(
|
|
|
|
tags: Store<Record<string, string>>,
|
|
|
|
tagKey?: string[]
|
|
|
|
): Store<ProvidedImage[]> {
|
2021-10-08 04:33:39 +02:00
|
|
|
if (tags.data.id === undefined) {
|
2021-09-29 23:56:59 +02:00
|
|
|
return undefined
|
|
|
|
}
|
|
|
|
|
2021-11-07 16:34:51 +01:00
|
|
|
const cacheKey = tags.data.id + tagKey
|
2021-10-08 04:33:39 +02:00
|
|
|
const cached = this._cache.get(cacheKey)
|
2021-09-29 23:56:59 +02:00
|
|
|
if (cached !== undefined) {
|
|
|
|
return cached
|
|
|
|
}
|
|
|
|
|
|
|
|
const source = new UIEventSource([])
|
2021-10-08 04:33:39 +02:00
|
|
|
this._cache.set(cacheKey, source)
|
2024-07-27 12:59:38 +02:00
|
|
|
const allSources: Store<ProvidedImage[]>[] = []
|
2021-09-29 23:56:59 +02:00
|
|
|
for (const imageProvider of AllImageProviders.ImageAttributionSource) {
|
2021-10-01 02:57:41 +02:00
|
|
|
let prefixes = imageProvider.defaultKeyPrefixes
|
2021-11-07 16:34:51 +01:00
|
|
|
if (tagKey !== undefined) {
|
2021-10-20 00:09:40 +02:00
|
|
|
prefixes = tagKey
|
2021-10-01 02:57:41 +02:00
|
|
|
}
|
2021-11-07 16:34:51 +01:00
|
|
|
|
2021-09-30 00:26:21 +02:00
|
|
|
const singleSource = imageProvider.GetRelevantUrls(tags, {
|
2021-10-01 02:57:41 +02:00
|
|
|
prefixes: prefixes,
|
2021-09-30 00:26:21 +02:00
|
|
|
})
|
2021-09-29 23:56:59 +02:00
|
|
|
allSources.push(singleSource)
|
|
|
|
singleSource.addCallbackAndRunD((_) => {
|
2021-11-07 16:34:51 +01:00
|
|
|
const all: ProvidedImage[] = [].concat(...allSources.map((source) => source.data))
|
2021-09-29 23:56:59 +02:00
|
|
|
const uniq = []
|
|
|
|
const seen = new Set<string>()
|
|
|
|
for (const img of all) {
|
2021-11-07 16:34:51 +01:00
|
|
|
if (seen.has(img.url)) {
|
2021-09-29 23:56:59 +02:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
seen.add(img.url)
|
|
|
|
uniq.push(img)
|
|
|
|
}
|
|
|
|
source.setData(uniq)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
return source
|
|
|
|
}
|
2021-06-22 14:21:32 +02:00
|
|
|
}
|