Merge MediaFire

This commit is contained in:
michalx2 2014-07-23 01:04:32 +02:00
commit b8e52ddf8a
10 changed files with 259 additions and 1 deletions

View file

@ -946,6 +946,11 @@ public UploadResult UploadFile(Stream stream, string fileName)
case FileDestination.MediaCrush:
fileUploader = new MediaCrushUploader();
break;
case FileDestination.MediaFire:
fileUploader = new MediaFire(APIKeys.MediaFireAppId, APIKeys.MediaFireApiKey,
Program.UploadersConfig.MediaFireUsername, Program.UploadersConfig.MediaFirePassword,
NameParser.Parse(NameParserType.URL, Program.UploadersConfig.MediaFirePath));
break;
}
if (fileUploader != null)

View file

@ -52,6 +52,8 @@ public static partial class APIKeys
public static string SendSpaceKey = "";
public static string Ge_ttKey = "";
public static string JiraConsumerKey = "";
public static string MediaFireAppId = "";
public static string MediaFireApiKey = "";
// Text Uploaders
public static string PastebinKey = "";

View file

@ -117,7 +117,9 @@ public enum FileDestination
[Description("Email")]
Email,
[Description("Custom file uploader")]
CustomFileUploader
CustomFileUploader,
[Description("MediaFire")]
MediaFire
}
[Description("URL shorteners"), DefaultValue(UrlShortenerType.BITLY)]

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View file

