From 5970aca12b199ddbfa2765ac69e9f3723305aa7e Mon Sep 17 00:00:00 2001 From: Johannes Meyer zum Alten Borgloh Date: Sun, 7 Oct 2018 18:45:10 +0200 Subject: [PATCH] Code refactoring - Addresses C# inspections found by ReSharper. --- src/TumblThree/SharedAssemblyInfo.cs | 4 +- .../TumblThree.Applications/App.config | 6 +- .../TumblThree.Applications/Auth/OAuth.cs | 35 +- .../ClipboardMonitor.cs | 1 + .../Controllers/CrawlerController.cs | 32 +- .../Controllers/DetailsController.cs | 33 +- .../Controllers/ManagerController.cs | 62 +- .../Controllers/ModuleController.cs | 22 +- .../Controllers/QueueController.cs | 12 +- .../Crawler/AbstractCrawler.cs | 21 +- .../Crawler/AbstractTumblrCrawler.cs | 31 +- .../Crawler/CrawlerFactory.cs | 56 +- .../Crawler/ICrawlerFactory.cs | 5 +- .../Crawler/ITumblrBlogDetector.cs | 2 +- .../Crawler/TumblrBlogCrawler.cs | 110 +-- .../Crawler/TumblrBlogDetector.cs | 4 +- .../Crawler/TumblrHiddenCrawler.cs | 110 +-- .../Crawler/TumblrLikedByCrawler.cs | 20 +- .../Crawler/TumblrSearchCrawler.cs | 20 +- .../Crawler/TumblrTagSearchCrawler.cs | 27 +- .../Data/SupportedFileTypes.cs | 1 - .../DataModels/IPostQueue.cs | 4 +- .../DataModels/PostQueue.cs | 2 +- .../{ => TumblrApiJson}/TumblrApiJson.cs | 193 ++--- .../TumblrCrawlerData/ITumblrCrawlerData.cs | 1 - .../DataModels/TumblrPosts/TumblrPost.cs | 10 +- .../DataModels/TumblrSearchJson.cs | 50 -- .../TumblrSearchJson/TumblrSearchJson.cs | 39 + .../DataModels/TumblrSvcJson.cs | 773 ------------------ .../DataModels/TumblrSvcJson/TumblrSvcJson.cs | 521 ++++++++++++ .../Downloader/AbstractDownloader.cs | 65 +- .../Downloader/FileDownloader.cs | 17 +- .../Downloader/TumblrDownloader.cs | 27 +- .../Downloader/TumblrJsonDownloader.cs | 25 +- .../Downloader/TumblrXmlDownloader.cs | 28 +- .../ObjectModel/ObservableRangeCollection.cs | 20 +- .../Parser/CatBoxParser.cs | 1 + .../Parser/GfycatParser.cs | 8 +- .../Parser/ICatBoxParser.cs | 1 + .../Parser/IGfycatParser.cs | 4 +- .../Parser/IImgurParser.cs | 2 +- .../Parser/ILoliSafeParser.cs | 1 + .../Parser/IMixtapeParser.cs | 5 +- .../Parser/ISafeMoeParser.cs | 1 + .../Parser/ITumblrApiXmlToText.cs | 9 +- .../Parser/ITumblrParser.cs | 4 +- .../Parser/ITumblrToText.cs | 11 +- .../Parser/IUguuParser.cs | 1 + .../Parser/IWebmshareParser.cs | 4 +- .../Parser/ImgurParser.cs | 3 +- .../Parser/LoliSafeParser.cs | 1 + .../Parser/MixtapeParser.cs | 5 +- .../Parser/SafeMoeParser.cs | 1 + .../Parser/TumblrApiJsonToJson.cs | 5 +- .../Parser/TumblrApiJsonToText.cs | 7 +- .../Parser/TumblrApiXmlToText.cs | 186 +++-- .../Parser/TumblrParser.cs | 2 +- .../Parser/TumblrSvcJsonToJson.cs | 5 +- .../Parser/TumblrSvcJsonToText.cs | 13 +- .../Parser/UguuParser.cs | 1 + .../Parser/WebmshareParser.cs | 7 +- .../PauseTokenSource.cs | 4 + .../ProgressThrottler.cs | 7 +- .../Properties/AppSettings.cs | 291 +++---- .../Properties/QueueSettings.cs | 19 +- .../QueueOnDispatcher.cs | 2 + .../Services/ApplicationUpdateService.cs | 9 +- .../Services/BlogService.cs | 8 +- .../Services/ConfirmTumblrPrivacyConsent.cs | 11 +- .../Services/CrawlerService.cs | 11 +- .../Services/IConfirmTumblrPrivacyConsent.cs | 2 +- .../Services/ICrawlerService.cs | 6 +- .../Services/IDetailsService.cs | 2 +- .../Services/IFolderBrowserDialog.cs | 2 + .../Services/ILoginService.cs | 2 +- .../Services/IManagerService.cs | 3 +- .../Services/ISelectionService.cs | 2 +- .../Services/ISettingsService.cs | 2 +- .../Services/IWebRequestFactory.cs | 2 +- .../Services/LoginService.cs | 42 +- .../Services/ManagerService.cs | 9 +- .../Services/SelectionService.cs | 2 +- .../Services/SettingsProvider.cs | 8 +- .../Services/SettingsService.cs | 3 +- .../Services/SharedCookieService.cs | 12 +- .../Services/ShellService.cs | 2 +- .../Services/WebRequestFactory.cs | 10 +- .../WindowsFormsFolderBrowserDialog.cs | 19 +- .../ThrottledStream.cs | 6 +- .../TumblThree.Applications.csproj | 68 +- .../DetailsViewModels/DetailsAllViewModel.cs | 12 +- .../DetailsTumblrBlogViewModel.cs | 13 +- .../DetailsTumblrHiddenBlogViewModel.cs | 12 +- .../DetailsTumblrLikedByViewModel.cs | 12 +- .../DetailsTumblrSearchViewModel.cs | 12 +- .../DetailsTumblrTagSearchViewModel.cs | 12 +- .../ViewModels/FullScreenMediaViewModel.cs | 2 - .../ViewModels/ManagerViewModel.cs | 2 +- .../ViewModels/QueueViewModel.cs | 3 +- .../ViewModels/SettingsViewModel.cs | 20 +- .../ViewModels/ShellViewModel.cs | 1 + .../IDetailsViewModel.cs | 2 +- src/TumblThree/TumblThree.Domain/App.config | 11 +- .../LocalizedDescriptionAttribute.cs | 5 +- .../Converter/EnumDescriptionTypeConverter.cs | 7 +- .../TumblThree.Domain/Models/BlogFactory.cs | 12 +- .../TumblThree.Domain/Models/Blogs/Blog.cs | 61 +- .../TumblThree.Domain/Models/Blogs/IBlog.cs | 2 +- .../Models/Blogs/TumblrBlog.cs | 5 +- .../Models/Blogs/TumblrHiddenBlog.cs | 9 +- .../Models/Blogs/TumblrLikedByBlog.cs | 9 +- .../Models/Blogs/TumblrSearchBlog.cs | 9 +- .../Models/Blogs/TumblrTagSearchBlog.cs | 9 +- .../TumblThree.Domain/Models/CatboxTypes.cs | 3 +- .../TumblThree.Domain/Models/DetailsBlog.cs | 10 +- .../TumblThree.Domain/Models/Files/Files.cs | 16 +- .../TumblThree.Domain/Models/Files/IFiles.cs | 2 +- .../Models/Files/TumblrBlogFiles.cs | 2 +- .../Models/Files/TumblrHiddenBlogFiles.cs | 2 +- .../Models/Files/TumblrLikedByBlogFiles.cs | 2 +- .../Models/Files/TumblrSearchBlogFiles.cs | 2 +- .../Models/Files/TumblrTagSearchBlogFiles.cs | 2 +- .../TumblThree.Domain/Models/GfycatType.cs | 7 + .../TumblThree.Domain/Models/IBlogFactory.cs | 4 +- .../TumblThree.Domain/Models/IUrlValidator.cs | 7 +- .../TumblThree.Domain/Models/LoliSafeTypes.cs | 3 +- .../TumblThree.Domain/Models/MetadataType.cs | 1 + .../TumblThree.Domain/Models/MixtapeTypes.cs | 5 +- .../TumblThree.Domain/Models/PostCounter.cs | 4 +- .../TumblThree.Domain/Models/SafeMoeTypes.cs | 3 +- .../TumblThree.Domain/Models/UguuTypes.cs | 3 +- .../TumblThree.Domain/Models/UrlValidator.cs | 9 +- .../Models/WebmshareTypes.cs | 2 + .../TumblThree.Domain/Queue/QueueListItem.cs | 2 +- .../TumblThree.Domain/Queue/QueueManager.cs | 8 +- .../TumblThree.Domain.csproj | 1 - .../TumblThree.Presentation/App.xaml.cs | 1 + .../Converters/IsBlogInQueueMultiConverter.cs | 1 + .../DesignData/MockCrawlerService.cs | 1 + .../DesignData/MockManagerService.cs | 2 + .../DesignData/MockSelectionService.cs | 1 + .../DesignData/SampleBlogFile.cs | 1 + .../DesignData/SampleDetailsViewModel.cs | 2 + .../DesignData/SampleManagerViewModel.cs | 1 + .../DesignData/SampleQueueViewModel.cs | 1 + .../TumblThree.Presentation.csproj | 3 - .../Views/DetailsViews/DetailsAllView.xaml.cs | 1 + .../DetailsTumblrBlogView.xaml.cs | 1 + .../DetailsTumblrHiddenBlogView.xaml.cs | 1 + .../DetailsTumblrLikedByView.xaml.cs | 1 + .../DetailsTumblrSearchView.xaml.cs | 1 + .../DetailsTumblrTagSearchView.xaml.cs | 1 + .../Views/ManagerView.xaml.cs | 1 + .../Views/QueueView.xaml.cs | 1 + 154 files changed, 1815 insertions(+), 1792 deletions(-) rename src/TumblThree/TumblThree.Applications/DataModels/{ => TumblrApiJson}/TumblrApiJson.cs (64%) delete mode 100644 src/TumblThree/TumblThree.Applications/DataModels/TumblrSearchJson.cs create mode 100644 src/TumblThree/TumblThree.Applications/DataModels/TumblrSearchJson/TumblrSearchJson.cs delete mode 100644 src/TumblThree/TumblThree.Applications/DataModels/TumblrSvcJson.cs create mode 100644 src/TumblThree/TumblThree.Applications/DataModels/TumblrSvcJson/TumblrSvcJson.cs rename src/TumblThree/TumblThree.Applications/{ViewModels => Views}/IDetailsViewModel.cs (82%) diff --git a/src/TumblThree/SharedAssemblyInfo.cs b/src/TumblThree/SharedAssemblyInfo.cs index 5a07b6a..878cf16 100644 --- a/src/TumblThree/SharedAssemblyInfo.cs +++ b/src/TumblThree/SharedAssemblyInfo.cs @@ -12,5 +12,5 @@ [assembly: ComVisible(false)] [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)] -[assembly: AssemblyVersion("1.0.7.63")] -[assembly: AssemblyFileVersion("1.0.7.63")] +[assembly: AssemblyVersion("1.0.7.64")] +[assembly: AssemblyFileVersion("1.0.7.64")] diff --git a/src/TumblThree/TumblThree.Applications/App.config b/src/TumblThree/TumblThree.Applications/App.config index 24bce8e..1918efe 100644 --- a/src/TumblThree/TumblThree.Applications/App.config +++ b/src/TumblThree/TumblThree.Applications/App.config @@ -1,4 +1,6 @@ - + @@ -11,4 +13,4 @@ - + \ No newline at end of file diff --git a/src/TumblThree/TumblThree.Applications/Auth/OAuth.cs b/src/TumblThree/TumblThree.Applications/Auth/OAuth.cs index 4e20cfc..6a5e53f 100644 --- a/src/TumblThree/TumblThree.Applications/Auth/OAuth.cs +++ b/src/TumblThree/TumblThree.Applications/Auth/OAuth.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Net; using System.Security.Cryptography; +using System.Text; namespace TumblThree.Applications.Auth { @@ -135,6 +138,7 @@ public string this[string ix] { return _params[ix]; } + throw new ArgumentException(ix); } set @@ -143,6 +147,7 @@ public string this[string ix] { throw new ArgumentException(ix); } + _params[ix] = value; } } @@ -203,7 +208,7 @@ private void NewRequest() /// the nonce private string GenerateNonce() { - var sb = new System.Text.StringBuilder(); + var sb = new StringBuilder(); for (var i = 0; i < 8; i++) { int g = _random.Next(3); @@ -219,6 +224,7 @@ private string GenerateNonce() break; } } + return sb.ToString(); } @@ -284,7 +290,7 @@ private Dictionary ExtractQueryParameters(string queryString) /// the Url-encoded version of that string public static string UrlEncode(string value) { - var result = new System.Text.StringBuilder(); + var result = new StringBuilder(); foreach (char symbol in value) { if (unreservedChars.IndexOf(symbol) != -1) @@ -296,6 +302,7 @@ public static string UrlEncode(string value) result.Append('%' + string.Format("{0:X2}", (int)symbol)); } } + return result.ToString(); } @@ -323,7 +330,7 @@ public static string UrlEncode(string value) /// a string representing the parameters private static string EncodeRequestParameters(ICollection> p) { - var sb = new System.Text.StringBuilder(); + var sb = new StringBuilder(); foreach (KeyValuePair item in p.OrderBy(x => x.Key)) { if (!string.IsNullOrEmpty(item.Value) && @@ -383,13 +390,13 @@ public OAuthResponse AcquireRequestToken(string uri, string method) NewRequest(); string authHeader = GetAuthorizationHeader(uri, method); // prepare the token request - var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri); + var request = (HttpWebRequest)WebRequest.Create(uri); request.Headers.Add("Authorization", authHeader); request.Method = method; - using (var response = (System.Net.HttpWebResponse)request.GetResponse()) + using (var response = (HttpWebResponse)request.GetResponse()) { - using (var reader = new System.IO.StreamReader(response.GetResponseStream())) + using (var reader = new StreamReader(response.GetResponseStream())) { var r = new OAuthResponse(reader.ReadToEnd()); this["token"] = r["oauth_token"]; @@ -407,6 +414,7 @@ public OAuthResponse AcquireRequestToken(string uri, string method) catch { } + return r; } } @@ -454,13 +462,13 @@ public OAuthResponse AcquireAccessToken(string uri, string method, string pin) string authHeader = GetAuthorizationHeader(uri, method); // prepare the token request - var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(uri); + var request = (HttpWebRequest)WebRequest.Create(uri); request.Headers.Add("Authorization", authHeader); request.Method = method; - using (var response = (System.Net.HttpWebResponse)request.GetResponse()) + using (var response = (HttpWebResponse)request.GetResponse()) { - using (var reader = new System.IO.StreamReader(response.GetResponseStream())) + using (var reader = new StreamReader(response.GetResponseStream())) { var r = new OAuthResponse(reader.ReadToEnd()); this["token"] = r["oauth_token"]; @@ -517,7 +525,7 @@ private void Sign(string uri, string method) string signatureBase = GetSignatureBase(uri, method); HashAlgorithm hash = GetHash(); - byte[] dataBuffer = System.Text.Encoding.ASCII.GetBytes(signatureBase); + byte[] dataBuffer = Encoding.ASCII.GetBytes(signatureBase); byte[] hashBytes = hash.ComputeHash(dataBuffer); this["signature"] = Convert.ToBase64String(hashBytes); @@ -541,7 +549,7 @@ private string GetSignatureBase(string url, string method) normUrl += uri.AbsolutePath; // the sigbase starts with the method and the encoded URI - var sb = new System.Text.StringBuilder(); + var sb = new StringBuilder(); sb.Append(method) .Append('&') .Append(UrlEncode(normUrl)) @@ -566,7 +574,7 @@ private string GetSignatureBase(string url, string method) } // concat+format all those params - var sb1 = new System.Text.StringBuilder(); + var sb1 = new StringBuilder(); foreach (KeyValuePair item in p.OrderBy(x => x.Key)) { // even "empty" params need to be encoded this way. @@ -591,7 +599,7 @@ private HashAlgorithm GetHash() UrlEncode(this["token_secret"])); var hmacsha1 = new HMACSHA1 { - Key = System.Text.Encoding.ASCII.GetBytes(keystring) + Key = Encoding.ASCII.GetBytes(keystring) }; return hmacsha1; } @@ -614,6 +622,7 @@ public OAuthResponse(string alltext) string[] kv = pair.Split('='); _params.Add(kv[0], kv[1]); } + // expected keys: // oauth_token, oauth_token_secret, user_id, screen_name, etc } diff --git a/src/TumblThree/TumblThree.Applications/ClipboardMonitor.cs b/src/TumblThree/TumblThree.Applications/ClipboardMonitor.cs index bd2b905..48b4a28 100644 --- a/src/TumblThree/TumblThree.Applications/ClipboardMonitor.cs +++ b/src/TumblThree/TumblThree.Applications/ClipboardMonitor.cs @@ -62,6 +62,7 @@ protected virtual void Dispose(bool disposing) hwndSource.RemoveHook(WndProc); hwndSource.Dispose(); } + // Free any unmanaged objects here. // disposed = true; diff --git a/src/TumblThree/TumblThree.Applications/Controllers/CrawlerController.cs b/src/TumblThree/TumblThree.Applications/Controllers/CrawlerController.cs index e202e5f..31a02a6 100644 --- a/src/TumblThree/TumblThree.Applications/Controllers/CrawlerController.cs +++ b/src/TumblThree/TumblThree.Applications/Controllers/CrawlerController.cs @@ -5,11 +5,12 @@ using System.Threading; using System.Threading.Tasks; using System.Waf.Applications; + using TumblThree.Applications.Crawler; using TumblThree.Applications.DataModels; using TumblThree.Applications.Services; using TumblThree.Applications.ViewModels; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Domain.Queue; namespace TumblThree.Applications.Controllers @@ -71,11 +72,13 @@ public void Shutdown() { stopCommand.Execute(null); } + Task.WaitAll(runningTasks.ToArray()); } catch (AggregateException) { } + foreach (IBlog blog in managerService.BlogFiles) { if (blog.Dirty) @@ -156,9 +159,18 @@ private async Task Crawl() runningTasks.Add(Task.Run(() => RunCrawlerTasks(cancellation.Token, pause.Token))); } - try { await Task.WhenAll(runningTasks.ToArray()); } - catch { } - finally { crawlerCancellationToken.Dispose(); runningTasks.Clear(); } + try + { + await Task.WhenAll(runningTasks.ToArray()); + } + catch + { + } + finally + { + crawlerCancellationToken.Dispose(); + runningTasks.Clear(); + } } private async Task RunCrawlerTasks(CancellationToken ct, PauseToken pt) @@ -176,13 +188,13 @@ private async Task RunCrawlerTasks(CancellationToken ct, PauseToken pt) } Monitor.Enter(lockObject); - if (crawlerService.ActiveItems.Count() < QueueManager.Items.Count()) + if (crawlerService.ActiveItems.Count < QueueManager.Items.Count) { IEnumerable queueList = QueueManager.Items.Except(crawlerService.ActiveItems); QueueListItem nextQueueItem = queueList.First(); IBlog blog = nextQueueItem.Blog; - ICrawler crawler = crawlerFactory.GetCrawler(blog, ct, pt, new Progress(), shellService, crawlerService, managerService); + ICrawler crawler = crawlerFactory.GetCrawler(blog, ct, pt, new Progress()); crawler.IsBlogOnlineAsync().Wait(4000); if (crawlerService.ActiveItems.Any(item => item.Blog.Name.Equals(nextQueueItem.Blog.Name))) @@ -217,7 +229,7 @@ private async Task StartSiteSpecificDownloader(QueueListItem queueListItem, Canc blog.Dirty = true; ProgressThrottler progress = SetupThrottledQueueListProgress(queueListItem); - ICrawler crawler = crawlerFactory.GetCrawler(blog, ct, pt, progress, shellService, crawlerService, managerService); + ICrawler crawler = crawlerFactory.GetCrawler(blog, ct, pt, progress); await crawler.CrawlAsync(); if (ct.IsCancellationRequested) @@ -235,10 +247,10 @@ private async Task StartSiteSpecificDownloader(QueueListItem queueListItem, Canc } } - private ProgressThrottler SetupThrottledQueueListProgress(QueueListItem queueListItem) + private ProgressThrottler SetupThrottledQueueListProgress(QueueListItem queueListItem) { - var progressHandler = new Progress(value => { queueListItem.Progress = value.Progress; }); - return new ProgressThrottler(progressHandler, shellService.Settings.ProgessUpdateInterval); + var progressHandler = new Progress(value => { queueListItem.Progress = value.Progress; }); + return new ProgressThrottler(progressHandler, shellService.Settings.ProgessUpdateInterval); } } } diff --git a/src/TumblThree/TumblThree.Applications/Controllers/DetailsController.cs b/src/TumblThree/TumblThree.Applications/Controllers/DetailsController.cs index 8a98a92..383eafd 100644 --- a/src/TumblThree/TumblThree.Applications/Controllers/DetailsController.cs +++ b/src/TumblThree/TumblThree.Applications/Controllers/DetailsController.cs @@ -5,9 +5,11 @@ using System.ComponentModel.Composition; using System.Linq; using System.Reflection; + using TumblThree.Applications.Services; using TumblThree.Applications.Views; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Domain.Queue; namespace TumblThree.Applications.Controllers @@ -44,6 +46,7 @@ public Lazy GetViewModel(IBlog blog) { return viewModel; } + throw new ArgumentException("Website is not supported!", "blogType"); } @@ -55,14 +58,14 @@ public void SelectBlogFiles(IReadOnlyList blogFiles) ClearBlogSelection(); - if (blogFiles.Count() <= 1) + if (blogFiles.Count <= 1) { DetailsViewModel.Count = 1; DetailsViewModel.BlogFile = blogFiles.FirstOrDefault(); } else { - DetailsViewModel.Count = blogFiles.Count(); + DetailsViewModel.Count = blogFiles.Count; DetailsViewModel.BlogFile = CreateFromMultiple(blogFiles.ToArray()); DetailsViewModel.BlogFile.PropertyChanged += ChangeBlogSettings; } @@ -72,14 +75,9 @@ private void UpdateViewModelBasedOnSelection(IReadOnlyList blogFiles) { if (blogFiles.Count == 0) return; - if (blogFiles.Select(blog => blog.GetType()).Distinct().Count() < 2) - { - detailsViewModel = GetViewModel(blogFiles.FirstOrDefault()); - } - else - { - detailsViewModel = GetViewModel(new Blog()); - } + detailsViewModel = GetViewModel(blogFiles.Select(blog => blog.GetType()).Distinct().Count() < 2 + ? blogFiles.FirstOrDefault() + : new Blog()); shellService.DetailsView = DetailsViewModel.View; shellService.UpdateDetailsView(); } @@ -106,12 +104,12 @@ public void Shutdown() public IBlog CreateFromMultiple(IEnumerable blogFiles) { - if (!blogFiles.Any()) + List sharedBlogFiles = blogFiles.ToList(); + if (!sharedBlogFiles.Any()) { throw new ArgumentException("The collection must have at least one item.", nameof(blogFiles)); } - IBlog[] sharedBlogFiles = blogFiles.ToArray(); foreach (IBlog blog in sharedBlogFiles) { blogsToSave.Add(blog); @@ -195,14 +193,10 @@ private static T SetProperty(IReadOnlyCollection blogs, string propert { PropertyInfo property = typeof(IBlog).GetProperty(propertyName); var value = (T)property.GetValue(blogs.FirstOrDefault()); - if (value != null) - { - bool equal = blogs.All(blog => property.GetValue(blog)?.Equals(value) ?? false); - if (equal) - return value; + if (value == null) return default(T); - } - return default(T); + bool equal = blogs.All(blog => property.GetValue(blog)?.Equals(value) ?? false); + return equal ? value : default(T); } private static bool SetCheckBox(IReadOnlyCollection blogs, string propertyName) @@ -232,6 +226,7 @@ private void SelectedBlogFilesCollectionChanged(object sender, NotifyCollectionC { DetailsViewModel.BlogFile.PropertyChanged -= ChangeBlogSettings; } + SelectBlogFiles(selectionService.SelectedBlogFiles.ToArray()); } } diff --git a/src/TumblThree/TumblThree.Applications/Controllers/ManagerController.cs b/src/TumblThree/TumblThree.Applications/Controllers/ManagerController.cs index f4d3474..726a111 100644 --- a/src/TumblThree/TumblThree.Applications/Controllers/ManagerController.cs +++ b/src/TumblThree/TumblThree.Applications/Controllers/ManagerController.cs @@ -3,6 +3,7 @@ using System.Collections.Specialized; using System.ComponentModel; using System.ComponentModel.Composition; +using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.Serialization; @@ -11,6 +12,7 @@ using System.Waf.Applications; using System.Waf.Applications.Services; using System.Windows; + using TumblThree.Applications.Crawler; using TumblThree.Applications.DataModels; using TumblThree.Applications.Properties; @@ -18,6 +20,8 @@ using TumblThree.Applications.ViewModels; using TumblThree.Domain; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; +using TumblThree.Domain.Models.Files; using TumblThree.Domain.Queue; namespace TumblThree.Applications.Controllers @@ -195,7 +199,7 @@ await Task.Run(async () => { await semaphoreSlim.WaitAsync(); ICrawler crawler = crawlerFactory.GetCrawler(blog, new CancellationToken(), new PauseToken(), - new Progress(), shellService, crawlerService, managerService); + new Progress()); await crawler.IsBlogOnlineAsync(); semaphoreSlim.Release(); }); @@ -242,6 +246,7 @@ private IReadOnlyList GetIBlogsCore(string directory) failedToLoadBlogs.Add(ex.Data["Filename"].ToString()); } } + if (failedToLoadBlogs.Any()) { string failedBlogNames = failedToLoadBlogs.Aggregate((a, b) => a + ", " + b); @@ -286,6 +291,7 @@ private IReadOnlyList GetIFilesCore(string directory) failedToLoadBlogs.Add(ex.Data["Filename"].ToString()); } } + if (failedToLoadBlogs.Any()) { string failedBlogNames = failedToLoadBlogs.Aggregate((a, b) => a + ", " + b); @@ -322,7 +328,7 @@ private async Task LoadAllDatabasesAsync() Logger.Verbose("ManagerController:LoadDatabasesGloballyAsync: {0}", ex); shellService.ShowError(ex, Resources.CouldNotLoadLibrary, ex.Data["Filename"]); } - + BlogManaerFinishedLoadingDatabases?.Invoke(this, EventArgs.Empty); Logger.Verbose("ManagerController.LoadDatabasesGloballyAsync:End"); } @@ -362,19 +368,26 @@ private void EnqueueAutoDownload() if (shellService.Settings.BlogType == shellService.Settings.BlogTypes.ElementAtOrDefault(0)) { } + if (shellService.Settings.BlogType == shellService.Settings.BlogTypes.ElementAtOrDefault(1)) { Enqueue(managerService.BlogFiles.Where(blog => blog.Online).ToArray()); } + if (shellService.Settings.BlogType == shellService.Settings.BlogTypes.ElementAtOrDefault(2)) { Enqueue( - managerService.BlogFiles.Where(blog => blog.Online && blog.LastCompleteCrawl != new DateTime(0L, DateTimeKind.Utc)).ToArray()); + managerService + .BlogFiles.Where(blog => blog.Online && blog.LastCompleteCrawl != new DateTime(0L, DateTimeKind.Utc)) + .ToArray()); } + if (shellService.Settings.BlogType == shellService.Settings.BlogTypes.ElementAtOrDefault(3)) { Enqueue( - managerService.BlogFiles.Where(blog => blog.Online && blog.LastCompleteCrawl == new DateTime(0L, DateTimeKind.Utc)).ToArray()); + managerService + .BlogFiles.Where(blog => blog.Online && blog.LastCompleteCrawl == new DateTime(0L, DateTimeKind.Utc)) + .ToArray()); } if (crawlerService.IsCrawl && crawlerService.IsPaused) @@ -396,8 +409,13 @@ private bool CanAddBlog() private async Task AddBlog() { - try { await AddBlogAsync(null); } - catch { } + try + { + await AddBlogAsync(null); + } + catch + { + } } private bool CanRemoveBlog() @@ -413,10 +431,7 @@ private void RemoveBlog() { string blogNames = string.Join(", ", blogs.Select(blog => blog.Name)); string message = string.Empty; - if (shellService.Settings.DeleteOnlyIndex) - message = string.Format(Resources.DeleteBlogsDialog, blogNames); - else - message = string.Format(Resources.DeleteBlogsAndFilesDialog, blogNames); + message = string.Format(shellService.Settings.DeleteOnlyIndex ? Resources.DeleteBlogsDialog : Resources.DeleteBlogsAndFilesDialog, blogNames); if (!messageService.ShowYesNoQuestion(this, message)) return; } @@ -460,11 +475,15 @@ private void RemoveBlog(IEnumerable blogs) if (shellService.Settings.LoadAllDatabases) { managerService.RemoveDatabase(managerService.Databases - .FirstOrDefault(db => db.Name.Equals(blog.Name) && db.BlogType.Equals(blog.BlogType))); + .FirstOrDefault(db => + db.Name.Equals(blog.Name) && + db.BlogType.Equals(blog.BlogType))); } + QueueManager.RemoveItems(QueueManager.Items.Where(item => item.Blog.Equals(blog))); } } + private bool CanShowFiles() { return ManagerViewModel.SelectedBlogFile != null; @@ -474,7 +493,7 @@ private void ShowFiles() { foreach (IBlog blog in selectionService.SelectedBlogFiles.ToArray()) { - System.Diagnostics.Process.Start("explorer.exe", blog.DownloadLocation()); + Process.Start("explorer.exe", blog.DownloadLocation()); } } @@ -487,7 +506,7 @@ private void VisitBlog() { foreach (IBlog blog in selectionService.SelectedBlogFiles.ToArray()) { - System.Diagnostics.Process.Start(blog.Url); + Process.Start(blog.Url); } } @@ -498,7 +517,7 @@ private void ShowDetailsCommand() private void CopyUrl() { - var urls = selectionService.SelectedBlogFiles.Select(blog => blog.Url).ToList(); + List urls = selectionService.SelectedBlogFiles.Select(blog => blog.Url).ToList(); urls.Sort(); clipboardService.SetText(string.Join(Environment.NewLine, urls)); } @@ -518,7 +537,7 @@ await Task.Run(async () => { await semaphoreSlim.WaitAsync(); ICrawler crawler = crawlerFactory.GetCrawler(blog, new CancellationToken(), new PauseToken(), - new Progress(), shellService, crawlerService, managerService); + new Progress()); await crawler.IsBlogOnlineAsync(); semaphoreSlim.Release(); }); @@ -565,7 +584,8 @@ private async Task AddBlogAsync(string blogUrl) } blog = settingsService.TransferGlobalSettingsToBlog(blog); - ICrawler crawler = crawlerFactory.GetCrawler(blog, new CancellationToken(), new PauseToken(), new Progress(), shellService, crawlerService, managerService); + ICrawler crawler = crawlerFactory.GetCrawler(blog, new CancellationToken(), new PauseToken(), + new Progress()); await crawler.UpdateMetaInformationAsync(); } @@ -583,7 +603,10 @@ private void OnClipboardContentChanged(object sender, EventArgs e) // Count each whitespace as new url string[] urls = Clipboard.GetText().Split(); - Task.Run(() => { Task addBlogBatchedTask = AddBlogBatchedAsync(urls); }); + Task.Run(() => + { + Task addBlogBatchedTask = AddBlogBatchedAsync(urls); + }); } } @@ -597,7 +620,9 @@ private async Task AddBlogBatchedAsync(IEnumerable urls) await semaphoreSlim.WaitAsync(); await AddBlogAsync(url); } - catch { } + catch + { + } finally { semaphoreSlim.Release(); @@ -613,6 +638,7 @@ private void ListenClipboard() shellService.ClipboardMonitor.OnClipboardContentChanged += OnClipboardContentChanged; return; } + shellService.ClipboardMonitor.OnClipboardContentChanged -= OnClipboardContentChanged; } diff --git a/src/TumblThree/TumblThree.Applications/Controllers/ModuleController.cs b/src/TumblThree/TumblThree.Applications/Controllers/ModuleController.cs index d5c32db..4ce0bb2 100644 --- a/src/TumblThree/TumblThree.Applications/Controllers/ModuleController.cs +++ b/src/TumblThree/TumblThree.Applications/Controllers/ModuleController.cs @@ -46,8 +46,8 @@ internal class ModuleController : IModuleController [ImportingConstructor] public ModuleController(Lazy shellService, IEnvironmentService environmentService, IConfirmTumblrPrivacyConsent confirmTumblrPrivacyConsent, ISettingsProvider settingsProvider, - ISharedCookieService cookieService, Lazy managerController, - Lazy queueController, Lazy detailsController, + ISharedCookieService cookieService, Lazy managerController, Lazy queueController, + Lazy detailsController, Lazy crawlerController, Lazy shellViewModel) { this.shellService = shellService; @@ -80,15 +80,19 @@ public void Initialize() if (CheckIfPortableMode(appSettingsFileName)) { appSettings = LoadSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, appSettingsFileName)); - queueSettings = LoadSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, queueSettingsFileName)); - managerSettings = LoadSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, managerSettingsFileName)); + queueSettings = + LoadSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, queueSettingsFileName)); + managerSettings = + LoadSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, managerSettingsFileName)); cookieList = LoadSettings>(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, cookiesFileName)); } else { appSettings = LoadSettings(Path.Combine(environmentService.AppSettingsPath, appSettingsFileName)); - queueSettings = LoadSettings(Path.Combine(environmentService.AppSettingsPath, queueSettingsFileName)); - managerSettings = LoadSettings(Path.Combine(environmentService.AppSettingsPath, managerSettingsFileName)); + queueSettings = + LoadSettings(Path.Combine(environmentService.AppSettingsPath, queueSettingsFileName)); + managerSettings = + LoadSettings(Path.Combine(environmentService.AppSettingsPath, managerSettingsFileName)); cookieList = LoadSettings>(Path.Combine(environmentService.AppSettingsPath, cookiesFileName)); } @@ -136,14 +140,16 @@ public void Shutdown() SaveSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, appSettingsFileName), appSettings); SaveSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, queueSettingsFileName), queueSettings); SaveSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, managerSettingsFileName), managerSettings); - SaveSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, cookiesFileName), new List(cookieService.GetAllCookies())); + SaveSettings(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, cookiesFileName), + new List(cookieService.GetAllCookies())); } else { SaveSettings(Path.Combine(environmentService.AppSettingsPath, appSettingsFileName), appSettings); SaveSettings(Path.Combine(environmentService.AppSettingsPath, queueSettingsFileName), queueSettings); SaveSettings(Path.Combine(environmentService.AppSettingsPath, managerSettingsFileName), managerSettings); - SaveSettings(Path.Combine(environmentService.AppSettingsPath, cookiesFileName), new List(cookieService.GetAllCookies())); + SaveSettings(Path.Combine(environmentService.AppSettingsPath, cookiesFileName), + new List(cookieService.GetAllCookies())); } } diff --git a/src/TumblThree/TumblThree.Applications/Controllers/QueueController.cs b/src/TumblThree/TumblThree.Applications/Controllers/QueueController.cs index d3f564e..82af950 100644 --- a/src/TumblThree/TumblThree.Applications/Controllers/QueueController.cs +++ b/src/TumblThree/TumblThree.Applications/Controllers/QueueController.cs @@ -9,6 +9,7 @@ using System.Waf.Applications; using System.Waf.Applications.Services; using System.Waf.Foundation; +using System.Xml; using TumblThree.Applications.Data; using TumblThree.Applications.Properties; @@ -16,6 +17,7 @@ using TumblThree.Applications.ViewModels; using TumblThree.Domain; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Domain.Queue; namespace TumblThree.Applications.Controllers @@ -134,6 +136,7 @@ private void OpenList() { return; } + OpenListCore(result.FileName); } @@ -156,14 +159,17 @@ private void OpenListCore(string queuelistFileName) return; } - InsertFilesCore(QueueManager.Items.Count(), queueList.Names.ToArray(), queueList.Types.ToArray()); + InsertFilesCore(QueueManager.Items.Count, queueList.Names.ToArray(), queueList.Types.ToArray()); } private void InsertFilesCore(int index, IEnumerable names, IEnumerable blogTypes) { try { - InsertBlogFiles(index, names.Zip(blogTypes, Tuple.Create).Select(x => managerService.BlogFiles.First(blogs => blogs.Name.Equals(x.Item1) && blogs.BlogType.Equals(x.Item2)))); + InsertBlogFiles(index, + names.Zip(blogTypes, Tuple.Create).Select(x => + managerService.BlogFiles.First(blogs => + blogs.Name.Equals(x.Item1) && blogs.BlogType.Equals(x.Item2)))); } catch (Exception ex) { @@ -193,7 +199,7 @@ private void SaveList() var stream = new FileStream(Path.Combine(targetFolder, name) + ".que", FileMode.Create, FileAccess.Write, FileShare.None)) { - using (var writer = JsonReaderWriterFactory.CreateJsonWriter( + using (XmlDictionaryWriter writer = JsonReaderWriterFactory.CreateJsonWriter( stream, Encoding.UTF8, true, true, " ")) { var serializer = new DataContractJsonSerializer(typeof(QueueSettings)); diff --git a/src/TumblThree/TumblThree.Applications/Crawler/AbstractCrawler.cs b/src/TumblThree/TumblThree.Applications/Crawler/AbstractCrawler.cs index 25aafb2..7a00b55 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/AbstractCrawler.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/AbstractCrawler.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Net; +using System.Runtime.Serialization; using System.Runtime.Serialization.Json; using System.Text; using System.Threading; @@ -16,7 +17,7 @@ using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Crawler { @@ -80,7 +81,7 @@ public virtual async Task IsBlogOnlineAsync() public void UpdateProgressQueueInformation(string format, params object[] args) { - var newProgress = new DataModels.DownloadProgress + var newProgress = new DownloadProgress { Progress = string.Format(CultureInfo.CurrentCulture, format, args) }; @@ -94,10 +95,12 @@ protected async Task ThrottleConnectionAsync(string url, Func RequestDataAsync(string url, Dictionary headers = null, IEnumerable cookieHosts = null) + protected async Task RequestDataAsync(string url, Dictionary headers = null, + IEnumerable cookieHosts = null) { var requestRegistration = new CancellationTokenRegistration(); try @@ -108,6 +111,7 @@ protected async Task RequestDataAsync(string url, Dictionary request.Abort()); return await webRequestFactory.ReadReqestToEnd(request); } @@ -121,13 +125,13 @@ protected async Task RequestDataAsync(string url, Dictionary: {0}", "Could not parse data"); shellService.ShowError(serializationException, Resources.PostNotParsable, blog.Name); @@ -142,6 +146,7 @@ protected static string UrlEncode(IDictionary parameters) { sb.AppendFormat("{0}={1}&", val.Key, HttpUtility.UrlEncode(val.Value)); } + sb.Remove(sb.Length - 1, 1); // remove last '&' return sb.ToString(); } @@ -152,6 +157,7 @@ protected virtual IEnumerable GetPageNumbers() { return Enumerable.Range(0, shellService.Settings.ConcurrentScans); } + return RangeToSequence(blog.DownloadPages); } @@ -170,6 +176,7 @@ protected static IEnumerable RangeToSequence(string input) yield return int.Parse(part); continue; } + string[] rangeParts = part.Split('-'); int start = int.Parse(rangeParts[0]); int end = int.Parse(rangeParts[1]); @@ -195,10 +202,12 @@ protected ulong GetLastPostId() { return 0; } + if (!string.IsNullOrEmpty(blog.DownloadPages)) { return 0; } + return lastId; } diff --git a/src/TumblThree/TumblThree.Applications/Crawler/AbstractTumblrCrawler.cs b/src/TumblThree/TumblThree.Applications/Crawler/AbstractTumblrCrawler.cs index 746848f..cea1165 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/AbstractTumblrCrawler.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/AbstractTumblrCrawler.cs @@ -6,28 +6,29 @@ using System.Threading.Tasks; using TumblThree.Applications.DataModels; +using TumblThree.Applications.DataModels.TumblrPosts; using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Crawler { public abstract class AbstractTumblrCrawler : AbstractCrawler { - protected AbstractTumblrCrawler(IShellService shellService, ICrawlerService crawlerService, - CancellationToken ct, IProgress progress, IWebRequestFactory webRequestFactory, - ISharedCookieService cookieService, IPostQueue postQueue, IBlog blog) + protected AbstractTumblrCrawler(IShellService shellService, ICrawlerService crawlerService, CancellationToken ct, + IProgress progress, IWebRequestFactory webRequestFactory, ISharedCookieService cookieService, + IPostQueue postQueue, IBlog blog) : base(shellService, crawlerService, ct, progress, webRequestFactory, cookieService, postQueue, blog) { } protected async Task GetRequestAsync(string url) { - Dictionary headers = new Dictionary(); + var headers = new Dictionary(); string username = blog.Name + ".tumblr.com"; string password = blog.Password; - string encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password)); + string encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password)); headers.Add("Authorization", "Basic " + encoded); string[] cookieHosts = { "https://www.tumblr.com/" }; return await RequestDataAsync(url, headers, cookieHosts); @@ -74,15 +75,15 @@ protected string ResizeTumblrImageUrl(string imageUrl) { var sb = new StringBuilder(imageUrl); return sb - .Replace("_raw", "_" + ImageSize()) - .Replace("_1280", "_" + ImageSize()) - .Replace("_540", "_" + ImageSize()) - .Replace("_500", "_" + ImageSize()) - .Replace("_400", "_" + ImageSize()) - .Replace("_250", "_" + ImageSize()) - .Replace("_100", "_" + ImageSize()) - .Replace("_75sq", "_" + ImageSize()) - .ToString(); + .Replace("_raw", "_" + ImageSize()) + .Replace("_1280", "_" + ImageSize()) + .Replace("_540", "_" + ImageSize()) + .Replace("_500", "_" + ImageSize()) + .Replace("_400", "_" + ImageSize()) + .Replace("_250", "_" + ImageSize()) + .Replace("_100", "_" + ImageSize()) + .Replace("_75sq", "_" + ImageSize()) + .ToString(); } } } diff --git a/src/TumblThree/TumblThree.Applications/Crawler/CrawlerFactory.cs b/src/TumblThree/TumblThree.Applications/Crawler/CrawlerFactory.cs index 99fc718..8477906 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/CrawlerFactory.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/CrawlerFactory.cs @@ -7,49 +7,58 @@ using System.Xml.Linq; using TumblThree.Applications.DataModels; +using TumblThree.Applications.DataModels.TumblrApiJson; using TumblThree.Applications.DataModels.TumblrCrawlerData; +using TumblThree.Applications.DataModels.TumblrPosts; using TumblThree.Applications.Downloader; using TumblThree.Applications.Parser; using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; +using TumblThree.Domain.Models.Files; namespace TumblThree.Applications.Crawler { [Export(typeof(ICrawlerFactory))] public class CrawlerFactory : ICrawlerFactory { + private readonly ICrawlerService crawlerService; + private readonly IManagerService managerService; private readonly IShellService shellService; private readonly ISharedCookieService cookieService; private readonly AppSettings settings; [ImportingConstructor] - internal CrawlerFactory(ShellService shellService, ISharedCookieService cookieService) + internal CrawlerFactory(ICrawlerService crawlerService, IManagerService managerService, ShellService shellService, + ISharedCookieService cookieService) { + this.crawlerService = crawlerService; + this.managerService = managerService; this.shellService = shellService; this.cookieService = cookieService; this.settings = shellService.Settings; } - [ImportMany(typeof(ICrawler))] - private IEnumerable> DownloaderFactoryLazy { get; set; } + [ImportMany(typeof(ICrawler))] private IEnumerable> DownloaderFactoryLazy { get; set; } public ICrawler GetCrawler(IBlog blog) { Lazy downloader = - DownloaderFactoryLazy.FirstOrDefault(list => list.Metadata.BlogType.GetType() == blog.GetType()); + DownloaderFactoryLazy.FirstOrDefault(list => list.Metadata.BlogType == blog.GetType()); if (downloader != null) { return downloader.Value; } + throw new ArgumentException("Website is not supported!", "blogType"); } - public ICrawler GetCrawler(IBlog blog, CancellationToken ct, PauseToken pt, IProgress progress, IShellService shellService, ICrawlerService crawlerService, IManagerService managerService) + public ICrawler GetCrawler(IBlog blog, CancellationToken ct, PauseToken pt, IProgress progress) { IPostQueue postQueue = GetProducerConsumerCollection(); - IFiles files = LoadFiles(blog, managerService); + IFiles files = LoadFiles(blog); IWebRequestFactory webRequestFactory = GetWebRequestFactory(); IImgurParser imgurParser = GetImgurParser(webRequestFactory, ct); IGfycatParser gfycatParser = GetGfycatParser(webRequestFactory, ct); @@ -57,24 +66,29 @@ public ICrawler GetCrawler(IBlog blog, CancellationToken ct, PauseToken pt, IPro { case BlogTypes.tumblr: IPostQueue> jsonSvcQueue = GetJsonQueue(); - return new TumblrBlogCrawler(shellService, ct, pt, progress, crawlerService, webRequestFactory, cookieService, GetTumblrDownloader(ct, pt, progress, shellService, crawlerService, managerService, blog, files, postQueue), GetTumblrJsonDownloader(shellService, ct, pt, jsonSvcQueue, crawlerService, blog), GetTumblrSvcJsonToTextParser(blog), imgurParser, gfycatParser, GetWebmshareParser(), GetMixtapeParser(), GetUguuParser(), GetSafeMoeParser(), GetLoliSafeParser(), GetCatBoxParser(), postQueue, jsonSvcQueue, blog); + return new TumblrBlogCrawler(shellService, ct, pt, progress, crawlerService, webRequestFactory, cookieService, GetTumblrDownloader(ct, pt, progress, blog, files, postQueue), GetTumblrJsonDownloader(ct, pt, jsonSvcQueue, blog), GetTumblrSvcJsonToTextParser(blog), imgurParser, gfycatParser, GetWebmshareParser(), GetMixtapeParser(), GetUguuParser(), GetSafeMoeParser(), GetLoliSafeParser(), GetCatBoxParser(), postQueue, jsonSvcQueue, blog); case BlogTypes.tlb: - return new TumblrLikedByCrawler(shellService, ct, pt, progress, crawlerService, webRequestFactory, cookieService, GetTumblrDownloader(ct, pt, progress, shellService, crawlerService, managerService, blog, files, postQueue), postQueue, blog); + return new TumblrLikedByCrawler(shellService, ct, pt, progress, crawlerService, webRequestFactory, + cookieService, GetTumblrDownloader(ct, pt, progress, blog, files, postQueue), postQueue, blog); case BlogTypes.tumblrsearch: - return new TumblrSearchCrawler(shellService, ct, pt, progress, crawlerService, webRequestFactory, cookieService, GetTumblrDownloader(ct, pt, progress, shellService, crawlerService, managerService, blog, files, postQueue), postQueue, blog); + return new TumblrSearchCrawler(shellService, ct, pt, progress, crawlerService, webRequestFactory, + cookieService, GetTumblrDownloader(ct, pt, progress, blog, files, postQueue), postQueue, blog); case BlogTypes.tumblrtagsearch: - return new TumblrTagSearchCrawler(shellService, ct, pt, progress, crawlerService, webRequestFactory, cookieService, GetTumblrDownloader(ct, pt, progress, shellService, crawlerService, managerService, blog, files, postQueue), postQueue, blog); + return new TumblrTagSearchCrawler(shellService, ct, pt, progress, crawlerService, webRequestFactory, + cookieService, GetTumblrDownloader(ct, pt, progress, blog, files, postQueue), postQueue, blog); default: throw new ArgumentException("Website is not supported!", "blogType"); } } - private IFiles LoadFiles(IBlog blog, IManagerService managerService) + private IFiles LoadFiles(IBlog blog) { if (settings.LoadAllDatabases) { - return managerService.Databases.Where(file => file.Name.Equals(blog.Name) && file.BlogType.Equals(blog.BlogType)).FirstOrDefault(); + return managerService.Databases.FirstOrDefault(file => + file.Name.Equals(blog.Name) && file.BlogType.Equals(blog.BlogType)); } + return new Files().Load(blog.ChildId); } @@ -133,17 +147,21 @@ private static IBlogService GetBlogService(IBlog blog, IFiles files) return new BlogService(blog, files); } - private TumblrDownloader GetTumblrDownloader(CancellationToken ct, PauseToken pt, IProgress progress, IShellService shellService, ICrawlerService crawlerService, IManagerService managerService, IBlog blog, IFiles files, IPostQueue postQueue) + private TumblrDownloader GetTumblrDownloader(CancellationToken ct, PauseToken pt, IProgress progress, + IBlog blog, IFiles files, IPostQueue postQueue) { - return new TumblrDownloader(shellService, managerService, ct, pt, progress, postQueue, GetFileDownloader(ct), crawlerService, blog, files); + return new TumblrDownloader(shellService, managerService, ct, pt, progress, postQueue, GetFileDownloader(ct), + crawlerService, blog, files); } - private TumblrXmlDownloader GetTumblrXmlDownloader(IShellService shellService, CancellationToken ct, PauseToken pt, IPostQueue> xmlQueue, ICrawlerService crawlerService, IBlog blog) + private TumblrXmlDownloader GetTumblrXmlDownloader(CancellationToken ct, PauseToken pt, + IPostQueue> xmlQueue, IBlog blog) { return new TumblrXmlDownloader(shellService, ct, pt, xmlQueue, crawlerService, blog); } - private TumblrJsonDownloader GetTumblrJsonDownloader(IShellService shellService, CancellationToken ct, PauseToken pt, IPostQueue> jsonQueue, ICrawlerService crawlerService, IBlog blog) + private TumblrJsonDownloader GetTumblrJsonDownloader(CancellationToken ct, PauseToken pt, + IPostQueue> jsonQueue, IBlog blog) { return new TumblrJsonDownloader(shellService, ct, pt, jsonQueue, crawlerService, blog); } @@ -158,14 +176,14 @@ private ITumblrApiXmlToTextParser GetTumblrApiXmlToTextParser() return new TumblrApiXmlToTextParser(); } - private ITumblrToTextParser GetTumblrApiJsonToTextParser(IBlog blog) + private ITumblrToTextParser GetTumblrApiJsonToTextParser(IBlog blog) { switch (blog.MetadataFormat) { case MetadataType.Text: - return new TumblrApiJsonToTextParser(); + return new TumblrApiJsonToTextParser(); case MetadataType.Json: - return new TumblrApiJsonToJsonParser(); + return new TumblrApiJsonToJsonParser(); default: throw new ArgumentException("Website is not supported!", "blogType"); } diff --git a/src/TumblThree/TumblThree.Applications/Crawler/ICrawlerFactory.cs b/src/TumblThree/TumblThree.Applications/Crawler/ICrawlerFactory.cs index a8b849f..f6bcd3e 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/ICrawlerFactory.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/ICrawlerFactory.cs @@ -2,8 +2,7 @@ using System.Threading; using TumblThree.Applications.DataModels; -using TumblThree.Applications.Services; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Crawler { @@ -11,6 +10,6 @@ public interface ICrawlerFactory { ICrawler GetCrawler(IBlog blog); - ICrawler GetCrawler(IBlog blog, CancellationToken ct, PauseToken pt, IProgress progress, IShellService shellService, ICrawlerService crawlerService, IManagerService managerService); + ICrawler GetCrawler(IBlog blog, CancellationToken ct, PauseToken pt, IProgress progress); } } diff --git a/src/TumblThree/TumblThree.Applications/Crawler/ITumblrBlogDetector.cs b/src/TumblThree/TumblThree.Applications/Crawler/ITumblrBlogDetector.cs index eb1dfa7..dd34628 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/ITumblrBlogDetector.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/ITumblrBlogDetector.cs @@ -8,4 +8,4 @@ interface ITumblrBlogDetector Task IsTumblrBlog(string url); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Crawler/TumblrBlogCrawler.cs b/src/TumblThree/TumblThree.Applications/Crawler/TumblrBlogCrawler.cs index 5af8649..9cff254 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/TumblrBlogCrawler.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/TumblrBlogCrawler.cs @@ -8,6 +8,7 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; + using TumblThree.Applications.DataModels; using TumblThree.Applications.DataModels.TumblrCrawlerData; using TumblThree.Applications.DataModels.TumblrPosts; @@ -17,7 +18,7 @@ using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Crawler { @@ -41,11 +42,12 @@ public class TumblrBlogCrawler : AbstractTumblrCrawler, ICrawler private string tumblrKey = string.Empty; - public TumblrBlogCrawler(IShellService shellService, CancellationToken ct, PauseToken pt, IProgress progress, - ICrawlerService crawlerService, IWebRequestFactory webRequestFactory, ISharedCookieService cookieService, IDownloader downloader, - ICrawlerDataDownloader crawlerDataDownloader, ITumblrToTextParser tumblrJsonParser, IImgurParser imgurParser, - IGfycatParser gfycatParser, IWebmshareParser webmshareParser, IMixtapeParser mixtapeParser, IUguuParser uguuParser, - ISafeMoeParser safemoeParser, ILoliSafeParser lolisafeParser, ICatBoxParser catboxParser, IPostQueue postQueue, + public TumblrBlogCrawler(IShellService shellService, CancellationToken ct, PauseToken pt, + IProgress progress, ICrawlerService crawlerService, IWebRequestFactory webRequestFactory, + ISharedCookieService cookieService, IDownloader downloader, ICrawlerDataDownloader crawlerDataDownloader, + ITumblrToTextParser tumblrJsonParser, IImgurParser imgurParser, IGfycatParser gfycatParser, + IWebmshareParser webmshareParser, IMixtapeParser mixtapeParser, IUguuParser uguuParser, ISafeMoeParser safemoeParser, + ILoliSafeParser lolisafeParser, ICatBoxParser catboxParser, IPostQueue postQueue, IPostQueue> jsonQueue, IBlog blog) : base(shellService, crawlerService, ct, progress, webRequestFactory, cookieService, postQueue, blog) { @@ -84,6 +86,7 @@ public override async Task IsBlogOnlineAsync() blog.Online = true; return; } + if (resp.StatusCode == HttpStatusCode.NotFound) { Logger.Error("TumblrBlogCrawler:IsBlogOnlineAsync:WebException {0}", webException); @@ -91,6 +94,7 @@ public override async Task IsBlogOnlineAsync() blog.Online = false; return; } + // 429: Too Many Requests if ((int)resp.StatusCode == 429) { @@ -117,6 +121,7 @@ public override async Task UpdateMetaInformationAsync() { return; } + tumblrKey = await UpdateTumblrKey("https://www.tumblr.com/dashboard/blog/" + blog.Name); string document = await GetSvcPageAsync("1", "0"); var response = ConvertJsonToClass(document); @@ -189,6 +194,7 @@ protected override IEnumerable GetPageNumbers() { return Enumerable.Range(0, shellService.Settings.ConcurrentScans); } + return RangeToSequence(blog.DownloadPages); } @@ -254,6 +260,7 @@ private async Task> GetUrlsAsync() } })()); } + await Task.WhenAll(trackedTasks); jsonQueue.CompleteAdding(); @@ -282,6 +289,7 @@ private async Task GetHighestPostIdAsync() shellService.ShowError(webException, Resources.LimitExceeded, blog.Name); } } + return 0; } catch (TimeoutException timeoutException) @@ -314,17 +322,20 @@ private bool PostWithinTimeSpan(Post post) DateTimeStyles.None); downloadFromUnixTime = new DateTimeOffset(downloadFrom).ToUnixTimeSeconds(); } + if (!string.IsNullOrEmpty(blog.DownloadTo)) { DateTime downloadTo = DateTime.ParseExact(blog.DownloadTo, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); downloadToUnixTime = new DateTimeOffset(downloadTo).ToUnixTimeSeconds(); } + long postTime = 0; postTime = Convert.ToInt64(post.timestamp); if (downloadFromUnixTime >= postTime || postTime >= downloadToUnixTime) return false; } + return true; } @@ -351,6 +362,7 @@ private async Task CheckIfLoggedInAsync() shellService.ShowError(timeoutException, Resources.TimeoutReached, Resources.Crawling, blog.Name); return false; } + return true; } @@ -361,6 +373,7 @@ private async Task GetSvcPageAsync(string limit, string offset) crawlerService.Timeconstraint.Acquire(); return await RequestDataAsync(limit, offset); } + return await RequestDataAsync(limit, offset); } @@ -370,12 +383,13 @@ protected virtual async Task RequestDataAsync(string limit, string offse try { string url = @"https://www.tumblr.com/svc/indash_blog?tumblelog_name_or_id=" + blog.Name + - @"&post_id=&limit=" + limit + "&offset=" + offset + "&should_bypass_safemode=true"; + @"&post_id=&limit=" + limit + "&offset=" + offset + "&should_bypass_safemode=true"; string referer = @"https://www.tumblr.com/dashboard/blog/" + blog.Name; var headers = new Dictionary { { "X-tumblr-form-key", tumblrKey } }; HttpWebRequest request = webRequestFactory.CreateGetXhrReqeust(url, referer, headers); cookieService.GetUriCookie(request.CookieContainer, new Uri("https://www.tumblr.com/")); - cookieService.GetUriCookie(request.CookieContainer, new Uri("https://" + blog.Name.Replace("+", "-") + ".tumblr.com")); + cookieService.GetUriCookie(request.CookieContainer, + new Uri("https://" + blog.Name.Replace("+", "-") + ".tumblr.com")); requestRegistration = ct.Register(() => request.Abort()); return await webRequestFactory.ReadReqestToEnd(request); } @@ -393,6 +407,7 @@ private async Task AddUrlsToDownloadList(TumblrJson response, int crawlerNumber) { return; } + if (pt.IsPaused) { pt.WaitWhilePausedWithResponseAsyc().Wait(); @@ -446,6 +461,7 @@ private bool CheckPostAge(TumblrJson document) { return false; } + return true; } @@ -457,6 +473,7 @@ private bool CheckIfDownloadRebloggedPosts(Post post) return true; return false; } + return true; } @@ -492,6 +509,7 @@ private void AddPhotoUrlToDownloadList(TumblrJson document) } } } + // check for inline images if (post.type != "photo" && CheckIfContainsTaggedPost(post)) { @@ -507,9 +525,9 @@ private void AddPhotoUrl(Post post) string postId = post.id; foreach (Photo photo in post.photos) { - string imageUrl = photo.alt_sizes.Where(url => url.width == int.Parse(ImageSize())).Select(url => url.url).FirstOrDefault(); - if (imageUrl == null) - imageUrl = photo.alt_sizes.FirstOrDefault().url; + string imageUrl = photo.alt_sizes.Where(url => url.width == int.Parse(ImageSize())).Select(url => url.url) + .FirstOrDefault() ?? + photo.alt_sizes.FirstOrDefault().url; if (blog.SkipGif && imageUrl.EndsWith(".gif")) { @@ -535,12 +553,12 @@ private void AddInlinePhotoUrl(Post post) { continue; } + AddToDownloadList(new PhotoPost(imageUrl, postId, post.timestamp.ToString())); //AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } } - private void AddVideoUrlToDownloadList(TumblrJson document) { if (blog.DownloadVideo) @@ -563,6 +581,7 @@ private void AddVideoUrlToDownloadList(TumblrJson document) } } } + // check for inline videos if (post.type != "video" && CheckIfContainsTaggedPost(post)) { @@ -587,9 +606,10 @@ private void AddVideoUrl(Post post) { if (!videoUrl.Contains("_480")) { - videoUrl.Replace(".mp4", "_480.mp4"); + videoUrl = videoUrl.Replace(".mp4", "_480.mp4"); } } + AddToDownloadList(new VideoPost(videoUrl, postId, post.timestamp.ToString())); AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(videoUrl.Split('/').Last(), ".json"), post)); } @@ -621,7 +641,8 @@ private void AddInlineVideoUrl(Post post) string videoUrl = match.Groups[2].Value; if (shellService.Settings.VideoSize == 1080) { - AddToDownloadList(new VideoPost("https://vtt.tumblr.com/" + videoUrl + ".mp4", post.id, post.timestamp.ToString())); + AddToDownloadList(new VideoPost("https://vtt.tumblr.com/" + videoUrl + ".mp4", post.id, + post.timestamp.ToString())); //AddToJsonQueue(new TumblrCrawlerData(videoUrl + ".json", post)); } else if (shellService.Settings.VideoSize == 480) @@ -651,7 +672,8 @@ private void AddAudioUrlToDownloadList(TumblrJson document) if (!audioUrl.EndsWith(".mp3")) audioUrl = audioUrl + ".mp3"; AddToDownloadList(new AudioPost(audioUrl, postId, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(audioUrl.Split('/').Last(), ".json"), post)); + AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(audioUrl.Split('/').Last(), ".json"), + post)); } } } @@ -878,9 +900,11 @@ private async Task AddImgurUrl(TumblrJson document) { continue; } + AddToDownloadList(new ExternalPhotoPost(imageUrl, imgurId, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); + AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), + post)); } // album urls @@ -892,14 +916,14 @@ private async Task AddImgurUrl(TumblrJson document) string album = await imgurParser.RequestImgurAlbumSite(albumUrl); Regex hashRegex = imgurParser.GetImgurAlbumHashRegex(); - var hashMatches = hashRegex.Matches(album); - var hashes = hashMatches.Cast().Select(hashMatch => hashMatch.Groups[1].Value).ToList(); + MatchCollection hashMatches = hashRegex.Matches(album); + List hashes = hashMatches.Cast().Select(hashMatch => hashMatch.Groups[1].Value).ToList(); Regex extRegex = imgurParser.GetImgurAlbumExtRegex(); - var extMatches = extRegex.Matches(album); - var exts = extMatches.Cast().Select(extMatch => extMatch.Groups[1].Value).ToList(); + MatchCollection extMatches = extRegex.Matches(album); + List exts = extMatches.Cast().Select(extMatch => extMatch.Groups[1].Value).ToList(); - var imageUrls = hashes.Zip(exts, (hash, ext) => "https://i.imgur.com/" + hash + ext); + IEnumerable imageUrls = hashes.Zip(exts, (hash, ext) => "https://i.imgur.com/" + hash + ext); foreach (string imageUrl in imageUrls) { @@ -907,7 +931,8 @@ private async Task AddImgurUrl(TumblrJson document) continue; AddToDownloadList(new ExternalPhotoPost(imageUrl, imgurId, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } } } @@ -935,10 +960,12 @@ private async Task AddGfycatUrl(TumblrJson document) { continue; } + // TODO: postID AddToDownloadList(new VideoPost(videoUrl, gfyId, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(videoUrl.Split('/').Last(), ".json"), post)); + AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(videoUrl.Split('/').Last(), ".json"), + post)); } } } @@ -953,6 +980,7 @@ private void AddWebmshareUrl(TumblrJson document) { continue; } + if (CheckIfContainsTaggedPost(post)) { if (CheckIfDownloadRebloggedPosts(post)) @@ -967,10 +995,12 @@ private void AddWebmshareUrl(TumblrJson document) { continue; } + // TODO: postID AddToDownloadList(new VideoPost(imageUrl, webmshareId, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); + AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), + post)); } } } @@ -994,7 +1024,6 @@ private void AddMixtapeUrl(TumblrJson document) string[] parts = post.caption.Split(new string[] { "href=" }, StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { - foreach (Match match in regex.Matches(part)) { string temp = match.Groups[0].ToString(); @@ -1009,10 +1038,9 @@ private void AddMixtapeUrl(TumblrJson document) AddToDownloadList(new ExternalVideoPost(imageUrl, id, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); - + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } - } } } @@ -1036,14 +1064,12 @@ private void AddUguuUrl(TumblrJson document) string[] parts = post.caption.Split(new string[] { "href=" }, StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { - foreach (Match match in regex.Matches(part)) { string temp = match.Groups[0].ToString(); string id = match.Groups[2].Value; string url = temp.Split('\"').First(); - string imageUrl = uguuParser.CreateUguuUrl(id, url, blog.UguuType); if (blog.SkipGif && imageUrl.EndsWith(".gif")) { @@ -1052,10 +1078,9 @@ private void AddUguuUrl(TumblrJson document) AddToDownloadList(new ExternalVideoPost(imageUrl, id, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); - + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } - } } } @@ -1079,14 +1104,12 @@ private void AddSafeMoeUrl(TumblrJson document) string[] parts = post.caption.Split(new string[] { "href=" }, StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { - foreach (Match match in regex.Matches(part)) { string temp = match.Groups[0].ToString(); string id = match.Groups[2].Value; string url = temp.Split('\"').First(); - string imageUrl = safemoeParser.CreateSafeMoeUrl(id, url, blog.SafeMoeType); if (blog.SkipGif && imageUrl.EndsWith(".gif")) { @@ -1095,10 +1118,9 @@ private void AddSafeMoeUrl(TumblrJson document) AddToDownloadList(new ExternalVideoPost(imageUrl, id, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); - + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } - } } } @@ -1122,7 +1144,6 @@ private void AddLoliSafeUrl(TumblrJson document) string[] parts = post.caption.Split(new string[] { "href=" }, StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { - foreach (Match match in regex.Matches(part)) { string temp = match.Groups[0].ToString(); @@ -1137,10 +1158,9 @@ private void AddLoliSafeUrl(TumblrJson document) AddToDownloadList(new ExternalVideoPost(imageUrl, id, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); - + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } - } } } @@ -1164,7 +1184,6 @@ private void AddCatBoxUrl(TumblrJson document) string[] parts = post.caption.Split(new string[] { "href=" }, StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { - foreach (Match match in regex.Matches(part)) { string temp = match.Groups[0].ToString(); @@ -1179,10 +1198,9 @@ private void AddCatBoxUrl(TumblrJson document) AddToDownloadList(new ExternalVideoPost(imageUrl, id, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); - + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } - } } } diff --git a/src/TumblThree/TumblThree.Applications/Crawler/TumblrBlogDetector.cs b/src/TumblThree/TumblThree.Applications/Crawler/TumblrBlogDetector.cs index 18fd419..6d41a46 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/TumblrBlogDetector.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/TumblrBlogDetector.cs @@ -16,7 +16,8 @@ class TumblrBlogDetector : ITumblrBlogDetector protected readonly ISharedCookieService cookieService; [ImportingConstructor] - public TumblrBlogDetector(IShellService shellService, ISharedCookieService cookieService, IWebRequestFactory webRequestFactory) + public TumblrBlogDetector(IShellService shellService, ISharedCookieService cookieService, + IWebRequestFactory webRequestFactory) { this.webRequestFactory = webRequestFactory; this.cookieService = cookieService; @@ -56,6 +57,7 @@ private async Task GetUrlRedirection(string url) { location = response.ResponseUri.ToString(); } + return location; } } diff --git a/src/TumblThree/TumblThree.Applications/Crawler/TumblrHiddenCrawler.cs b/src/TumblThree/TumblThree.Applications/Crawler/TumblrHiddenCrawler.cs index ac13686..f1e4bb0 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/TumblrHiddenCrawler.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/TumblrHiddenCrawler.cs @@ -8,6 +8,7 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; + using TumblThree.Applications.DataModels; using TumblThree.Applications.DataModels.TumblrCrawlerData; using TumblThree.Applications.DataModels.TumblrPosts; @@ -17,7 +18,7 @@ using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Crawler { @@ -41,11 +42,12 @@ public class TumblrHiddenCrawler : AbstractTumblrCrawler, ICrawler private string tumblrKey = string.Empty; - public TumblrHiddenCrawler(IShellService shellService, CancellationToken ct, PauseToken pt, IProgress progress, - ICrawlerService crawlerService, IWebRequestFactory webRequestFactory, ISharedCookieService cookieService, IDownloader downloader, - ICrawlerDataDownloader crawlerDataDownloader, ITumblrToTextParser tumblrJsonParser, IImgurParser imgurParser, - IGfycatParser gfycatParser, IWebmshareParser webmshareParser, IMixtapeParser mixtapeParser, IUguuParser uguuParser, - ISafeMoeParser safemoeParser, ILoliSafeParser lolisafeParser, ICatBoxParser catboxParser, IPostQueue postQueue, + public TumblrHiddenCrawler(IShellService shellService, CancellationToken ct, PauseToken pt, + IProgress progress, ICrawlerService crawlerService, IWebRequestFactory webRequestFactory, + ISharedCookieService cookieService, IDownloader downloader, ICrawlerDataDownloader crawlerDataDownloader, + ITumblrToTextParser tumblrJsonParser, IImgurParser imgurParser, IGfycatParser gfycatParser, + IWebmshareParser webmshareParser, IMixtapeParser mixtapeParser, IUguuParser uguuParser, ISafeMoeParser safemoeParser, + ILoliSafeParser lolisafeParser, ICatBoxParser catboxParser, IPostQueue postQueue, IPostQueue> jsonQueue, IBlog blog) : base(shellService, crawlerService, ct, progress, webRequestFactory, cookieService, postQueue, blog) { @@ -84,6 +86,7 @@ public override async Task IsBlogOnlineAsync() blog.Online = true; return; } + if (resp.StatusCode == HttpStatusCode.NotFound) { Logger.Error("TumblrBlogCrawler:IsBlogOnlineAsync:WebException {0}", webException); @@ -91,6 +94,7 @@ public override async Task IsBlogOnlineAsync() blog.Online = false; return; } + // 429: Too Many Requests if ((int)resp.StatusCode == 429) { @@ -117,6 +121,7 @@ public override async Task UpdateMetaInformationAsync() { return; } + tumblrKey = await UpdateTumblrKey("https://www.tumblr.com/dashboard/blog/" + blog.Name); string document = await GetSvcPageAsync("1", "0"); var response = ConvertJsonToClass(document); @@ -189,6 +194,7 @@ protected override IEnumerable GetPageNumbers() { return Enumerable.Range(0, shellService.Settings.ConcurrentScans); } + return RangeToSequence(blog.DownloadPages); } @@ -254,6 +260,7 @@ private async Task> GetUrlsAsync() } })()); } + await Task.WhenAll(trackedTasks); jsonQueue.CompleteAdding(); @@ -282,6 +289,7 @@ private async Task GetHighestPostIdAsync() shellService.ShowError(webException, Resources.LimitExceeded, blog.Name); } } + return 0; } catch (TimeoutException timeoutException) @@ -314,17 +322,20 @@ private bool PostWithinTimeSpan(Post post) DateTimeStyles.None); downloadFromUnixTime = new DateTimeOffset(downloadFrom).ToUnixTimeSeconds(); } + if (!string.IsNullOrEmpty(blog.DownloadTo)) { DateTime downloadTo = DateTime.ParseExact(blog.DownloadTo, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); downloadToUnixTime = new DateTimeOffset(downloadTo).ToUnixTimeSeconds(); } + long postTime = 0; postTime = Convert.ToInt64(post.timestamp); if (downloadFromUnixTime >= postTime || postTime >= downloadToUnixTime) return false; } + return true; } @@ -351,6 +362,7 @@ private async Task CheckIfLoggedInAsync() shellService.ShowError(timeoutException, Resources.TimeoutReached, Resources.Crawling, blog.Name); return false; } + return true; } @@ -361,6 +373,7 @@ private async Task GetSvcPageAsync(string limit, string offset) crawlerService.Timeconstraint.Acquire(); return await RequestDataAsync(limit, offset); } + return await RequestDataAsync(limit, offset); } @@ -370,12 +383,13 @@ protected virtual async Task RequestDataAsync(string limit, string offse try { string url = @"https://www.tumblr.com/svc/indash_blog?tumblelog_name_or_id=" + blog.Name + - @"&post_id=&limit=" + limit + "&offset=" + offset + "&should_bypass_safemode=true"; + @"&post_id=&limit=" + limit + "&offset=" + offset + "&should_bypass_safemode=true"; string referer = @"https://www.tumblr.com/dashboard/blog/" + blog.Name; var headers = new Dictionary { { "X-tumblr-form-key", tumblrKey } }; HttpWebRequest request = webRequestFactory.CreateGetXhrReqeust(url, referer, headers); cookieService.GetUriCookie(request.CookieContainer, new Uri("https://www.tumblr.com/")); - cookieService.GetUriCookie(request.CookieContainer, new Uri("https://" + blog.Name.Replace("+", "-") + ".tumblr.com")); + cookieService.GetUriCookie(request.CookieContainer, + new Uri("https://" + blog.Name.Replace("+", "-") + ".tumblr.com")); requestRegistration = ct.Register(() => request.Abort()); return await webRequestFactory.ReadReqestToEnd(request); } @@ -393,6 +407,7 @@ private async Task AddUrlsToDownloadList(TumblrJson response, int crawlerNumber) { return; } + if (pt.IsPaused) { pt.WaitWhilePausedWithResponseAsyc().Wait(); @@ -446,6 +461,7 @@ private bool CheckPostAge(TumblrJson document) { return false; } + return true; } @@ -457,6 +473,7 @@ private bool CheckIfDownloadRebloggedPosts(Post post) return true; return false; } + return true; } @@ -492,6 +509,7 @@ private void AddPhotoUrlToDownloadList(TumblrJson document) } } } + // check for inline images if (post.type != "photo" && CheckIfContainsTaggedPost(post)) { @@ -507,9 +525,9 @@ private void AddPhotoUrl(Post post) string postId = post.id; foreach (Photo photo in post.photos) { - string imageUrl = photo.alt_sizes.Where(url => url.width == int.Parse(ImageSize())).Select(url => url.url).FirstOrDefault(); - if (imageUrl == null) - imageUrl = photo.alt_sizes.FirstOrDefault().url; + string imageUrl = photo.alt_sizes.Where(url => url.width == int.Parse(ImageSize())).Select(url => url.url) + .FirstOrDefault() ?? + photo.alt_sizes.FirstOrDefault().url; if (blog.SkipGif && imageUrl.EndsWith(".gif")) { @@ -535,12 +553,12 @@ private void AddInlinePhotoUrl(Post post) { continue; } + AddToDownloadList(new PhotoPost(imageUrl, postId, post.timestamp.ToString())); //AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } } - private void AddVideoUrlToDownloadList(TumblrJson document) { if (blog.DownloadVideo) @@ -563,6 +581,7 @@ private void AddVideoUrlToDownloadList(TumblrJson document) } } } + // check for inline videos if (post.type != "video" && CheckIfContainsTaggedPost(post)) { @@ -587,9 +606,10 @@ private void AddVideoUrl(Post post) { if (!videoUrl.Contains("_480")) { - videoUrl.Replace(".mp4", "_480.mp4"); + videoUrl = videoUrl.Replace(".mp4", "_480.mp4"); } } + AddToDownloadList(new VideoPost(videoUrl, postId, post.timestamp.ToString())); AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(videoUrl.Split('/').Last(), ".json"), post)); } @@ -621,7 +641,8 @@ private void AddInlineVideoUrl(Post post) string videoUrl = match.Groups[2].Value; if (shellService.Settings.VideoSize == 1080) { - AddToDownloadList(new VideoPost("https://vtt.tumblr.com/" + videoUrl + ".mp4", post.id, post.timestamp.ToString())); + AddToDownloadList(new VideoPost("https://vtt.tumblr.com/" + videoUrl + ".mp4", post.id, + post.timestamp.ToString())); //AddToJsonQueue(new TumblrCrawlerData(videoUrl + ".json", post)); } else if (shellService.Settings.VideoSize == 480) @@ -651,7 +672,8 @@ private void AddAudioUrlToDownloadList(TumblrJson document) if (!audioUrl.EndsWith(".mp3")) audioUrl = audioUrl + ".mp3"; AddToDownloadList(new AudioPost(audioUrl, postId, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(audioUrl.Split('/').Last(), ".json"), post)); + AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(audioUrl.Split('/').Last(), ".json"), + post)); } } } @@ -878,9 +900,11 @@ private async Task AddImgurUrl(TumblrJson document) { continue; } + AddToDownloadList(new ExternalPhotoPost(imageUrl, imgurId, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); + AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), + post)); } // album urls @@ -892,14 +916,14 @@ private async Task AddImgurUrl(TumblrJson document) string album = await imgurParser.RequestImgurAlbumSite(albumUrl); Regex hashRegex = imgurParser.GetImgurAlbumHashRegex(); - var hashMatches = hashRegex.Matches(album); - var hashes = hashMatches.Cast().Select(hashMatch => hashMatch.Groups[1].Value).ToList(); + MatchCollection hashMatches = hashRegex.Matches(album); + List hashes = hashMatches.Cast().Select(hashMatch => hashMatch.Groups[1].Value).ToList(); Regex extRegex = imgurParser.GetImgurAlbumExtRegex(); - var extMatches = extRegex.Matches(album); - var exts = extMatches.Cast().Select(extMatch => extMatch.Groups[1].Value).ToList(); + MatchCollection extMatches = extRegex.Matches(album); + List exts = extMatches.Cast().Select(extMatch => extMatch.Groups[1].Value).ToList(); - var imageUrls = hashes.Zip(exts, (hash, ext) => "https://i.imgur.com/" + hash + ext); + IEnumerable imageUrls = hashes.Zip(exts, (hash, ext) => "https://i.imgur.com/" + hash + ext); foreach (string imageUrl in imageUrls) { @@ -907,7 +931,8 @@ private async Task AddImgurUrl(TumblrJson document) continue; AddToDownloadList(new ExternalPhotoPost(imageUrl, imgurId, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } } } @@ -935,10 +960,12 @@ private async Task AddGfycatUrl(TumblrJson document) { continue; } + // TODO: postID AddToDownloadList(new VideoPost(videoUrl, gfyId, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(videoUrl.Split('/').Last(), ".json"), post)); + AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(videoUrl.Split('/').Last(), ".json"), + post)); } } } @@ -953,6 +980,7 @@ private void AddWebmshareUrl(TumblrJson document) { continue; } + if (CheckIfContainsTaggedPost(post)) { if (CheckIfDownloadRebloggedPosts(post)) @@ -967,10 +995,12 @@ private void AddWebmshareUrl(TumblrJson document) { continue; } + // TODO: postID AddToDownloadList(new VideoPost(imageUrl, webmshareId, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); + AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), + post)); } } } @@ -994,7 +1024,6 @@ private void AddMixtapeUrl(TumblrJson document) string[] parts = post.caption.Split(new string[] { "href=" }, StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { - foreach (Match match in regex.Matches(part)) { string temp = match.Groups[0].ToString(); @@ -1009,10 +1038,9 @@ private void AddMixtapeUrl(TumblrJson document) AddToDownloadList(new ExternalVideoPost(imageUrl, id, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); - + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } - } } } @@ -1036,14 +1064,12 @@ private void AddUguuUrl(TumblrJson document) string[] parts = post.caption.Split(new string[] { "href=" }, StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { - foreach (Match match in regex.Matches(part)) { string temp = match.Groups[0].ToString(); string id = match.Groups[2].Value; string url = temp.Split('\"').First(); - string imageUrl = uguuParser.CreateUguuUrl(id, url, blog.UguuType); if (blog.SkipGif && imageUrl.EndsWith(".gif")) { @@ -1052,10 +1078,9 @@ private void AddUguuUrl(TumblrJson document) AddToDownloadList(new ExternalVideoPost(imageUrl, id, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); - + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } - } } } @@ -1079,14 +1104,12 @@ private void AddSafeMoeUrl(TumblrJson document) string[] parts = post.caption.Split(new string[] { "href=" }, StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { - foreach (Match match in regex.Matches(part)) { string temp = match.Groups[0].ToString(); string id = match.Groups[2].Value; string url = temp.Split('\"').First(); - string imageUrl = safemoeParser.CreateSafeMoeUrl(id, url, blog.SafeMoeType); if (blog.SkipGif && imageUrl.EndsWith(".gif")) { @@ -1095,10 +1118,9 @@ private void AddSafeMoeUrl(TumblrJson document) AddToDownloadList(new ExternalVideoPost(imageUrl, id, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); - + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } - } } } @@ -1122,7 +1144,6 @@ private void AddLoliSafeUrl(TumblrJson document) string[] parts = post.caption.Split(new string[] { "href=" }, StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { - foreach (Match match in regex.Matches(part)) { string temp = match.Groups[0].ToString(); @@ -1137,10 +1158,9 @@ private void AddLoliSafeUrl(TumblrJson document) AddToDownloadList(new ExternalVideoPost(imageUrl, id, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); - + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } - } } } @@ -1164,7 +1184,6 @@ private void AddCatBoxUrl(TumblrJson document) string[] parts = post.caption.Split(new string[] { "href=" }, StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { - foreach (Match match in regex.Matches(part)) { string temp = match.Groups[0].ToString(); @@ -1179,10 +1198,9 @@ private void AddCatBoxUrl(TumblrJson document) AddToDownloadList(new ExternalVideoPost(imageUrl, id, post.timestamp.ToString())); - AddToJsonQueue(new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); - + AddToJsonQueue( + new TumblrCrawlerData(Path.ChangeExtension(imageUrl.Split('/').Last(), ".json"), post)); } - } } } diff --git a/src/TumblThree/TumblThree.Applications/Crawler/TumblrLikedByCrawler.cs b/src/TumblThree/TumblThree.Applications/Crawler/TumblrLikedByCrawler.cs index f3bad6c..e388e6c 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/TumblrLikedByCrawler.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/TumblrLikedByCrawler.cs @@ -14,7 +14,7 @@ using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Crawler { @@ -25,9 +25,9 @@ public class TumblrLikedByCrawler : AbstractTumblrCrawler, ICrawler private readonly IDownloader downloader; private readonly PauseToken pt; - public TumblrLikedByCrawler(IShellService shellService, CancellationToken ct, PauseToken pt, IProgress progress, - ICrawlerService crawlerService, IWebRequestFactory webRequestFactory, ISharedCookieService cookieService, - IDownloader downloader, IPostQueue postQueue, IBlog blog) + public TumblrLikedByCrawler(IShellService shellService, CancellationToken ct, PauseToken pt, + IProgress progress, ICrawlerService crawlerService, IWebRequestFactory webRequestFactory, + ISharedCookieService cookieService, IDownloader downloader, IPostQueue postQueue, IBlog blog) : base(shellService, crawlerService, ct, progress, webRequestFactory, cookieService, postQueue, blog) { this.downloader = downloader; @@ -103,6 +103,7 @@ private async Task GetUrlsAsync() } })()); } + await Task.WhenAll(trackedTasks); postQueue.CompleteAdding(); @@ -136,11 +137,12 @@ private long CreateStartPagination() long pagination = DateTimeOffset.Now.ToUnixTimeSeconds(); if (!string.IsNullOrEmpty(blog.DownloadTo)) { - var downloadTo = DateTime.ParseExact(blog.DownloadTo, "yyyyMMdd", CultureInfo.InvariantCulture, + DateTime downloadTo = DateTime.ParseExact(blog.DownloadTo, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); var dateTimeOffset = new DateTimeOffset(downloadTo); pagination = dateTimeOffset.ToUnixTimeSeconds(); } + return pagination; } @@ -175,6 +177,7 @@ private async Task AddUrlsToDownloadList(long pagination, int crawlerNumber) { return; } + if (pt.IsPaused) { pt.WaitWhilePausedWithResponseAsyc().Wait(); @@ -221,12 +224,13 @@ private bool CheckIfWithinTimespan(long pagination) { if (!string.IsNullOrEmpty(blog.DownloadFrom)) { - var downloadFrom = DateTime.ParseExact(blog.DownloadFrom, "yyyyMMdd", CultureInfo.InvariantCulture, + DateTime downloadFrom = DateTime.ParseExact(blog.DownloadFrom, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); var dateTimeOffset = new DateTimeOffset(downloadFrom); if (pagination < dateTimeOffset.ToUnixTimeSeconds()) return false; } + return true; } @@ -244,6 +248,7 @@ private void AddPhotoUrlToDownloadList(string document) { continue; } + imageUrl = ResizeTumblrImageUrl(imageUrl); // TODO: add valid postID AddToDownloadList(new PhotoPost(imageUrl, Guid.NewGuid().ToString("N"))); @@ -263,7 +268,8 @@ private void AddVideoUrlToDownloadList(string document) if (shellService.Settings.VideoSize == 1080) { // TODO: add valid postID - AddToDownloadList(new VideoPost("https://vtt.tumblr.com/" + videoUrl + ".mp4", Guid.NewGuid().ToString("N"))); + AddToDownloadList(new VideoPost("https://vtt.tumblr.com/" + videoUrl + ".mp4", + Guid.NewGuid().ToString("N"))); } else if (shellService.Settings.VideoSize == 480) { diff --git a/src/TumblThree/TumblThree.Applications/Crawler/TumblrSearchCrawler.cs b/src/TumblThree/TumblThree.Applications/Crawler/TumblrSearchCrawler.cs index 15927e5..149de43 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/TumblrSearchCrawler.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/TumblrSearchCrawler.cs @@ -14,7 +14,7 @@ using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Crawler { @@ -26,9 +26,9 @@ public class TumblrSearchCrawler : AbstractTumblrCrawler, ICrawler private readonly PauseToken pt; private string tumblrKey = string.Empty; - public TumblrSearchCrawler(IShellService shellService, CancellationToken ct, PauseToken pt, IProgress progress, - ICrawlerService crawlerService, IWebRequestFactory webRequestFactory, ISharedCookieService cookieService, - IDownloader downloader, IPostQueue postQueue, IBlog blog) + public TumblrSearchCrawler(IShellService shellService, CancellationToken ct, PauseToken pt, + IProgress progress, ICrawlerService crawlerService, IWebRequestFactory webRequestFactory, + ISharedCookieService cookieService, IDownloader downloader, IPostQueue postQueue, IBlog blog) : base(shellService, crawlerService, ct, progress, webRequestFactory, cookieService, postQueue, blog) { this.downloader = downloader; @@ -100,6 +100,7 @@ private async Task GetUrlsAsync() } })()); } + await Task.WhenAll(trackedTasks); postQueue.CompleteAdding(); @@ -114,6 +115,7 @@ private async Task GetSearchPageAsync(int pageNumber) crawlerService.Timeconstraint.Acquire(); return await RequestPostAsync(pageNumber); } + return await RequestPostAsync(pageNumber); } @@ -131,7 +133,10 @@ protected virtual async Task RequestPostAsync(int pageNumber) //Example request body, searching for cars: //q=cars&sort=top&post_view=masonry&blogs_before=8&num_blogs_shown=8&num_posts_shown=20&before=24&blog_page=2&safe_mode=true&post_page=2&filter_nsfw=true&filter_post_type=&next_ad_offset=0&ad_placement_id=0&more_posts=true - string requestBody = "q=" + blog.Name + "&sort=top&post_view=masonry&num_posts_shown=" + ((pageNumber - 1) * blog.PageSize) + "&before=" + ((pageNumber - 1) * blog.PageSize) + "&safe_mode=false&post_page=" + pageNumber + "&filter_nsfw=false&filter_post_type=&next_ad_offset=0&ad_placement_id=0&more_posts=true"; + string requestBody = "q=" + blog.Name + "&sort=top&post_view=masonry&num_posts_shown=" + + ((pageNumber - 1) * blog.PageSize) + "&before=" + ((pageNumber - 1) * blog.PageSize) + + "&safe_mode=false&post_page=" + pageNumber + + "&filter_nsfw=false&filter_post_type=&next_ad_offset=0&ad_placement_id=0&more_posts=true"; await webRequestFactory.PerformPostXHRReqeust(request, requestBody); requestRegistration = ct.Register(() => request.Abort()); return await webRequestFactory.ReadReqestToEnd(request); @@ -150,6 +155,7 @@ private async Task AddUrlsToDownloadList(string response, int crawlerNumber) { return; } + if (pt.IsPaused) { pt.WaitWhilePausedWithResponseAsyc().Wait(); @@ -196,6 +202,7 @@ private void AddPhotoUrlToDownloadList(string document) { continue; } + imageUrl = ResizeTumblrImageUrl(imageUrl); // TODO: postID AddToDownloadList(new PhotoPost(imageUrl, Guid.NewGuid().ToString("N"))); @@ -215,7 +222,8 @@ private void AddVideoUrlToDownloadList(string document) if (shellService.Settings.VideoSize == 1080) { // TODO: postID - AddToDownloadList(new VideoPost("https://vtt.tumblr.com/" + videoUrl + ".mp4", Guid.NewGuid().ToString("N"))); + AddToDownloadList(new VideoPost("https://vtt.tumblr.com/" + videoUrl + ".mp4", + Guid.NewGuid().ToString("N"))); } else if (shellService.Settings.VideoSize == 480) { diff --git a/src/TumblThree/TumblThree.Applications/Crawler/TumblrTagSearchCrawler.cs b/src/TumblThree/TumblThree.Applications/Crawler/TumblrTagSearchCrawler.cs index e2c73fe..4c36e14 100644 --- a/src/TumblThree/TumblThree.Applications/Crawler/TumblrTagSearchCrawler.cs +++ b/src/TumblThree/TumblThree.Applications/Crawler/TumblrTagSearchCrawler.cs @@ -13,7 +13,7 @@ using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Crawler { @@ -24,9 +24,9 @@ public class TumblrTagSearchCrawler : AbstractTumblrCrawler, ICrawler private readonly IDownloader downloader; private readonly PauseToken pt; - public TumblrTagSearchCrawler(IShellService shellService, CancellationToken ct, PauseToken pt, IProgress progress, - ICrawlerService crawlerService, IWebRequestFactory webRequestFactory, ISharedCookieService cookieService, - IDownloader downloader, IPostQueue postQueue, IBlog blog) + public TumblrTagSearchCrawler(IShellService shellService, CancellationToken ct, PauseToken pt, + IProgress progress, ICrawlerService crawlerService, IWebRequestFactory webRequestFactory, + ISharedCookieService cookieService, IDownloader downloader, IPostQueue postQueue, IBlog blog) : base(shellService, crawlerService, ct, progress, webRequestFactory, cookieService, postQueue, blog) { this.downloader = downloader; @@ -91,7 +91,8 @@ private async Task GetUrlsAsync() try { long pagination = DateTimeOffset.Now.ToUnixTimeSeconds() - (pageNumber * crawlerTimeOffset); - long nextCrawlersPagination = DateTimeOffset.Now.ToUnixTimeSeconds() - ((pageNumber + 1) * crawlerTimeOffset); + long nextCrawlersPagination = + DateTimeOffset.Now.ToUnixTimeSeconds() - ((pageNumber + 1) * crawlerTimeOffset); await AddUrlsToDownloadList(pagination, nextCrawlersPagination); } catch (TimeoutException timeoutException) @@ -108,6 +109,7 @@ private async Task GetUrlsAsync() } })()); } + await Task.WhenAll(trackedTasks); postQueue.CompleteAdding(); @@ -120,19 +122,21 @@ private long GenerateCrawlerTimeOffsets() long tagsIntroduced = 1178470824; // Unix time of 05/06/2007 @ 5:00pm (UTC) if (!string.IsNullOrEmpty(blog.DownloadFrom)) { - var downloadFrom = DateTime.ParseExact(blog.DownloadFrom, "yyyyMMdd", CultureInfo.InvariantCulture, + DateTime downloadFrom = DateTime.ParseExact(blog.DownloadFrom, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); var dateTimeOffset = new DateTimeOffset(downloadFrom); tagsIntroduced = dateTimeOffset.ToUnixTimeSeconds(); } + long unixTimeNow = DateTimeOffset.Now.ToUnixTimeSeconds(); if (!string.IsNullOrEmpty(blog.DownloadTo)) { - var downloadTo = DateTime.ParseExact(blog.DownloadTo, "yyyyMMdd", CultureInfo.InvariantCulture, + DateTime downloadTo = DateTime.ParseExact(blog.DownloadTo, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); var dateTimeOffset = new DateTimeOffset(downloadTo); unixTimeNow = dateTimeOffset.ToUnixTimeSeconds(); } + long tagsLifeTime = unixTimeNow - tagsIntroduced; return tagsLifeTime / shellService.Settings.ConcurrentScans; } @@ -167,6 +171,7 @@ private async Task GetTaggedSearchPageAsync(long pagination) crawlerService.Timeconstraint.Acquire(); return await GetRequestAsync("https://www.tumblr.com/tagged/" + blog.Name + "?before=" + pagination); } + return await GetRequestAsync("https://www.tumblr.com/tagged/" + blog.Name + "?before=" + pagination); //string url = "https://www.tumblr.com/tagged/" + blog.Name + "?before=" + pagination; @@ -181,6 +186,7 @@ private async Task AddUrlsToDownloadList(long pagination, long nextCrawlersPagin { return; } + if (pt.IsPaused) { pt.WaitWhilePausedWithResponseAsyc().Wait(); @@ -217,12 +223,13 @@ private bool CheckIfWithinTimespan(long pagination) { if (!string.IsNullOrEmpty(blog.DownloadFrom)) { - var downloadFrom = DateTime.ParseExact(blog.DownloadFrom, "yyyyMMdd", CultureInfo.InvariantCulture, + DateTime downloadFrom = DateTime.ParseExact(blog.DownloadFrom, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None); var dateTimeOffset = new DateTimeOffset(downloadFrom); if (pagination < dateTimeOffset.ToUnixTimeSeconds()) return false; } + return true; } @@ -240,6 +247,7 @@ private void AddPhotoUrlToDownloadList(string document) { continue; } + imageUrl = ResizeTumblrImageUrl(imageUrl); // TODO: postID AddToDownloadList(new PhotoPost(imageUrl, Guid.NewGuid().ToString("N"))); @@ -259,7 +267,8 @@ private void AddVideoUrlToDownloadList(string document) if (shellService.Settings.VideoSize == 1080) { // TODO: postID - AddToDownloadList(new VideoPost("https://vtt.tumblr.com/" + videoUrl + ".mp4", Guid.NewGuid().ToString("N"))); + AddToDownloadList(new VideoPost("https://vtt.tumblr.com/" + videoUrl + ".mp4", + Guid.NewGuid().ToString("N"))); } else if (shellService.Settings.VideoSize == 480) { diff --git a/src/TumblThree/TumblThree.Applications/Data/SupportedFileTypes.cs b/src/TumblThree/TumblThree.Applications/Data/SupportedFileTypes.cs index a135cc9..5c20964 100644 --- a/src/TumblThree/TumblThree.Applications/Data/SupportedFileTypes.cs +++ b/src/TumblThree/TumblThree.Applications/Data/SupportedFileTypes.cs @@ -13,6 +13,5 @@ internal static class SupportedFileTypes public static IReadOnlyList QueueFileExtensions => queueFileExtensions; public static IReadOnlyList BloglistExportFileType => bloglistExportFileType; - } } diff --git a/src/TumblThree/TumblThree.Applications/DataModels/IPostQueue.cs b/src/TumblThree/TumblThree.Applications/DataModels/IPostQueue.cs index a540080..5c9b9fc 100644 --- a/src/TumblThree/TumblThree.Applications/DataModels/IPostQueue.cs +++ b/src/TumblThree/TumblThree.Applications/DataModels/IPostQueue.cs @@ -5,7 +5,9 @@ namespace TumblThree.Applications.DataModels public interface IPostQueue { void Add(T post); + void CompleteAdding(); + IEnumerable GetConsumingEnumerable(); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/DataModels/PostQueue.cs b/src/TumblThree/TumblThree.Applications/DataModels/PostQueue.cs index 4f1414b..f7e20b3 100644 --- a/src/TumblThree/TumblThree.Applications/DataModels/PostQueue.cs +++ b/src/TumblThree/TumblThree.Applications/DataModels/PostQueue.cs @@ -5,7 +5,7 @@ namespace TumblThree.Applications.DataModels { public class PostQueue : IPostQueue { - private BlockingCollection postQueue; + private readonly BlockingCollection postQueue; public PostQueue(IProducerConsumerCollection postTaskCollection) { diff --git a/src/TumblThree/TumblThree.Applications/DataModels/TumblrApiJson.cs b/src/TumblThree/TumblThree.Applications/DataModels/TumblrApiJson/TumblrApiJson.cs similarity index 64% rename from src/TumblThree/TumblThree.Applications/DataModels/TumblrApiJson.cs rename to src/TumblThree/TumblThree.Applications/DataModels/TumblrApiJson/TumblrApiJson.cs index 071949a..dea1d51 100644 --- a/src/TumblThree/TumblThree.Applications/DataModels/TumblrApiJson.cs +++ b/src/TumblThree/TumblThree.Applications/DataModels/TumblrApiJson/TumblrApiJson.cs @@ -7,8 +7,7 @@ namespace TumblThree.Applications.DataModels.TumblrApiJson [DataContract] public class TumblrApiJson { - [DataMember(EmitDefaultValue = false)] - public Tumblelog tumblelog { get; set; } + [DataMember(EmitDefaultValue = false)] public Tumblelog tumblelog { get; set; } [DataMember(Name = "posts-start", EmitDefaultValue = false)] public int posts_start { get; set; } @@ -19,102 +18,74 @@ public class TumblrApiJson [DataMember(Name = "posts-type", EmitDefaultValue = false)] public bool posts_type { get; set; } - [DataMember(EmitDefaultValue = false)] - public List posts { get; set; } + [DataMember(EmitDefaultValue = false)] public List posts { get; set; } } [DataContract] public class Tumblelog { - [DataMember(EmitDefaultValue = false)] - public string title { get; set; } + [DataMember(EmitDefaultValue = false)] public string title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string description { get; set; } + [DataMember(EmitDefaultValue = false)] public string description { get; set; } - [DataMember(EmitDefaultValue = false)] - public string name { get; set; } + [DataMember(EmitDefaultValue = false)] public string name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string timezone { get; set; } + [DataMember(EmitDefaultValue = false)] public string timezone { get; set; } - [DataMember(EmitDefaultValue = false)] - public object cname { get; set; } + [DataMember(EmitDefaultValue = false)] public object cname { get; set; } - [DataMember(EmitDefaultValue = false)] - public List feeds { get; set; } + [DataMember(EmitDefaultValue = false)] public List feeds { get; set; } } [DataContract] public class Tumblelog2 { - [DataMember(EmitDefaultValue = false)] - public string title { get; set; } + [DataMember(EmitDefaultValue = false)] public string title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string name { get; set; } + [DataMember(EmitDefaultValue = false)] public string name { get; set; } - [DataMember(EmitDefaultValue = false)] - public object cname { get; set; } + [DataMember(EmitDefaultValue = false)] public object cname { get; set; } - [DataMember(EmitDefaultValue = false)] - public string url { get; set; } + [DataMember(EmitDefaultValue = false)] public string url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string timezone { get; set; } + [DataMember(EmitDefaultValue = false)] public string timezone { get; set; } - [DataMember(EmitDefaultValue = false)] - public string avatar_url_16 { get; set; } + [DataMember(EmitDefaultValue = false)] public string avatar_url_16 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string avatar_url_24 { get; set; } + [DataMember(EmitDefaultValue = false)] public string avatar_url_24 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string avatar_url_30 { get; set; } + [DataMember(EmitDefaultValue = false)] public string avatar_url_30 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string avatar_url_40 { get; set; } + [DataMember(EmitDefaultValue = false)] public string avatar_url_40 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string avatar_url_48 { get; set; } + [DataMember(EmitDefaultValue = false)] public string avatar_url_48 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string avatar_url_64 { get; set; } + [DataMember(EmitDefaultValue = false)] public string avatar_url_64 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string avatar_url_96 { get; set; } + [DataMember(EmitDefaultValue = false)] public string avatar_url_96 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string avatar_url_128 { get; set; } + [DataMember(EmitDefaultValue = false)] public string avatar_url_128 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string avatar_url_512 { get; set; } + [DataMember(EmitDefaultValue = false)] public string avatar_url_512 { get; set; } } [DataContract] public class Conversation { - [DataMember(EmitDefaultValue = false)] - public string name { get; set; } + [DataMember(EmitDefaultValue = false)] public string name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string label { get; set; } + [DataMember(EmitDefaultValue = false)] public string label { get; set; } - [DataMember(EmitDefaultValue = false)] - public string phrase { get; set; } + [DataMember(EmitDefaultValue = false)] public string phrase { get; set; } } [DataContract] public class Photo { - [DataMember(EmitDefaultValue = false)] - public string offset { get; set; } - [DataMember(EmitDefaultValue = false)] - public string caption { get; set; } - [DataMember(EmitDefaultValue = false)] - public int width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int height { get; set; } + [DataMember(EmitDefaultValue = false)] public string offset { get; set; } + [DataMember(EmitDefaultValue = false)] public string caption { get; set; } + [DataMember(EmitDefaultValue = false)] public int width { get; set; } + [DataMember(EmitDefaultValue = false)] public int height { get; set; } [DataMember(Name = "photo-url-1280", EmitDefaultValue = false)] public string photo_url_1280 { get; set; } @@ -138,29 +109,23 @@ public class Photo [DataContract] public class Post : ICloneable { - [DataMember(EmitDefaultValue = false)] - public string id { get; set; } + [DataMember(EmitDefaultValue = false)] public string id { get; set; } - [DataMember(EmitDefaultValue = false)] - public string url { get; set; } + [DataMember(EmitDefaultValue = false)] public string url { get; set; } [DataMember(Name = "url-with-slug", EmitDefaultValue = false)] public string url_with_slug { get; set; } - [DataMember(EmitDefaultValue = false)] - public string type { get; set; } + [DataMember(EmitDefaultValue = false)] public string type { get; set; } [DataMember(Name = "date-gmt", EmitDefaultValue = false)] public string date_gmt { get; set; } - [DataMember(EmitDefaultValue = false)] - public string date { get; set; } + [DataMember(EmitDefaultValue = false)] public string date { get; set; } - [DataMember(EmitDefaultValue = false)] - public int? bookmarklet { get; set; } + [DataMember(EmitDefaultValue = false)] public int? bookmarklet { get; set; } - [DataMember(EmitDefaultValue = false)] - public int? mobile { get; set; } + [DataMember(EmitDefaultValue = false)] public int? mobile { get; set; } [DataMember(Name = "feed-item", EmitDefaultValue = false)] public string feed_item { get; set; } @@ -171,13 +136,12 @@ public class Post : ICloneable [DataMember(Name = "unix-timestamp", EmitDefaultValue = false)] public int unix_timestamp { get; set; } - [DataMember(EmitDefaultValue = false)] - public string format { get; set; } + [DataMember(EmitDefaultValue = false)] public string format { get; set; } [DataMember(Name = "reblog-key", EmitDefaultValue = false)] public string reblog_key { get; set; } - [DataMember(EmitDefaultValue = false)] - public string slug { get; set; } + + [DataMember(EmitDefaultValue = false)] public string slug { get; set; } [DataMember(Name = "is-submission", EmitDefaultValue = false)] public bool is_submission { get; set; } @@ -200,32 +164,23 @@ public class Post : ICloneable [DataMember(Name = "reblogged-from-title", EmitDefaultValue = false)] public string reblogged_from_title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_avatar_url_16 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_avatar_url_16 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_avatar_url_24 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_avatar_url_24 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_avatar_url_30 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_avatar_url_30 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_avatar_url_40 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_avatar_url_40 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_avatar_url_48 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_avatar_url_48 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_avatar_url_64 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_avatar_url_64 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_avatar_url_96 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_avatar_url_96 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_avatar_url_128 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_avatar_url_128 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_avatar_url_512 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_avatar_url_512 { get; set; } [DataMember(Name = "reblogged-root-url", EmitDefaultValue = false)] public string reblogged_root_url { get; set; } @@ -236,35 +191,25 @@ public class Post : ICloneable [DataMember(Name = "reblogged-root-title", EmitDefaultValue = false)] public string reblogged_root_title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_avatar_url_16 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_avatar_url_16 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_avatar_url_24 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_avatar_url_24 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_avatar_url_30 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_avatar_url_30 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_avatar_url_40 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_avatar_url_40 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_avatar_url_48 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_avatar_url_48 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_avatar_url_64 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_avatar_url_64 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_avatar_url_96 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_avatar_url_96 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_avatar_url_128 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_avatar_url_128 { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_avatar_url_512 { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_avatar_url_512 { get; set; } - [DataMember(EmitDefaultValue = false)] - public Tumblelog2 tumblelog { get; set; } + [DataMember(EmitDefaultValue = false)] public Tumblelog2 tumblelog { get; set; } [DataMember(Name = "quote-text", EmitDefaultValue = false)] public string quote_text { get; set; } @@ -272,17 +217,14 @@ public class Post : ICloneable [DataMember(Name = "quote-source", EmitDefaultValue = false)] public string quote_source { get; set; } - [DataMember(EmitDefaultValue = false)] - public List tags { get; set; } + [DataMember(EmitDefaultValue = false)] public List tags { get; set; } [DataMember(Name = "photo-caption", EmitDefaultValue = false)] public string photo_caption { get; set; } - [DataMember(EmitDefaultValue = false)] - public object width { get; set; } + [DataMember(EmitDefaultValue = false)] public object width { get; set; } - [DataMember(EmitDefaultValue = false)] - public object height { get; set; } + [DataMember(EmitDefaultValue = false)] public object height { get; set; } [DataMember(Name = "photo-url-1280", EmitDefaultValue = false)] public string photo_url_1280 { get; set; } @@ -302,8 +244,7 @@ public class Post : ICloneable [DataMember(Name = "photo-url-75", EmitDefaultValue = false)] public string photo_url_75 { get; set; } - [DataMember(EmitDefaultValue = false)] - public List photos { get; set; } + [DataMember(EmitDefaultValue = false)] public List photos { get; set; } [DataMember(Name = "photo-link-url", EmitDefaultValue = false)] public string photo_link_url { get; set; } @@ -371,15 +312,11 @@ public class Post : ICloneable [DataMember(Name = "video-player-250", EmitDefaultValue = false)] public string video_player_250 { get; set; } - [DataMember(EmitDefaultValue = false)] - public List conversation { get; set; } + [DataMember(EmitDefaultValue = false)] public List conversation { get; set; } - [DataMember(EmitDefaultValue = false)] - public string submitter { get; set; } - [DataMember(EmitDefaultValue = false)] - public string question { get; set; } - [DataMember(EmitDefaultValue = false)] - public string answer { get; set; } + [DataMember(EmitDefaultValue = false)] public string submitter { get; set; } + [DataMember(EmitDefaultValue = false)] public string question { get; set; } + [DataMember(EmitDefaultValue = false)] public string answer { get; set; } public object Clone() { diff --git a/src/TumblThree/TumblThree.Applications/DataModels/TumblrCrawlerData/ITumblrCrawlerData.cs b/src/TumblThree/TumblThree.Applications/DataModels/TumblrCrawlerData/ITumblrCrawlerData.cs index 6403369..d03ce28 100644 --- a/src/TumblThree/TumblThree.Applications/DataModels/TumblrCrawlerData/ITumblrCrawlerData.cs +++ b/src/TumblThree/TumblThree.Applications/DataModels/TumblrCrawlerData/ITumblrCrawlerData.cs @@ -2,6 +2,5 @@ { interface ITumblrCrawlerData { - } } diff --git a/src/TumblThree/TumblThree.Applications/DataModels/TumblrPosts/TumblrPost.cs b/src/TumblThree/TumblThree.Applications/DataModels/TumblrPosts/TumblrPost.cs index 1b6f2c2..e451a6a 100644 --- a/src/TumblThree/TumblThree.Applications/DataModels/TumblrPosts/TumblrPost.cs +++ b/src/TumblThree/TumblThree.Applications/DataModels/TumblrPosts/TumblrPost.cs @@ -1,6 +1,10 @@ -namespace TumblThree.Applications.DataModels +namespace TumblThree.Applications.DataModels.TumblrPosts { - public enum PostType { Binary, Text } + public enum PostType + { + Binary, + Text + } public abstract class TumblrPost { @@ -16,7 +20,7 @@ public abstract class TumblrPost public string TextFileLocation { get; protected set; } - public TumblrPost(string url, string id, string date) + protected TumblrPost(string url, string id, string date) { this.Url = url; this.Id = id; diff --git a/src/TumblThree/TumblThree.Applications/DataModels/TumblrSearchJson.cs b/src/TumblThree/TumblThree.Applications/DataModels/TumblrSearchJson.cs deleted file mode 100644 index bcf5c8e..0000000 --- a/src/TumblThree/TumblThree.Applications/DataModels/TumblrSearchJson.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace TumblThree.Applications.DataModels.TumblrSearchJson -{ - [DataContract] - public class TumblrSearchJson - { - [DataMember(EmitDefaultValue = false)] - public Meta meta { get; set; } - - [DataMember(EmitDefaultValue = false)] - public Response response { get; set; } - } - - [DataContract] - public class Meta - { - [DataMember(EmitDefaultValue = false)] - public int status { get; set; } - - [DataMember(EmitDefaultValue = false)] - public string msg { get; set; } - } - - [DataContract] - public class Response - { - [DataMember(EmitDefaultValue = false)] - public string posts_html { get; set; } - - [DataMember(EmitDefaultValue = false)] - public object blogs_html { get; set; } - - [DataMember(EmitDefaultValue = false)] - public string tracking_html { get; set; } - - [DataMember(EmitDefaultValue = false)] - public List related_searches { get; set; } - - [DataMember(EmitDefaultValue = false)] - public bool show_psa { get; set; } - - [DataMember(EmitDefaultValue = false)] - public bool tracked_tag { get; set; } - - [DataMember(EmitDefaultValue = false)] - public List yahoo_view_data { get; set; } - } -} diff --git a/src/TumblThree/TumblThree.Applications/DataModels/TumblrSearchJson/TumblrSearchJson.cs b/src/TumblThree/TumblThree.Applications/DataModels/TumblrSearchJson/TumblrSearchJson.cs new file mode 100644 index 0000000..90c95e5 --- /dev/null +++ b/src/TumblThree/TumblThree.Applications/DataModels/TumblrSearchJson/TumblrSearchJson.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace TumblThree.Applications.DataModels.TumblrSearchJson +{ + [DataContract] + public class TumblrSearchJson + { + [DataMember(EmitDefaultValue = false)] public Meta meta { get; set; } + + [DataMember(EmitDefaultValue = false)] public Response response { get; set; } + } + + [DataContract] + public class Meta + { + [DataMember(EmitDefaultValue = false)] public int status { get; set; } + + [DataMember(EmitDefaultValue = false)] public string msg { get; set; } + } + + [DataContract] + public class Response + { + [DataMember(EmitDefaultValue = false)] public string posts_html { get; set; } + + [DataMember(EmitDefaultValue = false)] public object blogs_html { get; set; } + + [DataMember(EmitDefaultValue = false)] public string tracking_html { get; set; } + + [DataMember(EmitDefaultValue = false)] public List related_searches { get; set; } + + [DataMember(EmitDefaultValue = false)] public bool show_psa { get; set; } + + [DataMember(EmitDefaultValue = false)] public bool tracked_tag { get; set; } + + [DataMember(EmitDefaultValue = false)] public List yahoo_view_data { get; set; } + } +} diff --git a/src/TumblThree/TumblThree.Applications/DataModels/TumblrSvcJson.cs b/src/TumblThree/TumblThree.Applications/DataModels/TumblrSvcJson.cs deleted file mode 100644 index e34e6a5..0000000 --- a/src/TumblThree/TumblThree.Applications/DataModels/TumblrSvcJson.cs +++ /dev/null @@ -1,773 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.Serialization; - -namespace TumblThree.Applications.DataModels.TumblrSvcJson -{ - [DataContract] - public class TumblrJson - { - [DataMember(EmitDefaultValue = false)] - public Meta meta { get; set; } - [DataMember(EmitDefaultValue = false)] - public Response response { get; set; } - } - - [DataContract] - public class Response - { - [DataMember(EmitDefaultValue = false)] - public int seconds_since_last_activity { get; set; } - [DataMember(EmitDefaultValue = false)] - public List posts { get; set; } - [DataMember(EmitDefaultValue = false)] - public TrackingHtml tracking_html { get; set; } - } - - [DataContract] - public class Meta - { - [DataMember(EmitDefaultValue = false)] - public int status { get; set; } - [DataMember(EmitDefaultValue = false)] - public string msg { get; set; } - } - - [DataContract] - public class Theme - { - [DataMember(EmitDefaultValue = false)] - public int header_full_width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int header_full_height { get; set; } - [DataMember(EmitDefaultValue = false)] - public int header_focus_width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int header_focus_height { get; set; } - [DataMember(EmitDefaultValue = false)] - public string avatar_shape { get; set; } - [DataMember(EmitDefaultValue = false)] - public string background_color { get; set; } - [DataMember(EmitDefaultValue = false)] - public string body_font { get; set; } - [DataMember(EmitDefaultValue = false)] - public string header_bounds { get; set; } - [DataMember(EmitDefaultValue = false)] - public string header_image { get; set; } - [DataMember(EmitDefaultValue = false)] - public string header_image_focused { get; set; } - [DataMember(EmitDefaultValue = false)] - public string header_image_scaled { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool header_stretch { get; set; } - [DataMember(EmitDefaultValue = false)] - public string link_color { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_avatar { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_description { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_header_image { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string title_color { get; set; } - [DataMember(EmitDefaultValue = false)] - public string title_font { get; set; } - [DataMember(EmitDefaultValue = false)] - public string title_font_weight { get; set; } - } - - [DataContract] - public class Blog - { - [DataMember(EmitDefaultValue = false)] - public string name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string description { get; set; } - [DataMember(EmitDefaultValue = false)] - public string url { get; set; } - [DataMember(EmitDefaultValue = false)] - public int updated { get; set; } - [DataMember(EmitDefaultValue = false)] - public string uuid { get; set; } - [DataMember(EmitDefaultValue = false)] - public string key { get; set; } - [DataMember(EmitDefaultValue = false)] - public Theme theme { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool can_message { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool share_likes { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool share_following { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool is_nsfw { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool is_adult { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool can_be_followed { get; set; } - [DataMember(EmitDefaultValue = false)] - public string placement_id { get; set; } - } - - [DataContract] - public class NsfwSurvey - { - [DataMember(EmitDefaultValue = false)] - public string type { get; set; } - [DataMember(EmitDefaultValue = false)] - public string href { get; set; } - } - - [DataContract] - public class Links - { - [DataMember(EmitDefaultValue = false)] - public NsfwSurvey nsfw_survey { get; set; } - } - - [DataContract] - public class Reblog - { - [DataMember(EmitDefaultValue = false)] - public string comment { get; set; } - } - - [DataContract] - public class Theme2 - { - [DataMember(EmitDefaultValue = false)] - public string avatar_shape { get; set; } - [DataMember(EmitDefaultValue = false)] - public string background_color { get; set; } - [DataMember(EmitDefaultValue = false)] - public string body_font { get; set; } - [DataMember(EmitDefaultValue = false)] - public string header_bounds { get; set; } - [DataMember(EmitDefaultValue = false)] - public string header_image { get; set; } - [DataMember(EmitDefaultValue = false)] - public string header_image_focused { get; set; } - [DataMember(EmitDefaultValue = false)] - public string header_image_scaled { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool header_stretch { get; set; } - [DataMember(EmitDefaultValue = false)] - public string link_color { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_avatar { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_description { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_header_image { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string title_color { get; set; } - [DataMember(EmitDefaultValue = false)] - public string title_font { get; set; } - [DataMember(EmitDefaultValue = false)] - public string title_font_weight { get; set; } - [DataMember(EmitDefaultValue = false)] - public int? header_full_width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int? header_full_height { get; set; } - [DataMember(EmitDefaultValue = false)] - public int? header_focus_width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int? header_focus_height { get; set; } - } - - [DataContract] - public class Blog2 - { - [DataMember(EmitDefaultValue = false)] - public string name { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool active { get; set; } - [DataMember(EmitDefaultValue = false)] - public List theme { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool share_likes { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool share_following { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool can_be_followed { get; set; } - [DataMember(EmitDefaultValue = false)] - public string uuid { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool is_adult { get; set; } - } - - [DataContract] - public class Post2 - { - [DataMember(EmitDefaultValue = false)] - public string id { get; set; } - } - - [DataContract] - public class Trail - { - [DataMember(EmitDefaultValue = false)] - public Blog2 blog { get; set; } - [DataMember(EmitDefaultValue = false)] - public Post2 post { get; set; } - [DataMember(EmitDefaultValue = false)] - public string content_raw { get; set; } - [DataMember(EmitDefaultValue = false)] - public string content { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool is_current_item { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool? is_root_item { get; set; } - } - - [DataContract] - public class LinkImageDimensions - { - [DataMember(EmitDefaultValue = false)] - public int width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int height { get; set; } - } - - [DataContract] - public class OriginalSize - { - [DataMember(EmitDefaultValue = false)] - public string url { get; set; } - [DataMember(EmitDefaultValue = false)] - public int width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int height { get; set; } - } - - [DataContract] - public class AltSize - { - [DataMember(EmitDefaultValue = false)] - public string url { get; set; } - [DataMember(EmitDefaultValue = false)] - public int width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int height { get; set; } - } - - [DataContract] - public class Exif - { - [DataMember(EmitDefaultValue = false)] - public string Camera { get; set; } - [DataMember(EmitDefaultValue = false)] - public string ISO { get; set; } - [DataMember(EmitDefaultValue = false)] - public string Aperture { get; set; } - [DataMember(EmitDefaultValue = false)] - public string Exposure { get; set; } - [DataMember(EmitDefaultValue = false)] - public string FocalLength { get; set; } - } - - [DataContract] - public class Photo - { - [DataMember(EmitDefaultValue = false)] - public string caption { get; set; } - [DataMember(EmitDefaultValue = false)] - public OriginalSize original_size { get; set; } - [DataMember(EmitDefaultValue = false)] - public List alt_sizes { get; set; } - [DataMember(EmitDefaultValue = false)] - public Exif exif { get; set; } - } - - [DataContract] - public class SharePopoverData - { - [DataMember(EmitDefaultValue = false)] - public string tumblelog_name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string embed_key { get; set; } - [DataMember(EmitDefaultValue = false)] - public string embed_did { get; set; } - [DataMember(EmitDefaultValue = false)] - public string post_id { get; set; } - [DataMember(EmitDefaultValue = false)] - public string root_id { get; set; } - [DataMember(EmitDefaultValue = false)] - public string post_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string post_tiny_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public int is_private { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool has_user { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool has_facebook { get; set; } - [DataMember(EmitDefaultValue = false)] - public string twitter_username { get; set; } - [DataMember(EmitDefaultValue = false)] - public string permalink_label { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_reporting_links { get; set; } - [DataMember(EmitDefaultValue = false)] - public string abuse_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_pinterest { get; set; } - [DataMember(EmitDefaultValue = false)] - public object pinterest_share_window { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_reddit { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool show_flagging { get; set; } - } - - [DataContract] - public class Notes - { - [DataMember(EmitDefaultValue = false)] - public int count { get; set; } - [DataMember(EmitDefaultValue = false)] - public string less { get; set; } - [DataMember(EmitDefaultValue = false)] - public string more { get; set; } - [DataMember(EmitDefaultValue = false)] - public string current { get; set; } - } - - [DataContract] - public class Dialogue - { - [DataMember(EmitDefaultValue = false)] - public string name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string label { get; set; } - [DataMember(EmitDefaultValue = false)] - public string phrase { get; set; } - } - - [DataContract] - public class PinterestShareWindowClass - { - [DataMember(EmitDefaultValue = false)] - public string url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string dimensions { get; set; } - } - - [DataContract] - public class PhotosetPhoto - { - [DataMember(EmitDefaultValue = false)] - public int width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int height { get; set; } - [DataMember(EmitDefaultValue = false)] - public string low_res { get; set; } - [DataMember(EmitDefaultValue = false)] - public string high_res { get; set; } - } - - [DataContract] - public class Post : ICloneable - { - [DataMember(EmitDefaultValue = false)] - public string type { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool is_nsfw_based_on_score { get; set; } - [DataMember(EmitDefaultValue = false)] - public List supply_logging { get; set; } - [DataMember(EmitDefaultValue = false)] - public Blog blog { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool is_nsfw { get; set; } - [DataMember(EmitDefaultValue = false)] - public double nsfw_score { get; set; } - [DataMember(EmitDefaultValue = false)] - public Links _links { get; set; } - [DataMember(EmitDefaultValue = false)] - public string id { get; set; } - [DataMember(EmitDefaultValue = false)] - public string post_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string slug { get; set; } - [DataMember(EmitDefaultValue = false)] - public string date { get; set; } - [DataMember(EmitDefaultValue = false)] - public int timestamp { get; set; } - [DataMember(EmitDefaultValue = false)] - public string state { get; set; } - [DataMember(EmitDefaultValue = false)] - public string format { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblog_key { get; set; } - [DataMember(EmitDefaultValue = false)] - public List tags { get; set; } - [DataMember(EmitDefaultValue = false)] - public string short_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string summary { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool is_blocks_post_format { get; set; } - [DataMember(EmitDefaultValue = false)] - public string recommended_source { get; set; } - [DataMember(EmitDefaultValue = false)] - public string recommended_color { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool followed { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool liked { get; set; } - [DataMember(EmitDefaultValue = false)] - public string source_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string source_title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string caption { get; set; } - [DataMember(EmitDefaultValue = false)] - public Reblog reblog { get; set; } - [DataMember(EmitDefaultValue = false)] - public List trail { get; set; } - [DataMember(EmitDefaultValue = false)] - public string video_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool html5_capable { get; set; } - [DataMember(EmitDefaultValue = false)] - public Video video { get; set; } - [DataMember(EmitDefaultValue = false)] - public string thumbnail_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public int thumbnail_width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int thumbnail_height { get; set; } - [DataMember(EmitDefaultValue = false)] - public float duration { get; set; } - [DataMember(EmitDefaultValue = false)] - public object player { get; set; } - [DataMember(EmitDefaultValue = false)] - public string audio_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string audio_source_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string audio_type { get; set; } - [DataMember(EmitDefaultValue = false)] - public string video_type { get; set; } - [DataMember(EmitDefaultValue = false)] - public string link_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string image_permalink { get; set; } - [DataMember(EmitDefaultValue = false)] - public List photos { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_id { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_uuid { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool reblogged_from_can_message { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool reblogged_from_following { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_id { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_root_uuid { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool reblogged_root_can_message { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool reblogged_root_following { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool can_like { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool can_reblog { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool can_send_in_message { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool can_reply { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool display_avatar { get; set; } - [DataMember(EmitDefaultValue = false)] - public string tumblelog_key { get; set; } - [DataMember(EmitDefaultValue = false)] - public string tumblelog_uuid { get; set; } - [DataMember(EmitDefaultValue = false)] - public string root_id { get; set; } - [DataMember(EmitDefaultValue = false)] - public SharePopoverData share_popover_data { get; set; } - [DataMember(EmitDefaultValue = false)] - public string posted_on_tooltip { get; set; } - [DataMember(EmitDefaultValue = false)] - public string tag_layout_class { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool has_custom_source_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string tumblelog { get; set; } - [DataMember(EmitDefaultValue = false)] - public string reblogged_from_tumblr_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public Notes notes { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool reblogged_from_followed { get; set; } - [DataMember(EmitDefaultValue = false)] - public string post_html { get; set; } - [DataMember(EmitDefaultValue = false)] - public string asking_name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string asking_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string question { get; set; } - [DataMember(EmitDefaultValue = false)] - public string answer { get; set; } - [DataMember(EmitDefaultValue = false)] - public string photoset_layout { get; set; } - [DataMember(EmitDefaultValue = false)] - public List photoset_photos { get; set; } - [DataMember(EmitDefaultValue = false)] - public int? year { get; set; } - [DataMember(EmitDefaultValue = false)] - public string track { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool? is_external { get; set; } - [DataMember(EmitDefaultValue = false)] - public string title { get; set; } - [DataMember(EmitDefaultValue = false)] - public string body { get; set; } - [DataMember(EmitDefaultValue = false)] - public string text { get; set; } - [DataMember(EmitDefaultValue = false)] - public string source { get; set; } - [DataMember(EmitDefaultValue = false)] - public string artist { get; set; } - [DataMember(EmitDefaultValue = false)] - public string track_name { get; set; } - [DataMember(EmitDefaultValue = false)] - public string album_art { get; set; } - [DataMember(EmitDefaultValue = false)] - public string embed { get; set; } - [DataMember(EmitDefaultValue = false)] - public int plays { get; set; } - [DataMember(EmitDefaultValue = false)] - public string album { get; set; } - [DataMember(EmitDefaultValue = false)] - public List dialogue { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool? is_anonymous { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool? is_submission { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool should_bypass_tagfiltering { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool should_bypass_safemode { get; set; } - [DataMember(EmitDefaultValue = false)] - public bool can_modify_safe_mode { get; set; } - [DataMember(EmitDefaultValue = false)] - public object survey { get; set; } - [DataMember(EmitDefaultValue = false)] - public string url { get; set; } - [DataMember(EmitDefaultValue = false)] - public string link_image { get; set; } - [DataMember(EmitDefaultValue = false)] - public LinkImageDimensions link_image_dimensions { get; set; } - [DataMember(EmitDefaultValue = false)] - public object link_author { get; set; } - [DataMember(EmitDefaultValue = false)] - public string excerpt { get; set; } - [DataMember(EmitDefaultValue = false)] - public string publisher { get; set; } - [DataMember(EmitDefaultValue = false)] - public string description { get; set; } - - - public object Clone() - { - return this.MemberwiseClone(); - } - - [OnDeserializing] - internal void OnDeserializingMethod(StreamingContext context) - { - Initialize(); - } - - private void Initialize() - { - type = string.Empty; - is_nsfw_based_on_score = false; - supply_logging = new List(); - blog = new Blog(); - is_nsfw = false; - nsfw_score = 0.0; - _links = new Links(); - id = string.Empty; - post_url = string.Empty; - slug = string.Empty; - date = string.Empty; - timestamp = 0; - state = string.Empty; - format = string.Empty; - reblog_key = string.Empty; - tags = new List(); - short_url = string.Empty; - summary = string.Empty; - recommended_source = string.Empty; - recommended_color = string.Empty; - followed = false; - liked = false; - source_url = string.Empty; - source_title = string.Empty; - caption = string.Empty; - reblog = new Reblog(); - trail = new List(); - video_url = string.Empty; - html5_capable = false; - thumbnail_url = string.Empty; - thumbnail_width = 0; - thumbnail_height = 0; - duration = 0; - player = new object(); - audio_url = string.Empty; - audio_source_url = string.Empty; - audio_type = string.Empty; - video_type = string.Empty; - link_url = string.Empty; - image_permalink = string.Empty; - photos = new List(); - reblogged_from_id = string.Empty; - reblogged_from_url = string.Empty; - reblogged_from_name = string.Empty; - reblogged_from_title = string.Empty; - reblogged_from_uuid = string.Empty; - reblogged_from_can_message = false; - reblogged_from_following = false; - reblogged_root_id = string.Empty; - reblogged_root_url = string.Empty; - reblogged_root_name = string.Empty; - reblogged_root_title = string.Empty; - reblogged_root_uuid = string.Empty; - reblogged_root_can_message = false; - reblogged_root_following = false; - can_like = false; - can_reblog = false; - can_send_in_message = false; - can_reply = false; - display_avatar = false; - tumblelog_key = string.Empty; - tumblelog_uuid = string.Empty; - root_id = string.Empty; - share_popover_data = new SharePopoverData(); - posted_on_tooltip = string.Empty; - tag_layout_class = string.Empty; - has_custom_source_url = false; - tumblelog = string.Empty; - reblogged_from_tumblr_url = string.Empty; - notes = new Notes(); - reblogged_from_followed = false; - post_html = string.Empty; - asking_name = string.Empty; - asking_url = string.Empty; - question = string.Empty; - answer = string.Empty; - photoset_layout = string.Empty; - photoset_photos = new List(); - year = 0; - track = string.Empty; - is_external = false; - title = string.Empty; - body = string.Empty; - text = string.Empty; - source = string.Empty; - artist = string.Empty; - track_name = string.Empty; - album_art = string.Empty; - embed = string.Empty; - plays = 0; - album = string.Empty; - dialogue = new List(); - is_anonymous = false; - is_submission = false; - should_bypass_safemode = false; - can_modify_safe_mode = false; - survey = new object(); - url = string.Empty; - link_image = string.Empty; - link_image_dimensions = new LinkImageDimensions(); - link_author = string.Empty; - excerpt = string.Empty; - publisher = string.Empty; - description = string.Empty; - } - } - - [DataContract] - public class PixelbugUrl - { - [DataMember(EmitDefaultValue = false)] - public string type { get; set; } - [DataMember(EmitDefaultValue = false)] - public string script { get; set; } - [DataMember(EmitDefaultValue = false)] - public string img { get; set; } - } - - [DataContract] - public class PixelbugPost - { - [DataMember(EmitDefaultValue = false)] - public string type { get; set; } - [DataMember(EmitDefaultValue = false)] - public string script { get; set; } - [DataMember(EmitDefaultValue = false)] - public string img { get; set; } - } - - [DataContract] - public class Player - { - [DataMember(EmitDefaultValue = false)] - public int width { get; set; } - [DataMember(EmitDefaultValue = false)] - public string embed_code { get; set; } - } - - [DataContract] - public class Youtube - { - [DataMember(EmitDefaultValue = false)] - public string video_id { get; set; } - [DataMember(EmitDefaultValue = false)] - public int width { get; set; } - [DataMember(EmitDefaultValue = false)] - public int height { get; set; } - } - - [DataContract] - public class Video - { - [DataMember(EmitDefaultValue = false)] - public Youtube youtube { get; set; } - } - - [DataContract] - public class TrackingHtml - { - [DataMember(EmitDefaultValue = false)] - public PixelbugUrl pixelbug_url { get; set; } - [DataMember(EmitDefaultValue = false)] - public PixelbugPost pixelbug_post { get; set; } - } -} diff --git a/src/TumblThree/TumblThree.Applications/DataModels/TumblrSvcJson/TumblrSvcJson.cs b/src/TumblThree/TumblThree.Applications/DataModels/TumblrSvcJson/TumblrSvcJson.cs new file mode 100644 index 0000000..5dd4fb2 --- /dev/null +++ b/src/TumblThree/TumblThree.Applications/DataModels/TumblrSvcJson/TumblrSvcJson.cs @@ -0,0 +1,521 @@ +using System; +using System.Collections.Generic; +using System.Runtime.Serialization; + +namespace TumblThree.Applications.DataModels.TumblrSvcJson +{ + [DataContract] + public class TumblrJson + { + [DataMember(EmitDefaultValue = false)] public Meta meta { get; set; } + [DataMember(EmitDefaultValue = false)] public Response response { get; set; } + } + + [DataContract] + public class Response + { + [DataMember(EmitDefaultValue = false)] public int seconds_since_last_activity { get; set; } + [DataMember(EmitDefaultValue = false)] public List posts { get; set; } + [DataMember(EmitDefaultValue = false)] public TrackingHtml tracking_html { get; set; } + } + + [DataContract] + public class Meta + { + [DataMember(EmitDefaultValue = false)] public int status { get; set; } + [DataMember(EmitDefaultValue = false)] public string msg { get; set; } + } + + [DataContract] + public class Theme + { + [DataMember(EmitDefaultValue = false)] public int header_full_width { get; set; } + [DataMember(EmitDefaultValue = false)] public int header_full_height { get; set; } + [DataMember(EmitDefaultValue = false)] public int header_focus_width { get; set; } + [DataMember(EmitDefaultValue = false)] public int header_focus_height { get; set; } + [DataMember(EmitDefaultValue = false)] public string avatar_shape { get; set; } + [DataMember(EmitDefaultValue = false)] public string background_color { get; set; } + [DataMember(EmitDefaultValue = false)] public string body_font { get; set; } + [DataMember(EmitDefaultValue = false)] public string header_bounds { get; set; } + [DataMember(EmitDefaultValue = false)] public string header_image { get; set; } + [DataMember(EmitDefaultValue = false)] public string header_image_focused { get; set; } + [DataMember(EmitDefaultValue = false)] public string header_image_scaled { get; set; } + [DataMember(EmitDefaultValue = false)] public bool header_stretch { get; set; } + [DataMember(EmitDefaultValue = false)] public string link_color { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_avatar { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_description { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_header_image { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_title { get; set; } + [DataMember(EmitDefaultValue = false)] public string title_color { get; set; } + [DataMember(EmitDefaultValue = false)] public string title_font { get; set; } + [DataMember(EmitDefaultValue = false)] public string title_font_weight { get; set; } + } + + [DataContract] + public class Blog + { + [DataMember(EmitDefaultValue = false)] public string name { get; set; } + [DataMember(EmitDefaultValue = false)] public string title { get; set; } + [DataMember(EmitDefaultValue = false)] public string description { get; set; } + [DataMember(EmitDefaultValue = false)] public string url { get; set; } + [DataMember(EmitDefaultValue = false)] public int updated { get; set; } + [DataMember(EmitDefaultValue = false)] public string uuid { get; set; } + [DataMember(EmitDefaultValue = false)] public string key { get; set; } + [DataMember(EmitDefaultValue = false)] public Theme theme { get; set; } + [DataMember(EmitDefaultValue = false)] public bool can_message { get; set; } + [DataMember(EmitDefaultValue = false)] public bool share_likes { get; set; } + [DataMember(EmitDefaultValue = false)] public bool share_following { get; set; } + [DataMember(EmitDefaultValue = false)] public bool is_nsfw { get; set; } + [DataMember(EmitDefaultValue = false)] public bool is_adult { get; set; } + [DataMember(EmitDefaultValue = false)] public bool can_be_followed { get; set; } + [DataMember(EmitDefaultValue = false)] public string placement_id { get; set; } + } + + [DataContract] + public class NsfwSurvey + { + [DataMember(EmitDefaultValue = false)] public string type { get; set; } + [DataMember(EmitDefaultValue = false)] public string href { get; set; } + } + + [DataContract] + public class Links + { + [DataMember(EmitDefaultValue = false)] public NsfwSurvey nsfw_survey { get; set; } + } + + [DataContract] + public class Reblog + { + [DataMember(EmitDefaultValue = false)] public string comment { get; set; } + } + + [DataContract] + public class Theme2 + { + [DataMember(EmitDefaultValue = false)] public string avatar_shape { get; set; } + [DataMember(EmitDefaultValue = false)] public string background_color { get; set; } + [DataMember(EmitDefaultValue = false)] public string body_font { get; set; } + [DataMember(EmitDefaultValue = false)] public string header_bounds { get; set; } + [DataMember(EmitDefaultValue = false)] public string header_image { get; set; } + [DataMember(EmitDefaultValue = false)] public string header_image_focused { get; set; } + [DataMember(EmitDefaultValue = false)] public string header_image_scaled { get; set; } + [DataMember(EmitDefaultValue = false)] public bool header_stretch { get; set; } + [DataMember(EmitDefaultValue = false)] public string link_color { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_avatar { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_description { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_header_image { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_title { get; set; } + [DataMember(EmitDefaultValue = false)] public string title_color { get; set; } + [DataMember(EmitDefaultValue = false)] public string title_font { get; set; } + [DataMember(EmitDefaultValue = false)] public string title_font_weight { get; set; } + [DataMember(EmitDefaultValue = false)] public int? header_full_width { get; set; } + [DataMember(EmitDefaultValue = false)] public int? header_full_height { get; set; } + [DataMember(EmitDefaultValue = false)] public int? header_focus_width { get; set; } + [DataMember(EmitDefaultValue = false)] public int? header_focus_height { get; set; } + } + + [DataContract] + public class Blog2 + { + [DataMember(EmitDefaultValue = false)] public string name { get; set; } + [DataMember(EmitDefaultValue = false)] public bool active { get; set; } + [DataMember(EmitDefaultValue = false)] public List theme { get; set; } + [DataMember(EmitDefaultValue = false)] public bool share_likes { get; set; } + [DataMember(EmitDefaultValue = false)] public bool share_following { get; set; } + [DataMember(EmitDefaultValue = false)] public bool can_be_followed { get; set; } + [DataMember(EmitDefaultValue = false)] public string uuid { get; set; } + [DataMember(EmitDefaultValue = false)] public bool is_adult { get; set; } + } + + [DataContract] + public class Post2 + { + [DataMember(EmitDefaultValue = false)] public string id { get; set; } + } + + [DataContract] + public class Trail + { + [DataMember(EmitDefaultValue = false)] public Blog2 blog { get; set; } + [DataMember(EmitDefaultValue = false)] public Post2 post { get; set; } + [DataMember(EmitDefaultValue = false)] public string content_raw { get; set; } + [DataMember(EmitDefaultValue = false)] public string content { get; set; } + [DataMember(EmitDefaultValue = false)] public bool is_current_item { get; set; } + [DataMember(EmitDefaultValue = false)] public bool? is_root_item { get; set; } + } + + [DataContract] + public class LinkImageDimensions + { + [DataMember(EmitDefaultValue = false)] public int width { get; set; } + [DataMember(EmitDefaultValue = false)] public int height { get; set; } + } + + [DataContract] + public class OriginalSize + { + [DataMember(EmitDefaultValue = false)] public string url { get; set; } + [DataMember(EmitDefaultValue = false)] public int width { get; set; } + [DataMember(EmitDefaultValue = false)] public int height { get; set; } + } + + [DataContract] + public class AltSize + { + [DataMember(EmitDefaultValue = false)] public string url { get; set; } + [DataMember(EmitDefaultValue = false)] public int width { get; set; } + [DataMember(EmitDefaultValue = false)] public int height { get; set; } + } + + [DataContract] + public class Exif + { + [DataMember(EmitDefaultValue = false)] public string Camera { get; set; } + [DataMember(EmitDefaultValue = false)] public string ISO { get; set; } + [DataMember(EmitDefaultValue = false)] public string Aperture { get; set; } + [DataMember(EmitDefaultValue = false)] public string Exposure { get; set; } + [DataMember(EmitDefaultValue = false)] public string FocalLength { get; set; } + } + + [DataContract] + public class Photo + { + [DataMember(EmitDefaultValue = false)] public string caption { get; set; } + [DataMember(EmitDefaultValue = false)] public OriginalSize original_size { get; set; } + [DataMember(EmitDefaultValue = false)] public List alt_sizes { get; set; } + [DataMember(EmitDefaultValue = false)] public Exif exif { get; set; } + } + + [DataContract] + public class SharePopoverData + { + [DataMember(EmitDefaultValue = false)] public string tumblelog_name { get; set; } + [DataMember(EmitDefaultValue = false)] public string embed_key { get; set; } + [DataMember(EmitDefaultValue = false)] public string embed_did { get; set; } + [DataMember(EmitDefaultValue = false)] public string post_id { get; set; } + [DataMember(EmitDefaultValue = false)] public string root_id { get; set; } + [DataMember(EmitDefaultValue = false)] public string post_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string post_tiny_url { get; set; } + [DataMember(EmitDefaultValue = false)] public int is_private { get; set; } + [DataMember(EmitDefaultValue = false)] public bool has_user { get; set; } + [DataMember(EmitDefaultValue = false)] public bool has_facebook { get; set; } + [DataMember(EmitDefaultValue = false)] public string twitter_username { get; set; } + [DataMember(EmitDefaultValue = false)] public string permalink_label { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_reporting_links { get; set; } + [DataMember(EmitDefaultValue = false)] public string abuse_url { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_pinterest { get; set; } + [DataMember(EmitDefaultValue = false)] public object pinterest_share_window { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_reddit { get; set; } + [DataMember(EmitDefaultValue = false)] public bool show_flagging { get; set; } + } + + [DataContract] + public class Notes + { + [DataMember(EmitDefaultValue = false)] public int count { get; set; } + [DataMember(EmitDefaultValue = false)] public string less { get; set; } + [DataMember(EmitDefaultValue = false)] public string more { get; set; } + [DataMember(EmitDefaultValue = false)] public string current { get; set; } + } + + [DataContract] + public class Dialogue + { + [DataMember(EmitDefaultValue = false)] public string name { get; set; } + [DataMember(EmitDefaultValue = false)] public string label { get; set; } + [DataMember(EmitDefaultValue = false)] public string phrase { get; set; } + } + + [DataContract] + public class PinterestShareWindowClass + { + [DataMember(EmitDefaultValue = false)] public string url { get; set; } + [DataMember(EmitDefaultValue = false)] public string name { get; set; } + [DataMember(EmitDefaultValue = false)] public string dimensions { get; set; } + } + + [DataContract] + public class PhotosetPhoto + { + [DataMember(EmitDefaultValue = false)] public int width { get; set; } + [DataMember(EmitDefaultValue = false)] public int height { get; set; } + [DataMember(EmitDefaultValue = false)] public string low_res { get; set; } + [DataMember(EmitDefaultValue = false)] public string high_res { get; set; } + } + + [DataContract] + public class Post : ICloneable + { + [DataMember(EmitDefaultValue = false)] public string type { get; set; } + [DataMember(EmitDefaultValue = false)] public bool is_nsfw_based_on_score { get; set; } + [DataMember(EmitDefaultValue = false)] public List supply_logging { get; set; } + [DataMember(EmitDefaultValue = false)] public Blog blog { get; set; } + [DataMember(EmitDefaultValue = false)] public bool is_nsfw { get; set; } + [DataMember(EmitDefaultValue = false)] public double nsfw_score { get; set; } + [DataMember(EmitDefaultValue = false)] public Links _links { get; set; } + [DataMember(EmitDefaultValue = false)] public string id { get; set; } + [DataMember(EmitDefaultValue = false)] public string post_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string slug { get; set; } + [DataMember(EmitDefaultValue = false)] public string date { get; set; } + [DataMember(EmitDefaultValue = false)] public int timestamp { get; set; } + [DataMember(EmitDefaultValue = false)] public string state { get; set; } + [DataMember(EmitDefaultValue = false)] public string format { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblog_key { get; set; } + [DataMember(EmitDefaultValue = false)] public List tags { get; set; } + [DataMember(EmitDefaultValue = false)] public string short_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string summary { get; set; } + [DataMember(EmitDefaultValue = false)] public bool is_blocks_post_format { get; set; } + [DataMember(EmitDefaultValue = false)] public string recommended_source { get; set; } + [DataMember(EmitDefaultValue = false)] public string recommended_color { get; set; } + [DataMember(EmitDefaultValue = false)] public bool followed { get; set; } + [DataMember(EmitDefaultValue = false)] public bool liked { get; set; } + [DataMember(EmitDefaultValue = false)] public string source_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string source_title { get; set; } + [DataMember(EmitDefaultValue = false)] public string caption { get; set; } + [DataMember(EmitDefaultValue = false)] public Reblog reblog { get; set; } + [DataMember(EmitDefaultValue = false)] public List trail { get; set; } + [DataMember(EmitDefaultValue = false)] public string video_url { get; set; } + [DataMember(EmitDefaultValue = false)] public bool html5_capable { get; set; } + [DataMember(EmitDefaultValue = false)] public Video video { get; set; } + [DataMember(EmitDefaultValue = false)] public string thumbnail_url { get; set; } + [DataMember(EmitDefaultValue = false)] public int thumbnail_width { get; set; } + [DataMember(EmitDefaultValue = false)] public int thumbnail_height { get; set; } + [DataMember(EmitDefaultValue = false)] public float duration { get; set; } + [DataMember(EmitDefaultValue = false)] public object player { get; set; } + [DataMember(EmitDefaultValue = false)] public string audio_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string audio_source_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string audio_type { get; set; } + [DataMember(EmitDefaultValue = false)] public string video_type { get; set; } + [DataMember(EmitDefaultValue = false)] public string link_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string image_permalink { get; set; } + [DataMember(EmitDefaultValue = false)] public List photos { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_id { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_name { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_title { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_uuid { get; set; } + [DataMember(EmitDefaultValue = false)] public bool reblogged_from_can_message { get; set; } + [DataMember(EmitDefaultValue = false)] public bool reblogged_from_following { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_id { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_name { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_title { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_root_uuid { get; set; } + [DataMember(EmitDefaultValue = false)] public bool reblogged_root_can_message { get; set; } + [DataMember(EmitDefaultValue = false)] public bool reblogged_root_following { get; set; } + [DataMember(EmitDefaultValue = false)] public bool can_like { get; set; } + [DataMember(EmitDefaultValue = false)] public bool can_reblog { get; set; } + [DataMember(EmitDefaultValue = false)] public bool can_send_in_message { get; set; } + [DataMember(EmitDefaultValue = false)] public bool can_reply { get; set; } + [DataMember(EmitDefaultValue = false)] public bool display_avatar { get; set; } + [DataMember(EmitDefaultValue = false)] public string tumblelog_key { get; set; } + [DataMember(EmitDefaultValue = false)] public string tumblelog_uuid { get; set; } + [DataMember(EmitDefaultValue = false)] public string root_id { get; set; } + [DataMember(EmitDefaultValue = false)] public SharePopoverData share_popover_data { get; set; } + [DataMember(EmitDefaultValue = false)] public string posted_on_tooltip { get; set; } + [DataMember(EmitDefaultValue = false)] public string tag_layout_class { get; set; } + [DataMember(EmitDefaultValue = false)] public bool has_custom_source_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string tumblelog { get; set; } + [DataMember(EmitDefaultValue = false)] public string reblogged_from_tumblr_url { get; set; } + [DataMember(EmitDefaultValue = false)] public Notes notes { get; set; } + [DataMember(EmitDefaultValue = false)] public bool reblogged_from_followed { get; set; } + [DataMember(EmitDefaultValue = false)] public string post_html { get; set; } + [DataMember(EmitDefaultValue = false)] public string asking_name { get; set; } + [DataMember(EmitDefaultValue = false)] public string asking_url { get; set; } + [DataMember(EmitDefaultValue = false)] public string question { get; set; } + [DataMember(EmitDefaultValue = false)] public string answer { get; set; } + [DataMember(EmitDefaultValue = false)] public string photoset_layout { get; set; } + [DataMember(EmitDefaultValue = false)] public List photoset_photos { get; set; } + [DataMember(EmitDefaultValue = false)] public int? year { get; set; } + [DataMember(EmitDefaultValue = false)] public string track { get; set; } + [DataMember(EmitDefaultValue = false)] public bool? is_external { get; set; } + [DataMember(EmitDefaultValue = false)] public string title { get; set; } + [DataMember(EmitDefaultValue = false)] public string body { get; set; } + [DataMember(EmitDefaultValue = false)] public string text { get; set; } + [DataMember(EmitDefaultValue = false)] public string source { get; set; } + [DataMember(EmitDefaultValue = false)] public string artist { get; set; } + [DataMember(EmitDefaultValue = false)] public string track_name { get; set; } + [DataMember(EmitDefaultValue = false)] public string album_art { get; set; } + [DataMember(EmitDefaultValue = false)] public string embed { get; set; } + [DataMember(EmitDefaultValue = false)] public int plays { get; set; } + [DataMember(EmitDefaultValue = false)] public string album { get; set; } + [DataMember(EmitDefaultValue = false)] public List dialogue { get; set; } + [DataMember(EmitDefaultValue = false)] public bool? is_anonymous { get; set; } + [DataMember(EmitDefaultValue = false)] public bool? is_submission { get; set; } + [DataMember(EmitDefaultValue = false)] public bool should_bypass_tagfiltering { get; set; } + [DataMember(EmitDefaultValue = false)] public bool should_bypass_safemode { get; set; } + [DataMember(EmitDefaultValue = false)] public bool can_modify_safe_mode { get; set; } + [DataMember(EmitDefaultValue = false)] public object survey { get; set; } + [DataMember(EmitDefaultValue = false)] public string url { get; set; } + [DataMember(EmitDefaultValue = false)] public string link_image { get; set; } + [DataMember(EmitDefaultValue = false)] public LinkImageDimensions link_image_dimensions { get; set; } + [DataMember(EmitDefaultValue = false)] public object link_author { get; set; } + [DataMember(EmitDefaultValue = false)] public string excerpt { get; set; } + [DataMember(EmitDefaultValue = false)] public string publisher { get; set; } + [DataMember(EmitDefaultValue = false)] public string description { get; set; } + + public object Clone() + { + return this.MemberwiseClone(); + } + + [OnDeserializing] + internal void OnDeserializingMethod(StreamingContext context) + { + Initialize(); + } + + private void Initialize() + { + type = string.Empty; + is_nsfw_based_on_score = false; + supply_logging = new List(); + blog = new Blog(); + is_nsfw = false; + nsfw_score = 0.0; + _links = new Links(); + id = string.Empty; + post_url = string.Empty; + slug = string.Empty; + date = string.Empty; + timestamp = 0; + state = string.Empty; + format = string.Empty; + reblog_key = string.Empty; + tags = new List(); + short_url = string.Empty; + summary = string.Empty; + recommended_source = string.Empty; + recommended_color = string.Empty; + followed = false; + liked = false; + source_url = string.Empty; + source_title = string.Empty; + caption = string.Empty; + reblog = new Reblog(); + trail = new List(); + video_url = string.Empty; + html5_capable = false; + thumbnail_url = string.Empty; + thumbnail_width = 0; + thumbnail_height = 0; + duration = 0; + player = new object(); + audio_url = string.Empty; + audio_source_url = string.Empty; + audio_type = string.Empty; + video_type = string.Empty; + link_url = string.Empty; + image_permalink = string.Empty; + photos = new List(); + reblogged_from_id = string.Empty; + reblogged_from_url = string.Empty; + reblogged_from_name = string.Empty; + reblogged_from_title = string.Empty; + reblogged_from_uuid = string.Empty; + reblogged_from_can_message = false; + reblogged_from_following = false; + reblogged_root_id = string.Empty; + reblogged_root_url = string.Empty; + reblogged_root_name = string.Empty; + reblogged_root_title = string.Empty; + reblogged_root_uuid = string.Empty; + reblogged_root_can_message = false; + reblogged_root_following = false; + can_like = false; + can_reblog = false; + can_send_in_message = false; + can_reply = false; + display_avatar = false; + tumblelog_key = string.Empty; + tumblelog_uuid = string.Empty; + root_id = string.Empty; + share_popover_data = new SharePopoverData(); + posted_on_tooltip = string.Empty; + tag_layout_class = string.Empty; + has_custom_source_url = false; + tumblelog = string.Empty; + reblogged_from_tumblr_url = string.Empty; + notes = new Notes(); + reblogged_from_followed = false; + post_html = string.Empty; + asking_name = string.Empty; + asking_url = string.Empty; + question = string.Empty; + answer = string.Empty; + photoset_layout = string.Empty; + photoset_photos = new List(); + year = 0; + track = string.Empty; + is_external = false; + title = string.Empty; + body = string.Empty; + text = string.Empty; + source = string.Empty; + artist = string.Empty; + track_name = string.Empty; + album_art = string.Empty; + embed = string.Empty; + plays = 0; + album = string.Empty; + dialogue = new List(); + is_anonymous = false; + is_submission = false; + should_bypass_safemode = false; + can_modify_safe_mode = false; + survey = new object(); + url = string.Empty; + link_image = string.Empty; + link_image_dimensions = new LinkImageDimensions(); + link_author = string.Empty; + excerpt = string.Empty; + publisher = string.Empty; + description = string.Empty; + } + } + + [DataContract] + public class PixelbugUrl + { + [DataMember(EmitDefaultValue = false)] public string type { get; set; } + [DataMember(EmitDefaultValue = false)] public string script { get; set; } + [DataMember(EmitDefaultValue = false)] public string img { get; set; } + } + + [DataContract] + public class PixelbugPost + { + [DataMember(EmitDefaultValue = false)] public string type { get; set; } + [DataMember(EmitDefaultValue = false)] public string script { get; set; } + [DataMember(EmitDefaultValue = false)] public string img { get; set; } + } + + [DataContract] + public class Player + { + [DataMember(EmitDefaultValue = false)] public int width { get; set; } + [DataMember(EmitDefaultValue = false)] public string embed_code { get; set; } + } + + [DataContract] + public class Youtube + { + [DataMember(EmitDefaultValue = false)] public string video_id { get; set; } + [DataMember(EmitDefaultValue = false)] public int width { get; set; } + [DataMember(EmitDefaultValue = false)] public int height { get; set; } + } + + [DataContract] + public class Video + { + [DataMember(EmitDefaultValue = false)] public Youtube youtube { get; set; } + } + + [DataContract] + public class TrackingHtml + { + [DataMember(EmitDefaultValue = false)] public PixelbugUrl pixelbug_url { get; set; } + [DataMember(EmitDefaultValue = false)] public PixelbugPost pixelbug_post { get; set; } + } +} diff --git a/src/TumblThree/TumblThree.Applications/Downloader/AbstractDownloader.cs b/src/TumblThree/TumblThree.Applications/Downloader/AbstractDownloader.cs index ba58cb5..f015a8e 100644 --- a/src/TumblThree/TumblThree.Applications/Downloader/AbstractDownloader.cs +++ b/src/TumblThree/TumblThree.Applications/Downloader/AbstractDownloader.cs @@ -12,7 +12,8 @@ using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; +using TumblThree.Domain.Models.Files; namespace TumblThree.Applications.Downloader { @@ -29,9 +30,11 @@ public abstract class AbstractDownloader : IDownloader protected readonly CancellationToken ct; protected readonly PauseToken pt; protected readonly FileDownloader fileDownloader; - private string[] suffixes = { ".jpg", ".jpeg", ".png" }; + private readonly string[] suffixes = { ".jpg", ".jpeg", ".png" }; - protected AbstractDownloader(IShellService shellService, IManagerService managerService, CancellationToken ct, PauseToken pt, IProgress progress, IPostQueue postQueue, FileDownloader fileDownloader, ICrawlerService crawlerService = null, IBlog blog = null, IFiles files = null) + protected AbstractDownloader(IShellService shellService, IManagerService managerService, CancellationToken ct, + PauseToken pt, IProgress progress, IPostQueue postQueue, FileDownloader fileDownloader, + ICrawlerService crawlerService = null, IBlog blog = null, IFiles files = null) { this.shellService = shellService; this.crawlerService = crawlerService; @@ -47,7 +50,7 @@ protected AbstractDownloader(IShellService shellService, IManagerService manager public void UpdateProgressQueueInformation(string format, params object[] args) { - var newProgress = new DataModels.DownloadProgress + var newProgress = new DownloadProgress { Progress = string.Format(CultureInfo.CurrentCulture, format, args) }; @@ -81,11 +84,18 @@ protected virtual async Task DownloadBinaryFile(string fileLocation, strin catch (WebException webException) when ((webException.Response != null)) { var webRespStatusCode = (int)((HttpWebResponse)webException.Response).StatusCode; - if (webRespStatusCode >= 400 && webRespStatusCode < 600) // removes inaccessible files: http status codes 400 to 599 + if (webRespStatusCode >= 400 && webRespStatusCode < 600 + ) // removes inaccessible files: http status codes 400 to 599 { - try { File.Delete(fileLocation); } // could be open again in a different thread - catch { } + try + { + File.Delete(fileLocation); + } // could be open again in a different thread + catch + { + } } + return false; } catch (TimeoutException timeoutException) @@ -94,10 +104,6 @@ protected virtual async Task DownloadBinaryFile(string fileLocation, strin shellService.ShowError(timeoutException, Resources.TimeoutReached, Resources.Downloading, blog.Name); throw; } - catch - { - throw; - } } protected virtual async Task DownloadBinaryFile(string fileLocation, string fileLocationUrlList, string url) @@ -106,6 +112,7 @@ protected virtual async Task DownloadBinaryFile(string fileLocation, strin { return await DownloadBinaryFile(fileLocation, url); } + return AppendToTextFile(fileLocationUrlList, url); } @@ -120,6 +127,7 @@ protected virtual bool AppendToTextFile(string fileLocation, string text) sw.WriteLine(text); } } + return true; } catch (IOException ex) when ((ex.HResult & 0xFFFF) == 0x27 || (ex.HResult & 0xFFFF) == 0x70) @@ -137,8 +145,10 @@ protected virtual bool AppendToTextFile(string fileLocation, string text) public virtual async Task DownloadBlogAsync() { - var concurrentConnectionsSemaphore = new SemaphoreSlim(shellService.Settings.ConcurrentConnections / crawlerService.ActiveItems.Count); - var concurrentVideoConnectionsSemaphore = new SemaphoreSlim(shellService.Settings.ConcurrentVideoConnections / crawlerService.ActiveItems.Count); + var concurrentConnectionsSemaphore = + new SemaphoreSlim(shellService.Settings.ConcurrentConnections / crawlerService.ActiveItems.Count); + var concurrentVideoConnectionsSemaphore = + new SemaphoreSlim(shellService.Settings.ConcurrentVideoConnections / crawlerService.ActiveItems.Count); var trackedTasks = new List(); var completeDownload = true; @@ -154,6 +164,7 @@ public virtual async Task DownloadBlogAsync() { break; } + if (pt.IsPaused) { pt.WaitWhilePausedWithResponseAsyc().Wait(); @@ -161,8 +172,13 @@ public virtual async Task DownloadBlogAsync() trackedTasks.Add(new Func(async () => { - try { await DownloadPostAsync(downloadItem); } - catch { } + try + { + await DownloadPostAsync(downloadItem); + } + catch + { + } finally { concurrentConnectionsSemaphore.Release(); @@ -171,8 +187,15 @@ public virtual async Task DownloadBlogAsync() } })()); } - try { await Task.WhenAll(trackedTasks); } - catch { completeDownload = false; } + + try + { + await Task.WhenAll(trackedTasks); + } + catch + { + completeDownload = false; + } blog.LastDownloadedPhoto = null; blog.LastDownloadedVideo = null; @@ -222,8 +245,10 @@ protected virtual async Task DownloadBinaryPost(TumblrPost downloadItem) blog.LastDownloadedVideo = Path.GetFullPath(fileLocation); } } + return true; } + return false; } else @@ -231,6 +256,7 @@ protected virtual async Task DownloadBinaryPost(TumblrPost downloadItem) string fileName = FileName(downloadItem); UpdateProgressQueueInformation(Resources.ProgressSkipFile, fileName); } + return true; } @@ -246,10 +272,10 @@ private bool CheckIfFileExistsInDB(string url) if (files.CheckIfFileExistsInDB(url) || blog.CheckIfBlogShouldCheckDirectory(GetCoreImageUrl(url))) return true; } + return false; } - private void DownloadTextPost(TumblrPost downloadItem) { string postId = PostId(downloadItem); @@ -314,10 +340,11 @@ protected static DateTime PostDate(TumblrPost downloadItem) { if (!string.IsNullOrEmpty(downloadItem.Date)) { - var epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); + var epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); DateTime postDate = epoch.AddSeconds(Convert.ToDouble(downloadItem.Date)).ToLocalTime(); return postDate; } + return DateTime.Now; } } diff --git a/src/TumblThree/TumblThree.Applications/Downloader/FileDownloader.cs b/src/TumblThree/TumblThree.Applications/Downloader/FileDownloader.cs index 8a2408e..fe9c6b8 100644 --- a/src/TumblThree/TumblThree.Applications/Downloader/FileDownloader.cs +++ b/src/TumblThree/TumblThree.Applications/Downloader/FileDownloader.cs @@ -20,7 +20,8 @@ public class FileDownloader public event EventHandler Completed; public event EventHandler ProgressChanged; - public FileDownloader(AppSettings settings, CancellationToken ct, IWebRequestFactory webRequestFactory, ISharedCookieService cookieService) + public FileDownloader(AppSettings settings, CancellationToken ct, IWebRequestFactory webRequestFactory, + ISharedCookieService cookieService) { this.settings = settings; this.ct = ct; @@ -44,6 +45,7 @@ public async Task DownloadFileWithResumeAsync(string url, string destinati if (totalBytesReceived >= await CheckDownloadSizeAsync(url).TimeoutAfter(settings.TimeOut)) return true; } + if (ct.IsCancellationRequested) return false; @@ -81,7 +83,9 @@ public async Task DownloadFileWithResumeAsync(string url, string destinati var bytesRead = 0; //Stopwatch sw = Stopwatch.StartNew(); - while ((bytesRead = await throttledStream.ReadAsync(buffer, 0, buffer.Length, ct).TimeoutAfter(settings.TimeOut)) > 0) + while ((bytesRead = await throttledStream + .ReadAsync(buffer, 0, buffer.Length, ct) + .TimeoutAfter(settings.TimeOut)) > 0) { await fileStream.WriteAsync(buffer, 0, bytesRead); totalBytesReceived += bytesRead; @@ -93,6 +97,7 @@ public async Task DownloadFileWithResumeAsync(string url, string destinati } } } + if (totalBytesReceived >= totalBytesToReceive) { break; @@ -106,6 +111,7 @@ public async Task DownloadFileWithResumeAsync(string url, string destinati { return false; } + // retry (IOException: Received an unexpected EOF or 0 bytes from the transport stream) } catch (WebException webException) @@ -124,6 +130,7 @@ public async Task DownloadFileWithResumeAsync(string url, string destinati requestRegistration.Dispose(); } } + return true; } } @@ -145,7 +152,6 @@ private async Task CheckDownloadSizeAsync(string url) { requestRegistration.Dispose(); } - } public async Task ReadFromUrlIntoStream(string url) @@ -175,7 +181,8 @@ private Stream GetStreamForDownload(Stream stream) public static async Task SaveStreamToDisk(Stream input, string destinationFileName, CancellationToken ct) { - using (var stream = new FileStream(destinationFileName, FileMode.Create, FileAccess.Write, FileShare.Read, BufferSize, true)) + using (var stream = new FileStream(destinationFileName, FileMode.Create, FileAccess.Write, FileShare.Read, BufferSize, + true)) { var buf = new byte[4096]; int bytesRead; @@ -184,6 +191,7 @@ public static async Task SaveStreamToDisk(Stream input, string destination await stream.WriteAsync(buf, 0, bytesRead, ct); } } + return true; } @@ -211,6 +219,7 @@ public DownloadProgressChangedEventArgs(long totalReceived, long fileSize, long public long TotalBytesToReceive { get; private set; } public float ProgressPercentage => (BytesReceived / (float)TotalBytesToReceive) * 100; public float CurrentSpeed { get; private set; } // in bytes + public TimeSpan TimeLeft { get diff --git a/src/TumblThree/TumblThree.Applications/Downloader/TumblrDownloader.cs b/src/TumblThree/TumblThree.Applications/Downloader/TumblrDownloader.cs index d1c7b0b..468f9a9 100644 --- a/src/TumblThree/TumblThree.Applications/Downloader/TumblrDownloader.cs +++ b/src/TumblThree/TumblThree.Applications/Downloader/TumblrDownloader.cs @@ -9,7 +9,8 @@ using TumblThree.Applications.DataModels; using TumblThree.Applications.DataModels.TumblrPosts; using TumblThree.Applications.Services; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; +using TumblThree.Domain.Models.Files; namespace TumblThree.Applications.Downloader { @@ -18,7 +19,9 @@ public class TumblrDownloader : AbstractDownloader protected List tags = new List(); protected int numberOfPagesCrawled = 0; - public TumblrDownloader(IShellService shellService, IManagerService managerService, CancellationToken ct, PauseToken pt, IProgress progress, IPostQueue postQueue, FileDownloader fileDownloader, ICrawlerService crawlerService, IBlog blog, IFiles files) + public TumblrDownloader(IShellService shellService, IManagerService managerService, CancellationToken ct, PauseToken pt, + IProgress progress, IPostQueue postQueue, FileDownloader fileDownloader, + ICrawlerService crawlerService, IBlog blog, IFiles files) : base(shellService, managerService, ct, pt, progress, postQueue, fileDownloader, crawlerService, blog, files) { } @@ -34,15 +37,15 @@ protected string ResizeTumblrImageUrl(string imageUrl) { var sb = new StringBuilder(imageUrl); return sb - .Replace("_raw", "_" + ImageSize()) - .Replace("_1280", "_" + ImageSize()) - .Replace("_540", "_" + ImageSize()) - .Replace("_500", "_" + ImageSize()) - .Replace("_400", "_" + ImageSize()) - .Replace("_250", "_" + ImageSize()) - .Replace("_100", "_" + ImageSize()) - .Replace("_75sq", "_" + ImageSize()) - .ToString(); + .Replace("_raw", "_" + ImageSize()) + .Replace("_1280", "_" + ImageSize()) + .Replace("_540", "_" + ImageSize()) + .Replace("_500", "_" + ImageSize()) + .Replace("_400", "_" + ImageSize()) + .Replace("_250", "_" + ImageSize()) + .Replace("_100", "_" + ImageSize()) + .Replace("_75sq", "_" + ImageSize()) + .ToString(); } /// @@ -72,6 +75,7 @@ protected override async Task DownloadBinaryPost(TumblrPost downloadItem) if (await base.DownloadBinaryPost(new PhotoPost(url, downloadItem.Id, downloadItem.Date))) return true; } + return await base.DownloadBinaryPost(downloadItem); } @@ -90,6 +94,7 @@ public string BuildRawImageUrl(string url, string host) path = imageDimension.Replace(path, "_raw"); return "https://" + host + "/" + path; } + return url; } } diff --git a/src/TumblThree/TumblThree.Applications/Downloader/TumblrJsonDownloader.cs b/src/TumblThree/TumblThree.Applications/Downloader/TumblrJsonDownloader.cs index f1d07c3..77602ca 100644 --- a/src/TumblThree/TumblThree.Applications/Downloader/TumblrJsonDownloader.cs +++ b/src/TumblThree/TumblThree.Applications/Downloader/TumblrJsonDownloader.cs @@ -12,7 +12,7 @@ using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Downloader { @@ -25,7 +25,8 @@ public class TumblrJsonDownloader : ICrawlerDataDownloader protected readonly CancellationToken ct; protected readonly PauseToken pt; - public TumblrJsonDownloader(IShellService shellService, CancellationToken ct, PauseToken pt, IPostQueue> jsonQueue, ICrawlerService crawlerService, IBlog blog) + public TumblrJsonDownloader(IShellService shellService, CancellationToken ct, PauseToken pt, + IPostQueue> jsonQueue, ICrawlerService crawlerService, IBlog blog) { this.shellService = shellService; this.crawlerService = crawlerService; @@ -46,6 +47,7 @@ public virtual async Task DownloadCrawlerDataAsync() { break; } + if (pt.IsPaused) { pt.WaitWhilePausedWithResponseAsyc().Wait(); @@ -53,12 +55,23 @@ public virtual async Task DownloadCrawlerDataAsync() trackedTasks.Add(new Func(async () => { - try { await DownloadTextPost(downloadItem); } - catch { } + try + { + await DownloadTextPost(downloadItem); + } + catch + { + } })()); } - try { await Task.WhenAll(trackedTasks); } - catch { } + + try + { + await Task.WhenAll(trackedTasks); + } + catch + { + } } private async Task DownloadTextPost(TumblrCrawlerData crawlerData) diff --git a/src/TumblThree/TumblThree.Applications/Downloader/TumblrXmlDownloader.cs b/src/TumblThree/TumblThree.Applications/Downloader/TumblrXmlDownloader.cs index f216629..29cc9f3 100644 --- a/src/TumblThree/TumblThree.Applications/Downloader/TumblrXmlDownloader.cs +++ b/src/TumblThree/TumblThree.Applications/Downloader/TumblrXmlDownloader.cs @@ -12,7 +12,7 @@ using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Downloader { @@ -25,7 +25,8 @@ public class TumblrXmlDownloader : ICrawlerDataDownloader protected readonly CancellationToken ct; protected readonly PauseToken pt; - public TumblrXmlDownloader(IShellService shellService, CancellationToken ct, PauseToken pt, IPostQueue> xmlQueue, ICrawlerService crawlerService, IBlog blog) + public TumblrXmlDownloader(IShellService shellService, CancellationToken ct, PauseToken pt, + IPostQueue> xmlQueue, ICrawlerService crawlerService, IBlog blog) { this.shellService = shellService; this.crawlerService = crawlerService; @@ -46,6 +47,7 @@ public virtual async Task DownloadCrawlerDataAsync() { break; } + if (pt.IsPaused) { pt.WaitWhilePausedWithResponseAsyc().Wait(); @@ -53,14 +55,24 @@ public virtual async Task DownloadCrawlerDataAsync() trackedTasks.Add(new Func(async () => { - try { await DownloadTextPost(downloadItem); } - catch { } + try + { + await DownloadTextPost(downloadItem); + } + catch + { + } })()); } - try { await Task.WhenAll(trackedTasks); } - catch { } - } + try + { + await Task.WhenAll(trackedTasks); + } + catch + { + } + } private async Task DownloadTextPost(TumblrCrawlerData crawlerData) { @@ -100,7 +112,7 @@ private static string PrettyXml(XContainer xml) NewLineOnAttributes = true }; - using (var xmlWriter = XmlWriter.Create(stringBuilder, settings)) + using (XmlWriter xmlWriter = XmlWriter.Create(stringBuilder, settings)) { xml.WriteTo(xmlWriter); } diff --git a/src/TumblThree/TumblThree.Applications/ObjectModel/ObservableRangeCollection.cs b/src/TumblThree/TumblThree.Applications/ObjectModel/ObservableRangeCollection.cs index 7b51d18..a618cd2 100644 --- a/src/TumblThree/TumblThree.Applications/ObjectModel/ObservableRangeCollection.cs +++ b/src/TumblThree/TumblThree.Applications/ObjectModel/ObservableRangeCollection.cs @@ -12,9 +12,9 @@ public class ObservableRangeCollection : ObservableCollection /// public void AddRange(IEnumerable collection) { - if (collection == null) throw new ArgumentNullException("collection"); + if (collection == null) throw new ArgumentNullException(nameof(collection)); - foreach (var i in collection) Items.Add(i); + foreach (T i in collection) Items.Add(i); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } @@ -23,9 +23,9 @@ public void AddRange(IEnumerable collection) /// public void RemoveRange(IEnumerable collection) { - if (collection == null) throw new ArgumentNullException("collection"); + if (collection == null) throw new ArgumentNullException(nameof(collection)); - foreach (var i in collection) Items.Remove(i); + foreach (T i in collection) Items.Remove(i); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } @@ -42,10 +42,10 @@ public void Replace(T item) /// public void ReplaceRange(IEnumerable collection) { - if (collection == null) throw new ArgumentNullException("collection"); + if (collection == null) throw new ArgumentNullException(nameof(collection)); Items.Clear(); - foreach (var i in collection) Items.Add(i); + foreach (T i in collection) Items.Add(i); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } @@ -53,7 +53,9 @@ public void ReplaceRange(IEnumerable collection) /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class. /// public ObservableRangeCollection() - : base() { } + : base() + { + } /// /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class that contains elements copied from the specified collection. @@ -61,6 +63,8 @@ public ObservableRangeCollection() /// collection: The collection from which the elements are copied. /// The collection parameter cannot be null. public ObservableRangeCollection(IEnumerable collection) - : base(collection) { } + : base(collection) + { + } } } diff --git a/src/TumblThree/TumblThree.Applications/Parser/CatBoxParser.cs b/src/TumblThree/TumblThree.Applications/Parser/CatBoxParser.cs index 21de13a..8d940c2 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/CatBoxParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/CatBoxParser.cs @@ -29,6 +29,7 @@ public string CreateCatBoxUrl(string id, string detectedUrl, CatBoxTypes type) default: throw new ArgumentOutOfRangeException(); } + return url; } } diff --git a/src/TumblThree/TumblThree.Applications/Parser/GfycatParser.cs b/src/TumblThree/TumblThree.Applications/Parser/GfycatParser.cs index cd96812..2d8aebe 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/GfycatParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/GfycatParser.cs @@ -7,11 +7,12 @@ using System.Threading.Tasks; using System.Xml; using System.Xml.Linq; + using TumblThree.Applications.Properties; using TumblThree.Applications.Services; using TumblThree.Domain.Models; -namespace TumblThree.Applications.Crawler +namespace TumblThree.Applications.Parser { public class GfycatParser : IGfycatParser { @@ -50,7 +51,7 @@ public virtual async Task RequestGfycatCajax(string gfyId) public string ParseGfycatCajaxResponse(string result, GfycatTypes gfycatType) { XmlDictionaryReader jsonReader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(result), - new System.Xml.XmlDictionaryReaderQuotas()); + new XmlDictionaryReaderQuotas()); XElement root = XElement.Load(jsonReader); string url; switch (gfycatType) @@ -82,7 +83,8 @@ public string ParseGfycatCajaxResponse(string result, GfycatTypes gfycatType) default: throw new ArgumentOutOfRangeException(); } + return url; } } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Parser/ICatBoxParser.cs b/src/TumblThree/TumblThree.Applications/Parser/ICatBoxParser.cs index 56b3e6c..a56c5f6 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/ICatBoxParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/ICatBoxParser.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; + using TumblThree.Domain.Models; namespace TumblThree.Applications.Parser diff --git a/src/TumblThree/TumblThree.Applications/Parser/IGfycatParser.cs b/src/TumblThree/TumblThree.Applications/Parser/IGfycatParser.cs index 4588da5..026e45a 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/IGfycatParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/IGfycatParser.cs @@ -3,7 +3,7 @@ using TumblThree.Domain.Models; -namespace TumblThree.Applications.Crawler +namespace TumblThree.Applications.Parser { public interface IGfycatParser { @@ -13,4 +13,4 @@ public interface IGfycatParser string ParseGfycatCajaxResponse(string result, GfycatTypes gfycatType); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Parser/IImgurParser.cs b/src/TumblThree/TumblThree.Applications/Parser/IImgurParser.cs index 7484d2a..70bc38a 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/IImgurParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/IImgurParser.cs @@ -1,7 +1,7 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; -namespace TumblThree.Applications.Crawler +namespace TumblThree.Applications.Parser { public interface IImgurParser { diff --git a/src/TumblThree/TumblThree.Applications/Parser/ILoliSafeParser.cs b/src/TumblThree/TumblThree.Applications/Parser/ILoliSafeParser.cs index 6467ab1..d2a1b68 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/ILoliSafeParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/ILoliSafeParser.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; + using TumblThree.Domain.Models; namespace TumblThree.Applications.Parser diff --git a/src/TumblThree/TumblThree.Applications/Parser/IMixtapeParser.cs b/src/TumblThree/TumblThree.Applications/Parser/IMixtapeParser.cs index 8d2fb2a..58c6501 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/IMixtapeParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/IMixtapeParser.cs @@ -1,7 +1,8 @@ using System.Text.RegularExpressions; + using TumblThree.Domain.Models; -namespace TumblThree.Applications.Crawler +namespace TumblThree.Applications.Parser { public interface IMixtapeParser { @@ -9,4 +10,4 @@ public interface IMixtapeParser string CreateMixtapeUrl(string mixtapeId, string detectedUrl, MixtapeTypes mixtapeType); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Parser/ISafeMoeParser.cs b/src/TumblThree/TumblThree.Applications/Parser/ISafeMoeParser.cs index cde8b4e..8aab882 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/ISafeMoeParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/ISafeMoeParser.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; + using TumblThree.Domain.Models; namespace TumblThree.Applications.Parser diff --git a/src/TumblThree/TumblThree.Applications/Parser/ITumblrApiXmlToText.cs b/src/TumblThree/TumblThree.Applications/Parser/ITumblrApiXmlToText.cs index 05b7462..a185917 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/ITumblrApiXmlToText.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/ITumblrApiXmlToText.cs @@ -5,12 +5,19 @@ namespace TumblThree.Applications.Parser public interface ITumblrApiXmlToTextParser { string ParseAnswer(XElement post); + string ParseAudioMeta(XElement post); + string ParseConversation(XElement post); + string ParseLink(XElement post); + string ParsePhotoMeta(XElement post); + string ParseQuote(XElement post); + string ParseText(XElement post); + string ParseVideoMeta(XElement post); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Parser/ITumblrParser.cs b/src/TumblThree/TumblThree.Applications/Parser/ITumblrParser.cs index d07e486..a03d213 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/ITumblrParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/ITumblrParser.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; -namespace TumblThree.Applications.Crawler +namespace TumblThree.Applications.Parser { public interface ITumblrParser { @@ -8,4 +8,4 @@ public interface ITumblrParser Regex GetTumblrVideoUrlRegex(); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Parser/ITumblrToText.cs b/src/TumblThree/TumblThree.Applications/Parser/ITumblrToText.cs index cd4d16b..df0a118 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/ITumblrToText.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/ITumblrToText.cs @@ -1,14 +1,21 @@ namespace TumblThree.Applications.Parser { - public interface ITumblrToTextParser + public interface ITumblrToTextParser { string ParseAnswer(T post); + string ParseAudioMeta(T post); + string ParseConversation(T post); + string ParseLink(T post); + string ParsePhotoMeta(T post); + string ParseQuote(T post); + string ParseText(T post); + string ParseVideoMeta(T post); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Parser/IUguuParser.cs b/src/TumblThree/TumblThree.Applications/Parser/IUguuParser.cs index 7d05cf3..1fae374 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/IUguuParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/IUguuParser.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; + using TumblThree.Domain.Models; namespace TumblThree.Applications.Parser diff --git a/src/TumblThree/TumblThree.Applications/Parser/IWebmshareParser.cs b/src/TumblThree/TumblThree.Applications/Parser/IWebmshareParser.cs index 1b0b6d0..f666a0b 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/IWebmshareParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/IWebmshareParser.cs @@ -2,7 +2,7 @@ using TumblThree.Domain.Models; -namespace TumblThree.Applications.Crawler +namespace TumblThree.Applications.Parser { public interface IWebmshareParser { @@ -10,4 +10,4 @@ public interface IWebmshareParser string CreateWebmshareUrl(string webshareId, string detectedUrl, WebmshareTypes webmshareType); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Parser/ImgurParser.cs b/src/TumblThree/TumblThree.Applications/Parser/ImgurParser.cs index 4b83b09..2cd5a8b 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/ImgurParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/ImgurParser.cs @@ -2,10 +2,11 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; + using TumblThree.Applications.Properties; using TumblThree.Applications.Services; -namespace TumblThree.Applications.Crawler +namespace TumblThree.Applications.Parser { public class ImgurParser : IImgurParser { diff --git a/src/TumblThree/TumblThree.Applications/Parser/LoliSafeParser.cs b/src/TumblThree/TumblThree.Applications/Parser/LoliSafeParser.cs index 89af47b..9193833 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/LoliSafeParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/LoliSafeParser.cs @@ -29,6 +29,7 @@ public string CreateLoliSafeUrl(string id, string detectedUrl, LoliSafeTypes typ default: throw new ArgumentOutOfRangeException(); } + return url; } } diff --git a/src/TumblThree/TumblThree.Applications/Parser/MixtapeParser.cs b/src/TumblThree/TumblThree.Applications/Parser/MixtapeParser.cs index 17c4600..d3a77b0 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/MixtapeParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/MixtapeParser.cs @@ -3,7 +3,7 @@ using TumblThree.Domain.Models; -namespace TumblThree.Applications.Crawler +namespace TumblThree.Applications.Parser { public class MixtapeParser : IMixtapeParser { @@ -29,7 +29,8 @@ public string CreateMixtapeUrl(string mixtapeId, string detectedUrl, MixtapeType default: throw new ArgumentOutOfRangeException(); } + return url; } } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Parser/SafeMoeParser.cs b/src/TumblThree/TumblThree.Applications/Parser/SafeMoeParser.cs index e8a7104..daad77a 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/SafeMoeParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/SafeMoeParser.cs @@ -29,6 +29,7 @@ public string CreateSafeMoeUrl(string id, string detectedUrl, SafeMoeTypes type) default: throw new ArgumentOutOfRangeException(); } + return url; } } diff --git a/src/TumblThree/TumblThree.Applications/Parser/TumblrApiJsonToJson.cs b/src/TumblThree/TumblThree.Applications/Parser/TumblrApiJsonToJson.cs index 1db3563..1fe7f41 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/TumblrApiJsonToJson.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/TumblrApiJsonToJson.cs @@ -1,6 +1,7 @@ using System.IO; using System.Runtime.Serialization.Json; using System.Text; + using TumblThree.Applications.DataModels.TumblrApiJson; using TumblThree.Domain; @@ -72,9 +73,9 @@ private string GetPostAsString(T post) postCopy.reblogged_root_avatar_url_64 = null; postCopy.reblogged_root_avatar_url_96 = null; - DataContractJsonSerializer serializer = new DataContractJsonSerializer(postCopy.GetType()); + var serializer = new DataContractJsonSerializer(postCopy.GetType()); - using (MemoryStream ms = new MemoryStream()) + using (var ms = new MemoryStream()) { serializer.WriteObject(ms, postCopy); return JsonFormatter.FormatOutput(Encoding.UTF8.GetString(ms.ToArray())); diff --git a/src/TumblThree/TumblThree.Applications/Parser/TumblrApiJsonToText.cs b/src/TumblThree/TumblThree.Applications/Parser/TumblrApiJsonToText.cs index fd8aa92..851b0ff 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/TumblrApiJsonToText.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/TumblrApiJsonToText.cs @@ -1,6 +1,7 @@ using System; using System.Globalization; using System.Linq; + using TumblThree.Applications.DataModels.TumblrApiJson; using TumblThree.Applications.Properties; @@ -99,7 +100,8 @@ public string ParseConversation(T post) Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.reblogged_from_name) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Quote, post.conversation.Select(dialogue => new { dialogue.name, dialogue.phrase })) + + string.Format(CultureInfo.CurrentCulture, Resources.Quote, + post.conversation.Select(dialogue => new { dialogue.name, dialogue.phrase })) + Environment.NewLine + post.regular_body + Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Resources.Tags, @@ -150,7 +152,8 @@ public string ParsePhotoMeta(T post) Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Resources.PhotoUrl, post.photo_url_1280) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.PhotoSetUrl, string.Join(" ", post.photos.Select(photo => photo.photo_url_1280))) + + string.Format(CultureInfo.CurrentCulture, Resources.PhotoSetUrl, + string.Join(" ", post.photos.Select(photo => photo.photo_url_1280))) + Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Resources.PhotoCaption, post.photo_caption) + Environment.NewLine + diff --git a/src/TumblThree/TumblThree.Applications/Parser/TumblrApiXmlToText.cs b/src/TumblThree/TumblThree.Applications/Parser/TumblrApiXmlToText.cs index fe9cea8..66c70cb 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/TumblrApiXmlToText.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/TumblrApiXmlToText.cs @@ -2,6 +2,7 @@ using System.Globalization; using System.Linq; using System.Xml.Linq; + using TumblThree.Applications.Properties; namespace TumblThree.Applications.Parser @@ -11,102 +12,165 @@ public class TumblrApiXmlToTextParser : ITumblrApiXmlToTextParser public string ParsePhotoMeta(XElement post) { return string.Format(CultureInfo.CurrentCulture, Resources.PostId, post.Attribute("id").Value) + ", " + - string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.PhotoUrl, post.Element("photo-url").Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.PhotoCaption, post.Element("photo-caption")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Tags, string.Join(", ", post.Elements("tag")?.Select(x => x.Value).ToArray())) + Environment.NewLine; + string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.PhotoUrl, post.Element("photo-url").Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.PhotoCaption, post.Element("photo-caption")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Tags, + string.Join(", ", post.Elements("tag").Select(x => x.Value).ToArray())) + Environment.NewLine; } public string ParseVideoMeta(XElement post) { return string.Format(CultureInfo.CurrentCulture, Resources.PostId, post.Attribute("id").Value) + ", " + - string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.VideoPlayer, post.Element("video-player")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Tags, string.Join(", ", post.Elements("tag")?.Select(x => x.Value).ToArray())) + Environment.NewLine; + string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.VideoPlayer, post.Element("video-player")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Tags, + string.Join(", ", post.Elements("tag").Select(x => x.Value).ToArray())) + Environment.NewLine; } public string ParseAudioMeta(XElement post) { return string.Format(CultureInfo.CurrentCulture, Resources.PostId, post.Attribute("id").Value) + ", " + - string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.AudioCaption, post.Element("audio-caption")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Id3Artist, post.Element("id3-artist")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Id3Title, post.Element("id3-title")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Id3Track, post.Element("id3-track")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Id3Album, post.Element("id3-album")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Id3Year, post.Element("id3-year")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Tags, string.Join(", ", post.Elements("tag")?.Select(x => x.Value).ToArray())) + Environment.NewLine; + string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.AudioCaption, post.Element("audio-caption")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Id3Artist, post.Element("id3-artist")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Id3Title, post.Element("id3-title")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Id3Track, post.Element("id3-track")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Id3Album, post.Element("id3-album")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Id3Year, post.Element("id3-year")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Tags, + string.Join(", ", post.Elements("tag").Select(x => x.Value).ToArray())) + Environment.NewLine; } public string ParseConversation(XElement post) { return string.Format(CultureInfo.CurrentCulture, Resources.PostId, post.Attribute("id").Value) + ", " + - string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Conversation, post.Element("conversation-text")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Tags, string.Join(", ", post.Elements("tag")?.Select(x => x.Value).ToArray())) + Environment.NewLine; + string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Conversation, post.Element("conversation-text")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Tags, + string.Join(", ", post.Elements("tag").Select(x => x.Value).ToArray())) + Environment.NewLine; } public string ParseLink(XElement post) { return string.Format(CultureInfo.CurrentCulture, Resources.PostId, post.Attribute("id").Value) + ", " + - string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Link, post.Element("link-text")?.Value) + Environment.NewLine + post.Element("link-url")?.Value + Environment.NewLine + post.Element("link-description")?.Value + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Tags, string.Join(", ", post.Elements("tag")?.Select(x => x.Value).ToArray())) + Environment.NewLine; + string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Link, post.Element("link-text")?.Value) + + Environment.NewLine + post.Element("link-url")?.Value + Environment.NewLine + + post.Element("link-description")?.Value + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Tags, + string.Join(", ", post.Elements("tag").Select(x => x.Value).ToArray())) + Environment.NewLine; } public string ParseQuote(XElement post) { return string.Format(CultureInfo.CurrentCulture, Resources.PostId, post.Attribute("id").Value) + ", " + - string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Quote, post.Element("quote-text")?.Value) + Environment.NewLine + post.Element("quote-source")?.Value + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Tags, string.Join(", ", post.Elements("tag")?.Select(x => x.Value).ToArray())) + Environment.NewLine; + string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Quote, post.Element("quote-text")?.Value) + + Environment.NewLine + post.Element("quote-source")?.Value + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Tags, + string.Join(", ", post.Elements("tag").Select(x => x.Value).ToArray())) + Environment.NewLine; } public string ParseText(XElement post) { return string.Format(CultureInfo.CurrentCulture, Resources.PostId, post.Attribute("id").Value) + ", " + - string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Title, post.Element("regular-title")?.Value) + Environment.NewLine + post.Element("regular-body")?.Value + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Tags, string.Join(", ", post.Elements("tag")?.Select(x => x.Value).ToArray())) + Environment.NewLine; + string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Title, post.Element("regular-title")?.Value) + + Environment.NewLine + post.Element("regular-body")?.Value + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Tags, + string.Join(", ", post.Elements("tag").Select(x => x.Value).ToArray())) + Environment.NewLine; } public string ParseAnswer(XElement post) { return string.Format(CultureInfo.CurrentCulture, Resources.PostId, post.Attribute("id").Value) + ", " + - string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + Environment.NewLine + post.Element("question")?.Value + Environment.NewLine + post.Element("answer")?.Value + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Tags, string.Join(", ", post.Elements("tag")?.Select(x => x.Value).ToArray())) + Environment.NewLine; + string.Format(CultureInfo.CurrentCulture, Resources.Date, post.Attribute("date-gmt").Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.UrlWithSlug, post.Attribute("url-with-slug")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogKey, post.Attribute("reblog-key")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogUrl, post.Attribute("reblogged-from-url")?.Value) + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.ReblogName, post.Attribute("reblogged-from-name")?.Value) + + Environment.NewLine + post.Element("question")?.Value + Environment.NewLine + post.Element("answer")?.Value + + Environment.NewLine + + string.Format(CultureInfo.CurrentCulture, Resources.Tags, + string.Join(", ", post.Elements("tag").Select(x => x.Value).ToArray())) + Environment.NewLine; } } } diff --git a/src/TumblThree/TumblThree.Applications/Parser/TumblrParser.cs b/src/TumblThree/TumblThree.Applications/Parser/TumblrParser.cs index 5478e94..23946ee 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/TumblrParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/TumblrParser.cs @@ -1,6 +1,6 @@ using System.Text.RegularExpressions; -namespace TumblThree.Applications.Crawler +namespace TumblThree.Applications.Parser { public class TumblrParser : ITumblrParser { diff --git a/src/TumblThree/TumblThree.Applications/Parser/TumblrSvcJsonToJson.cs b/src/TumblThree/TumblThree.Applications/Parser/TumblrSvcJsonToJson.cs index b02059d..b4c0428 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/TumblrSvcJsonToJson.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/TumblrSvcJsonToJson.cs @@ -1,6 +1,7 @@ using System.IO; using System.Runtime.Serialization.Json; using System.Text; + using TumblThree.Applications.DataModels.TumblrSvcJson; using TumblThree.Domain; @@ -55,9 +56,9 @@ private string GetPostAsString(T post) postCopy.trail = null; postCopy.share_popover_data = null; - DataContractJsonSerializer serializer = new DataContractJsonSerializer(postCopy.GetType()); + var serializer = new DataContractJsonSerializer(postCopy.GetType()); - using (MemoryStream ms = new MemoryStream()) + using (var ms = new MemoryStream()) { serializer.WriteObject(ms, postCopy); return JsonFormatter.FormatOutput(Encoding.UTF8.GetString(ms.ToArray())); diff --git a/src/TumblThree/TumblThree.Applications/Parser/TumblrSvcJsonToText.cs b/src/TumblThree/TumblThree.Applications/Parser/TumblrSvcJsonToText.cs index 81788f2..c67b668 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/TumblrSvcJsonToText.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/TumblrSvcJsonToText.cs @@ -1,6 +1,7 @@ using System; using System.Globalization; using System.Linq; + using TumblThree.Applications.DataModels.TumblrSvcJson; using TumblThree.Applications.Properties; @@ -104,7 +105,8 @@ public string ParseConversation(T post) Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Resources.Summary, post.summary) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.Quote, post.dialogue.Select(dialogue => new { dialogue.name, dialogue.phrase })) + + string.Format(CultureInfo.CurrentCulture, Resources.Quote, + post.dialogue.Select(dialogue => new { dialogue.name, dialogue.phrase })) + Environment.NewLine + post.body + Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Resources.Tags, @@ -157,9 +159,11 @@ public string ParsePhotoMeta(T post) Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Resources.Summary, post.summary) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.PhotoUrl, post.photos.Select(photo => photo.original_size.url).FirstOrDefault()) + + string.Format(CultureInfo.CurrentCulture, Resources.PhotoUrl, + post.photos.Select(photo => photo.original_size.url).FirstOrDefault()) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.PhotoCaption, post.trail.Select(trail => trail.content_raw).FirstOrDefault()) + + string.Format(CultureInfo.CurrentCulture, Resources.PhotoCaption, + post.trail.Select(trail => trail.content_raw).FirstOrDefault()) + Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Resources.Tags, string.Join(", ", post.tags.ToArray())) + @@ -207,7 +211,8 @@ public string ParseAudioMeta(T post) Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Resources.Summary, post.summary) + Environment.NewLine + - string.Format(CultureInfo.CurrentCulture, Resources.AudioCaption, post.trail.Select(trail => trail.content_raw).FirstOrDefault()) + + string.Format(CultureInfo.CurrentCulture, Resources.AudioCaption, + post.trail.Select(trail => trail.content_raw).FirstOrDefault()) + Environment.NewLine + string.Format(CultureInfo.CurrentCulture, Resources.Id3Artist, post.artist) + Environment.NewLine + diff --git a/src/TumblThree/TumblThree.Applications/Parser/UguuParser.cs b/src/TumblThree/TumblThree.Applications/Parser/UguuParser.cs index b2fc821..2274cbb 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/UguuParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/UguuParser.cs @@ -29,6 +29,7 @@ public string CreateUguuUrl(string uguuId, string detectedUrl, UguuTypes uguuTyp default: throw new ArgumentOutOfRangeException(); } + return url; } } diff --git a/src/TumblThree/TumblThree.Applications/Parser/WebmshareParser.cs b/src/TumblThree/TumblThree.Applications/Parser/WebmshareParser.cs index 59c0ee3..2a660b3 100644 --- a/src/TumblThree/TumblThree.Applications/Parser/WebmshareParser.cs +++ b/src/TumblThree/TumblThree.Applications/Parser/WebmshareParser.cs @@ -3,7 +3,7 @@ using TumblThree.Domain.Models; -namespace TumblThree.Applications.Crawler +namespace TumblThree.Applications.Parser { public class WebmshareParser : IWebmshareParser { @@ -14,7 +14,7 @@ public Regex GetWebmshareUrlRegex() public string CreateWebmshareUrl(string webshareId, string detectedUrl, WebmshareTypes webmshareType) { - string url = ""; + var url = ""; switch (webmshareType) { case WebmshareTypes.Mp4: @@ -30,7 +30,8 @@ public string CreateWebmshareUrl(string webshareId, string detectedUrl, Webmshar default: throw new ArgumentOutOfRangeException(); } + return url; } } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/PauseTokenSource.cs b/src/TumblThree/TumblThree.Applications/PauseTokenSource.cs index f766fd6..2941f9e 100644 --- a/src/TumblThree/TumblThree.Applications/PauseTokenSource.cs +++ b/src/TumblThree/TumblThree.Applications/PauseTokenSource.cs @@ -35,6 +35,7 @@ public void Pause() { return; } + m_paused = true; m_pauseResponse = s_completedTcs; m_resumeRequest = new TaskCompletionSource(); @@ -51,6 +52,7 @@ public void Resume() { return; } + m_paused = false; resumeRequest = m_resumeRequest; m_resumeRequest = null; @@ -72,6 +74,7 @@ public Task PauseWithResponseAsync() { return m_pauseResponse.Task; } + m_paused = true; m_pauseResponse = new TaskCompletionSource(); m_resumeRequest = new TaskCompletionSource(); @@ -92,6 +95,7 @@ public Task WaitWhilePausedWithResponseAsyc() { return s_completedTcs.Task; } + response = m_pauseResponse; resumeTask = m_resumeRequest.Task; } diff --git a/src/TumblThree/TumblThree.Applications/ProgressThrottler.cs b/src/TumblThree/TumblThree.Applications/ProgressThrottler.cs index 496e788..da1f017 100644 --- a/src/TumblThree/TumblThree.Applications/ProgressThrottler.cs +++ b/src/TumblThree/TumblThree.Applications/ProgressThrottler.cs @@ -14,12 +14,7 @@ public ProgressThrottler(IProgress progress, double interval) resettimer.Elapsed += resettimer_Elapsed; resettimer.Start(); - if (progress == null) - { - throw new ArgumentNullException(nameof(progress)); - } - - _progress = progress; + _progress = progress ?? throw new ArgumentNullException(nameof(progress)); } public void Report(T value) diff --git a/src/TumblThree/TumblThree.Applications/Properties/AppSettings.cs b/src/TumblThree/TumblThree.Applications/Properties/AppSettings.cs index 284238a..bc774f4 100644 --- a/src/TumblThree/TumblThree.Applications/Properties/AppSettings.cs +++ b/src/TumblThree/TumblThree.Applications/Properties/AppSettings.cs @@ -33,7 +33,7 @@ public sealed class AppSettings : IExtensibleDataObject private static string[] tumblrHosts = new string[] { - "data.tumblr.com" + "data.tumblr.com" }; public AppSettings() @@ -41,292 +41,194 @@ public AppSettings() Initialize(); } - [DataMember] - public string RequestTokenUrl { get; set; } + [DataMember] public string RequestTokenUrl { get; set; } - [DataMember] - public string AuthorizeUrl { get; set; } + [DataMember] public string AuthorizeUrl { get; set; } - [DataMember] - public string AccessTokenUrl { get; set; } + [DataMember] public string AccessTokenUrl { get; set; } - [DataMember] - public string OAuthCallbackUrl { get; set; } + [DataMember] public string OAuthCallbackUrl { get; set; } - [DataMember] - public string ApiKey { get; set; } + [DataMember] public string ApiKey { get; set; } - [DataMember] - public string SecretKey { get; set; } + [DataMember] public string SecretKey { get; set; } - [DataMember] - public string UserAgent { get; set; } + [DataMember] public string UserAgent { get; set; } - [DataMember] - public string OAuthToken { get; set; } + [DataMember] public string OAuthToken { get; set; } - [DataMember] - public string OAuthTokenSecret { get; set; } + [DataMember] public string OAuthTokenSecret { get; set; } - [DataMember] - public double Left { get; set; } + [DataMember] public double Left { get; set; } - [DataMember] - public double Top { get; set; } + [DataMember] public double Top { get; set; } - [DataMember] - public double Height { get; set; } + [DataMember] public double Height { get; set; } - [DataMember] - public double Width { get; set; } + [DataMember] public double Width { get; set; } - [DataMember] - public bool IsMaximized { get; set; } + [DataMember] public bool IsMaximized { get; set; } - [DataMember] - public double GridSplitterPosition { get; set; } + [DataMember] public double GridSplitterPosition { get; set; } - [DataMember] - public string DownloadLocation { get; set; } + [DataMember] public string DownloadLocation { get; set; } - [DataMember] - public string ExportLocation { get; set; } + [DataMember] public string ExportLocation { get; set; } - [DataMember] - public int ConcurrentConnections { get; set; } + [DataMember] public int ConcurrentConnections { get; set; } - [DataMember] - public int ConcurrentVideoConnections { get; set; } + [DataMember] public int ConcurrentVideoConnections { get; set; } - [DataMember] - public int ConcurrentBlogs { get; set; } + [DataMember] public int ConcurrentBlogs { get; set; } - [DataMember] - public int ConcurrentScans { get; set; } + [DataMember] public int ConcurrentScans { get; set; } - [DataMember] - public bool LimitScanBandwidth { get; set; } + [DataMember] public bool LimitScanBandwidth { get; set; } - [DataMember] - public int TimeOut { get; set; } + [DataMember] public int TimeOut { get; set; } - [DataMember] - public double ProgessUpdateInterval { get; set; } + [DataMember] public double ProgessUpdateInterval { get; set; } - [DataMember] - public bool LimitConnections { get; set; } + [DataMember] public bool LimitConnections { get; set; } - [DataMember] - public int MaxConnections { get; set; } + [DataMember] public int MaxConnections { get; set; } - [DataMember] - public int ConnectionTimeInterval { get; set; } + [DataMember] public int ConnectionTimeInterval { get; set; } - [DataMember] - public int MaxNumberOfRetries { get; set; } + [DataMember] public int MaxNumberOfRetries { get; set; } - [DataMember] - public long Bandwidth { get; set; } + [DataMember] public long Bandwidth { get; set; } - [DataMember] - public int BufferSize { get; set; } + [DataMember] public int BufferSize { get; set; } - [DataMember] - public string ImageSize { get; set; } + [DataMember] public string ImageSize { get; set; } - [DataMember] - public int VideoSize { get; set; } + [DataMember] public int VideoSize { get; set; } - [DataMember] - public string BlogType { get; set; } + [DataMember] public string BlogType { get; set; } - [DataMember] - public bool CheckClipboard { get; set; } + [DataMember] public bool CheckClipboard { get; set; } - [DataMember] - public bool ShowPicturePreview { get; set; } + [DataMember] public bool ShowPicturePreview { get; set; } - [DataMember] - public bool DisplayConfirmationDialog { get; set; } + [DataMember] public bool DisplayConfirmationDialog { get; set; } - [DataMember] - public bool DeleteOnlyIndex { get; set; } + [DataMember] public bool DeleteOnlyIndex { get; set; } - [DataMember] - public bool CheckOnlineStatusOnStartup { get; set; } + [DataMember] public bool CheckOnlineStatusOnStartup { get; set; } - [DataMember] - public bool SkipGif { get; set; } + [DataMember] public bool SkipGif { get; set; } - [DataMember] - public bool EnablePreview { get; set; } + [DataMember] public bool EnablePreview { get; set; } - [DataMember] - public bool RemoveIndexAfterCrawl { get; set; } + [DataMember] public bool RemoveIndexAfterCrawl { get; set; } - [DataMember] - public bool DownloadImages { get; set; } + [DataMember] public bool DownloadImages { get; set; } - [DataMember] - public bool DownloadVideos { get; set; } + [DataMember] public bool DownloadVideos { get; set; } - [DataMember] - public bool DownloadAudios { get; set; } + [DataMember] public bool DownloadAudios { get; set; } - [DataMember] - public bool DownloadTexts { get; set; } + [DataMember] public bool DownloadTexts { get; set; } - [DataMember] - public bool DownloadQuotes { get; set; } + [DataMember] public bool DownloadQuotes { get; set; } - [DataMember] - public bool DownloadConversations { get; set; } + [DataMember] public bool DownloadConversations { get; set; } - [DataMember] - public bool DownloadAnswers { get; set; } + [DataMember] public bool DownloadAnswers { get; set; } - [DataMember] - public bool DownloadLinks { get; set; } + [DataMember] public bool DownloadLinks { get; set; } - [DataMember] - public string DownloadPages { get; set; } + [DataMember] public string DownloadPages { get; set; } - [DataMember] - public int PageSize { get; set; } + [DataMember] public int PageSize { get; set; } - [DataMember] - public string DownloadFrom { get; set; } + [DataMember] public string DownloadFrom { get; set; } - [DataMember] - public string DownloadTo { get; set; } + [DataMember] public string DownloadTo { get; set; } - [DataMember] - public string Tags { get; set; } + [DataMember] public string Tags { get; set; } - [DataMember] - public bool CreateImageMeta { get; set; } + [DataMember] public bool CreateImageMeta { get; set; } - [DataMember] - public bool CreateVideoMeta { get; set; } + [DataMember] public bool CreateVideoMeta { get; set; } - [DataMember] - public bool CreateAudioMeta { get; set; } + [DataMember] public bool CreateAudioMeta { get; set; } - [DataMember] - public MetadataType MetadataFormat { get; set; } + [DataMember] public MetadataType MetadataFormat { get; set; } - [DataMember] - public bool DumpCrawlerData { get; set; } + [DataMember] public bool DumpCrawlerData { get; set; } - [DataMember] - public bool DownloadRebloggedPosts { get; set; } + [DataMember] public bool DownloadRebloggedPosts { get; set; } - [DataMember] - public bool DownloadGfycat { get; set; } + [DataMember] public bool DownloadGfycat { get; set; } - [DataMember] - public GfycatTypes GfycatType { get; set; } + [DataMember] public GfycatTypes GfycatType { get; set; } - [DataMember] - public bool DownloadImgur { get; set; } + [DataMember] public bool DownloadImgur { get; set; } - [DataMember] - public bool DownloadWebmshare { get; set; } + [DataMember] public bool DownloadWebmshare { get; set; } - [DataMember] - public WebmshareTypes WebmshareType { get; set; } + [DataMember] public WebmshareTypes WebmshareType { get; set; } - [DataMember] - public bool DownloadMixtape { get; set; } + [DataMember] public bool DownloadMixtape { get; set; } - [DataMember] - public MixtapeTypes MixtapeType { get; set; } + [DataMember] public MixtapeTypes MixtapeType { get; set; } - [DataMember] - public bool DownloadUguu { get; set; } + [DataMember] public bool DownloadUguu { get; set; } - [DataMember] - public UguuTypes UguuType { get; set; } + [DataMember] public UguuTypes UguuType { get; set; } - [DataMember] - public bool DownloadSafeMoe { get; set; } + [DataMember] public bool DownloadSafeMoe { get; set; } - [DataMember] - public SafeMoeTypes SafeMoeType { get; set; } + [DataMember] public SafeMoeTypes SafeMoeType { get; set; } - [DataMember] - public bool DownloadLoliSafe { get; set; } + [DataMember] public bool DownloadLoliSafe { get; set; } - [DataMember] - public LoliSafeTypes LoliSafeType { get; set; } + [DataMember] public LoliSafeTypes LoliSafeType { get; set; } - [DataMember] - public bool DownloadCatBox { get; set; } + [DataMember] public bool DownloadCatBox { get; set; } - [DataMember] - public CatBoxTypes CatBoxType { get; set; } + [DataMember] public CatBoxTypes CatBoxType { get; set; } - [DataMember] - public bool AutoDownload { get; set; } + [DataMember] public bool AutoDownload { get; set; } - [DataMember] - public string TimerInterval { get; set; } + [DataMember] public string TimerInterval { get; set; } - [DataMember] - public bool ForceSize { get; set; } + [DataMember] public bool ForceSize { get; set; } - [DataMember] - public bool ForceRescan { get; set; } + [DataMember] public bool ForceRescan { get; set; } - [DataMember] - public bool CheckDirectoryForFiles { get; set; } + [DataMember] public bool CheckDirectoryForFiles { get; set; } - [DataMember] - public bool DownloadUrlList { get; set; } + [DataMember] public bool DownloadUrlList { get; set; } - [DataMember] - public bool PortableMode { get; set; } + [DataMember] public bool PortableMode { get; set; } - [DataMember] - public bool LoadAllDatabases { get; set; } + [DataMember] public bool LoadAllDatabases { get; set; } - [DataMember] - public string ProxyHost { get; set; } + [DataMember] public string ProxyHost { get; set; } - [DataMember] - public string ProxyPort { get; set; } + [DataMember] public string ProxyPort { get; set; } - [DataMember] - public string ProxyUsername { get; set; } + [DataMember] public string ProxyUsername { get; set; } - [DataMember] - public string ProxyPassword { get; set; } + [DataMember] public string ProxyPassword { get; set; } - [DataMember] - public int SettingsTabIndex { get; set; } + [DataMember] public int SettingsTabIndex { get; set; } - [DataMember] - public Dictionary> ColumnSettings { get; set; } + [DataMember] public Dictionary> ColumnSettings { get; set; } - public ObservableCollection ImageSizes - { - get { return new ObservableCollection(imageSizes); } - } + public ObservableCollection ImageSizes => new ObservableCollection(imageSizes); - public ObservableCollection VideoSizes - { - get { return new ObservableCollection(videoSizes); } - } + public ObservableCollection VideoSizes => new ObservableCollection(videoSizes); - public ObservableCollection BlogTypes - { - get { return new ObservableCollection(blogTypes); } - } + public ObservableCollection BlogTypes => new ObservableCollection(blogTypes); public string[] TumblrHosts { - get { return tumblrHosts; } - set { tumblrHosts = value; } + get => tumblrHosts; + set => tumblrHosts = value; } ExtensionDataObject IExtensibleDataObject.ExtensionData { get; set; } @@ -339,7 +241,8 @@ private void Initialize() OAuthCallbackUrl = @"https://github.com/johanneszab/TumblThree"; ApiKey = "x8pd1InspmnuLSFKT4jNxe8kQUkbRXPNkAffntAFSk01UjRsLV"; SecretKey = "Mul4BviRQgPLuhN1xzEqmXzwvoWicEoc4w6ftWBGWtioEvexmM"; - UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"; + UserAgent = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"; OAuthToken = string.Empty; OAuthTokenSecret = string.Empty; Left = 50; diff --git a/src/TumblThree/TumblThree.Applications/Properties/QueueSettings.cs b/src/TumblThree/TumblThree.Applications/Properties/QueueSettings.cs index 660d057..105cea3 100644 --- a/src/TumblThree/TumblThree.Applications/Properties/QueueSettings.cs +++ b/src/TumblThree/TumblThree.Applications/Properties/QueueSettings.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Runtime.Serialization; using TumblThree.Domain.Models; @@ -21,21 +20,13 @@ public QueueSettings() types = new List(); } - [DataMember] - public string LastCrawledBlogName { get; set; } + [DataMember] public string LastCrawledBlogName { get; set; } - [DataMember] - public BlogTypes LastCrawledBlogType { get; set; } + [DataMember] public BlogTypes LastCrawledBlogType { get; set; } - public IReadOnlyList Names - { - get { return names; } - } + public IReadOnlyList Names => names; - public IReadOnlyList Types - { - get { return types; } - } + public IReadOnlyList Types => types; ExtensionDataObject IExtensibleDataObject.ExtensionData { get; set; } diff --git a/src/TumblThree/TumblThree.Applications/QueueOnDispatcher.cs b/src/TumblThree/TumblThree.Applications/QueueOnDispatcher.cs index 12f9b4f..4717bf5 100644 --- a/src/TumblThree/TumblThree.Applications/QueueOnDispatcher.cs +++ b/src/TumblThree/TumblThree.Applications/QueueOnDispatcher.cs @@ -52,6 +52,7 @@ public static void CheckBeginInvokeOnUI(Action action) { return; } + CheckDispatcher(); if (UIDispatcher.CheckAccess()) { @@ -89,6 +90,7 @@ public static void Initialize() { return; } + UIDispatcher = Dispatcher.CurrentDispatcher; } diff --git a/src/TumblThree/TumblThree.Applications/Services/ApplicationUpdateService.cs b/src/TumblThree/TumblThree.Applications/Services/ApplicationUpdateService.cs index 7f5f92f..2b2b274 100644 --- a/src/TumblThree/TumblThree.Applications/Services/ApplicationUpdateService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/ApplicationUpdateService.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel.Composition; +using System.Net; using System.Runtime.Serialization.Json; using System.Text; using System.Threading.Tasks; @@ -34,10 +35,11 @@ public async Task GetLatestReleaseFromServer() downloadLink = null; try { - var request = webRequestFactory.CreateGetReqeust(@"https://api.github.com/repos/johanneszab/tumblthree/releases/latest"); + HttpWebRequest request = webRequestFactory.CreateGetReqeust( + @"https://api.github.com/repos/johanneszab/tumblthree/releases/latest"); string result = await webRequestFactory.ReadReqestToEnd(request); XmlDictionaryReader jsonReader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(result), - new System.Xml.XmlDictionaryReaderQuotas()); + new XmlDictionaryReaderQuotas()); XElement root = XElement.Load(jsonReader); version = root.Element("tag_name").Value; downloadLink = root.Element("assets").Element("item").Element("browser_download_url").Value; @@ -47,6 +49,7 @@ public async Task GetLatestReleaseFromServer() Logger.Error(exception.ToString()); return exception.Message; } + return null; } @@ -64,6 +67,7 @@ public bool IsNewVersionAvailable() { Logger.Error(exception.ToString()); } + return false; } @@ -78,6 +82,7 @@ public Uri GetDownloadUri() { return null; } + return new Uri(downloadLink); } } diff --git a/src/TumblThree/TumblThree.Applications/Services/BlogService.cs b/src/TumblThree/TumblThree.Applications/Services/BlogService.cs index b866138..8193864 100644 --- a/src/TumblThree/TumblThree.Applications/Services/BlogService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/BlogService.cs @@ -3,7 +3,8 @@ using System.Reflection; using System.Threading; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; +using TumblThree.Domain.Models.Files; namespace TumblThree.Applications.Services { @@ -40,7 +41,6 @@ public void UpdateBlogPostCount(string propertyName) postCounter++; property.SetValue(blog, postCounter, null); } - } public void UpdateBlogDB(string fileName) @@ -65,6 +65,7 @@ public bool CreateDataFolder() Directory.CreateDirectory(blogPath); return true; } + return true; } @@ -77,6 +78,7 @@ public virtual bool CheckIfFileExistsInDB(string url) Monitor.Exit(lockObjectDb); return true; } + Monitor.Exit(lockObjectDb); return false; } @@ -87,6 +89,7 @@ public virtual bool CheckIfBlogShouldCheckDirectory(string url) { return CheckIfFileExistsInDirectory(url); } + return false; } @@ -100,6 +103,7 @@ public virtual bool CheckIfFileExistsInDirectory(string url) Monitor.Exit(lockObjectDirectory); return true; } + Monitor.Exit(lockObjectDirectory); return false; } diff --git a/src/TumblThree/TumblThree.Applications/Services/ConfirmTumblrPrivacyConsent.cs b/src/TumblThree/TumblThree.Applications/Services/ConfirmTumblrPrivacyConsent.cs index 58b9c74..d4aa1e5 100644 --- a/src/TumblThree/TumblThree.Applications/Services/ConfirmTumblrPrivacyConsent.cs +++ b/src/TumblThree/TumblThree.Applications/Services/ConfirmTumblrPrivacyConsent.cs @@ -29,10 +29,12 @@ public async Task ConfirmPrivacyConsent() if (CheckIfLoggedInAsync()) return; await UpdateTumblrKey(); - string referer = @"https://www.tumblr.com/privacy/consent?redirect="; + var referer = @"https://www.tumblr.com/privacy/consent?redirect="; var headers = new Dictionary { { "X-tumblr-form-key", tumblrKey } }; - HttpWebRequest request = webRequestFactory.CreatePostXhrReqeust("https://www.tumblr.com/svc/privacy/consent", referer, headers); - string requestBody = "{\"eu_resident\":true,\"gdpr_is_acceptable_age\":true,\"gdpr_consent_core\":true,\"gdpr_consent_first_party_ads\":true,\"gdpr_consent_third_party_ads\":true,\"gdpr_consent_search_history\":true,\"redirect_to\":\"\"}"; + HttpWebRequest request = + webRequestFactory.CreatePostXhrReqeust("https://www.tumblr.com/svc/privacy/consent", referer, headers); + var requestBody = + "{\"eu_resident\":true,\"gdpr_is_acceptable_age\":true,\"gdpr_consent_core\":true,\"gdpr_consent_first_party_ads\":true,\"gdpr_consent_third_party_ads\":true,\"gdpr_consent_search_history\":true,\"redirect_to\":\"\"}"; request.ContentType = "application/json"; await webRequestFactory.PerformPostXHRReqeust(request, requestBody); using (var response = await request.GetResponseAsync() as HttpWebResponse) @@ -54,7 +56,7 @@ private static string ExtractTumblrKey(string document) private async Task GetRequestAsync() { - string requestUrl = "https://www.tumblr.com/"; + var requestUrl = "https://www.tumblr.com/"; HttpWebRequest request = webRequestFactory.CreateGetReqeust(requestUrl); return await webRequestFactory.ReadReqestToEnd(request); } @@ -67,6 +69,7 @@ public bool CheckIfLoggedInAsync() { return true; } + return false; } } diff --git a/src/TumblThree/TumblThree.Applications/Services/CrawlerService.cs b/src/TumblThree/TumblThree.Applications/Services/CrawlerService.cs index 2bd1e40..4349b99 100644 --- a/src/TumblThree/TumblThree.Applications/Services/CrawlerService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/CrawlerService.cs @@ -1,10 +1,13 @@ -using Guava.RateLimiter; -using System.Collections.ObjectModel; +using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel.Composition; +using System.Threading; using System.Threading.Tasks; using System.Waf.Foundation; using System.Windows.Input; + +using Guava.RateLimiter; + using TumblThree.Domain.Queue; namespace TumblThree.Applications.Services @@ -33,7 +36,7 @@ public class CrawlerService : Model, ICrawlerService private ICommand showFilesCommand; private ICommand stopCommand; private RateLimiter timeconstraint; - private System.Threading.Timer timer; + private Timer timer; [ImportingConstructor] public CrawlerService(IShellService shellService) @@ -60,7 +63,7 @@ public TaskCompletionSource DatabasesLoaded set => SetProperty(ref databasesLoaded, value); } - public System.Threading.Timer Timer + public Timer Timer { get => timer; set => SetProperty(ref timer, value); diff --git a/src/TumblThree/TumblThree.Applications/Services/IConfirmTumblrPrivacyConsent.cs b/src/TumblThree/TumblThree.Applications/Services/IConfirmTumblrPrivacyConsent.cs index ce54799..a78cc69 100644 --- a/src/TumblThree/TumblThree.Applications/Services/IConfirmTumblrPrivacyConsent.cs +++ b/src/TumblThree/TumblThree.Applications/Services/IConfirmTumblrPrivacyConsent.cs @@ -6,4 +6,4 @@ public interface IConfirmTumblrPrivacyConsent { Task ConfirmPrivacyConsent(); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Services/ICrawlerService.cs b/src/TumblThree/TumblThree.Applications/Services/ICrawlerService.cs index c8305d7..1d18b83 100644 --- a/src/TumblThree/TumblThree.Applications/Services/ICrawlerService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/ICrawlerService.cs @@ -1,9 +1,11 @@ -using Guava.RateLimiter; -using System.ComponentModel; +using System.ComponentModel; using System.Threading; using System.Threading.Tasks; using System.Waf.Foundation; using System.Windows.Input; + +using Guava.RateLimiter; + using TumblThree.Domain.Queue; namespace TumblThree.Applications.Services diff --git a/src/TumblThree/TumblThree.Applications/Services/IDetailsService.cs b/src/TumblThree/TumblThree.Applications/Services/IDetailsService.cs index 7b0a7d7..81b12c5 100644 --- a/src/TumblThree/TumblThree.Applications/Services/IDetailsService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/IDetailsService.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Services { diff --git a/src/TumblThree/TumblThree.Applications/Services/IFolderBrowserDialog.cs b/src/TumblThree/TumblThree.Applications/Services/IFolderBrowserDialog.cs index 042b272..6fab734 100644 --- a/src/TumblThree/TumblThree.Applications/Services/IFolderBrowserDialog.cs +++ b/src/TumblThree/TumblThree.Applications/Services/IFolderBrowserDialog.cs @@ -9,7 +9,9 @@ public interface IFolderBrowserDialog Environment.SpecialFolder RootFolder { get; set; } string SelectedPath { get; set; } bool ShowNewFolderButton { get; set; } + bool? ShowDialog(); + bool? ShowDialog(Window owner); } } diff --git a/src/TumblThree/TumblThree.Applications/Services/ILoginService.cs b/src/TumblThree/TumblThree.Applications/Services/ILoginService.cs index b60d7fc..62b7ba1 100644 --- a/src/TumblThree/TumblThree.Applications/Services/ILoginService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/ILoginService.cs @@ -16,4 +16,4 @@ public interface ILoginService Task GetTumblrUsername(); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Services/IManagerService.cs b/src/TumblThree/TumblThree.Applications/Services/IManagerService.cs index 1da6720..3f54810 100644 --- a/src/TumblThree/TumblThree.Applications/Services/IManagerService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/IManagerService.cs @@ -1,7 +1,8 @@ using System.Collections.Generic; using System.Collections.ObjectModel; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; +using TumblThree.Domain.Models.Files; namespace TumblThree.Applications.Services { diff --git a/src/TumblThree/TumblThree.Applications/Services/ISelectionService.cs b/src/TumblThree/TumblThree.Applications/Services/ISelectionService.cs index 21b6dcb..d796578 100644 --- a/src/TumblThree/TumblThree.Applications/Services/ISelectionService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/ISelectionService.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Services { diff --git a/src/TumblThree/TumblThree.Applications/Services/ISettingsService.cs b/src/TumblThree/TumblThree.Applications/Services/ISettingsService.cs index 7d2b30d..ebfbabe 100644 --- a/src/TumblThree/TumblThree.Applications/Services/ISettingsService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/ISettingsService.cs @@ -1,4 +1,4 @@ -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Services { diff --git a/src/TumblThree/TumblThree.Applications/Services/IWebRequestFactory.cs b/src/TumblThree/TumblThree.Applications/Services/IWebRequestFactory.cs index 3319744..86768c6 100644 --- a/src/TumblThree/TumblThree.Applications/Services/IWebRequestFactory.cs +++ b/src/TumblThree/TumblThree.Applications/Services/IWebRequestFactory.cs @@ -27,4 +27,4 @@ public interface IWebRequestFactory string UrlEncode(IDictionary parameters); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Services/LoginService.cs b/src/TumblThree/TumblThree.Applications/Services/LoginService.cs index ecdf5b9..59a5643 100644 --- a/src/TumblThree/TumblThree.Applications/Services/LoginService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/LoginService.cs @@ -51,7 +51,9 @@ public void PerformTumblrLogout() HttpWebRequest request = webRequestFactory.CreateGetReqeust("https://www.tumblr.com/"); cookieService.GetUriCookie(request.CookieContainer, new Uri("https://www.tumblr.com/")); cookieService.RemoveUriCookie(new Uri("https://www.tumblr.com")); - var tosCookie = request.CookieContainer.GetCookies(new Uri("https://www.tumblr.com/"))["pfg"]; // pfg cookie contains ToS/GDPR agreement + Cookie tosCookie = + request.CookieContainer.GetCookies( + new Uri("https://www.tumblr.com/"))["pfg"]; // pfg cookie contains ToS/GDPR agreement var tosCookieCollection = new CookieCollection { tosCookie @@ -82,13 +84,13 @@ private static string ExtractTumblrKey(string document) private async Task RequestTumblrKey() { - string url = "https://www.tumblr.com/login"; + var url = "https://www.tumblr.com/login"; HttpWebRequest request = webRequestFactory.CreateGetReqeust(url); cookieService.GetUriCookie(request.CookieContainer, new Uri("https://www.tumblr.com/")); using (var response = await request.GetResponseAsync().TimeoutAfter(shellService.Settings.TimeOut) as HttpWebResponse) { cookieService.SetUriCookie(response.Cookies); - using (var stream = webRequestFactory.GetStreamForApiRequest(response.GetResponseStream())) + using (Stream stream = webRequestFactory.GetStreamForApiRequest(response.GetResponseStream())) { using (var buffer = new BufferedStream(stream)) { @@ -103,8 +105,8 @@ private async Task RequestTumblrKey() private async Task Register(string login, string password) { - string url = "https://www.tumblr.com/svc/account/register"; - string referer = "https://www.tumblr.com/login"; + var url = "https://www.tumblr.com/svc/account/register"; + var referer = "https://www.tumblr.com/login"; var headers = new Dictionary(); HttpWebRequest request = webRequestFactory.CreatePostXhrReqeust(url, referer, headers); cookieService.GetUriCookie(request.CookieContainer, new Uri("https://www.tumblr.com/")); @@ -125,7 +127,10 @@ private async Task Register(string login, string password) { "about_tumblr_slide", "" }, { "tracking_url", "/login" }, { "tracking_version", "modal" }, - { "random_username_suggestions", "[\"KawaiiBouquetStranger\",\"KeenTravelerFury\",\"RainyMakerTastemaker\",\"SuperbEnthusiastCollective\",\"TeenageYouthFestival\"]" }, + { + "random_username_suggestions", + "[\"KawaiiBouquetStranger\",\"KeenTravelerFury\",\"RainyMakerTastemaker\",\"SuperbEnthusiastCollective\",\"TeenageYouthFestival\"]" + }, { "action", "signup_determine" }, }; await webRequestFactory.PerformPostReqeust(request, parameters); @@ -137,8 +142,8 @@ private async Task Register(string login, string password) private async Task Authenticate(string login, string password) { - string url = "https://www.tumblr.com/login"; - string referer = "https://www.tumblr.com/login"; + var url = "https://www.tumblr.com/login"; + var referer = "https://www.tumblr.com/login"; var headers = new Dictionary(); HttpWebRequest request = webRequestFactory.CreatePostReqeust(url, referer, headers); cookieService.GetUriCookie(request.CookieContainer, new Uri("https://www.tumblr.com/")); @@ -157,7 +162,10 @@ private async Task Authenticate(string login, string password) { "used_suggestion", "0" }, { "used_auto_suggestion", "0" }, { "about_tumblr_slide", "" }, - { "random_username_suggestions", "[\"KawaiiBouquetStranger\",\"KeenTravelerFury\",\"RainyMakerTastemaker\",\"SuperbEnthusiastCollective\",\"TeenageYouthFestival\"]" }, + { + "random_username_suggestions", + "[\"KawaiiBouquetStranger\",\"KeenTravelerFury\",\"RainyMakerTastemaker\",\"SuperbEnthusiastCollective\",\"TeenageYouthFestival\"]" + }, { "action", "signup_determine" } }; await webRequestFactory.PerformPostReqeust(request, parameters); @@ -178,6 +186,7 @@ private async Task Authenticate(string login, string password) } } } + cookieService.SetUriCookie(request.CookieContainer.GetCookies(new Uri("https://www.tumblr.com/"))); return string.Empty; } @@ -190,8 +199,8 @@ private static string ExtractTumblrTFAKey(string document) private async Task SubmitTFAAuthCode(string login, string tumblrTFAAuthCode) { - string url = "https://www.tumblr.com/login"; - string referer = "https://www.tumblr.com/login"; + var url = "https://www.tumblr.com/login"; + var referer = "https://www.tumblr.com/login"; var headers = new Dictionary(); HttpWebRequest request = webRequestFactory.CreatePostReqeust(url, referer, headers); cookieService.GetUriCookie(request.CookieContainer, new Uri("https://www.tumblr.com/")); @@ -212,7 +221,10 @@ private async Task SubmitTFAAuthCode(string login, string tumblrTFAAuthCode) { "used_suggestion", "0" }, { "used_auto_suggestion", "0" }, { "about_tumblr_slide", "" }, - { "random_username_suggestions", "[\"KawaiiBouquetStranger\",\"KeenTravelerFury\",\"RainyMakerTastemaker\",\"SuperbEnthusiastCollective\",\"TeenageYouthFestival\"]" }, + { + "random_username_suggestions", + "[\"KawaiiBouquetStranger\",\"KeenTravelerFury\",\"RainyMakerTastemaker\",\"SuperbEnthusiastCollective\",\"TeenageYouthFestival\"]" + }, { "action", "signup_determine" } }; await webRequestFactory.PerformPostReqeust(request, parameters); @@ -226,16 +238,18 @@ public bool CheckIfLoggedInAsync() { HttpWebRequest request = webRequestFactory.CreateGetReqeust("https://www.tumblr.com/"); cookieService.GetUriCookie(request.CookieContainer, new Uri("https://www.tumblr.com/")); - if (request.CookieContainer.GetCookieHeader(new Uri("https://www.tumblr.com/")).Contains("pfs")) // pfs cookie created after successful login + if (request.CookieContainer.GetCookieHeader(new Uri("https://www.tumblr.com/")).Contains("pfs") + ) // pfs cookie created after successful login { return true; } + return false; } public async Task GetTumblrUsername() { - string tumblrAccountSettingsUrl = "https://www.tumblr.com/settings/account"; + var tumblrAccountSettingsUrl = "https://www.tumblr.com/settings/account"; HttpWebRequest request = webRequestFactory.CreateGetReqeust(tumblrAccountSettingsUrl); cookieService.GetUriCookie(request.CookieContainer, new Uri("https://www.tumblr.com/")); string document = await webRequestFactory.ReadReqestToEnd(request); diff --git a/src/TumblThree/TumblThree.Applications/Services/ManagerService.cs b/src/TumblThree/TumblThree.Applications/Services/ManagerService.cs index 535ea7e..e133689 100644 --- a/src/TumblThree/TumblThree.Applications/Services/ManagerService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/ManagerService.cs @@ -3,14 +3,14 @@ using System.ComponentModel.Composition; using System.Waf.Foundation; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; +using TumblThree.Domain.Models.Files; namespace TumblThree.Applications.Services { [Export, Export(typeof(IManagerService))] internal class ManagerService : Model, IManagerService { - private readonly ObservableCollection blogFiles; private readonly IList databases; private readonly object checkFilesLock = new object(); private readonly object databasesLock = new object(); @@ -18,11 +18,11 @@ internal class ManagerService : Model, IManagerService [ImportingConstructor] public ManagerService() { - blogFiles = new ObservableCollection(); + BlogFiles = new ObservableCollection(); databases = new List(); } - public ObservableCollection BlogFiles => blogFiles; + public ObservableCollection BlogFiles { get; } public IEnumerable Databases => databases; @@ -35,6 +35,7 @@ public bool CheckIfFileExistsInDB(string url) if (db.CheckIfFileExistsInDB(url)) return true; } + return false; } } diff --git a/src/TumblThree/TumblThree.Applications/Services/SelectionService.cs b/src/TumblThree/TumblThree.Applications/Services/SelectionService.cs index 3308bd8..8ae076f 100644 --- a/src/TumblThree/TumblThree.Applications/Services/SelectionService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/SelectionService.cs @@ -3,7 +3,7 @@ using System.Waf.Foundation; using TumblThree.Applications.ObjectModel; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Services { diff --git a/src/TumblThree/TumblThree.Applications/Services/SettingsProvider.cs b/src/TumblThree/TumblThree.Applications/Services/SettingsProvider.cs index dcbb697..aabccaa 100644 --- a/src/TumblThree/TumblThree.Applications/Services/SettingsProvider.cs +++ b/src/TumblThree/TumblThree.Applications/Services/SettingsProvider.cs @@ -3,6 +3,7 @@ using System.IO; using System.Runtime.Serialization.Json; using System.Text; +using System.Xml; namespace TumblThree.Applications.Services { @@ -17,6 +18,7 @@ internal class SettingsProvider : ISettingsProvider { throw new ArgumentException("String must not be null or empty.", nameof(fileName)); } + if (!Path.IsPathRooted(fileName)) { throw new ArgumentException("Invalid path. The path must be rooted.", nameof(fileName)); @@ -30,6 +32,7 @@ internal class SettingsProvider : ISettingsProvider return (T)serializer.ReadObject(stream) ?? new T(); } } + return new T(); } @@ -39,10 +42,12 @@ public void SaveSettings(string fileName, object settings) { throw new ArgumentNullException(nameof(settings)); } + if (string.IsNullOrEmpty(fileName)) { throw new ArgumentException("String must not be null or empty.", nameof(fileName)); } + if (!Path.IsPathRooted(fileName)) { throw new ArgumentException("Invalid path. The path must be rooted.", nameof(fileName)); @@ -53,9 +58,10 @@ public void SaveSettings(string fileName, object settings) { Directory.CreateDirectory(directory); } + using (var stream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { - using (var writer = JsonReaderWriterFactory.CreateJsonWriter( + using (XmlDictionaryWriter writer = JsonReaderWriterFactory.CreateJsonWriter( stream, Encoding.UTF8, true, true, " ")) { var serializer = new DataContractJsonSerializer(settings.GetType(), knownTypes); diff --git a/src/TumblThree/TumblThree.Applications/Services/SettingsService.cs b/src/TumblThree/TumblThree.Applications/Services/SettingsService.cs index dc0ab4a..daff4b4 100644 --- a/src/TumblThree/TumblThree.Applications/Services/SettingsService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/SettingsService.cs @@ -1,5 +1,6 @@ using System.ComponentModel.Composition; -using TumblThree.Domain.Models; + +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Services { diff --git a/src/TumblThree/TumblThree.Applications/Services/SharedCookieService.cs b/src/TumblThree/TumblThree.Applications/Services/SharedCookieService.cs index 3e9bb82..a40a42f 100644 --- a/src/TumblThree/TumblThree.Applications/Services/SharedCookieService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/SharedCookieService.cs @@ -30,7 +30,7 @@ public void SetUriCookie(IEnumerable cookies) public void RemoveUriCookie(Uri uri) { - var cookies = cookieContainer.GetCookies(uri); + CookieCollection cookies = cookieContainer.GetCookies(uri); foreach (Cookie cookie in cookies) { cookie.Expired = true; @@ -39,11 +39,15 @@ public void RemoveUriCookie(Uri uri) public IEnumerable GetAllCookies() { - Hashtable k = (Hashtable)cookieContainer.GetType().GetField("m_domainTable", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(cookieContainer); + var k = (Hashtable)cookieContainer + .GetType().GetField("m_domainTable", BindingFlags.Instance | BindingFlags.NonPublic) + .GetValue(cookieContainer); foreach (DictionaryEntry element in k) { - SortedList l = (SortedList)element.Value.GetType().GetField("m_list", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(element.Value); - foreach (var e in l) + var l = (SortedList)element.Value.GetType() + .GetField("m_list", BindingFlags.Instance | BindingFlags.NonPublic) + .GetValue(element.Value); + foreach (object e in l) { var cl = (CookieCollection)((DictionaryEntry)e).Value; foreach (Cookie fc in cl) diff --git a/src/TumblThree/TumblThree.Applications/Services/ShellService.cs b/src/TumblThree/TumblThree.Applications/Services/ShellService.cs index 938aee1..27ba55a 100644 --- a/src/TumblThree/TumblThree.Applications/Services/ShellService.cs +++ b/src/TumblThree/TumblThree.Applications/Services/ShellService.cs @@ -102,7 +102,7 @@ public event CancelEventHandler Closing closing += value; InitializeClosingEvent(); } - remove { closing -= value; } + remove => closing -= value; } public void ShowError(Exception exception, string displayMessage) diff --git a/src/TumblThree/TumblThree.Applications/Services/WebRequestFactory.cs b/src/TumblThree/TumblThree.Applications/Services/WebRequestFactory.cs index 40b37b7..38b5df6 100644 --- a/src/TumblThree/TumblThree.Applications/Services/WebRequestFactory.cs +++ b/src/TumblThree/TumblThree.Applications/Services/WebRequestFactory.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using System.Web; + using TumblThree.Applications.Extensions; using TumblThree.Applications.Properties; @@ -55,6 +56,7 @@ private HttpWebRequest CreateStubReqeust(string url, string referer = "", Dictio { request.Headers[header.Key] = header.Value; } + return request; } @@ -125,7 +127,7 @@ public async Task ReadReqestToEnd(HttpWebRequest request) { using (var response = await request.GetResponseAsync().TimeoutAfter(shellService.Settings.TimeOut) as HttpWebResponse) { - using (var stream = GetStreamForApiRequest(response.GetResponseStream())) + using (Stream stream = GetStreamForApiRequest(response.GetResponseStream())) { using (var buffer = new BufferedStream(stream)) { @@ -143,7 +145,6 @@ public Stream GetStreamForApiRequest(Stream stream) if (!settings.LimitScanBandwidth || settings.Bandwidth == 0) return stream; return new ThrottledStream(stream, (settings.Bandwidth / settings.ConcurrentConnections) * 1024); - } public string UrlEncode(IDictionary parameters) @@ -153,6 +154,7 @@ public string UrlEncode(IDictionary parameters) { sb.AppendFormat("{0}={1}&", val.Key, HttpUtility.UrlEncode(val.Value)); } + sb.Remove(sb.Length - 1, 1); // remove last '&' return sb.ToString(); } @@ -163,11 +165,13 @@ private static HttpWebRequest SetWebRequestProxy(HttpWebRequest request, AppSett { request.Proxy = new WebProxy(settings.ProxyHost, int.Parse(settings.ProxyPort)); } + if (!string.IsNullOrEmpty(settings.ProxyUsername) && !string.IsNullOrEmpty(settings.ProxyPassword)) { request.Proxy.Credentials = new NetworkCredential(settings.ProxyUsername, settings.ProxyPassword); } + return request; } } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Applications/Services/WindowsFormsFolderBrowserDialog.cs b/src/TumblThree/TumblThree.Applications/Services/WindowsFormsFolderBrowserDialog.cs index a04c3ca..b9e0a3c 100644 --- a/src/TumblThree/TumblThree.Applications/Services/WindowsFormsFolderBrowserDialog.cs +++ b/src/TumblThree/TumblThree.Applications/Services/WindowsFormsFolderBrowserDialog.cs @@ -4,6 +4,8 @@ using System.Windows.Forms; using System.Windows.Interop; +using IWin32Window = System.Windows.Forms.IWin32Window; + namespace TumblThree.Applications.Services { [Export(typeof(IFolderBrowserDialog))] @@ -16,7 +18,7 @@ internal class WindowsFormsFolderBrowserDialog : IFolderBrowserDialog [ImportingConstructor] public WindowsFormsFolderBrowserDialog() { - RootFolder = System.Environment.SpecialFolder.MyComputer; + RootFolder = Environment.SpecialFolder.MyComputer; ShowNewFolderButton = false; } @@ -28,7 +30,7 @@ public string Description set => description = value; } - public System.Environment.SpecialFolder RootFolder { get; set; } + public Environment.SpecialFolder RootFolder { get; set; } public string SelectedPath { @@ -40,9 +42,9 @@ public string SelectedPath public bool? ShowDialog() { - using (var dialog = CreateDialog()) + using (FolderBrowserDialog dialog = CreateDialog()) { - var result = dialog.ShowDialog() == DialogResult.OK; + bool result = dialog.ShowDialog() == DialogResult.OK; if (result) SelectedPath = dialog.SelectedPath; return result; } @@ -50,13 +52,14 @@ public string SelectedPath public bool? ShowDialog(Window owner) { - using (var dialog = CreateDialog()) + using (FolderBrowserDialog dialog = CreateDialog()) { - var result = dialog.ShowDialog(owner.AsWin32Window()) == DialogResult.OK; + bool result = dialog.ShowDialog(owner.AsWin32Window()) == DialogResult.OK; if (result) SelectedPath = dialog.SelectedPath; return result; } } + #endregion private FolderBrowserDialog CreateDialog() @@ -74,13 +77,13 @@ private FolderBrowserDialog CreateDialog() internal static class WindowExtensions { - public static System.Windows.Forms.IWin32Window AsWin32Window(this Window window) + public static IWin32Window AsWin32Window(this Window window) { return new Wpf32Window(window); } } - internal class Wpf32Window : System.Windows.Forms.IWin32Window + internal class Wpf32Window : IWin32Window { public Wpf32Window(Window window) { diff --git a/src/TumblThree/TumblThree.Applications/ThrottledStream.cs b/src/TumblThree/TumblThree.Applications/ThrottledStream.cs index f27b9b3..cf37882 100644 --- a/src/TumblThree/TumblThree.Applications/ThrottledStream.cs +++ b/src/TumblThree/TumblThree.Applications/ThrottledStream.cs @@ -6,12 +6,14 @@ using TumblThree.Applications.Properties; +using Timer = System.Timers.Timer; + namespace TumblThree.Applications { public class ThrottledStream : Stream { private readonly Stream parent; - private readonly System.Timers.Timer resettimer; + private readonly Timer resettimer; private readonly AutoResetEvent wh = new AutoResetEvent(true); private long maxBytesPerSecond; private static long processed; @@ -26,7 +28,7 @@ public ThrottledStream(Stream parentStream, long maxBytesPerSecond = long.MaxVal MaxBytesPerSecond = maxBytesPerSecond; parent = parentStream; processed = 0; - resettimer = new System.Timers.Timer + resettimer = new Timer { Interval = 1000 }; diff --git a/src/TumblThree/TumblThree.Applications/TumblThree.Applications.csproj b/src/TumblThree/TumblThree.Applications/TumblThree.Applications.csproj index ef69485..8fc04b7 100644 --- a/src/TumblThree/TumblThree.Applications/TumblThree.Applications.csproj +++ b/src/TumblThree/TumblThree.Applications/TumblThree.Applications.csproj @@ -52,7 +52,6 @@ - @@ -70,10 +69,13 @@ - - + + + + + @@ -81,61 +83,61 @@ - + + + + + + - + + + + - - + + + + - - - - - - + + - + + + + + - + - + - - - - - - - - - - @@ -177,7 +179,6 @@ - @@ -187,7 +188,7 @@ - + @@ -202,8 +203,6 @@ - - @@ -222,14 +221,19 @@ PublicResXFileCodeGenerator Resources.Designer.cs + Designer + + + Designer - - + + Designer + diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsAllViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsAllViewModel.cs index 4cbba3a..12a319a 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsAllViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsAllViewModel.cs @@ -1,12 +1,13 @@ using System.ComponentModel.Composition; using System.Waf.Applications; +using System.Windows.Forms; using System.Windows.Input; using TumblThree.Applications.Services; using TumblThree.Applications.Views; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; -namespace TumblThree.Applications.ViewModels +namespace TumblThree.Applications.ViewModels.DetailsViewModels { [Export(typeof(IDetailsViewModel))] [ExportMetadata("BlogType", typeof(Blog))] @@ -20,7 +21,8 @@ public class DetailsAllViewModel : ViewModel, IDetailsViewModel private int count = 0; [ImportingConstructor] - public DetailsAllViewModel([Import("AllView", typeof(IDetailsView))]IDetailsView view, + public DetailsAllViewModel([Import("AllView", typeof(IDetailsView))] + IDetailsView view, IClipboardService clipboardService) : base(view) { this.clipboardService = clipboardService; @@ -54,8 +56,8 @@ private void CopyUrlToClipboard() private void BrowseFileDownloadLocation() { - var dialog = new System.Windows.Forms.FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; - if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + var dialog = new FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; + if (dialog.ShowDialog() == DialogResult.OK) { BlogFile.FileDownloadLocation = dialog.SelectedPath; } diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrBlogViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrBlogViewModel.cs index f600a2e..2b06d86 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrBlogViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrBlogViewModel.cs @@ -1,12 +1,13 @@ using System.ComponentModel.Composition; using System.Waf.Applications; +using System.Windows.Forms; using System.Windows.Input; using TumblThree.Applications.Services; using TumblThree.Applications.Views; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; -namespace TumblThree.Applications.ViewModels +namespace TumblThree.Applications.ViewModels.DetailsViewModels { [Export(typeof(IDetailsViewModel))] [ExportMetadata("BlogType", typeof(TumblrBlog))] @@ -20,7 +21,8 @@ public class DetailsTumblrBlogViewModel : ViewModel, IDetailsViewM private int count = 0; [ImportingConstructor] - public DetailsTumblrBlogViewModel([Import("TumblrBlogView", typeof(IDetailsView))]IDetailsView view, + public DetailsTumblrBlogViewModel([Import("TumblrBlogView", typeof(IDetailsView))] + IDetailsView view, IClipboardService clipboardService) : base(view) { this.clipboardService = clipboardService; @@ -51,10 +53,11 @@ private void CopyUrlToClipboard() clipboardService.SetText(BlogFile.Url); } } + private void BrowseFileDownloadLocation() { - var dialog = new System.Windows.Forms.FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; - if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + var dialog = new FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; + if (dialog.ShowDialog() == DialogResult.OK) { BlogFile.FileDownloadLocation = dialog.SelectedPath; } diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrHiddenBlogViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrHiddenBlogViewModel.cs index e42add7..91932c1 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrHiddenBlogViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrHiddenBlogViewModel.cs @@ -1,12 +1,13 @@ using System.ComponentModel.Composition; using System.Waf.Applications; +using System.Windows.Forms; using System.Windows.Input; using TumblThree.Applications.Services; using TumblThree.Applications.Views; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; -namespace TumblThree.Applications.ViewModels +namespace TumblThree.Applications.ViewModels.DetailsViewModels { [Export(typeof(IDetailsViewModel))] [ExportMetadata("BlogType", typeof(TumblrHiddenBlog))] @@ -20,7 +21,8 @@ public class DetailsTumblrHiddenBlogViewModel : ViewModel, IDetail private int count = 0; [ImportingConstructor] - public DetailsTumblrHiddenBlogViewModel([Import("TumblrHiddenBlogView", typeof(IDetailsView))]IDetailsView view, + public DetailsTumblrHiddenBlogViewModel([Import("TumblrHiddenBlogView", typeof(IDetailsView))] + IDetailsView view, IClipboardService clipboardService) : base(view) { this.clipboardService = clipboardService; @@ -54,8 +56,8 @@ private void CopyUrlToClipboard() private void BrowseFileDownloadLocation() { - var dialog = new System.Windows.Forms.FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; - if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + var dialog = new FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; + if (dialog.ShowDialog() == DialogResult.OK) { BlogFile.FileDownloadLocation = dialog.SelectedPath; } diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrLikedByViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrLikedByViewModel.cs index 7bfbd5f..0611c5d 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrLikedByViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrLikedByViewModel.cs @@ -1,12 +1,13 @@ using System.ComponentModel.Composition; using System.Waf.Applications; +using System.Windows.Forms; using System.Windows.Input; using TumblThree.Applications.Services; using TumblThree.Applications.Views; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; -namespace TumblThree.Applications.ViewModels +namespace TumblThree.Applications.ViewModels.DetailsViewModels { [Export(typeof(IDetailsViewModel))] [ExportMetadata("BlogType", typeof(TumblrLikedByBlog))] @@ -20,7 +21,8 @@ public class DetailsTumblrLikedByViewModel : ViewModel, IDetailsVi private int count = 0; [ImportingConstructor] - public DetailsTumblrLikedByViewModel([Import("TumblrLikedByView", typeof(IDetailsView))]IDetailsView view, + public DetailsTumblrLikedByViewModel([Import("TumblrLikedByView", typeof(IDetailsView))] + IDetailsView view, IClipboardService clipboardService) : base(view) { this.clipboardService = clipboardService; @@ -54,8 +56,8 @@ private void CopyUrlToClipboard() private void BrowseFileDownloadLocation() { - var dialog = new System.Windows.Forms.FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; - if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + var dialog = new FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; + if (dialog.ShowDialog() == DialogResult.OK) { BlogFile.FileDownloadLocation = dialog.SelectedPath; } diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrSearchViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrSearchViewModel.cs index d9b02c7..5dc2cb3 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrSearchViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrSearchViewModel.cs @@ -1,12 +1,13 @@ using System.ComponentModel.Composition; using System.Waf.Applications; +using System.Windows.Forms; using System.Windows.Input; using TumblThree.Applications.Services; using TumblThree.Applications.Views; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; -namespace TumblThree.Applications.ViewModels +namespace TumblThree.Applications.ViewModels.DetailsViewModels { [Export(typeof(IDetailsViewModel))] [ExportMetadata("BlogType", typeof(TumblrSearchBlog))] @@ -20,7 +21,8 @@ public class DetailsTumblrSearchViewModel : ViewModel, IDetailsVie private int count = 0; [ImportingConstructor] - public DetailsTumblrSearchViewModel([Import("TumblrSearchView", typeof(IDetailsView))]IDetailsView view, + public DetailsTumblrSearchViewModel([Import("TumblrSearchView", typeof(IDetailsView))] + IDetailsView view, IClipboardService clipboardService) : base(view) { this.clipboardService = clipboardService; @@ -54,8 +56,8 @@ private void CopyUrlToClipboard() private void BrowseFileDownloadLocation() { - var dialog = new System.Windows.Forms.FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; - if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + var dialog = new FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; + if (dialog.ShowDialog() == DialogResult.OK) { BlogFile.FileDownloadLocation = dialog.SelectedPath; } diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrTagSearchViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrTagSearchViewModel.cs index ad44d87..5e167cb 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrTagSearchViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/DetailsViewModels/DetailsTumblrTagSearchViewModel.cs @@ -1,12 +1,13 @@ using System.ComponentModel.Composition; using System.Waf.Applications; +using System.Windows.Forms; using System.Windows.Input; using TumblThree.Applications.Services; using TumblThree.Applications.Views; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; -namespace TumblThree.Applications.ViewModels +namespace TumblThree.Applications.ViewModels.DetailsViewModels { [Export(typeof(IDetailsViewModel))] [ExportMetadata("BlogType", typeof(TumblrTagSearchBlog))] @@ -20,7 +21,8 @@ public class DetailsTumblrTagSearchViewModel : ViewModel, IDetails private int count = 0; [ImportingConstructor] - public DetailsTumblrTagSearchViewModel([Import("TumblrTagSearchView", typeof(IDetailsView))]IDetailsView view, + public DetailsTumblrTagSearchViewModel([Import("TumblrTagSearchView", typeof(IDetailsView))] + IDetailsView view, IClipboardService clipboardService) : base(view) { this.clipboardService = clipboardService; @@ -54,8 +56,8 @@ private void CopyUrlToClipboard() private void BrowseFileDownloadLocation() { - var dialog = new System.Windows.Forms.FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; - if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + var dialog = new FolderBrowserDialog { SelectedPath = BlogFile.FileDownloadLocation }; + if (dialog.ShowDialog() == DialogResult.OK) { BlogFile.FileDownloadLocation = dialog.SelectedPath; } diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/FullScreenMediaViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/FullScreenMediaViewModel.cs index 78b8e3a..2e1675d 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/FullScreenMediaViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/FullScreenMediaViewModel.cs @@ -1,10 +1,8 @@ using System.ComponentModel.Composition; - using System.Waf.Applications; using TumblThree.Applications.Views; - namespace TumblThree.Applications.ViewModels { [Export] diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/ManagerViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/ManagerViewModel.cs index 36a1e8c..1fe1a5d 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/ManagerViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/ManagerViewModel.cs @@ -9,7 +9,7 @@ using TumblThree.Applications.Services; using TumblThree.Applications.Views; using TumblThree.Domain; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Domain.Queue; namespace TumblThree.Applications.ViewModels diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/QueueViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/QueueViewModel.cs index 7381393..a5328c5 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/QueueViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/QueueViewModel.cs @@ -7,7 +7,7 @@ using TumblThree.Applications.Services; using TumblThree.Applications.Views; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Domain.Queue; namespace TumblThree.Applications.ViewModels @@ -25,7 +25,6 @@ public class QueueViewModel : ViewModel private QueueListItem selectedQueueItem; private readonly ObservableCollection selectedQueueItems; - [ImportingConstructor] public QueueViewModel(IQueueView view, ICrawlerService crawlerService) : base(view) { diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/SettingsViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/SettingsViewModel.cs index 03d9b05..9c332f1 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/SettingsViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/SettingsViewModel.cs @@ -3,11 +3,13 @@ using System.ComponentModel.Composition; using System.IO; using System.Linq; +using System.Net; using System.Threading; using System.Threading.Tasks; using System.Waf.Applications; using System.Waf.Applications.Services; using System.Windows.Input; + using TumblThree.Applications.Data; using TumblThree.Applications.Properties; using TumblThree.Applications.Services; @@ -121,7 +123,8 @@ public class SettingsViewModel : ViewModel [ImportingConstructor] public SettingsViewModel(ISettingsView view, IShellService shellService, ICrawlerService crawlerService, - IManagerService managerService, ILoginService loginService, IFolderBrowserDialog folderBrowserDialog, IFileDialogService fileDialogService, + IManagerService managerService, ILoginService loginService, IFolderBrowserDialog folderBrowserDialog, + IFileDialogService fileDialogService, ExportFactory authenticateViewModelFactory) : base(view) { @@ -694,6 +697,7 @@ private void EnableAutoDownload() // time already passed timeToGo = timeToGo.Add(new TimeSpan(24, 00, 00)); } + CrawlerService.Timer = new Timer(x => { OnTimedEvent(); }, null, timeToGo, Timeout.InfiniteTimeSpan); CrawlerService.IsTimerSet = true; @@ -722,6 +726,7 @@ private void OnTimedEvent() { QueueOnDispatcher.CheckBeginInvokeOnUI(() => CrawlerService.AutoDownloadCommand.Execute(null)); } + CrawlerService.Timer.Change(new TimeSpan(24, 00, 00), Timeout.InfiniteTimeSpan); } @@ -735,7 +740,8 @@ private void BrowseDownloadLocation() private void BrowseExportLocation() { - FileDialogResult result = fileDialogService.ShowSaveFileDialog(ShellService.ShellView, bloglistExportFileType, ExportLocation); + FileDialogResult result = + fileDialogService.ShowSaveFileDialog(ShellService.ShellView, bloglistExportFileType, ExportLocation); if (!result.IsValid) { return; @@ -755,7 +761,7 @@ private void Authenticate() authenticateViewModel.AddUrl(url); authenticateViewModel.ShowDialog(ShellService.ShellView); } - catch (System.Net.WebException ex) + catch (WebException ex) { Logger.Error("SettingsViewModel:Authenticate: {0}", ex); ShellService.ShowError(ex, Resources.AuthenticationFailure, ex.Message); @@ -801,10 +807,7 @@ private async Task TumblrSubmitTFA() private async Task UpdateTumblrLogin() { TumblrEmail = await LoginService.GetTumblrUsername(); - if (!string.IsNullOrEmpty(TumblrEmail)) - TumblrLoggedIn = true; - else - TumblrLoggedIn = false; + TumblrLoggedIn = !string.IsNullOrEmpty(TumblrEmail); } private void CheckIfTumblrLoggedIn() @@ -976,7 +979,8 @@ private void LoadSettings() ProxyPort = string.Empty; TimerInterval = "22:40:00"; SettingsTabIndex = 0; - UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"; + UserAgent = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"; } } diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/ShellViewModel.cs b/src/TumblThree/TumblThree.Applications/ViewModels/ShellViewModel.cs index 0d7ca12..60af04f 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/ShellViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/ViewModels/ShellViewModel.cs @@ -62,6 +62,7 @@ public ShellViewModel(IShellView view, IShellService shellService, ICrawlerServi view.Width = settings.Width; view.GridSplitterPosition = settings.GridSplitterPosition; } + view.IsMaximized = settings.IsMaximized; } diff --git a/src/TumblThree/TumblThree.Applications/ViewModels/IDetailsViewModel.cs b/src/TumblThree/TumblThree.Applications/Views/IDetailsViewModel.cs similarity index 82% rename from src/TumblThree/TumblThree.Applications/ViewModels/IDetailsViewModel.cs rename to src/TumblThree/TumblThree.Applications/Views/IDetailsViewModel.cs index 079583d..29fb737 100644 --- a/src/TumblThree/TumblThree.Applications/ViewModels/IDetailsViewModel.cs +++ b/src/TumblThree/TumblThree.Applications/Views/IDetailsViewModel.cs @@ -1,4 +1,4 @@ -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Applications.Views { diff --git a/src/TumblThree/TumblThree.Domain/App.config b/src/TumblThree/TumblThree.Domain/App.config index 577dda5..fda0493 100644 --- a/src/TumblThree/TumblThree.Domain/App.config +++ b/src/TumblThree/TumblThree.Domain/App.config @@ -1,15 +1,16 @@ - + - + - - + + - + \ No newline at end of file diff --git a/src/TumblThree/TumblThree.Domain/Attributes/LocalizedDescriptionAttribute.cs b/src/TumblThree/TumblThree.Domain/Attributes/LocalizedDescriptionAttribute.cs index 68ef780..b4cc5c0 100644 --- a/src/TumblThree/TumblThree.Domain/Attributes/LocalizedDescriptionAttribute.cs +++ b/src/TumblThree/TumblThree.Domain/Attributes/LocalizedDescriptionAttribute.cs @@ -2,12 +2,11 @@ using System.ComponentModel; using System.Resources; - namespace TumblThree.Domain.Attributes { public class LocalizedDescriptionAttribute : DescriptionAttribute { - private ResourceManager resourceManager; + private readonly ResourceManager resourceManager; private readonly string resourceKey; public LocalizedDescriptionAttribute(string resourceKey, Type resourceType) @@ -21,7 +20,7 @@ public override string Description get { string description = resourceManager.GetString(resourceKey); - return string.IsNullOrWhiteSpace(description) ? string.Format("[[{0}]]", resourceKey) : description; + return string.IsNullOrWhiteSpace(description) ? $"[[{resourceKey}]]" : description; } } } diff --git a/src/TumblThree/TumblThree.Domain/Converter/EnumDescriptionTypeConverter.cs b/src/TumblThree/TumblThree.Domain/Converter/EnumDescriptionTypeConverter.cs index c2e9650..0c92bb2 100644 --- a/src/TumblThree/TumblThree.Domain/Converter/EnumDescriptionTypeConverter.cs +++ b/src/TumblThree/TumblThree.Domain/Converter/EnumDescriptionTypeConverter.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using System.Globalization; using System.Reflection; namespace TumblThree.Domain.Converter @@ -11,7 +12,7 @@ public EnumDescriptionTypeConverter(Type type) { } - public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(string)) { @@ -21,7 +22,9 @@ public override object ConvertTo(ITypeDescriptorContext context, System.Globaliz if (fi != null) { var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); - return ((attributes.Length > 0) && (!string.IsNullOrEmpty(attributes[0].Description))) ? attributes[0].Description : value.ToString(); + return ((attributes.Length > 0) && (!string.IsNullOrEmpty(attributes[0].Description))) + ? attributes[0].Description + : value.ToString(); } } diff --git a/src/TumblThree/TumblThree.Domain/Models/BlogFactory.cs b/src/TumblThree/TumblThree.Domain/Models/BlogFactory.cs index 1636773..86ae88e 100644 --- a/src/TumblThree/TumblThree.Domain/Models/BlogFactory.cs +++ b/src/TumblThree/TumblThree.Domain/Models/BlogFactory.cs @@ -1,12 +1,14 @@ using System; using System.ComponentModel.Composition; +using TumblThree.Domain.Models.Blogs; + namespace TumblThree.Domain.Models { [Export(typeof(IBlogFactory))] public class BlogFactory : IBlogFactory { - private IUrlValidator urlValidator; + private readonly IUrlValidator urlValidator; [ImportingConstructor] internal BlogFactory(IUrlValidator urlValidator) @@ -18,10 +20,10 @@ public bool IsValidTumblrBlogUrl(string blogUrl) { blogUrl = urlValidator.AddHttpsProtocol(blogUrl); return urlValidator.IsValidTumblrUrl(blogUrl) - || urlValidator.IsValidTumblrHiddenUrl(blogUrl) - || urlValidator.IsValidTumblrLikedByUrl(blogUrl) - || urlValidator.IsValidTumblrSearchUrl(blogUrl) - || urlValidator.IsValidTumblrTagSearchUrl(blogUrl); + || urlValidator.IsValidTumblrHiddenUrl(blogUrl) + || urlValidator.IsValidTumblrLikedByUrl(blogUrl) + || urlValidator.IsValidTumblrSearchUrl(blogUrl) + || urlValidator.IsValidTumblrTagSearchUrl(blogUrl); } public IBlog GetBlog(string blogUrl, string path) diff --git a/src/TumblThree/TumblThree.Domain/Models/Blogs/Blog.cs b/src/TumblThree/TumblThree.Domain/Models/Blogs/Blog.cs index 7a45819..7e85d2c 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Blogs/Blog.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Blogs/Blog.cs @@ -10,7 +10,7 @@ using System.Waf.Foundation; using System.Xml; -namespace TumblThree.Domain.Models +namespace TumblThree.Domain.Models.Blogs { [DataContract] public class Blog : Model, IBlog @@ -92,8 +92,10 @@ public class Blog : Model, IBlog private int settingsTabIndex; private int progress; private int quotes; + [DataMember(Name = "Links")] private readonly List links = new List(); + private int downloadedImages; private object lockObjectProgress = new object(); @@ -101,13 +103,15 @@ public class Blog : Model, IBlog private object lockObjectDb = new object(); private object lockObjectDirectory = new object(); - public enum PostType { Photo, Video } + public enum PostType + { + Photo, + Video + } - [DataMember] - public PostType States { get; set; } + [DataMember] public PostType States { get; set; } - [DataMember] - public string Version { get; set; } + [DataMember] public string Version { get; set; } [DataMember] public int DuplicatePhotos @@ -284,20 +288,15 @@ public bool DownloadRebloggedPosts } } - [DataMember] - public string Name { get; set; } + [DataMember] public string Name { get; set; } - [DataMember] - public string Url { get; set; } + [DataMember] public string Url { get; set; } - [DataMember] - public string Location { get; set; } + [DataMember] public string Location { get; set; } - [DataMember] - public string ChildId { get; set; } + [DataMember] public string ChildId { get; set; } - [DataMember] - public BlogTypes BlogType { get; set; } + [DataMember] public BlogTypes BlogType { get; set; } [DataMember] public int DownloadedImages @@ -305,6 +304,7 @@ public int DownloadedImages get => downloadedImages; set => SetProperty(ref downloadedImages, value); } + [DataMember] public int TotalCount { @@ -730,11 +730,9 @@ public bool DownloadUrlList } } - [DataMember] - public bool Dirty { get; set; } + [DataMember] public bool Dirty { get; set; } - [DataMember] - public Exception LoadError { get; set; } + [DataMember] public Exception LoadError { get; set; } public List Links { @@ -764,14 +762,11 @@ public string LastDownloadedVideo } } - [DataMember] - public string Description { get; set; } + [DataMember] public string Description { get; set; } - [DataMember] - public string Title { get; set; } + [DataMember] public string Title { get; set; } - [DataMember] - public ulong LastId { get; set; } + [DataMember] public ulong LastId { get; set; } [DataMember] public bool SkipGif @@ -824,7 +819,6 @@ public void UpdatePostCount(string propertyName) postCounter++; property.SetValue(this, postCounter, null); } - } public void AddFileToDb(string fileName) @@ -842,6 +836,7 @@ public bool CreateDataFolder() Directory.CreateDirectory(DownloadLocation()); return true; } + return true; } @@ -854,6 +849,7 @@ public virtual bool CheckIfFileExistsInDB(string url) Monitor.Exit(lockObjectDb); return true; } + Monitor.Exit(lockObjectDb); return false; } @@ -864,6 +860,7 @@ public virtual bool CheckIfBlogShouldCheckDirectory(string url) { return CheckIfFileExistsInDirectory(url); } + return false; } @@ -877,6 +874,7 @@ public virtual bool CheckIfFileExistsInDirectory(string url) Monitor.Exit(lockObjectDirectory); return true; } + Monitor.Exit(lockObjectDirectory); return false; } @@ -942,6 +940,7 @@ private void SaveBlog() writer.Flush(); } } + File.Replace(newIndex, currentIndex, backupIndex, true); File.Delete(backupIndex); } @@ -962,15 +961,17 @@ private void SaveBlog() protected static string ExtractSubDomain(string url) { - string[] source = url.Split(new char[] { '.' }); - if ((source.Count() >= 3) && source[0].StartsWith("http://", true, null)) + string[] source = url.Split('.'); + if ((source.Length >= 3) && source[0].StartsWith("http://", true, null)) { return source[0].Replace("http://", string.Empty); } - else if ((source.Count() >= 3) && source[0].StartsWith("https://", true, null)) + + if ((source.Length >= 3) && source[0].StartsWith("https://", true, null)) { return source[0].Replace("https://", string.Empty); } + return null; } diff --git a/src/TumblThree/TumblThree.Domain/Models/Blogs/IBlog.cs b/src/TumblThree/TumblThree.Domain/Models/Blogs/IBlog.cs index 138c7bc..cc05be2 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Blogs/IBlog.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Blogs/IBlog.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.ComponentModel; -namespace TumblThree.Domain.Models +namespace TumblThree.Domain.Models.Blogs { public interface IBlog : INotifyPropertyChanged { diff --git a/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrBlog.cs b/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrBlog.cs index 901d40a..b83c955 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrBlog.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrBlog.cs @@ -2,7 +2,9 @@ using System.IO; using System.Runtime.Serialization; -namespace TumblThree.Domain.Models +using TumblThree.Domain.Models.Files; + +namespace TumblThree.Domain.Models.Blogs { [DataContract] public class TumblrBlog : Blog @@ -30,6 +32,7 @@ public static Blog Create(string url, string location) files.Save(); files = null; } + return blog; } } diff --git a/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrHiddenBlog.cs b/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrHiddenBlog.cs index 788d392..ccb1394 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrHiddenBlog.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrHiddenBlog.cs @@ -2,7 +2,9 @@ using System.IO; using System.Runtime.Serialization; -namespace TumblThree.Domain.Models +using TumblThree.Domain.Models.Files; + +namespace TumblThree.Domain.Models.Blogs { [DataContract] public class TumblrHiddenBlog : Blog @@ -30,15 +32,16 @@ public static Blog Create(string url, string location) files.Save(); files = null; } + return blog; } - protected static new string ExtractName(string url) + protected new static string ExtractName(string url) { return url.Split('/')[5]; } - protected static new string ExtractUrl(string url) + protected new static string ExtractUrl(string url) { return "https://" + ExtractName(url) + ".tumblr.com/"; } diff --git a/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrLikedByBlog.cs b/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrLikedByBlog.cs index 22b629e..54eb4ad 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrLikedByBlog.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrLikedByBlog.cs @@ -2,7 +2,9 @@ using System.IO; using System.Runtime.Serialization; -namespace TumblThree.Domain.Models +using TumblThree.Domain.Models.Files; + +namespace TumblThree.Domain.Models.Blogs { [DataContract] public class TumblrLikedByBlog : Blog @@ -30,15 +32,16 @@ public static Blog Create(string url, string location) files.Save(); files = null; } + return blog; } - protected static new string ExtractName(string url) + protected new static string ExtractName(string url) { return url.Split('/')[5]; } - protected static new string ExtractUrl(string url) + protected new static string ExtractUrl(string url) { if (url.StartsWith("http://")) url = url.Insert(4, "s"); diff --git a/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrSearchBlog.cs b/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrSearchBlog.cs index 137bc7c..ef289df 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrSearchBlog.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrSearchBlog.cs @@ -2,7 +2,9 @@ using System.IO; using System.Runtime.Serialization; -namespace TumblThree.Domain.Models +using TumblThree.Domain.Models.Files; + +namespace TumblThree.Domain.Models.Blogs { [DataContract] public class TumblrSearchBlog : Blog @@ -31,15 +33,16 @@ public static Blog Create(string url, string location) files.Save(); files = null; } + return blog; } - protected static new string ExtractName(string url) + protected new static string ExtractName(string url) { return url.Split('/')[4].Replace("-", "+"); } - protected static new string ExtractUrl(string url) + protected new static string ExtractUrl(string url) { if (url.StartsWith("http://")) url = url.Insert(4, "s"); diff --git a/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrTagSearchBlog.cs b/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrTagSearchBlog.cs index 5a2edb4..98e85d8 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrTagSearchBlog.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Blogs/TumblrTagSearchBlog.cs @@ -2,7 +2,9 @@ using System.IO; using System.Runtime.Serialization; -namespace TumblThree.Domain.Models +using TumblThree.Domain.Models.Files; + +namespace TumblThree.Domain.Models.Blogs { [DataContract] public class TumblrTagSearchBlog : Blog @@ -30,15 +32,16 @@ public static Blog Create(string url, string location) files.Save(); files = null; } + return blog; } - protected static new string ExtractName(string url) + protected new static string ExtractName(string url) { return url.Split('/')[4].Replace("-", "+"); } - protected static new string ExtractUrl(string url) + protected new static string ExtractUrl(string url) { if (url.StartsWith("http://")) url = url.Insert(4, "s"); diff --git a/src/TumblThree/TumblThree.Domain/Models/CatboxTypes.cs b/src/TumblThree/TumblThree.Domain/Models/CatboxTypes.cs index 12a7b8a..300eea5 100644 --- a/src/TumblThree/TumblThree.Domain/Models/CatboxTypes.cs +++ b/src/TumblThree/TumblThree.Domain/Models/CatboxTypes.cs @@ -11,10 +11,11 @@ public enum CatBoxTypes { [LocalizedDescription("any", typeof(Resources))] Any, + [LocalizedDescription("mp4", typeof(Resources))] Mp4, + [LocalizedDescription("webm", typeof(Resources))] Webm - } } diff --git a/src/TumblThree/TumblThree.Domain/Models/DetailsBlog.cs b/src/TumblThree/TumblThree.Domain/Models/DetailsBlog.cs index 72815aa..7daed67 100644 --- a/src/TumblThree/TumblThree.Domain/Models/DetailsBlog.cs +++ b/src/TumblThree/TumblThree.Domain/Models/DetailsBlog.cs @@ -1,5 +1,7 @@ using System.Runtime.Serialization; +using TumblThree.Domain.Models.Blogs; + namespace TumblThree.Domain.Models { [DataContract] @@ -24,10 +26,6 @@ public class DetailsBlog : Blog private bool? downloadRebloggedPosts; private bool? online; - public DetailsBlog() - { - } - [DataMember] public new bool? DownloadText { @@ -167,7 +165,6 @@ public DetailsBlog() set => SetProperty(ref online, value); } - [DataMember] public new bool? CheckDirectoryForFiles { @@ -190,8 +187,7 @@ public DetailsBlog() } } - [DataMember] - public new bool? Dirty { get; set; } + [DataMember] public new bool? Dirty { get; set; } [DataMember] public new bool? SkipGif diff --git a/src/TumblThree/TumblThree.Domain/Models/Files/Files.cs b/src/TumblThree/TumblThree.Domain/Models/Files/Files.cs index d881fa7..4bee067 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Files/Files.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Files/Files.cs @@ -9,7 +9,7 @@ using System.Waf.Foundation; using System.Xml; -namespace TumblThree.Domain.Models +namespace TumblThree.Domain.Models.Files { [DataContract] public class Files : Model, IFiles @@ -33,17 +33,13 @@ public Files(string name, string location) links = new List(); } - [DataMember] - public string Name { get; set; } + [DataMember] public string Name { get; set; } - [DataMember] - public string Location { get; set; } + [DataMember] public string Location { get; set; } - [DataMember] - public BlogTypes BlogType { get; set; } + [DataMember] public BlogTypes BlogType { get; set; } - [DataMember] - public string Version { get; set; } + [DataMember] public string Version { get; set; } public IList Links { @@ -68,6 +64,7 @@ public virtual bool CheckIfFileExistsInDB(string url) Monitor.Exit(lockObjectDb); return true; } + Monitor.Exit(lockObjectDb); return false; } @@ -112,6 +109,7 @@ public bool Save() writer.Flush(); } } + File.Replace(newIndex, currentIndex, backupIndex, true); File.Delete(backupIndex); } diff --git a/src/TumblThree/TumblThree.Domain/Models/Files/IFiles.cs b/src/TumblThree/TumblThree.Domain/Models/Files/IFiles.cs index 45f2488..87e82a8 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Files/IFiles.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Files/IFiles.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.ComponentModel; -namespace TumblThree.Domain.Models +namespace TumblThree.Domain.Models.Files { public interface IFiles : INotifyPropertyChanged { diff --git a/src/TumblThree/TumblThree.Domain/Models/Files/TumblrBlogFiles.cs b/src/TumblThree/TumblThree.Domain/Models/Files/TumblrBlogFiles.cs index ae478de..29e6a84 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Files/TumblrBlogFiles.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Files/TumblrBlogFiles.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace TumblThree.Domain.Models +namespace TumblThree.Domain.Models.Files { [DataContract] public class TumblrBlogFiles : Files diff --git a/src/TumblThree/TumblThree.Domain/Models/Files/TumblrHiddenBlogFiles.cs b/src/TumblThree/TumblThree.Domain/Models/Files/TumblrHiddenBlogFiles.cs index 31949bd..21defcf 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Files/TumblrHiddenBlogFiles.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Files/TumblrHiddenBlogFiles.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace TumblThree.Domain.Models +namespace TumblThree.Domain.Models.Files { [DataContract] public class TumblrHiddenBlogFiles : Files diff --git a/src/TumblThree/TumblThree.Domain/Models/Files/TumblrLikedByBlogFiles.cs b/src/TumblThree/TumblThree.Domain/Models/Files/TumblrLikedByBlogFiles.cs index 895cf3e..97e0c70 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Files/TumblrLikedByBlogFiles.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Files/TumblrLikedByBlogFiles.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace TumblThree.Domain.Models +namespace TumblThree.Domain.Models.Files { [DataContract] public class TumblrLikedByBlogFiles : Files diff --git a/src/TumblThree/TumblThree.Domain/Models/Files/TumblrSearchBlogFiles.cs b/src/TumblThree/TumblThree.Domain/Models/Files/TumblrSearchBlogFiles.cs index c859cef..d223d62 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Files/TumblrSearchBlogFiles.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Files/TumblrSearchBlogFiles.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace TumblThree.Domain.Models +namespace TumblThree.Domain.Models.Files { [DataContract] public class TumblrSearchBlogFiles : Files diff --git a/src/TumblThree/TumblThree.Domain/Models/Files/TumblrTagSearchBlogFiles.cs b/src/TumblThree/TumblThree.Domain/Models/Files/TumblrTagSearchBlogFiles.cs index 55ef467..444b803 100644 --- a/src/TumblThree/TumblThree.Domain/Models/Files/TumblrTagSearchBlogFiles.cs +++ b/src/TumblThree/TumblThree.Domain/Models/Files/TumblrTagSearchBlogFiles.cs @@ -1,6 +1,6 @@ using System.Runtime.Serialization; -namespace TumblThree.Domain.Models +namespace TumblThree.Domain.Models.Files { [DataContract] public class TumblrTagSearchBlogFiles : Files diff --git a/src/TumblThree/TumblThree.Domain/Models/GfycatType.cs b/src/TumblThree/TumblThree.Domain/Models/GfycatType.cs index 79e3994..a2959c9 100644 --- a/src/TumblThree/TumblThree.Domain/Models/GfycatType.cs +++ b/src/TumblThree/TumblThree.Domain/Models/GfycatType.cs @@ -11,18 +11,25 @@ public enum GfycatTypes { [LocalizedDescription("mp4", typeof(Resources))] Mp4, + [LocalizedDescription("webm", typeof(Resources))] Webm, + [LocalizedDescription("webp", typeof(Resources))] Webp, + [LocalizedDescription("poster", typeof(Resources))] Poster, + [LocalizedDescription("max5mbgif", typeof(Resources))] Max5mbGif, + [LocalizedDescription("max2mbgif", typeof(Resources))] Max2mbGif, + [LocalizedDescription("mjpg", typeof(Resources))] Mjpg, + [LocalizedDescription("gif", typeof(Resources))] Gif } diff --git a/src/TumblThree/TumblThree.Domain/Models/IBlogFactory.cs b/src/TumblThree/TumblThree.Domain/Models/IBlogFactory.cs index 20dc72c..a1e489a 100644 --- a/src/TumblThree/TumblThree.Domain/Models/IBlogFactory.cs +++ b/src/TumblThree/TumblThree.Domain/Models/IBlogFactory.cs @@ -1,4 +1,6 @@ -namespace TumblThree.Domain.Models +using TumblThree.Domain.Models.Blogs; + +namespace TumblThree.Domain.Models { public interface IBlogFactory { diff --git a/src/TumblThree/TumblThree.Domain/Models/IUrlValidator.cs b/src/TumblThree/TumblThree.Domain/Models/IUrlValidator.cs index fdea47f..c5b0134 100644 --- a/src/TumblThree/TumblThree.Domain/Models/IUrlValidator.cs +++ b/src/TumblThree/TumblThree.Domain/Models/IUrlValidator.cs @@ -3,10 +3,15 @@ public interface IUrlValidator { bool IsValidTumblrHiddenUrl(string url); + bool IsValidTumblrLikedByUrl(string url); + bool IsValidTumblrSearchUrl(string url); + bool IsValidTumblrTagSearchUrl(string url); + bool IsValidTumblrUrl(string url); + string AddHttpsProtocol(string url); } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Domain/Models/LoliSafeTypes.cs b/src/TumblThree/TumblThree.Domain/Models/LoliSafeTypes.cs index abb248d..9921253 100644 --- a/src/TumblThree/TumblThree.Domain/Models/LoliSafeTypes.cs +++ b/src/TumblThree/TumblThree.Domain/Models/LoliSafeTypes.cs @@ -11,10 +11,11 @@ public enum LoliSafeTypes { [LocalizedDescription("any", typeof(Resources))] Any, + [LocalizedDescription("mp4", typeof(Resources))] Mp4, + [LocalizedDescription("webm", typeof(Resources))] Webm - } } diff --git a/src/TumblThree/TumblThree.Domain/Models/MetadataType.cs b/src/TumblThree/TumblThree.Domain/Models/MetadataType.cs index e8924eb..d1cb014 100644 --- a/src/TumblThree/TumblThree.Domain/Models/MetadataType.cs +++ b/src/TumblThree/TumblThree.Domain/Models/MetadataType.cs @@ -11,6 +11,7 @@ public enum MetadataType { [LocalizedDescription("text", typeof(Resources))] Text, + [LocalizedDescription("json", typeof(Resources))] Json } diff --git a/src/TumblThree/TumblThree.Domain/Models/MixtapeTypes.cs b/src/TumblThree/TumblThree.Domain/Models/MixtapeTypes.cs index e7c3057..926408e 100644 --- a/src/TumblThree/TumblThree.Domain/Models/MixtapeTypes.cs +++ b/src/TumblThree/TumblThree.Domain/Models/MixtapeTypes.cs @@ -11,10 +11,11 @@ public enum MixtapeTypes { [LocalizedDescription("any", typeof(Resources))] Any, + [LocalizedDescription("mp4", typeof(Resources))] Mp4, + [LocalizedDescription("webm", typeof(Resources))] Webm - } -} \ No newline at end of file +} diff --git a/src/TumblThree/TumblThree.Domain/Models/PostCounter.cs b/src/TumblThree/TumblThree.Domain/Models/PostCounter.cs index d07313a..7ce0860 100644 --- a/src/TumblThree/TumblThree.Domain/Models/PostCounter.cs +++ b/src/TumblThree/TumblThree.Domain/Models/PostCounter.cs @@ -1,4 +1,6 @@ -namespace TumblThree.Domain.Models +using TumblThree.Domain.Models.Blogs; + +namespace TumblThree.Domain.Models { public class PostCounter { diff --git a/src/TumblThree/TumblThree.Domain/Models/SafeMoeTypes.cs b/src/TumblThree/TumblThree.Domain/Models/SafeMoeTypes.cs index 30a96a3..3303f45 100644 --- a/src/TumblThree/TumblThree.Domain/Models/SafeMoeTypes.cs +++ b/src/TumblThree/TumblThree.Domain/Models/SafeMoeTypes.cs @@ -11,10 +11,11 @@ public enum SafeMoeTypes { [LocalizedDescription("any", typeof(Resources))] Any, + [LocalizedDescription("mp4", typeof(Resources))] Mp4, + [LocalizedDescription("webm", typeof(Resources))] Webm - } } diff --git a/src/TumblThree/TumblThree.Domain/Models/UguuTypes.cs b/src/TumblThree/TumblThree.Domain/Models/UguuTypes.cs index 5980f88..80e7b47 100644 --- a/src/TumblThree/TumblThree.Domain/Models/UguuTypes.cs +++ b/src/TumblThree/TumblThree.Domain/Models/UguuTypes.cs @@ -11,10 +11,11 @@ public enum UguuTypes { [LocalizedDescription("any", typeof(Resources))] Any, + [LocalizedDescription("mp4", typeof(Resources))] Mp4, + [LocalizedDescription("webm", typeof(Resources))] Webm - } } diff --git a/src/TumblThree/TumblThree.Domain/Models/UrlValidator.cs b/src/TumblThree/TumblThree.Domain/Models/UrlValidator.cs index 987575d..92e481b 100644 --- a/src/TumblThree/TumblThree.Domain/Models/UrlValidator.cs +++ b/src/TumblThree/TumblThree.Domain/Models/UrlValidator.cs @@ -9,13 +9,16 @@ public class UrlValidator : IUrlValidator { public bool IsValidTumblrUrl(string url) { - return url != null && url.Length > 18 && url.Contains(".tumblr.com") && !url.Contains("//www.tumblr.com") && !url.Any(char.IsWhiteSpace) && - !url.Contains(".media.tumblr.com") && (url.StartsWith("http://", true, null) || url.StartsWith("https://", true, null)); + return url != null && url.Length > 18 && url.Contains(".tumblr.com") && !url.Contains("//www.tumblr.com") && + !url.Any(char.IsWhiteSpace) && + !url.Contains(".media.tumblr.com") && + (url.StartsWith("http://", true, null) || url.StartsWith("https://", true, null)); } public bool IsValidTumblrHiddenUrl(string url) { - return url != null && url.Length > 38 && url.Contains("www.tumblr.com/dashboard/blog/") && !url.Any(char.IsWhiteSpace) && + return url != null && url.Length > 38 && url.Contains("www.tumblr.com/dashboard/blog/") && + !url.Any(char.IsWhiteSpace) && (url.StartsWith("http://", true, null) || url.StartsWith("https://", true, null)); } diff --git a/src/TumblThree/TumblThree.Domain/Models/WebmshareTypes.cs b/src/TumblThree/TumblThree.Domain/Models/WebmshareTypes.cs index 1a27ae8..61ac4ba 100644 --- a/src/TumblThree/TumblThree.Domain/Models/WebmshareTypes.cs +++ b/src/TumblThree/TumblThree.Domain/Models/WebmshareTypes.cs @@ -11,8 +11,10 @@ public enum WebmshareTypes { [LocalizedDescription("any", typeof(Resources))] Any, + [LocalizedDescription("mp4", typeof(Resources))] Mp4, + [LocalizedDescription("webm", typeof(Resources))] Webm } diff --git a/src/TumblThree/TumblThree.Domain/Queue/QueueListItem.cs b/src/TumblThree/TumblThree.Domain/Queue/QueueListItem.cs index e2149b0..0d8d6e6 100644 --- a/src/TumblThree/TumblThree.Domain/Queue/QueueListItem.cs +++ b/src/TumblThree/TumblThree.Domain/Queue/QueueListItem.cs @@ -1,7 +1,7 @@ using System; using System.Waf.Foundation; -using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Domain.Queue { diff --git a/src/TumblThree/TumblThree.Domain/Queue/QueueManager.cs b/src/TumblThree/TumblThree.Domain/Queue/QueueManager.cs index b1fad1d..7dbd99d 100644 --- a/src/TumblThree/TumblThree.Domain/Queue/QueueManager.cs +++ b/src/TumblThree/TumblThree.Domain/Queue/QueueManager.cs @@ -75,15 +75,17 @@ public void ClearItems() public void MoveItems(int newIndex, IEnumerable itemsToMove) { - int oldIndex = items.IndexOf(itemsToMove.First()); + List listItems = itemsToMove.ToList(); + + int oldIndex = items.IndexOf(listItems.First()); if (oldIndex != newIndex) { if (newIndex < oldIndex) { - itemsToMove = itemsToMove.Reverse(); + listItems.Reverse(); } - foreach (QueueListItem item in itemsToMove) + foreach (QueueListItem item in listItems) { int currentIndex = items.IndexOf(item); if (currentIndex != newIndex) diff --git a/src/TumblThree/TumblThree.Domain/TumblThree.Domain.csproj b/src/TumblThree/TumblThree.Domain/TumblThree.Domain.csproj index 2028b10..48fab1f 100644 --- a/src/TumblThree/TumblThree.Domain/TumblThree.Domain.csproj +++ b/src/TumblThree/TumblThree.Domain/TumblThree.Domain.csproj @@ -51,7 +51,6 @@ - diff --git a/src/TumblThree/TumblThree.Presentation/App.xaml.cs b/src/TumblThree/TumblThree.Presentation/App.xaml.cs index 284f5a1..2c2886f 100644 --- a/src/TumblThree/TumblThree.Presentation/App.xaml.cs +++ b/src/TumblThree/TumblThree.Presentation/App.xaml.cs @@ -17,6 +17,7 @@ using TumblThree.Applications.ViewModels; using TumblThree.Domain; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Presentation.Properties; namespace TumblThree.Presentation diff --git a/src/TumblThree/TumblThree.Presentation/Converters/IsBlogInQueueMultiConverter.cs b/src/TumblThree/TumblThree.Presentation/Converters/IsBlogInQueueMultiConverter.cs index ed3b558..b8d748b 100644 --- a/src/TumblThree/TumblThree.Presentation/Converters/IsBlogInQueueMultiConverter.cs +++ b/src/TumblThree/TumblThree.Presentation/Converters/IsBlogInQueueMultiConverter.cs @@ -5,6 +5,7 @@ using System.Windows.Data; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Domain.Queue; namespace TumblThree.Presentation.Converters diff --git a/src/TumblThree/TumblThree.Presentation/DesignData/MockCrawlerService.cs b/src/TumblThree/TumblThree.Presentation/DesignData/MockCrawlerService.cs index fafb346..3eee913 100644 --- a/src/TumblThree/TumblThree.Presentation/DesignData/MockCrawlerService.cs +++ b/src/TumblThree/TumblThree.Presentation/DesignData/MockCrawlerService.cs @@ -8,6 +8,7 @@ using TumblThree.Applications.Services; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Domain.Queue; namespace TumblThree.Presentation.DesignData diff --git a/src/TumblThree/TumblThree.Presentation/DesignData/MockManagerService.cs b/src/TumblThree/TumblThree.Presentation/DesignData/MockManagerService.cs index 97ae52a..cba324d 100644 --- a/src/TumblThree/TumblThree.Presentation/DesignData/MockManagerService.cs +++ b/src/TumblThree/TumblThree.Presentation/DesignData/MockManagerService.cs @@ -5,6 +5,8 @@ using TumblThree.Applications.Services; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; +using TumblThree.Domain.Models.Files; namespace TumblThree.Presentation.DesignData { diff --git a/src/TumblThree/TumblThree.Presentation/DesignData/MockSelectionService.cs b/src/TumblThree/TumblThree.Presentation/DesignData/MockSelectionService.cs index a46a881..5fb1aa4 100644 --- a/src/TumblThree/TumblThree.Presentation/DesignData/MockSelectionService.cs +++ b/src/TumblThree/TumblThree.Presentation/DesignData/MockSelectionService.cs @@ -4,6 +4,7 @@ using TumblThree.Applications.ObjectModel; using TumblThree.Applications.Services; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Presentation.DesignData { diff --git a/src/TumblThree/TumblThree.Presentation/DesignData/SampleBlogFile.cs b/src/TumblThree/TumblThree.Presentation/DesignData/SampleBlogFile.cs index 900584a..84209c4 100644 --- a/src/TumblThree/TumblThree.Presentation/DesignData/SampleBlogFile.cs +++ b/src/TumblThree/TumblThree.Presentation/DesignData/SampleBlogFile.cs @@ -1,4 +1,5 @@ using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Presentation.DesignData { diff --git a/src/TumblThree/TumblThree.Presentation/DesignData/SampleDetailsViewModel.cs b/src/TumblThree/TumblThree.Presentation/DesignData/SampleDetailsViewModel.cs index 88edf3e..873f639 100644 --- a/src/TumblThree/TumblThree.Presentation/DesignData/SampleDetailsViewModel.cs +++ b/src/TumblThree/TumblThree.Presentation/DesignData/SampleDetailsViewModel.cs @@ -1,8 +1,10 @@ using System; using TumblThree.Applications.ViewModels; +using TumblThree.Applications.ViewModels.DetailsViewModels; using TumblThree.Applications.Views; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Presentation.DesignData { diff --git a/src/TumblThree/TumblThree.Presentation/DesignData/SampleManagerViewModel.cs b/src/TumblThree/TumblThree.Presentation/DesignData/SampleManagerViewModel.cs index 24966e7..043b0f9 100644 --- a/src/TumblThree/TumblThree.Presentation/DesignData/SampleManagerViewModel.cs +++ b/src/TumblThree/TumblThree.Presentation/DesignData/SampleManagerViewModel.cs @@ -7,6 +7,7 @@ using TumblThree.Applications.ViewModels; using TumblThree.Applications.Views; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; namespace TumblThree.Presentation.DesignData { diff --git a/src/TumblThree/TumblThree.Presentation/DesignData/SampleQueueViewModel.cs b/src/TumblThree/TumblThree.Presentation/DesignData/SampleQueueViewModel.cs index 96a4aa0..4a0232a 100644 --- a/src/TumblThree/TumblThree.Presentation/DesignData/SampleQueueViewModel.cs +++ b/src/TumblThree/TumblThree.Presentation/DesignData/SampleQueueViewModel.cs @@ -4,6 +4,7 @@ using TumblThree.Applications.ViewModels; using TumblThree.Applications.Views; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Domain.Queue; namespace TumblThree.Presentation.DesignData diff --git a/src/TumblThree/TumblThree.Presentation/TumblThree.Presentation.csproj b/src/TumblThree/TumblThree.Presentation/TumblThree.Presentation.csproj index 420258b..77de0c9 100644 --- a/src/TumblThree/TumblThree.Presentation/TumblThree.Presentation.csproj +++ b/src/TumblThree/TumblThree.Presentation/TumblThree.Presentation.csproj @@ -50,10 +50,7 @@ - - - diff --git a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsAllView.xaml.cs b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsAllView.xaml.cs index c8a54d1..b2c74f8 100644 --- a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsAllView.xaml.cs +++ b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsAllView.xaml.cs @@ -4,6 +4,7 @@ using System.Windows.Input; using TumblThree.Applications.ViewModels; +using TumblThree.Applications.ViewModels.DetailsViewModels; using TumblThree.Applications.Views; namespace TumblThree.Presentation.Views diff --git a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrBlogView.xaml.cs b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrBlogView.xaml.cs index 993f63b..7f65d59 100644 --- a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrBlogView.xaml.cs +++ b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrBlogView.xaml.cs @@ -4,6 +4,7 @@ using System.Windows.Input; using TumblThree.Applications.ViewModels; +using TumblThree.Applications.ViewModels.DetailsViewModels; using TumblThree.Applications.Views; namespace TumblThree.Presentation.Views diff --git a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrHiddenBlogView.xaml.cs b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrHiddenBlogView.xaml.cs index ed0f717..dd23b41 100644 --- a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrHiddenBlogView.xaml.cs +++ b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrHiddenBlogView.xaml.cs @@ -4,6 +4,7 @@ using System.Windows.Input; using TumblThree.Applications.ViewModels; +using TumblThree.Applications.ViewModels.DetailsViewModels; using TumblThree.Applications.Views; namespace TumblThree.Presentation.Views diff --git a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrLikedByView.xaml.cs b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrLikedByView.xaml.cs index 173235d..ea36d2a 100644 --- a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrLikedByView.xaml.cs +++ b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrLikedByView.xaml.cs @@ -4,6 +4,7 @@ using System.Windows.Input; using TumblThree.Applications.ViewModels; +using TumblThree.Applications.ViewModels.DetailsViewModels; using TumblThree.Applications.Views; namespace TumblThree.Presentation.Views diff --git a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrSearchView.xaml.cs b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrSearchView.xaml.cs index 4b7ba51..bf0d493 100644 --- a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrSearchView.xaml.cs +++ b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrSearchView.xaml.cs @@ -4,6 +4,7 @@ using System.Windows.Input; using TumblThree.Applications.ViewModels; +using TumblThree.Applications.ViewModels.DetailsViewModels; using TumblThree.Applications.Views; namespace TumblThree.Presentation.Views diff --git a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrTagSearchView.xaml.cs b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrTagSearchView.xaml.cs index 52e33d8..7580d1d 100644 --- a/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrTagSearchView.xaml.cs +++ b/src/TumblThree/TumblThree.Presentation/Views/DetailsViews/DetailsTumblrTagSearchView.xaml.cs @@ -4,6 +4,7 @@ using System.Windows.Input; using TumblThree.Applications.ViewModels; +using TumblThree.Applications.ViewModels.DetailsViewModels; using TumblThree.Applications.Views; namespace TumblThree.Presentation.Views diff --git a/src/TumblThree/TumblThree.Presentation/Views/ManagerView.xaml.cs b/src/TumblThree/TumblThree.Presentation/Views/ManagerView.xaml.cs index 1b8a02f..2226899 100644 --- a/src/TumblThree/TumblThree.Presentation/Views/ManagerView.xaml.cs +++ b/src/TumblThree/TumblThree.Presentation/Views/ManagerView.xaml.cs @@ -13,6 +13,7 @@ using TumblThree.Applications.Views; using TumblThree.Presentation.Controls; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Domain.Queue; namespace TumblThree.Presentation.Views diff --git a/src/TumblThree/TumblThree.Presentation/Views/QueueView.xaml.cs b/src/TumblThree/TumblThree.Presentation/Views/QueueView.xaml.cs index 32da74a..aaa5cce 100644 --- a/src/TumblThree/TumblThree.Presentation/Views/QueueView.xaml.cs +++ b/src/TumblThree/TumblThree.Presentation/Views/QueueView.xaml.cs @@ -8,6 +8,7 @@ using TumblThree.Applications.ViewModels; using TumblThree.Applications.Views; using TumblThree.Domain.Models; +using TumblThree.Domain.Models.Blogs; using TumblThree.Domain.Queue; using TumblThree.Presentation.Controls;