diff --git a/ShareX/UploadTask.cs b/ShareX/UploadTask.cs index aa65c3b06..72002c09e 100644 --- a/ShareX/UploadTask.cs +++ b/ShareX/UploadTask.cs @@ -620,6 +620,9 @@ public UploadResult UploadImage(Stream stream, string fileName) case ImageDestination.Immio: imageUploader = new ImmioUploader(); break; + case ImageDestination.MediaCrush: + imageUploader = new MediaCrushUploader(); + break; case ImageDestination.CustomImageUploader: if (Program.UploadersConfig.CustomUploadersList.IsValidIndex(Program.UploadersConfig.CustomImageUploaderSelected)) { diff --git a/UploadersLib/Enums.cs b/UploadersLib/Enums.cs index 448cd63d2..baadd8a53 100644 --- a/UploadersLib/Enums.cs +++ b/UploadersLib/Enums.cs @@ -52,6 +52,8 @@ public enum ImageDestination yFrog, [Description("imm.io")] Immio, + [Description("MediaCrush")] + MediaCrush, [Description("Custom image uploader")] CustomImageUploader, [Description("File uploader")] diff --git a/UploadersLib/ImageUploaders/MediaCrushUploader.cs b/UploadersLib/ImageUploaders/MediaCrushUploader.cs new file mode 100644 index 000000000..afbb7c3a0 --- /dev/null +++ b/UploadersLib/ImageUploaders/MediaCrushUploader.cs @@ -0,0 +1,154 @@ +#region License Information (GPL v3) + +/* + ShareX - A program that allows you to take screenshots and share any file type + Copyright (C) 2008-2013 ShareX Developers + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Optionally you can also view the license at . +*/ +using System.Net; +using Newtonsoft.Json.Linq; +using System.Threading; +using Newtonsoft.Json; + +#endregion License Information (GPL v3) + +using System; +using System.IO; + +namespace UploadersLib.ImageUploaders +{ + public class MediaCrushUploader : ImageUploader + { + public MediaCrushUploader() + { + } + + public override UploadResult Upload(Stream stream, string fileName) + { + UploadResult result; + try + { + result = UploadData(stream, "https://mediacru.sh/api/upload/file", fileName, suppressWebExceptions: false); + } + catch (WebException e) + { + var response = e.Response as HttpWebResponse; + if (response == null) + throw; + if (response.StatusCode == HttpStatusCode.Conflict) + return HandleDuplicate(response); + throw; + } + var hash = JToken.Parse(result.Response)["hash"].Value(); + while (true) + { + var request = (HttpWebRequest)WebRequest.Create("https://mediacru.sh/api/" + hash + "/status"); + var httpResponse = request.GetResponse(); + JToken response; + using (var streamReader = new StreamReader(httpResponse)) + response = JToken.Parse(streamReader.ReadToEnd()); + var status = response["status"]; + var done = !(status == "processing" || status == "pending"); + if (!done) + { + Thread.Sleep(1000); + continue; + } + if (status == "done" || status == "ready") + { + var blob = response[hash].ToObject(); + return new UploadResult + { + DeletionURL = "https://mediacru.sh/" + blob.Hash + "/delete", + IsSuccess = true, + ThumbnailURL = "https://mediacru.sh" + blob.Files[0].Path, + URL = blob.Url, + IsURLExpected = false + }; + } + else + { + switch (status) + { + case "unrecognized": + // Note: MediaCrush accepts just about _every_ kind of media file, + // so the file itself is probably corrupted or just not actually a media file + throw new Exception("This file is not an acceptable file type."); + case "timeout": + throw new Exception("This file took too long to process."); + default: + throw new Exception("This file failed to process."); + } + } + } + } + + public UploadResult HandleDuplicate(HttpWebResponse httpResponse) + { + JToken response; + using (var streamReader = new StreamReader(httpResponse)) + response = JToken.Parse(streamReader.ReadToEnd()); + var hash = response["hash"].Value(); + var blob = response[hash].ToObject(); + return new UploadResult + { + DeletionURL = "https://mediacru.sh/" + blob.Hash + "/delete", + IsSuccess = true, + ThumbnailURL = "https://mediacru.sh" + blob.Files[0].Path, + URL = blob.Url, + IsURLExpected = false + }; + } + } + + internal class MediaCrushBlob + { + public class File + { + [JsonProperty("file")] + public string Path { get; set; } + [JsonProperty("type")] + public string Mimetype { get; set; } + } + + [JsonProperty("blob_type")] + public string BlobType { get; set; } + [JsonProperty("compression")] + public double Compression { get; set; } + [JsonProperty("files")] + public File[] Files { get; set; } + [JsonProperty("extras")] + public File[] Extras { get; set; } + [JsonProperty("original")] + public string Original { get; set; } + [JsonProperty("type")] + public string UserMimetype { get; set; } + [JsonProperty("hash")] + public string Hash { get; set; } + + [JsonIgnore] + public string Url + { + get + { + return "https://mediacru.sh/" + Hash; + } + } + } +} + diff --git a/UploadersLib/Uploader.cs b/UploadersLib/Uploader.cs index 65d9e71ff..ff56dc802 100644 --- a/UploadersLib/Uploader.cs +++ b/UploadersLib/Uploader.cs @@ -208,7 +208,8 @@ private HttpWebResponse GetResponseUsingPost(string url, Stream dataStream, stri } protected UploadResult UploadData(Stream dataStream, string url, string fileName, string fileFormName = "file", - Dictionary arguments = null, CookieCollection cookies = null, NameValueCollection headers = null) + Dictionary arguments = null, CookieCollection cookies = null, NameValueCollection headers = null, + bool suppressWebExceptions = true) { UploadResult result = new UploadResult(); @@ -237,6 +238,12 @@ protected UploadResult UploadData(Stream dataStream, string url, string fileName result.Response = ResponseToString(request.GetResponse()); result.IsSuccess = true; } + catch (WebException e) + { + if (!suppressWebExceptions) + throw; + if (!stopUpload) result.Response = AddWebError(e); + } catch (Exception e) { if (!stopUpload) result.Response = AddWebError(e); diff --git a/UploadersLib/UploadersLib.csproj b/UploadersLib/UploadersLib.csproj index 47f649c71..ff647c397 100644 --- a/UploadersLib/UploadersLib.csproj +++ b/UploadersLib/UploadersLib.csproj @@ -68,17 +68,10 @@ Off - - False - ..\packages\AsyncBridge.Net35.0.2.0\lib\net35-Client\AsyncBridge.Net35.dll - False ..\packages\MegaApiClient.1.0.0\lib\MegaApiClient.dll - - ..\packages\Newtonsoft.Json.5.0.8\lib\net35\Newtonsoft.Json.dll - False ..\packages\SSH.NET.2013.4.7\lib\net35\Renci.SshNet.dll @@ -95,10 +88,6 @@ - - False - ..\packages\TaskParallelLibrary.1.0.2856.0\lib\Net35\System.Threading.dll - @@ -106,6 +95,15 @@ 3.5 + + ..\packages\AsyncBridge.Net35.0.2.0\lib\net35-Client\AsyncBridge.Net35.dll + + + ..\packages\Newtonsoft.Json.5.0.8\lib\net35\Newtonsoft.Json.dll + + + ..\packages\TaskParallelLibrary.1.0.2856.0\lib\Net35\System.Threading.dll + @@ -302,6 +300,7 @@ +