@ -0,0 +1,198 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace UploadersLib.FileUploaders
{
public sealed class MediaFire : FileUploader
{
private static readonly string _apiUrl = "https://www.mediafire.com/api/";
private static readonly string _viewUrl = "http://www.mediafire.com/view/?";
private static readonly int _pollInterval = 3000;
private readonly string _appId, _apiKey, _user, _pasw, _path;
private string _sessionToken, _signatureTime;
private int _signatureKey;
public MediaFire(string appId, string apiKey, string user, string pasw, string path)
{
_appId = appId;
_apiKey = apiKey;
_user = user;
_pasw = pasw;
_path = path;
}
public override UploadResult Upload(Stream stream, string fileName)
{
GetSessionToken();
string key = SimpleUpload(stream, fileName);
string quickKey = null;
while ((quickKey = PollUpload(key, fileName)) == null) System.Threading.Thread.Sleep(_pollInterval);
return new UploadResult() { IsSuccess = true, URL = _viewUrl + quickKey };
}
private void GetSessionToken()
{
var args = new Dictionary<string, string>();
args.Add("email", _user);
args.Add("password", _pasw);
args.Add("application_id", _appId);
args.Add("token_version", "2");
args.Add("response_format", "json");
args.Add("signature", GetInitSignature());
string respStr = SendRequest(HttpMethod.POST, _apiUrl + "user/get_session_token.php", args);
GetSessionTokenResponse resp = DeserializeResponse<GetSessionTokenResponse>(respStr);
EnsureSuccess(resp);
if (resp.session_token == null || resp.time == null || resp.secret_key == null)
throw new IOException("Invalid response");
_sessionToken = resp.session_token;
_signatureTime = resp.time;
_signatureKey = (int)resp.secret_key;
}
private string SimpleUpload(Stream stream, string fileName)
{
var args = new Dictionary<string, string>();
args.Add("session_token", _sessionToken);
args.Add("path", _path);
args.Add("response_format", "json");
args.Add("signature", GetSignature("upload/simple.php", args));
string url = CreateQuery(_apiUrl + "upload/simple.php", args);
UploadResult res = UploadData(stream, url, fileName, "Filedata");
if (!res.IsSuccess) throw new IOException(res.ErrorsToString());
SimpleUploadResponse resp = DeserializeResponse<SimpleUploadResponse>(res.Response);
EnsureSuccess(resp);
if (resp.doupload.result != 0 || resp.doupload.key == null) throw new IOException("Invalid response");
return resp.doupload.key;
}
private string PollUpload(string uploadKey, string fileName)
{
var args = new Dictionary<string, string>();
args.Add("session_token", _sessionToken);
args.Add("key", uploadKey);
args.Add("filename", fileName);
args.Add("response_format", "json");
args.Add("signature", GetSignature("upload/poll_upload.php", args));
string respStr = SendRequest(HttpMethod.POST, _apiUrl + "upload/poll_upload.php", args);
PollUploadResponse resp = DeserializeResponse<PollUploadResponse>(respStr);
EnsureSuccess(resp);
if (resp.doupload.result == null || resp.doupload.status == null) throw new IOException("Invalid response");
if (resp.doupload.result != 0 || resp.doupload.fileerror != null) {
throw new IOException(string.Format("Couldn't upload the file: {0}", resp.doupload.description
?? "Unknown error"));
}
if (resp.doupload.status == 99) {
if (resp.doupload.quickkey == null) throw new IOException("Invalid response");
return resp.doupload.quickkey;
}
return null;
}
private void EnsureSuccess(MFResponse resp)
{
if (resp.result != "Success")
throw new IOException(string.Format("Couldn't upload the file: {0}", resp.message ?? "Unknown error"));
if (resp.new_key == "yes") NextSignatureKey();
}
private string GetInitSignature()
{
string signatureStr = _user + _pasw + _appId + _apiKey;
byte[] signatureBytes = Encoding.ASCII.GetBytes(signatureStr);
System.Security.Cryptography.SHA1 sha1Gen = System.Security.Cryptography.SHA1.Create();
byte[] sha1Bytes = sha1Gen.ComputeHash(signatureBytes);
return BytesToString(sha1Bytes);
}
private string GetSignature(string urlSuffix, Dictionary<string,string> args)
{
string keyStr = (_signatureKey % 256).ToString(System.Globalization.CultureInfo.InvariantCulture);
string urlStr = CreateNonEscapedQuery("/api/" + urlSuffix, args);
string signatureStr = keyStr + _signatureTime + urlStr;
byte[] signatureBytes = Encoding.ASCII.GetBytes(signatureStr);
System.Security.Cryptography.MD5 md5gen = System.Security.Cryptography.MD5.Create();
byte[] md5Bytes = md5gen.ComputeHash(signatureBytes);
return BytesToString(md5Bytes);
}
void NextSignatureKey()
{
_signatureKey = (int)(((long)_signatureKey * 16807) % 2147483647);
}
private T DeserializeResponse<T>(string s) where T : new()
{
var refObj = new { response = new T() };
var obj = JsonConvert.DeserializeObject(s, refObj.GetType());
return (T)obj.GetType().GetProperty("response").GetValue(obj, null);
}
private static char IntToChar(int x)
{
if (x < 10) return (char)(x + '0');
return (char)(x - 10 + 'a');
}
private static string BytesToString(byte[] b)
{
char[] res = new char[b.Length * 2];
for (int i = 0; i < b.Length; ++i) {
res[2 * i] = IntToChar(b[i] >> 4);
res[2 * i + 1] = IntToChar(b[i] & 0xf);
}
return new string(res);
}
private static string CreateNonEscapedQuery(string url, Dictionary<string, string> args)
{
if (args != null && args.Count > 0)
return url + "?" + string.Join("&", args.Select(x => x.Key + "=" + x.Value).ToArray());
return url;
}
private class MFResponse
{
public string result { get; set; }
public int? error { get; set; }
public string message { get; set; }
public string new_key { get; set; }
}
private class GetSessionTokenResponse : MFResponse
{
public string session_token { get; set; }
public int? secret_key { get; set; }
public string time { get; set; }
}
private class SimpleUploadResponse : MFResponse
{
public DoUpload doupload { get; set; }
public class DoUpload
{
public int? result { get; set; }
public string key { get; set; }
}
}
private class PollUploadResponse : MFResponse
{
public DoUpload doupload { get; set; }
public class DoUpload
{
public int? result { get; set; }
public int? status { get; set; }
public string description { get; set; }
public int? fileerror { get; set; }
public string quickkey { get; set; }
}
}
}
}

View file

