diff --git a/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb b/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb
index b6e1045..ba65151 100644
--- a/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb
+++ b/SCrawler.PluginProvider/Interfaces/ISiteSettings.vb
@@ -17,6 +17,9 @@ Namespace Plugin
ReadOnly Property Icon As Icon
ReadOnly Property Image As Image
ReadOnly Property Site As String
+ Property CMDEncoding As String
+ Property EnvironmentPrograms As IEnumerable(Of String)
+ Sub EnvironmentProgramsUpdated()
Property AccountName As String
Property Temporary As Boolean
Property DefaultInstance As ISiteSettings
diff --git a/SCrawler/API/Base/SiteSettingsBase.vb b/SCrawler/API/Base/SiteSettingsBase.vb
index cfe824b..08f767c 100644
--- a/SCrawler/API/Base/SiteSettingsBase.vb
+++ b/SCrawler/API/Base/SiteSettingsBase.vb
@@ -54,6 +54,12 @@ Namespace API.Base
End Set
End Property
#End Region
+#Region "EnvironmentPrograms"
+ Private Property CMDEncoding As String Implements ISiteSettings.CMDEncoding
+ Private Property EnvironmentPrograms As IEnumerable(Of String) Implements ISiteSettings.EnvironmentPrograms
+ Private Sub EnvironmentProgramsUpdated() Implements ISiteSettings.EnvironmentProgramsUpdated
+ End Sub
+#End Region
#Region "Responser and cookies support"
Private _CookiesNetscapeFile As SFile = Nothing
Friend ReadOnly Property CookiesNetscapeFile As SFile
diff --git a/SCrawler/Download/Automation/AutoDownloaderEditorForm.vb b/SCrawler/Download/Automation/AutoDownloaderEditorForm.vb
index 177e8d9..9d08a31 100644
--- a/SCrawler/Download/Automation/AutoDownloaderEditorForm.vb
+++ b/SCrawler/Download/Automation/AutoDownloaderEditorForm.vb
@@ -6,6 +6,7 @@
'
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY
+Imports SCrawler.DownloadObjects.Groups
Imports PersonalUtilities.Forms
Imports PersonalUtilities.Forms.Controls.Base
Imports DModes = SCrawler.DownloadObjects.AutoDownloader.Modes
@@ -50,9 +51,9 @@ Namespace DownloadObjects
Case DModes.Groups : OPT_GROUP.Checked = True
End Select
- TXT_GROUPS.CaptionWidth = Groups.GroupDefaults.CaptionWidthDefault
- TXT_TIMER.CaptionWidth = Groups.GroupDefaults.CaptionWidthDefault
- NUM_DELAY.CaptionWidth = Groups.GroupDefaults.CaptionWidthDefault
+ TXT_GROUPS.CaptionWidth = GroupDefaults.CaptionWidthDefault
+ TXT_TIMER.CaptionWidth = GroupDefaults.CaptionWidthDefault
+ NUM_DELAY.CaptionWidth = GroupDefaults.CaptionWidthDefault
DEF_GROUP.Set(Plan)
If MyGroups.Count > 0 Then TXT_GROUPS.Text = MyGroups.ListToString
@@ -70,7 +71,7 @@ Namespace DownloadObjects
.MyFieldsChecker = New FieldsChecker
With .MyFieldsCheckerE
.AddControl(Of String)(DEF_GROUP.TXT_NAME, DEF_GROUP.TXT_NAME.CaptionText,,
- New Groups.GroupEditorForm.NameChecker(Plan.Name, Settings.Automation, "Plan"))
+ New GroupEditorForm.NameChecker(Plan.Name, Settings.Automation, "Plan"))
.AddControl(Of Integer)(TXT_TIMER, TXT_TIMER.CaptionText,, New AutomationTimerChecker)
.EndLoaderOperations()
End With
@@ -81,6 +82,31 @@ Namespace DownloadObjects
Private Sub AutoDownloaderEditorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
MyGroups.Clear()
End Sub
+ Private Sub AutoDownloaderEditorForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
+ Try
+ If e = ShowUsersButtonKey AndAlso Not OPT_DISABLED.Checked Then
+ Dim users As New List(Of API.Base.IUserData)
+ If OPT_GROUP.Checked Then
+ If MyGroups.Count > 0 Then
+ Dim i%
+ For Each groupName$ In MyGroups
+ i = Settings.Groups.IndexOf(groupName)
+ If i >= 0 Then users.ListAddList(DownloadGroup.GetUsers(Settings.Groups(i)), LAP.NotContainsOnly, LAP.IgnoreICopier)
+ Next
+ End If
+ Else
+ Using g As New GroupParameters
+ DEF_GROUP.Get(g)
+ users.ListAddList(DownloadGroup.GetUsers(g))
+ End Using
+ End If
+ GroupUsersViewer.Show(users)
+ users.Clear()
+ End If
+ Catch ex As Exception
+ ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Show plan users")
+ End Try
+ End Sub
Private Sub MyDefs_ButtonOkClick(ByVal Sender As Object, ByVal e As KeyHandleEventArgs) Handles MyDefs.ButtonOkClick
If MyDefs.MyFieldsChecker.AllParamsOK Then
With Plan
@@ -108,7 +134,7 @@ Namespace DownloadObjects
Private Sub TXT_GROUPS_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As EventArgs) Handles TXT_GROUPS.ActionOnButtonClick
Select Case Sender.DefaultButton
Case ActionButton.DefaultButtons.Edit
- Using f As New LabelsForm(MyGroups, (From g As Groups.DownloadGroup In Settings.Groups Where Not g.IsViewFilter Select g.Name)) With {.Text = "Groups", .Icon = My.Resources.GroupByIcon_16}
+ Using f As New LabelsForm(MyGroups, (From g As DownloadGroup In Settings.Groups Where Not g.IsViewFilter Select g.Name)) With {.Text = "Groups", .Icon = My.Resources.GroupByIcon_16}
f.ShowDialog()
If f.DialogResult = DialogResult.OK Then MyGroups.ListAddList(f.LabelsList, LAP.ClearBeforeAdd) : TXT_GROUPS.Text = MyGroups.ListToString
End Using
diff --git a/SCrawler/Download/Automation/SchedulerEditorForm.vb b/SCrawler/Download/Automation/SchedulerEditorForm.vb
index 79d52f5..a9d0ade 100644
--- a/SCrawler/Download/Automation/SchedulerEditorForm.vb
+++ b/SCrawler/Download/Automation/SchedulerEditorForm.vb
@@ -131,7 +131,12 @@ Namespace DownloadObjects
End With
End Sub
Private Sub SchedulerEditorForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
- If e.KeyCode = Keys.Escape Then Close()
+ If e.KeyCode = Keys.Escape Then
+ Close()
+ ElseIf e = ShowUsersButtonKey Then
+ ShowPlanUsers()
+ e.Handled = True
+ End If
End Sub
Private Sub SchedulerEditorForm_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
PauseArr.Dispose()
@@ -241,7 +246,7 @@ Namespace DownloadObjects
If l.Count > 0 Then
Using chooser As New SimpleListForm(Of String)(l.Values.Cast(Of String), Settings.Design) With {
.DesignXMLNodeName = "SchedulerChooserForm",
- .Icon = PersonalUtilities.Tools.ImageRenderer.GetIcon(My.Resources.ScriptPic_32, EDP.ReturnValue),
+ .Icon = ImageRenderer.GetIcon(My.Resources.ScriptPic_32, EDP.ReturnValue),
.FormText = "Schedulers",
.Mode = SimpleListFormModes.SelectedItems,
.MultiSelect = False
@@ -356,6 +361,34 @@ Namespace DownloadObjects
Refill()
End If
End Sub
+#End Region
+#Region "ShowPlanUsers"
+ Private Sub ShowPlanUsers()
+ Try
+ If _LatestSelected.ValueBetween(0, Settings.Automation.Count - 1) Then
+ With Settings.Automation(_LatestSelected)
+ Dim users As New List(Of API.Base.IUserData)
+ If Not .Mode = AutoDownloader.Modes.None Then
+ If .Mode = AutoDownloader.Modes.Groups Then
+ If .Groups.Count > 0 Then
+ Dim i%
+ For Each groupName$ In .Groups
+ i = Settings.Groups.IndexOf(groupName)
+ If i >= 0 Then users.ListAddList(Groups.DownloadGroup.GetUsers(Settings.Groups(i)), LAP.NotContainsOnly, LAP.IgnoreICopier)
+ Next
+ End If
+ Else
+ users.ListAddList(Groups.DownloadGroup.GetUsers(.Self))
+ End If
+ End If
+ Groups.GroupUsersViewer.Show(users)
+ users.Clear()
+ End With
+ End If
+ Catch ex As Exception
+ ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Show plan users")
+ End Try
+ End Sub
#End Region
End Class
End Namespace
\ No newline at end of file
diff --git a/SCrawler/Download/Groups/GroupEditorForm.vb b/SCrawler/Download/Groups/GroupEditorForm.vb
index 61c7c6c..8e43247 100644
--- a/SCrawler/Download/Groups/GroupEditorForm.vb
+++ b/SCrawler/Download/Groups/GroupEditorForm.vb
@@ -80,6 +80,18 @@ Namespace DownloadObjects.Groups
.MyOkCancel.EnableOK = True
End With
End Sub
+ Private Sub GroupEditorForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
+ Try
+ If e = ShowUsersButtonKey Then
+ Using g As New GroupParameters
+ DEFS_GROUP.Get(g)
+ GroupUsersViewer.Show(DownloadGroup.GetUsers(g))
+ End Using
+ End If
+ Catch ex As Exception
+ ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Show plan users")
+ End Try
+ End Sub
Private Sub MyDefs_ButtonOkClick(ByVal Sender As Object, ByVal e As KeyHandleEventArgs) Handles MyDefs.ButtonOkClick
If MyDefs.MyFieldsChecker.AllParamsOK Then
If MyGroup Is Nothing Then MyGroup = New DownloadGroup(Not FilterMode)
diff --git a/SCrawler/Download/Groups/GroupListForm.vb b/SCrawler/Download/Groups/GroupListForm.vb
index 58f6c24..9ccc5a0 100644
--- a/SCrawler/Download/Groups/GroupListForm.vb
+++ b/SCrawler/Download/Groups/GroupListForm.vb
@@ -144,7 +144,11 @@ Namespace DownloadObjects.Groups
If GroupsUpdated Then Settings.Groups.Update()
End Sub
Private Sub GroupListForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
- If e.KeyCode = Keys.Escape Then Close()
+ If e.KeyCode = Keys.Escape Then
+ Close()
+ ElseIf e = ShowUsersButtonKey Then
+ ShowUsers()
+ End If
End Sub
#End Region
#Region "Refill"
@@ -295,6 +299,46 @@ Namespace DownloadObjects.Groups
EditItem()
End If
End Sub
+#End Region
+#Region "ShowUsers"
+ Private Sub ShowUsers()
+ Try
+ If _LatestSelected.ValueBetween(0, MyGroups.Count - 1) Then
+ Dim i%
+ Dim users As New List(Of API.Base.IUserData)
+ If Not IsViewFilter Then
+ i = Settings.Groups.IndexOf(MyGroups(_LatestSelected))
+ If i >= 0 Then users.ListAddList(DownloadGroup.GetUsers(Settings.Groups(i)))
+ ElseIf _LatestSelected.ValueBetween(0, MyGroupParams.Count - 1) Then
+ With MyGroupParams(_LatestSelected)
+ If TypeOf .Self Is AutoDownloader Then
+ With DirectCast(.Self, AutoDownloader)
+ If Not .Mode = AutoDownloader.Modes.None Then
+ If .Mode = AutoDownloader.Modes.Groups Then
+ If .Groups.Count > 0 Then
+ For Each groupName$ In .Groups
+ i = Settings.Groups.IndexOf(groupName)
+ If i >= 0 Then users.ListAddList(DownloadGroup.GetUsers(Settings.Groups(i)), LAP.NotContainsOnly, LAP.IgnoreICopier)
+ Next
+ End If
+ Else
+ users.ListAddList(DownloadGroup.GetUsers(.Self))
+ End If
+ End If
+ End With
+ ElseIf TypeOf .Self Is DownloadGroup Then
+ i = Settings.Groups.IndexOf(.Name, .IsViewFilter)
+ If i >= 0 Then users.ListAddList(DownloadGroup.GetUsers(Settings.Groups(i)))
+ End If
+ End With
+ End If
+ GroupUsersViewer.Show(users)
+ users.Clear()
+ End If
+ Catch ex As Exception
+ ErrorsDescriber.Execute(EDP.LogMessageValue, ex, "Show plan users")
+ End Try
+ End Sub
#End Region
End Class
End Namespace
\ No newline at end of file
diff --git a/SCrawler/Download/Groups/GroupUsersViewer.vb b/SCrawler/Download/Groups/GroupUsersViewer.vb
new file mode 100644
index 0000000..f3b673e
--- /dev/null
+++ b/SCrawler/Download/Groups/GroupUsersViewer.vb
@@ -0,0 +1,56 @@
+' Copyright (C) Andy https://github.com/AAndyProgram
+' This program is free software: you can redistribute it and/or modify
+' it under the terms of the GNU General Public License as published by
+' the Free Software Foundation, either version 3 of the License, or
+' (at your option) any later version.
+'
+' This program is distributed in the hope that it will be useful,
+' but WITHOUT ANY WARRANTY
+Imports SCrawler.API.Base
+Imports PersonalUtilities.Forms
+Namespace DownloadObjects.Groups
+ Friend Class GroupUsersViewer : Inherits SimpleListForm(Of IUserData)
+ Friend Sub New(ByVal Users As IEnumerable(Of IUserData))
+ MyBase.New(Users, Settings.Design)
+ DesignXMLNodeName = "GroupUsersViewer"
+ Provider = New CustomProvider(Function(u As UserDataBase) u.ToStringForLog)
+ FormText = "Users"
+ Icon = My.Resources.UsersIcon_32
+ MyDefs.DelegateClosingChecker = False
+ Mode = SimpleListFormModes.SelectedItems
+ MultiSelect = False
+ Size = New Size(300, 400)
+ End Sub
+ Protected Overrides Sub MyForm_KeyDown(sender As Object, e As KeyEventArgs)
+ Try
+ If e.KeyCode = Keys.F And e.Control Then
+ e.Handled = True
+ FocusUser()
+ ElseIf e = ShowUsersButtonKey Then
+ MsgBoxE(New MMessage(DataSourceCollection.ListToStringE(vbCr, Provider,,, EDP.LogMessageValue), "User list") With {.Editable = True})
+ End If
+ Catch
+ End Try
+ End Sub
+ Friend Overloads Shared Sub Show(ByVal Users As IEnumerable(Of IUserData))
+ If Users.ListExists Then
+ MainFrameObj.OpenedGroupUsersForms.Add(New GroupUsersViewer(Users))
+ MainFrameObj.OpenedGroupUsersForms.Last.Show()
+ Else
+ MsgBoxE({"No users were found based on the selected parameters", "Show group users"}, vbExclamation)
+ End If
+ End Sub
+ Protected Overrides Sub CMB_DATA_ActionOnListDoubleClick(ByVal Sender As Object, ByVal e As EventArgs, ByVal Item As ListViewItem)
+ FocusUser()
+ End Sub
+ Private Sub FocusUser()
+ Try
+ If _LatestSelected.ValueBetween(0, DataSourceCollection.Count - 1) Then MainFrameObj.FocusUser(DataSourceCollection(_LatestSelected).Key, True)
+ Catch
+ End Try
+ End Sub
+ Friend Overloads Sub Show()
+ MyForm.Show()
+ End Sub
+ End Class
+End Namespace
\ No newline at end of file
diff --git a/SCrawler/Editors/GlobalSettingsForm.Designer.vb b/SCrawler/Editors/GlobalSettingsForm.Designer.vb
index 3677708..176d6fa 100644
--- a/SCrawler/Editors/GlobalSettingsForm.Designer.vb
+++ b/SCrawler/Editors/GlobalSettingsForm.Designer.vb
@@ -72,23 +72,27 @@ Namespace Editors
Dim ActionButton20 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
Dim ActionButton21 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
Dim ActionButton22 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
+ Dim ActionButton23 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton()
+ 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 TAB_STD As System.Windows.Forms.TabPage
Dim TP_STD As System.Windows.Forms.TableLayoutPanel
- Dim ActionButton23 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 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 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 TP_HEADERS_DEF 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 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 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()
@@ -147,6 +151,7 @@ Namespace Editors
Me.TXT_CHANNELS_COLUMNS = New PersonalUtilities.Forms.Controls.TextBoxExtended()
Me.CH_DOWN_IMAGES_NATIVE = New System.Windows.Forms.CheckBox()
Me.TXT_CHANNEL_USER_POST_LIMIT = New PersonalUtilities.Forms.Controls.TextBoxExtended()
+ Me.CH_CHANNELS_USERS_READY_MARK = New System.Windows.Forms.CheckBox()
Me.TXT_FOLDER_CMD = New PersonalUtilities.Forms.Controls.TextBoxExtended()
Me.CH_EXIT_CONFIRM = New System.Windows.Forms.CheckBox()
Me.CH_CLOSE_TO_TRAY = New System.Windows.Forms.CheckBox()
@@ -194,7 +199,6 @@ Namespace Editors
Me.TAB_MAIN = New System.Windows.Forms.TabControl()
Me.TAB_ENVIR = New System.Windows.Forms.TabPage()
Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer()
- Me.CH_CHANNELS_USERS_READY_MARK = 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()
@@ -1237,6 +1241,17 @@ Namespace Editors
Me.TXT_CHANNEL_USER_POST_LIMIT.Text = "1"
Me.TXT_CHANNEL_USER_POST_LIMIT.TextBoxTextAlign = System.Windows.Forms.HorizontalAlignment.Center
'
+ 'CH_CHANNELS_USERS_READY_MARK
+ '
+ Me.CH_CHANNELS_USERS_READY_MARK.AutoSize = True
+ Me.CH_CHANNELS_USERS_READY_MARK.Dock = System.Windows.Forms.DockStyle.Fill
+ Me.CH_CHANNELS_USERS_READY_MARK.Location = New System.Drawing.Point(4, 140)
+ Me.CH_CHANNELS_USERS_READY_MARK.Name = "CH_CHANNELS_USERS_READY_MARK"
+ Me.CH_CHANNELS_USERS_READY_MARK.Size = New System.Drawing.Size(607, 19)
+ Me.CH_CHANNELS_USERS_READY_MARK.TabIndex = 5
+ Me.CH_CHANNELS_USERS_READY_MARK.Text = "Set the user's mark 'Ready for download' when add from channels"
+ Me.CH_CHANNELS_USERS_READY_MARK.UseVisualStyleBackColor = True
+ '
'TAB_BEHAVIOR
'
TAB_BEHAVIOR.Controls.Add(TP_BEHAVIOR)
@@ -1832,10 +1847,15 @@ Namespace Editors
ActionButton13.Name = "Open"
ActionButton13.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
ActionButton14.BackgroundImage = CType(resources.GetObject("ActionButton14.BackgroundImage"), System.Drawing.Image)
- ActionButton14.Name = "Clear"
- ActionButton14.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
+ 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)
+ Me.TXT_YTDLP.Buttons.Add(ActionButton15)
Me.TXT_YTDLP.CaptionText = "yt-dlp"
Me.TXT_YTDLP.CaptionToolTipEnabled = True
Me.TXT_YTDLP.CaptionToolTipText = "Path to yt-dlp.exe file"
@@ -1849,14 +1869,19 @@ Namespace Editors
'
'TXT_FFMPEG
'
- ActionButton15.BackgroundImage = CType(resources.GetObject("ActionButton15.BackgroundImage"), System.Drawing.Image)
- ActionButton15.Name = "Open"
- ActionButton15.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
ActionButton16.BackgroundImage = CType(resources.GetObject("ActionButton16.BackgroundImage"), System.Drawing.Image)
- ActionButton16.Name = "Clear"
- ActionButton16.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_FFMPEG.Buttons.Add(ActionButton15)
+ 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)
+ Me.TXT_FFMPEG.Buttons.Add(ActionButton18)
Me.TXT_FFMPEG.CaptionText = "ffmpeg"
Me.TXT_FFMPEG.CaptionToolTipEnabled = True
Me.TXT_FFMPEG.CaptionToolTipText = "Path to ffmpeg.exe file"
@@ -1870,14 +1895,19 @@ Namespace Editors
'
'TXT_CURL
'
- ActionButton17.BackgroundImage = CType(resources.GetObject("ActionButton17.BackgroundImage"), System.Drawing.Image)
- ActionButton17.Name = "Open"
- ActionButton17.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
- ActionButton18.BackgroundImage = CType(resources.GetObject("ActionButton18.BackgroundImage"), System.Drawing.Image)
- ActionButton18.Name = "Clear"
- ActionButton18.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_CURL.Buttons.Add(ActionButton17)
- Me.TXT_CURL.Buttons.Add(ActionButton18)
+ 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)
+ Me.TXT_CURL.Buttons.Add(ActionButton21)
Me.TXT_CURL.CaptionText = "cURL"
Me.TXT_CURL.CaptionToolTipEnabled = True
Me.TXT_CURL.CaptionToolTipText = "Path to curl.exe file"
@@ -1891,14 +1921,19 @@ Namespace Editors
'
'TXT_GALLERYDL
'
- 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 = "Clear"
- ActionButton20.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_GALLERYDL.Buttons.Add(ActionButton19)
- Me.TXT_GALLERYDL.Buttons.Add(ActionButton20)
+ 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)
+ Me.TXT_GALLERYDL.Buttons.Add(ActionButton24)
Me.TXT_GALLERYDL.CaptionText = "gallery-dl"
Me.TXT_GALLERYDL.CaptionToolTipText = "Path to gallery-dl.exe file"
Me.TXT_GALLERYDL.CaptionWidth = 80.0R
@@ -1911,14 +1946,14 @@ Namespace Editors
'
'TXT_CMD_ENCODING
'
- ActionButton21.BackgroundImage = CType(resources.GetObject("ActionButton21.BackgroundImage"), System.Drawing.Image)
- ActionButton21.Name = "Refresh"
- ActionButton21.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh
- ActionButton22.BackgroundImage = CType(resources.GetObject("ActionButton22.BackgroundImage"), System.Drawing.Image)
- ActionButton22.Name = "Clear"
- ActionButton22.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_CMD_ENCODING.Buttons.Add(ActionButton21)
- Me.TXT_CMD_ENCODING.Buttons.Add(ActionButton22)
+ 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)
Me.TXT_CMD_ENCODING.CaptionText = "CMD Encoding"
Me.TXT_CMD_ENCODING.CaptionToolTipEnabled = True
Me.TXT_CMD_ENCODING.CaptionToolTipText = "Command line encoding"
@@ -2021,10 +2056,10 @@ Namespace Editors
'
'CMB_STD_OPEN_DBL
'
- ActionButton23.BackgroundImage = CType(resources.GetObject("ActionButton23.BackgroundImage"), System.Drawing.Image)
- ActionButton23.Name = "ArrowDown"
- ActionButton23.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown
- Me.CMB_STD_OPEN_DBL.Buttons.Add(ActionButton23)
+ 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)
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
@@ -2106,10 +2141,10 @@ Namespace Editors
'
'TXT_PRG_TITLE
'
- ActionButton24.BackgroundImage = CType(resources.GetObject("ActionButton24.BackgroundImage"), System.Drawing.Image)
- ActionButton24.Name = "Clear"
- ActionButton24.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_PRG_TITLE.Buttons.Add(ActionButton24)
+ 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)
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"
@@ -2121,10 +2156,10 @@ Namespace Editors
'
'TXT_PRG_DESCR
'
- ActionButton25.BackgroundImage = CType(resources.GetObject("ActionButton25.BackgroundImage"), System.Drawing.Image)
- ActionButton25.Name = "Clear"
- ActionButton25.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_PRG_DESCR.Buttons.Add(ActionButton25)
+ 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)
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"
@@ -2136,14 +2171,14 @@ Namespace Editors
'
'TXT_USER_LIST_IMAGE
'
- ActionButton26.BackgroundImage = CType(resources.GetObject("ActionButton26.BackgroundImage"), System.Drawing.Image)
- ActionButton26.Name = "Open"
- ActionButton26.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open
- ActionButton27.BackgroundImage = CType(resources.GetObject("ActionButton27.BackgroundImage"), System.Drawing.Image)
- ActionButton27.Name = "Clear"
- ActionButton27.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_USER_LIST_IMAGE.Buttons.Add(ActionButton26)
- Me.TXT_USER_LIST_IMAGE.Buttons.Add(ActionButton27)
+ 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)
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"
@@ -2217,10 +2252,10 @@ Namespace Editors
'
'TXT_H_DEF_UserAgent
'
- ActionButton28.BackgroundImage = CType(resources.GetObject("ActionButton28.BackgroundImage"), System.Drawing.Image)
- ActionButton28.Name = "Clear"
- ActionButton28.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_H_DEF_UserAgent.Buttons.Add(ActionButton28)
+ 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)
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
@@ -2231,10 +2266,10 @@ Namespace Editors
'
'TXT_H_DEF_sec_ch_ua
'
- ActionButton29.BackgroundImage = CType(resources.GetObject("ActionButton29.BackgroundImage"), System.Drawing.Image)
- ActionButton29.Name = "Clear"
- ActionButton29.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_H_DEF_sec_ch_ua.Buttons.Add(ActionButton29)
+ 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)
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
@@ -2245,10 +2280,10 @@ Namespace Editors
'
'TXT_H_DEF_sec_ch_ua_full_version_list
'
- ActionButton30.BackgroundImage = CType(resources.GetObject("ActionButton30.BackgroundImage"), System.Drawing.Image)
- ActionButton30.Name = "Clear"
- ActionButton30.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_H_DEF_sec_ch_ua_full_version_list.Buttons.Add(ActionButton30)
+ 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)
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
@@ -2259,10 +2294,10 @@ Namespace Editors
'
'TXT_H_DEF_sec_ch_ua_platform
'
- ActionButton31.BackgroundImage = CType(resources.GetObject("ActionButton31.BackgroundImage"), System.Drawing.Image)
- ActionButton31.Name = "Clear"
- ActionButton31.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear
- Me.TXT_H_DEF_sec_ch_ua_platform.Buttons.Add(ActionButton31)
+ 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)
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
@@ -2273,10 +2308,10 @@ Namespace Editors
'
'TXT_H_DEF_sec_ch_ua_platform_version
'
- 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_sec_ch_ua_platform_version.Buttons.Add(ActionButton32)
+ 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)
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
@@ -2339,17 +2374,6 @@ Namespace Editors
Me.CONTAINER_MAIN.TabIndex = 0
Me.CONTAINER_MAIN.TopToolStripPanelVisible = False
'
- 'CH_CHANNELS_USERS_READY_MARK
- '
- Me.CH_CHANNELS_USERS_READY_MARK.AutoSize = True
- Me.CH_CHANNELS_USERS_READY_MARK.Dock = System.Windows.Forms.DockStyle.Fill
- Me.CH_CHANNELS_USERS_READY_MARK.Location = New System.Drawing.Point(4, 140)
- Me.CH_CHANNELS_USERS_READY_MARK.Name = "CH_CHANNELS_USERS_READY_MARK"
- Me.CH_CHANNELS_USERS_READY_MARK.Size = New System.Drawing.Size(607, 19)
- Me.CH_CHANNELS_USERS_READY_MARK.TabIndex = 5
- Me.CH_CHANNELS_USERS_READY_MARK.Text = "Set the user's mark 'Ready for download' when add from channels"
- Me.CH_CHANNELS_USERS_READY_MARK.UseVisualStyleBackColor = True
- '
'GlobalSettingsForm
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
diff --git a/SCrawler/Editors/GlobalSettingsForm.resx b/SCrawler/Editors/GlobalSettingsForm.resx
index 7060d2a..0d2642f 100644
--- a/SCrawler/Editors/GlobalSettingsForm.resx
+++ b/SCrawler/Editors/GlobalSettingsForm.resx
@@ -353,24 +353,21 @@ You can find more detailed information about the missing posts in the form that
- iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
- 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
- wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
- WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP
- aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+
- 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8
- vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB
- cMaRN0UdBBkAAAAASUVORK5CYII=
-
-
-
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
@@ -378,7 +375,7 @@ You can find more detailed information about the missing posts in the form that
AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
-
+
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP
@@ -387,6 +384,22 @@ You can find more detailed information about the missing posts in the form that
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==
@@ -409,6 +422,22 @@ You can find more detailed information about the missing posts in the form that
+
+ 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
@@ -416,7 +445,18 @@ You can find more detailed information about the missing posts in the form that
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
@@ -432,7 +472,31 @@ 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/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
@@ -446,7 +510,7 @@ You can find more detailed information about the missing posts in the form that
False
-
+
iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t
3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL
@@ -542,44 +606,6 @@ 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=
-
-
-
-
- iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
- xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go
- tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX
- AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC
-
-
-
- False
-
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
@@ -599,9 +625,12 @@ You can find more detailed information about the missing posts in the form that
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=
@@ -612,12 +641,47 @@ 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
+
+
+
+
+ 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
+ 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 7b83470..d32ce18 100644
--- a/SCrawler/Editors/GlobalSettingsForm.vb
+++ b/SCrawler/Editors/GlobalSettingsForm.vb
@@ -18,6 +18,7 @@ Namespace Editors
Friend Property FeedParametersChanged As Boolean = False
Friend Property HeadersChanged As Boolean = False
Friend Property PictureChanged As Boolean = False
+ Friend Property EnvironmentProgramsChanged As Boolean = False
Friend Sub New()
InitializeComponent()
MyDefs = New DefaultFormOptions(Me, Settings.Design)
@@ -239,6 +240,8 @@ Namespace Editors
.YtdlpFile.File = TXT_YTDLP.Text
.GalleryDLFile.File = TXT_GALLERYDL.Text
.CMDEncoding.Value = AConvert(Of Integer)(TXT_CMD_ENCODING.Text, SettingsCLS.DefaultCmdEncoding)
+ EnvironmentProgramsChanged = { .FfmpegFile, .CurlFile, .YtdlpFile, .GalleryDLFile}.Any(Function(p) p.ChangesDetected) Or
+ .CMDEncoding.ChangesDetected
'Headers
.HEADER_UserAgent.Value = TXT_H_DEF_UserAgent.Text
.HEADER_sec_ch_ua.Value = TXT_H_DEF_sec_ch_ua.Text
@@ -404,17 +407,35 @@ Namespace Editors
TXT_CURL.ActionOnButtonClick,
TXT_YTDLP.ActionOnButtonClick,
TXT_GALLERYDL.ActionOnButtonClick
- If Sender.DefaultButton = ADB.Open AndAlso Not e Is Nothing AndAlso Not e.AssociatedControl Is Nothing Then
- Dim __chooseNewFile As Action(Of TextBoxExtended, String) = Sub(ByVal cnt As TextBoxExtended, ByVal __name As String)
- Dim f As SFile = cnt.Text
- f = SFile.SelectFiles(f, False, $"Select the {__name} program file.", "EXE|*.exe", EDP.ReturnValue).FirstOrDefault
- If Not f.IsEmptyString Then cnt.Text = f
- End Sub
+ If (e.DefaultButton = ADB.Open Or e.DefaultButton = ADB.Refresh) And Not e.AssociatedControl Is Nothing Then
+ Dim __chooseNewFile As Action(Of TextBoxExtended, String) =
+ Sub(ByVal cnt As TextBoxExtended, ByVal __name As String)
+ Dim f As SFile = cnt.Text
+ f = SFile.SelectFiles(f, False, $"Select the {__name} program file.", "EXE|*.exe", EDP.ReturnValue).FirstOrDefault
+ If Not f.IsEmptyString Then cnt.Text = f
+ End Sub
+ Dim __findEnvir As Action(Of TextBoxExtended, String, String) =
+ Sub(ByVal cnt As TextBoxExtended, ByVal program As String, ByVal additPath As String)
+ Dim f As SFile = SettingsCLS.ProgramFile.Find(program, additPath)
+ If Not f.IsEmptyString Then
+ cnt.Text = f
+ Else
+ MsgBoxE({$"'{program}' not found in the environment!", "Find a program..."}, vbCritical)
+ End If
+ End Sub
+ Dim __autoDecision As Action(Of TextBoxExtended, String, String, String) =
+ Sub(ByVal cnt As TextBoxExtended, ByVal __name As String, ByVal program As String, ByVal additPath As String)
+ If e.DefaultButton = ADB.Open Then
+ __chooseNewFile.Invoke(cnt, __name)
+ ElseIf e.DefaultButton = ADB.Refresh Then
+ __findEnvir.Invoke(cnt, program, additPath)
+ End If
+ End Sub
Select Case CStr(DirectCast(e.AssociatedControl, Control).Tag)
- Case "f" : __chooseNewFile.Invoke(e.AssociatedControl, "ffmpeg")
- Case "c" : __chooseNewFile.Invoke(e.AssociatedControl, "curl")
- Case "y" : __chooseNewFile.Invoke(e.AssociatedControl, "yt-dlp")
- Case "g" : __chooseNewFile.Invoke(e.AssociatedControl, "gallery-dl")
+ Case "f" : __autoDecision.Invoke(e.AssociatedControl, "ffmpeg", SettingsCLS.ProgramFile.File_FFMPEG, String.Empty)
+ Case "c" : __autoDecision.Invoke(e.AssociatedControl, "curl", SettingsCLS.ProgramFile.File_CURL, SettingsCLS.ProgramFile.File_CIRL_ADDIT_PATH)
+ Case "y" : __autoDecision.Invoke(e.AssociatedControl, "yt-dlp", SettingsCLS.ProgramFile.File_YTDLP, String.Empty)
+ Case "g" : __autoDecision.Invoke(e.AssociatedControl, "gallery-dl", SettingsCLS.ProgramFile.File_GDL, String.Empty)
End Select
End If
End Sub
diff --git a/SCrawler/MainFrame.vb b/SCrawler/MainFrame.vb
index d453fd1..1e4873c 100644
--- a/SCrawler/MainFrame.vb
+++ b/SCrawler/MainFrame.vb
@@ -162,6 +162,7 @@ Public Class MainFrame
While Downloader.Working Or ChannelsWorking.Invoke Or SP_Working.Invoke : Thread.Sleep(500) : End While
End Sub)
End If
+ MainFrameObj.OpenedGroupUsersForms.ListClearDispose
Downloader.Dispose()
MyProgressForm.Dispose()
InfoForm.Dispose()
@@ -322,6 +323,7 @@ CloseResume:
UpdateImageColor(True, True)
End If
TrayIcon.Visible = .CloseToTray
+ If f.EnvironmentProgramsChanged Then Settings.UpdateEnvironmentPrograms()
If f.FeedParametersChanged And Not MyFeed Is Nothing Then MyFeed.UpdateSettings()
If f.HeadersChanged Then
Settings.BeginUpdate()
diff --git a/SCrawler/MainFrameObjects.vb b/SCrawler/MainFrameObjects.vb
index 6a2c501..618f82c 100644
--- a/SCrawler/MainFrameObjects.vb
+++ b/SCrawler/MainFrameObjects.vb
@@ -13,10 +13,12 @@ Imports PersonalUtilities.Tools.Notifications
Imports NotifyObj = SCrawler.SettingsCLS.NotificationObjects
Friend Class MainFrameObjects : Implements INotificator
Friend ReadOnly Property MF As MainFrame
+ Friend ReadOnly OpenedGroupUsersForms As List(Of DownloadObjects.Groups.GroupUsersViewer)
Private WithEvents Notificator As NotificationsManager
Friend ReadOnly Property PauseButtons As DownloadObjects.AutoDownloaderPauseButtons
Friend Sub New(ByRef f As MainFrame)
MF = f
+ OpenedGroupUsersForms = New List(Of DownloadObjects.Groups.GroupUsersViewer)
Notificator = New NotificationsManager
PauseButtons = New DownloadObjects.AutoDownloaderPauseButtons(DownloadObjects.AutoDownloaderPauseButtons.ButtonsPlace.MainFrame)
ProgramLogInitialize()
diff --git a/SCrawler/MainMod.vb b/SCrawler/MainMod.vb
index aedd8fb..7838c02 100644
--- a/SCrawler/MainMod.vb
+++ b/SCrawler/MainMod.vb
@@ -74,6 +74,8 @@ Friend Module MainMod
Friend UserListLoader As ListImagesLoader
Friend MyProgressForm As ActiveDownloadingProgress
Friend MainFrameObj As MainFrameObjects
+ ''' Alt+F1
+ Friend ReadOnly ShowUsersButtonKey As New PersonalUtilities.Forms.ButtonKey(Keys.F1,, True)
Friend ReadOnly DateTimeDefaultProvider As New ADateTime(ADateTime.Formats.BaseDateTime)
Friend ReadOnly SessionDateTimeProvider As New ADateTime("yyyyMMdd_HHmmss")
Friend ReadOnly FeedVideoLengthProvider As New ADateTime("hh\:mm\:ss") With {.TimeParseMode = ADateTime.TimeModes.TimeSpan}
diff --git a/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb b/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb
index b3f924a..d35c986 100644
--- a/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb
+++ b/SCrawler/PluginsEnvironment/Hosts/SettingsHost.vb
@@ -435,6 +435,11 @@ Namespace Plugin.Hosts
Return New SettingsHost(Source.Clone(False), Path, Temporary, DownloadImages, DownloadVideos) With {.SavedPostsPath = SavedPostsPath, .Path = Path}
End Function
#Region "Forks"
+ Friend Sub UpdateEnvironmentPrograms(ByVal EnvironmentPrograms As IEnumerable(Of String), ByVal CMDEncoding As String)
+ Source.EnvironmentPrograms = EnvironmentPrograms
+ Source.CMDEncoding = CMDEncoding
+ Source.EnvironmentProgramsUpdated()
+ End Sub
Friend Function IsMyUser(ByVal UserURL As String) As ExchangeOptions
Dim s As ExchangeOptions = Source.IsMyUser(UserURL)
If Not s.UserName.IsEmptyString Then s.HostKey = Key
diff --git a/SCrawler/PluginsEnvironment/Hosts/SettingsHostCollection.vb b/SCrawler/PluginsEnvironment/Hosts/SettingsHostCollection.vb
index add505e..3fe5558 100644
--- a/SCrawler/PluginsEnvironment/Hosts/SettingsHostCollection.vb
+++ b/SCrawler/PluginsEnvironment/Hosts/SettingsHostCollection.vb
@@ -393,6 +393,9 @@ Namespace Plugin.Hosts
Hosts.ForEach(Sub(h) h.DownloadDone(What))
HostsUnavailableIndexes.Clear()
End Sub
+ Friend Sub UpdateEnvironmentPrograms(ByVal EnvironmentPrograms As IEnumerable(Of String), ByVal CMDEncoding As String)
+ If Count > 0 Then Hosts.ForEach(Sub(h) h.UpdateEnvironmentPrograms(EnvironmentPrograms, CMDEncoding))
+ End Sub
Friend Function IsMyUser(ByVal UserURL As String) As ExchangeOptions
Return [Default].IsMyUser(UserURL)
End Function
diff --git a/SCrawler/SCrawler.vbproj b/SCrawler/SCrawler.vbproj
index ed9faff..3710022 100644
--- a/SCrawler/SCrawler.vbproj
+++ b/SCrawler/SCrawler.vbproj
@@ -308,6 +308,7 @@
Form
+
MissingPostsForm.vb
diff --git a/SCrawler/SettingsCLS.vb b/SCrawler/SettingsCLS.vb
index 2a80fcc..34c85e3 100644
--- a/SCrawler/SettingsCLS.vb
+++ b/SCrawler/SettingsCLS.vb
@@ -43,7 +43,22 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
Private ReadOnly MyXML As XmlFile
#End Region
#Region "Media environment"
+ Friend ReadOnly Property EnvironmentProgramsList As List(Of String)
+ Friend Sub UpdateEnvironmentPrograms()
+ Dim a As Action(Of ProgramFile) = Sub(f) If f.Exists Then EnvironmentProgramsList.Add(f.File.ToString)
+ EnvironmentProgramsList.Clear()
+ a.Invoke(FfmpegFile)
+ a.Invoke(YtdlpFile)
+ a.Invoke(GalleryDLFile)
+ a.Invoke(CurlFile)
+ Plugins.ForEach(Sub(p) p.Settings.UpdateEnvironmentPrograms(EnvironmentProgramsList, CMDEncoding.Value))
+ End Sub
Friend Class ProgramFile
+ Friend Const File_FFMPEG As String = "ffmpeg.exe"
+ Friend Const File_YTDLP As String = "yt-dlp.exe"
+ Friend Const File_GDL As String = "gallery-dl.exe"
+ Friend Const File_CURL As String = "curl.exe"
+ Friend Const File_CIRL_ADDIT_PATH As String = "cURL"
Private ReadOnly XML As XMLValue(Of SFile)
Friend Property File As SFile
Get
@@ -60,25 +75,35 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
Return _Exists
End Get
End Property
+ Friend ReadOnly Property ChangesDetected As Boolean
+ Get
+ Return XML.ChangesDetected
+ End Get
+ End Property
Friend Sub New(ByVal ElementName As String, ByRef Container As EContainer, ByVal Nodes As String(), ByVal Program As String,
Optional ByVal AdditPath As String = Nothing)
XML = New XMLValue(Of SFile)(ElementName,, Container, Nodes)
If Not XML.Value.Exists Then
If Program.CSFile.Exists Then
XML.Value = Program
- ElseIf $"{EnvironmentPath}{Program}".CSFile.Exists Then
- XML.Value = $"{EnvironmentPath}{Program}"
- ElseIf Not AdditPath.IsEmptyString AndAlso $"{AdditPath}\{Program}".CSFile.Exists Then
- XML.Value = $"{AdditPath}\{Program}"
- ElseIf Not AdditPath.IsEmptyString AndAlso $"{EnvironmentPath}{AdditPath}\{Program}".CSFile.Exists Then
- XML.Value = $"{EnvironmentPath}{AdditPath}\{Program}"
Else
- XML.Value = SystemEnvironment.FindFileInPaths(Program).ListIfNothing.FirstOrDefault
+ XML.Value = Find(Program, AdditPath)
End If
End If
If Not XML.Value.Exists Then XML.Value = Nothing
_Exists = File.Exists
End Sub
+ Friend Shared Function Find(ByVal Program As String, Optional ByVal AdditPath As String = Nothing) As SFile
+ If $"{EnvironmentPath}{Program}".CSFile.Exists Then
+ Return $"{EnvironmentPath}{Program}"
+ ElseIf Not AdditPath.IsEmptyString AndAlso $"{AdditPath}\{Program}".CSFile.Exists Then
+ Return $"{AdditPath}\{Program}"
+ ElseIf Not AdditPath.IsEmptyString AndAlso $"{EnvironmentPath}{AdditPath}\{Program}".CSFile.Exists Then
+ Return $"{EnvironmentPath}{AdditPath}\{Program}"
+ Else
+ Return SystemEnvironment.FindFileInPaths(Program).ListIfNothing.FirstOrDefault
+ End If
+ End Function
Public Shared Widening Operator CType(ByVal f As ProgramFile) As SFile
Return f.File
End Operator
@@ -173,6 +198,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
GlobalLocations.Load(True,, $"{SettingsFolderName}\GlobalLocations.xml")
Feeds = New FeedSpecialCollection
Colors = New Editors.DataColorCollection
+ EnvironmentProgramsList = New List(Of String)
AutomationFile = New XMLValue(Of String)("AutomationFile",, MyXML)
@@ -188,7 +214,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
'Environment
n = {"MediaEnvironment"}
EnvironmentPath.CSFileP.Exists(SFO.Path, True)
- FfmpegFile = New ProgramFile("ffmpeg", MyXML, n, "ffmpeg.exe")
+ FfmpegFile = New ProgramFile("ffmpeg", MyXML, n, ProgramFile.File_FFMPEG)
FFMPEGNotification = New XMLValue(Of Boolean)("FFMPEGNotification", True, MyXML, n)
If Not FfmpegFile.Exists Then
If FFMPEGNotification.Value AndAlso
@@ -197,9 +223,10 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
Else
FFMPEGNotification.Value = True
End If
- YtdlpFile = New ProgramFile("ytdlp", MyXML, n, "yt-dlp.exe")
- GalleryDLFile = New ProgramFile("gallerydl", MyXML, n, "gallery-dl.exe")
- CurlFile = New ProgramFile("curl", MyXML, n, "curl.exe", "cURL")
+
+ YtdlpFile = New ProgramFile("ytdlp", MyXML, n, ProgramFile.File_YTDLP)
+ GalleryDLFile = New ProgramFile("gallerydl", MyXML, n, ProgramFile.File_GDL)
+ CurlFile = New ProgramFile("curl", MyXML, n, ProgramFile.File_CURL, ProgramFile.File_CIRL_ADDIT_PATH)
CMDEncoding = New XMLValue(Of Integer)("CMDEncoding", DefaultCmdEncoding, MyXML, n)
#End Region
#Region "Properties"
@@ -428,6 +455,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable
Next
Plugins.AddRange(tmpPluginList)
End If
+ UpdateEnvironmentPrograms()
#End Region
Labels = New LabelsKeeper(MyXML)