From 7d9255c916dc5b264a59b2f834109735c3cf0742 Mon Sep 17 00:00:00 2001 From: Andy <88590076+AAndyProgram@users.noreply.github.com> Date: Fri, 26 Apr 2024 17:18:31 +0300 Subject: [PATCH] 2024.4.26.0 Add 'CookieValueExtractorAttribute' and the ability to immediately populate fields with values that can be extracted from cookies Feed: add the ability to load the last session of the current day (if it exists) as the current session after restarting SCrawler UserSearchForm: include friendly name matches in search result API.Xhamster: saved posts aren't downloading --- Changelog.md | 13 + ProgramScreenshots/SettingsGlobalFeed.png | Bin 18902 -> 20890 bytes SCrawler/API/Base/Declarations.vb | 8 + SCrawler/API/Instagram/SiteSettings.vb | 6 +- SCrawler/API/JustForFans/SiteSettings.vb | 6 +- SCrawler/API/OnlyFans/SiteSettings.vb | 10 + SCrawler/API/Pinterest/UserData.vb | 2 +- SCrawler/API/ThreadsNet/SiteSettings.vb | 6 +- SCrawler/API/Xhamster/UserData.vb | 7 +- SCrawler/Download/Feed/DownloadFeedForm.vb | 1 + SCrawler/Download/TDownloader.vb | 54 +++- .../Editors/GlobalSettingsForm.Designer.vb | 300 +++++++++++------- SCrawler/Editors/GlobalSettingsForm.resx | 189 ++++++----- SCrawler/Editors/GlobalSettingsForm.vb | 8 + SCrawler/Editors/SiteEditorForm.vb | 6 + SCrawler/My Project/AssemblyInfo.vb | 4 +- .../Attributes/Attributes.vb | 7 + .../Hosts/PropertyValueHost.vb | 24 ++ .../PluginsEnvironment/Hosts/SettingsHost.vb | 17 + SCrawler/SettingsCLS.vb | 3 + SCrawler/UserSearchForm.vb | 6 +- 21 files changed, 466 insertions(+), 211 deletions(-) diff --git a/Changelog.md b/Changelog.md index 5484d6b..7724506 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,16 @@ +# 2024.4.26.0 + +*2024-04-26* + +- Added + - Site settings: the values that can be extracted from cookies immediately populate fields + - Feed: ability to load the last session of the current day (if it exists) as the current session after restarting SCrawler + - Users search: include friendly name matches in search result +- Updated + - gallery-dl up to version **1.26.9** +- Fixed + - xHamster: **saved posts aren't downloading** + # 2024.4.14.0 *2024-04-14* diff --git a/ProgramScreenshots/SettingsGlobalFeed.png b/ProgramScreenshots/SettingsGlobalFeed.png index e0f668647a4a484e1122650e70b0917d2f9d0d63..db6b5b9f440d248fd32369e0d36342f4bb55bf7c 100644 GIT binary patch literal 20890 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 HQ$iB}DL{mo diff --git a/SCrawler/API/Base/Declarations.vb b/SCrawler/API/Base/Declarations.vb index af8c39d..24956b1 100644 --- a/SCrawler/API/Base/Declarations.vb +++ b/SCrawler/API/Base/Declarations.vb @@ -6,6 +6,7 @@ ' ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY +Imports System.Runtime.CompilerServices Imports PersonalUtilities.Forms Imports PersonalUtilities.Functions.RegularExpressions Namespace API.Base @@ -72,5 +73,12 @@ Namespace API.Base $"Current query: [{CurrentQuery}]{vbCr}New query: [{NewQuery}]", "Changing a query"}, vbExclamation,,, {"Process", "Cancel"}) = 0 End Function + Friend Function GetCookieValue(ByVal Cookies As IEnumerable(Of System.Net.Cookie), ByVal CookieName As String) As String + If Cookies.ListExists Then Return If(Cookies.FirstOrDefault(Function(c) c.Name.ToLower = CookieName.ToLower)?.Value, String.Empty) Else Return String.Empty + End Function + Friend Function GetCookieValue(ByVal Cookies As IEnumerable(Of System.Net.Cookie), ByVal CookieName As String, + ByVal PropName As String, ByVal PropNameComp As String) As String + Return If(PropName = PropNameComp, Cookies.GetCookieValue(CookieName), String.Empty) + End Function End Module End Namespace \ No newline at end of file diff --git a/SCrawler/API/Instagram/SiteSettings.vb b/SCrawler/API/Instagram/SiteSettings.vb index b94f456..eb02e4b 100644 --- a/SCrawler/API/Instagram/SiteSettings.vb +++ b/SCrawler/API/Instagram/SiteSettings.vb @@ -65,6 +65,10 @@ Namespace API.Instagram Friend Const Header_Platform_Verion As String = "Sec-Ch-Ua-Platform-Version" Friend ReadOnly Property HH_CSRF_TOKEN As PropertyValue + + Private Function GetValueFromCookies(ByVal PropName As String, ByVal c As CookieKeeper) As String + Return c.GetCookieValue(Header_CSRF_TOKEN_COOKIE, PropName, NameOf(HH_CSRF_TOKEN)) + End Function Friend ReadOnly Property HH_IG_APP_ID As PropertyValue @@ -557,7 +561,7 @@ Namespace API.Instagram If vals.Any(Function(v) Not v.ValueOld = v.ValueNew) OrElse Not Responser.Cookies.ListEquals(____Cookies) Then HH_IG_WWW_CLAIM.Value = 0 : credentialsUpdated = True If Responser.CookiesExists Then - Dim csrf$ = If(Responser.Cookies.FirstOrDefault(Function(c) c.Name.StringToLower = Header_CSRF_TOKEN_COOKIE)?.Value, String.Empty) + Dim csrf$ = GetValueFromCookies(NameOf(HH_CSRF_TOKEN), Responser.Cookies) If Not csrf.IsEmptyString Then If Not AEquals(Of String)(CStr(HH_CSRF_TOKEN.Value), csrf) Then credentialsUpdated = True HH_CSRF_TOKEN.Value = csrf diff --git a/SCrawler/API/JustForFans/SiteSettings.vb b/SCrawler/API/JustForFans/SiteSettings.vb index a0da6a0..db408cf 100644 --- a/SCrawler/API/JustForFans/SiteSettings.vb +++ b/SCrawler/API/JustForFans/SiteSettings.vb @@ -20,6 +20,10 @@ Namespace API.JustForFans Friend ReadOnly Property UserID As PropertyValue Friend ReadOnly Property UserHash4 As PropertyValue + + Private Function GetValueFromCookies(ByVal PropName As String, ByVal c As CookieKeeper) As String + Return c.GetCookieValue(UserHash4_CookieName, PropName, NameOf(UserHash4)) + End Function Friend ReadOnly Property HeaderAccept As PropertyValue @@ -61,7 +65,7 @@ Namespace API.JustForFans Private Sub UpdateUserHash4() If Responser.CookiesExists Then Dim hv_current$ = UserHash4.Value - Dim hv_cookie$ = If(Responser.Cookies.FirstOrDefault(Function(cc) cc.Name.ToLower = UserHash4_CookieName)?.Value, String.Empty) + Dim hv_cookie$ = GetValueFromCookies(NameOf(UserHash4), Responser.Cookies) If Not hv_cookie.IsEmptyString And Not hv_cookie = hv_current And Responser.Cookies.Changed Then UserHash4.Value = hv_cookie End If End Sub diff --git a/SCrawler/API/OnlyFans/SiteSettings.vb b/SCrawler/API/OnlyFans/SiteSettings.vb index 8bfe184..59f7991 100644 --- a/SCrawler/API/OnlyFans/SiteSettings.vb +++ b/SCrawler/API/OnlyFans/SiteSettings.vb @@ -59,6 +59,16 @@ Namespace API.OnlyFans Responser.UserAgent = Value End If End Sub + + Private Function GetValueFromCookies(ByVal PropName As String, ByVal c As CookieKeeper) As String + If c.ListExists Then + Select Case PropName + Case NameOf(HH_USER_ID) : Return c.GetCookieValue("auth_id") + Case NameOf(HH_X_BC) : Return c.GetCookieValue("fp") + End Select + End If + Return String.Empty + End Function #End Region #Region "Rules" Private ReadOnly Property LastDateUpdated_XML As PropertyValue diff --git a/SCrawler/API/Pinterest/UserData.vb b/SCrawler/API/Pinterest/UserData.vb index 6875020..0e64c1e 100644 --- a/SCrawler/API/Pinterest/UserData.vb +++ b/SCrawler/API/Pinterest/UserData.vb @@ -287,7 +287,7 @@ Namespace API.Pinterest End Function End Class Private Function GetDataFromGalleryDL(ByVal URL As String, ByVal IsBoardsRequested As Boolean, ByVal Token As CancellationToken) As List(Of String) - Dim command$ = $"gallery-dl --verbose --simulate " + Dim command$ = $"""{Settings.GalleryDLFile.File}"" --verbose --simulate " Try If Not URL.IsEmptyString Then If MySettings.CookiesNetscapeFile.Exists Then command &= $"--cookies ""{MySettings.CookiesNetscapeFile}"" " diff --git a/SCrawler/API/ThreadsNet/SiteSettings.vb b/SCrawler/API/ThreadsNet/SiteSettings.vb index 8bbfa18..a5df0db 100644 --- a/SCrawler/API/ThreadsNet/SiteSettings.vb +++ b/SCrawler/API/ThreadsNet/SiteSettings.vb @@ -25,6 +25,10 @@ Namespace API.ThreadsNet Return __HH_CSRF_TOKEN End Get End Property + + Private Function GetValueFromCookies(ByVal PropName As String, ByVal c As CookieKeeper) As String + Return c.GetCookieValue(IG.Header_CSRF_TOKEN_COOKIE, PropName, NameOf(HH_CSRF_TOKEN)) + End Function Protected ReadOnly __HH_IG_APP_ID As PropertyValue Friend Overridable ReadOnly Property HH_IG_APP_ID As PropertyValue @@ -195,7 +199,7 @@ Namespace API.ThreadsNet End Sub Friend Overrides Sub Update() If _SiteEditorFormOpened And Responser.CookiesExists Then - Dim csrf$ = If(Responser.Cookies.FirstOrDefault(Function(c) c.Name.StringToLower = IG.Header_CSRF_TOKEN_COOKIE)?.Value, String.Empty) + Dim csrf$ = GetValueFromCookies(NameOf(HH_CSRF_TOKEN), Responser.Cookies) If Not csrf.IsEmptyString Then HH_CSRF_TOKEN.Value = csrf If Not __Cookies Is Nothing AndAlso Not __Cookies.ListEquals(Responser.Cookies) Then DownloadData_Impl.Value = True End If diff --git a/SCrawler/API/Xhamster/UserData.vb b/SCrawler/API/Xhamster/UserData.vb index 8a210d0..77cb9e2 100644 --- a/SCrawler/API/Xhamster/UserData.vb +++ b/SCrawler/API/Xhamster/UserData.vb @@ -265,7 +265,12 @@ Namespace API.Xhamster Dim checkLimit As Func(Of Boolean) = Function() limit > 0 And SearchPostsCount >= limit And IsVideo If IsSavedPosts Then - containerNodes.Add(If(IsVideo, {"favoriteVideoListComponent", "models"}, {"favoritesGalleriesAndPhotosCollection"})) + If IsVideo Then + containerNodes.Add({"favoriteVideoListComponent", "models"}) + containerNodes.Add({"favoriteVideoListComponent", "videoThumbProps"}) + Else + containerNodes.Add({"favoritesGalleriesAndPhotosCollection"}) + End If ElseIf Not SiteMode = SiteModes.Search Then If IsVideo Then containerNodes.Add({"trendingVideoListComponent", "models"}) diff --git a/SCrawler/Download/Feed/DownloadFeedForm.vb b/SCrawler/Download/Feed/DownloadFeedForm.vb index 1c2e33b..7fc2ad1 100644 --- a/SCrawler/Download/Feed/DownloadFeedForm.vb +++ b/SCrawler/Download/Feed/DownloadFeedForm.vb @@ -173,6 +173,7 @@ Namespace DownloadObjects MENU_DOWN.Visible = OPT_SUBSCRIPTIONS.Checked UpdateSettings() FeedChangeMode(FeedModes.Current) + Downloader.FilesLoadLastSession() RefillList(True, False) .EndLoaderOperations(False) End With diff --git a/SCrawler/Download/TDownloader.vb b/SCrawler/Download/TDownloader.vb index d19fb60..372e749 100644 --- a/SCrawler/Download/TDownloader.vb +++ b/SCrawler/Download/TDownloader.vb @@ -116,8 +116,10 @@ Namespace DownloadObjects Friend Const SessionsPath As String = "Settings\Sessions\" Private _FilesSessionCleared As Boolean = False Private _FilesSessionActual As SFile = Nothing + Private _FilesSessionChecked As Boolean = False Friend ReadOnly Property FilesSessionActual(Optional ByVal GenerateFileName As Boolean = True) As SFile Get + FilesLoadLastSession() If _FilesSessionActual.IsEmptyString And GenerateFileName Then _ _FilesSessionActual = $"{SessionsPath}{AConvert(Of String)(Now, SessionDateTimeProvider)}.xml" Return _FilesSessionActual @@ -146,6 +148,47 @@ Namespace DownloadObjects _FilesSaving = False End Try End Function + Private _FilesSessionChecked_Impl As Boolean = False + Friend Sub FilesLoadLastSession() + Try + If Not _FilesSessionChecked And Not _FilesSessionChecked_Impl And _FilesSessionActual.IsEmptyString Then + _FilesSessionChecked = True + _FilesSessionChecked_Impl = True + Dim settingValue% = Settings.FeedCurrentTryLoadLastSession + If settingValue >= 0 Then + Dim startTime As Date = Process.GetCurrentProcess.StartTime + Dim files As List(Of SFile) = SFile.GetFiles(SessionsPath.CSFileP, "*.xml",, EDP.ReturnValue) + If files.ListExists Then files.RemoveAll(Settings.Feeds.FeedSpecialRemover) + If files.ListExists Then + Dim nd$ = Now.ToString("yyyyMMdd") + files.RemoveAll(Function(f) Not f.Name.StartsWith(nd)) + End If + If files.ListExists Then + files.Sort() + Dim lastDate As Date = AConvert(Of Date)(files.Last.Name, SessionDateTimeProvider) + If lastDate.Date = startTime.Date Then + Dim __files As New List(Of UserMediaD) + Using x As New XmlFile(files.Last, Protector.Modes.All, False) With {.AllowSameNames = True, .XmlReadOnly = True} + x.LoadData() + If x.Count > 0 Then __files.ListAddList(x, LAP.IgnoreICopier) + If __files.Count > 0 AndAlso (settingValue = 0 OrElse + (startTime - {lastDate, __files.Max(Function(f) f.Date)}.Max).TotalMinutes <= settingValue) Then + _Session = __files.Max(Function(f) f.Session) + Me.Files.AddRange(__files) + _FilesSessionActual = files.Last + End If + __files.Clear() + End Using + End If + End If + End If + _FilesSessionChecked_Impl = False + End If + Catch ex As Exception + _FilesSessionChecked_Impl = False + ErrorsDescriber.Execute(EDP.SendToLog, ex, "[TDownloader.FilesLoadLastSession]") + End Try + End Sub Private _FilesUpdating As Boolean = False Friend Sub FilesUpdatePendingUsers() _FilesUpdating = True @@ -444,7 +487,16 @@ Namespace DownloadObjects End If End Set End Property - Private Session As Integer = 0 + Private _Session As Integer = 0 + Private Property Session As Integer + Get + FilesLoadLastSession() + Return _Session + End Get + Set(ByVal _Session As Integer) + Me._Session = _Session + End Set + End Property Private Sub [Start]() If Not AutoDownloaderWorking AndAlso MyProgressForm.ReadyToOpen AndAlso Pool.LongCount(Function(p) p.Count > 0) > 1 Then MyProgressForm.Show() : MainFrameObj.Focus() If Not If(CheckerThread?.IsAlive, False) Then diff --git a/SCrawler/Editors/GlobalSettingsForm.Designer.vb b/SCrawler/Editors/GlobalSettingsForm.Designer.vb index 176d6fa..031d387 100644 --- a/SCrawler/Editors/GlobalSettingsForm.Designer.vb +++ b/SCrawler/Editors/GlobalSettingsForm.Designer.vb @@ -59,11 +59,12 @@ Namespace Editors Dim TAB_FEED As System.Windows.Forms.TabPage Dim TP_FEED As System.Windows.Forms.TableLayoutPanel Dim TP_FEED_IMG_COUNT As System.Windows.Forms.TableLayoutPanel + Dim TP_FEED_SES As System.Windows.Forms.TableLayoutPanel + Dim ActionButton13 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton14 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim TAB_NOTIFY As System.Windows.Forms.TabPage Dim TP_NOTIFY_MAIN As System.Windows.Forms.TableLayoutPanel Dim TP_ENVIR As System.Windows.Forms.TableLayoutPanel - Dim ActionButton13 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton14 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton15 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton16 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton17 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() @@ -76,23 +77,25 @@ Namespace Editors Dim ActionButton24 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton25 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton26 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton27 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton28 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim TAB_STD As System.Windows.Forms.TabPage Dim TP_STD As System.Windows.Forms.TableLayoutPanel - Dim ActionButton27 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton29 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ListColumn1 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn() Dim ListColumn2 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn() Dim TAB_DESIGN As System.Windows.Forms.TabPage Dim TP_DESIGN As System.Windows.Forms.TableLayoutPanel - Dim ActionButton28 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton29 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton30 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton31 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim TP_HEADERS_DEF As System.Windows.Forms.TableLayoutPanel Dim ActionButton32 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton33 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim TP_HEADERS_DEF As System.Windows.Forms.TableLayoutPanel Dim ActionButton34 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton35 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim ActionButton36 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton37 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton38 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim TAB_HEADERS As System.Windows.Forms.TabPage Me.TXT_GLOBAL_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_IMAGE_LARGE = New PersonalUtilities.Forms.Controls.TextBoxExtended() @@ -169,11 +172,12 @@ Namespace Editors Me.CH_FEED_ENDLESS = New System.Windows.Forms.CheckBox() Me.CH_FEED_ADD_SESSION = New System.Windows.Forms.CheckBox() Me.CH_FEED_ADD_DATE = New System.Windows.Forms.CheckBox() - Me.NUM_FEED_STORE_SESSION_DATA = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_FEED_CENTER_IMAGE = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.COLORS_FEED = New SCrawler.Editors.ColorPicker() Me.CH_FEED_SHOW_FRIENDLY = New System.Windows.Forms.CheckBox() Me.CH_FEED_SHOW_SPEC_MEDIAITEM = New System.Windows.Forms.CheckBox() + Me.NUM_FEED_STORE_SESSION_DATA = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.NUM_FEED_SES_CURR_LOAD_LAST = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_YTDLP = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_FFMPEG = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_CURL = New PersonalUtilities.Forms.Controls.TextBoxExtended() @@ -222,6 +226,7 @@ Namespace Editors TAB_FEED = New System.Windows.Forms.TabPage() TP_FEED = New System.Windows.Forms.TableLayoutPanel() TP_FEED_IMG_COUNT = New System.Windows.Forms.TableLayoutPanel() + TP_FEED_SES = New System.Windows.Forms.TableLayoutPanel() TAB_NOTIFY = New System.Windows.Forms.TabPage() TP_NOTIFY_MAIN = New System.Windows.Forms.TableLayoutPanel() TP_ENVIR = New System.Windows.Forms.TableLayoutPanel() @@ -269,8 +274,10 @@ Namespace Editors TP_FEED_IMG_COUNT.SuspendLayout() CType(Me.TXT_FEED_ROWS, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.TXT_FEED_COLUMNS, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.NUM_FEED_STORE_SESSION_DATA, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.TXT_FEED_CENTER_IMAGE, System.ComponentModel.ISupportInitialize).BeginInit() + TP_FEED_SES.SuspendLayout() + CType(Me.NUM_FEED_STORE_SESSION_DATA, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.NUM_FEED_SES_CURR_LOAD_LAST, System.ComponentModel.ISupportInitialize).BeginInit() TAB_NOTIFY.SuspendLayout() TP_NOTIFY_MAIN.SuspendLayout() TP_ENVIR.SuspendLayout() @@ -1595,13 +1602,13 @@ Namespace Editors TP_FEED.Controls.Add(Me.CH_FEED_ENDLESS, 0, 3) TP_FEED.Controls.Add(Me.CH_FEED_ADD_SESSION, 0, 4) TP_FEED.Controls.Add(Me.CH_FEED_ADD_DATE, 0, 5) - TP_FEED.Controls.Add(Me.NUM_FEED_STORE_SESSION_DATA, 0, 6) TP_FEED.Controls.Add(Me.TXT_FEED_CENTER_IMAGE, 0, 1) TP_FEED.Controls.Add(Me.COLORS_FEED, 0, 2) TP_FEED.Controls.Add(Me.CH_FEED_OPEN_LAST_MODE, 0, 7) TP_FEED.Controls.Add(Me.CH_FEED_SHOW_FRIENDLY, 0, 8) TP_FEED.Controls.Add(Me.CH_FEED_SHOW_SPEC_MEDIAITEM, 0, 9) TP_FEED.Controls.Add(Me.CH_FEED_UP_FILE_LOC_MOVE, 0, 10) + TP_FEED.Controls.Add(TP_FEED_SES, 0, 6) TP_FEED.Dock = System.Windows.Forms.DockStyle.Fill TP_FEED.Location = New System.Drawing.Point(0, 0) TP_FEED.Name = "TP_FEED" @@ -1618,6 +1625,7 @@ Namespace Editors TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) TP_FEED.Size = New System.Drawing.Size(621, 399) TP_FEED.TabIndex = 0 ' @@ -1703,27 +1711,6 @@ Namespace Editors Me.CH_FEED_ADD_DATE.Text = "Add the date to the post title" Me.CH_FEED_ADD_DATE.UseVisualStyleBackColor = True ' - 'NUM_FEED_STORE_SESSION_DATA - ' - Me.NUM_FEED_STORE_SESSION_DATA.CaptionCheckAlign = System.Drawing.ContentAlignment.MiddleLeft - Me.NUM_FEED_STORE_SESSION_DATA.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox - Me.NUM_FEED_STORE_SESSION_DATA.CaptionText = "Store session data" - Me.NUM_FEED_STORE_SESSION_DATA.CaptionTextAlign = System.Drawing.ContentAlignment.MiddleLeft - Me.NUM_FEED_STORE_SESSION_DATA.CaptionToolTipEnabled = True - Me.NUM_FEED_STORE_SESSION_DATA.CaptionToolTipText = "If checked, session data will be stored in an xml file." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "The number indicates the" & - " number of sessions to be saved." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "-1 to save all sessions" - Me.NUM_FEED_STORE_SESSION_DATA.CaptionWidth = 115.0R - Me.NUM_FEED_STORE_SESSION_DATA.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown - Me.NUM_FEED_STORE_SESSION_DATA.Dock = System.Windows.Forms.DockStyle.Fill - Me.NUM_FEED_STORE_SESSION_DATA.Location = New System.Drawing.Point(4, 166) - Me.NUM_FEED_STORE_SESSION_DATA.Name = "NUM_FEED_STORE_SESSION_DATA" - Me.NUM_FEED_STORE_SESSION_DATA.NumberMaximum = New Decimal(New Integer() {100000, 0, 0, 0}) - Me.NUM_FEED_STORE_SESSION_DATA.NumberMinimum = New Decimal(New Integer() {1, 0, 0, -2147483648}) - Me.NUM_FEED_STORE_SESSION_DATA.NumberUpDownAlign = System.Windows.Forms.LeftRightAlignment.Left - Me.NUM_FEED_STORE_SESSION_DATA.Size = New System.Drawing.Size(613, 22) - Me.NUM_FEED_STORE_SESSION_DATA.TabIndex = 6 - Me.NUM_FEED_STORE_SESSION_DATA.Text = "20" - ' 'TXT_FEED_CENTER_IMAGE ' Me.TXT_FEED_CENTER_IMAGE.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox @@ -1778,6 +1765,70 @@ Namespace Editors Me.CH_FEED_SHOW_SPEC_MEDIAITEM.Text = "Show special feeds in media items" Me.CH_FEED_SHOW_SPEC_MEDIAITEM.UseVisualStyleBackColor = True ' + 'TP_FEED_SES + ' + TP_FEED_SES.ColumnCount = 2 + TP_FEED_SES.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_FEED_SES.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_FEED_SES.Controls.Add(Me.NUM_FEED_STORE_SESSION_DATA, 0, 0) + TP_FEED_SES.Controls.Add(Me.NUM_FEED_SES_CURR_LOAD_LAST, 1, 0) + TP_FEED_SES.Dock = System.Windows.Forms.DockStyle.Fill + TP_FEED_SES.Location = New System.Drawing.Point(1, 163) + TP_FEED_SES.Margin = New System.Windows.Forms.Padding(0) + TP_FEED_SES.Name = "TP_FEED_SES" + TP_FEED_SES.RowCount = 1 + TP_FEED_SES.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_FEED_SES.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + TP_FEED_SES.Size = New System.Drawing.Size(619, 28) + TP_FEED_SES.TabIndex = 6 + ' + 'NUM_FEED_STORE_SESSION_DATA + ' + Me.NUM_FEED_STORE_SESSION_DATA.CaptionCheckAlign = System.Drawing.ContentAlignment.MiddleLeft + Me.NUM_FEED_STORE_SESSION_DATA.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox + Me.NUM_FEED_STORE_SESSION_DATA.CaptionText = "Store session data" + Me.NUM_FEED_STORE_SESSION_DATA.CaptionTextAlign = System.Drawing.ContentAlignment.MiddleLeft + Me.NUM_FEED_STORE_SESSION_DATA.CaptionToolTipEnabled = True + Me.NUM_FEED_STORE_SESSION_DATA.CaptionToolTipText = "If checked, session data will be stored in an xml file." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "The number indicates the" & + " number of sessions to be saved." & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "-1 to save all sessions" + Me.NUM_FEED_STORE_SESSION_DATA.CaptionWidth = 115.0R + Me.NUM_FEED_STORE_SESSION_DATA.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown + Me.NUM_FEED_STORE_SESSION_DATA.Dock = System.Windows.Forms.DockStyle.Fill + Me.NUM_FEED_STORE_SESSION_DATA.Location = New System.Drawing.Point(3, 3) + Me.NUM_FEED_STORE_SESSION_DATA.Name = "NUM_FEED_STORE_SESSION_DATA" + Me.NUM_FEED_STORE_SESSION_DATA.NumberMaximum = New Decimal(New Integer() {100000, 0, 0, 0}) + Me.NUM_FEED_STORE_SESSION_DATA.NumberMinimum = New Decimal(New Integer() {1, 0, 0, -2147483648}) + Me.NUM_FEED_STORE_SESSION_DATA.NumberUpDownAlign = System.Windows.Forms.LeftRightAlignment.Left + Me.NUM_FEED_STORE_SESSION_DATA.Size = New System.Drawing.Size(303, 22) + Me.NUM_FEED_STORE_SESSION_DATA.TabIndex = 0 + Me.NUM_FEED_STORE_SESSION_DATA.Text = "20" + ' + 'NUM_FEED_SES_CURR_LOAD_LAST + ' + ActionButton13.BackgroundImage = CType(resources.GetObject("ActionButton13.BackgroundImage"), System.Drawing.Image) + ActionButton13.Name = "Refresh" + ActionButton13.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton14.BackgroundImage = CType(resources.GetObject("ActionButton14.BackgroundImage"), System.Drawing.Image) + ActionButton14.Name = "Clear" + ActionButton14.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.NUM_FEED_SES_CURR_LOAD_LAST.Buttons.Add(ActionButton13) + Me.NUM_FEED_SES_CURR_LOAD_LAST.Buttons.Add(ActionButton14) + Me.NUM_FEED_SES_CURR_LOAD_LAST.CaptionText = "Load last session" + Me.NUM_FEED_SES_CURR_LOAD_LAST.CaptionToolTipEnabled = True + Me.NUM_FEED_SES_CURR_LOAD_LAST.CaptionToolTipText = resources.GetString("NUM_FEED_SES_CURR_LOAD_LAST.CaptionToolTipText") + Me.NUM_FEED_SES_CURR_LOAD_LAST.CaptionWidth = 115.0R + Me.NUM_FEED_SES_CURR_LOAD_LAST.ClearTextByButtonClear = False + Me.NUM_FEED_SES_CURR_LOAD_LAST.ControlMode = PersonalUtilities.Forms.Controls.TextBoxExtended.ControlModes.NumericUpDown + Me.NUM_FEED_SES_CURR_LOAD_LAST.Dock = System.Windows.Forms.DockStyle.Fill + Me.NUM_FEED_SES_CURR_LOAD_LAST.Location = New System.Drawing.Point(312, 3) + Me.NUM_FEED_SES_CURR_LOAD_LAST.Name = "NUM_FEED_SES_CURR_LOAD_LAST" + Me.NUM_FEED_SES_CURR_LOAD_LAST.NumberMaximum = New Decimal(New Integer() {10080, 0, 0, 0}) + Me.NUM_FEED_SES_CURR_LOAD_LAST.NumberMinimum = New Decimal(New Integer() {1, 0, 0, -2147483648}) + Me.NUM_FEED_SES_CURR_LOAD_LAST.NumberUpDownAlign = System.Windows.Forms.LeftRightAlignment.Left + Me.NUM_FEED_SES_CURR_LOAD_LAST.Size = New System.Drawing.Size(304, 22) + Me.NUM_FEED_SES_CURR_LOAD_LAST.TabIndex = 1 + Me.NUM_FEED_SES_CURR_LOAD_LAST.Text = "0" + ' 'TAB_NOTIFY ' TAB_NOTIFY.Controls.Add(TP_NOTIFY_MAIN) @@ -1843,19 +1894,19 @@ Namespace Editors ' 'TXT_YTDLP ' - ActionButton13.BackgroundImage = CType(resources.GetObject("ActionButton13.BackgroundImage"), System.Drawing.Image) - ActionButton13.Name = "Open" - ActionButton13.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open - ActionButton14.BackgroundImage = CType(resources.GetObject("ActionButton14.BackgroundImage"), System.Drawing.Image) - ActionButton14.Name = "Refresh" - ActionButton14.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh - ActionButton14.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" ActionButton15.BackgroundImage = CType(resources.GetObject("ActionButton15.BackgroundImage"), System.Drawing.Image) - ActionButton15.Name = "Clear" - ActionButton15.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_YTDLP.Buttons.Add(ActionButton13) - Me.TXT_YTDLP.Buttons.Add(ActionButton14) + ActionButton15.Name = "Open" + ActionButton15.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton16.BackgroundImage = CType(resources.GetObject("ActionButton16.BackgroundImage"), System.Drawing.Image) + ActionButton16.Name = "Refresh" + ActionButton16.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton16.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" + ActionButton17.BackgroundImage = CType(resources.GetObject("ActionButton17.BackgroundImage"), System.Drawing.Image) + ActionButton17.Name = "Clear" + ActionButton17.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear Me.TXT_YTDLP.Buttons.Add(ActionButton15) + Me.TXT_YTDLP.Buttons.Add(ActionButton16) + Me.TXT_YTDLP.Buttons.Add(ActionButton17) Me.TXT_YTDLP.CaptionText = "yt-dlp" Me.TXT_YTDLP.CaptionToolTipEnabled = True Me.TXT_YTDLP.CaptionToolTipText = "Path to yt-dlp.exe file" @@ -1869,19 +1920,19 @@ Namespace Editors ' 'TXT_FFMPEG ' - ActionButton16.BackgroundImage = CType(resources.GetObject("ActionButton16.BackgroundImage"), System.Drawing.Image) - ActionButton16.Name = "Open" - ActionButton16.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open - ActionButton17.BackgroundImage = CType(resources.GetObject("ActionButton17.BackgroundImage"), System.Drawing.Image) - ActionButton17.Name = "Refresh" - ActionButton17.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh - ActionButton17.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" ActionButton18.BackgroundImage = CType(resources.GetObject("ActionButton18.BackgroundImage"), System.Drawing.Image) - ActionButton18.Name = "Clear" - ActionButton18.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_FFMPEG.Buttons.Add(ActionButton16) - Me.TXT_FFMPEG.Buttons.Add(ActionButton17) + ActionButton18.Name = "Open" + ActionButton18.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton19.BackgroundImage = CType(resources.GetObject("ActionButton19.BackgroundImage"), System.Drawing.Image) + ActionButton19.Name = "Refresh" + ActionButton19.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton19.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" + ActionButton20.BackgroundImage = CType(resources.GetObject("ActionButton20.BackgroundImage"), System.Drawing.Image) + ActionButton20.Name = "Clear" + ActionButton20.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear Me.TXT_FFMPEG.Buttons.Add(ActionButton18) + Me.TXT_FFMPEG.Buttons.Add(ActionButton19) + Me.TXT_FFMPEG.Buttons.Add(ActionButton20) Me.TXT_FFMPEG.CaptionText = "ffmpeg" Me.TXT_FFMPEG.CaptionToolTipEnabled = True Me.TXT_FFMPEG.CaptionToolTipText = "Path to ffmpeg.exe file" @@ -1895,19 +1946,19 @@ Namespace Editors ' 'TXT_CURL ' - ActionButton19.BackgroundImage = CType(resources.GetObject("ActionButton19.BackgroundImage"), System.Drawing.Image) - ActionButton19.Name = "Open" - ActionButton19.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open - ActionButton20.BackgroundImage = CType(resources.GetObject("ActionButton20.BackgroundImage"), System.Drawing.Image) - ActionButton20.Name = "Refresh" - ActionButton20.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh - ActionButton20.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" ActionButton21.BackgroundImage = CType(resources.GetObject("ActionButton21.BackgroundImage"), System.Drawing.Image) - ActionButton21.Name = "Clear" - ActionButton21.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_CURL.Buttons.Add(ActionButton19) - Me.TXT_CURL.Buttons.Add(ActionButton20) + ActionButton21.Name = "Open" + ActionButton21.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton22.BackgroundImage = CType(resources.GetObject("ActionButton22.BackgroundImage"), System.Drawing.Image) + ActionButton22.Name = "Refresh" + ActionButton22.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton22.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" + ActionButton23.BackgroundImage = CType(resources.GetObject("ActionButton23.BackgroundImage"), System.Drawing.Image) + ActionButton23.Name = "Clear" + ActionButton23.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear Me.TXT_CURL.Buttons.Add(ActionButton21) + Me.TXT_CURL.Buttons.Add(ActionButton22) + Me.TXT_CURL.Buttons.Add(ActionButton23) Me.TXT_CURL.CaptionText = "cURL" Me.TXT_CURL.CaptionToolTipEnabled = True Me.TXT_CURL.CaptionToolTipText = "Path to curl.exe file" @@ -1921,19 +1972,19 @@ Namespace Editors ' 'TXT_GALLERYDL ' - ActionButton22.BackgroundImage = CType(resources.GetObject("ActionButton22.BackgroundImage"), System.Drawing.Image) - ActionButton22.Name = "Open" - ActionButton22.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open - ActionButton23.BackgroundImage = CType(resources.GetObject("ActionButton23.BackgroundImage"), System.Drawing.Image) - ActionButton23.Name = "Refresh" - ActionButton23.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh - ActionButton23.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" ActionButton24.BackgroundImage = CType(resources.GetObject("ActionButton24.BackgroundImage"), System.Drawing.Image) - ActionButton24.Name = "Clear" - ActionButton24.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_GALLERYDL.Buttons.Add(ActionButton22) - Me.TXT_GALLERYDL.Buttons.Add(ActionButton23) + ActionButton24.Name = "Open" + ActionButton24.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton25.BackgroundImage = CType(resources.GetObject("ActionButton25.BackgroundImage"), System.Drawing.Image) + ActionButton25.Name = "Refresh" + ActionButton25.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton25.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" + ActionButton26.BackgroundImage = CType(resources.GetObject("ActionButton26.BackgroundImage"), System.Drawing.Image) + ActionButton26.Name = "Clear" + ActionButton26.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear Me.TXT_GALLERYDL.Buttons.Add(ActionButton24) + Me.TXT_GALLERYDL.Buttons.Add(ActionButton25) + Me.TXT_GALLERYDL.Buttons.Add(ActionButton26) Me.TXT_GALLERYDL.CaptionText = "gallery-dl" Me.TXT_GALLERYDL.CaptionToolTipText = "Path to gallery-dl.exe file" Me.TXT_GALLERYDL.CaptionWidth = 80.0R @@ -1946,14 +1997,14 @@ Namespace Editors ' 'TXT_CMD_ENCODING ' - ActionButton25.BackgroundImage = CType(resources.GetObject("ActionButton25.BackgroundImage"), System.Drawing.Image) - ActionButton25.Name = "Refresh" - ActionButton25.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh - ActionButton26.BackgroundImage = CType(resources.GetObject("ActionButton26.BackgroundImage"), System.Drawing.Image) - ActionButton26.Name = "Clear" - ActionButton26.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_CMD_ENCODING.Buttons.Add(ActionButton25) - Me.TXT_CMD_ENCODING.Buttons.Add(ActionButton26) + ActionButton27.BackgroundImage = CType(resources.GetObject("ActionButton27.BackgroundImage"), System.Drawing.Image) + ActionButton27.Name = "Refresh" + ActionButton27.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton28.BackgroundImage = CType(resources.GetObject("ActionButton28.BackgroundImage"), System.Drawing.Image) + ActionButton28.Name = "Clear" + ActionButton28.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_CMD_ENCODING.Buttons.Add(ActionButton27) + Me.TXT_CMD_ENCODING.Buttons.Add(ActionButton28) Me.TXT_CMD_ENCODING.CaptionText = "CMD Encoding" Me.TXT_CMD_ENCODING.CaptionToolTipEnabled = True Me.TXT_CMD_ENCODING.CaptionToolTipText = "Command line encoding" @@ -2056,10 +2107,10 @@ Namespace Editors ' 'CMB_STD_OPEN_DBL ' - ActionButton27.BackgroundImage = CType(resources.GetObject("ActionButton27.BackgroundImage"), System.Drawing.Image) - ActionButton27.Name = "ArrowDown" - ActionButton27.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown - Me.CMB_STD_OPEN_DBL.Buttons.Add(ActionButton27) + ActionButton29.BackgroundImage = CType(resources.GetObject("ActionButton29.BackgroundImage"), System.Drawing.Image) + ActionButton29.Name = "ArrowDown" + ActionButton29.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown + Me.CMB_STD_OPEN_DBL.Buttons.Add(ActionButton29) Me.CMB_STD_OPEN_DBL.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.Label Me.CMB_STD_OPEN_DBL.CaptionText = "DoubleClick opens" Me.CMB_STD_OPEN_DBL.CaptionToolTipEnabled = True @@ -2141,10 +2192,10 @@ Namespace Editors ' 'TXT_PRG_TITLE ' - ActionButton28.BackgroundImage = CType(resources.GetObject("ActionButton28.BackgroundImage"), System.Drawing.Image) - ActionButton28.Name = "Clear" - ActionButton28.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_PRG_TITLE.Buttons.Add(ActionButton28) + ActionButton30.BackgroundImage = CType(resources.GetObject("ActionButton30.BackgroundImage"), System.Drawing.Image) + ActionButton30.Name = "Clear" + ActionButton30.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_PRG_TITLE.Buttons.Add(ActionButton30) Me.TXT_PRG_TITLE.CaptionText = "Program title" Me.TXT_PRG_TITLE.CaptionToolTipEnabled = True Me.TXT_PRG_TITLE.CaptionToolTipText = "Change the title of the main window if you need to" @@ -2156,10 +2207,10 @@ Namespace Editors ' 'TXT_PRG_DESCR ' - ActionButton29.BackgroundImage = CType(resources.GetObject("ActionButton29.BackgroundImage"), System.Drawing.Image) - ActionButton29.Name = "Clear" - ActionButton29.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_PRG_DESCR.Buttons.Add(ActionButton29) + ActionButton31.BackgroundImage = CType(resources.GetObject("ActionButton31.BackgroundImage"), System.Drawing.Image) + ActionButton31.Name = "Clear" + ActionButton31.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_PRG_DESCR.Buttons.Add(ActionButton31) Me.TXT_PRG_DESCR.CaptionText = "Program description" Me.TXT_PRG_DESCR.CaptionToolTipEnabled = True Me.TXT_PRG_DESCR.CaptionToolTipText = "Add some additional info to the program info if you need" @@ -2171,14 +2222,14 @@ Namespace Editors ' 'TXT_USER_LIST_IMAGE ' - ActionButton30.BackgroundImage = CType(resources.GetObject("ActionButton30.BackgroundImage"), System.Drawing.Image) - ActionButton30.Name = "Open" - ActionButton30.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open - ActionButton31.BackgroundImage = CType(resources.GetObject("ActionButton31.BackgroundImage"), System.Drawing.Image) - ActionButton31.Name = "Clear" - ActionButton31.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_USER_LIST_IMAGE.Buttons.Add(ActionButton30) - Me.TXT_USER_LIST_IMAGE.Buttons.Add(ActionButton31) + ActionButton32.BackgroundImage = CType(resources.GetObject("ActionButton32.BackgroundImage"), System.Drawing.Image) + ActionButton32.Name = "Open" + ActionButton32.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton33.BackgroundImage = CType(resources.GetObject("ActionButton33.BackgroundImage"), System.Drawing.Image) + ActionButton33.Name = "Clear" + ActionButton33.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_USER_LIST_IMAGE.Buttons.Add(ActionButton32) + Me.TXT_USER_LIST_IMAGE.Buttons.Add(ActionButton33) Me.TXT_USER_LIST_IMAGE.CaptionText = "Userlist image" Me.TXT_USER_LIST_IMAGE.CaptionToolTipEnabled = True Me.TXT_USER_LIST_IMAGE.CaptionToolTipText = "Background image for user list" @@ -2252,10 +2303,10 @@ Namespace Editors ' 'TXT_H_DEF_UserAgent ' - ActionButton32.BackgroundImage = CType(resources.GetObject("ActionButton32.BackgroundImage"), System.Drawing.Image) - ActionButton32.Name = "Clear" - ActionButton32.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_H_DEF_UserAgent.Buttons.Add(ActionButton32) + ActionButton34.BackgroundImage = CType(resources.GetObject("ActionButton34.BackgroundImage"), System.Drawing.Image) + ActionButton34.Name = "Clear" + ActionButton34.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_H_DEF_UserAgent.Buttons.Add(ActionButton34) Me.TXT_H_DEF_UserAgent.CaptionText = "UserAgent" Me.TXT_H_DEF_UserAgent.CaptionWidth = 140.0R Me.TXT_H_DEF_UserAgent.Dock = System.Windows.Forms.DockStyle.Fill @@ -2266,10 +2317,10 @@ Namespace Editors ' 'TXT_H_DEF_sec_ch_ua ' - ActionButton33.BackgroundImage = CType(resources.GetObject("ActionButton33.BackgroundImage"), System.Drawing.Image) - ActionButton33.Name = "Clear" - ActionButton33.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_H_DEF_sec_ch_ua.Buttons.Add(ActionButton33) + ActionButton35.BackgroundImage = CType(resources.GetObject("ActionButton35.BackgroundImage"), System.Drawing.Image) + ActionButton35.Name = "Clear" + ActionButton35.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_H_DEF_sec_ch_ua.Buttons.Add(ActionButton35) Me.TXT_H_DEF_sec_ch_ua.CaptionText = "sec-ch-ua" Me.TXT_H_DEF_sec_ch_ua.CaptionWidth = 140.0R Me.TXT_H_DEF_sec_ch_ua.Dock = System.Windows.Forms.DockStyle.Fill @@ -2280,10 +2331,10 @@ Namespace Editors ' 'TXT_H_DEF_sec_ch_ua_full_version_list ' - ActionButton34.BackgroundImage = CType(resources.GetObject("ActionButton34.BackgroundImage"), System.Drawing.Image) - ActionButton34.Name = "Clear" - ActionButton34.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_H_DEF_sec_ch_ua_full_version_list.Buttons.Add(ActionButton34) + ActionButton36.BackgroundImage = CType(resources.GetObject("ActionButton36.BackgroundImage"), System.Drawing.Image) + ActionButton36.Name = "Clear" + ActionButton36.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_H_DEF_sec_ch_ua_full_version_list.Buttons.Add(ActionButton36) Me.TXT_H_DEF_sec_ch_ua_full_version_list.CaptionText = "sec-ch-ua-full-version-list" Me.TXT_H_DEF_sec_ch_ua_full_version_list.CaptionWidth = 140.0R Me.TXT_H_DEF_sec_ch_ua_full_version_list.Dock = System.Windows.Forms.DockStyle.Fill @@ -2294,10 +2345,10 @@ Namespace Editors ' 'TXT_H_DEF_sec_ch_ua_platform ' - ActionButton35.BackgroundImage = CType(resources.GetObject("ActionButton35.BackgroundImage"), System.Drawing.Image) - ActionButton35.Name = "Clear" - ActionButton35.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_H_DEF_sec_ch_ua_platform.Buttons.Add(ActionButton35) + ActionButton37.BackgroundImage = CType(resources.GetObject("ActionButton37.BackgroundImage"), System.Drawing.Image) + ActionButton37.Name = "Clear" + ActionButton37.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_H_DEF_sec_ch_ua_platform.Buttons.Add(ActionButton37) Me.TXT_H_DEF_sec_ch_ua_platform.CaptionText = "sec-ch-ua-platform" Me.TXT_H_DEF_sec_ch_ua_platform.CaptionWidth = 140.0R Me.TXT_H_DEF_sec_ch_ua_platform.Dock = System.Windows.Forms.DockStyle.Fill @@ -2308,10 +2359,10 @@ Namespace Editors ' 'TXT_H_DEF_sec_ch_ua_platform_version ' - ActionButton36.BackgroundImage = CType(resources.GetObject("ActionButton36.BackgroundImage"), System.Drawing.Image) - ActionButton36.Name = "Clear" - ActionButton36.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_H_DEF_sec_ch_ua_platform_version.Buttons.Add(ActionButton36) + ActionButton38.BackgroundImage = CType(resources.GetObject("ActionButton38.BackgroundImage"), System.Drawing.Image) + ActionButton38.Name = "Clear" + ActionButton38.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_H_DEF_sec_ch_ua_platform_version.Buttons.Add(ActionButton38) Me.TXT_H_DEF_sec_ch_ua_platform_version.CaptionText = "sec-ch-ua-platform-version" Me.TXT_H_DEF_sec_ch_ua_platform_version.CaptionWidth = 140.0R Me.TXT_H_DEF_sec_ch_ua_platform_version.Dock = System.Windows.Forms.DockStyle.Fill @@ -2441,8 +2492,10 @@ Namespace Editors TP_FEED_IMG_COUNT.ResumeLayout(False) CType(Me.TXT_FEED_ROWS, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.TXT_FEED_COLUMNS, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.NUM_FEED_STORE_SESSION_DATA, System.ComponentModel.ISupportInitialize).EndInit() CType(Me.TXT_FEED_CENTER_IMAGE, System.ComponentModel.ISupportInitialize).EndInit() + TP_FEED_SES.ResumeLayout(False) + CType(Me.NUM_FEED_STORE_SESSION_DATA, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.NUM_FEED_SES_CURR_LOAD_LAST, System.ComponentModel.ISupportInitialize).EndInit() TAB_NOTIFY.ResumeLayout(False) TP_NOTIFY_MAIN.ResumeLayout(False) TP_NOTIFY_MAIN.PerformLayout() @@ -2582,5 +2635,6 @@ Namespace Editors Private WithEvents CH_DOWN_ALL_F6_NOTIFY As CheckBox Private WithEvents CH_DOWN_ALL_NOTIFY As CheckBox Private WithEvents CH_CHANNELS_USERS_READY_MARK As CheckBox + Private WithEvents NUM_FEED_SES_CURR_LOAD_LAST As PersonalUtilities.Forms.Controls.TextBoxExtended End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/GlobalSettingsForm.resx b/SCrawler/Editors/GlobalSettingsForm.resx index 0d2642f..44a620c 100644 --- a/SCrawler/Editors/GlobalSettingsForm.resx +++ b/SCrawler/Editors/GlobalSettingsForm.resx @@ -331,6 +331,39 @@ You can find more detailed information about the missing posts in the form that False + + False + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE + QVQ4T2P4//8/QczOJyyqHpzfiE0OQwAZC8iqszAzs7CJ69o4BR768V/W2jcGXQ0KB4aFNS3dDQtnrbCb + ePCK48wTN1wXXXzge/jXf/clV55zC4hIIatF0cjIyMikElzc57z0wX+XHd/+2+//99/ywP//xlu//tdb + +eK/4Zp3/1WTOhYzARViNUAluKjTdf37/0ZTTn9TbdhwXblhwwW1/qOP1Ja9+K8w+95/6cm3/6v2Xvkv + qKjniGGAoIqRpW3/4e8S9uGdzFz82gwMDFxAzCxm4ZegtuLDf+VJ1/8rZM25IqLvnM/CximCYYCic1QN + v7x2JIwPwyrJ3XNUylddE9G2TWNmZOBDl4czmJiZMSRBmFdSyYyJgUEQmxwIYxWEYXZBCUls4sgYq6CA + prWNbtG8nXKeaVPR5XiVjSxEzf0yYXy4BBMLO6eQjoOXZvrkbbazrv53Xf/2v4CSbjBMXkhBl1/CMyNZ + qWnvGy5pNQ+YONwAfjXzAOupl/47LLr333L50/96q9/8l23YdES6cO5KuYqVW+R7Tj6SnfP0v4hryjyY + HhQDmFjYeHVKFp7WX/Xuv9Kq9/+Vd/z7r7rv/3+l7f//y676DEwDN/9L+BVvYkKLCTgDhNkkVUyVlr74 + qbbz73/VOTc/qsy89kWx+9h7qbQpJwS1bbOAscGGrB6EUTggLOqf16C55ft/HlnNAFZOXgVWdi4FRgYG + VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + Try loading the last session of the current day (if it exists) as the current session after restarting SCrawler. +-1 - disabled. +0 - only the session of the current day. +>0 - the value (in minutes) that must elapse since last file download in a session for that session to be considered current. + False @@ -340,7 +373,7 @@ You can find more detailed information about the missing posts in the form that False - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -351,7 +384,7 @@ You can find more detailed information about the missing posts in the form that cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -367,50 +400,15 @@ You can find more detailed information about the missing posts in the form that VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP - WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP - aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ - 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 - vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB - cMaRN0UdBBkAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 - JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE - QVQ4T2P4//8/QczOJyyqHpzfiE0OQwAZC8iqszAzs7CJ69o4BR768V/W2jcGXQ0KB4aFNS3dDQtnrbCb - ePCK48wTN1wXXXzge/jXf/clV55zC4hIIatF0cjIyMikElzc57z0wX+XHd/+2+//99/ywP//xlu//tdb - +eK/4Zp3/1WTOhYzARViNUAluKjTdf37/0ZTTn9TbdhwXblhwwW1/qOP1Ja9+K8w+95/6cm3/6v2Xvkv - qKjniGGAoIqRpW3/4e8S9uGdzFz82gwMDFxAzCxm4ZegtuLDf+VJ1/8rZM25IqLvnM/CximCYYCic1QN - v7x2JIwPwyrJ3XNUylddE9G2TWNmZOBDl4czmJiZMSRBmFdSyYyJgUEQmxwIYxWEYXZBCUls4sgYq6CA - prWNbtG8nXKeaVPR5XiVjSxEzf0yYXy4BBMLO6eQjoOXZvrkbbazrv53Xf/2v4CSbjBMXkhBl1/CMyNZ - qWnvGy5pNQ+YONwAfjXzAOupl/47LLr333L50/96q9/8l23YdES6cO5KuYqVW+R7Tj6SnfP0v4hryjyY - HhQDmFjYeHVKFp7WX/Xuv9Kq9/+Vd/z7r7rv/3+l7f//y676DEwDN/9L+BVvYkKLCTgDhNkkVUyVlr74 - qbbz73/VOTc/qsy89kWx+9h7qbQpJwS1bbOAscGGrB6EUTggLOqf16C55ft/HlnNAFZOXgVWdi4FRgYG - VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go - tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX - AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -421,7 +419,7 @@ You can find more detailed information about the missing posts in the form that cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -435,17 +433,17 @@ You can find more detailed information about the missing posts in the form that HhQDmFjYeHVKFp7WX/Xuv9Kq9/+Vd/z7r7rv/3+l7f//y676DEwDN/9L+BVvYkKLCTgDhNkkVUyVlr74 qbbz73/VOTc/qsy89kWx+9h7qbQpJwS1bbOAscGGrB6EUTggLOqf16C55ft/HlnNAFZOXgVWdi4FRgYG VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go - tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX - AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -456,7 +454,7 @@ You can find more detailed information about the missing posts in the form that cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -472,12 +470,23 @@ You can find more detailed information about the missing posts in the form that VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= @@ -502,6 +511,30 @@ You can find more detailed information about the missing posts in the form that xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 + JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE + QVQ4T2P4//8/QczOJyyqHpzfiE0OQwAZC8iqszAzs7CJ69o4BR768V/W2jcGXQ0KB4aFNS3dDQtnrbCb + ePCK48wTN1wXXXzge/jXf/clV55zC4hIIatF0cjIyMikElzc57z0wX+XHd/+2+//99/ywP//xlu//tdb + +eK/4Zp3/1WTOhYzARViNUAluKjTdf37/0ZTTn9TbdhwXblhwwW1/qOP1Ja9+K8w+95/6cm3/6v2Xvkv + qKjniGGAoIqRpW3/4e8S9uGdzFz82gwMDFxAzCxm4ZegtuLDf+VJ1/8rZM25IqLvnM/CximCYYCic1QN + v7x2JIwPwyrJ3XNUylddE9G2TWNmZOBDl4czmJiZMSRBmFdSyYyJgUEQmxwIYxWEYXZBCUls4sgYq6CA + prWNbtG8nXKeaVPR5XiVjSxEzf0yYXy4BBMLO6eQjoOXZvrkbbazrv53Xf/2v4CSbjBMXkhBl1/CMyNZ + qWnvGy5pNQ+YONwAfjXzAOupl/47LLr333L50/96q9/8l23YdES6cO5KuYqVW+R7Tj6SnfP0v4hryjyY + HhQDmFjYeHVKFp7WX/Xuv9Kq9/+Vd/z7r7rv/3+l7f//y676DEwDN/9L+BVvYkKLCTgDhNkkVUyVlr74 + qbbz73/VOTc/qsy89kWx+9h7qbQpJwS1bbOAscGGrB6EUTggLOqf16C55ft/HlnNAFZOXgVWdi4FRgYG + VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC @@ -510,7 +543,7 @@ You can find more detailed information about the missing posts in the form that False - + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t 3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL @@ -606,31 +639,12 @@ You can find more detailed information about the missing posts in the form that False - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go - tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX - AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go - tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX - AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP - WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP - aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ - 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 - vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB - cMaRN0UdBBkAAAAASUVORK5CYII= + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC @@ -641,15 +655,15 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - - False - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go - tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX - AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= @@ -660,6 +674,9 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + False + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO @@ -682,6 +699,22 @@ You can find more detailed information about the missing posts in the form that xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC diff --git a/SCrawler/Editors/GlobalSettingsForm.vb b/SCrawler/Editors/GlobalSettingsForm.vb index d32ce18..8369f70 100644 --- a/SCrawler/Editors/GlobalSettingsForm.vb +++ b/SCrawler/Editors/GlobalSettingsForm.vb @@ -152,6 +152,7 @@ Namespace Editors CH_FEED_ADD_DATE.Checked = .FeedAddDateToCaption NUM_FEED_STORE_SESSION_DATA.Checked = .FeedStoreSessionsData NUM_FEED_STORE_SESSION_DATA.Value = .FeedStoredSessionsNumber.Value + NUM_FEED_SES_CURR_LOAD_LAST.Value = .FeedCurrentTryLoadLastSession.Value CH_FEED_OPEN_LAST_MODE.Checked = .FeedOpenLastMode CH_FEED_SHOW_FRIENDLY.Checked = .FeedShowFriendlyNames CH_FEED_SHOW_SPEC_MEDIAITEM.Checked = .FeedShowSpecialFeedsMediaItem @@ -340,6 +341,7 @@ Namespace Editors .FeedAddDateToCaption.Value = CH_FEED_ADD_DATE.Checked .FeedStoreSessionsData.Value = NUM_FEED_STORE_SESSION_DATA.Checked .FeedStoredSessionsNumber.Value = NUM_FEED_STORE_SESSION_DATA.Value + .FeedCurrentTryLoadLastSession.Value = NUM_FEED_SES_CURR_LOAD_LAST.Value .FeedOpenLastMode.Value = CH_FEED_OPEN_LAST_MODE.Checked .FeedShowFriendlyNames.Value = CH_FEED_SHOW_FRIENDLY.Checked .FeedShowSpecialFeedsMediaItem.Value = CH_FEED_SHOW_SPEC_MEDIAITEM.Checked @@ -403,6 +405,12 @@ Namespace Editors Private Sub TXT_FEED_COLUMNS_ActionOnValueChanged(sender As Object, e As EventArgs) Handles TXT_FEED_COLUMNS.ActionOnValueChanged TXT_FEED_CENTER_IMAGE.Enabled = TXT_FEED_COLUMNS.Value = 1 End Sub + Private Sub NUM_FEED_SES_CURR_LOAD_LAST_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As ActionButtonEventArgs) Handles NUM_FEED_SES_CURR_LOAD_LAST.ActionOnButtonClick + Select Case e.DefaultButton + Case ADB.Clear : NUM_FEED_SES_CURR_LOAD_LAST.Value = -1 + Case ADB.Refresh : NUM_FEED_SES_CURR_LOAD_LAST.Value = SettingsCLS.FeedCurrentLoadLastSessionDefault + End Select + End Sub Private Sub EnvirPrograms_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As ActionButtonEventArgs) Handles TXT_FFMPEG.ActionOnButtonClick, TXT_CURL.ActionOnButtonClick, TXT_YTDLP.ActionOnButtonClick, diff --git a/SCrawler/Editors/SiteEditorForm.vb b/SCrawler/Editors/SiteEditorForm.vb index 93ca302..da467a3 100644 --- a/SCrawler/Editors/SiteEditorForm.vb +++ b/SCrawler/Editors/SiteEditorForm.vb @@ -20,6 +20,7 @@ Namespace Editors Private WithEvents MyDefs As DefaultFormOptions Private WithEvents SpecialButton As Button Private Property Cookies As CookieKeeper + Private ReadOnly CookiesControlsInteraction As List(Of PropertyValueHost) Private CookiesChanged As Boolean = False #Region "Providers" Private Class SavedPostsChecker : Inherits AccountsNameChecker @@ -145,6 +146,7 @@ Namespace Editors InitializeComponent() MyDefs = New DefaultFormOptions(Me, Settings.Design) Host = h + CookiesControlsInteraction = New List(Of PropertyValueHost) If Not Host.Responser Is Nothing Then Cookies = Host.Responser.Cookies.Copy LBL_AUTH = New Label With {.Text = "Authorization", .TextAlign = ContentAlignment.MiddleCenter, .Dock = DockStyle.Fill} LBL_OTHER = New Label With {.Text = "Other Parameters", .TextAlign = ContentAlignment.MiddleCenter, .Dock = DockStyle.Fill} @@ -221,6 +223,8 @@ Namespace Editors With prop If .Options.IsAuth = pAuth Then + If .CookieValueExtractorExists Then CookiesControlsInteraction.Add(prop) + If pArr.Length = 2 Then Select Case pAuth Case True @@ -285,6 +289,7 @@ Namespace Editors Private Sub SiteEditorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed If Host.PropList.Count > 0 Then Host.PropList.ForEach(Sub(p) p.DisposeControl()) If Not SpecialButton Is Nothing Then SpecialButton.Dispose() + CookiesControlsInteraction.Clear() LBL_AUTH.Dispose() LBL_OTHER.Dispose() Host.EndEdit() @@ -378,6 +383,7 @@ Namespace Editors CookiesChanged = True f.GetCollection(Cookies) MyDefs.MyOkCancel.EnableOK = True + If Cookies.ListExists And CookiesControlsInteraction.Count > 0 Then CookiesControlsInteraction.ForEach(Sub(c) c.GetValueFromCookies(Cookies)) End If End Using SetCookieText() diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb index d9f7fca..3912a5e 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/Attributes/Attributes.vb b/SCrawler/PluginsEnvironment/Attributes/Attributes.vb index 8e9737d..d5cc4e3 100644 --- a/SCrawler/PluginsEnvironment/Attributes/Attributes.vb +++ b/SCrawler/PluginsEnvironment/Attributes/Attributes.vb @@ -53,4 +53,11 @@ Namespace Plugin.Attributes IsHidden = _IsHidden End Sub End Class + + Public Class CookieValueExtractorAttribute : Inherits Attribute + Public ReadOnly PropertyName As String + Public Sub New(ByVal _PropertyName As String) + PropertyName = _PropertyName + End Sub + End Class End Namespace \ No newline at end of file diff --git a/SCrawler/PluginsEnvironment/Hosts/PropertyValueHost.vb b/SCrawler/PluginsEnvironment/Hosts/PropertyValueHost.vb index 07bb62c..24795d4 100644 --- a/SCrawler/PluginsEnvironment/Hosts/PropertyValueHost.vb +++ b/SCrawler/PluginsEnvironment/Hosts/PropertyValueHost.vb @@ -254,6 +254,14 @@ Namespace Plugin.Hosts Return Nothing End If End Function + Friend Sub GetValueFromCookies(ByVal Cookies As PersonalUtilities.Tools.Web.Cookies.CookieKeeper) + Try + Dim v$ = CookieValueExtractor.GetMemberValue(Source, {Name, Cookies}) + If Not v.IsEmptyString Then Control.Text = v + Catch ex As Exception + ErrorsDescriber.Execute(EDP.SendToLog, ex, "[PropertyValueHost.GetValueFromCookies]") + End Try + End Sub #End Region #Region "Providers" Friend Property ProviderFieldsChecker As IFormatProvider @@ -278,6 +286,22 @@ Namespace Plugin.Hosts Friend PropertiesCheckingMethod As MethodInfo Private UpdateMethod As MethodInfo Private UpdateMethodArguments As String() + Private _CookieValueExtractor As MethodInfo + Private _CookieValueExtractorExists As Boolean = False + Friend Property CookieValueExtractor As MethodInfo + Get + Return _CookieValueExtractor + End Get + Set(ByVal m As MethodInfo) + _CookieValueExtractor = m + _CookieValueExtractorExists = Not _CookieValueExtractor Is Nothing + End Set + End Property + Friend ReadOnly Property CookieValueExtractorExists As Boolean + Get + Return _CookieValueExtractorExists + End Get + End Property Friend Sub SetUpdateMethod(ByVal m As MethodInfo, ByVal _UpdateMethodArguments As String()) UpdateMethod = m UpdateMethodArguments = _UpdateMethodArguments diff --git a/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb b/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb index 2de05a0..2517607 100644 --- a/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb +++ b/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb @@ -312,6 +312,7 @@ Namespace Plugin.Hosts Dim Updaters As New List(Of MemberInfo) Dim Providers As New List(Of MemberInfo) Dim PropCheckers As New List(Of MemberInfo) + Dim CookieValueExtractors As New List(Of MemberInfo) Dim m As MemberInfo For Each m In Members @@ -329,6 +330,8 @@ Namespace Plugin.Hosts Updaters.Add(m) ElseIf .ElementAt(i).GetType Is GetType(PropertiesDataChecker) Then PropCheckers.Add(m) + ElseIf .ElementAt(i).GetType Is GetType(CookieValueExtractorAttribute) Then + CookieValueExtractors.Add(m) End If Next ElseIf m.MemberType = MemberTypes.Property Then @@ -377,6 +380,20 @@ Namespace Plugin.Hosts Next PropCheckers.Clear() End If + If CookieValueExtractors.Count > 0 Then + Dim cve As IEnumerable(Of CookieValueExtractorAttribute) + Dim _cve As CookieValueExtractorAttribute + For Each m In CookieValueExtractors + cve = m.GetCustomAttributes(Of CookieValueExtractorAttribute)() + If cve.ListExists Then + For Each _cve In cve + i = PropList.FindIndex(Function(p) p.Name = _cve.PropertyName) + If i >= 0 Then PropList(i).CookieValueExtractor = m + Next + End If + Next + CookieValueExtractors.Clear() + End If PropList.ForEach(Sub(p) p.SetDependents(PropList)) End If diff --git a/SCrawler/SettingsCLS.vb b/SCrawler/SettingsCLS.vb index ed62480..11cc414 100644 --- a/SCrawler/SettingsCLS.vb +++ b/SCrawler/SettingsCLS.vb @@ -30,6 +30,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable Friend Const CollectionsFolderName As String = "Collections" Private Const PermanentCacheSnapshotsPath As String = "_CacheSnapshots\" Friend Const DefaultCmdEncoding As Integer = BatchExecutor.UnicodeEncoding + Friend Const FeedCurrentLoadLastSessionDefault As Integer = 60 * 6 #End Region #Region "Constants: headers" Friend Const HEADER_DEF_sec_ch_ua As String = "sec-ch-ua" @@ -396,6 +397,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable FeedAddDateToCaption = New XMLValue(Of Boolean)("AddDateToCaption", True, MyXML, n) FeedStoreSessionsData = New XMLValue(Of Boolean)("StoreSessionsData", True, MyXML, n) FeedStoredSessionsNumber = New XMLValue(Of Integer)("StoredSessionsNumber", 20, MyXML, n) + FeedCurrentTryLoadLastSession = New XMLValue(Of Integer)("CurrentTryLoadLastSession", FeedCurrentLoadLastSessionDefault, MyXML, n) FeedOpenLastMode = New XMLValue(Of Boolean)("OpenLastMode", False, MyXML, n) FeedLastModeSubscriptions = New XMLValue(Of Boolean)("LastModeSubscriptions", False, MyXML, n) FeedShowFriendlyNames = New XMLValue(Of Boolean)("ShowFriendlyNames", True, MyXML, n) @@ -1250,6 +1252,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable Friend ReadOnly Property FeedAddDateToCaption As XMLValue(Of Boolean) Friend ReadOnly Property FeedStoreSessionsData As XMLValue(Of Boolean) Friend ReadOnly Property FeedStoredSessionsNumber As XMLValue(Of Integer) + Friend ReadOnly Property FeedCurrentTryLoadLastSession As XMLValue(Of Integer) Friend ReadOnly Property FeedOpenLastMode As XMLValue(Of Boolean) Friend ReadOnly Property FeedLastModeSubscriptions As XMLValue(Of Boolean) Friend ReadOnly Property FeedShowFriendlyNames As XMLValue(Of Boolean) diff --git a/SCrawler/UserSearchForm.vb b/SCrawler/UserSearchForm.vb index 6104785..ae80e63 100644 --- a/SCrawler/UserSearchForm.vb +++ b/SCrawler/UserSearchForm.vb @@ -109,6 +109,7 @@ Friend Class UserSearchForm Dim __urlFound As Boolean = False Dim _p_url As Predicate(Of IUserData) = Function(u) __urlFound AndAlso ((u.Site = s.SiteName Or u.HOST.Key = s.HostKey) And u.Name.ToLower = s.UserName.ToLower) Dim _p_descr As Predicate(Of IUserData) = Function(u) __descr AndAlso Not u.Description.IsEmptyString AndAlso u.Description.ToLower.Contains(t) + Dim _p_name_friendly As Predicate(Of IUserData) = Function(u) Not u.FriendlyName.IsEmptyString AndAlso u.FriendlyName.ToLower.Contains(t) Dim _p_labels_p As Predicate(Of String) = Function(l) l.ToLower.Contains(t) Dim _p_labels As Predicate(Of IUserData) = Function(u) __lbl AndAlso u.Labels.ListExists AndAlso u.Labels.Exists(_p_labels_p) Dim _addValue As Action(Of IUserData, SearchResult.Modes, Predicate(Of IUserData)) = Sub(u, m, p) If p.Invoke(u) Then Results.ListAddValue(New SearchResult(u, m), RLP) @@ -122,13 +123,14 @@ Friend Class UserSearchForm End If For Each user As IUserData In .Users - If Not __isUrl AndAlso __name AndAlso user.Name.ToLower.Contains(t) Then Results.ListAddValue(New SearchResult(user, SearchResult.Modes.Name), RLP) + If Not __isUrl AndAlso __name AndAlso (user.Name.ToLower.Contains(t) OrElse _p_name_friendly.Invoke(user)) Then Results.ListAddValue(New SearchResult(user, SearchResult.Modes.Name), RLP) If user.IsCollection Then With DirectCast(user, UserDataBind) If .Count > 0 Then For i = 0 To .Count - 1 With .Item(i) - If Not __isUrl AndAlso __name AndAlso .Self.Name.ToLower.Contains(t) Then Results.ListAddValue(New SearchResult(.Self, SearchResult.Modes.Name), RLP) + If Not __isUrl AndAlso __name AndAlso (.Self.Name.ToLower.Contains(t) OrElse _p_name_friendly.Invoke(.Self)) Then _ + Results.ListAddValue(New SearchResult(.Self, SearchResult.Modes.Name), RLP) _addValue(.Self, SearchResult.Modes.URL, _p_url) _addValue(.Self, SearchResult.Modes.Description, _p_descr) _addValue(.Self, SearchResult.Modes.Label, _p_labels)