@ -100,6 +100,7 @@ private void FormSettings()
uploadersImageList.Images.Add("Twitter", Resources.Twitter);
uploadersImageList.Images.Add("ownCloud", Resources.OwnCloud);
uploadersImageList.Images.Add("AdFly", Resources.AdFly);
uploadersImageList.Images.Add("MediaFire", Resources.MediaFire);
tpImageShack.ImageKey = "ImageShack";
tpTinyPic.ImageKey = "TinyPic";
@ -134,6 +135,7 @@ private void FormSettings()
tpAmazonS3.ImageKey = "AmazonS3";
tpOwnCloud.ImageKey = "ownCloud";
tpAdFly.ImageKey = "AdFly";
tpMediaFire.ImageKey = "MediaFire";
ttlvMain.ImageList = uploadersImageList;
ttlvMain.MainTabControl = tcUploaders;
@ -142,6 +144,7 @@ private void FormSettings()
NameParser.CreateCodesMenu(txtDropboxPath, ReplacementVariables.n, ReplacementVariables.t, ReplacementVariables.pn);
NameParser.CreateCodesMenu(txtCopyPath, ReplacementVariables.n, ReplacementVariables.t, ReplacementVariables.pn);
NameParser.CreateCodesMenu(txtAmazonS3ObjectPrefix, ReplacementVariables.n, ReplacementVariables.t, ReplacementVariables.pn);
NameParser.CreateCodesMenu(txtMediaFirePath, ReplacementVariables.n, ReplacementVariables.t, ReplacementVariables.pn);
NameParser.CreateCodesMenu(txtCustomUploaderArgValue, ReplacementVariables.n);
txtCustomUploaderLog.AddContextMenu();
@ -488,6 +491,12 @@ public void LoadSettings(UploadersConfig uploadersConfig)
cbOwnCloudCreateShare.Checked = Config.OwnCloudCreateShare;
cbOwnCloudDirectLink.Checked = Config.OwnCloudDirectLink;
// MediaFire
txtMediaFireUsername.Text = Config.MediaFireUsername;
txtMediaFirePassword.Text = Config.MediaFirePassword;
txtMediaFirePath.Text = Config.MediaFirePath;
#endregion File uploaders
#region URL Shorteners
@ -1778,6 +1787,25 @@ private void SettingsGrid_LocalhostPropertyValueChanged(object s, PropertyValueC
#endregion Shared folder
#region MediaFire
private void txtMediaFireUsername_TextChanged(object sender, EventArgs e)
{
Config.MediaFireUsername = txtMediaFireUsername.Text;
}
private void txtMediaFirePassword_TextChanged(object sender, EventArgs e)
{
Config.MediaFirePassword = txtMediaFirePassword.Text;
}
private void txtMediaFirePath_TextChanged(object sender, EventArgs e)
{
Config.MediaFirePath = txtMediaFirePath.Text;
}
#endregion
#endregion File Uploaders
#region URL Shorteners

View file

@ -300,6 +300,16 @@ internal class Resources {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon MediaFire {
get {
object obj = ResourceManager.GetObject("MediaFire", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>

View file

@ -310,4 +310,7 @@
<data name="AdFly" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\favicons\adfly.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="MediaFire" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Favicons\MediaFire.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View file

@ -218,6 +218,12 @@ public class UploadersConfig : SettingsBase<UploadersConfig>
public bool OwnCloudCreateShare = true;
public bool OwnCloudDirectLink = false;
// MediaFire
public string MediaFireUsername = "";
public string MediaFirePassword = "";
public string MediaFirePath = "";
#endregion File uploaders
#region URL shorteners
@ -375,6 +381,8 @@ public bool IsValid(FileDestination destination)
PushbulletSettings.DeviceList.IsValidIndex(PushbulletSettings.SelectedDevice);
case FileDestination.OwnCloud:
return !string.IsNullOrEmpty(OwnCloudHost) && !string.IsNullOrEmpty(OwnCloudUsername) && !string.IsNullOrEmpty(OwnCloudPassword);
case FileDestination.MediaFire:
return !string.IsNullOrEmpty(MediaFireUsername) && !string.IsNullOrEmpty(MediaFirePassword);
}
return true;

View file

@ -109,6 +109,7 @@
<Compile Include="FileUploaders\GoogleDrive.cs" />
<Compile Include="FileUploaders\Jira.cs" />
<Compile Include="FileUploaders\Hostr.cs" />
<Compile Include="FileUploaders\MediaFire.cs" />
<Compile Include="FileUploaders\Mega.cs" />
<Compile Include="FileUploaders\OneDrive.cs" />
<Compile Include="FileUploaders\OwnCloud.cs" />
@ -426,6 +427,7 @@
<ItemGroup>
<Content Include="Favicons\AdFly.ico" />
<Content Include="Favicons\AmazonS3.ico" />
<None Include="Resources\MediaFire.ico" />
<None Include="Favicons\GitHub.ico" />
<Content Include="Favicons\Hostr.ico" />
<Content Include="Favicons\OwnCloud.png" />