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 20439a4..f382bcb 100644 Binary files a/ProgramScreenshots/MainContext2.png and b/ProgramScreenshots/MainContext2.png differ 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)