diff --git a/Changelog.md b/Changelog.md index d607d3b..4db5e71 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,8 +1,22 @@ +# 2.0.0.4 + +**Removed compatibility of program settings with version 1.0.0.4 and lower.** + +**If your program version is 1.0.0.4 and lower, it is strongly recommended that you upgrade to release 2.0.0.1 to update the program settings (and run the program). Then update to this release. Otherwise, you will have to configure the program settings again** + +**If your program version is 1.0.1.0 or higher, you should not pay attention to this message.** + +- Added + - Ability to specify the path to store saved posts +- Fixed + - **Error when specifying network paths** + - Minor bugs + # 2.0.0.3 **Removed compatibility of program settings with version 1.0.0.4 and lower.** -**If your program version is 1.0.0.4 and lower, it is strongly recommended that you upgrade to release 2.0.0.2 to update the program settings (and run the program). Then update to this release. Otherwise, you will have to configure the program settings again** +**If your program version is 1.0.0.4 and lower, it is strongly recommended that you upgrade to release 2.0.0.1 to update the program settings (and run the program). Then update to this release. Otherwise, you will have to configure the program settings again** **If your program version is 1.0.1.0 or higher, you should not pay attention to this message.** @@ -31,7 +45,7 @@ - Clear information about downloaded profiles of the current session in the "Download info form" - Increased the number of Instagram posts (from 12 to 50) received per request - Channels' statistics - - **RedGisf profiles support** + - **RedGifs profiles support** - Fixed - The program was showing incorrect information about the total numbers of images and videos downloaded when a Reddit user was created from a channel diff --git a/README.md b/README.md index 780ed91..01e7302 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,8 @@ You can add users by patterns: Read more about adding users and subreddits [here](https://github.com/AAndyProgram/SCrawler/wiki/Users) +# Guide + **Full guide you can find [here](https://github.com/AAndyProgram/SCrawler/wiki)** ## Using program as just video downloader diff --git a/SCrawler/API/Base/SiteSettings.vb b/SCrawler/API/Base/SiteSettings.vb index d4dace3..c7badfd 100644 --- a/SCrawler/API/Base/SiteSettings.vb +++ b/SCrawler/API/Base/SiteSettings.vb @@ -9,6 +9,7 @@ Imports PersonalUtilities.Tools Imports PersonalUtilities.Functions.XML Imports PersonalUtilities.Functions.XML.Base +Imports PersonalUtilities.Functions.RegularExpressions Namespace API.Base Friend Class SiteSettings : Implements IDisposable Friend Const Header_Twitter_Authorization As String = "authorization" @@ -16,13 +17,33 @@ Namespace API.Base Friend ReadOnly Site As Sites Friend ReadOnly Responser As WEB.Response Private ReadOnly _Path As XMLValue(Of SFile) - Friend Property Path As SFile + Friend Property Path(Optional ByVal SetProp As Boolean = True) As SFile Get - If _Path.IsEmptyString Then _Path.Value = SFile.GetPath($"{Settings.GlobalPath.Value.PathWithSeparator}{Site}") + If _Path.IsEmptyString Then + Dim tmpPath As SFile = SFile.GetPath($"{Settings.GlobalPath.Value.PathWithSeparator}{Site}") + If SetProp Then _Path.Value = tmpPath Else Return tmpPath + End If Return _Path.Value End Get - Set(ByVal NewFile As SFile) - _Path.Value = NewFile + Set(ByVal NewPath As SFile) + _Path.Value = NewPath + End Set + End Property + Private ReadOnly _SavedPostsPath As XMLValue(Of SFile) + Friend Property SavedPostsPath(Optional ByVal GetAny As Boolean = True) As SFile + Get + If Not _SavedPostsPath.Value.IsEmptyString Then + Return _SavedPostsPath.Value + Else + If GetAny Then + Return $"{Path.PathNoSeparator}\!Saved\" + Else + Return Nothing + End If + End If + End Get + Set(ByVal NewPath As SFile) + _SavedPostsPath.Value = NewPath End Set End Property #Region "Instagram" @@ -122,7 +143,7 @@ Namespace API.Base End If Dim n() As String = {SettingsCLS.Name_Node_Sites, Site.ToString} - _Path = New XMLValue(Of SFile)("Path", SFile.GetPath($"{GlobalPath.PathWithSeparator}{Site}"), _XML, n, XMLValue(Of SFile).ToFilePath) + _Path = New XMLValue(Of SFile)("Path",, _XML, n, XMLValue(Of SFile).ToFilePath) _XML.Remove(Site.ToString) Temporary = New XMLValue(Of Boolean) @@ -138,6 +159,7 @@ Namespace API.Base DownloadVideos.SetDefault(_Vids) GetUserMediaOnly = New XMLValue(Of Boolean)("GetUserMediaOnly", True, _XML, n) + _SavedPostsPath = New XMLValue(Of SFile)("SavedPostsPath",, _XML, n, XMLValue(Of SFile).ToFilePath) CreateProp(InstaHashUpdateRequired, Sites.Instagram, "InstaHashUpdateRequired", True, _XML, n) CreateProp(InstaHash, Sites.Instagram, "InstaHash", String.Empty, _XML, n) @@ -149,7 +171,7 @@ Namespace API.Base CreateProp(RequestsWaitTimerTaskCount, Sites.Instagram, "RequestsWaitTimerTaskCount", 1, _XML, n) CreateProp(SleepTimerOnPostsLimit, Sites.Instagram, "SleepTimerOnPostsLimit", 60000, _XML, n) If Site = Sites.Instagram Then - InstagramDownloadingErrorDate = New XMLValue(Of Date) With {.ToStringFunction = Function(ss, vv) AConvert(Of String)(vv, Nothing)} + InstagramDownloadingErrorDate = New XMLValue(Of Date) With {.ToStringFunction = Function(ss, vv) AConvert(Of String)(vv, AModes.Var, Nothing)} InstagramDownloadingErrorDate.SetExtended("InstagramDownloadingErrorDate", Now.AddYears(-10), _XML, n) Else InstagramDownloadingErrorDate = New XMLValue(Of Date) @@ -170,10 +192,7 @@ Namespace API.Base End Sub Friend Function GatherInstaHash() As Boolean Try - Dim rs As New RegexStructure("=" & Chr(34) & "([^" & Chr(34) & "]+?ConsumerLibCommons[^" & Chr(34) & "]+?.js)" & Chr(34), 1) With { - .UseTimeOut = True, - .MatchTimeOutSeconds = 10 - } + Dim rs As New RParams("=""([^""]+?ConsumerLibCommons[^""]+?.js)""", Nothing, 1) With {.MatchTimeOut = 10} Dim r$ = Responser.GetResponse("https://instagram.com",, EDP.ThrowException) If Not r.IsEmptyString Then Dim hStr$ = RegexReplace(r, rs) @@ -182,10 +201,7 @@ Namespace API.Base hStr = $"https://instagram.com/{hStr}" r = Responser.GetResponse(hStr,, EDP.ThrowException) If Not r.IsEmptyString Then - rs = New RegexStructure("generatePaginationActionCreators.+?.profilePosts.byUserId.get.+?queryId:.([\d\w\S]+?)" & Chr(34), 1) With { - .UseTimeOut = True, - .MatchTimeOutSeconds = 10 - } + rs = New RParams("generatePaginationActionCreators.+?.profilePosts.byUserId.get.+?queryId:.([\d\w\S]+?)""", Nothing, 1) With {.MatchTimeOut = 10} Dim h$ = RegexReplace(r, rs) If Not h.IsEmptyString Then InstaHash.Value = h diff --git a/SCrawler/API/Base/UserDataBase.vb b/SCrawler/API/Base/UserDataBase.vb index 070cc62..25e4593 100644 --- a/SCrawler/API/Base/UserDataBase.vb +++ b/SCrawler/API/Base/UserDataBase.vb @@ -7,6 +7,7 @@ ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.RegularExpressions Imports PersonalUtilities.Forms.Toolbars Imports System.IO Imports System.Net @@ -470,7 +471,7 @@ BlockNullPicture: Temporary = x.Value(Name_Temporary).FromXML(Of Boolean)(False) Favorite = x.Value(Name_Favorite).FromXML(Of Boolean)(False) CreatedByChannel = x.Value(Name_CreatedByChannel).FromXML(Of Boolean)(False) - SeparateVideoFolder = AConvert(Of Boolean)(x.Value(Name_SeparateVideoFolder), Nothing) + SeparateVideoFolder = AConvert(Of Boolean)(x.Value(Name_SeparateVideoFolder), AModes.Var, Nothing) ReadyForDownload = x.Value(Name_ReadyForDownload).FromXML(Of Boolean)(True) DownloadImages = x.Value(Name_DownloadImages).FromXML(Of Boolean)(True) DownloadVideos = x.Value(Name_DownloadVideos).FromXML(Of Boolean)(True) @@ -944,7 +945,7 @@ BlockNullPicture: End Sub Private Function CheckFile(ByVal f As SFile, ByRef List As IEnumerable(Of SFile)) As SFile If List.ListExists Then - Dim p As New RegexStructure(".+?\s{0,1}\((\d+)\)|.+",,,,,,, String.Empty, EDP.ReturnValue) + Dim p As RParams = RParams.DMS(".+?\s{0,1}\((\d+)\)|.+", 0, EDP.ReturnValue) Dim i% = List.Where(Function(ff) CStr(RegexReplace(ff.Name, p)).Trim.ToLower = f.Name.Trim.ToLower).Count If i > 0 Then f.Name &= $" ({i + 1})" End If diff --git a/SCrawler/API/Imgur/Envir.vb b/SCrawler/API/Imgur/Envir.vb index a1bed01..36f25bc 100644 --- a/SCrawler/API/Imgur/Envir.vb +++ b/SCrawler/API/Imgur/Envir.vb @@ -7,16 +7,17 @@ ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.RegularExpressions Imports PersonalUtilities.Tools.WebDocuments.JSON Imports System.Net Imports SCrawler.API.Imgur.Declarations Imports SCrawler.API.Base -Namespace API.Imgur.Declarations - Friend Module Imgur_Declarations - Friend ReadOnly PostRegex As New RegexStructure("/([\w\d]+?)(|\.[\w]{0,4})\Z", 1) - End Module -End Namespace Namespace API.Imgur + Namespace Declarations + Friend Module Imgur_Declarations + Friend ReadOnly PostRegex As RParams = RParams.DMS("/([\w\d]+?)(|\.[\w]{0,4})\Z", 1) + End Module + End Namespace Friend NotInheritable Class Envir Private Sub New() End Sub diff --git a/SCrawler/API/Instagram/Declarations.vb b/SCrawler/API/Instagram/Declarations.vb index fa8376a..2af847a 100644 --- a/SCrawler/API/Instagram/Declarations.vb +++ b/SCrawler/API/Instagram/Declarations.vb @@ -6,9 +6,10 @@ ' ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY +Imports PersonalUtilities.Functions.RegularExpressions Namespace API.Instagram Friend Module Declarations - Friend ReadOnly FilesPattern As New RegexStructure(".+?([^/\?]+?\.[\w\d]{3,4})(?=(\?|\Z))",,,, 1,,, String.Empty, EDP.ReturnValue) + Friend ReadOnly FilesPattern As RParams = RParams.DMS(".+?([^/\?]+?\.[\w\d]{3,4})(?=(\?|\Z))", 1, EDP.ReturnValue) Friend ReadOnly Property DateProvider As New JsonDate Friend Class JsonDate : Implements ICustomProvider Friend Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider, diff --git a/SCrawler/API/Instagram/ProfileSaved.vb b/SCrawler/API/Instagram/ProfileSaved.vb index 241d689..7cea9da 100644 --- a/SCrawler/API/Instagram/ProfileSaved.vb +++ b/SCrawler/API/Instagram/ProfileSaved.vb @@ -11,7 +11,7 @@ Imports System.Threading Imports PersonalUtilities.Forms.Toolbars Namespace API.Instagram Friend NotInheritable Class ProfileSaved - Friend Shared ReadOnly Property DataPath As SFile = $"{Settings(Sites.Instagram).Path.PathNoSeparator}\!Saved\" + Friend Shared ReadOnly Property DataPath As SFile = Settings(Sites.Instagram).SavedPostsPath Private Sub New() End Sub Friend Shared Sub Download(ByRef Bar As MyProgress, ByVal Token As CancellationToken) diff --git a/SCrawler/API/Instagram/UserData.vb b/SCrawler/API/Instagram/UserData.vb index 3278ae1..f07a512 100644 --- a/SCrawler/API/Instagram/UserData.vb +++ b/SCrawler/API/Instagram/UserData.vb @@ -8,6 +8,7 @@ ' but WITHOUT ANY WARRANTY Imports PersonalUtilities.Functions.XML Imports PersonalUtilities.Functions.Messaging +Imports PersonalUtilities.Functions.RegularExpressions Imports PersonalUtilities.Tools.WebDocuments.JSON Imports PersonalUtilities.Forms.Toolbars Imports SCrawler.API.Base @@ -414,7 +415,7 @@ Namespace API.Instagram Friend Shared Function GetVideoInfo(ByVal URL As String) As IEnumerable(Of UserMedia) Try If Not URL.IsEmptyString AndAlso URL.Contains("instagram.com") Then - Dim PID$ = RegexReplace(URL, New RegexStructure(".*?instagram.com/p/([_\w\d]+)", 1)) + Dim PID$ = RegexReplace(URL, RParams.DMS(".*?instagram.com/p/([_\w\d]+)", 1)) If Not PID.IsEmptyString Then Using t As New UserData t.Responser = New PersonalUtilities.Tools.WEB.Response diff --git a/SCrawler/API/Reddit/Declarations.vb b/SCrawler/API/Reddit/Declarations.vb index 821efa8..4a37266 100644 --- a/SCrawler/API/Reddit/Declarations.vb +++ b/SCrawler/API/Reddit/Declarations.vb @@ -7,13 +7,14 @@ ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY Imports PersonalUtilities.Functions.XML.Base +Imports PersonalUtilities.Functions.RegularExpressions Namespace API.Reddit Friend Module Declarations Friend ReadOnly JsonNodesJson() As NodeParams = {New NodeParams("posts", True, True, True, True, 3)} Friend ReadOnly ChannelJsonNodes() As NodeParams = {New NodeParams("data", True, True, True, True, 1), New NodeParams("children", True, True, True)} - Friend ReadOnly UrlBasePattern As New RegexStructure("(?<=/)([^/]+?\.[\w]{3,4})(?=(\?|\Z))", True, False) - Friend ReadOnly VideoRegEx As New RegexStructure("http.{0,1}://[^" & Chr(34) & "]+?mp4", True, False) + Friend ReadOnly UrlBasePattern As RParams = RParams.DM("(?<=/)([^/]+?\.[\w]{3,4})(?=(\?|\Z))", 0) + Friend ReadOnly VideoRegEx As RParams = RParams.DM("http.{0,1}://[^" & Chr(34) & "]+?mp4", 0) Friend ReadOnly DateProvider As New JsonDate Friend ReadOnly DateProviderChannel As New JsonDateChannel Private ReadOnly EUR_PROVIDER As New ANumbers(ANumbers.Cultures.EUR) diff --git a/SCrawler/API/Reddit/M3U8.vb b/SCrawler/API/Reddit/M3U8.vb index 1c93797..d7ea9f8 100644 --- a/SCrawler/API/Reddit/M3U8.vb +++ b/SCrawler/API/Reddit/M3U8.vb @@ -9,26 +9,25 @@ Imports System.Net Imports SCrawler.API.Reddit.M3U8_Declarations Imports PersonalUtilities.Tools.WEB -Namespace API.Reddit.M3U8_Declarations - Friend Module M3U8_Declarations - Friend ReadOnly BaseUrlPattern As New RegexStructure("([htps:/]{7,8}.+?/.+?)(?=/)", True, False,,,,,, EDP.ReturnValue) - Friend ReadOnly PlayListRegEx_1 As New RegexStructure("(#EXT-X-STREAM-INF)(.+)(RESOLUTION=)(\d+)(.+?[\r\n]{1,2})(.+?)([\r\n]{1,2})", True, False,,, - RegexReturn.List,, New List(Of String), - New ErrorsDescriber(False, False, True, New List(Of String))) - Friend ReadOnly PlayListRegEx_2 As New RegexStructure("(?<=#EXT-X-BYTERANGE.+?[\r\n]{1,2})(.+)(?=[\r\n]{0,2})", True, False,,, RegexReturn.List,, - New List(Of String), - New ErrorsDescriber(False, False, True, New List(Of String))) - Friend ReadOnly DPED As New ErrorsDescriber(EDP.SendInLog + EDP.ReturnValue) - End Module -End Namespace +Imports PersonalUtilities.Functions.RegularExpressions Namespace API.Reddit + Namespace M3U8_Declarations + Friend Module M3U8_Declarations + Friend ReadOnly BaseUrlPattern As RParams = RParams.DM("([htps:/]{7,8}.+?/.+?)(?=/)", 0, EDP.ReturnValue) + Friend ReadOnly PlayListRegEx_1 As RParams = RParams.DM("(#EXT-X-STREAM-INF)(.+)(RESOLUTION=)(\d+)(.+?[\r\n]{1,2})(.+?)([\r\n]{1,2})", 0, + RegexReturn.List, EDP.SendInLog, EDP.ReturnValue) + Friend ReadOnly PlayListRegEx_2 As RParams = RParams.DM("(?<=#EXT-X-BYTERANGE.+?[\r\n]{1,2})(.+)(?=[\r\n]{0,2})", 0, + RegexReturn.List, EDP.SendInLog, EDP.ReturnValue) + Friend ReadOnly DPED As New ErrorsDescriber(EDP.SendInLog + EDP.ReturnValue) + End Module + End Namespace Friend NotInheritable Class M3U8 Private Sub New() End Sub Private Structure Resolution : Implements IRegExCreator, IComparable(Of Resolution) Friend File As String Friend Resolution As Integer - Friend Function CreateFromArray(ByVal ParamsArray() As String) As IRegExCreator Implements IRegExCreator.CreateFromArray + Friend Function CreateFromArray(ByVal ParamsArray() As String) As Object Implements IRegExCreator.CreateFromArray If ParamsArray.ArrayExists Then File = ParamsArray(0) If ParamsArray.Length > 1 Then Resolution = AConvert(Of Integer)(ParamsArray(1), 0) @@ -45,7 +44,7 @@ Namespace API.Reddit Using w As New WebClient Dim r$ = w.DownloadString(PlayListURL) If Not r.IsEmptyString Then - Dim l As List(Of Resolution) = RegexFields(Of Resolution)(r, {PlayListRegEx_1}, {6, 4}) + Dim l As List(Of Resolution) = FNF.RegexFields(Of Resolution)(r, {PlayListRegEx_1}, {6, 4}) If l.ListExists Then l.Sort() Dim pls$ = $"{BaseUrl}/{l.First.File}" diff --git a/SCrawler/API/Reddit/ProfileSaved.vb b/SCrawler/API/Reddit/ProfileSaved.vb index 1622ecd..7b8cfbf 100644 --- a/SCrawler/API/Reddit/ProfileSaved.vb +++ b/SCrawler/API/Reddit/ProfileSaved.vb @@ -11,7 +11,7 @@ Imports System.Threading Imports PersonalUtilities.Forms.Toolbars Namespace API.Reddit Friend NotInheritable Class ProfileSaved - Friend Shared ReadOnly Property DataPath As SFile = $"{Settings(Sites.Reddit).Path.PathNoSeparator}\!Saved\" + Friend Shared ReadOnly Property DataPath As SFile = Settings(Sites.Reddit).SavedPostsPath Private Sub New() End Sub Friend Shared Sub Download(ByRef Bar As MyProgress, ByVal Token As CancellationToken) diff --git a/SCrawler/API/Reddit/UserData.vb b/SCrawler/API/Reddit/UserData.vb index ac12b22..9f21995 100644 --- a/SCrawler/API/Reddit/UserData.vb +++ b/SCrawler/API/Reddit/UserData.vb @@ -7,6 +7,7 @@ ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.RegularExpressions Imports PersonalUtilities.Tools.ImageRenderer Imports PersonalUtilities.Tools.WebDocuments.JSON Imports System.Net @@ -72,6 +73,7 @@ Namespace API.Reddit #End Region #Region "Download Overrides" Friend Overrides Sub DownloadData(ByVal Token As CancellationToken) + _CrossPosts.Clear() If Not IsSavedPosts AndAlso (IsChannel AndAlso Not ChannelInfo.IsRegularChannel) Then If Not Responser Is Nothing Then Responser.Dispose() Responser = New PersonalUtilities.Tools.WEB.Response @@ -282,6 +284,18 @@ Namespace API.Reddit _TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) _TotalPostsDownloaded += 1 End If + ElseIf Not s.Value({"media", "reddit_video"}, "fallback_url").IsEmptyString Then + tmpUrl = s.Value({"media", "reddit_video"}, "fallback_url") + If SaveToCache Then + tmpUrl = s.Value("thumbnail") + If Not tmpUrl.IsEmptyString Then + _TempMediaList.ListAddValue(MediaFromData(UTypes.Picture, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) + _TotalPostsDownloaded += 1 + End If + Else + _TempMediaList.ListAddValue(MediaFromData(UTypes.VideoPre + UTypes.m3u8, tmpUrl, PostID, PostDate, _UserID, IsChannel), LNC) + _TotalPostsDownloaded += 1 + End If ElseIf CreateImgurMedia(tmpUrl, PostID, PostDate, _UserID, IsChannel) Then _TotalPostsDownloaded += 1 ElseIf s.Item("media_metadata").XmlIfNothing.Count > 0 Then @@ -370,15 +384,16 @@ Namespace API.Reddit Protected Overrides Sub ReparseVideo(ByVal Token As CancellationToken) Try ThrowAny(Token) - If _TempMediaList.Count > 0 AndAlso _TempMediaList.Exists(Function(p) p.Type = UTypes.VideoPre) Then + Const v2 As UTypes = UTypes.VideoPre + UTypes.m3u8 + If _TempMediaList.Count > 0 AndAlso _TempMediaList.Exists(Function(p) p.Type = UTypes.VideoPre Or p.Type = v2) Then Dim r$, v$ Dim e As New ErrorsDescriber(EDP.ReturnValue) Dim m As UserMedia For i% = _TempMediaList.Count - 1 To 0 Step -1 ThrowAny(Token) - If _TempMediaList(i).Type = UTypes.VideoPre Then + If _TempMediaList(i).Type = UTypes.VideoPre Or _TempMediaList(i).Type = v2 Then m = _TempMediaList(i) - r = Responser.GetResponse(m.URL,, e) + If _TempMediaList(i).Type = UTypes.VideoPre Then r = Responser.GetResponse(m.URL,, e) Else r = m.URL _TempMediaList(i) = New UserMedia If Not r.IsEmptyString Then v = RegexReplace(r, VideoRegEx) @@ -440,6 +455,8 @@ Namespace API.Reddit #End Region Protected Overrides Sub DownloadContent(ByVal Token As CancellationToken) Try + Const _RFN$ = "RedditVideo" + Const RFN$ = _RFN & "{0}" Dim i% Dim dCount% = 0, dTotal% = 0 ThrowAny(Token) @@ -453,6 +470,10 @@ Namespace API.Reddit Else MyDir = MyFile.CutPath.PathNoSeparator End If + Dim StartRFN% = 0 + If _ContentNew.Exists(Function(c) c.Type = UTypes.Video And c.URL.Contains("redd.it")) Then + StartRFN = SFile.Indexed_GetMaxIndex($"{MyDir}\{IIf(SeparateVideoFolderF, "Video\", String.Empty)}{_RFN}.mp4",, New SFileNumbers(_RFN, String.Empty), EDP.ReturnValue) + End If Dim HashList As New List(Of String) If _ContentList.Count > 0 Then HashList.ListAddList((From h In _ContentList Where Not h.MD5.IsEmptyString Select h.MD5), LNC) Dim f As SFile @@ -550,6 +571,10 @@ Namespace API.Reddit Try If (v.Type = UTypes.Video Or v.Type = UTypes.m3u8 Or (ImgurUrls.Count > 0 AndAlso f.Extension = "mp4")) And vsf Then f.Path = $"{f.PathWithSeparator}Video" + If v.Type = UTypes.Video AndAlso v.URL.Contains("redd.it") Then + StartRFN += 1 + f.Name = String.Format(RFN, StartRFN) + End If If v.Type = UTypes.m3u8 Then f = M3U8.Download(v.URL, f) ElseIf ImgurUrls.Count > 0 Then diff --git a/SCrawler/API/Redgifs/UserData.vb b/SCrawler/API/Redgifs/UserData.vb index 37af32c..696a521 100644 --- a/SCrawler/API/Redgifs/UserData.vb +++ b/SCrawler/API/Redgifs/UserData.vb @@ -7,6 +7,7 @@ ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.RegularExpressions Imports PersonalUtilities.Tools.WebDocuments.JSON Imports System.Threading Imports System.Net diff --git a/SCrawler/API/Twitter/Declarations.vb b/SCrawler/API/Twitter/Declarations.vb index 5fb86e7..af6beba 100644 --- a/SCrawler/API/Twitter/Declarations.vb +++ b/SCrawler/API/Twitter/Declarations.vb @@ -7,11 +7,12 @@ ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY Imports PersonalUtilities.Functions.XML.Base +Imports PersonalUtilities.Functions.RegularExpressions Namespace API.Twitter Friend Module Declarations Friend DateProvider As New ADateTime(ADateTime.Formats.BaseDateTime) Friend ReadOnly VideoNode As NodeParams() = {New NodeParams("video_info", True, True, True, True, 10)} - Friend ReadOnly VideoSizeRegEx As New RegexStructure("\d+x(\d+)",,,, 1,,, String.Empty, EDP.ReturnValue) - Friend ReadOnly UserIdRegEx As New RegexStructure("user_id.:.(\d+)",,,, 1,,, String.Empty, EDP.ReturnValue) + Friend ReadOnly VideoSizeRegEx As RParams = RParams.DMS("\d+x(\d+)", 1, EDP.ReturnValue) + Friend ReadOnly UserIdRegEx As RParams = RParams.DMS("user_id.:.(\d+)", 1, EDP.ReturnValue) End Module End Namespace \ No newline at end of file diff --git a/SCrawler/API/Twitter/UserData.vb b/SCrawler/API/Twitter/UserData.vb index 2c5ae46..ff0f107 100644 --- a/SCrawler/API/Twitter/UserData.vb +++ b/SCrawler/API/Twitter/UserData.vb @@ -9,6 +9,7 @@ Imports PersonalUtilities.Tools.WEB Imports PersonalUtilities.Tools.WebDocuments.JSON Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.RegularExpressions Imports System.Net Imports System.Threading Imports SCrawler.API.Base @@ -101,7 +102,7 @@ Namespace API.Twitter Friend Shared Function GetVideoInfo(ByVal URL As String) As IEnumerable(Of UserMedia) Try If URL.Contains("twitter") Then - Dim PostID$ = RegexReplace(URL, New RegexStructure("(?<=/)\d+", True, False,,,,, String.Empty)) + Dim PostID$ = RegexReplace(URL, RParams.DM("(?<=/)\d+", 0)) If Not PostID.IsEmptyString Then Dim r$ = DirectCast(Settings(Sites.Twitter).Responser.Copy(), Response). GetResponse($"https://api.twitter.com/1.1/statuses/show.json?id={PostID}",, EDP.ReturnValue) diff --git a/SCrawler/Channels/ChannelViewForm.vb b/SCrawler/Channels/ChannelViewForm.vb index da9cb3a..a859a27 100644 --- a/SCrawler/Channels/ChannelViewForm.vb +++ b/SCrawler/Channels/ChannelViewForm.vb @@ -85,7 +85,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits Private Property DownloadLimitCount As Integer? Implements IChannelLimits.DownloadLimitCount Get If OPT_LIMITS_COUNT.Checked Then - Return AConvert(Of Integer)(TXT_LIMIT.Text, Nothing) + Return AConvert(Of Integer)(TXT_LIMIT.Text, AModes.Var, Nothing) Else Return Nothing End If @@ -107,7 +107,7 @@ Friend Class ChannelViewForm : Implements IChannelLimits Private Property DownloadLimitDate As Date? Implements IChannelLimits.DownloadLimitDate Get If OPT_LIMITS_DATE.Checked Then - Return AConvert(Of Date)(TXT_LIMIT.Value, Nothing) + Return AConvert(Of Date)(TXT_LIMIT.Value, AModes.Var, Nothing) Else Return Nothing End If diff --git a/SCrawler/Editors/GlobalSettingsForm.Designer.vb b/SCrawler/Editors/GlobalSettingsForm.Designer.vb index 883d83a..6ab1122 100644 --- a/SCrawler/Editors/GlobalSettingsForm.Designer.vb +++ b/SCrawler/Editors/GlobalSettingsForm.Designer.vb @@ -35,7 +35,11 @@ Dim TAB_DEFS_CHANNELS As System.Windows.Forms.TabPage Dim TP_CHANNELS As System.Windows.Forms.TableLayoutPanel Dim TAB_DEFS_REDDIT As System.Windows.Forms.TabPage + 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 TAB_DEFS_TWITTER As System.Windows.Forms.TabPage + 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() 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() @@ -65,6 +69,8 @@ Me.TXT_CHANNEL_USER_POST_LIMIT = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.DEFS_REDDIT = New SCrawler.Editors.SiteDefaults() Me.TXT_REDDIT_SAVED_POSTS_USER = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.CH_REDDIT_USER_MEDIA = New System.Windows.Forms.CheckBox() + Me.TXT_REDDIT_SAVED_POSTS_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.DEFS_TWITTER = New SCrawler.Editors.SiteDefaults() Me.CH_TWITTER_USER_MEDIA = New System.Windows.Forms.CheckBox() Me.TXT_REQ_WAIT_TIMER = New PersonalUtilities.Forms.Controls.TextBoxExtended() @@ -74,10 +80,10 @@ Me.TAB_DEFS_INSTAGRAM = New System.Windows.Forms.TabPage() Me.DEFS_INST = New SCrawler.Editors.SiteDefaults() Me.TXT_INST_SAVED_POSTS_USER = New PersonalUtilities.Forms.Controls.TextBoxExtended() + Me.TXT_INST_SAVED_POSTS_PATH = New PersonalUtilities.Forms.Controls.TextBoxExtended() Me.TAB_DEFS_REDGIFS = New System.Windows.Forms.TabPage() Me.DEFS_REDGIFS = New SCrawler.Editors.SiteDefaults() Me.CONTAINER_MAIN = New System.Windows.Forms.ToolStripContainer() - Me.CH_REDDIT_USER_MEDIA = 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() @@ -115,6 +121,7 @@ TAB_DEFS_REDDIT.SuspendLayout() Me.DEFS_REDDIT.SuspendLayout() CType(Me.TXT_REDDIT_SAVED_POSTS_USER, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_REDDIT_SAVED_POSTS_PATH, System.ComponentModel.ISupportInitialize).BeginInit() TAB_DEFS_TWITTER.SuspendLayout() Me.DEFS_TWITTER.SuspendLayout() CType(Me.TXT_REQ_WAIT_TIMER, System.ComponentModel.ISupportInitialize).BeginInit() @@ -124,6 +131,7 @@ Me.TAB_DEFS_INSTAGRAM.SuspendLayout() Me.DEFS_INST.SuspendLayout() CType(Me.TXT_INST_SAVED_POSTS_USER, System.ComponentModel.ISupportInitialize).BeginInit() + CType(Me.TXT_INST_SAVED_POSTS_PATH, System.ComponentModel.ISupportInitialize).BeginInit() Me.TAB_DEFS_REDGIFS.SuspendLayout() Me.CONTAINER_MAIN.ContentPanel.SuspendLayout() Me.CONTAINER_MAIN.SuspendLayout() @@ -710,15 +718,17 @@ Me.DEFS_REDDIT.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) Me.DEFS_REDDIT.Controls.Add(Me.TXT_REDDIT_SAVED_POSTS_USER, 0, 4) Me.DEFS_REDDIT.Controls.Add(Me.CH_REDDIT_USER_MEDIA, 0, 3) + Me.DEFS_REDDIT.Controls.Add(Me.TXT_REDDIT_SAVED_POSTS_PATH, 0, 5) Me.DEFS_REDDIT.Dock = System.Windows.Forms.DockStyle.Fill Me.DEFS_REDDIT.Location = New System.Drawing.Point(3, 3) Me.DEFS_REDDIT.Name = "DEFS_REDDIT" - Me.DEFS_REDDIT.RowCount = 6 + Me.DEFS_REDDIT.RowCount = 7 Me.DEFS_REDDIT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) Me.DEFS_REDDIT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) Me.DEFS_REDDIT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) Me.DEFS_REDDIT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) Me.DEFS_REDDIT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + Me.DEFS_REDDIT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) Me.DEFS_REDDIT.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) Me.DEFS_REDDIT.Size = New System.Drawing.Size(570, 366) Me.DEFS_REDDIT.TabIndex = 1 @@ -732,6 +742,36 @@ Me.TXT_REDDIT_SAVED_POSTS_USER.Size = New System.Drawing.Size(562, 22) Me.TXT_REDDIT_SAVED_POSTS_USER.TabIndex = 4 ' + 'CH_REDDIT_USER_MEDIA + ' + Me.CH_REDDIT_USER_MEDIA.AutoSize = True + Me.CH_REDDIT_USER_MEDIA.Dock = System.Windows.Forms.DockStyle.Fill + Me.CH_REDDIT_USER_MEDIA.Location = New System.Drawing.Point(4, 82) + Me.CH_REDDIT_USER_MEDIA.Name = "CH_REDDIT_USER_MEDIA" + Me.CH_REDDIT_USER_MEDIA.Size = New System.Drawing.Size(562, 19) + Me.CH_REDDIT_USER_MEDIA.TabIndex = 3 + Me.CH_REDDIT_USER_MEDIA.Text = "Get user media only" + Me.CH_REDDIT_USER_MEDIA.UseVisualStyleBackColor = True + ' + 'TXT_REDDIT_SAVED_POSTS_PATH + ' + ActionButton7.BackgroundImage = CType(resources.GetObject("ActionButton7.BackgroundImage"), System.Drawing.Image) + ActionButton7.Index = 0 + ActionButton7.Name = "BTT_OPEN" + ActionButton8.BackgroundImage = CType(resources.GetObject("ActionButton8.BackgroundImage"), System.Drawing.Image) + ActionButton8.Index = 1 + ActionButton8.Name = "BTT_CLEAR" + Me.TXT_REDDIT_SAVED_POSTS_PATH.Buttons.Add(ActionButton7) + Me.TXT_REDDIT_SAVED_POSTS_PATH.Buttons.Add(ActionButton8) + Me.TXT_REDDIT_SAVED_POSTS_PATH.CaptionText = "Saved posts path" + Me.TXT_REDDIT_SAVED_POSTS_PATH.CaptionToolTipEnabled = True + Me.TXT_REDDIT_SAVED_POSTS_PATH.CaptionToolTipText = "Special path (clear to use default)" + Me.TXT_REDDIT_SAVED_POSTS_PATH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_REDDIT_SAVED_POSTS_PATH.Location = New System.Drawing.Point(4, 137) + Me.TXT_REDDIT_SAVED_POSTS_PATH.Name = "TXT_REDDIT_SAVED_POSTS_PATH" + Me.TXT_REDDIT_SAVED_POSTS_PATH.Size = New System.Drawing.Size(562, 22) + Me.TXT_REDDIT_SAVED_POSTS_PATH.TabIndex = 8 + ' 'TAB_DEFS_TWITTER ' TAB_DEFS_TWITTER.Controls.Add(Me.DEFS_TWITTER) @@ -837,10 +877,11 @@ Me.DEFS_INST.Controls.Add(Me.TXT_REQ_COUNT, 0, 4) Me.DEFS_INST.Controls.Add(Me.TXT_REQ_WAIT_TIMER, 0, 3) Me.DEFS_INST.Controls.Add(Me.TXT_INST_SAVED_POSTS_USER, 0, 6) + Me.DEFS_INST.Controls.Add(Me.TXT_INST_SAVED_POSTS_PATH, 0, 7) Me.DEFS_INST.Dock = System.Windows.Forms.DockStyle.Fill Me.DEFS_INST.Location = New System.Drawing.Point(0, 0) Me.DEFS_INST.Name = "DEFS_INST" - Me.DEFS_INST.RowCount = 8 + Me.DEFS_INST.RowCount = 9 Me.DEFS_INST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) Me.DEFS_INST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) Me.DEFS_INST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25.0!)) @@ -848,6 +889,7 @@ Me.DEFS_INST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) Me.DEFS_INST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) Me.DEFS_INST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) + Me.DEFS_INST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28.0!)) Me.DEFS_INST.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) Me.DEFS_INST.Size = New System.Drawing.Size(576, 372) Me.DEFS_INST.TabIndex = 1 @@ -862,6 +904,26 @@ Me.TXT_INST_SAVED_POSTS_USER.Size = New System.Drawing.Size(568, 22) Me.TXT_INST_SAVED_POSTS_USER.TabIndex = 9 ' + 'TXT_INST_SAVED_POSTS_PATH + ' + ActionButton9.BackgroundImage = CType(resources.GetObject("ActionButton9.BackgroundImage"), System.Drawing.Image) + ActionButton9.Index = 0 + ActionButton9.Name = "BTT_OPEN" + ActionButton10.BackgroundImage = CType(resources.GetObject("ActionButton10.BackgroundImage"), System.Drawing.Image) + ActionButton10.Index = 1 + ActionButton10.Name = "BTT_CLEAR" + Me.TXT_INST_SAVED_POSTS_PATH.Buttons.Add(ActionButton9) + Me.TXT_INST_SAVED_POSTS_PATH.Buttons.Add(ActionButton10) + Me.TXT_INST_SAVED_POSTS_PATH.CaptionText = "Saved posts path" + Me.TXT_INST_SAVED_POSTS_PATH.CaptionToolTipEnabled = True + Me.TXT_INST_SAVED_POSTS_PATH.CaptionToolTipText = "Special path (clear to use default)" + Me.TXT_INST_SAVED_POSTS_PATH.CaptionWidth = 120.0R + Me.TXT_INST_SAVED_POSTS_PATH.Dock = System.Windows.Forms.DockStyle.Fill + Me.TXT_INST_SAVED_POSTS_PATH.Location = New System.Drawing.Point(4, 198) + Me.TXT_INST_SAVED_POSTS_PATH.Name = "TXT_INST_SAVED_POSTS_PATH" + Me.TXT_INST_SAVED_POSTS_PATH.Size = New System.Drawing.Size(568, 22) + Me.TXT_INST_SAVED_POSTS_PATH.TabIndex = 13 + ' 'TAB_DEFS_REDGIFS ' Me.TAB_DEFS_REDGIFS.BackColor = System.Drawing.SystemColors.Control @@ -904,17 +966,6 @@ Me.CONTAINER_MAIN.TabIndex = 0 Me.CONTAINER_MAIN.TopToolStripPanelVisible = False ' - 'CH_REDDIT_USER_MEDIA - ' - Me.CH_REDDIT_USER_MEDIA.AutoSize = True - Me.CH_REDDIT_USER_MEDIA.Dock = System.Windows.Forms.DockStyle.Fill - Me.CH_REDDIT_USER_MEDIA.Location = New System.Drawing.Point(4, 82) - Me.CH_REDDIT_USER_MEDIA.Name = "CH_REDDIT_USER_MEDIA" - Me.CH_REDDIT_USER_MEDIA.Size = New System.Drawing.Size(562, 19) - Me.CH_REDDIT_USER_MEDIA.TabIndex = 3 - Me.CH_REDDIT_USER_MEDIA.Text = "Get user media only" - Me.CH_REDDIT_USER_MEDIA.UseVisualStyleBackColor = True - ' 'GlobalSettingsForm ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -961,6 +1012,7 @@ Me.DEFS_REDDIT.ResumeLayout(False) Me.DEFS_REDDIT.PerformLayout() CType(Me.TXT_REDDIT_SAVED_POSTS_USER, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_REDDIT_SAVED_POSTS_PATH, System.ComponentModel.ISupportInitialize).EndInit() TAB_DEFS_TWITTER.ResumeLayout(False) Me.DEFS_TWITTER.ResumeLayout(False) Me.DEFS_TWITTER.PerformLayout() @@ -971,6 +1023,7 @@ Me.TAB_DEFS_INSTAGRAM.ResumeLayout(False) Me.DEFS_INST.ResumeLayout(False) CType(Me.TXT_INST_SAVED_POSTS_USER, System.ComponentModel.ISupportInitialize).EndInit() + CType(Me.TXT_INST_SAVED_POSTS_PATH, System.ComponentModel.ISupportInitialize).EndInit() Me.TAB_DEFS_REDGIFS.ResumeLayout(False) Me.CONTAINER_MAIN.ContentPanel.ResumeLayout(False) Me.CONTAINER_MAIN.ResumeLayout(False) @@ -1021,5 +1074,7 @@ Private WithEvents TXT_INST_SAVED_POSTS_USER As PersonalUtilities.Forms.Controls.TextBoxExtended Private WithEvents CH_SHOW_NOTIFY As CheckBox Private WithEvents CH_REDDIT_USER_MEDIA As CheckBox + Private WithEvents TXT_REDDIT_SAVED_POSTS_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended + Private WithEvents TXT_INST_SAVED_POSTS_PATH As PersonalUtilities.Forms.Controls.TextBoxExtended End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/GlobalSettingsForm.resx b/SCrawler/Editors/GlobalSettingsForm.resx index 3777f31..11a5449 100644 --- a/SCrawler/Editors/GlobalSettingsForm.resx +++ b/SCrawler/Editors/GlobalSettingsForm.resx @@ -232,9 +232,47 @@ If checked, videos will be stored in separate folder; otherwise, videos will be False + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + False + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wwAADsMBx2+oZAAAAR5JREFUOE+VkjFqwzAUhn2D9iShRyi+QhYbGujg3ZATZPKYdC6FQhPwlAMkg3dP + WQwhyWIyJIUW5NqyPb7oCVtIlhVTwYf8nv7/t2zJagel9KmqKsIACYL9RjI8UHz5zshougZr/AEvbxEP + aZCDBY3VslixaJvX3wzkkDiOwbZtDRGA5vdNAg+TL27qgmt5XkBG/gTdAG7Gt+3PP9oOaEGFCVEC6rp+ + 5g9MfM/c5e4OsEZMZkQEtGL5H2DdZ5JRArDwPA+iKII0TfkC9vroC9j5vq8JTWw3WzWgLMtZGIaa0MR8 + vlAD8PYlSaIJTTiOowY0p0Bc19XEJo6HE59FAPuMzyAINKGJ1XLFZxHALtMrnkBXOIQIIIQ8YvF/KrgB + cMaRN0UdBBkAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAAIZJREFUOE+1j10KwCAMgz2b755xl/IsvnaL2K20UfbDAmEako+ZROSTafjE12Go + tbbB43rK5xSAQq1VYFtmeQBoqZTSreVZvgTknM8yyyjA/qodsDF9gspD2Bj6B+DH+NqzhQQAG+POMnSX + AFuc5QFgn6ClHh5iOQVAKNixyucB8NY0vG9JOzzyhrdq5IRgAAAAAElFTkSuQmCC + + AAABAA8AAAAQAAEABAAwOgAA9gAAADAwEAABAAQAaAYAACg7AAAgIBAAAQAEAOgCAACQQQAAGBgQAAEA diff --git a/SCrawler/Editors/GlobalSettingsForm.vb b/SCrawler/Editors/GlobalSettingsForm.vb index bceabf5..c4f25fd 100644 --- a/SCrawler/Editors/GlobalSettingsForm.vb +++ b/SCrawler/Editors/GlobalSettingsForm.vb @@ -93,6 +93,7 @@ Namespace Editors SetChecker(DEFS_REDDIT, Sites.Reddit) CH_REDDIT_USER_MEDIA.Checked = .GetUserMediaOnly TXT_REDDIT_SAVED_POSTS_USER.Text = .SavedPostsUserName + TXT_REDDIT_SAVED_POSTS_PATH.Text = .SavedPostsPath(False) End With 'Twitter With .Site(Sites.Twitter) @@ -106,6 +107,7 @@ Namespace Editors TXT_REQ_COUNT.Text = .RequestsWaitTimerTaskCount TXT_LIMIT_TIMER.Text = .SleepTimerOnPostsLimit TXT_INST_SAVED_POSTS_USER.Text = .SavedPostsUserName + TXT_INST_SAVED_POSTS_PATH.Text = .SavedPostsPath(False) End With 'RedGifs SetChecker(DEFS_REDGIFS, Sites.RedGifs) @@ -229,6 +231,7 @@ Namespace Editors SetPropByChecker(DEFS_REDDIT, Sites.Reddit) .GetUserMediaOnly.Value = CH_REDDIT_USER_MEDIA.Checked .SavedPostsUserName.Value = TXT_REDDIT_SAVED_POSTS_USER.Text + .SavedPostsPath = TXT_REDDIT_SAVED_POSTS_PATH.Text End With 'Twitter With .Site(Sites.Twitter) @@ -242,6 +245,7 @@ Namespace Editors .RequestsWaitTimerTaskCount.Value = AConvert(Of Integer)(TXT_REQ_COUNT.Text) .SleepTimerOnPostsLimit.Value = AConvert(Of Integer)(TXT_LIMIT_TIMER.Text) .SavedPostsUserName.Value = TXT_INST_SAVED_POSTS_USER.Text + .SavedPostsPath = TXT_INST_SAVED_POSTS_PATH.Text End With 'RedGifs SetPropByChecker(DEFS_REDGIFS, Sites.RedGifs) @@ -288,5 +292,17 @@ Namespace Editors CH_FILE_TIME.Enabled = b ChangePositionControlsEnabling() End Sub + Private Sub TXT_REDDIT_SAVED_POSTS_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_REDDIT_SAVED_POSTS_PATH.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then + Dim f As SFile = SFile.SelectPath + If Not f.IsEmptyString Then TXT_REDDIT_SAVED_POSTS_PATH.Text = f + End If + End Sub + Private Sub TXT_INST_SAVED_POSTS_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_INST_SAVED_POSTS_PATH.ActionOnButtonClick + If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then + Dim f As SFile = SFile.SelectPath + If Not f.IsEmptyString Then TXT_INST_SAVED_POSTS_PATH.Text = f + End If + End Sub End Class End Namespace \ No newline at end of file diff --git a/SCrawler/Editors/SiteEditorForm.vb b/SCrawler/Editors/SiteEditorForm.vb index 6dd2361..894bd1b 100644 --- a/SCrawler/Editors/SiteEditorForm.vb +++ b/SCrawler/Editors/SiteEditorForm.vb @@ -35,7 +35,7 @@ Namespace Editors Text = MySite.ToString With Settings(MySite) - TXT_PATH.Text = .Path + TXT_PATH.Text = .Path(False) With .Responser If .Cookies Is Nothing Then .Cookies = New CookieKeeper(.CookiesDomain) SetCookieText() @@ -128,7 +128,7 @@ Namespace Editors End Sub Private Sub TXT_PATH_ActionOnButtonClick(ByVal Sender As ActionButton) Handles TXT_PATH.ActionOnButtonClick If Sender.DefaultButton = ActionButton.DefaultButtons.Open Then - Dim f As SFile = SFile.SelectPath(Settings(MySite).Path) + Dim f As SFile = SFile.SelectPath(Settings(MySite).Path(False)) If Not f.IsEmptyString Then TXT_PATH.Text = f End If End Sub diff --git a/SCrawler/Editors/UserCreatorForm.vb b/SCrawler/Editors/UserCreatorForm.vb index 45a11b4..437294f 100644 --- a/SCrawler/Editors/UserCreatorForm.vb +++ b/SCrawler/Editors/UserCreatorForm.vb @@ -10,6 +10,7 @@ Imports System.ComponentModel Imports PersonalUtilities.Forms Imports PersonalUtilities.Forms.Controls.Base Imports PersonalUtilities.Forms.Toolbars +Imports PersonalUtilities.Functions.RegularExpressions Imports SCrawler.API.Base Namespace Editors Friend Class UserCreatorForm : Implements IOkCancelToolbar @@ -61,7 +62,7 @@ Namespace Editors Return TXT_USER_FRIENDLY.Text End Get End Property - Private ReadOnly _SpecPathPattern As New RegexStructure("\w:\\.*", True, False,,,,, String.Empty, EDP.ReturnValue) + Private ReadOnly _SpecPathPattern As RParams = RParams.DM("\w:\\.*", 0, EDP.ReturnValue) Private ReadOnly Property SpecialPath(ByVal s As Sites) As SFile Get If TXT_SPEC_FOLDER.IsEmptyString Then @@ -226,13 +227,13 @@ CloseForm: Private Sub ToolbarBttCancel() Implements IOkCancelToolbar.ToolbarBttCancel MyDef.CloseForm(IIf(StartIndex >= 0, DialogResult.OK, DialogResult.Cancel)) End Sub - Private ReadOnly TwitterRegEx As New RegexStructure("[htps:/]{7,8}.*?twitter.com/([^/]+)", 1) - Private ReadOnly RedditRegEx1 As New RegexStructure("[htps:/]{7,8}.*?reddit.com/user/([^/]+)", 1) - Private ReadOnly RedditRegEx2 As New RegexStructure(".?u/([^/]+)", 1) - Private ReadOnly RedditChannelRegEx1 As New RegexStructure("[htps:/]{7,8}.*?reddit.com/r/([^/]+)", 1) - Private ReadOnly RedditChannelRegEx2 As New RegexStructure(".?r/([^/]+)", 1) - Private ReadOnly InstagramRegEx As New RegexStructure("[htps:/]{7,8}.*?instagram.com/([^/]+)", 1) - Private ReadOnly RedGifsRegEx As New RegexStructure("[htps:/]{7,8}.*?redgifs.com/users/([^/]+)", 1) + Private ReadOnly TwitterRegEx As RParams = RParams.DMS("[htps:/]{7,8}.*?twitter.com/([^/]+)", 1) + Private ReadOnly RedditRegEx1 As RParams = RParams.DMS("[htps:/]{7,8}.*?reddit.com/user/([^/]+)", 1) + Private ReadOnly RedditRegEx2 As RParams = RParams.DMS(".?u/([^/]+)", 1) + Private ReadOnly RedditChannelRegEx1 As RParams = RParams.DMS("[htps:/]{7,8}.*?reddit.com/r/([^/]+)", 1) + Private ReadOnly RedditChannelRegEx2 As RParams = RParams.DMS(".?r/([^/]+)", 1) + Private ReadOnly InstagramRegEx As RParams = RParams.DMS("[htps:/]{7,8}.*?instagram.com/([^/]+)", 1) + Private ReadOnly RedGifsRegEx As RParams = RParams.DMS("[htps:/]{7,8}.*?redgifs.com/users/([^/]+)", 1) Private _TextChangeInvoked As Boolean = False Private Sub TXT_USER_ActionOnTextChange() Handles TXT_USER.ActionOnTextChange Try @@ -270,7 +271,7 @@ CloseForm: End If Return {Sites.Undefined, False} End Function - Private Function CheckRegex(ByRef TXT As String, ByVal r As RegexStructure) As Boolean + Private Function CheckRegex(ByRef TXT As String, ByVal r As RParams) As Boolean Dim s$ = RegexReplace(TXT, r) If Not s.IsEmptyString Then TXT = s : Return True Else Return False End Function diff --git a/SCrawler/MainFrame.vb b/SCrawler/MainFrame.vb index 9b9b49e..64641e6 100644 --- a/SCrawler/MainFrame.vb +++ b/SCrawler/MainFrame.vb @@ -1003,7 +1003,7 @@ CloseResume: Dim l%? = Nothing If UseLimits Then Do - l = AConvert(Of Integer)(InputBoxE("Enter top posts limit for downloading:", "Download limit", 10), Nothing) + l = AConvert(Of Integer)(InputBoxE("Enter top posts limit for downloading:", "Download limit", 10), AModes.Var, Nothing) If l.HasValue Then Select Case MsgBoxE(New MMessage($"You are set up downloading top [{l.Value}] posts", "Download limit", {"Confirm", "Try again", "Disable limit", "Cancel"}) With {.ButtonsPerRow = 2}).Index diff --git a/SCrawler/MainMod.vb b/SCrawler/MainMod.vb index a2e2a5a..66a6a93 100644 --- a/SCrawler/MainMod.vb +++ b/SCrawler/MainMod.vb @@ -7,6 +7,7 @@ ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY Imports PersonalUtilities.Functions.XML +Imports PersonalUtilities.Functions.RegularExpressions Imports PersonalUtilities.Tools.WEB Imports PersonalUtilities.Forms.Toolbars Imports SCrawler.API @@ -14,8 +15,8 @@ Imports SCrawler.API.Base Friend Module MainMod Friend Settings As SettingsCLS Friend Const SettingsFolderName As String = "Settings" - Friend ReadOnly LinkPattern As New RegexStructure("[htps:]{0,6}[/]{0,2}(.+)", 1) - Friend ReadOnly FilesPattern As New RegexStructure("[^\./]+?\.\w+", True, False, 1,,,, String.Empty, EDP.ReturnValue) + Friend ReadOnly LinkPattern As RParams = RParams.DMS("[htps:]{0,6}[/]{0,2}(.+)", 1) + Friend ReadOnly FilesPattern As RParams = RParams.DM("[^\./]+?\.\w+", 1, EDP.ReturnValue) Friend Const LVI_TempOption As String = "Temp" Friend Const LVI_FavOption As String = "Favorite" Friend Const CannelsLabelName As String = "Channels" diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb index 87473a7..268cb57 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: ' - - + +