diff --git a/Core/Handling/ContextMenuBase.cs b/Core/Handling/ContextMenuBase.cs index 93c02541..69dbf3e8 100644 --- a/Core/Handling/ContextMenuBase.cs +++ b/Core/Handling/ContextMenuBase.cs @@ -7,7 +7,9 @@ using TweetDuck.Core.Controls; using TweetDuck.Core.Utils; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; +using TweetDuck.Core.Other; namespace TweetDuck.Core.Handling{ abstract class ContextMenuBase : IContextMenuHandler{ @@ -31,10 +33,11 @@ private static string GetMediaLink(IContextMenuParams parameters){ private const CefMenuCommand MenuOpenLinkUrl = (CefMenuCommand)26500; private const CefMenuCommand MenuCopyLinkUrl = (CefMenuCommand)26501; private const CefMenuCommand MenuCopyUsername = (CefMenuCommand)26502; - private const CefMenuCommand MenuOpenMediaUrl = (CefMenuCommand)26503; - private const CefMenuCommand MenuCopyMediaUrl = (CefMenuCommand)26504; - private const CefMenuCommand MenuSaveMedia = (CefMenuCommand)26505; - private const CefMenuCommand MenuSaveTweetImages = (CefMenuCommand)26506; + private const CefMenuCommand MenuViewImage = (CefMenuCommand)26503; + private const CefMenuCommand MenuOpenMediaUrl = (CefMenuCommand)26504; + private const CefMenuCommand MenuCopyMediaUrl = (CefMenuCommand)26505; + private const CefMenuCommand MenuSaveMedia = (CefMenuCommand)26506; + private const CefMenuCommand MenuSaveTweetImages = (CefMenuCommand)26507; private const CefMenuCommand MenuOpenDevTools = (CefMenuCommand)26599; private string[] lastHighlightedTweetAuthors; @@ -79,6 +82,7 @@ public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser bro model.AddSeparator(); } else if ((parameters.TypeFlags.HasFlag(ContextMenuType.Media) && parameters.HasImageContents) || hasTweetImage){ + model.AddItem(MenuViewImage, "View image in photo viewer"); model.AddItem(MenuOpenMediaUrl, TextOpen("image")); model.AddItem(MenuCopyMediaUrl, TextCopy("image")); model.AddItem(MenuSaveMedia, TextSave("image")); @@ -114,6 +118,32 @@ public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser br SetClipboardText(browserControl.AsControl(), TwitterUtils.GetMediaLink(GetMediaLink(parameters), ImageQuality)); break; + case MenuViewImage: + string url = GetMediaLink(parameters); + string file = Path.Combine(BrowserCache.CacheFolder, TwitterUtils.GetImageFileName(url)); + + void ViewFile(){ + string ext = Path.GetExtension(file); + + if (TwitterUtils.ValidImageExtensions.Contains(ext)){ + using(Process.Start(file)){} + } + else{ + FormMessage.Error("Image Download", "Invalid file extension "+ext, FormMessage.OK); + } + } + + if (File.Exists(file)){ + ViewFile(); + } + else{ + BrowserUtils.DownloadFileAsync(TwitterUtils.GetMediaLink(url, ImageQuality), file, ViewFile, ex => { + FormMessage.Error("Image Download", "An error occurred while downloading the image: "+ex.Message, FormMessage.OK); + }); + } + + break; + case MenuSaveMedia: if (IsVideo){ TwitterUtils.DownloadVideo(GetMediaLink(parameters), lastHighlightedTweetAuthors.LastOrDefault()); diff --git a/Core/Utils/BrowserCache.cs b/Core/Utils/BrowserCache.cs index 6f860cf6..af6cf2af 100644 --- a/Core/Utils/BrowserCache.cs +++ b/Core/Utils/BrowserCache.cs @@ -8,7 +8,7 @@ namespace TweetDuck.Core.Utils{ static class BrowserCache{ private static bool ClearOnExit { get; set; } - private static readonly string CacheFolder = Path.Combine(Program.StoragePath, "Cache"); + public static readonly string CacheFolder = Path.Combine(Program.StoragePath, "Cache"); private static IEnumerable<string> CacheFiles{ get{ diff --git a/Core/Utils/TwitterUtils.cs b/Core/Utils/TwitterUtils.cs index 701682f0..b02e18c0 100644 --- a/Core/Utils/TwitterUtils.cs +++ b/Core/Utils/TwitterUtils.cs @@ -21,6 +21,10 @@ static class TwitterUtils{ "tweetdeck", "TweetDeck", "tweetduck", "TweetDuck", "TD" }; + public static readonly string[] ValidImageExtensions = { + ".jpg", ".jpeg", ".png", ".gif" + }; + public enum ImageQuality{ Default, Orig } @@ -52,6 +56,10 @@ public static string GetMediaLink(string url, ImageQuality quality){ return url; } } + + public static string GetImageFileName(string url){ + return BrowserUtils.GetFileNameFromUrl(ExtractMediaBaseLink(url)); + } public static void DownloadImage(string url, string username, ImageQuality quality){ DownloadImages(new string[]{ url }, username, quality); @@ -65,7 +73,7 @@ public static void DownloadImages(string[] urls, string username, ImageQuality q string firstImageLink = GetMediaLink(urls[0], quality); int qualityIndex = firstImageLink.IndexOf(':', firstImageLink.LastIndexOf('/')); - string file = BrowserUtils.GetFileNameFromUrl(ExtractMediaBaseLink(firstImageLink)); + string file = GetImageFileName(firstImageLink); string ext = Path.GetExtension(file); // includes dot string[] fileNameParts = qualityIndex == -1 ? new string[]{