forked from MapComplete/MapComplete
Refactoring: image providers use ID everywhere
This commit is contained in:
parent
d9c1fe3f74
commit
1ddfffcee0
6 changed files with 19 additions and 20 deletions
|
@ -124,8 +124,7 @@ export default abstract class ImageProvider {
|
||||||
): undefined | ProvidedImage[] | Promise<ProvidedImage[]>
|
): undefined | ProvidedImage[] | Promise<ProvidedImage[]>
|
||||||
|
|
||||||
public abstract DownloadAttribution(providedImage: {
|
public abstract DownloadAttribution(providedImage: {
|
||||||
url: string
|
id: string
|
||||||
id?: string
|
|
||||||
}): Promise<LicenseInfo>
|
}): Promise<LicenseInfo>
|
||||||
|
|
||||||
public abstract apiUrls(): string[]
|
public abstract apiUrls(): string[]
|
||||||
|
@ -142,7 +141,7 @@ export default abstract class ImageProvider {
|
||||||
id: string
|
id: string
|
||||||
}): Promise<Feature<Point, PanoramaView>> | undefined
|
}): Promise<Feature<Point, PanoramaView>> | undefined
|
||||||
|
|
||||||
public static async offerImageAsDownload(image: ProvidedImage) {
|
public static async offerImageAsDownload(image: { url_hd?: string, url: string }) {
|
||||||
const response = await fetch(image.url_hd ?? image.url)
|
const response = await fetch(image.url_hd ?? image.url)
|
||||||
const blob = await response.blob()
|
const blob = await response.blob()
|
||||||
Utils.offerContentsAsDownloadableFile(blob, new URL(image.url).pathname.split("/").at(-1), {
|
Utils.offerContentsAsDownloadableFile(blob, new URL(image.url).pathname.split("/").at(-1), {
|
||||||
|
|
|
@ -75,27 +75,27 @@ export class Imgur extends ImageProvider {
|
||||||
*
|
*
|
||||||
* const data = {"data":{"id":"I9t6B7B","title":"Station Knokke","description":"author:Pieter Vander Vennet\r\nlicense:CC-BY 4.0\r\nosmid:node\/9812712386","datetime":1655052078,"type":"image\/jpeg","animated":false,"width":2400,"height":1795,"size":910872,"views":2,"bandwidth":1821744,"vote":null,"favorite":false,"nsfw":false,"section":null,"account_url":null,"account_id":null,"is_ad":false,"in_most_viral":false,"has_sound":false,"tags":[],"ad_type":0,"ad_url":"","edited":"0","in_gallery":false,"link":"https:\/\/i.imgur.com\/I9t6B7B.jpg","ad_config":{"safeFlags":["not_in_gallery","share"],"highRiskFlags":[],"unsafeFlags":["sixth_mod_unsafe"],"wallUnsafeFlags":[],"showsAds":false,"showAdLevel":1}},"success":true,"status":200}
|
* const data = {"data":{"id":"I9t6B7B","title":"Station Knokke","description":"author:Pieter Vander Vennet\r\nlicense:CC-BY 4.0\r\nosmid:node\/9812712386","datetime":1655052078,"type":"image\/jpeg","animated":false,"width":2400,"height":1795,"size":910872,"views":2,"bandwidth":1821744,"vote":null,"favorite":false,"nsfw":false,"section":null,"account_url":null,"account_id":null,"is_ad":false,"in_most_viral":false,"has_sound":false,"tags":[],"ad_type":0,"ad_url":"","edited":"0","in_gallery":false,"link":"https:\/\/i.imgur.com\/I9t6B7B.jpg","ad_config":{"safeFlags":["not_in_gallery","share"],"highRiskFlags":[],"unsafeFlags":["sixth_mod_unsafe"],"wallUnsafeFlags":[],"showsAds":false,"showAdLevel":1}},"success":true,"status":200}
|
||||||
* Utils.injectJsonDownloadForTests("https://api.imgur.com/3/image/E0RuAK3", data)
|
* Utils.injectJsonDownloadForTests("https://api.imgur.com/3/image/E0RuAK3", data)
|
||||||
* const licenseInfo = await Imgur.singleton.DownloadAttribution({url: "https://i.imgur.com/E0RuAK3.jpg"})
|
* const licenseInfo = await Imgur.singleton.DownloadAttribution({id: "https://i.imgur.com/E0RuAK3.jpg"})
|
||||||
* const expected = new LicenseInfo()
|
* const expected = new LicenseInfo()
|
||||||
* expected.licenseShortName = "CC-BY 4.0"
|
* expected.licenseShortName = "CC-BY 4.0"
|
||||||
* expected.artist = "Pieter Vander Vennet"
|
* expected.artist = "Pieter Vander Vennet"
|
||||||
* expected.date = new Date(1655052078000)
|
* expected.date = new Date(1655052078000)
|
||||||
* expected.views = 2
|
* expected.views = 2
|
||||||
* licenseInfo // => expected
|
* licenseInfo // => expected
|
||||||
* const licenseInfoJpeg = await Imgur.singleton.DownloadAttribution({url:"https://i.imgur.com/E0RuAK3.jpeg"})
|
* const licenseInfoJpeg = await Imgur.singleton.DownloadAttribution({id:"https://i.imgur.com/E0RuAK3.jpeg"})
|
||||||
* licenseInfoJpeg // => expected
|
* licenseInfoJpeg // => expected
|
||||||
* const licenseInfoUpperCase = await Imgur.singleton.DownloadAttribution({url: "https://i.imgur.com/E0RuAK3.JPEG"})
|
* const licenseInfoUpperCase = await Imgur.singleton.DownloadAttribution({id: "https://i.imgur.com/E0RuAK3.JPEG"})
|
||||||
* licenseInfoUpperCase // => expected
|
* licenseInfoUpperCase // => expected
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public async DownloadAttribution(
|
public async DownloadAttribution(
|
||||||
providedImage: {
|
providedImage: {
|
||||||
url: string
|
id: string
|
||||||
},
|
},
|
||||||
withResponse?: (obj) => void
|
withResponse?: (obj) => void
|
||||||
): Promise<LicenseInfo> {
|
): Promise<LicenseInfo> {
|
||||||
const url = providedImage.url
|
const url = providedImage.id
|
||||||
const hash = url.substr("https://i.imgur.com/".length).split(/(\.jpe?g)|(\.png)/i)[0]
|
const hash = url.substr("https://i.imgur.com/".length).split(/(\.jpe?g)|(\.png)/i)[0]
|
||||||
|
|
||||||
const apiUrl = "https://api.imgur.com/3/image/" + hash
|
const apiUrl = "https://api.imgur.com/3/image/" + hash
|
||||||
|
|
|
@ -208,8 +208,7 @@ export default class PanoramaxImageProvider extends ImageProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
public async DownloadAttribution(providedImage: {
|
public async DownloadAttribution(providedImage: {
|
||||||
id: string,
|
id: string
|
||||||
url: string // Actually not used
|
|
||||||
}): Promise<LicenseInfo> {
|
}): Promise<LicenseInfo> {
|
||||||
const meta = await this.getInfoFor(providedImage.id)
|
const meta = await this.getInfoFor(providedImage.id)
|
||||||
|
|
||||||
|
|
|
@ -155,9 +155,9 @@ export class WikimediaImageProvider extends ImageProvider {
|
||||||
return [this.UrlForImage("File:" + value)]
|
return [this.UrlForImage("File:" + value)]
|
||||||
}
|
}
|
||||||
|
|
||||||
public async DownloadAttribution(img: { url: string }): Promise<LicenseInfo> {
|
public async DownloadAttribution(img: { id: string }): Promise<LicenseInfo> {
|
||||||
const filename = "File:" + WikimediaImageProvider.extractFileName(img.url)
|
const filename = "File:" + WikimediaImageProvider.extractFileName(img.id)
|
||||||
console.log("Downloading attribution for", filename, img.url)
|
console.log("Downloading attribution for", filename, img.id)
|
||||||
if (filename === "") {
|
if (filename === "") {
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ class CachedFetcher implements ImageFetcher {
|
||||||
private readonly _zoomlevel: number
|
private readonly _zoomlevel: number
|
||||||
private readonly cache: Map<number, Promise<(P4CPicture & { id: string })[]>> = new Map<
|
private readonly cache: Map<number, Promise<(P4CPicture & { id: string })[]>> = new Map<
|
||||||
number,
|
number,
|
||||||
Promise<P4CPicture[]>
|
Promise<(P4CPicture & { id: string })[]>
|
||||||
>()
|
>()
|
||||||
public readonly name: string
|
public readonly name: string
|
||||||
|
|
||||||
|
@ -124,8 +124,8 @@ class ImagesInLoadedDataFetcher implements ImageFetcher {
|
||||||
this._searchRadius = searchRadius
|
this._searchRadius = searchRadius
|
||||||
}
|
}
|
||||||
|
|
||||||
async fetchImages(lat: number, lon: number): Promise<P4CPicture[]> {
|
async fetchImages(lat: number, lon: number): Promise<(P4CPicture & { id: string })[]> {
|
||||||
const foundImages: P4CPicture[] = []
|
const foundImages: (P4CPicture & { id: string })[] = []
|
||||||
this.indexedFeatures.features.data.forEach((feature) => {
|
this.indexedFeatures.features.data.forEach((feature) => {
|
||||||
const props = feature.properties
|
const props = feature.properties
|
||||||
const images = []
|
const images = []
|
||||||
|
@ -149,6 +149,7 @@ class ImagesInLoadedDataFetcher implements ImageFetcher {
|
||||||
foundImages.push({
|
foundImages.push({
|
||||||
pictureUrl: image,
|
pictureUrl: image,
|
||||||
thumbUrl: image,
|
thumbUrl: image,
|
||||||
|
id: image,
|
||||||
coordinates: { lng: centerpoint[0], lat: centerpoint[1] },
|
coordinates: { lng: centerpoint[0], lat: centerpoint[1] },
|
||||||
provider: "OpenStreetMap",
|
provider: "OpenStreetMap",
|
||||||
details: {
|
details: {
|
||||||
|
@ -182,9 +183,10 @@ class ImagesFromPanoramaxFetcher implements ImageFetcher {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static convert(imageData: ImageData): P4CPicture {
|
private static convert(imageData: ImageData): P4CPicture & { id: string } {
|
||||||
const [lng, lat] = imageData.geometry.coordinates
|
const [lng, lat] = imageData.geometry.coordinates
|
||||||
return {
|
return {
|
||||||
|
id: imageData.id,
|
||||||
pictureUrl: imageData.assets.sd.href,
|
pictureUrl: imageData.assets.sd.href,
|
||||||
coordinates: { lng, lat },
|
coordinates: { lng, lat },
|
||||||
|
|
||||||
|
@ -205,7 +207,7 @@ class ImagesFromPanoramaxFetcher implements ImageFetcher {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async fetchImages(lat: number, lon: number): Promise<P4CPicture[]> {
|
public async fetchImages(lat: number, lon: number): Promise<(P4CPicture & { id: string })[]> {
|
||||||
const radiusSettings = [
|
const radiusSettings = [
|
||||||
{
|
{
|
||||||
place_fov_tolerance: 180,
|
place_fov_tolerance: 180,
|
||||||
|
@ -372,7 +374,7 @@ export class CombinedFetcher {
|
||||||
start_captured_at: maxage,
|
start_captured_at: maxage,
|
||||||
panoramas: "no",
|
panoramas: "no",
|
||||||
}),
|
}),
|
||||||
new P4CImageFetcher("mapillary"),
|
// new P4CImageFetcher("mapillary"),
|
||||||
new P4CImageFetcher("wikicommons"),
|
new P4CImageFetcher("wikicommons"),
|
||||||
].map((f) => new CachedFetcher(f))
|
].map((f) => new CachedFetcher(f))
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,6 @@
|
||||||
provider = panoramaInfo.properties.provider
|
provider = panoramaInfo.properties.provider
|
||||||
}
|
}
|
||||||
console.log(">>> Got:", panoramaInfo, "by", provider.name)
|
console.log(">>> Got:", panoramaInfo, "by", provider.name)
|
||||||
UI:
|
|
||||||
//actuallyDisplayed.set(image.properties.imageMeta)
|
//actuallyDisplayed.set(image.properties.imageMeta)
|
||||||
})
|
})
|
||||||
if (Array.isArray(nearbyFeatures)) {
|
if (Array.isArray(nearbyFeatures)) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue