| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | import $ from "jquery" | 
					
						
							| 
									
										
										
										
											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"; | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  | import {Utils} from "../../Utils"; | 
					
						
							|  |  |  | import Constants from "../../Models/Constants"; | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | import {LicenseInfo} from "./LicenseInfo"; | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  | export class Imgur extends ImageProvider { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     public static readonly defaultValuePrefix = ["https://i.imgur.com"] | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |     public static readonly singleton = new Imgur(); | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     public readonly defaultKeyPrefixes: string[] = ["image"]; | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  |     private constructor() { | 
					
						
							|  |  |  |         super(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static uploadMultiple( | 
					
						
							|  |  |  |         title: string, description: string, blobs: FileList, | 
					
						
							|  |  |  |         handleSuccessfullUpload: ((imageURL: string) => void), | 
					
						
							|  |  |  |         allDone: (() => void), | 
					
						
							| 
									
										
										
										
											2020-07-21 22:50:54 +02:00
										 |  |  |         onFail: ((reason: string) => void), | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  |         offset: number = 0) { | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (blobs.length == offset) { | 
					
						
							|  |  |  |             allDone(); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const blob = blobs.item(offset); | 
					
						
							|  |  |  |         const self = this; | 
					
						
							|  |  |  |         this.uploadImage(title, description, blob, | 
					
						
							|  |  |  |             (imageUrl) => { | 
					
						
							|  |  |  |                 handleSuccessfullUpload(imageUrl); | 
					
						
							|  |  |  |                 self.uploadMultiple( | 
					
						
							|  |  |  |                     title, description, blobs, | 
					
						
							|  |  |  |                     handleSuccessfullUpload, | 
					
						
							|  |  |  |                     allDone, | 
					
						
							| 
									
										
										
										
											2020-07-25 12:32:30 +02:00
										 |  |  |                     onFail, | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  |                     offset + 1); | 
					
						
							| 
									
										
										
										
											2020-07-21 22:50:54 +02:00
										 |  |  |             }, | 
					
						
							|  |  |  |             onFail | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-19 20:34:04 +01:00
										 |  |  |     static uploadImage(title: string, description: string, blob: File, | 
					
						
							| 
									
										
										
										
											2020-07-21 22:50:54 +02:00
										 |  |  |                        handleSuccessfullUpload: ((imageURL: string) => void), | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  |                        onFail: (reason: string) => void) { | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         const apiUrl = 'https://api.imgur.com/3/image'; | 
					
						
							|  |  |  |         const apiKey = '7070e7167f0a25a'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-30 01:13:18 +02:00
										 |  |  |         const settings = { | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  |             async: true, | 
					
						
							|  |  |  |             crossDomain: true, | 
					
						
							|  |  |  |             processData: false, | 
					
						
							|  |  |  |             contentType: false, | 
					
						
							|  |  |  |             type: 'POST', | 
					
						
							|  |  |  |             url: apiUrl, | 
					
						
							|  |  |  |             headers: { | 
					
						
							|  |  |  |                 Authorization: 'Client-ID ' + apiKey, | 
					
						
							|  |  |  |                 Accept: 'application/json', | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             mimeType: 'multipart/form-data', | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2020-08-30 01:13:18 +02:00
										 |  |  |         const formData = new FormData(); | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  |         formData.append('image', blob); | 
					
						
							|  |  |  |         formData.append("title", title); | 
					
						
							|  |  |  |         formData.append("description", description) | 
					
						
							|  |  |  |         // @ts-ignore
 | 
					
						
							|  |  |  |         settings.data = formData; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Response contains stringified JSON
 | 
					
						
							|  |  |  |         // Image URL available at response.data.link
 | 
					
						
							| 
									
										
										
										
											2021-02-15 17:44:19 +01:00
										 |  |  |         // @ts-ignore
 | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  |         $.ajax(settings).done(function (response) { | 
					
						
							|  |  |  |             response = JSON.parse(response); | 
					
						
							|  |  |  |             handleSuccessfullUpload(response.data.link); | 
					
						
							| 
									
										
										
										
											2020-06-28 00:06:23 +02:00
										 |  |  |         }).fail((reason) => { | 
					
						
							| 
									
										
										
										
											2020-07-21 22:50:54 +02:00
										 |  |  |             console.log("Uploading to IMGUR failed", reason); | 
					
						
							| 
									
										
										
										
											2021-02-15 17:44:19 +01:00
										 |  |  |             // @ts-ignore
 | 
					
						
							| 
									
										
										
										
											2020-07-30 11:30:04 +02:00
										 |  |  |             onFail(reason); | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  |     SourceIcon(): BaseUIElement { | 
					
						
							|  |  |  |         return undefined; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-07 16:34:51 +01:00
										 |  |  |     public async ExtractUrls(key: string, value: string): Promise<Promise<ProvidedImage>[]> { | 
					
						
							|  |  |  |         if (Imgur.defaultValuePrefix.some(prefix => value.startsWith(prefix))) { | 
					
						
							|  |  |  |             return [Promise.resolve({ | 
					
						
							|  |  |  |                 url: value, | 
					
						
							|  |  |  |                 key: key, | 
					
						
							|  |  |  |                 provider: this | 
					
						
							|  |  |  |             })] | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return [] | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-29 23:56:59 +02:00
										 |  |  |     protected DownloadAttribution: (url: string) => Promise<LicenseInfo> = async (url: string) => { | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  |         const hash = url.substr("https://i.imgur.com/".length).split(".jpg")[0]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const apiUrl = 'https://api.imgur.com/3/image/' + hash; | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  |         const response = await Utils.downloadJson(apiUrl, {Authorization: 'Client-ID ' + Constants.ImgurApiKey}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const descr: string = response.data.description ?? ""; | 
					
						
							|  |  |  |         const data: any = {}; | 
					
						
							|  |  |  |         for (const tag of descr.split("\n")) { | 
					
						
							|  |  |  |             const kv = tag.split(":"); | 
					
						
							|  |  |  |             const k = kv[0]; | 
					
						
							|  |  |  |             data[k] = kv[1]?.replace("\r", ""); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  |         const licenseInfo = new LicenseInfo(); | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  |         licenseInfo.licenseShortName = data.license; | 
					
						
							|  |  |  |         licenseInfo.artist = data.author; | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-26 17:36:39 +02:00
										 |  |  |         return licenseInfo | 
					
						
							| 
									
										
										
										
											2021-06-18 01:25:13 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-25 03:39:31 +02:00
										 |  |  | } |