| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | import ImageProvider, {ProvidedImage} from "./ImageProvider"; | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  | import BaseUIElement from "../../UI/BaseUIElement"; | 
					
						
							|  |  |  | import Svg from "../../Svg"; | 
					
						
							| 
									
										
										
										
											2021-07-03 22:24:12 +02:00
										 |  |  | import {Utils} from "../../Utils"; | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | import {LicenseInfo} from "./LicenseInfo"; | 
					
						
							|  |  |  | import Constants from "../../Models/Constants"; | 
					
						
							| 
									
										
										
										
											2020-10-17 00:37:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | export class Mapillary extends ImageProvider { | 
					
						
							| 
									
										
										
										
											2020-10-17 00:37:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  |     public static readonly singleton = new Mapillary(); | 
					
						
							| 
									
										
										
										
											2021-10-01 02:57:41 +02:00
										 |  |  |     private static readonly valuePrefix = "https://a.mapillary.com" | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     public static readonly valuePrefixes = [Mapillary.valuePrefix, "http://mapillary.com", "https://mapillary.com", "http://www.mapillary.com", "https://www.mapillary.com"] | 
					
						
							|  |  |  |     defaultKeyPrefixes = ["mapillary", "image"] | 
					
						
							| 
									
										
										
										
											2021-09-15 01:33:52 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-11 17:35:24 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Returns the correct key for API v4.0 | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private static ExtractKeyFromURL(value: string): number { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let key: string; | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-15 01:33:52 +02:00
										 |  |  |         const newApiFormat = value.match(/https?:\/\/www.mapillary.com\/app\/\?pKey=([0-9]*)/) | 
					
						
							|  |  |  |         if (newApiFormat !== null) { | 
					
						
							| 
									
										
										
										
											2021-11-11 17:35:24 +01:00
										 |  |  |             key = newApiFormat[1] | 
					
						
							|  |  |  |         } else if (value.startsWith(Mapillary.valuePrefix)) { | 
					
						
							|  |  |  |             key = value.substring(0, value.lastIndexOf("?")).substring(value.lastIndexOf("/") + 1) | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-11 17:35:24 +01:00
										 |  |  |         const keyAsNumber = Number(key) | 
					
						
							|  |  |  |         if (!isNaN(keyAsNumber)) { | 
					
						
							|  |  |  |             return keyAsNumber | 
					
						
							| 
									
										
										
										
											2021-09-15 01:33:52 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-11 17:35:24 +01:00
										 |  |  |         return undefined | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SourceIcon(backlinkSource?: string): BaseUIElement { | 
					
						
							|  |  |  |         return Svg.mapillary_svg(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |     async ExtractUrls(key: string, value: string): Promise<Promise<ProvidedImage>[]> { | 
					
						
							| 
									
										
										
										
											2021-10-18 22:17:41 +02:00
										 |  |  |         return [this.PrepareUrlAsync(key, value)] | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  |     protected async DownloadAttribution(url: string): Promise<LicenseInfo> { | 
					
						
							| 
									
										
										
										
											2021-11-11 17:35:24 +01:00
										 |  |  |         const license = new LicenseInfo() | 
					
						
							|  |  |  |         license.artist = "Contributor name unavailable"; | 
					
						
							|  |  |  |         license.license = "CC BY-SA 4.0"; | 
					
						
							|  |  |  |         // license.license = "Creative Commons Attribution-ShareAlike 4.0 International License";
 | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  |         license.attributionRequired = true; | 
					
						
							|  |  |  |         return license | 
					
						
							| 
									
										
										
										
											2020-10-17 00:37:45 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     private async PrepareUrlAsync(key: string, value: string): Promise<ProvidedImage> { | 
					
						
							| 
									
										
										
										
											2021-11-11 17:35:24 +01:00
										 |  |  |         const mapillaryId = Mapillary.ExtractKeyFromURL(value) | 
					
						
							|  |  |  |         if (mapillaryId === undefined) { | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |             return undefined; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-11 17:35:24 +01:00
										 |  |  |         const metadataUrl = 'https://graph.mapillary.com/' + mapillaryId + '?fields=thumb_1024_url&&access_token=' + Constants.mapillary_client_token_v4; | 
					
						
							|  |  |  |         const response = await Utils.downloadJson(metadataUrl) | 
					
						
							|  |  |  |         const url = <string>response["thumb_1024_url"]; | 
					
						
							|  |  |  |         return { | 
					
						
							|  |  |  |             url: url, | 
					
						
							|  |  |  |             provider: this, | 
					
						
							|  |  |  |             key: key | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-10-17 00:37:45 +02:00
										 |  |  | } |