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 3808dd3..51ad23c 100644 Binary files a/ProgramScreenshots/SettingsGlobalBehavior.png and b/ProgramScreenshots/SettingsGlobalBehavior.png differ diff --git a/ProgramScreenshots/SettingsGlobalFeed.png b/ProgramScreenshots/SettingsGlobalFeed.png index 9859e9a..aeb5596 100644 Binary files a/ProgramScreenshots/SettingsGlobalFeed.png and b/ProgramScreenshots/SettingsGlobalFeed.png differ 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)