2024-09-28 02:04:14 +02:00
|
|
|
import { Store, Stores, UIEventSource } from "../UIEventSource"
|
2021-09-29 23:56:59 +02:00
|
|
|
import BaseUIElement from "../../UI/BaseUIElement"
|
|
|
|
import { LicenseInfo } from "./LicenseInfo"
|
2021-10-07 22:06:47 +02:00
|
|
|
import { Utils } from "../../Utils"
|
2021-09-29 23:56:59 +02:00
|
|
|
|
|
|
|
export interface ProvidedImage {
|
2021-10-07 22:06:47 +02:00
|
|
|
url: string
|
2023-12-07 01:04:43 +01:00
|
|
|
url_hd?: string
|
2021-10-07 22:06:47 +02:00
|
|
|
key: string
|
2023-12-07 01:04:43 +01:00
|
|
|
provider: ImageProvider
|
2023-12-02 03:12:34 +01:00
|
|
|
id: string
|
2024-09-12 01:31:00 +02:00
|
|
|
date?: Date,
|
2024-09-28 02:04:14 +02:00
|
|
|
status?: string | "ready"
|
2024-09-12 01:31:00 +02:00
|
|
|
/**
|
|
|
|
* Compass angle of the taken image
|
|
|
|
* 0 = north, 90° = East
|
|
|
|
*/
|
|
|
|
rotation?: number
|
|
|
|
lat?: number,
|
|
|
|
lon?: number
|
2021-09-29 23:56:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export default abstract class ImageProvider {
|
2021-10-18 22:17:41 +02:00
|
|
|
public abstract readonly defaultKeyPrefixes: string[]
|
2022-09-08 21:40:48 +02:00
|
|
|
|
2024-07-27 12:59:38 +02:00
|
|
|
public abstract readonly name: string
|
|
|
|
|
2023-12-07 01:04:43 +01:00
|
|
|
public abstract SourceIcon(id?: string, location?: { lon: number; lat: number }): BaseUIElement
|
2021-09-29 23:56:59 +02:00
|
|
|
|
2024-09-28 02:04:14 +02:00
|
|
|
|
2021-09-29 23:56:59 +02:00
|
|
|
/**
|
2024-09-28 02:04:14 +02:00
|
|
|
* Gets all the relevant URLS for the given tags and for the given prefixes;
|
|
|
|
* extracts the necessary information
|
|
|
|
* @param tags
|
|
|
|
* @param prefixes
|
2021-09-29 23:56:59 +02:00
|
|
|
*/
|
2024-09-28 02:04:14 +02:00
|
|
|
public async getRelevantUrlsFor(tags: Record<string, string>, prefixes: string[]): Promise<ProvidedImage[]> {
|
|
|
|
const relevantUrls: ProvidedImage[] = []
|
2021-09-29 23:56:59 +02:00
|
|
|
const seenValues = new Set<string>()
|
2024-09-28 02:04:14 +02:00
|
|
|
|
|
|
|
for (const key in tags) {
|
|
|
|
if (!prefixes.some((prefix) => key === prefix || key.match(new RegExp(prefix+":[0-9]+")))) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
const values = Utils.NoEmpty(tags[key]?.split(";")?.map((v) => v.trim()) ?? [])
|
|
|
|
for (const value of values) {
|
|
|
|
if (seenValues.has(value)) {
|
2021-09-29 23:56:59 +02:00
|
|
|
continue
|
|
|
|
}
|
2024-09-28 02:04:14 +02:00
|
|
|
seenValues.add(value)
|
|
|
|
let images = this.ExtractUrls(key, value)
|
|
|
|
if(!Array.isArray(images)){
|
|
|
|
images = await images
|
|
|
|
}
|
|
|
|
if(images){
|
|
|
|
relevantUrls.push(...images)
|
2021-10-07 22:06:47 +02:00
|
|
|
}
|
2021-09-29 23:56:59 +02:00
|
|
|
}
|
2024-09-28 02:04:14 +02:00
|
|
|
}
|
2021-09-29 23:56:59 +02:00
|
|
|
return relevantUrls
|
|
|
|
}
|
|
|
|
|
2024-09-28 02:04:14 +02:00
|
|
|
public getRelevantUrls(tags: Record<string, string>, prefixes: string[]): Store<ProvidedImage[]> {
|
|
|
|
return Stores.FromPromise(this.getRelevantUrlsFor(tags, prefixes))
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public abstract ExtractUrls(key: string, value: string): undefined | ProvidedImage[] | Promise<ProvidedImage[]>
|
2021-10-07 22:06:47 +02:00
|
|
|
|
2024-07-21 10:52:51 +02:00
|
|
|
public abstract DownloadAttribution(providedImage: {
|
|
|
|
url: string
|
|
|
|
id: string
|
|
|
|
}): Promise<LicenseInfo>
|
2023-09-27 22:21:35 +02:00
|
|
|
|
|
|
|
public abstract apiUrls(): string[]
|
2021-09-29 23:56:59 +02:00
|
|
|
}
|