From dd7f071e1a5d0e53ed6ba8c3600b2d21270337ca Mon Sep 17 00:00:00 2001 From: Andy <88590076+AAndyProgram@users.noreply.github.com> Date: Sun, 20 Mar 2022 02:17:53 +0300 Subject: [PATCH] 3.0.0.1 Added DownloadLimitDate, update and Reset functions in the plugin, DateLimit property in the IPluginContentProvider Fixed donation button link, images loading error, cookies error, instagram settings form, minor bugs. --- Changelog.md | 13 ++++ ProgramScreenshots/MainContext2.png | Bin 14430 -> 21513 bytes .../Interfaces/IPluginContentProvider.vb | 1 + .../Interfaces/ISiteSettings.vb | 2 + .../My Project/AssemblyInfo.vb | 4 +- SCrawler/API/Base/SiteSettingsBase.vb | 5 ++ SCrawler/API/Base/UserDataBase.vb | 14 ++++ SCrawler/API/Instagram/SiteSettings.vb | 2 +- SCrawler/API/Instagram/UserData.vb | 1 + SCrawler/API/Reddit/UserData.vb | 8 ++- SCrawler/API/Redgifs/UserData.vb | 1 + SCrawler/API/Twitter/UserData.vb | 1 + .../Download/ActiveDownloadingProgress.vb | 7 +- SCrawler/Download/TDownloader.vb | 5 +- .../Editors/GlobalSettingsForm.Designer.vb | 40 ++++++------ SCrawler/Editors/SiteEditorForm.Designer.vb | 60 +++++++++--------- SCrawler/Editors/SiteEditorForm.resx | 12 ++-- SCrawler/Editors/SiteEditorForm.vb | 27 ++++---- SCrawler/FDatePickerForm.vb | 8 ++- SCrawler/ListImagesLoader.vb | 29 +++++---- SCrawler/MainFrame.Designer.vb | 27 +++++--- SCrawler/MainFrame.resx | 58 ++++++++--------- SCrawler/MainFrame.vb | 50 ++++++++++++--- SCrawler/My Project/AssemblyInfo.vb | 4 +- .../Hosts/PropertyValueHost.vb | 18 +++++- .../PluginsEnvironment/Hosts/SettingsHost.vb | 2 + .../PluginsEnvironment/Hosts/UserDataHost.vb | 1 + 27 files changed, 262 insertions(+), 138 deletions(-) diff --git a/Changelog.md b/Changelog.md index ead1c06..eacaf26 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,16 @@ +# 3.0.0.1 + +- Added + - Download data up to a specific date + - Update and Reset functions in the plugin (ISiteSettings) + - PostsDateLimit propperty in the plugin (IPluginContentProvider) +- Fixed + - The donation button redirects to a broken link + - In some cases, an error occurs when fast loading images + - In some cases, cookies are not saved + - Some design fixes + - Minor bugs + # 3.0.0.0 **Attention! This version of the program makes changes user data file (Users.xml). Once you start using this version, you will not be able to use previous versions of the program. Therefore, it is highly recommended to archive the program settings folder and archive the users' data files (you can use the [```ArchiveSCrawlerUsersDataFiles.bat```](Tools/ArchiveSCrawlerUsersDataFiles.bat) tool to archive the data files of all users).** diff --git a/ProgramScreenshots/MainContext2.png b/ProgramScreenshots/MainContext2.png index 20439a49f2dfed854af7719a244ef11a511b977c..f382bcb080bb9f6acb3a2042069c1a147bb2c786 100644 GIT binary patch literal 21513 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 literal 14430 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 R-vmBTme-K0koge&{{Z5pr11a% diff --git a/SCrawler.PluginProvider/Interfaces/IPluginContentProvider.vb b/SCrawler.PluginProvider/Interfaces/IPluginContentProvider.vb index badd7d8..3b7d16b 100644 --- a/SCrawler.PluginProvider/Interfaces/IPluginContentProvider.vb +++ b/SCrawler.PluginProvider/Interfaces/IPluginContentProvider.vb @@ -26,6 +26,7 @@ Namespace Plugin Property SeparateVideoFolder As Boolean Property DataPath As String Property PostsNumberLimit As Integer? + Property PostsDateLimit As Date? Function ExchangeOptionsGet() As Object Sub ExchangeOptionsSet(ByVal Obj As Object) Sub XmlFieldsSet(ByVal Fields As List(Of KeyValuePair(Of String, String))) diff --git a/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb b/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb index 34ed75c..a8c683d 100644 --- a/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb +++ b/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb @@ -41,6 +41,8 @@ Namespace Plugin Sub AfterDownload(ByVal User As Object, ByVal What As Download) Sub DownloadDone(ByVal What As Download) #End Region + Sub Update() + Sub Reset() Sub OpenSettingsForm() Sub UserOptions(ByRef Options As Object, ByVal OpenForm As Boolean) End Interface diff --git a/SCrawler.PluginProvider/My Project/AssemblyInfo.vb b/SCrawler.PluginProvider/My Project/AssemblyInfo.vb index 765a1b1..4691607 100644 --- a/SCrawler.PluginProvider/My Project/AssemblyInfo.vb +++ b/SCrawler.PluginProvider/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler/API/Base/SiteSettingsBase.vb b/SCrawler/API/Base/SiteSettingsBase.vb index 241435b..3b91eb1 100644 --- a/SCrawler/API/Base/SiteSettingsBase.vb +++ b/SCrawler/API/Base/SiteSettingsBase.vb @@ -97,6 +97,11 @@ Namespace API.Base Return True End Function #End Region + Friend Overridable Sub Update() Implements ISiteSettings.Update + If Not Responser Is Nothing Then Responser.SaveSettings() + End Sub + Friend Overridable Sub Reset() Implements ISiteSettings.Reset + End Sub Friend Overridable Sub UserOptions(ByRef Options As Object, ByVal OpenForm As Boolean) Implements ISiteSettings.UserOptions Options = Nothing End Sub diff --git a/SCrawler/API/Base/UserDataBase.vb b/SCrawler/API/Base/UserDataBase.vb index c4fb2c8..1f3efae 100644 --- a/SCrawler/API/Base/UserDataBase.vb +++ b/SCrawler/API/Base/UserDataBase.vb @@ -711,6 +711,7 @@ BlockNullPicture: #End Region #Region "Download functions and options" Friend Overridable Property DownloadTopCount As Integer? = Nothing Implements IUserData.DownloadTopCount, IPluginContentProvider.PostsNumberLimit + Friend Overridable Property DownloadToDate As Date? = Nothing Implements IUserData.DownloadToDate, IPluginContentProvider.PostsDateLimit Protected Responser As PersonalUtilities.Tools.WEB.Response Friend Overridable Sub DownloadData(ByVal Token As CancellationToken) Implements IContentProvider.DownloadData Dim Canceled As Boolean = False @@ -791,8 +792,20 @@ BlockNullPicture: If Not Canceled Then _DataParsed = True ': LastUpdated = Now _ContentNew.Clear() DownloadTopCount = Nothing + DownloadToDate = Nothing End Try End Sub + Protected Function CheckDatesLimit(ByVal DateString As String, ByVal DateProvider As IFormatProvider) As Boolean + Try + If DownloadToDate.HasValue And Not DateString.IsEmptyString Then + Dim td As Date? = AConvert(Of Date)(DateString, DateProvider, Nothing) + If td.HasValue Then Return td.Value < DownloadToDate.Value + End If + Return True + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.SendInLog, ex, $"[UserDataBase.CheckDatesLimit({DateString})]", True) + End Try + End Function Protected Sub UpdateDataFiles() If Not User.File.IsEmptyString Then MyFileData = User.File @@ -1236,6 +1249,7 @@ BlockNullPicture: Sub OpenFolder() ReadOnly Property Self As IUserData Property DownloadTopCount As Integer? + Property DownloadToDate As Date? Sub SetEnvironment(ByRef h As SettingsHost, ByVal u As UserInfo, ByVal _LoadUserInformation As Boolean, Optional ByVal AttachUserInfo As Boolean = True) ReadOnly Property Disposed As Boolean diff --git a/SCrawler/API/Instagram/SiteSettings.vb b/SCrawler/API/Instagram/SiteSettings.vb index f78c9c5..c9ad006 100644 --- a/SCrawler/API/Instagram/SiteSettings.vb +++ b/SCrawler/API/Instagram/SiteSettings.vb @@ -71,7 +71,7 @@ Namespace API.Instagram Friend ReadOnly Property RequestsWaitTimer As PropertyValue Private ReadOnly Property RequestsWaitTimerProvider As IFormatProvider - + Friend ReadOnly Property RequestsWaitTimerTaskCount As PropertyValue Private ReadOnly Property RequestsWaitTimerTaskCountProvider As IFormatProvider diff --git a/SCrawler/API/Instagram/UserData.vb b/SCrawler/API/Instagram/UserData.vb index ad04d7a..75f1ce6 100644 --- a/SCrawler/API/Instagram/UserData.vb +++ b/SCrawler/API/Instagram/UserData.vb @@ -243,6 +243,7 @@ Namespace API.Instagram If Not PostID.IsEmptyString And _TempPostsList.Contains(PostID) Then Throw New ExitException(_DownloadComplete) _TempPostsList.Add(PostID) PostDate = node.Value("taken_at_timestamp") + If Not CheckDatesLimit(PostDate, DateProvider) Then Throw New ExitException(_DownloadComplete) ObtainMedia(node, PostID, PostDate, SpecFolder) End If Next diff --git a/SCrawler/API/Reddit/UserData.vb b/SCrawler/API/Reddit/UserData.vb index a86e8dc..e0dfe35 100644 --- a/SCrawler/API/Reddit/UserData.vb +++ b/SCrawler/API/Reddit/UserData.vb @@ -23,6 +23,11 @@ Namespace API.Reddit Return DirectCast(HOST.Source, SiteSettings) End Get End Property + Private Shared ReadOnly Property DateTrueProvider(ByVal IsChannel As Boolean) As IFormatProvider + Get + Return If(IsChannel, DateProviderChannel, DateProvider) + End Get + End Property #Region "Channels Support" #Region "IChannelLimits Support" Friend Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount @@ -163,6 +168,7 @@ Namespace API.Reddit Continue For End If If nn.Contains("created") Then PostDate = nn("created").Value Else PostDate = String.Empty + If DownloadToDate.HasValue AndAlso Not CheckDatesLimit(PostDate, DateTrueProvider(IsChannel)) Then Exit Sub _ItemsBefore = _TempMediaList.Count added = True @@ -455,7 +461,7 @@ Namespace API.Reddit Dim m As New UserMedia(_URL, t) With {.Post = New UserPost With {.ID = PostID, .UserID = _UserID}} If t = UTypes.Picture Or t = UTypes.GIF Then m.File = UrlToFile(m.URL) Else m.File = Nothing If m.URL.Contains("preview") Then m.URL = $"https://i.redd.it/{m.File.File}" - If Not PostDate.IsEmptyString Then m.Post.Date = AConvert(Of Date)(PostDate, If(IsChannel, DateProviderChannel, DateProvider), Nothing) Else m.Post.Date = Nothing + If Not PostDate.IsEmptyString Then m.Post.Date = AConvert(Of Date)(PostDate, DateTrueProvider(IsChannel), Nothing) Else m.Post.Date = Nothing Return m End Function Private Function TryFile(ByVal URL As String) As Boolean diff --git a/SCrawler/API/Redgifs/UserData.vb b/SCrawler/API/Redgifs/UserData.vb index ff3efb8..3288cfd 100644 --- a/SCrawler/API/Redgifs/UserData.vb +++ b/SCrawler/API/Redgifs/UserData.vb @@ -37,6 +37,7 @@ Namespace API.RedGifs pTotal = j.Value("pages").FromXML(Of Integer)(0) For Each g As EContainer In j("gifs") postDate = g.Value("createDate") + If Not CheckDatesLimit(postDate, DateProvider) Then Exit Sub postID = g.Value("id") If Not _TempPostsList.Contains(postID) Then _TempPostsList.Add(postID) Else Exit For With g("urls") diff --git a/SCrawler/API/Twitter/UserData.vb b/SCrawler/API/Twitter/UserData.vb index 0d97337..388577d 100644 --- a/SCrawler/API/Twitter/UserData.vb +++ b/SCrawler/API/Twitter/UserData.vb @@ -64,6 +64,7 @@ Namespace API.Twitter 'Date Pattern: 'Sat Jan 01 01:10:15 +0000 2000 If nn.Contains("created_at") Then PostDate = nn("created_at").Value Else PostDate = String.Empty + If Not CheckDatesLimit(PostDate, Declarations.DateProvider) Then Exit Sub If Not _TempPostsList.Contains(PostID) Then NewPostDetected = True diff --git a/SCrawler/Download/ActiveDownloadingProgress.vb b/SCrawler/Download/ActiveDownloadingProgress.vb index 858416f..06cc470 100644 --- a/SCrawler/Download/ActiveDownloadingProgress.vb +++ b/SCrawler/Download/ActiveDownloadingProgress.vb @@ -14,6 +14,7 @@ Namespace DownloadObjects Private MyView As FormsView Friend Property Opened As Boolean = False Private ReadOnly JobsList As List(Of DownloadProgress) + Friend Property DisableProgressChange As Boolean = False Friend Sub New() InitializeComponent() JobsList = New List(Of DownloadProgress) @@ -66,7 +67,11 @@ Namespace DownloadObjects TP_MAIN.Refresh() End Sub Private Sub Jobs_OnTotalCountChange() - If JobsList.Count > 0 Then MainProgress.TotalCount = JobsList.Sum(Function(j) CLng(j.Job.Progress.TotalCount)) + If JobsList.Count > 0 And Not DisableProgressChange Then + MainProgress.TotalCount = JobsList.Sum(Function(j) CLng(j.Job.Progress.TotalCount)) + MainProgress.CurrentCounter = Math.Max(JobsList.Sum(Function(j) CLng(j.Job.Progress.CurrentCounter)) - 1, 0) + If MainProgress.CurrentCounter > 0 Then MainProgress.Perform() + End If End Sub End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Download/TDownloader.vb b/SCrawler/Download/TDownloader.vb index 581096e..c5de187 100644 --- a/SCrawler/Download/TDownloader.vb +++ b/SCrawler/Download/TDownloader.vb @@ -217,7 +217,9 @@ Namespace DownloadObjects Private Sub JobsChecker() Try MainProgress.TotalCount = 0 - Do While Pool.Exists(Function(p) p.Count > 0) + MainProgress.CurrentCounter = 0 + MyProgressForm.DisableProgressChange = False + Do While Pool.Exists(Function(p) p.Count > 0 Or p.Working) For Each j As Job In Pool If j.Count > 0 And Not j.Working Then j.Start(New ThreadStart(Sub() StartDownloading(j))) Next @@ -231,6 +233,7 @@ Namespace DownloadObjects .InformationTemporary = "All data downloaded" .Enabled(EOptions.ProgressBar) = False End With + MyProgressForm.DisableProgressChange = True If Pool.Count > 0 Then Pool.ForEach(Sub(p) If Not p.Progress Is Nothing Then p.Progress.TotalCount = 0) End Try End Sub diff --git a/SCrawler/Editors/GlobalSettingsForm.Designer.vb b/SCrawler/Editors/GlobalSettingsForm.Designer.vb index d3137f0..53c69f5 100644 --- a/SCrawler/Editors/GlobalSettingsForm.Designer.vb +++ b/SCrawler/Editors/GlobalSettingsForm.Designer.vb @@ -55,6 +55,7 @@ Me.CH_SHOW_NOTIFY = New System.Windows.Forms.CheckBox() Me.CH_FAST_LOAD = New System.Windows.Forms.CheckBox() Me.TXT_FOLDER_CMD = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CH_RECYCLE_DEL = New System.Windows.Forms.CheckBox() Me.CH_COPY_CHANNEL_USER_IMAGE = New System.Windows.Forms.CheckBox() Me.CH_DEF_TEMP = New System.Windows.Forms.CheckBox() Me.CH_DOWN_IMAGES = New System.Windows.Forms.CheckBox() @@ -68,7 +69,6 @@ Me.TXT_CHANNEL_USER_POST_LIMIT = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TAB_MAIN = New System.Windows.Forms.TabControl() Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() - Me.CH_RECYCLE_DEL = New System.Windows.Forms.CheckBox() TP_BASIS = New System.Windows.Forms.TableLayoutPanel() TP_IMAGES = New System.Windows.Forms.TableLayoutPanel() TP_FILE_NAME = New System.Windows.Forms.TableLayoutPanel() @@ -147,7 +147,7 @@ TP_BASIS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) TP_BASIS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_BASIS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_BASIS.Size = New System.Drawing.Size(570, 422) + TP_BASIS.Size = New System.Drawing.Size(570, 447) TP_BASIS.TabIndex = 0 ' 'TXT_GLOBAL_PATH @@ -499,6 +499,17 @@ Me.TXT_FOLDER_CMD.Size = New System.Drawing.Size(562, 22) Me.TXT_FOLDER_CMD.TabIndex = 13 ' + 'CH_RECYCLE_DEL + ' + Me.CH_RECYCLE_DEL.AutoSize = True + Me.CH_RECYCLE_DEL.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_RECYCLE_DEL.Location = New System.Drawing.Point(4, 399) + Me.CH_RECYCLE_DEL.Name = "CH_RECYCLE_DEL" + Me.CH_RECYCLE_DEL.Size = New System.Drawing.Size(562, 19) + Me.CH_RECYCLE_DEL.TabIndex = 14 + Me.CH_RECYCLE_DEL.Text = "Delete data to recycle bin" + Me.CH_RECYCLE_DEL.UseVisualStyleBackColor = True + ' 'CH_COPY_CHANNEL_USER_IMAGE ' Me.CH_COPY_CHANNEL_USER_IMAGE.AutoSize = True @@ -648,7 +659,7 @@ TAB_BASIS.Location = New System.Drawing.Point(4, 22) TAB_BASIS.Name = "TAB_BASIS" TAB_BASIS.Padding = New System.Windows.Forms.Padding(3) - TAB_BASIS.Size = New System.Drawing.Size(576, 428) + TAB_BASIS.Size = New System.Drawing.Size(576, 453) TAB_BASIS.TabIndex = 0 TAB_BASIS.Text = "Basis" ' @@ -658,7 +669,7 @@ TAB_DEFAULTS.Location = New System.Drawing.Point(4, 22) TAB_DEFAULTS.Name = "TAB_DEFAULTS" TAB_DEFAULTS.Padding = New System.Windows.Forms.Padding(3) - TAB_DEFAULTS.Size = New System.Drawing.Size(576, 426) + TAB_DEFAULTS.Size = New System.Drawing.Size(576, 453) TAB_DEFAULTS.TabIndex = 1 TAB_DEFAULTS.Text = "Defaults" ' @@ -682,7 +693,7 @@ TP_DEFS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_DEFS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_DEFS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_DEFS.Size = New System.Drawing.Size(570, 420) + TP_DEFS.Size = New System.Drawing.Size(570, 447) TP_DEFS.TabIndex = 0 ' 'TAB_DEFS_CHANNELS @@ -691,7 +702,7 @@ TAB_DEFS_CHANNELS.Location = New System.Drawing.Point(4, 22) TAB_DEFS_CHANNELS.Name = "TAB_DEFS_CHANNELS" TAB_DEFS_CHANNELS.Padding = New System.Windows.Forms.Padding(3) - TAB_DEFS_CHANNELS.Size = New System.Drawing.Size(576, 426) + TAB_DEFS_CHANNELS.Size = New System.Drawing.Size(576, 453) TAB_DEFS_CHANNELS.TabIndex = 4 TAB_DEFS_CHANNELS.Text = "Channels" ' @@ -715,7 +726,7 @@ TP_CHANNELS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_CHANNELS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_CHANNELS.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_CHANNELS.Size = New System.Drawing.Size(570, 420) + TP_CHANNELS.Size = New System.Drawing.Size(570, 447) TP_CHANNELS.TabIndex = 0 ' 'TXT_CHANNEL_USER_POST_LIMIT @@ -747,7 +758,7 @@ Me.TAB_MAIN.Location = New System.Drawing.Point(0, 0) Me.TAB_MAIN.Name = "TAB_MAIN" Me.TAB_MAIN.SelectedIndex = 0 - Me.TAB_MAIN.Size = New System.Drawing.Size(584, 454) + Me.TAB_MAIN.Size = New System.Drawing.Size(584, 479) Me.TAB_MAIN.TabIndex = 1 ' 'CONTAINER_MAIN @@ -756,7 +767,7 @@ 'CONTAINER_MAIN.ContentPanel ' Me.CONTAINER_MAIN.ContentPanel.Controls.Add(Me.TAB_MAIN) - Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(584, 454) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(584, 479) Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) @@ -766,17 +777,6 @@ Me.CONTAINER_MAIN.TabIndex = 0 Me.CONTAINER_MAIN.TopToolStripPanelVisible = False ' - 'CH_RECYCLE_DEL - ' - Me.CH_RECYCLE_DEL.AutoSize = True - Me.CH_RECYCLE_DEL.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_RECYCLE_DEL.Location = New System.Drawing.Point(4, 399) - Me.CH_RECYCLE_DEL.Name = "CH_RECYCLE_DEL" - Me.CH_RECYCLE_DEL.Size = New System.Drawing.Size(562, 19) - Me.CH_RECYCLE_DEL.TabIndex = 14 - Me.CH_RECYCLE_DEL.Text = "Delete data to recycle bin" - Me.CH_RECYCLE_DEL.UseVisualStyleBackColor = True - ' 'GlobalSettingsForm ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) diff --git a/SCrawler/Editors/SiteEditorForm.Designer.vb b/SCrawler/Editors/SiteEditorForm.Designer.vb index 8831353..b7ef02b 100644 --- a/SCrawler/Editors/SiteEditorForm.Designer.vb +++ b/SCrawler/Editors/SiteEditorForm.Designer.vb @@ -14,13 +14,13 @@ Private components As System.ComponentModel.IContainer Private Sub InitializeComponent() - Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(SiteEditorForm)) - Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton5 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton10 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton11 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton12 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Me.TP_MAIN = New System.Windows.Forms.TableLayoutPanel() Me.TXT_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_COOKIES = New PersonalUtilities.Forms.Controls.TextBoxExtended() @@ -59,14 +59,14 @@ ' 'TXT_PATH ' - ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) - ActionButton1.Index = 0 - ActionButton1.Name = "BTT_OPEN" - ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) - ActionButton2.Index = 1 - ActionButton2.Name = "BTT_CLEAR" - Me.TXT_PATH.Buttons.Add(ActionButton1) - Me.TXT_PATH.Buttons.Add(ActionButton2) + ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image) + ActionButton7.Index = 0 + ActionButton7.Name = "BTT_OPEN" + ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image) + ActionButton8.Index = 1 + ActionButton8.Name = "BTT_CLEAR" + Me.TXT_PATH.Buttons.Add(ActionButton7) + Me.TXT_PATH.Buttons.Add(ActionButton8) Me.TXT_PATH.CaptionText = "Path" Me.TXT_PATH.CaptionToolTipEnabled = True Me.TXT_PATH.CaptionToolTipText = "Specific path to store Twitter files" @@ -78,14 +78,14 @@ ' 'TXT_COOKIES ' - ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) - ActionButton3.Index = 0 - ActionButton3.Name = "BTT_EDIT" - ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image) - ActionButton4.Index = 1 - ActionButton4.Name = "BTT_CLEAR" - Me.TXT_COOKIES.Buttons.Add(ActionButton3) - Me.TXT_COOKIES.Buttons.Add(ActionButton4) + ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image) + ActionButton9.Index = 0 + ActionButton9.Name = "BTT_EDIT" + ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image) + ActionButton10.Index = 1 + ActionButton10.Name = "BTT_CLEAR" + Me.TXT_COOKIES.Buttons.Add(ActionButton9) + Me.TXT_COOKIES.Buttons.Add(ActionButton10) Me.TXT_COOKIES.CaptionText = "Cookies" Me.TXT_COOKIES.ClearTextByButtonClear = False Me.TXT_COOKIES.Dock = System.Windows.Forms.DockStyle.Fill @@ -114,14 +114,14 @@ ' 'TXT_PATH_SAVED_POSTS ' - ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image) - ActionButton5.Index = 0 - ActionButton5.Name = "BTT_OPEN" - ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image) - ActionButton6.Index = 1 - ActionButton6.Name = "BTT_CLEAR" - Me.TXT_PATH_SAVED_POSTS.Buttons.Add(ActionButton5) - Me.TXT_PATH_SAVED_POSTS.Buttons.Add(ActionButton6) + ActionButton11.BackgroundImage = CType(resources.GetObject("ActionButton11.BackgroundImage"), System.Drawing.Image) + ActionButton11.Index = 0 + ActionButton11.Name = "BTT_OPEN" + ActionButton12.BackgroundImage = CType(resources.GetObject("ActionButton12.BackgroundImage"), System.Drawing.Image) + ActionButton12.Index = 1 + ActionButton12.Name = "BTT_CLEAR" + Me.TXT_PATH_SAVED_POSTS.Buttons.Add(ActionButton11) + Me.TXT_PATH_SAVED_POSTS.Buttons.Add(ActionButton12) Me.TXT_PATH_SAVED_POSTS.CaptionText = "Saved posts path" Me.TXT_PATH_SAVED_POSTS.Dock = System.Windows.Forms.DockStyle.Fill Me.TXT_PATH_SAVED_POSTS.Location = New System.Drawing.Point(3, 31) diff --git a/SCrawler/Editors/SiteEditorForm.resx b/SCrawler/Editors/SiteEditorForm.resx index 4fea2ed..9b002d8 100644 --- a/SCrawler/Editors/SiteEditorForm.resx +++ b/SCrawler/Editors/SiteEditorForm.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -129,7 +129,7 @@ cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -137,7 +137,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH DwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAAKOWlDQ1BQaG90b3Nob3AgSUNDIHByb2Zp @@ -195,7 +195,7 @@ AAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -203,7 +203,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -214,7 +214,7 @@ cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go diff --git a/SCrawler/Editors/SiteEditorForm.vb b/SCrawler/Editors/SiteEditorForm.vb index e28a49f..87c205f 100644 --- a/SCrawler/Editors/SiteEditorForm.vb +++ b/SCrawler/Editors/SiteEditorForm.vb @@ -11,6 +11,7 @@ Imports PersonalUtilities.Forms.Controls Imports PersonalUtilities.Forms.Controls.Base Imports PersonalUtilities.Forms.Toolbars Imports PersonalUtilities.Tools.WEB +Imports CookieControl = PersonalUtilities.Tools.WEB.CookieListForm.CookieControl Imports SCrawler.Plugin Imports SCrawler.Plugin.Hosts Namespace Editors @@ -43,8 +44,6 @@ Namespace Editors LBL_OTHER = New Label With {.Text = "Other Parameters", .TextAlign = ContentAlignment.MiddleCenter, .Dock = DockStyle.Fill} End Sub Private Sub SiteEditorForm_Load(sender As Object, e As EventArgs) Handles Me.Load - Const LBorder% = 3 - Const DOffset% = 100 Try With MyDefs .MyViewInitialize(Me, Settings.Design, True) @@ -72,7 +71,7 @@ Namespace Editors End With If .PropList.Count > 0 Then - Dim offset% = DOffset + Dim offset% = PropertyValueHost.LeftOffsetDefault Dim h% = 0, c% = 0 Dim laAdded As Boolean = False Dim loAdded As Boolean = False @@ -109,7 +108,7 @@ Namespace Editors .CreateControl() AddTpControl(.Control, .ControlHeight) - If .Options.LeftOffset > offset Then offset = .Options.LeftOffset + If .LeftOffset > offset Then offset = .LeftOffset If Not .Options.AllowNull Or Not .ProviderFieldsChecker Is Nothing Then MyDefs.MyFieldsChecker.AddControl(.Control, .Options.ControlText, .Type, .Options.AllowNull, .ProviderFieldsChecker) End If @@ -120,13 +119,12 @@ Namespace Editors Next SpecialButton = .GetSettingsButtonInternal If Not SpecialButton Is Nothing Then AddTpControl(SpecialButton, 28) - offset -= LBorder TP_SITE_PROPS.BaseControlsPadding = New Padding(offset, 0, 0, 0) - If offset > DOffset - LBorder Then - TXT_PATH.CaptionWidth = offset - TXT_PATH_SAVED_POSTS.CaptionWidth = offset - TXT_COOKIES.CaptionWidth = offset - End If + offset += PaddingE.GetOf({TP_SITE_PROPS}).Left + TXT_PATH.CaptionWidth = offset + TXT_PATH_SAVED_POSTS.CaptionWidth = offset + TXT_COOKIES.CaptionWidth = offset + CH_GET_USER_MEDIA_ONLY.Padding = New PaddingE(CH_GET_USER_MEDIA_ONLY.Padding) With {.Left = offset} If c > 0 Or Not Host.IsMyClass Then Dim ss As New Size(Size.Width, Size.Height + h + c) MinimumSize = ss @@ -183,6 +181,8 @@ Namespace Editors .GetUserMediaOnly.Value = CH_GET_USER_MEDIA_ONLY.Checked If .PropList.Count > 0 Then .PropList.ForEach(Sub(p) If Not p.Options Is Nothing Then p.UpdateValueByControl()) + + .Source.Update() End With End If @@ -209,7 +209,12 @@ Namespace Editors Private Sub TXT_COOKIES_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_COOKIES.ActionOnButtonClick If Sender.DefaultButton = ActionButton.DefaultButtons.Edit Then If TypeOf Host.Source Is IResponserContainer Then - Using f As New CookieListForm(DirectCast(Host.Source, IResponserContainer).Responser.Cookies) With {.MyDesignXML = Settings.Design} : f.ShowDialog() : End Using + Using f As New CookieListForm(DirectCast(Host.Source, IResponserContainer).Responser) With { + .MyDesignXML = Settings.Design, + .DisableControls = CookieControl.AddFromInternal + CookieControl.AuthorizeProgram + CookieControl.OpenBrowser + } + f.ShowDialog() + End Using SetCookieText() End If End If diff --git a/SCrawler/FDatePickerForm.vb b/SCrawler/FDatePickerForm.vb index 2b8b835..b71edbe 100644 --- a/SCrawler/FDatePickerForm.vb +++ b/SCrawler/FDatePickerForm.vb @@ -15,8 +15,10 @@ Friend Class FDatePickerForm : Implements IOkCancelDeleteToolbar If DT.Checked Then Return DT.Value.Date Else Return Nothing End Get End Property - Friend Sub New() + Private ReadOnly _InitialValue As Date? + Friend Sub New(ByVal d As Date?) InitializeComponent() + _InitialValue = d End Sub Private Sub FDatePickerForm_Load(sender As Object, e As EventArgs) Handles Me.Load Try @@ -25,9 +27,9 @@ Friend Class FDatePickerForm : Implements IOkCancelDeleteToolbar .MyViewInitialize(Me, Settings.Design, True) .AddOkCancelToolbar() .DelegateClosingChecker() - If Settings.LastUpdatedDate.HasValue Then + If _InitialValue.HasValue Then DT.Checked = True - DT.Value = Settings.LastUpdatedDate.Value.Date + DT.Value = _InitialValue.Value.Date Else DT.Checked = False End If diff --git a/SCrawler/ListImagesLoader.vb b/SCrawler/ListImagesLoader.vb index 7ddfa1a..fabb068 100644 --- a/SCrawler/ListImagesLoader.vb +++ b/SCrawler/ListImagesLoader.vb @@ -171,17 +171,24 @@ Friend Class ListImagesLoader End If End Function Private Function GetUsersWithImages() As List(Of UserOption) - Dim t As New List(Of Task) - Dim l As New List(Of UserOption) - For Each u As IUserData In Settings.Users - If u.FitToAddParams Then t.Add(Task.Run(Sub() l.Add(New UserOption(u, MyList, True)))) - Next - If t.Count > 0 Then Task.WaitAll(t.ToArray) : t.Clear() - If l.Count > 0 Then - For i% = 0 To l.Count - 1 - If l(i).Image Is Nothing Then l(i).UpdateImage() + Try + Dim t As New List(Of Task) + Dim l As New List(Of UserOption) + For Each u As IUserData In Settings.Users + If u.FitToAddParams Then t.Add(Task.Run(Sub() l.Add(New UserOption(u, MyList, True)))) Next - End If - Return l + If t.Count > 0 Then Task.WaitAll(t.ToArray) : t.Clear() + If l.Count > 0 Then + For i% = 0 To l.Count - 1 + If l(i).Image Is Nothing Then l(i).UpdateImage() + Next + End If + Return l + Catch ex As Exception + Return ErrorsDescriber.Execute(EDP.LogMessageValue, ex, + "Image fast loading error." & vbCr & + "Click the ""Refresh"" button to manually refresh the user list." & vbCr & + "[ListImagesLoader.GetUsersWithImages]") + End Try End Function End Class \ No newline at end of file diff --git a/SCrawler/MainFrame.Designer.vb b/SCrawler/MainFrame.Designer.vb index 3042f43..fa127f2 100644 --- a/SCrawler/MainFrame.Designer.vb +++ b/SCrawler/MainFrame.Designer.vb @@ -65,6 +65,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Me.BTT_VERSION_INFO = New System.Windows.Forms.ToolStripButton() Me.BTT_DONATE = New System.Windows.Forms.ToolStripButton() Me.Toolbar_BOTTOM = New System.Windows.Forms.StatusStrip() + Me.BTT_PR_INFO = New System.Windows.Forms.ToolStripStatusLabel() Me.PR_MAIN = New System.Windows.Forms.ToolStripProgressBar() Me.LBL_JOBS_COUNT = New System.Windows.Forms.ToolStripStatusLabel() Me.LBL_STATUS = New System.Windows.Forms.ToolStripStatusLabel() @@ -90,7 +91,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Me.TRAY_CONTEXT = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.BTT_TRAY_SHOW_HIDE = New System.Windows.Forms.ToolStripMenuItem() Me.BTT_TRAY_CLOSE = New System.Windows.Forms.ToolStripMenuItem() - Me.BTT_PR_INFO = New System.Windows.Forms.ToolStripStatusLabel() + Me.BTT_CONTEXT_DOWN_DATE_LIMIT = New System.Windows.Forms.ToolStripMenuItem() SEP_1 = New System.Windows.Forms.ToolStripSeparator() SEP_2 = New System.Windows.Forms.ToolStripSeparator() CONTEXT_SEP_1 = New System.Windows.Forms.ToolStripSeparator() @@ -466,6 +467,14 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Me.Toolbar_BOTTOM.Size = New System.Drawing.Size(934, 22) Me.Toolbar_BOTTOM.TabIndex = 2 ' + 'BTT_PR_INFO + ' + Me.BTT_PR_INFO.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image + Me.BTT_PR_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32 + Me.BTT_PR_INFO.Name = "BTT_PR_INFO" + Me.BTT_PR_INFO.Padding = New System.Windows.Forms.Padding(0, 0, 3, 0) + Me.BTT_PR_INFO.Size = New System.Drawing.Size(19, 17) + ' 'PR_MAIN ' Me.PR_MAIN.Name = "PR_MAIN" @@ -503,9 +512,9 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form ' 'USER_CONTEXT ' - Me.USER_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.BTT_CONTEXT_DOWN_LIMITED, Me.BTT_CONTEXT_EDIT, Me.BTT_CONTEXT_DELETE, CONTEXT_SEP_1, Me.BTT_CONTEXT_FAV, Me.BTT_CONTEXT_TEMP, Me.BTT_CONTEXT_READY, Me.BTT_CONTEXT_GROUPS, Me.BTT_CONTEXT_ADD_TO_COL, Me.BTT_CONTEXT_COL_MERGE, Me.BTT_CONTEXT_CHANGE_FOLDER, CONTEXT_SEP_2, Me.BTT_CHANGE_IMAGE, CONTEXT_SEP_3, Me.BTT_CONTEXT_OPEN_PATH, CONTEXT_SEP_4, Me.BTT_CONTEXT_OPEN_SITE, CONTEXT_SEP_5, Me.BTT_CONTEXT_INFO}) + Me.USER_CONTEXT.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.BTT_CONTEXT_DOWN, Me.BTT_CONTEXT_DOWN_LIMITED, Me.BTT_CONTEXT_DOWN_DATE_LIMIT, Me.BTT_CONTEXT_EDIT, Me.BTT_CONTEXT_DELETE, CONTEXT_SEP_1, Me.BTT_CONTEXT_FAV, Me.BTT_CONTEXT_TEMP, Me.BTT_CONTEXT_READY, Me.BTT_CONTEXT_GROUPS, Me.BTT_CONTEXT_ADD_TO_COL, Me.BTT_CONTEXT_COL_MERGE, Me.BTT_CONTEXT_CHANGE_FOLDER, CONTEXT_SEP_2, Me.BTT_CHANGE_IMAGE, CONTEXT_SEP_3, Me.BTT_CONTEXT_OPEN_PATH, CONTEXT_SEP_4, Me.BTT_CONTEXT_OPEN_SITE, CONTEXT_SEP_5, Me.BTT_CONTEXT_INFO}) Me.USER_CONTEXT.Name = "USER_CONTEXT" - Me.USER_CONTEXT.Size = New System.Drawing.Size(222, 364) + Me.USER_CONTEXT.Size = New System.Drawing.Size(222, 408) ' 'BTT_CONTEXT_DOWN ' @@ -641,13 +650,12 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Me.BTT_TRAY_CLOSE.Size = New System.Drawing.Size(133, 22) Me.BTT_TRAY_CLOSE.Text = "Close" ' - 'BTT_PR_INFO + 'BTT_CONTEXT_DOWN_DATE_LIMIT ' - Me.BTT_PR_INFO.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image - Me.BTT_PR_INFO.Image = Global.SCrawler.My.Resources.Resources.InfoPic_32 - Me.BTT_PR_INFO.Name = "BTT_PR_INFO" - Me.BTT_PR_INFO.Padding = New System.Windows.Forms.Padding(0, 0, 3, 0) - Me.BTT_PR_INFO.Size = New System.Drawing.Size(19, 17) + Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Image = Global.SCrawler.My.Resources.Resources.StartPic_01_Green_16 + Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Name = "BTT_CONTEXT_DOWN_DATE_LIMIT" + Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Size = New System.Drawing.Size(221, 22) + Me.BTT_CONTEXT_DOWN_DATE_LIMIT.Text = "Download data to the date" ' 'MainFrame ' @@ -733,4 +741,5 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Private WithEvents COL_DEF As ColumnHeader Private WithEvents MENU_SETTINGS As ToolStripDropDownButton Private WithEvents BTT_PR_INFO As ToolStripStatusLabel + Private WithEvents BTT_CONTEXT_DOWN_DATE_LIMIT As ToolStripMenuItem End Class \ No newline at end of file diff --git a/SCrawler/MainFrame.resx b/SCrawler/MainFrame.resx index 49f5134..d639308 100644 --- a/SCrawler/MainFrame.resx +++ b/SCrawler/MainFrame.resx @@ -306,35 +306,6 @@ 623, 17 - - - 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 @@ -499,6 +470,35 @@ AAAAAAAAH/8AAAAAAAA//wAAAAAAAH//AAAAAAAA//8AAAAAAAP//wAAAAAAB///AAAAAAAP//8AAAAA AB///wAAAAAAf///AAAAAAH///8AAAAAB////wAAAAAf////AAAAAP////8AAAAH/////wAAAH////// AAA= + + + + + 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 diff --git a/SCrawler/MainFrame.vb b/SCrawler/MainFrame.vb index f20fe77..52e6f69 100644 --- a/SCrawler/MainFrame.vb +++ b/SCrawler/MainFrame.vb @@ -218,7 +218,7 @@ CloseResume: Using f As New GlobalSettingsForm f.ShowDialog() If f.DialogResult = DialogResult.OK Then - If Not Settings.MaxLargeImageHeigh = mhl Or Not Settings.MaxSmallImageHeigh = mhs Then RefillList() + If (Not Settings.MaxLargeImageHeigh = mhl Or Not Settings.MaxSmallImageHeigh = mhs) And Settings.ViewModeIsPicture Then RefillList() TrayIcon.Visible = Settings.CloseToTray End If End Using @@ -309,7 +309,7 @@ CloseResume: #End Region #Region "Download" Private Sub BTT_DOWN_SELECTED_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_SELECTED.Click - DownloadSelectedUser(False) + DownloadSelectedUser(DownUserLimits.None) End Sub Private Sub BTT_DOWN_ALL_Click(sender As Object, e As EventArgs) Handles BTT_DOWN_ALL.Click Downloader.AddRange(Settings.Users.Where(Function(u) u.ReadyForDownload)) @@ -472,7 +472,7 @@ CloseResume: End With Settings.LastUpdatedDate = d End Sub - Using f As New FDatePickerForm + Using f As New FDatePickerForm(Settings.LastUpdatedDate) f.ShowDialog() Select Case f.DialogResult Case DialogResult.Abort : snd(Nothing) @@ -487,7 +487,7 @@ CloseResume: MyMainLOG_ShowForm(Settings.Design) End Sub Private Sub BTT_DONATE_Click(sender As Object, e As EventArgs) Handles BTT_DONATE.Click - Try : Process.Start("https://github.com/AAndyProgram/SCrawler/HowToSupport.md") : Catch : End Try + Try : Process.Start("https://github.com/AAndyProgram/SCrawler/blob/main/HowToSupport.md") : Catch : End Try End Sub #Region "List functions" Private _LatestSelected As Integer = -1 @@ -506,10 +506,13 @@ CloseResume: End Sub #Region "Context" Private Sub BTT_CONTEXT_DOWN_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DOWN.Click - DownloadSelectedUser(False) + DownloadSelectedUser(DownUserLimits.None) End Sub Private Sub BTT_CONTEXT_DOWN_LIMITED_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DOWN_LIMITED.Click - DownloadSelectedUser(True) + DownloadSelectedUser(DownUserLimits.Number) + End Sub + Private Sub BTT_CONTEXT_DOWN_DATE_LIMIT_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_DOWN_DATE_LIMIT.Click + DownloadSelectedUser(DownUserLimits.Date) End Sub Private Sub BTT_CONTEXT_EDIT_Click(sender As Object, e As EventArgs) Handles BTT_CONTEXT_EDIT.Click EditSelectedUser() @@ -925,18 +928,20 @@ CloseResume: If .Count > 0 AndAlso .ContainsKey(User.Key) Then .RemoveByKey(User.Key) End With End Sub - Private Sub DownloadSelectedUser(ByVal UseLimits As Boolean) + Private Enum DownUserLimits : None : Number : [Date] : End Enum + Private Sub DownloadSelectedUser(ByVal UseLimits As DownUserLimits) Dim users As List(Of IUserData) = GetSelectedUserArray() If users.ListExists Then Dim l%? = Nothing - If UseLimits Then + Dim d As Date? = Nothing + If UseLimits = DownUserLimits.Number Then Do l = AConvert(Of Integer)(InputBoxE("Enter top posts limit for downloading:", "Download limit", 10), AModes.Var, Nothing) If l.HasValue Then Select Case MsgBoxE(New MMessage($"You are set up downloading top [{l.Value}] posts", "Download limit", {"Confirm", "Try again", "Disable limit", "Cancel"}) With {.ButtonsPerRow = 2}).Index Case 0 : Exit Do - Case 2 : l = Nothing + Case 2 : l = Nothing : Exit Do Case 3 : GoTo CancelDownloadingOperation End Select Else @@ -946,6 +951,32 @@ CloseResume: End Select End If Loop + ElseIf UseLimits = DownUserLimits.Date Then + Do + Using fd As New FDatePickerForm(Nothing) + fd.ShowDialog() + If fd.DialogResult = DialogResult.OK Then + d = fd.SelectedDate + ElseIf fd.DialogResult = DialogResult.Abort Then + d = Nothing + End If + End Using + If d.HasValue Then + Select Case MsgBoxE(New MMessage($"You are set up downloading posts until [{d.Value.Date.ToStringDate(ADateTime.Formats.BaseDate)}]", + "Download limit", + {"Confirm", "Try again", "Disable limit", "Cancel"}) With {.ButtonsPerRow = 2}).Index + Case 0 : Exit Do + Case 2 : d = Nothing : Exit Do + Case 3 : GoTo CancelDownloadingOperation + End Select + Else + Select Case MsgBoxE({"You are not set up a date limit", "Download limit"},,,, {"Confirm", "Try again", "Cancel"}).Index + Case 0 : Exit Do + Case 2 : GoTo CancelDownloadingOperation + End Select + End If + + Loop End If If USER_CONTEXT.Visible Then USER_CONTEXT.Hide() GoTo ResumeDownloadingOperation @@ -955,6 +986,7 @@ CancelDownloadingOperation: ResumeDownloadingOperation: If users.Count = 1 Then users(0).DownloadTopCount = l + users(0).DownloadToDate = d Downloader.Add(users(0)) Else Dim uStr$ = users.Select(Function(u) u.ToString()).ListToString(, vbNewLine) diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb index 5b2ca8e..9ad03e5 100644 --- a/SCrawler/My Project/AssemblyInfo.vb +++ b/SCrawler/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler/PluginsEnvironment/Hosts/PropertyValueHost.vb b/SCrawler/PluginsEnvironment/Hosts/PropertyValueHost.vb index 65c0b08..5ecece1 100644 --- a/SCrawler/PluginsEnvironment/Hosts/PropertyValueHost.vb +++ b/SCrawler/PluginsEnvironment/Hosts/PropertyValueHost.vb @@ -15,6 +15,7 @@ Imports SCrawler.Plugin.Attributes Imports System.Reflection Namespace Plugin.Hosts Friend Class PropertyValueHost : Implements IPropertyValue, IComparable(Of PropertyValueHost) + Friend Const LeftOffsetDefault As Integer = 100 Friend Event OnPropertyUpdateRequested(ByVal Sender As PropertyValueHost) Private Event ValueChanged As IPropertyValue.ValueChangedEventHandler Implements IPropertyValue.ValueChanged Private _Type As Type @@ -50,13 +51,13 @@ Namespace Plugin.Hosts Else DirectCast(Control, CheckBox).Checked = CBool(AConvert(Of Boolean)(Value, False)) End If - If .LeftOffset > 0 Then Control.Padding = New PaddingE(Control.Padding) With {.Left = Options.LeftOffset} + Control.Padding = New PaddingE(Control.Padding) With {.Left = LeftOffset} Else Control = New TextBoxExtended With DirectCast(Control, TextBoxExtended) .CaptionText = Options.ControlText .CaptionToolTipEnabled = Not Options.ControlToolTip.IsEmptyString - If Options.LeftOffset > 0 Then .CaptionWidth = Options.LeftOffset + .CaptionWidth = LeftOffset If Not Options.ControlToolTip.IsEmptyString Then .CaptionToolTipText = Options.ControlToolTip : .CaptionToolTipEnabled = True .Text = CStr(AConvert(Of String)(Value, String.Empty)) With .Buttons @@ -117,6 +118,19 @@ Namespace Plugin.Hosts Friend ReadOnly Name As String Private ReadOnly _XmlName As String Friend ReadOnly Options As PropertyOption + Private _LeftOffset As Integer? = Nothing + Friend Property LeftOffset As Integer + Get + If _LeftOffset.HasValue Then + Return _LeftOffset + Else + Return If(Options?.LeftOffset, LeftOffsetDefault) + End If + End Get + Set(ByVal NewOffset As Integer) + _LeftOffset = NewOffset + End Set + End Property #Region "Providers" Friend Property ProviderFieldsChecker As IFormatProvider Friend Property ProviderValue As IFormatProvider diff --git a/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb b/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb index ece23ad..84dc48a 100644 --- a/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb +++ b/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb @@ -244,8 +244,10 @@ Namespace Plugin.Hosts GetUserMediaOnly = New XMLValue(Of Boolean)("GetUserMediaOnly", True, _XML, n) If PropList.Count > 0 Then + Dim MaxOffset% = Math.Max(PropList.Max(Function(pp) pp.LeftOffset), PropertyValueHost.LeftOffsetDefault) For Each p As PropertyValueHost In PropList p.SetXmlEnvironment(_XML, n) + p.LeftOffset = MaxOffset AddHandler p.OnPropertyUpdateRequested, AddressOf PropHost_OnPropertyUpdateRequested Next End If diff --git a/SCrawler/PluginsEnvironment/Hosts/UserDataHost.vb b/SCrawler/PluginsEnvironment/Hosts/UserDataHost.vb index 1cb2659..d17a1e4 100644 --- a/SCrawler/PluginsEnvironment/Hosts/UserDataHost.vb +++ b/SCrawler/PluginsEnvironment/Hosts/UserDataHost.vb @@ -51,6 +51,7 @@ Namespace Plugin.Hosts .SeparateVideoFolder = SeparateVideoFolderF .DataPath = MyFile.CutPath.PathNoSeparator .PostsNumberLimit = DownloadTopCount + .PostsDateLimit = DownloadToDate If _ContentList.Count > 0 Then ExternalPlugin.ExistingContentList = _ContentList.Select(Function(u) u.PluginUserMedia).ToList ExternalPlugin.TempPostsList = ListAddList(Nothing, _TempPostsList)