From 77906e3203d271776042dbc381aef9bcfd2f112a Mon Sep 17 00:00:00 2001 From: Jaex Date: Tue, 1 Jul 2014 11:33:33 +0300 Subject: [PATCH] fixed #74: Google Drive metadata (title, folder) support, Uploader changes --- ShareX/UploadTask.cs | 3 +- UploadersLib/FileUploaders/Ge_tt.cs | 4 +- UploadersLib/FileUploaders/GoogleDrive.cs | 46 +++++++++++++--- UploadersLib/FileUploaders/Mega.cs | 4 +- UploadersLib/ImageUploaders/Picasa.cs | 2 +- UploadersLib/TextUploaders/Gist.cs | 2 +- .../URLShorteners/GoogleURLShortener.cs | 2 +- UploadersLib/Uploader.cs | 52 +++++++------------ UploadersLib/UploadersConfig.cs | 1 + 9 files changed, 69 insertions(+), 47 deletions(-) diff --git a/ShareX/UploadTask.cs b/ShareX/UploadTask.cs index 8955ed56c..cca9c8e90 100644 --- a/ShareX/UploadTask.cs +++ b/ShareX/UploadTask.cs @@ -804,7 +804,8 @@ public UploadResult UploadFile(Stream stream, string fileName) case FileDestination.GoogleDrive: fileUploader = new GoogleDrive(Program.UploadersConfig.GoogleDriveOAuth2Info) { - IsPublic = Program.UploadersConfig.GoogleDriveIsPublic + IsPublic = Program.UploadersConfig.GoogleDriveIsPublic, + FolderID = Program.UploadersConfig.GoogleDriveFolderID }; break; case FileDestination.RapidShare: diff --git a/UploadersLib/FileUploaders/Ge_tt.cs b/UploadersLib/FileUploaders/Ge_tt.cs index b6ae3a759..708f9f081 100644 --- a/UploadersLib/FileUploaders/Ge_tt.cs +++ b/UploadersLib/FileUploaders/Ge_tt.cs @@ -48,7 +48,7 @@ public Ge_ttLogin Login(string email, string password) string argsJSON = JsonConvert.SerializeObject(args); - string response = SendPostRequestJSON("https://open.ge.tt/1/users/login", argsJSON); + string response = SendRequestJSON("https://open.ge.tt/1/users/login", argsJSON); return JsonConvert.DeserializeObject(response); } @@ -76,7 +76,7 @@ public Ge_ttFile CreateFile(string accessToken, string shareName, string fileNam string argsJSON = JsonConvert.SerializeObject(args2); - string response = SendPostRequestJSON(url, argsJSON); + string response = SendRequestJSON(url, argsJSON); return JsonConvert.DeserializeObject(response); } diff --git a/UploadersLib/FileUploaders/GoogleDrive.cs b/UploadersLib/FileUploaders/GoogleDrive.cs index e7b97b0a9..24e213e9c 100644 --- a/UploadersLib/FileUploaders/GoogleDrive.cs +++ b/UploadersLib/FileUploaders/GoogleDrive.cs @@ -36,6 +36,7 @@ public sealed class GoogleDrive : FileUploader, IOAuth2 { public OAuth2Info AuthInfo { get; set; } public bool IsPublic { get; set; } + public string FolderID { get; set; } public GoogleDrive(OAuth2Info oauth) { @@ -130,6 +131,39 @@ public bool CheckAuthorization() return true; } + public void SetMetadata(string fileID, string title, string parentID = null) + { + string url = string.Format("https://www.googleapis.com/drive/v2/files/{0}", fileID); + + object metadata; + + if (!string.IsNullOrEmpty(parentID)) + { + metadata = new + { + title = title, + parents = new[] + { + new + { + id = parentID + } + } + }; + } + else + { + metadata = new + { + title = title + }; + } + + string json = JsonConvert.SerializeObject(metadata); + + string response = SendRequestJSON(url, json, headers: GetAuthHeaders(), method: HttpMethod.PUT); + } + public void SetPermissions(string fileID, GoogleDrivePermissionRole role, GoogleDrivePermissionType type, string value, bool withLink) { string url = string.Format("https://www.googleapis.com/drive/v2/files/{0}/permissions", fileID); @@ -142,7 +176,7 @@ public void SetPermissions(string fileID, GoogleDrivePermissionRole role, Google withLink = withLink.ToString() }); - string response = SendPostRequestJSON(url, json, headers: GetAuthHeaders()); + string response = SendRequestJSON(url, json, headers: GetAuthHeaders()); } public override UploadResult Upload(Stream stream, string fileName) @@ -152,10 +186,7 @@ public override UploadResult Upload(Stream stream, string fileName) return null; } - Dictionary args = new Dictionary(); - args.Add("title", fileName); - - UploadResult result = UploadData(stream, "https://www.googleapis.com/upload/drive/v2/files", fileName, "file", args, headers: GetAuthHeaders()); + UploadResult result = UploadData(stream, "https://www.googleapis.com/upload/drive/v2/files", fileName, "file", headers: GetAuthHeaders()); if (!string.IsNullOrEmpty(result.Response)) { @@ -163,9 +194,12 @@ public override UploadResult Upload(Stream stream, string fileName) if (upload != null) { + AllowReportProgress = false; + + SetMetadata(upload.id, fileName, FolderID); + if (IsPublic) { - AllowReportProgress = false; SetPermissions(upload.id, GoogleDrivePermissionRole.reader, GoogleDrivePermissionType.anyone, "", true); } diff --git a/UploadersLib/FileUploaders/Mega.cs b/UploadersLib/FileUploaders/Mega.cs index e33dd6c16..663ecd277 100644 --- a/UploadersLib/FileUploaders/Mega.cs +++ b/UploadersLib/FileUploaders/Mega.cs @@ -123,7 +123,7 @@ public override UploadResult Upload(Stream stream, string fileName) public string PostRequestJson(Uri url, string jsonData) { - return SendPostRequestJSON(url.ToString(), jsonData); + return SendRequestJSON(url.ToString(), jsonData); } public string PostRequestRaw(Uri url, Stream dataStream) @@ -131,7 +131,7 @@ public string PostRequestRaw(Uri url, Stream dataStream) try { AllowReportProgress = true; - return SendPostRequestStream(url.ToString(), dataStream, "application/octet-stream"); + return SendRequestStream(url.ToString(), dataStream, "application/octet-stream"); } finally { diff --git a/UploadersLib/ImageUploaders/Picasa.cs b/UploadersLib/ImageUploaders/Picasa.cs index 0c26cff64..64fdd2840 100644 --- a/UploadersLib/ImageUploaders/Picasa.cs +++ b/UploadersLib/ImageUploaders/Picasa.cs @@ -180,7 +180,7 @@ public override UploadResult Upload(Stream stream, string fileName) NameValueCollection headers = GetAuthHeaders(); headers.Add("Slug", URLHelpers.URLEncode(fileName)); - ur.Response = SendPostRequestStream(url, stream, contentType, headers: headers); + ur.Response = SendRequestStream(url, stream, contentType, headers: headers); XDocument xd = XDocument.Parse(ur.Response); diff --git a/UploadersLib/TextUploaders/Gist.cs b/UploadersLib/TextUploaders/Gist.cs index a0357d960..899b9f7a0 100644 --- a/UploadersLib/TextUploaders/Gist.cs +++ b/UploadersLib/TextUploaders/Gist.cs @@ -116,7 +116,7 @@ public override UploadResult UploadText(string text, string fileName) url += "?access_token=" + AuthInfo.Token.access_token; } - string response = SendPostRequestJSON(url, argsJson); + string response = SendRequestJSON(url, argsJson); if (response != null) { diff --git a/UploadersLib/URLShorteners/GoogleURLShortener.cs b/UploadersLib/URLShorteners/GoogleURLShortener.cs index 2c4cb6bf1..fccbfabe0 100644 --- a/UploadersLib/URLShorteners/GoogleURLShortener.cs +++ b/UploadersLib/URLShorteners/GoogleURLShortener.cs @@ -162,7 +162,7 @@ public override UploadResult ShortenURL(string url) string json = string.Format("{{\"longUrl\":\"{0}\"}}", url); - result.Response = SendPostRequestJSON(query, json); + result.Response = SendRequestJSON(query, json); if (!string.IsNullOrEmpty(result.Response)) { diff --git a/UploadersLib/Uploader.cs b/UploadersLib/Uploader.cs index bf0f1581d..6252988de 100644 --- a/UploadersLib/Uploader.cs +++ b/UploadersLib/Uploader.cs @@ -114,8 +114,6 @@ public virtual void StopUpload() } } - #region Request methods - protected string SendRequest(HttpMethod method, string url, Dictionary arguments = null, ResponseType responseType = ResponseType.Text, NameValueCollection headers = null, CookieCollection cookies = null) { @@ -125,7 +123,7 @@ protected string SendRequest(HttpMethod method, string url, Dictionary arguments, NameValueCollection headers = null, CookieCollection cookies = null) + private HttpWebResponse SendRequestMultiPart(string url, Dictionary arguments, NameValueCollection headers = null, CookieCollection cookies = null, HttpMethod method = HttpMethod.POST) { string boundary = CreateBoundary(); byte[] data = MakeInputContent(boundary, arguments); @@ -249,30 +247,19 @@ private HttpWebResponse PostResponseMultiPart(string url, Dictionary public OAuth2Info GoogleDriveOAuth2Info = null; public bool GoogleDriveIsPublic = false; + public string GoogleDriveFolderID = string.Empty; // RapidShare