diff --git a/scripts/generateImageAnalysis.ts b/scripts/generateImageAnalysis.ts index b83f08c6bf..a970382385 100644 --- a/scripts/generateImageAnalysis.ts +++ b/scripts/generateImageAnalysis.ts @@ -95,7 +95,7 @@ export default class GenerateImageAnalysis extends Script { if (fs.existsSync(targetPath)) { return false } - const attribution = await Imgur.singleton.DownloadAttribution(image) + const attribution = await Imgur.singleton.DownloadAttribution({ url: image, }) if ((attribution.artist ?? "") === "") { // This is an invalid attribution. We save the raw response as well @@ -215,7 +215,7 @@ export default class GenerateImageAnalysis extends Script { skipped++ } else { try { - attribution = await Imgur.singleton.DownloadAttribution(image) + attribution = await Imgur.singleton.DownloadAttribution({ url: image }) await ScriptUtils.sleep(500) writeFileSync(cachedView, JSON.stringify(attribution)) dloaded++ diff --git a/src/Logic/ImageProviders/GenericImageProvider.ts b/src/Logic/ImageProviders/GenericImageProvider.ts index 1e98414ed3..c5c1ccc1f6 100644 --- a/src/Logic/ImageProviders/GenericImageProvider.ts +++ b/src/Logic/ImageProviders/GenericImageProvider.ts @@ -40,7 +40,7 @@ export default class GenericImageProvider extends ImageProvider { return undefined } - public DownloadAttribution(url: string) { + public DownloadAttribution(_) { return undefined } } diff --git a/src/Logic/ImageProviders/ImageProvider.ts b/src/Logic/ImageProviders/ImageProvider.ts index 539c67f9a7..d65ad3e111 100644 --- a/src/Logic/ImageProviders/ImageProvider.ts +++ b/src/Logic/ImageProviders/ImageProvider.ts @@ -67,7 +67,7 @@ export default abstract class ImageProvider { public abstract ExtractUrls(key: string, value: string): Promise[]> - public abstract DownloadAttribution(url: string): Promise + public abstract DownloadAttribution(providedImage: ProvidedImage): Promise public abstract apiUrls(): string[] diff --git a/src/Logic/ImageProviders/Imgur.ts b/src/Logic/ImageProviders/Imgur.ts index 9c0146de9e..1f85e095df 100644 --- a/src/Logic/ImageProviders/Imgur.ts +++ b/src/Logic/ImageProviders/Imgur.ts @@ -92,8 +92,9 @@ export class Imgur extends ImageProvider implements ImageUploader { * * */ - public async DownloadAttribution(url: string): Promise { - const hash = url.substr("https://i.imgur.com/".length).split(/\.jpe?g/i)[0] + public async DownloadAttribution(providedImage: {url: string}): Promise { + const url = providedImage.url + const hash = url.substr("https://i.imgur.com/".length).split(/\.jpe?g/i)[0] const apiUrl = "https://api.imgur.com/3/image/" + hash const response = await Utils.downloadJsonCached(apiUrl, 365 * 24 * 60 * 60, { diff --git a/src/Logic/ImageProviders/Mapillary.ts b/src/Logic/ImageProviders/Mapillary.ts index b9e6f70ca0..ee12b51a56 100644 --- a/src/Logic/ImageProviders/Mapillary.ts +++ b/src/Logic/ImageProviders/Mapillary.ts @@ -133,12 +133,21 @@ export class Mapillary extends ImageProvider { return [this.PrepareUrlAsync(key, value)] } - public async DownloadAttribution(_: string): Promise { + public async DownloadAttribution(providedImage: ProvidedImage): Promise { + const mapillaryId = providedImage.id + const metadataUrl = + "https://graph.mapillary.com/" + + mapillaryId + + "?fields=thumb_1024_url,thumb_original_url,captured_at,creator&access_token=" + + Constants.mapillary_client_token_v4 + const response = await Utils.downloadJsonCached(metadataUrl, 60 * 60) + const license = new LicenseInfo() - license.artist = undefined + license.artist = response["creator"]["username"] license.license = "CC BY-SA 4.0" // license.license = "Creative Commons Attribution-ShareAlike 4.0 International License"; license.attributionRequired = true + license.date = new Date(response["captured_at"]) return license } @@ -151,16 +160,19 @@ export class Mapillary extends ImageProvider { const metadataUrl = "https://graph.mapillary.com/" + mapillaryId + - "?fields=thumb_1024_url,thumb_original_url&access_token=" + + "?fields=thumb_1024_url,thumb_original_url,captured_at,creator&access_token=" + Constants.mapillary_client_token_v4 const response = await Utils.downloadJsonCached(metadataUrl, 60 * 60) const url = response["thumb_1024_url"] const url_hd = response["thumb_original_url"] - return { + const date = new Date() + date.setTime(response["captured_at"]) + return { id: "" + mapillaryId, url, url_hd, provider: this, + date, key, } } diff --git a/src/Logic/ImageProviders/WikidataImageProvider.ts b/src/Logic/ImageProviders/WikidataImageProvider.ts index 6de5039b41..27b3ca934f 100644 --- a/src/Logic/ImageProviders/WikidataImageProvider.ts +++ b/src/Logic/ImageProviders/WikidataImageProvider.ts @@ -53,7 +53,7 @@ export class WikidataImageProvider extends ImageProvider { return allImages } - public DownloadAttribution(_: string): Promise { + public DownloadAttribution(_): Promise { throw new Error("Method not implemented; shouldn't be needed!") } } diff --git a/src/Logic/ImageProviders/WikimediaImageProvider.ts b/src/Logic/ImageProviders/WikimediaImageProvider.ts index e5029f5748..456ef2e8dc 100644 --- a/src/Logic/ImageProviders/WikimediaImageProvider.ts +++ b/src/Logic/ImageProviders/WikimediaImageProvider.ts @@ -114,8 +114,8 @@ export class WikimediaImageProvider extends ImageProvider { return [Promise.resolve(this.UrlForImage("File:" + value))] } - public async DownloadAttribution(filename: string): Promise { - filename = WikimediaImageProvider.ExtractFileName(filename) + public async DownloadAttribution(img: ProvidedImage): Promise { + const filename = WikimediaImageProvider.ExtractFileName(img.url) if (filename === "") { return undefined diff --git a/src/UI/Image/ImageAttribution.svelte b/src/UI/Image/ImageAttribution.svelte index a7d7312683..f4535ff545 100644 --- a/src/UI/Image/ImageAttribution.svelte +++ b/src/UI/Image/ImageAttribution.svelte @@ -10,7 +10,7 @@ */ export let image: ProvidedImage let license: Store = UIEventSource.FromPromise( - image.provider?.DownloadAttribution(image.url) + image.provider?.DownloadAttribution(image) ) let icon = image.provider?.SourceIcon(image.id)?.SetClass("block h-8 w-8 pr-2") @@ -38,26 +38,28 @@ {/if} -
+
{#if $license.license !== undefined || $license.licenseShortName !== undefined}
{$license?.license ?? $license?.licenseShortName}
{/if} - {#if $license.date} -
- {$license.date.toLocaleDateString()} + {#if $license.views} +
+ + {$license.views}
{/if}
- {#if $license.views} -
- - {$license.views} + {#if $license.date} +
+ {$license.date.toLocaleDateString()}
{/if} + +
{/if}