From 0b0933b6f0072a36243209eb4a9c2405cd5d201f Mon Sep 17 00:00:00 2001 From: Andy <88590076+AAndyProgram@users.noreply.github.com> Date: Wed, 24 Jul 2024 23:40:53 +0300 Subject: [PATCH] 2024.7.24.0 YT YouTubeSettings: add 'DefaultVideoConvertNonAVC' property; fix 'OpenFolderInOtherProgram' property serialize and reset; add 'MusicPlaylistCreate_CreationMode' property Update the 'CleanFileName' function to remove line breaks Add the ability to convert non-avc codecs to avc Add 'M3U8CreationMode' enum SCrawler API.OnlyFans: fix incorrect delimiter (rules parsing) API.Threads: add saved posts downloading Feed: add the hotkeys 'Esc' and 'Ctrl+W' to close the form; add the ability to search for missing files in special feeds Scheduler: add the ability to execute a script after the scheduler plan is executed Settings: add enable/disable the use of the 'Esc' to close the feed; add 'AutomationScript' and 'AutomationScript_ExcludeManual' properties MainFrame: add the hotkey 'Ctrl+F' to show the feed; change the hotkey from 'Ctrl+F' to 'Alt+F' to show the search form --- Changelog.md | 23 + ProgramScreenshots/SettingsGlobalBehavior.png | Bin 16108 -> 18371 bytes ProgramScreenshots/SettingsGlobalFeed.png | Bin 22445 -> 24795 bytes README.md | 16 +- SCrawler.YouTube/Base/Structures.vb | 5 + SCrawler.YouTube/Base/YouTubeSettings.vb | 20 +- SCrawler.YouTube/Declarations.vb | 1 + SCrawler.YouTube/My Project/AssemblyInfo.vb | 4 +- .../Objects/YouTubeMediaContainerBase.vb | 94 ++- .../My Project/AssemblyInfo.vb | 4 +- SCrawler/API/Instagram/SiteSettings.vb | 5 +- SCrawler/API/OnlyFans/DynamicRulesEnv.vb | 11 +- SCrawler/API/Reddit/SiteSettings.vb | 10 +- SCrawler/API/ThreadsNet/SiteSettings.vb | 2 +- SCrawler/API/ThreadsNet/UserData.vb | 88 ++- SCrawler/Download/Automation/Scheduler.vb | 2 + SCrawler/Download/Feed/DownloadFeedForm.vb | 3 +- SCrawler/Download/Feed/FeedSpecial.vb | 57 +- .../Editors/GlobalSettingsForm.Designer.vb | 550 +++++++++++------- SCrawler/Editors/GlobalSettingsForm.resx | 118 ++-- SCrawler/Editors/GlobalSettingsForm.vb | 12 + SCrawler/MainFrame.Designer.vb | 2 +- SCrawler/MainFrame.vb | 4 +- SCrawler/My Project/AssemblyInfo.vb | 4 +- SCrawler/SettingsCLS.vb | 24 +- 25 files changed, 721 insertions(+), 338 deletions(-) diff --git a/Changelog.md b/Changelog.md index 6c81421..3ab6b70 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,26 @@ +# 2024.7.24.0 + +*2024-07-24* + +- Added + - YouTube (standalone app) + - ability to convert non-`AVC` codecs (eg `VP9`) to `AVC` (`Settings` - `Defaults Video` - `Convert non-AVC codecs to AVC`) + - add the ability to set the playlist creation mode: absolute links, relative links, or both (`Settings` - `Music` - `Create M3U8: creation mode`) + - Threads: **saved posts downloading** + - Feed + - hotkeys `Esc` and `Ctrl+W` to close the form + - the ability to search for missing files in *special feeds* + - Scheduler: the ability to execute a script after the scheduler plan is executed *(`Settings` - `Behavior`)* + - Main window: + - added hotkey `Ctrl+F` to show the feed + - changed the hotkey from `Ctrl+F` to `Alt+F` to show the search form +- Updated + - yt-dlp up to version **2024.07.16** +- Fixed + - YouTube (standalone app): video files with line breaks in the name do not download correctly + - OnlyFans: rules parsing bug + - Minor bugs + # 2024.6.25.0 *2024-06-25* diff --git a/ProgramScreenshots/SettingsGlobalBehavior.png b/ProgramScreenshots/SettingsGlobalBehavior.png index 3808dd34d5bc777014ee79aead18b55a7930a543..51ad23c9de70603962d6a7588c906a7807cff118 100644 GIT binary patch literal 18371 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 VlZpUdc94-df7a?u(dldV{x2(5rq2KX literal 16108 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 diff --git a/ProgramScreenshots/SettingsGlobalFeed.png b/ProgramScreenshots/SettingsGlobalFeed.png index 9859e9a56f388958cf00b6492b4ac9bb37cfdcf4..aeb559657310f341f80d9e966f9e2ab40e76fd20 100644 GIT binary patch literal 24795 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 literal 22445 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 diff --git a/README.md b/README.md index 1b7fe77..0742a3e 100644 --- a/README.md +++ b/README.md @@ -33,16 +33,16 @@ A program to download photo and video from [any site](#supported-sites) (e.g. Yo ![YouTube application](ProgramScreenshots/AppYouTube.png) # What can program do: -- Download pictures and videos from users' profiles and subreddits: +- Download pictures and videos from user profiles: - YouTube videos, shorts, community feeds, users, artists, playlists, music, tracks; - Reddit images, galleries of images, videos, saved posts; - - Redgifs videos (https://www.redgifs.com/); + - Redgifs images and videos (https://www.redgifs.com/); - Twitter images and videos, saved (bookmarked) posts, likes, communities; - OnlyFans images and videos, saved (bookmarked) posts, stories; - JustForFans images and videos, saved (bookmarked) posts; - Mastodon images and videos, saved (bookmarked) posts; - Instagram images and videos, tagged posts, stories, saved posts; - - Threads images and videos; + - Threads images and videos, saved posts; - Facebook images and videos, stories, saved posts; - TikTok videos; - Pinterest boards, users, saved posts; @@ -57,7 +57,7 @@ A program to download photo and video from [any site](#supported-sites) (e.g. Yo - Download [saved posts](https://github.com/AAndyProgram/SCrawler/wiki/Home#saved-posts) - Add users from parsed channel - **Advanced user management** -- **Automation** ([downloading data automatically](https://github.com/AAndyProgram/SCrawler/wiki/Settings#automation) every ```X``` minutes) +- **Automation** ([downloading data automatically](https://github.com/AAndyProgram/SCrawler/wiki/Settings#automation) every `X` minutes) - **Feed** ([feed](https://github.com/AAndyProgram/SCrawler/wiki#feed) of downloaded media files and subscriptions posts) - Multiple accounts support - Labeling users @@ -87,7 +87,7 @@ A program to download photo and video from [any site](#supported-sites) (e.g. Yo - TikTok - RedGifs - Pinterest -- Imgur +- Imgur *(out of support)* - Gfycat - LPSG - **PornHub** @@ -109,7 +109,7 @@ First, the program downloads the full profile. After the program downloads only # Requirements -- Windows 10, 11 with NET Framework 4.6.1 or higher (v4.6.1 must be installed). You can check version compatibility with this [tool](Tools/NET.FrameworkVersion.ps1). +- **Windows 10, 11** with NET Framework 4.6.1 or higher (v4.6.1 must be installed). You can check version compatibility with this [tool](Tools/NET.FrameworkVersion.ps1). - **[SITES REQUIREMENTS](https://github.com/AAndyProgram/SCrawler/wiki/Settings#sites-requirements)** # Guide @@ -157,7 +157,7 @@ First, the program downloads the full profile. After the program downloads only **Just download the [latest release](https://github.com/AAndyProgram/SCrawler/releases/latest), unzip the program archive to any folder and enjoy.** :blush: -**Don't put program in the ```Program Files``` system folder (this is portable program and program settings are stored in the program folder)** +**Don't put program in the `Program Files` system folder (this is portable program and program settings are stored in the program folder)** **I highly doubt you can run SCrawler on Linux or Mac. SCrawler is a program that is heavily dependent on Windows.** @@ -183,7 +183,7 @@ The program has an intuitive interface. [![How to configure](https://img.youtube.com/vi/XDn7zG4I700/0.jpg)](https://www.youtube.com/watch?v=XDn7zG4I700) -Just add a user profile and **click the ```Download``` button**. +Just add a user profile and **click the `Download` button**. ```mermaid stateDiagram diff --git a/SCrawler.YouTube/Base/Structures.vb b/SCrawler.YouTube/Base/Structures.vb index 47ba37f..7ad2e99 100644 --- a/SCrawler.YouTube/Base/Structures.vb +++ b/SCrawler.YouTube/Base/Structures.vb @@ -84,6 +84,11 @@ Namespace API.YouTube.Base Before = 1 After = 2 End Enum + Public Enum M3U8CreationMode As Integer + Relative = 0 + Absolute = 1 + Both = 2 + End Enum Public Structure MediaObject : Implements IIndexable, IComparable(Of MediaObject) Public Type As Plugin.UserMediaTypes Public ID As String diff --git a/SCrawler.YouTube/Base/YouTubeSettings.vb b/SCrawler.YouTube/Base/YouTubeSettings.vb index 9341d55..a60c6e5 100644 --- a/SCrawler.YouTube/Base/YouTubeSettings.vb +++ b/SCrawler.YouTube/Base/YouTubeSettings.vb @@ -131,22 +131,28 @@ Namespace API.YouTube.Base Private Property IDownloaderSettings_OpenFolderInOtherProgram As Boolean Implements IDownloaderSettings.OpenFolderInOtherProgram Get - Return OpenFolderInOtherProgram.Use + Return OpenFolderInOtherProgram.Attribute.ValueTemp End Get Set(ByVal use As Boolean) - OpenFolderInOtherProgram.Use = use + OpenFolderInOtherProgram.Attribute.ValueTemp = use End Set End Property + Private Function ShouldSerializeIDownloaderSettings_OpenFolderInOtherProgram() As Boolean + Return DirectCast(OpenFolderInOtherProgram.Attribute, IGridValue).ShouldSerializeValue + End Function Private Property IDownloaderSettings_OpenFolderInOtherProgram_Command As String Implements IDownloaderSettings.OpenFolderInOtherProgram_Command Get - Return OpenFolderInOtherProgram + Return OpenFolderInOtherProgram.ValueTemp End Get Set(ByVal command As String) - OpenFolderInOtherProgram.Value = command + OpenFolderInOtherProgram.ValueTemp = command End Set End Property + Private Function ShouldSerializeIDownloaderSettings_OpenFolderInOtherProgram_Command() As Boolean + Return DirectCast(OpenFolderInOtherProgram, IGridValue).ShouldSerializeValue + End Function Friend ReadOnly Property CheckUpdatesAtStart As XMLValue(Of Boolean) #End Region @@ -305,6 +311,9 @@ Namespace API.YouTube.Base Public ReadOnly Property DefaultVideoDefinition As XMLValue(Of Integer) + + Public ReadOnly Property DefaultVideoConvertNonAVC As XMLValue(Of Boolean) Public ReadOnly Property DefaultVideoEmbedThumbnail As XMLValue(Of Boolean) @@ -432,6 +441,9 @@ Namespace API.YouTube.Base Public ReadOnly Property MusicPlaylistCreate_M3U8_AppendNumber As XMLValue(Of Boolean) + + Public ReadOnly Property MusicPlaylistCreate_CreationMode As XMLValue(Of M3U8CreationMode) #End Region #End Region #Region "Defaults Subtitles" diff --git a/SCrawler.YouTube/Declarations.vb b/SCrawler.YouTube/Declarations.vb index 920dfeb..736ec3e 100644 --- a/SCrawler.YouTube/Declarations.vb +++ b/SCrawler.YouTube/Declarations.vb @@ -66,6 +66,7 @@ Namespace API.YouTube If Not f.IsEmptyString And Not f.Name.IsEmptyString Then Dim ff As SFile = f ff.Name = ff.Name.StringRemoveWinForbiddenSymbols.StringTrim + ff.Name = ff.Name.StringReplaceSymbols({vbLf, vbCr, vbCrLf}, String.Empty, EDP.ReturnValue) ff.Name = ff.Name.StringTrimEnd(".") If Not ff.Name.IsEmptyString And Not MyYouTubeSettings.FileRemoveCharacters.IsEmptyString Then _ ff.Name = ff.Name.StringReplaceSymbols(MyYouTubeSettings.FileRemoveCharacters.Value.AsList.ListCast(Of String).ToArray, String.Empty, EDP.ReturnValue) diff --git a/SCrawler.YouTube/My Project/AssemblyInfo.vb b/SCrawler.YouTube/My Project/AssemblyInfo.vb index a651acc..ad6a553 100644 --- a/SCrawler.YouTube/My Project/AssemblyInfo.vb +++ b/SCrawler.YouTube/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb b/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb index 7804a98..fb2a656 100644 --- a/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb +++ b/SCrawler.YouTube/Objects/YouTubeMediaContainerBase.vb @@ -899,10 +899,13 @@ Namespace API.YouTube.Objects Return Nothing End Try End Function - Private Function GetPlaylistRow(ByVal Element As YouTubeMediaContainerBase, Optional ByVal __file As SFile = Nothing) As String + Private Function GetPlaylistRow(ByVal Element As YouTubeMediaContainerBase, Optional ByVal __file As SFile = Nothing, + Optional ByVal Mode As M3U8CreationMode = M3U8CreationMode.Absolute) As String Const m3u8DataRow$ = "#EXTINF:{0},{1}" & vbCrLf & "{2}" With Element Dim f As SFile = __file.IfNullOrEmpty(.File) + Dim __f$ = SymbolsConverter.ASCII.EncodeSymbolsOnly(If(Mode = M3U8CreationMode.Absolute, f.ToString, f.File)) + If Mode = M3U8CreationMode.Absolute Then __f = $"file:///{__f}" Dim fName$ = .Title.IfNullOrEmpty(f.Name) If MyYouTubeSettings.MusicPlaylistCreate_M3U8_AppendNumber And .PlaylistIndex > 0 Then fName = $"{ .PlaylistIndex}. {fName}" If Not .UserTitle.IsEmptyString Then @@ -910,10 +913,7 @@ Namespace API.YouTube.Objects If MyYouTubeSettings.MusicPlaylistCreate_M3U8_AppendArtist Then fName = $"{ .UserTitle} - {fName}" End If If MyYouTubeSettings.MusicPlaylistCreate_M3U8_AppendExt Then fName &= $".{f.Extension}" - Return String.Format(m3u8DataRow, - CInt(.Duration.TotalSeconds), - fName, - $"file:///{SymbolsConverter.ASCII.EncodeSymbolsOnly(f)}") + Return String.Format(m3u8DataRow, CInt(.Duration.TotalSeconds), fName, __f) End With End Function Private ReadOnly DownloadProgressPattern As RParams = RParams.DMS("\[download\]\s*([\d\.,]+)", 1, EDP.ReturnValue) @@ -954,23 +954,41 @@ Namespace API.YouTube.Objects Dim t As TextSaver = Nothing Try Dim f As SFile - If MyYouTubeSettings.MusicPlaylistCreate_M3U8 Then - t = New TextSaver - t.AppendLine("#EXTM3U") - Elements.ForEach(Sub(e) t.AppendLine(GetPlaylistRow(e))) - f = $"{Elements(0).File.PathWithSeparator}Playlist.m3u8" - t.SaveAs(f, EDP.SendToLog) - If f.Exists Then AddFile(f) - t.Dispose() - End If - If MyYouTubeSettings.MusicPlaylistCreate_M3U Then - t = New TextSaver - Elements.ForEach(Sub(e) t.AppendLine(e.File)) - f = $"{Elements(0).File.PathWithSeparator}Playlist.m3u" - t.SaveAs(f, EDP.SendToLog) - If f.Exists Then AddFile(f) - t.Dispose() - End If + Dim arr As M3U8CreationMode() = If(MyYouTubeSettings.MusicPlaylistCreate_CreationMode.Value = M3U8CreationMode.Both, + {M3U8CreationMode.Relative, M3U8CreationMode.Absolute}, + {MyYouTubeSettings.MusicPlaylistCreate_CreationMode.Value}) + Dim postfix$ + Dim added As Boolean + Dim checkFile As Func(Of IYouTubeMediaContainer, Boolean) = Function(ByVal e As IYouTubeMediaContainer) As Boolean + If e.File.Exists Then + added = True + Return True + Else + Return False + End If + End Function + For Each cm As M3U8CreationMode In arr + If arr.Length > 1 AndAlso cm = M3U8CreationMode.Absolute Then postfix = "Abs" Else postfix = String.Empty + added = False + If MyYouTubeSettings.MusicPlaylistCreate_M3U8 Then + t = New TextSaver + t.AppendLine("#EXTM3U") + Elements.ForEach(Sub(e) If checkFile(e) Then t.AppendLine(GetPlaylistRow(e,, cm))) + f = $"{Elements(0).File.PathWithSeparator}Playlist{postfix}.m3u8" + If added Then t.SaveAs(f, EDP.SendToLog) + If f.Exists Then AddFile(f) + t.Dispose() + End If + added = False + If MyYouTubeSettings.MusicPlaylistCreate_M3U Then + t = New TextSaver + Elements.ForEach(Sub(e) If checkFile(e) Then t.AppendLine(If(cm = M3U8CreationMode.Relative, e.File.File, e.File.ToString))) + f = $"{Elements(0).File.PathWithSeparator}Playlist{postfix}.m3u" + If added Then t.SaveAs(f, EDP.SendToLog) + If f.Exists Then AddFile(f) + t.Dispose() + End If + Next Catch ex As Exception ErrorsDescriber.Execute(EDP.SendToLog, ex, "[YouTubeMediaContainerBase.Download.CreatePlaylist]") End Try @@ -1354,15 +1372,29 @@ Namespace API.YouTube.Objects 'Delete unrequsted files If tempFilesList.Count > 0 Then tempFilesList.ForEach(Sub(tfr) If Not tfr.Requested Then tfr.File.Delete(,, EDP.None)) : tempFilesList.Clear() - 'Update video FPS - If SelectedVideoIndex >= 0 AndAlso OutputVideoFPS > 0 AndAlso SelectedVideo.Bitrate <> OutputVideoFPS Then - f = File - f.Name &= "tmp00" - .Execute($"ffmpeg -i ""{File}"" -filter:v fps={OutputVideoFPS.ToString.Replace(",", ".")} -c:a copy ""{f}""") - If f.Exists Then - File.Delete() - SFile.Rename(f, File,, EDP.LogMessageValue) - End If + If SelectedVideoIndex >= 0 Then + Dim reencodeFile As Action(Of String) = + Sub(ByVal ffmpegCommand As String) + f = File + f.Name &= "tmp00" + .Execute(String.Format(ffmpegCommand, File.ToString, f.ToString)) + If f.Exists Then + If f.Size > 0 Then + File.Delete() + SFile.Rename(f, File,, EDP.LogMessageValue) + Else + f.Delete(, SFODelete.DeletePermanently, EDP.None) + End If + End If + End Sub + 'Change video codec to AVC + If MyYouTubeSettings.DefaultVideoConvertNonAVC.Value AndAlso + Not SelectedVideo.Codec.IsEmptyString AndAlso Not SelectedVideo.Codec.Trim.ToLower.StartsWith("avc") Then _ + reencodeFile("ffmpeg -i ""{0}"" -c:a copy -c:v libx264 ""{1}""") + + 'Update video FPS + If OutputVideoFPS > 0 AndAlso SelectedVideo.Bitrate <> OutputVideoFPS Then _ + reencodeFile("ffmpeg -i ""{0}"" -filter:v fps=" & OutputVideoFPS.ToString.Replace(", ", ".") & " -c:a copy ""{1}""") End If End If End If diff --git a/SCrawler.YouTubeDownloader/My Project/AssemblyInfo.vb b/SCrawler.YouTubeDownloader/My Project/AssemblyInfo.vb index ac7ce54..a5f5702 100644 --- a/SCrawler.YouTubeDownloader/My Project/AssemblyInfo.vb +++ b/SCrawler.YouTubeDownloader/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/SCrawler/API/Instagram/SiteSettings.vb b/SCrawler/API/Instagram/SiteSettings.vb index 11a0b46..039594a 100644 --- a/SCrawler/API/Instagram/SiteSettings.vb +++ b/SCrawler/API/Instagram/SiteSettings.vb @@ -443,11 +443,12 @@ Namespace API.Instagram UserRegex = RParams.DMS(String.Format(UserRegexDefaultPattern, "instagram.com/"), 1) ImageVideoContains = "instagram.com" End Sub + Private Const SettingsVersionCurrent As Integer = 2 Friend Overrides Sub EndInit() Try : MyLastRequests.Add(LastDownloadDate.Value, LastRequestsCount.Value) : Catch : End Try If Not CBool(HH_IG_WWW_CLAIM_USE.Value) Then Responser.Headers.Remove(Header_IG_WWW_CLAIM) - If CInt(SettingsVersion.Value) < 2 Then - SettingsVersion.Value = 2 + If CInt(SettingsVersion.Value) < SettingsVersionCurrent Then + SettingsVersion.Value = SettingsVersionCurrent HH_IG_WWW_CLAIM_UPDATE_INTERVAL.Value = 120 HH_IG_WWW_CLAIM_ALWAYS_ZERO.Value = False HH_IG_WWW_CLAIM_RESET_EACH_SESSION.Value = True diff --git a/SCrawler/API/OnlyFans/DynamicRulesEnv.vb b/SCrawler/API/OnlyFans/DynamicRulesEnv.vb index 446e9c5..67056e1 100644 --- a/SCrawler/API/OnlyFans/DynamicRulesEnv.vb +++ b/SCrawler/API/OnlyFans/DynamicRulesEnv.vb @@ -353,7 +353,7 @@ Namespace API.OnlyFans #Region "Load, Save" Private Function GetTextLines(ByVal Input As String) As List(Of String) If Not Input.IsEmptyString Then - Return ListAddList(Nothing, Input.StringTrim.Split(vbCrLf), LAP.NotContainsOnly, EDP.ReturnValue, + Return ListAddList(Nothing, Input.StringTrim.Split(vbLf), LAP.NotContainsOnly, EDP.ReturnValue, CType(Function(inp$) inp.StringTrim, Func(Of Object, Object))) Else Return New List(Of String) @@ -546,6 +546,13 @@ Namespace API.OnlyFans If Not LoadListOnly Then LastUpdateTimeRules = Now : updated = True textLocal = GetTextLines(DynamicRulesFile.GetText(OFError)) If textLocal.ListExists Then + If Not LoadListOnly And Count > 0 Then + For i = 0 To Count - 1 + rule = Rules(i) + rule.Exists = False + Rules(i) = rule + Next + End If For Each url$ In textLocal url = url.StringTrim If Not url.IsEmptyString Then @@ -563,6 +570,7 @@ Namespace API.OnlyFans If Not LoadListOnly Then If i >= 0 And rule.Valid And Not rule.UrlLatestCommit.IsEmptyString Then + rule.Exists = True r = Responser.GetResponse(rule.UrlLatestCommit) If Not r.IsEmptyString Then e = JsonDocument.Parse(r, OFError) @@ -578,6 +586,7 @@ Namespace API.OnlyFans End If Rules(i) = rule End If + If Rules.RemoveAll(Function(rr) Not rr.Exists) > 0 Then updated = True End If End If Next diff --git a/SCrawler/API/Reddit/SiteSettings.vb b/SCrawler/API/Reddit/SiteSettings.vb index 56c6bcf..c8d7bfb 100644 --- a/SCrawler/API/Reddit/SiteSettings.vb +++ b/SCrawler/API/Reddit/SiteSettings.vb @@ -85,7 +85,7 @@ Namespace API.Reddit ApiClientSecret = New PropertyValue(String.Empty, GetType(String)) BearerToken = New PropertyValue(token, GetType(String), Sub(v) Responser.Headers.Add(DeclaredNames.Header_Authorization, v)) BearerTokenUseCurl = New PropertyValue(True) - TokenUpdateInterval = New PropertyValue(60 * 12) + TokenUpdateInterval = New PropertyValue(360) TokenUpdateIntervalProvider = New TokenRefreshIntervalProvider BearerTokenDateUpdate = New PropertyValue(Now.AddYears(-1)) UseTokenForTimelines = New PropertyValue(False) @@ -101,6 +101,14 @@ Namespace API.Reddit ImageVideoContains = "reddit.com" UserRegex = RParams.DM("[htps:/]{7,8}.*?reddit.com/([user]{1,4})/([^/\?&]+)", 0, RegexReturn.ListByMatch, EDP.ReturnValue) End Sub + Private Const SettingsVersionCurrent As Integer = 1 + Friend Overrides Sub EndInit() + If CInt(SettingsVersion.Value) < SettingsVersionCurrent Then + SettingsVersion.Value = SettingsVersionCurrent + TokenUpdateInterval.Value = 360 + End If + MyBase.EndInit() + End Sub #End Region #Region "GetInstance" Friend Overrides Function GetInstance(ByVal What As Download) As IPluginContentProvider diff --git a/SCrawler/API/ThreadsNet/SiteSettings.vb b/SCrawler/API/ThreadsNet/SiteSettings.vb index 69dd25e..ffbc47c 100644 --- a/SCrawler/API/ThreadsNet/SiteSettings.vb +++ b/SCrawler/API/ThreadsNet/SiteSettings.vb @@ -15,7 +15,7 @@ Imports PersonalUtilities.Functions.RegularExpressions Imports IG = SCrawler.API.Instagram.SiteSettings Imports DN = SCrawler.API.Base.DeclaredNames Namespace API.ThreadsNet - + Friend Class SiteSettings : Inherits SiteSettingsBase #Region "Declarations" #Region "Authorization" diff --git a/SCrawler/API/ThreadsNet/UserData.vb b/SCrawler/API/ThreadsNet/UserData.vb index e1a1eb4..0accb93 100644 --- a/SCrawler/API/ThreadsNet/UserData.vb +++ b/SCrawler/API/ThreadsNet/UserData.vb @@ -101,7 +101,12 @@ Namespace API.ThreadsNet Else DefaultParser_SkipPost = AddressOf SkipPost End If - DownloadData(String.Empty, Token) + If IsSavedPosts Then + DefaultParser_ElemNode = {"node", "thread_items", 0, "post"} + DownloadSavedPosts(String.Empty, Token) + Else + DownloadData(String.Empty, Token) + End If If _TempMediaList.Count > 0 Then FirstLoadingDone = True : setMaxPostDate.Invoke(_TempMediaList) Catch ex As Exception errorFound = True @@ -116,11 +121,15 @@ Namespace API.ThreadsNet End Sub Private Function IsPinnedPost(ByVal Items As IEnumerable(Of EContainer), ByVal Index As Integer) As Boolean Try - If MaxLastDownDate.HasValue Then - Dim d As Date? = AConvert(Of Date)(Items(Index).ItemF(DefaultParser_ElemNode_Default).Value("taken_at"), UnixDate32Provider, Nothing) - If d.HasValue Then Return d.Value < MaxLastDownDate.Value + If IsSavedPosts Then + Return False + Else + If MaxLastDownDate.HasValue Then + Dim d As Date? = AConvert(Of Date)(Items(Index).ItemF(DefaultParser_ElemNode_Default).Value("taken_at"), UnixDate32Provider, Nothing) + If d.HasValue Then Return d.Value < MaxLastDownDate.Value + End If + Return Not FirstLoadingDone End If - Return Not FirstLoadingDone Catch ex As Exception LogError(ex, "IsPinnedPost") Return Not FirstLoadingDone @@ -141,22 +150,32 @@ Namespace API.ThreadsNet Responser.Headers.Add(IGS.Header_CSRF_TOKEN, csrf) End If End Sub + Private Const GQL_Q As String = "https://www.threads.net/api/graphql?lsd={0}&fb_dtsg={1}&doc_id={2}&fb_api_req_friendly_name={3}&server_timestamps=true&variables={4}" + Private Const GQL_P_DOC_ID As String = "6371597506283707" + Private Const GQL_P_NAME As String = "BarcelonaProfileThreadsTabRefetchableQuery" + Private Const GQL_S_DOC_ID_1 As String = "7758166704280174" + Private Const GQL_S_NAME_1 As String = "BarcelonaSavedPageViewerQuery" + Private Const GQL_S_DOC_ID_2 As String = "8617275414954442" + Private Const GQL_S_NAME_2 As String = "BarcelonaSavedPageRefetchableQuery" + Private Sub DownloadCheckCredentials() + If Not Valid Then + Dim idIsNull As Boolean = ID.IsEmptyString + UpdateCredentials() + If idIsNull And Not ID.IsEmptyString Then _ForceSaveUserInfo = True + End If + If Not Valid Then DisableDownload() : Throw New Plugin.ExitException("Some credentials are missing") + End Sub Private Overloads Sub DownloadData(ByVal Cursor As String, ByVal Token As CancellationToken) - Const urlPattern$ = "https://www.threads.net/api/graphql?lsd={0}&variables={1}&doc_id=6371597506283707&fb_api_req_friendly_name=BarcelonaProfileThreadsTabRefetchableQuery&server_timestamps=true&fb_dtsg={2}" Const var_init$ = """userID"":""{0}""" Const var_cursor$ = """after"":""{1}"",""before"":null,""first"":25,""last"":null,""userID"":""{0}"",""__relay_internal__pv__BarcelonaIsLoggedInrelayprovider"":true,""__relay_internal__pv__BarcelonaIsFeedbackHubEnabledrelayprovider"":false" Dim URL$ = String.Empty Try - If Not Valid Then - Dim idIsNull As Boolean = ID.IsEmptyString - UpdateCredentials() - If idIsNull And Not ID.IsEmptyString Then _ForceSaveUserInfo = True - End If - If Not Valid Then DisableDownload() : Throw New Plugin.ExitException("Some credentials are missing") + DownloadCheckCredentials() Responser.Method = "POST" Responser.Referer = $"https://www.threads.net/@{NameTrue}" Responser.Headers.Add(GQL_HEADER_FB_LSD, Token_lsd) + Responser.Headers.Add(GQL_HEADER_FB_FRINDLY_NAME, GQL_P_NAME) Dim nextCursor$ = String.Empty Dim dataFound As Boolean = False @@ -169,7 +188,7 @@ Namespace API.ThreadsNet End If vars = SymbolsConverter.ASCII.EncodeSymbolsOnly("{" & vars & "}") - URL = String.Format(urlPattern, Token_lsd, vars, Token_dtsg_Var) + URL = String.Format(GQL_Q, Token_lsd, Token_dtsg_Var, GQL_P_DOC_ID, GQL_P_NAME, vars) Using j As EContainer = GetDocument(URL, Token) If j.ListExists Then @@ -189,6 +208,47 @@ Namespace API.ThreadsNet ProcessException(ex, Token, $"data downloading error [{URL}]") End Try End Sub + Private Sub DownloadSavedPosts(ByVal Cursor As String, ByVal Token As CancellationToken) + Const var_init$ = """__relay_internal__pv__BarcelonaIsLoggedInrelayprovider"":true,""__relay_internal__pv__BarcelonaIsInlineReelsEnabledrelayprovider"":false,""__relay_internal__pv__BarcelonaUseCometVideoPlaybackEnginerelayprovider"":false,""__relay_internal__pv__BarcelonaOptionalCookiesEnabledrelayprovider"":true,""__relay_internal__pv__BarcelonaIsTextFragmentsEnabledForPostCaptionsrelayprovider"":true,""__relay_internal__pv__BarcelonaShouldShowFediverseM075Featuresrelayprovider"":true" + Const var_cursor$ = """after"":""{0}"",""first"":25,""__relay_internal__pv__BarcelonaIsLoggedInrelayprovider"":true,""__relay_internal__pv__BarcelonaIsInlineReelsEnabledrelayprovider"":false,""__relay_internal__pv__BarcelonaUseCometVideoPlaybackEnginerelayprovider"":false,""__relay_internal__pv__BarcelonaOptionalCookiesEnabledrelayprovider"":true,""__relay_internal__pv__BarcelonaIsTextFragmentsEnabledForPostCaptionsrelayprovider"":true,""__relay_internal__pv__BarcelonaShouldShowFediverseM075Featuresrelayprovider"":true" + Dim URL$ = String.Empty + Try + DownloadCheckCredentials() + + Responser.Method = "POST" + Responser.Referer = "https://www.threads.net/" + Responser.Headers.Add(GQL_HEADER_FB_LSD, Token_lsd) + Responser.Headers.Add(GQL_HEADER_FB_FRINDLY_NAME, If(Cursor.IsEmptyString, GQL_S_NAME_1, GQL_S_NAME_2)) + + Dim nextCursor$ = String.Empty + Dim dataFound As Boolean = False + + Dim vars$ = SymbolsConverter.ASCII.EncodeSymbolsOnly("{" & If(Cursor.IsEmptyString, var_init, String.Format(var_cursor, Cursor)) & "}") + + If Cursor.IsEmptyString Then + URL = String.Format(GQL_Q, Token_lsd, Token_dtsg_Var, GQL_S_DOC_ID_1, GQL_S_NAME_1, vars) + Else + URL = String.Format(GQL_Q, Token_lsd, Token_dtsg_Var, GQL_S_DOC_ID_2, GQL_S_NAME_2, vars) + End If + + Using j As EContainer = GetDocument(URL, Token) + If j.ListExists Then + With j({"data", "xdt_viewer", "text_app_saved_media"}) + If .ListExists Then + nextCursor = .Value({"page_info"}, "end_cursor") + With .Item({"edges"}) + If .ListExists Then dataFound = DefaultParser(.Self, Sections.Timeline, Token) + End With + End If + End With + End If + End Using + + If dataFound And Not nextCursor.IsEmptyString Then DownloadSavedPosts(nextCursor, Token) + Catch ex As Exception + ProcessException(ex, Token, $"saved posts downloading error [{URL}]") + End Try + End Sub Private Function GetDocument(ByVal URL As String, ByVal Token As CancellationToken, Optional ByVal Round As Integer = 0) As EContainer Try ThrowAny(Token) @@ -206,7 +266,7 @@ Namespace API.ThreadsNet End Try End Function Private Function UpdateCredentials(Optional ByVal e As ErrorsDescriber = Nothing) As Boolean - Dim URL$ = $"https://www.threads.net/@{NameTrue}" + Dim URL$ = If(IsSavedPosts, "https://www.threads.net/", $"https://www.threads.net/@{NameTrue}") ResetBaseTokens() Dim headers As New HttpHeaderCollection headers.AddRange(Responser.Headers) diff --git a/SCrawler/Download/Automation/Scheduler.vb b/SCrawler/Download/Automation/Scheduler.vb index a476c57..660560d 100644 --- a/SCrawler/Download/Automation/Scheduler.vb +++ b/SCrawler/Download/Automation/Scheduler.vb @@ -230,6 +230,8 @@ Namespace DownloadObjects PlansWaiter.Invoke(PlanDownloading) ElseIf .DownloadReady Then .Download() + If Settings.AutomationScript.Use AndAlso Not Settings.AutomationScript.Value.IsEmptyString AndAlso + (Not .IsManual Or Not Settings.AutomationScript_ExcludeManual) Then ExecuteCommand(Settings.AutomationScript) End If End With End Sub diff --git a/SCrawler/Download/Feed/DownloadFeedForm.vb b/SCrawler/Download/Feed/DownloadFeedForm.vb index a526191..11e1e13 100644 --- a/SCrawler/Download/Feed/DownloadFeedForm.vb +++ b/SCrawler/Download/Feed/DownloadFeedForm.vb @@ -190,7 +190,6 @@ Namespace DownloadObjects DataList.Clear() End Sub Private Sub DownloadFeedForm_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown - 'If e.KeyCode = Keys.F5 Then RefillList() : e.Handled = True If Not e.Handled Then Dim b As Boolean = False If e = GoToButton Then @@ -207,6 +206,8 @@ Namespace DownloadObjects Case Keys.Down, Keys.Right, Keys.PageDown : changePage = 1 Case Keys.Home : gotoHome = True Case Keys.End : gotoHome = False + Case Keys.Escape : If Settings.FeedEscToClose Then Close() + Case Else : If e.Control And e.KeyCode = Keys.W Then Close() End Select If changePage.HasValue Then b = True diff --git a/SCrawler/Download/Feed/FeedSpecial.vb b/SCrawler/Download/Feed/FeedSpecial.vb index 288ade1..0b2da08 100644 --- a/SCrawler/Download/Feed/FeedSpecial.vb +++ b/SCrawler/Download/Feed/FeedSpecial.vb @@ -235,7 +235,62 @@ Namespace DownloadObjects Friend Function RemoveNotExist(ByVal p As Predicate(Of UserMediaD)) As Integer If Count > 0 And Not _NotExistRemoved Then _NotExistRemoved = True - Dim ri% = Items.RemoveAll(p) + Dim ri% = 0 + If Settings.FeedSpecialSearchForMissing Then + Dim i% = -1 + Dim d As UserMediaD = Nothing + Dim m As UserMedia + Dim f As SFile = Nothing + Dim ff As SFile + Dim user As IUserData + Dim processRemove As Boolean + Dim userArr As New List(Of IUserData) + + Dim updateUser As Func(Of IUserData, Boolean) = + Function(ByVal replaceUser As IUserData) As Boolean + If f.Exists(SFO.Path, False) Then + ff = SFile.GetFiles(f, d.Data.File.File, IO.SearchOption.AllDirectories, EDP.ReturnValue).FirstOrDefault + If Not ff.IsEmptyString Then + m = d.Data + m.File = ff + d = New UserMediaD(m, If(replaceUser, d.User), d.Session, d.Date) With { + .IsSavedPosts = If(replaceUser Is Nothing, d.IsSavedPosts, DirectCast(replaceUser, UserDataBase).IsSavedPosts) + } + Items(i) = d + ri += 1 + processRemove = False + Return True + End If + End If + Return False + End Function + + For i = Count - 1 To 0 Step -1 + If p.Invoke(Items(i)) Then + d = Items(i) + f = Nothing + ff = Nothing + processRemove = True + + f = If(d.User?.File, New SFile).IfNullOrEmpty(d.UserInfo.File).CutPath + If updateUser(Nothing) Then Continue For + + If Settings.FeedSpecialSearchForMissing_Deep Then + If userArr.Count = 0 Then userArr.ListAddList(Settings.GetUsers(Function(u) True)) + If userArr.Count > 0 Then + For Each user In userArr + f = user.File.CutPath + If updateUser(user) Then Exit For + Next + End If + End If + + If processRemove Then Items.RemoveAt(i) : ri += 1 + End If + Next + Else + ri = Items.RemoveAll(p) + End If If ri > 0 Then Save() Return ri Else diff --git a/SCrawler/Editors/GlobalSettingsForm.Designer.vb b/SCrawler/Editors/GlobalSettingsForm.Designer.vb index 2a91b26..74803f3 100644 --- a/SCrawler/Editors/GlobalSettingsForm.Designer.vb +++ b/SCrawler/Editors/GlobalSettingsForm.Designer.vb @@ -24,16 +24,16 @@ Namespace Editors Private Sub InitializeComponent() Me.components = New System.ComponentModel.Container() Dim TP_BASIS As System.Windows.Forms.TableLayoutPanel - Dim ActionButton1 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton39 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(GlobalSettingsForm)) - Dim ActionButton2 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton40 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim TP_IMAGES As System.Windows.Forms.TableLayoutPanel - Dim ActionButton3 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton4 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton5 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton6 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton7 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton8 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton41 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton42 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton43 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton44 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton45 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton46 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim TP_FILE_NAME As System.Windows.Forms.TableLayoutPanel Dim TP_FILE_PATTERNS As System.Windows.Forms.TableLayoutPanel Dim LBL_DATE_POS As System.Windows.Forms.Label @@ -46,57 +46,58 @@ Namespace Editors Dim TP_CHANNELS As System.Windows.Forms.TableLayoutPanel Dim TAB_BEHAVIOR As System.Windows.Forms.TabPage Dim TP_BEHAVIOR As System.Windows.Forms.TableLayoutPanel - Dim ActionButton9 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton10 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton47 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton48 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim TP_OPEN_INFO As System.Windows.Forms.TableLayoutPanel Dim TP_OPEN_PROGRESS As System.Windows.Forms.TableLayoutPanel Dim TP_BEHAVIOR_F6 As System.Windows.Forms.TableLayoutPanel Dim TAB_DOWN As System.Windows.Forms.TabPage Dim TP_DOWNLOADING As System.Windows.Forms.TableLayoutPanel - Dim ActionButton11 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton12 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton49 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton50 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim TP_MISSING_DATA As System.Windows.Forms.TableLayoutPanel 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 ActionButton51 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton52 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 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() - Dim ActionButton18 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - Dim ActionButton19 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() - 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 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 ActionButton53 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton54 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton55 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton56 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton57 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton58 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton59 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton60 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton61 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton62 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton63 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton64 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton65 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton66 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 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 ActionButton67 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ListColumn3 As PersonalUtilities.Forms.Controls.Base.ListColumn = New PersonalUtilities.Forms.Controls.Base.ListColumn() + Dim ListColumn4 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 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 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 ActionButton68 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton69 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton70 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton71 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 ActionButton72 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton73 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton74 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton75 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() + Dim ActionButton76 As PersonalUtilities.Forms.Controls.Base.ActionButton = New PersonalUtilities.Forms.Controls.Base.ActionButton() Dim TAB_HEADERS As System.Windows.Forms.TabPage + Dim TP_FEED_SPEC_SEARCH As System.Windows.Forms.TableLayoutPanel Me.TXT_GLOBAL_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_IMAGE_LARGE = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_IMAGE_SMALL = New PersonalUtilities.Forms.Controls.TextBoxExtended() @@ -163,6 +164,8 @@ Namespace Editors Me.CH_RECYCLE_DEL = New System.Windows.Forms.CheckBox() Me.CH_DOWN_OPEN_PROGRESS = New System.Windows.Forms.CheckBox() Me.CH_DOWN_ALL_F6_USE = New System.Windows.Forms.CheckBox() + Me.TXT_SCHEDULER_SCRIPT = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CH_SCHEDULER_SCRIPT_EX_MANUAL = New System.Windows.Forms.CheckBox() Me.TXT_SCRIPT = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_DOWN_COMPLETE_SCRIPT = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.CH_UNAME_UP = New System.Windows.Forms.CheckBox() @@ -180,6 +183,8 @@ Namespace Editors Me.NUM_FEED_STORE_SESSION_DATA = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.NUM_FEED_SES_CURR_LOAD_LAST = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.CH_FEED_ADD_SITE = New System.Windows.Forms.CheckBox() + Me.CH_FEED_ADD_TYPE = New System.Windows.Forms.CheckBox() + Me.CH_FEED_ESC_TO_CLOSE = New System.Windows.Forms.CheckBox() Me.TXT_YTDLP = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_FFMPEG = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TXT_CURL = New PersonalUtilities.Forms.Controls.TextBoxExtended() @@ -205,7 +210,8 @@ 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_FEED_ADD_TYPE = New System.Windows.Forms.CheckBox() + Me.CH_FEED_SPEC_SEARCH = New System.Windows.Forms.CheckBox() + Me.CH_FEED_SPEC_SEARCH_DEEP = 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() @@ -239,6 +245,7 @@ Namespace Editors TP_DESIGN = New System.Windows.Forms.TableLayoutPanel() TP_HEADERS_DEF = New System.Windows.Forms.TableLayoutPanel() TAB_HEADERS = New System.Windows.Forms.TabPage() + TP_FEED_SPEC_SEARCH = New System.Windows.Forms.TableLayoutPanel() TP_BASIS.SuspendLayout() CType(Me.TXT_GLOBAL_PATH, System.ComponentModel.ISupportInitialize).BeginInit() TP_IMAGES.SuspendLayout() @@ -267,6 +274,7 @@ Namespace Editors TP_OPEN_INFO.SuspendLayout() TP_OPEN_PROGRESS.SuspendLayout() TP_BEHAVIOR_F6.SuspendLayout() + CType(Me.TXT_SCHEDULER_SCRIPT, System.ComponentModel.ISupportInitialize).BeginInit() TAB_DOWN.SuspendLayout() TP_DOWNLOADING.SuspendLayout() CType(Me.TXT_SCRIPT, System.ComponentModel.ISupportInitialize).BeginInit() @@ -310,6 +318,7 @@ Namespace Editors Me.TAB_ENVIR.SuspendLayout() Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() Me.CONTAINER_MAIN.SuspendLayout() + TP_FEED_SPEC_SEARCH.SuspendLayout() Me.SuspendLayout() ' 'TP_BASIS @@ -345,12 +354,12 @@ Namespace Editors ' 'TXT_GLOBAL_PATH ' - ActionButton1.BackgroundImage = CType(resources.GetObject("ActionButton1.BackgroundImage"), System.Drawing.Image) - ActionButton1.Name = "Open" - ActionButton2.BackgroundImage = CType(resources.GetObject("ActionButton2.BackgroundImage"), System.Drawing.Image) - ActionButton2.Name = "Clear" - Me.TXT_GLOBAL_PATH.Buttons.Add(ActionButton1) - Me.TXT_GLOBAL_PATH.Buttons.Add(ActionButton2) + ActionButton39.BackgroundImage = CType(resources.GetObject("ActionButton39.BackgroundImage"), System.Drawing.Image) + ActionButton39.Name = "Open" + ActionButton40.BackgroundImage = CType(resources.GetObject("ActionButton40.BackgroundImage"), System.Drawing.Image) + ActionButton40.Name = "Clear" + Me.TXT_GLOBAL_PATH.Buttons.Add(ActionButton39) + Me.TXT_GLOBAL_PATH.Buttons.Add(ActionButton40) Me.TXT_GLOBAL_PATH.CaptionText = "Data Path" Me.TXT_GLOBAL_PATH.CaptionToolTipEnabled = True Me.TXT_GLOBAL_PATH.CaptionToolTipText = "Root path for storing users' data" @@ -411,9 +420,9 @@ Namespace Editors ' 'TXT_COLLECTIONS_PATH ' - ActionButton3.BackgroundImage = CType(resources.GetObject("ActionButton3.BackgroundImage"), System.Drawing.Image) - ActionButton3.Name = "Clear" - Me.TXT_COLLECTIONS_PATH.Buttons.Add(ActionButton3) + ActionButton41.BackgroundImage = CType(resources.GetObject("ActionButton41.BackgroundImage"), System.Drawing.Image) + ActionButton41.Name = "Clear" + Me.TXT_COLLECTIONS_PATH.Buttons.Add(ActionButton41) Me.TXT_COLLECTIONS_PATH.CaptionText = "Collections folder" Me.TXT_COLLECTIONS_PATH.CaptionToolTipEnabled = True Me.TXT_COLLECTIONS_PATH.CaptionToolTipText = "Set collections folder name (name only)" @@ -425,10 +434,10 @@ Namespace Editors ' 'TXT_MAX_JOBS_USERS ' - ActionButton4.BackgroundImage = CType(resources.GetObject("ActionButton4.BackgroundImage"), System.Drawing.Image) - ActionButton4.Name = "Refresh" - ActionButton4.ToolTipText = "Set to default" - Me.TXT_MAX_JOBS_USERS.Buttons.Add(ActionButton4) + ActionButton42.BackgroundImage = CType(resources.GetObject("ActionButton42.BackgroundImage"), System.Drawing.Image) + ActionButton42.Name = "Refresh" + ActionButton42.ToolTipText = "Set to default" + Me.TXT_MAX_JOBS_USERS.Buttons.Add(ActionButton42) Me.TXT_MAX_JOBS_USERS.CaptionSizeType = System.Windows.Forms.SizeType.Percent Me.TXT_MAX_JOBS_USERS.CaptionText = "Maximum downloading tasks of users" Me.TXT_MAX_JOBS_USERS.CaptionWidth = 50.0R @@ -444,10 +453,10 @@ Namespace Editors ' 'TXT_MAX_JOBS_CHANNELS ' - ActionButton5.BackgroundImage = CType(resources.GetObject("ActionButton5.BackgroundImage"), System.Drawing.Image) - ActionButton5.Name = "Refresh" - ActionButton5.ToolTipText = "Set to default" - Me.TXT_MAX_JOBS_CHANNELS.Buttons.Add(ActionButton5) + ActionButton43.BackgroundImage = CType(resources.GetObject("ActionButton43.BackgroundImage"), System.Drawing.Image) + ActionButton43.Name = "Refresh" + ActionButton43.ToolTipText = "Set to default" + Me.TXT_MAX_JOBS_CHANNELS.Buttons.Add(ActionButton43) Me.TXT_MAX_JOBS_CHANNELS.CaptionSizeType = System.Windows.Forms.SizeType.Percent Me.TXT_MAX_JOBS_CHANNELS.CaptionText = "Maximum downloading tasks of channels" Me.TXT_MAX_JOBS_CHANNELS.CaptionWidth = 50.0R @@ -474,9 +483,9 @@ Namespace Editors ' 'TXT_IMGUR_CLIENT_ID ' - ActionButton6.BackgroundImage = CType(resources.GetObject("ActionButton6.BackgroundImage"), System.Drawing.Image) - ActionButton6.Name = "Clear" - Me.TXT_IMGUR_CLIENT_ID.Buttons.Add(ActionButton6) + ActionButton44.BackgroundImage = CType(resources.GetObject("ActionButton44.BackgroundImage"), System.Drawing.Image) + ActionButton44.Name = "Clear" + Me.TXT_IMGUR_CLIENT_ID.Buttons.Add(ActionButton44) Me.TXT_IMGUR_CLIENT_ID.CaptionText = "Imgur Client ID" Me.TXT_IMGUR_CLIENT_ID.Dock = System.Windows.Forms.DockStyle.Fill Me.TXT_IMGUR_CLIENT_ID.Location = New System.Drawing.Point(4, 204) @@ -486,14 +495,14 @@ Namespace Editors ' 'TXT_USER_AGENT ' - ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image) - ActionButton7.Name = "Refresh" - ActionButton7.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh - ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image) - ActionButton8.Name = "Clear" - ActionButton8.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear - Me.TXT_USER_AGENT.Buttons.Add(ActionButton7) - Me.TXT_USER_AGENT.Buttons.Add(ActionButton8) + ActionButton45.BackgroundImage = CType(resources.GetObject("ActionButton45.BackgroundImage"), System.Drawing.Image) + ActionButton45.Name = "Refresh" + ActionButton45.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton46.BackgroundImage = CType(resources.GetObject("ActionButton46.BackgroundImage"), System.Drawing.Image) + ActionButton46.Name = "Clear" + ActionButton46.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_USER_AGENT.Buttons.Add(ActionButton45) + Me.TXT_USER_AGENT.Buttons.Add(ActionButton46) Me.TXT_USER_AGENT.CaptionText = "UserAgent" Me.TXT_USER_AGENT.CaptionToolTipEnabled = True Me.TXT_USER_AGENT.CaptionToolTipText = "Default user agent to use in requests" @@ -1286,10 +1295,12 @@ Namespace Editors TP_BEHAVIOR.Controls.Add(Me.CH_RECYCLE_DEL, 0, 3) TP_BEHAVIOR.Controls.Add(TP_OPEN_PROGRESS, 0, 5) TP_BEHAVIOR.Controls.Add(TP_BEHAVIOR_F6, 0, 8) + TP_BEHAVIOR.Controls.Add(Me.TXT_SCHEDULER_SCRIPT, 0, 9) + TP_BEHAVIOR.Controls.Add(Me.CH_SCHEDULER_SCRIPT_EX_MANUAL, 0, 10) TP_BEHAVIOR.Dock = System.Windows.Forms.DockStyle.Fill TP_BEHAVIOR.Location = New System.Drawing.Point(0, 0) TP_BEHAVIOR.Name = "TP_BEHAVIOR" - TP_BEHAVIOR.RowCount = 10 + TP_BEHAVIOR.RowCount = 12 TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) @@ -1299,20 +1310,20 @@ Namespace Editors TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) + TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) - TP_BEHAVIOR.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) TP_BEHAVIOR.Size = New System.Drawing.Size(621, 399) TP_BEHAVIOR.TabIndex = 0 ' 'TXT_FOLDER_CMD ' Me.TXT_FOLDER_CMD.AutoShowClearButton = True - ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image) - ActionButton9.Enabled = False - ActionButton9.Name = "Clear" - ActionButton9.Visible = False - Me.TXT_FOLDER_CMD.Buttons.Add(ActionButton9) + ActionButton47.BackgroundImage = CType(resources.GetObject("ActionButton47.BackgroundImage"), System.Drawing.Image) + ActionButton47.Enabled = False + ActionButton47.Name = "Clear" + ActionButton47.Visible = False + Me.TXT_FOLDER_CMD.Buttons.Add(ActionButton47) Me.TXT_FOLDER_CMD.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox Me.TXT_FOLDER_CMD.CaptionText = "Folder cmd" Me.TXT_FOLDER_CMD.CaptionToolTipEnabled = True @@ -1351,11 +1362,11 @@ Namespace Editors 'TXT_CLOSE_SCRIPT ' Me.TXT_CLOSE_SCRIPT.AutoShowClearButton = True - ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image) - ActionButton10.Enabled = False - ActionButton10.Name = "Clear" - ActionButton10.Visible = False - Me.TXT_CLOSE_SCRIPT.Buttons.Add(ActionButton10) + ActionButton48.BackgroundImage = CType(resources.GetObject("ActionButton48.BackgroundImage"), System.Drawing.Image) + ActionButton48.Enabled = False + ActionButton48.Name = "Clear" + ActionButton48.Visible = False + Me.TXT_CLOSE_SCRIPT.Buttons.Add(ActionButton48) Me.TXT_CLOSE_SCRIPT.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox Me.TXT_CLOSE_SCRIPT.CaptionText = "Close cmd" Me.TXT_CLOSE_SCRIPT.CaptionToolTipEnabled = True @@ -1468,6 +1479,31 @@ Namespace Editors Me.CH_DOWN_ALL_F6_USE.Text = "Use 'F6' to download all users" Me.CH_DOWN_ALL_F6_USE.UseVisualStyleBackColor = True ' + 'TXT_SCHEDULER_SCRIPT + ' + Me.TXT_SCHEDULER_SCRIPT.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox + Me.TXT_SCHEDULER_SCRIPT.CaptionText = "Scheduler script" + Me.TXT_SCHEDULER_SCRIPT.CaptionToolTipEnabled = True + Me.TXT_SCHEDULER_SCRIPT.CaptionToolTipText = "Execute the following script after the scheduler plan is completed" + Me.TXT_SCHEDULER_SCRIPT.CaptionWidth = 115.0R + Me.TXT_SCHEDULER_SCRIPT.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_SCHEDULER_SCRIPT.Location = New System.Drawing.Point(4, 244) + Me.TXT_SCHEDULER_SCRIPT.Name = "TXT_SCHEDULER_SCRIPT" + Me.TXT_SCHEDULER_SCRIPT.Size = New System.Drawing.Size(613, 22) + Me.TXT_SCHEDULER_SCRIPT.TabIndex = 9 + ' + 'CH_SCHEDULER_SCRIPT_EX_MANUAL + ' + Me.CH_SCHEDULER_SCRIPT_EX_MANUAL.AutoSize = True + Me.CH_SCHEDULER_SCRIPT_EX_MANUAL.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_SCHEDULER_SCRIPT_EX_MANUAL.Location = New System.Drawing.Point(4, 273) + Me.CH_SCHEDULER_SCRIPT_EX_MANUAL.Name = "CH_SCHEDULER_SCRIPT_EX_MANUAL" + Me.CH_SCHEDULER_SCRIPT_EX_MANUAL.Size = New System.Drawing.Size(613, 19) + Me.CH_SCHEDULER_SCRIPT_EX_MANUAL.TabIndex = 10 + Me.CH_SCHEDULER_SCRIPT_EX_MANUAL.Text = "Disable execution of 'Scheduler script' after completion of 'Manual' scheduler pl" & + "ans" + Me.CH_SCHEDULER_SCRIPT_EX_MANUAL.UseVisualStyleBackColor = True + ' 'TAB_DOWN ' TAB_DOWN.Controls.Add(TP_DOWNLOADING) @@ -1514,12 +1550,12 @@ Namespace Editors ' 'TXT_SCRIPT ' - ActionButton11.BackgroundImage = CType(resources.GetObject("ActionButton11.BackgroundImage"), System.Drawing.Image) - ActionButton11.Name = "Open" - ActionButton12.BackgroundImage = CType(resources.GetObject("ActionButton12.BackgroundImage"), System.Drawing.Image) - ActionButton12.Name = "Clear" - Me.TXT_SCRIPT.Buttons.Add(ActionButton11) - Me.TXT_SCRIPT.Buttons.Add(ActionButton12) + ActionButton49.BackgroundImage = CType(resources.GetObject("ActionButton49.BackgroundImage"), System.Drawing.Image) + ActionButton49.Name = "Open" + ActionButton50.BackgroundImage = CType(resources.GetObject("ActionButton50.BackgroundImage"), System.Drawing.Image) + ActionButton50.Name = "Clear" + Me.TXT_SCRIPT.Buttons.Add(ActionButton49) + Me.TXT_SCRIPT.Buttons.Add(ActionButton50) Me.TXT_SCRIPT.CaptionMode = PersonalUtilities.Forms.Controls.Base.ICaptionControl.Modes.CheckBox Me.TXT_SCRIPT.CaptionText = "Script" Me.TXT_SCRIPT.CaptionToolTipEnabled = True @@ -1613,7 +1649,7 @@ Namespace Editors TAB_FEED.Controls.Add(TP_FEED) TAB_FEED.Location = New System.Drawing.Point(4, 22) TAB_FEED.Name = "TAB_FEED" - TAB_FEED.Size = New System.Drawing.Size(621, 374) + TAB_FEED.Size = New System.Drawing.Size(621, 399) TAB_FEED.TabIndex = 7 TAB_FEED.Text = "Feed" ' @@ -1635,10 +1671,12 @@ Namespace Editors TP_FEED.Controls.Add(TP_FEED_SES, 0, 8) TP_FEED.Controls.Add(Me.CH_FEED_ADD_SITE, 0, 5) TP_FEED.Controls.Add(Me.CH_FEED_ADD_TYPE, 0, 6) + TP_FEED.Controls.Add(Me.CH_FEED_ESC_TO_CLOSE, 0, 13) + TP_FEED.Controls.Add(TP_FEED_SPEC_SEARCH, 0, 14) TP_FEED.Dock = System.Windows.Forms.DockStyle.Fill TP_FEED.Location = New System.Drawing.Point(0, 0) TP_FEED.Name = "TP_FEED" - TP_FEED.RowCount = 14 + TP_FEED.RowCount = 16 TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) @@ -1652,8 +1690,11 @@ 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.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.Absolute, 25.0!)) TP_FEED.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) - TP_FEED.Size = New System.Drawing.Size(621, 374) + 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 ' 'TP_FEED_IMG_COUNT @@ -1832,14 +1873,14 @@ Namespace Editors ' '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) + ActionButton51.BackgroundImage = CType(resources.GetObject("ActionButton51.BackgroundImage"), System.Drawing.Image) + ActionButton51.Name = "Refresh" + ActionButton51.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton52.BackgroundImage = CType(resources.GetObject("ActionButton52.BackgroundImage"), System.Drawing.Image) + ActionButton52.Name = "Clear" + ActionButton52.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.NUM_FEED_SES_CURR_LOAD_LAST.Buttons.Add(ActionButton51) + Me.NUM_FEED_SES_CURR_LOAD_LAST.Buttons.Add(ActionButton52) 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") @@ -1867,6 +1908,28 @@ Namespace Editors Me.CH_FEED_ADD_SITE.Text = "Add the site name to the post title" Me.CH_FEED_ADD_SITE.UseVisualStyleBackColor = True ' + 'CH_FEED_ADD_TYPE + ' + Me.CH_FEED_ADD_TYPE.AutoSize = True + Me.CH_FEED_ADD_TYPE.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_FEED_ADD_TYPE.Location = New System.Drawing.Point(4, 166) + Me.CH_FEED_ADD_TYPE.Name = "CH_FEED_ADD_TYPE" + Me.CH_FEED_ADD_TYPE.Size = New System.Drawing.Size(613, 19) + Me.CH_FEED_ADD_TYPE.TabIndex = 6 + Me.CH_FEED_ADD_TYPE.Text = "Add the file type to the post title" + Me.CH_FEED_ADD_TYPE.UseVisualStyleBackColor = True + ' + 'CH_FEED_ESC_TO_CLOSE + ' + Me.CH_FEED_ESC_TO_CLOSE.AutoSize = True + Me.CH_FEED_ESC_TO_CLOSE.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_FEED_ESC_TO_CLOSE.Location = New System.Drawing.Point(4, 351) + Me.CH_FEED_ESC_TO_CLOSE.Name = "CH_FEED_ESC_TO_CLOSE" + Me.CH_FEED_ESC_TO_CLOSE.Size = New System.Drawing.Size(613, 19) + Me.CH_FEED_ESC_TO_CLOSE.TabIndex = 13 + Me.CH_FEED_ESC_TO_CLOSE.Text = "Use the 'Esc' key to close the form" + Me.CH_FEED_ESC_TO_CLOSE.UseVisualStyleBackColor = True + ' 'TAB_NOTIFY ' TAB_NOTIFY.Controls.Add(TP_NOTIFY_MAIN) @@ -1932,19 +1995,19 @@ Namespace Editors ' 'TXT_YTDLP ' - 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 = "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) + ActionButton53.BackgroundImage = CType(resources.GetObject("ActionButton53.BackgroundImage"), System.Drawing.Image) + ActionButton53.Name = "Open" + ActionButton53.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton54.BackgroundImage = CType(resources.GetObject("ActionButton54.BackgroundImage"), System.Drawing.Image) + ActionButton54.Name = "Refresh" + ActionButton54.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton54.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" + ActionButton55.BackgroundImage = CType(resources.GetObject("ActionButton55.BackgroundImage"), System.Drawing.Image) + ActionButton55.Name = "Clear" + ActionButton55.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_YTDLP.Buttons.Add(ActionButton53) + Me.TXT_YTDLP.Buttons.Add(ActionButton54) + Me.TXT_YTDLP.Buttons.Add(ActionButton55) Me.TXT_YTDLP.CaptionText = "yt-dlp" Me.TXT_YTDLP.CaptionToolTipEnabled = True Me.TXT_YTDLP.CaptionToolTipText = "Path to yt-dlp.exe file" @@ -1958,19 +2021,19 @@ Namespace Editors ' 'TXT_FFMPEG ' - ActionButton18.BackgroundImage = CType(resources.GetObject("ActionButton18.BackgroundImage"), System.Drawing.Image) - 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) + ActionButton56.BackgroundImage = CType(resources.GetObject("ActionButton56.BackgroundImage"), System.Drawing.Image) + ActionButton56.Name = "Open" + ActionButton56.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton57.BackgroundImage = CType(resources.GetObject("ActionButton57.BackgroundImage"), System.Drawing.Image) + ActionButton57.Name = "Refresh" + ActionButton57.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton57.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" + ActionButton58.BackgroundImage = CType(resources.GetObject("ActionButton58.BackgroundImage"), System.Drawing.Image) + ActionButton58.Name = "Clear" + ActionButton58.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_FFMPEG.Buttons.Add(ActionButton56) + Me.TXT_FFMPEG.Buttons.Add(ActionButton57) + Me.TXT_FFMPEG.Buttons.Add(ActionButton58) Me.TXT_FFMPEG.CaptionText = "ffmpeg" Me.TXT_FFMPEG.CaptionToolTipEnabled = True Me.TXT_FFMPEG.CaptionToolTipText = "Path to ffmpeg.exe file" @@ -1984,19 +2047,19 @@ Namespace Editors ' 'TXT_CURL ' - ActionButton21.BackgroundImage = CType(resources.GetObject("ActionButton21.BackgroundImage"), System.Drawing.Image) - 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) + ActionButton59.BackgroundImage = CType(resources.GetObject("ActionButton59.BackgroundImage"), System.Drawing.Image) + ActionButton59.Name = "Open" + ActionButton59.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton60.BackgroundImage = CType(resources.GetObject("ActionButton60.BackgroundImage"), System.Drawing.Image) + ActionButton60.Name = "Refresh" + ActionButton60.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton60.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" + ActionButton61.BackgroundImage = CType(resources.GetObject("ActionButton61.BackgroundImage"), System.Drawing.Image) + ActionButton61.Name = "Clear" + ActionButton61.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_CURL.Buttons.Add(ActionButton59) + Me.TXT_CURL.Buttons.Add(ActionButton60) + Me.TXT_CURL.Buttons.Add(ActionButton61) Me.TXT_CURL.CaptionText = "cURL" Me.TXT_CURL.CaptionToolTipEnabled = True Me.TXT_CURL.CaptionToolTipText = "Path to curl.exe file" @@ -2010,19 +2073,19 @@ Namespace Editors ' 'TXT_GALLERYDL ' - ActionButton24.BackgroundImage = CType(resources.GetObject("ActionButton24.BackgroundImage"), System.Drawing.Image) - 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) + ActionButton62.BackgroundImage = CType(resources.GetObject("ActionButton62.BackgroundImage"), System.Drawing.Image) + ActionButton62.Name = "Open" + ActionButton62.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton63.BackgroundImage = CType(resources.GetObject("ActionButton63.BackgroundImage"), System.Drawing.Image) + ActionButton63.Name = "Refresh" + ActionButton63.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton63.ToolTipText = "Try to find this program automatically (in SCrawler and/or system environment)" + ActionButton64.BackgroundImage = CType(resources.GetObject("ActionButton64.BackgroundImage"), System.Drawing.Image) + ActionButton64.Name = "Clear" + ActionButton64.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_GALLERYDL.Buttons.Add(ActionButton62) + Me.TXT_GALLERYDL.Buttons.Add(ActionButton63) + Me.TXT_GALLERYDL.Buttons.Add(ActionButton64) Me.TXT_GALLERYDL.CaptionText = "gallery-dl" Me.TXT_GALLERYDL.CaptionToolTipText = "Path to gallery-dl.exe file" Me.TXT_GALLERYDL.CaptionWidth = 80.0R @@ -2035,14 +2098,14 @@ Namespace Editors ' 'TXT_CMD_ENCODING ' - 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) + ActionButton65.BackgroundImage = CType(resources.GetObject("ActionButton65.BackgroundImage"), System.Drawing.Image) + ActionButton65.Name = "Refresh" + ActionButton65.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Refresh + ActionButton66.BackgroundImage = CType(resources.GetObject("ActionButton66.BackgroundImage"), System.Drawing.Image) + ActionButton66.Name = "Clear" + ActionButton66.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_CMD_ENCODING.Buttons.Add(ActionButton65) + Me.TXT_CMD_ENCODING.Buttons.Add(ActionButton66) Me.TXT_CMD_ENCODING.CaptionText = "CMD Encoding" Me.TXT_CMD_ENCODING.CaptionToolTipEnabled = True Me.TXT_CMD_ENCODING.CaptionToolTipText = "Command line encoding" @@ -2145,24 +2208,24 @@ Namespace Editors ' 'CMB_STD_OPEN_DBL ' - 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) + ActionButton67.BackgroundImage = CType(resources.GetObject("ActionButton67.BackgroundImage"), System.Drawing.Image) + ActionButton67.Name = "ArrowDown" + ActionButton67.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.ArrowDown + Me.CMB_STD_OPEN_DBL.Buttons.Add(ActionButton67) 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 Me.CMB_STD_OPEN_DBL.CaptionToolTipText = "What do you want to open when you double click on an item" Me.CMB_STD_OPEN_DBL.CaptionVisible = True - ListColumn1.DisplayMember = True - ListColumn1.Name = "STD_CMB_COL_TEXT" - ListColumn1.Text = "Text" - ListColumn2.Name = "STD_CMB_COL_VALUE" - ListColumn2.Text = "Value" - ListColumn2.ValueMember = True - ListColumn2.Visible = False - Me.CMB_STD_OPEN_DBL.Columns.Add(ListColumn1) - Me.CMB_STD_OPEN_DBL.Columns.Add(ListColumn2) + ListColumn3.DisplayMember = True + ListColumn3.Name = "STD_CMB_COL_TEXT" + ListColumn3.Text = "Text" + ListColumn4.Name = "STD_CMB_COL_VALUE" + ListColumn4.Text = "Value" + ListColumn4.ValueMember = True + ListColumn4.Visible = False + Me.CMB_STD_OPEN_DBL.Columns.Add(ListColumn3) + Me.CMB_STD_OPEN_DBL.Columns.Add(ListColumn4) Me.CMB_STD_OPEN_DBL.Dock = System.Windows.Forms.DockStyle.Fill Me.CMB_STD_OPEN_DBL.Location = New System.Drawing.Point(4, 85) Me.CMB_STD_OPEN_DBL.Name = "CMB_STD_OPEN_DBL" @@ -2230,10 +2293,10 @@ Namespace Editors ' 'TXT_PRG_TITLE ' - 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) + ActionButton68.BackgroundImage = CType(resources.GetObject("ActionButton68.BackgroundImage"), System.Drawing.Image) + ActionButton68.Name = "Clear" + ActionButton68.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_PRG_TITLE.Buttons.Add(ActionButton68) 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" @@ -2245,10 +2308,10 @@ Namespace Editors ' 'TXT_PRG_DESCR ' - 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) + ActionButton69.BackgroundImage = CType(resources.GetObject("ActionButton69.BackgroundImage"), System.Drawing.Image) + ActionButton69.Name = "Clear" + ActionButton69.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_PRG_DESCR.Buttons.Add(ActionButton69) 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" @@ -2260,14 +2323,14 @@ Namespace Editors ' 'TXT_USER_LIST_IMAGE ' - 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) + ActionButton70.BackgroundImage = CType(resources.GetObject("ActionButton70.BackgroundImage"), System.Drawing.Image) + ActionButton70.Name = "Open" + ActionButton70.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Open + ActionButton71.BackgroundImage = CType(resources.GetObject("ActionButton71.BackgroundImage"), System.Drawing.Image) + ActionButton71.Name = "Clear" + ActionButton71.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_USER_LIST_IMAGE.Buttons.Add(ActionButton70) + Me.TXT_USER_LIST_IMAGE.Buttons.Add(ActionButton71) 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" @@ -2341,10 +2404,10 @@ Namespace Editors ' 'TXT_H_DEF_UserAgent ' - 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) + ActionButton72.BackgroundImage = CType(resources.GetObject("ActionButton72.BackgroundImage"), System.Drawing.Image) + ActionButton72.Name = "Clear" + ActionButton72.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_H_DEF_UserAgent.Buttons.Add(ActionButton72) 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 @@ -2355,10 +2418,10 @@ Namespace Editors ' 'TXT_H_DEF_sec_ch_ua ' - 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) + ActionButton73.BackgroundImage = CType(resources.GetObject("ActionButton73.BackgroundImage"), System.Drawing.Image) + ActionButton73.Name = "Clear" + ActionButton73.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_H_DEF_sec_ch_ua.Buttons.Add(ActionButton73) 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 @@ -2369,10 +2432,10 @@ Namespace Editors ' 'TXT_H_DEF_sec_ch_ua_full_version_list ' - 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) + ActionButton74.BackgroundImage = CType(resources.GetObject("ActionButton74.BackgroundImage"), System.Drawing.Image) + ActionButton74.Name = "Clear" + ActionButton74.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_H_DEF_sec_ch_ua_full_version_list.Buttons.Add(ActionButton74) 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 @@ -2383,10 +2446,10 @@ Namespace Editors ' 'TXT_H_DEF_sec_ch_ua_platform ' - 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) + ActionButton75.BackgroundImage = CType(resources.GetObject("ActionButton75.BackgroundImage"), System.Drawing.Image) + ActionButton75.Name = "Clear" + ActionButton75.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_H_DEF_sec_ch_ua_platform.Buttons.Add(ActionButton75) 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 @@ -2397,10 +2460,10 @@ Namespace Editors ' 'TXT_H_DEF_sec_ch_ua_platform_version ' - 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) + ActionButton76.BackgroundImage = CType(resources.GetObject("ActionButton76.BackgroundImage"), System.Drawing.Image) + ActionButton76.Name = "Clear" + ActionButton76.Tag = PersonalUtilities.Forms.Controls.Base.ActionButton.DefaultButtons.Clear + Me.TXT_H_DEF_sec_ch_ua_platform_version.Buttons.Add(ActionButton76) 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 @@ -2435,7 +2498,7 @@ Namespace Editors Me.TAB_MAIN.Location = New System.Drawing.Point(0, 0) Me.TAB_MAIN.Name = "TAB_MAIN" Me.TAB_MAIN.SelectedIndex = 0 - Me.TAB_MAIN.Size = New System.Drawing.Size(629, 400) + Me.TAB_MAIN.Size = New System.Drawing.Size(629, 425) Me.TAB_MAIN.TabIndex = 1 ' 'TAB_ENVIR @@ -2453,40 +2516,71 @@ Namespace Editors 'CONTAINER_MAIN.ContentPanel ' Me.CONTAINER_MAIN.ContentPanel.Controls.Add(Me.TAB_MAIN) - Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(629, 400) + Me.CONTAINER_MAIN.ContentPanel.Size = New System.Drawing.Size(629, 425) Me.CONTAINER_MAIN.Dock = System.Windows.Forms.DockStyle.Fill Me.CONTAINER_MAIN.LeftToolStripPanelVisible = False Me.CONTAINER_MAIN.Location = New System.Drawing.Point(0, 0) Me.CONTAINER_MAIN.Name = "CONTAINER_MAIN" Me.CONTAINER_MAIN.RightToolStripPanelVisible = False - Me.CONTAINER_MAIN.Size = New System.Drawing.Size(629, 425) + Me.CONTAINER_MAIN.Size = New System.Drawing.Size(629, 450) Me.CONTAINER_MAIN.TabIndex = 0 Me.CONTAINER_MAIN.TopToolStripPanelVisible = False ' - 'CH_FEED_ADD_TYPE - ' - Me.CH_FEED_ADD_TYPE.AutoSize = True - Me.CH_FEED_ADD_TYPE.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_FEED_ADD_TYPE.Location = New System.Drawing.Point(4, 166) - Me.CH_FEED_ADD_TYPE.Name = "CH_FEED_ADD_TYPE" - Me.CH_FEED_ADD_TYPE.Size = New System.Drawing.Size(613, 19) - Me.CH_FEED_ADD_TYPE.TabIndex = 6 - Me.CH_FEED_ADD_TYPE.Text = "Add the file type to the post title" - Me.CH_FEED_ADD_TYPE.UseVisualStyleBackColor = True + 'TP_FEED_SPEC_SEARCH + ' + TP_FEED_SPEC_SEARCH.ColumnCount = 2 + TP_FEED_SPEC_SEARCH.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_FEED_SPEC_SEARCH.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + TP_FEED_SPEC_SEARCH.Controls.Add(Me.CH_FEED_SPEC_SEARCH, 0, 0) + TP_FEED_SPEC_SEARCH.Controls.Add(Me.CH_FEED_SPEC_SEARCH_DEEP, 1, 0) + TP_FEED_SPEC_SEARCH.Dock = System.Windows.Forms.DockStyle.Fill + TP_FEED_SPEC_SEARCH.Location = New System.Drawing.Point(1, 374) + TP_FEED_SPEC_SEARCH.Margin = New System.Windows.Forms.Padding(0) + TP_FEED_SPEC_SEARCH.Name = "TP_FEED_SPEC_SEARCH" + TP_FEED_SPEC_SEARCH.RowCount = 1 + TP_FEED_SPEC_SEARCH.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + TP_FEED_SPEC_SEARCH.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) + TP_FEED_SPEC_SEARCH.Size = New System.Drawing.Size(619, 25) + TP_FEED_SPEC_SEARCH.TabIndex = 14 + ' + 'CH_FEED_SPEC_SEARCH + ' + Me.CH_FEED_SPEC_SEARCH.AutoSize = True + Me.CH_FEED_SPEC_SEARCH.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_FEED_SPEC_SEARCH.Location = New System.Drawing.Point(3, 3) + Me.CH_FEED_SPEC_SEARCH.Name = "CH_FEED_SPEC_SEARCH" + Me.CH_FEED_SPEC_SEARCH.Size = New System.Drawing.Size(303, 19) + Me.CH_FEED_SPEC_SEARCH.TabIndex = 0 + Me.CH_FEED_SPEC_SEARCH.Text = "Search missing files (special feeds)" + TT_MAIN.SetToolTip(Me.CH_FEED_SPEC_SEARCH, "Search for missing file in the entire user folder") + Me.CH_FEED_SPEC_SEARCH.UseVisualStyleBackColor = True + ' + 'CH_FEED_SPEC_SEARCH_DEEP + ' + Me.CH_FEED_SPEC_SEARCH_DEEP.AutoSize = True + Me.CH_FEED_SPEC_SEARCH_DEEP.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_FEED_SPEC_SEARCH_DEEP.Location = New System.Drawing.Point(312, 3) + Me.CH_FEED_SPEC_SEARCH_DEEP.Name = "CH_FEED_SPEC_SEARCH_DEEP" + Me.CH_FEED_SPEC_SEARCH_DEEP.Size = New System.Drawing.Size(304, 19) + Me.CH_FEED_SPEC_SEARCH_DEEP.TabIndex = 1 + Me.CH_FEED_SPEC_SEARCH_DEEP.Text = "Search missing files (special feeds): deep search" + TT_MAIN.SetToolTip(Me.CH_FEED_SPEC_SEARCH_DEEP, "Deep search means that the missing file will be searched in other users' location" & + "s as well.") + Me.CH_FEED_SPEC_SEARCH_DEEP.UseVisualStyleBackColor = True ' 'GlobalSettingsForm ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(629, 425) + Me.ClientSize = New System.Drawing.Size(629, 450) Me.Controls.Add(Me.CONTAINER_MAIN) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle Me.Icon = Global.SCrawler.My.Resources.Resources.SettingsIcon_48 Me.KeyPreview = True Me.MaximizeBox = False - Me.MaximumSize = New System.Drawing.Size(645, 464) + Me.MaximumSize = New System.Drawing.Size(645, 489) Me.MinimizeBox = False - Me.MinimumSize = New System.Drawing.Size(645, 464) + Me.MinimumSize = New System.Drawing.Size(645, 489) Me.Name = "GlobalSettingsForm" Me.ShowInTaskbar = False Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide @@ -2528,6 +2622,7 @@ Namespace Editors TP_OPEN_PROGRESS.PerformLayout() TP_BEHAVIOR_F6.ResumeLayout(False) TP_BEHAVIOR_F6.PerformLayout() + CType(Me.TXT_SCHEDULER_SCRIPT, System.ComponentModel.ISupportInitialize).EndInit() TAB_DOWN.ResumeLayout(False) TP_DOWNLOADING.ResumeLayout(False) TP_DOWNLOADING.PerformLayout() @@ -2577,6 +2672,8 @@ Namespace Editors Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) Me.CONTAINER_MAIN.ResumeLayout(False) Me.CONTAINER_MAIN.PerformLayout() + TP_FEED_SPEC_SEARCH.ResumeLayout(False) + TP_FEED_SPEC_SEARCH.PerformLayout() Me.ResumeLayout(False) End Sub @@ -2689,5 +2786,10 @@ Namespace Editors Private WithEvents TXT_AUTO_BRUSH_MIN As PersonalUtilities.Forms.Controls.TextBoxExtended Private WithEvents CH_FEED_ADD_SITE As CheckBox Private WithEvents CH_FEED_ADD_TYPE As CheckBox + Private WithEvents CH_FEED_ESC_TO_CLOSE As CheckBox + Private WithEvents TXT_SCHEDULER_SCRIPT As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents CH_SCHEDULER_SCRIPT_EX_MANUAL As CheckBox + Private WithEvents CH_FEED_SPEC_SEARCH As CheckBox + Private WithEvents CH_FEED_SPEC_SEARCH_DEEP As CheckBox End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/GlobalSettingsForm.resx b/SCrawler/Editors/GlobalSettingsForm.resx index 44a620c..ac756f2 100644 --- a/SCrawler/Editors/GlobalSettingsForm.resx +++ b/SCrawler/Editors/GlobalSettingsForm.resx @@ -120,8 +120,11 @@ False + + False + - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -132,7 +135,7 @@ cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -143,7 +146,7 @@ False - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -151,7 +154,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -167,7 +170,7 @@ VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -183,7 +186,7 @@ VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -191,7 +194,7 @@ AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -207,7 +210,7 @@ VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -224,6 +227,9 @@ False + + False + False @@ -257,19 +263,37 @@ You can find more detailed information about the missing posts in the form that False + + False + False False + + False + False False - + + False + + + False + + + False + + + False + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -277,7 +301,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -300,7 +324,13 @@ You can find more detailed information about the missing posts in the form that False - + + False + + + False + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -311,7 +341,7 @@ You can find more detailed information about the missing posts in the form that cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -334,7 +364,10 @@ You can find more detailed information about the missing posts in the form that False - + + False + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -350,7 +383,7 @@ You can find more detailed information about the missing posts in the form that VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -370,10 +403,13 @@ You can find more detailed information about the missing posts in the form that False + + False + False - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -384,7 +420,7 @@ You can find more detailed information about the missing posts in the form that cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -400,7 +436,7 @@ You can find more detailed information about the missing posts in the form that VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -408,7 +444,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -419,7 +455,7 @@ You can find more detailed information about the missing posts in the form that cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -435,7 +471,7 @@ You can find more detailed information about the missing posts in the form that VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -443,7 +479,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -454,7 +490,7 @@ You can find more detailed information about the missing posts in the form that cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -470,7 +506,7 @@ You can find more detailed information about the missing posts in the form that VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -478,7 +514,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -489,7 +525,7 @@ You can find more detailed information about the missing posts in the form that cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -505,7 +541,7 @@ You can find more detailed information about the missing posts in the form that VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -513,7 +549,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6 JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOElE @@ -529,7 +565,7 @@ You can find more detailed information about the missing posts in the form that VnR1MIwhwMTCyqEQ37qEmZVDFF0OE/9nAACtFF4Ey6OP+wAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -543,7 +579,10 @@ You can find more detailed information about the missing posts in the form that False - + + False + + iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAABGdBTUEAALGPC/xhBQAAE65JREFUeF7t 3X2sJWddB/DdLi2lQG2hdOHuvfM887J7Cxca4ELTQMDWKigIFpBAEAgi9g+CJpJo9Q8NJhgBiYZIYspL @@ -639,7 +678,10 @@ You can find more detailed information about the missing posts in the form that False - + + False + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -647,7 +689,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -655,7 +697,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP @@ -666,7 +708,7 @@ You can find more detailed information about the missing posts in the form that cMaRN0UdBBkAAAAASUVORK5CYII= - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -677,7 +719,7 @@ You can find more detailed information about the missing posts in the form that False - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -685,7 +727,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -693,7 +735,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -701,7 +743,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go @@ -709,7 +751,7 @@ You can find more detailed information about the missing posts in the form that AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go diff --git a/SCrawler/Editors/GlobalSettingsForm.vb b/SCrawler/Editors/GlobalSettingsForm.vb index 838d512..7ad0be1 100644 --- a/SCrawler/Editors/GlobalSettingsForm.vb +++ b/SCrawler/Editors/GlobalSettingsForm.vb @@ -77,6 +77,9 @@ Namespace Editors CH_DOWN_ALL_F6_USE.Checked = .DownloadAll_UseF6 CH_DOWN_ALL_F6_NOTIFY.Checked = .DownloadAll_UseF6_Confirm CH_DOWN_ALL_NOTIFY.Checked = .DownloadAll_Confirm + TXT_SCHEDULER_SCRIPT.Text = .AutomationScript + TXT_SCHEDULER_SCRIPT.Checked = .AutomationScript.Use + CH_SCHEDULER_SCRIPT_EX_MANUAL.Checked = .AutomationScript_ExcludeManual 'Notifications CH_NOTIFY_SILENT.Checked = .NotificationsSilentMode CH_NOTIFY_SHOW_BASE.Checked = .ShowNotifications @@ -161,6 +164,9 @@ Namespace Editors CH_FEED_SHOW_FRIENDLY.Checked = .FeedShowFriendlyNames CH_FEED_SHOW_SPEC_MEDIAITEM.Checked = .FeedShowSpecialFeedsMediaItem CH_FEED_UP_FILE_LOC_MOVE.Checked = .FeedMoveCopyUpdateFileLocationOnMove + CH_FEED_ESC_TO_CLOSE.Checked = .FeedEscToClose + CH_FEED_SPEC_SEARCH.Checked = .FeedSpecialSearchForMissing + CH_FEED_SPEC_SEARCH_DEEP.Checked = .FeedSpecialSearchForMissing_Deep End With .MyFieldsChecker = New FieldsChecker With .MyFieldsCheckerE @@ -291,6 +297,9 @@ Namespace Editors .DownloadAll_UseF6.Value = CH_DOWN_ALL_F6_USE.Checked .DownloadAll_UseF6_Confirm.Value = CH_DOWN_ALL_F6_NOTIFY.Checked .DownloadAll_Confirm.Value = CH_DOWN_ALL_NOTIFY.Checked + .AutomationScript.Value = TXT_SCHEDULER_SCRIPT.Text + .AutomationScript.Use = TXT_SCHEDULER_SCRIPT.Checked + .AutomationScript_ExcludeManual.Value = CH_SCHEDULER_SCRIPT_EX_MANUAL.Checked 'Notifications .NotificationsSilentMode = CH_NOTIFY_SILENT.Checked .ShowNotifications.Value = CH_NOTIFY_SHOW_BASE.Checked @@ -373,6 +382,9 @@ Namespace Editors .FeedShowFriendlyNames.Value = CH_FEED_SHOW_FRIENDLY.Checked .FeedShowSpecialFeedsMediaItem.Value = CH_FEED_SHOW_SPEC_MEDIAITEM.Checked .FeedMoveCopyUpdateFileLocationOnMove.Value = CH_FEED_UP_FILE_LOC_MOVE.Checked + .FeedEscToClose.Value = CH_FEED_ESC_TO_CLOSE.Checked + .FeedSpecialSearchForMissing.Value = CH_FEED_SPEC_SEARCH.Checked + .FeedSpecialSearchForMissing_Deep.Value = CH_FEED_SPEC_SEARCH_DEEP.Checked FeedParametersChanged = { .FeedDataRows, .FeedDataColumns, .FeedEndless, .FeedBackColor, .FeedForeColor, .FeedCenterImage}.Cast(Of IXMLValue).Any(detector) diff --git a/SCrawler/MainFrame.Designer.vb b/SCrawler/MainFrame.Designer.vb index 4d96bab..7340aaa 100644 --- a/SCrawler/MainFrame.Designer.vb +++ b/SCrawler/MainFrame.Designer.vb @@ -353,7 +353,7 @@ Partial Public Class MainFrame : Inherits System.Windows.Forms.Form Me.BTT_FEED.Name = "BTT_FEED" Me.BTT_FEED.Size = New System.Drawing.Size(52, 22) Me.BTT_FEED.Text = "Feed" - Me.BTT_FEED.ToolTipText = "Feed of recently downloaded data" + Me.BTT_FEED.ToolTipText = "Feed of recently downloaded data (Ctrl+F)" ' 'BTT_CHANNELS ' diff --git a/SCrawler/MainFrame.vb b/SCrawler/MainFrame.vb index 02f0e83..69c8bd2 100644 --- a/SCrawler/MainFrame.vb +++ b/SCrawler/MainFrame.vb @@ -242,11 +242,13 @@ CloseResume: If Not b Then b = True If e.Control And e.KeyCode = Keys.F Then - MySearch.FormShow() + BTT_FEED.PerformClick() ElseIf e.Alt And e.KeyCode = Keys.A Then BTT_DOWN_AUTOMATION.PerformClick() ElseIf e.Alt And e.KeyCode = Keys.P Then BTT_PR_INFO.PerformClick() + ElseIf e.Alt And e.KeyCode = Keys.F Then + MySearch.FormShow() Else b = False End If diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb index c09cf36..cff3bdd 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/SettingsCLS.vb b/SCrawler/SettingsCLS.vb index 5c3b8de..672f8e9 100644 --- a/SCrawler/SettingsCLS.vb +++ b/SCrawler/SettingsCLS.vb @@ -179,8 +179,12 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable Friend ReadOnly Property LastCollections As List(Of String) Friend ReadOnly Property DownloadLocations As STDownloader.DownloadLocationsCollection Friend ReadOnly Property GlobalLocations As STDownloader.DownloadLocationsCollection +#Region "Scheduler" Friend Property Automation As Scheduler Friend ReadOnly Property AutomationFile As XMLValue(Of String) + Friend ReadOnly Property AutomationScript As XMLValueUse(Of String) + Friend ReadOnly Property AutomationScript_ExcludeManual As XMLValue(Of Boolean) +#End Region Friend ReadOnly Property Feeds As FeedSpecialCollection Friend ReadOnly Property BlackList As List(Of UserBan) Friend ReadOnly Property Colors As Editors.DataColorCollection @@ -188,6 +192,7 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable Private ReadOnly BlackListFile As SFile = $"{SettingsFolderName}\BlackList.txt" Private ReadOnly UsersSettingsFile As SFile = $"{SettingsFolderName}\Users.xml" Private ReadOnly Property SettingsVersion As XMLValue(Of Integer) + Private Const SettingsVersionCurrent As Integer = 1 #End Region #Region "Initializer" Friend Sub New() @@ -210,12 +215,15 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable Colors = New Editors.DataColorCollection EnvironmentProgramsList = New List(Of String) - AutomationFile = New XMLValue(Of String)("AutomationFile",, MyXML) - SiteSettingsShowHiddenControls = MyXML.Value("SiteSettingsShowHiddenControls").FromXML(Of Boolean)(False) + SettingsVersion = New XMLValue(Of Integer)("SettingsVersion", 0, MyXML) - Dim n() As String + Dim n() As String = {"Scheduler"} + AutomationFile = New XMLValue(Of String)("File",, MyXML, n) + If SettingsVersion.Value = 0 AndAlso MyXML.Contains(AutomationFile.Name) Then AutomationFile.Value = MyXML.Value(AutomationFile.Name) + AutomationScript = New XMLValueUse(Of String)("Script", String.Empty,, MyXML, n) + AutomationScript_ExcludeManual = New XMLValue(Of Boolean)("ScriptExcludeManual", True, MyXML, n) - SettingsVersion = New XMLValue(Of Integer)("SettingsVersion", 0, MyXML) + SiteSettingsShowHiddenControls = MyXML.Value("SiteSettingsShowHiddenControls").FromXML(Of Boolean)(False) #Region "Properties: environment" 'Environment @@ -393,6 +401,9 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable FeedLastModeSubscriptions = New XMLValue(Of Boolean)("LastModeSubscriptions", False, MyXML, n) FeedShowFriendlyNames = New XMLValue(Of Boolean)("ShowFriendlyNames", True, MyXML, n) FeedShowSpecialFeedsMediaItem = New XMLValue(Of Boolean)("ShowSpecialFeedsMediaItem", False, MyXML, n) + FeedEscToClose = New XMLValue(Of Boolean)("EscToClose", True, MyXML, n) + FeedSpecialSearchForMissing = New XMLValue(Of Boolean)("FeedSpecialSearchForMissing", True, MyXML, n) + FeedSpecialSearchForMissing_Deep = New XMLValue(Of Boolean)("FeedSpecialSearchForMissing_Deep", False, MyXML, n) n = {"Feed", "MoveCopy"} FeedMoveCopyLastLocation = New XMLValue(Of SFile)("LastLocation",, MyXML, n) FeedMoveCopyUpdateFileLocationOnMove = New XMLValue(Of Boolean)("UpdateFileLocationOnMove", True, MyXML, n) @@ -463,6 +474,8 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable AdvancedFilter.IsViewFilter = True Labels.AddRange({AdvancedFilter}.GetGroupsLabels, False) + SettingsVersion.Value = SettingsVersionCurrent + MyXML.EndUpdate() If MyXML.ChangesDetected Then MyXML.Sort() : MyXML.UpdateData() @@ -1098,6 +1111,9 @@ Friend Class SettingsCLS : Implements IDownloaderSettings, IDisposable Friend ReadOnly Property FeedLastModeSubscriptions As XMLValue(Of Boolean) Friend ReadOnly Property FeedShowFriendlyNames As XMLValue(Of Boolean) Friend ReadOnly Property FeedShowSpecialFeedsMediaItem As XMLValue(Of Boolean) + Friend ReadOnly Property FeedEscToClose As XMLValue(Of Boolean) + Friend ReadOnly Property FeedSpecialSearchForMissing As XMLValue(Of Boolean) + Friend ReadOnly Property FeedSpecialSearchForMissing_Deep As XMLValue(Of Boolean) #Region "MoveCopy" Friend ReadOnly Property FeedMoveCopyLastLocation As XMLValue(Of SFile) Friend ReadOnly Property FeedMoveCopyUpdateFileLocationOnMove As XMLValue(Of Boolean)