From e6d5fc2b9534ee220d2052fc4e7e0a78297ea8bc Mon Sep 17 00:00:00 2001 From: Andy <88590076+AAndyProgram@users.noreply.github.com> Date: Sat, 17 Jan 2026 20:06:37 +0300 Subject: [PATCH] 2026.1.17.0 UserDataBase: move GLD functions from 'Twitter' Instagram: add 'Reposts' and 'Likes' to the 'Sections' enum OnlyFans: update the regex in 'DynamicRulesEnv'; handling error 502 PornHub: fix videos aren't downloading ThreadsNet: add user name and description extraction TikTok: fix downloading new videos; add downloading 'Stories' and 'Reposts' Twitter: move GLD functions to 'UserDataBase' Xhamster: fix a bug when adding new users; fix incorrect cache location Download groups: add excluded groups MainFrame: fix the 'Feed' tooltip --- Changelog.md | 27 +- ProgramScreenshots/GroupCreating.png | Bin 25979 -> 26257 bytes ProgramScreenshots/SettingsAutoDownloader.png | Bin 36595 -> 39424 bytes SCrawler/API/Base/UserDataBase.vb | 11 + SCrawler/API/Instagram/UserData.vb | 2 +- SCrawler/API/OnlyFans/DynamicRulesEnv.vb | 6 +- SCrawler/API/OnlyFans/UserData.vb | 5 + SCrawler/API/PornHub/UserData.vb | 2 +- SCrawler/API/ThreadsNet/Declarations.vb | 17 + SCrawler/API/ThreadsNet/UserData.vb | 4 +- SCrawler/API/TikTok/Declarations.vb | 1 + SCrawler/API/TikTok/SiteSettings.vb | 38 ++- SCrawler/API/TikTok/UserData.vb | 311 ++++++++++++++---- SCrawler/API/TikTok/UserExchangeOptions.vb | 13 + SCrawler/API/Twitter/UserData.vb | 20 +- SCrawler/API/Xhamster/SiteSettings.vb | 9 +- SCrawler/API/Xhamster/UserData.vb | 11 +- SCrawler/API/Xhamster/UserExchangeOptions.vb | 6 +- .../Download/Automation/AutoDownloader.vb | 2 - SCrawler/Download/Groups/DownloadGroup.vb | 24 +- SCrawler/Download/Groups/GroupDefaults.vb | 52 +-- SCrawler/Download/Groups/GroupParameters.vb | 8 + SCrawler/MainFrame.Designer.vb | 2 +- SCrawler/MainFrame.resx | 41 +-- SCrawler/My Project/AssemblyInfo.vb | 4 +- SCrawler/SCrawler.vbproj | 1 + 26 files changed, 458 insertions(+), 159 deletions(-) create mode 100644 SCrawler/API/ThreadsNet/Declarations.vb diff --git a/Changelog.md b/Changelog.md index 0e8875a..7992fe4 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,11 +2,32 @@ - [ffmpeg](https://github.com/AAndyProgram/SCrawler/wiki/Settings#ffmpeg) - x64 version - [release](https://github.com/GyanD/codexffmpeg/releases/tag/5.1.2); [zip](https://github.com/GyanD/codexffmpeg/releases/download/5.1.2/ffmpeg-5.1.2-full_build.zip); **version `5.1.2-full_build-www.gyan.dev`** - x86 version - [release](https://github.com/yt-dlp/FFmpeg-Builds/releases/tag/autobuild-2022-11-30-12-57); [zip](https://github.com/yt-dlp/FFmpeg-Builds/releases/download/autobuild-2022-11-30-12-57/ffmpeg-N-109274-gd7a5f068c2-win32-gpl.zip); **version `N-109457-geeb280f351-20221226`** -- [Gallery-dl](https://github.com/AAndyProgram/SCrawler/wiki/Settings#gallery-dl) - **1.30.10** -- [YT-DLP](https://github.com/AAndyProgram/SCrawler/wiki/Settings#yt-dlp) - **2025.11.12** +- [Gallery-dl](https://github.com/AAndyProgram/SCrawler/wiki/Settings#gallery-dl) - **1.31.3** +- [YT-DLP](https://github.com/AAndyProgram/SCrawler/wiki/Settings#yt-dlp) - **2025.12.08** - [Deno](https://github.com/AAndyProgram/SCrawler/wiki/Settings#deno) - latest *(`2.0.0` or higher)* - [OF-Scraper](https://github.com/AAndyProgram/SCrawler/wiki/Settings#of-scraper) - **3.12.9** ([release](https://github.com/datawhores/OF-Scraper/releases/tag/3.12.9)) +# 2026 + +## 2026.1.17.0 + +*2026-01-17* + +- Add + - Sites: + - OnlyFans: handling error `502` + - Threads: user name and description extraction + - TikTok: **downloading `Stories` and `Reposts`** + - Download groups: excluded groups +- Updated + - yt-dlp up to version **2025.12.08** + - gallery-dl up to version **1.31.3** +- Fixed + - Sites: + - PornHub: videos aren't downloading + - TikTok: new videos aren't downloading + - xHamster: new users aren't added in some cases + # 2025 ## 2025.11.25.0 @@ -1765,7 +1786,7 @@ At the requests of some users, I added [screenshots](ProgramScreenshots) of the - Wrong some Reddit videos parsing - Wrong some Reddit images parsing -# 1.0.0.0 +## 1.0.0.0 *2021-12-07* diff --git a/ProgramScreenshots/GroupCreating.png b/ProgramScreenshots/GroupCreating.png index 6363f7679b1ea923f4dcac2967a6b40c23a00740..571ed7a934c650a4df155a6e391afe89390e3900 100644 GIT binary patch literal 26257 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 literal 25979 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 diff --git a/SCrawler/API/Base/UserDataBase.vb b/SCrawler/API/Base/UserDataBase.vb index 62a37f3..95b2614 100644 --- a/SCrawler/API/Base/UserDataBase.vb +++ b/SCrawler/API/Base/UserDataBase.vb @@ -1439,6 +1439,16 @@ BlockNullPicture: Cache.Validate() Return Cache End Function +#Region "GDL File Names" + Protected GDLFileNameProvider As ANumbers = Nothing + Protected Sub GDLResetFileNameProvider(Optional ByVal GroupSize As Integer? = Nothing) + GDLFileNameProvider = New ANumbers With {.FormatOptions = ANumbers.Options.FormatNumberGroup + ANumbers.Options.Groups} + GDLFileNameProvider.GroupSize = If(GroupSize, 3) + End Sub + Protected Function GDLRenameFile(ByVal Input As SFile, ByVal i As Integer) As SFile + Return SFile.Rename(Input, $"{Input.PathWithSeparator}{i.NumToString(GDLFileNameProvider)}.{Input.Extension}",, EDP.ThrowException) + End Function +#End Region #Region "DownloadSingleObject" Protected IsSingleObjectDownload As Boolean = False Friend Overridable Sub DownloadSingleObject(ByVal Data As YouTube.Objects.IYouTubeMediaContainer, ByVal Token As CancellationToken) Implements IUserData.DownloadSingleObject @@ -2453,6 +2463,7 @@ stxt: _TempPostsList.Clear() _MD5List.Clear() TokenPersonal = Nothing + GDLFileNameProvider = Nothing If Not ProgressPre Is Nothing Then ProgressPre.Reset() : ProgressPre.Dispose() If Not Responser Is Nothing Then Responser.Dispose() If Not BTT_CONTEXT_DOWN Is Nothing Then BTT_CONTEXT_DOWN.Dispose() diff --git a/SCrawler/API/Instagram/UserData.vb b/SCrawler/API/Instagram/UserData.vb index b092861..397359f 100644 --- a/SCrawler/API/Instagram/UserData.vb +++ b/SCrawler/API/Instagram/UserData.vb @@ -525,7 +525,7 @@ Namespace API.Instagram Protected Overrides Sub Responser_ResponseReceived(ByVal Sender As Object, ByVal e As EventArguments.WebDataResponse) Declarations.UpdateResponser(e, Responser, WwwClaimUpdate) End Sub - Friend Enum Sections : Timeline : Reels : Tagged : Stories : UserStories : SavedPosts : End Enum + Friend Enum Sections : Timeline : Reels : Tagged : Stories : UserStories : SavedPosts : Reposts : Likes : End Enum Protected Const StoriesFolder As String = "Stories" Private Const TaggedFolder As String = "Tagged" #Region "429 bypass" diff --git a/SCrawler/API/OnlyFans/DynamicRulesEnv.vb b/SCrawler/API/OnlyFans/DynamicRulesEnv.vb index 67056e1..ab2db17 100644 --- a/SCrawler/API/OnlyFans/DynamicRulesEnv.vb +++ b/SCrawler/API/OnlyFans/DynamicRulesEnv.vb @@ -219,12 +219,12 @@ Namespace API.OnlyFans DynamicRulesXml.Extension = "xml" ReplacePattern_RepoToRaw = New RParams("(.*github.com/([^/]+)/([^/]+)/blob/(.+))", Nothing, 0, RegexReturn.ReplaceChangeListMatch, EDP.ReturnValue) With { - .PatternReplacement = "https://raw.githubusercontent.com/{2}/{3}/{4}"} + .PatternReplacement = "https://raw.githubusercontent.com/{2}/{3}/refs/heads/{4}"} ReplacePattern_JsonInfo = ReplacePattern_RepoToRaw.Copy ReplacePattern_JsonInfo.PatternReplacement = "https://github.com/{2}/{3}/latest-commit/{4}" ReplacePattern_RawToRepo = ReplacePattern_RepoToRaw.Copy - ReplacePattern_RawToRepo.Pattern = "(.*raw.githubusercontent.com/([^/]+)/([^/]+)/([^/]+)/(.+))" - ReplacePattern_RawToRepo.PatternReplacement = "https://github.com/{2}/{3}/blob/{4}/{5}" + ReplacePattern_RawToRepo.Pattern = "(.*raw.githubusercontent.com/([^/]+)/([^/]+)(/refs/heads)?/([^/]+)/(.+))" + ReplacePattern_RawToRepo.PatternReplacement = "https://github.com/{2}/{3}/blob/{5}/{6}" ConfigRulesExtract = RParams.DMS("DYNAMIC_RULE"":(\{.+?\}[\r\n]+)", 1, RegexOptions.Singleline, EDP.ReturnValue) OFLOG = New TextSaver($"LOGs\OF_{Now:yyyyMMdd_HHmmss}.txt") With {.LogMode = True, .AutoSave = True, .AutoClear = True} AddHandler OFLOG.TextSaved, AddressOf OFLOG_TextSaved diff --git a/SCrawler/API/OnlyFans/UserData.vb b/SCrawler/API/OnlyFans/UserData.vb index 33e72c7..d036ed2 100644 --- a/SCrawler/API/OnlyFans/UserData.vb +++ b/SCrawler/API/OnlyFans/UserData.vb @@ -88,6 +88,7 @@ Namespace API.OnlyFans Private _DownloadedPostsSession As Integer = 0 Private FunctionErr As Integer = FunctionErrDef Private Const FunctionErrDef As Integer = -100 + Private _TimelineDownloading As Boolean = False Private Sub ValidateOFScraper() _OFScraperExists = ACheck(MySettings.OFScraperPath.Value) AndAlso CStr(MySettings.OFScraperPath.Value).CSFile.Exists End Sub @@ -110,7 +111,9 @@ Namespace API.OnlyFans If ID.IsEmptyString Then Throw New ArgumentNullException("ID", "Unable to get user ID") End If + _TimelineDownloading = True If MediaDownloadTimeline Then DownloadTimeline(IIf(IsSavedPosts, 0, String.Empty), Token) + _TimelineDownloading = False If Not IsSavedPosts Then If MediaDownloadStories And FunctionErr = FunctionErrDef Then DownloadStories(Token) If MediaDownloadHighlights And FunctionErr = FunctionErrDef Then DownloadHighlights(Token) @@ -827,6 +830,8 @@ Namespace API.OnlyFans Return 3 ElseIf Responser.StatusCode = Net.HttpStatusCode.InternalServerError Then '500 Return 3 + ElseIf Not _TimelineDownloading And Responser.StatusCode = Net.HttpStatusCode.BadGateway Then '502 + Return 3 Else Return 0 End If diff --git a/SCrawler/API/PornHub/UserData.vb b/SCrawler/API/PornHub/UserData.vb index 1848a38..d7f4439 100644 --- a/SCrawler/API/PornHub/UserData.vb +++ b/SCrawler/API/PornHub/UserData.vb @@ -385,7 +385,7 @@ Namespace API.PornHub If PersonType = PersonTypeCannel Then l = l.ListTake(4, l.Count) Else - l.RemoveAll(Function(uv) uv.UserRef.IsEmptyString OrElse Not uv.UserRef = usrRef) + l.RemoveAll(Function(uv) Not uv.UserRef.IsEmptyString AndAlso Not uv.UserRef = usrRef) End If ElseIf Type = VideoTypes.Favorite Then l.RemoveAll(Function(uv) uv.Type = VideoTypes.Private) diff --git a/SCrawler/API/ThreadsNet/Declarations.vb b/SCrawler/API/ThreadsNet/Declarations.vb new file mode 100644 index 0000000..6824614 --- /dev/null +++ b/SCrawler/API/ThreadsNet/Declarations.vb @@ -0,0 +1,17 @@ +' Copyright (C) Andy https://github.com/AAndyProgram +' This program is free software: you can redistribute it and/or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. +' +' This program is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY +Imports SCrawler.API.Base +Imports PersonalUtilities.Functions.RegularExpressions +Namespace API.ThreadsNet + Friend Module Declarations + Friend ReadOnly RegexUserID As RParams = RParams.DMS("""props"":\{[^\{\}]*?""user_id"":""(\d+)""", 1, EDP.ReturnValue) + Friend ReadOnly RegexUserName As RParams = RParams.DMS("\]+)""\s*/\>", 1, TitleHtmlConverter, EDP.ReturnValue) + Friend ReadOnly RegexUserDescr As RParams = RParams.DMS("\]+)""\s*/\>", 1, HtmlConverter, EDP.ReturnValue) + End Module +End Namespace \ No newline at end of file diff --git a/SCrawler/API/ThreadsNet/UserData.vb b/SCrawler/API/ThreadsNet/UserData.vb index e1f125a..e605c5b 100644 --- a/SCrawler/API/ThreadsNet/UserData.vb +++ b/SCrawler/API/ThreadsNet/UserData.vb @@ -388,8 +388,10 @@ Namespace API.ThreadsNet Dim newID$ Dim idStr$ = String.Empty If Not r.IsEmptyString Then + UserSiteNameUpdate(RegexReplace(r, RegexUserName)) + UserDescriptionUpdate(RegexReplace(r, RegexUserDescr)) ParseTokens(r, 0) - newID = RegexReplace(r, RParams.DMS("""props"":\{[^\{\}]*?""user_id"":""(\d+)""", 1, EDP.ReturnValue)) + newID = RegexReplace(r, RegexUserID) If ID.IsEmptyString OrElse ID = newID Then _IdChanged = ID.IsEmptyString ID = newID diff --git a/SCrawler/API/TikTok/Declarations.vb b/SCrawler/API/TikTok/Declarations.vb index e8860e6..e6f392f 100644 --- a/SCrawler/API/TikTok/Declarations.vb +++ b/SCrawler/API/TikTok/Declarations.vb @@ -11,6 +11,7 @@ Imports PersonalUtilities.Functions.RegularExpressions Namespace API.TikTok Friend Module Declarations Friend ReadOnly SimpleDateConverter As New ADateTime("yyyyMMdd") + Friend ReadOnly SimpleDateConverterWithTime As New ADateTime("yyyyMMdd_HHmmss") Friend ReadOnly RegexTagsReplacer As RParams = RParams.DM("#\w+\s?", -1, RegexReturn.Replace, CType(Function(input$) String.Empty, Func(Of String, String)), EDP.ReturnValue) Friend ReadOnly RegexPhotoJson As RParams = RParams.DMS("UNIVERSAL_DATA_FOR_REHYDRATION__"" type=""application/json""\>([^\<]+)\<", 1, diff --git a/SCrawler/API/TikTok/SiteSettings.vb b/SCrawler/API/TikTok/SiteSettings.vb index 29fef64..d30f3b4 100644 --- a/SCrawler/API/TikTok/SiteSettings.vb +++ b/SCrawler/API/TikTok/SiteSettings.vb @@ -10,11 +10,13 @@ Imports SCrawler.API.Base Imports SCrawler.Plugin Imports SCrawler.Plugin.Attributes Imports PersonalUtilities.Functions.RegularExpressions +Imports DN = SCrawler.API.Base.DeclaredNames Namespace API.TikTok Friend Class SiteSettings : Inherits SiteSettingsBase #Region "Categories" Private Const CAT_DOWN As String = "Download" + Private Const CAT_UserDefs_Title As String = DN.CAT_UserDefs & " (Title)" #End Region #Region "Download" @@ -22,21 +24,34 @@ Namespace API.TikTok Friend ReadOnly Property DownloadTTPhotos As PropertyValue #End Region - +#Region "User defaults" +#Region "Sections" + + Friend ReadOnly Property GetTimeline As PropertyValue + + Friend ReadOnly Property GetStoriesUser As PropertyValue + + Friend ReadOnly Property GetReposts As PropertyValue +#End Region +#Region "Title" + Friend ReadOnly Property RemoveTagsFromTitle As PropertyValue - + Friend ReadOnly Property TitleUseNative As PropertyValue + ControlToolTip:="Use a user-created video title for the filename instead of the video ID.", Category:=CAT_UserDefs_Title), PXML, PClonable> Friend ReadOnly Property TitleUseNativeSTD As PropertyValue - + Friend ReadOnly Property TitleAddVideoID As PropertyValue - + Friend ReadOnly Property TitleAddVideoIDSTD As PropertyValue - + Friend ReadOnly Property TitleUseRegexForTitle As PropertyValue - + Friend ReadOnly Property TitleUseRegexForTitle_Value As PropertyValue +#End Region +#End Region Friend ReadOnly Property UseParsedVideoDate As PropertyValue @@ -46,6 +61,10 @@ Namespace API.TikTok Friend Sub New(ByVal AccName As String, ByVal Temp As Boolean) MyBase.New("TikTok", "www.tiktok.com", AccName, Temp, My.Resources.SiteResources.TikTokIcon_32, My.Resources.SiteResources.TikTokPic_192) + GetTimeline = New PropertyValue(True) + GetStoriesUser = New PropertyValue(False) + GetReposts = New PropertyValue(False) + DownloadTTVideos = New PropertyValue(True) DownloadTTPhotos = New PropertyValue(True) @@ -76,5 +95,10 @@ Namespace API.TikTok Using f As New InternalSettingsForm(Options, Me, False) : f.ShowDialog() : End Using End If End Sub + Friend Overrides Function GetUserPostUrl(ByVal User As UserDataBase, ByVal Media As UserMedia) As String + Dim url$ = MyBase.GetUserPostUrl(User, Media) + If Not url.IsEmptyString AndAlso url.EndsWith(UserData.GDL_POSTFIX) Then url = url.Replace(UserData.GDL_POSTFIX, String.Empty) + Return url + End Function End Class End Namespace \ No newline at end of file diff --git a/SCrawler/API/TikTok/UserData.vb b/SCrawler/API/TikTok/UserData.vb index 65bd2db..e1d6b25 100644 --- a/SCrawler/API/TikTok/UserData.vb +++ b/SCrawler/API/TikTok/UserData.vb @@ -7,16 +7,21 @@ ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY Imports System.Threading -Imports SCrawler.API.Base -Imports SCrawler.API.YouTube.Objects -Imports PersonalUtilities.Functions.XML Imports PersonalUtilities.Functions.RegularExpressions +Imports PersonalUtilities.Functions.XML Imports PersonalUtilities.Tools Imports PersonalUtilities.Tools.Web.Documents.JSON +Imports SCrawler.API.Base +Imports SCrawler.API.YouTube.Objects +Imports SCrawler.Plugin.Attributes +Imports Sections = SCrawler.API.Instagram.UserData.Sections Imports UTypes = SCrawler.API.Base.UserMedia.Types Namespace API.TikTok Friend Class UserData : Inherits UserDataBase #Region "XML names" + Private Const Name_GetTimeline As String = "GetTimeline" + Private Const Name_GetStoriesUser As String = "GetStoriesUser" + Private Const Name_GetReposts As String = "GetReposts" Private Const Name_RemoveTagsFromTitle As String = "RemoveTagsFromTitle" Private Const Name_TitleUseNative As String = "TitleUseNative" Private Const Name_TitleAddVideoID As String = "TitleAddVideoID" @@ -27,6 +32,7 @@ Namespace API.TikTok Private Const Name_PhotosDownloaded As String = "PhotosDownloaded" #End Region #Region "Declarations" + Friend Const GDL_POSTFIX As String = "--GDL" Private ReadOnly Property MySettings As SiteSettings Get Return HOST.Source @@ -57,6 +63,9 @@ Namespace API.TikTok End If End Get End Property + Friend Property GetTimeline As Boolean = True + Friend Property GetStoriesUser As Boolean = False + Friend Property GetReposts As Boolean = False Friend Property RemoveTagsFromTitle As Boolean = False Friend Property TitleUseNative As Boolean = True Friend Property TitleAddVideoID As Boolean = True @@ -74,6 +83,9 @@ Namespace API.TikTok If Not Obj Is Nothing AndAlso TypeOf Obj Is UserExchangeOptions Then With DirectCast(Obj, UserExchangeOptions) .ApplyBase(Me) + GetTimeline = .GetTimeline + GetStoriesUser = .GetStoriesUser + GetReposts = .GetReposts RemoveTagsFromTitle = .RemoveTagsFromTitle TitleUseNative = .TitleUseNative TitleAddVideoID = .TitleAddVideoID @@ -88,6 +100,9 @@ Namespace API.TikTok Protected Overrides Sub LoadUserInformation_OptionalFields(ByRef Container As XmlFile, ByVal Loading As Boolean) With Container If Loading Then + GetTimeline = .Value(Name_GetTimeline).FromXML(Of Boolean)(True) + GetStoriesUser = .Value(Name_GetStoriesUser).FromXML(Of Boolean)(False) + GetReposts = .Value(Name_GetReposts).FromXML(Of Boolean)(False) RemoveTagsFromTitle = .Value(Name_RemoveTagsFromTitle).FromXML(Of Boolean)(False) TitleUseNative = .Value(Name_TitleUseNative).FromXML(Of Boolean)(True) TitleAddVideoID = .Value(Name_TitleAddVideoID).FromXML(Of Boolean)(True) @@ -98,6 +113,9 @@ Namespace API.TikTok TitleUseGlobalRegexOptions = .Value(Name_TitleUseGlobalRegexOptions).FromXML(Of Boolean)(True) PhotosDownloaded = .Value(Name_PhotosDownloaded).FromXML(Of Boolean)(False) Else + .Add(Name_GetTimeline, GetTimeline.BoolToInteger) + .Add(Name_GetStoriesUser, GetStoriesUser.BoolToInteger) + .Add(Name_GetReposts, GetReposts.BoolToInteger) .Add(Name_RemoveTagsFromTitle, RemoveTagsFromTitle.BoolToInteger) .Add(Name_TitleUseNative, TitleUseNative.BoolToInteger) .Add(Name_TitleAddVideoID, TitleAddVideoID.BoolToInteger) @@ -166,17 +184,25 @@ Namespace API.TikTok Private Function GetPhotoNode() As Object() Return {"imageURL", "urlList", 0, 0} End Function + Private Sub ValidateCache() + If If(UserCache?.Disposed, True) Then UserCache = CreateCache() + End Sub Friend Overrides Sub DownloadData(ByVal Token As CancellationToken) MyBase.DownloadData(Token) UserCache.DisposeIfReady(False) UserCache = Nothing End Sub - Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken) + Protected Overloads Overrides Sub DownloadDataF(ByVal Token As CancellationToken) + ValidateCache() + If GetTimeline Then DownloadDataF(Sections.Timeline, Token) + If GetStoriesUser Then DownloadDataF(Sections.UserStories, Token) + If GetReposts Then DownloadDataF(Sections.Reposts, Token) + End Sub + Protected Overloads Sub DownloadDataF(ByVal Section As Sections, ByVal Token As CancellationToken) Dim URL$ = $"https://www.tiktok.com/@{NameTrue}" - UserCache = CreateCache() Try Const photoPrefix$ = "photo_" - Dim postID$, title$, postUrl$, newName$, t$, postID2$, imgUrl$, pText$ + Dim postID$, title$, postUrl$, newName$, t$, tOrig$, postID2$, imgUrl$, pText$ Dim postDate As Date? Dim dateAfterC As Date? = Nothing Dim dateBefore As Date? = DownloadDateTo @@ -185,12 +211,24 @@ Namespace API.TikTok Dim titleRegex As RParams = GetTitleRegex() Dim vPath As SFile = Nothing, pPath As SFile = Nothing Dim file As SFile - Dim j As EContainer, photo As EContainer + Dim j As EContainer = Nothing, photo As EContainer, item As EContainer Dim photoNode As Object() = GetPhotoNode() Dim c%, cc%, i% Dim errDef As New ErrorsDescriber(EDP.ReturnValue) Dim infoParsed As Boolean = False + Dim gdlTmpIDs As New Dictionary(Of String, Integer) + Dim gdlCmd$ = String.Empty + Dim gdlIsNativeJson As Boolean + + Dim __specFolder$ = String.Empty + Dim __specFolder_Cr As Func(Of String, String) = Function(_sp$) String.Empty.StringAppend(__specFolder).StringAppend(_sp, "\") & + IIf(__specFolder.IsEmptyString, String.Empty, "*") + Select Case Section + Case Sections.UserStories : URL &= "/stories" : __specFolder = "Stories (user)" : gdlCmd = "-o videos -o photos" + Case Sections.Reposts : URL &= "/reposts" : __specFolder = "Reposts" + End Select + If _ContentList.Count > 0 Then With (From d In _ContentList Where d.Post.Date.HasValue Select d.Post.Date.Value) If .ListExists Then dateAfterC = .Min @@ -215,7 +253,7 @@ Namespace API.TikTok End If End If - If DownloadVideos And Settings.YtdlpFile.Exists And CBool(MySettings.DownloadTTVideos.Value) Then + If Section = Sections.Timeline And DownloadVideos And Settings.YtdlpFile.Exists And CBool(MySettings.DownloadTTVideos.Value) Then With UserCache.NewInstance : .Validate() : vPath = .RootDirectory : End With Using b As New YTDLP.YTDLPBatch(Token,, vPath) With {.TempPostsList = _TempPostsList} b.Execute(CreateYTCommand(vPath, URL, False, dateBefore, dateAfter)) @@ -233,7 +271,7 @@ Namespace API.TikTok Else .TempPostsList = New List(Of String) End If - .Execute(CreateGDLCommand(URL)) + .Execute(CreateGDLCommand(URL, gdlCmd)) If Not PhotosDownloaded Then _ForceSaveUserInfo = True : _ForceSaveUserInfoOnException = True PhotosDownloaded = True End With @@ -243,6 +281,7 @@ Namespace API.TikTok ThrowAny(Token) Dim files As List(Of SFile) + 'YTDLP If Not vPath.IsEmptyString AndAlso vPath.Exists(SFO.Path, False) Then files = SFile.GetFiles(vPath, "*.json",, errDef) If files.ListExists Then @@ -250,7 +289,7 @@ Namespace API.TikTok j = JsonDocument.Parse(file.GetText, errDef) If j.ListExists Then If j.Value("_type").StringToLower = "video" Then - If Not baseDataObtained Then + If Not baseDataObtained And Section = Sections.Timeline Then baseDataObtained = True If ID.IsEmptyString Then ID = j.Value("uploader_id") newName = j.Value("uploader") @@ -262,7 +301,8 @@ Namespace API.TikTok If Not _TempPostsList.Contains(postID) Then _TempPostsList.ListAddValue(postID, LNC) Else - Exit For 'Exit Sub + 'Exit For 'Exit Sub + Continue For End If title = GetNewFileName(j.Value("title").StringRemoveWinForbiddenSymbols, TitleUseNative, RemoveTagsFromTitle, TitleAddVideoID, postID, titleRegex) @@ -279,6 +319,7 @@ Namespace API.TikTok If postUrl.IsEmptyString Then postUrl = $"https://www.tiktok.com/@{Name}/video/{postID}" _TempMediaList.Add(New UserMedia(postUrl, UTypes.Video) With { .File = $"{title}.mp4", + .SpecialFolder = __specFolder_Cr(String.Empty), .Post = New UserPost(postID, postDate), .PostText = pText, .PostTextFileSpecialFolder = DownloadTextSpecialFolder, @@ -291,76 +332,183 @@ Namespace API.TikTok End If End If + j.DisposeIfReady + + 'GDL If Not pPath.IsEmptyString AndAlso pPath.Exists(SFO.Path, False) Then files = SFile.GetFiles(pPath, "*.txt",, errDef) If files.ListExists Then + + If Not Section = Sections.Timeline Then + GDLResetFileNameProvider(Math.Max(files.Count.ToString.Length, 2)) + For i = 0 To files.Count - 1 : files(i) = GDLRenameFile(files(i), i) : Next + End If + For Each file In files t = file.GetText(errDef) - If Not t.IsEmptyString Then t = RegexReplace(t, RegexPhotoJson) + tOrig = t + gdlIsNativeJson = False + If Not t.IsEmptyString And Not Section = Sections.UserStories Then + t = RegexReplace(t, RegexPhotoJson) + If t.IsEmptyString Then t = tOrig : gdlIsNativeJson = True + End If If Not t.IsEmptyString Then j = JsonDocument.Parse(t, errDef) If j.ListExists Then - With j.ItemF({0, "webapp.video-detail", "itemInfo", "itemStruct"}) - If .ListExists Then - postID = .Value("id") - postID2 = $"{photoPrefix}{postID}" - If Not _TempPostsList.Contains(postID2) Then _TempPostsList.ListAddValue(postID2, LNC) Else Exit For 'Exit Sub - postDate = AConvert(Of Date)(.Value("createTime"), UnixDate32Provider, Nothing) - Select Case CheckDatesLimit(postDate, SimpleDateConverter) - Case DateResult.Skip : Continue For - Case DateResult.Exit : Exit For 'Exit Sub - End Select + If Section = Sections.UserStories Then + With j("itemList") + If .ListExists Then + For Each item In .Self + With item + postID = .Value("id") + postDate = AConvert(Of Date)(.Value("createTime"), UnixDate32Provider, Nothing) + If Not _TempPostsList.Contains(postID) Then + _TempPostsList.Add(postID) + postUrl = $"https://www.tiktok.com/@{Name}/video/{postID}{GDL_POSTFIX}" + If postDate.HasValue Then + title = CStr(AConvert(Of String)(postDate.Value, SimpleDateConverterWithTime, String.Empty)).StringAppend(postID, " ") + Else + title = postID + End If + _TempMediaList.Add(New UserMedia(postUrl, UTypes.Video) With { + .URL_BASE = postUrl, + .SpecialFolder = __specFolder_Cr(String.Empty), + .File = $"{title}.mp4", + .Post = New UserPost(postID, postDate) + }) + With .Item("video") + If .ListExists AndAlso Not .Value("cover").IsEmptyString Then _ + _TempMediaList.Add(New UserMedia(.Value("cover"), UTypes.Picture) With { + .URL_BASE = postUrl, + .SpecialFolder = __specFolder_Cr("Photo"), + .File = $"{title}.jpg" + }) + End With + Else + Continue For + End If + End With + Next + End If + End With + ElseIf Section = Sections.Reposts And gdlIsNativeJson Then + With j("itemList") + If .ListExists Then + For Each item In .Self + With item + postID = .Value("id") + postID2 = $"{photoPrefix}{postID}" + If Not _TempPostsList.Contains(postID) And Not _TempPostsList.Contains(postID2) Then + title = GetNewFileName(.Value("title").StringRemoveWinForbiddenSymbols, + TitleUseNative, RemoveTagsFromTitle, TitleAddVideoID, postID, titleRegex) + pText = .Value("title") + If Not .Value("desc").IsEmptyString Then + pText &= vbCr & vbCr & .Value("desc") + If title.IsEmptyString Then title = GetNewFileName(.Value("desc").StringRemoveWinForbiddenSymbols, + TitleUseNative, RemoveTagsFromTitle, TitleAddVideoID, postID, titleRegex) + End If + postDate = AConvert(Of Date)(j.Value("createTime"), UnixDate32Provider, Nothing) + If postDate.HasValue Then + Select Case CheckDatesLimit(postDate, SimpleDateConverter) + Case DateResult.Skip : Continue For + Case DateResult.Exit : Exit For 'Exit Sub + End Select + End If - If Not infoParsed Then - With .Item("author") - If .ListExists Then - infoParsed = True - SimpleDownloadAvatar(.Value("avatarLarger").IfNullOrEmpty(.Value("avatarMedium")).IfNullOrEmpty(.Value("avatarThumb")), - Function(ByVal ____url As String) As SFile - Dim ____f As SFile = CreateFileFromUrl(____url) - If Not ____f.Name.IsEmptyString Then ____f.Name = ____f.Name.Replace(":", "_").Replace("~", "-") - If Not ____f.Extension.IsEmptyString Then - If Not (____f.Extension = "jpg" Or ____f.Extension = "jpeg") Then - ____f.Extension = RegexReplace(____f.Extension, RParams.DMS("(.+)\?", 1, EDP.ReturnValue)) - If Not ____f.Extension.IsEmptyString AndAlso Not (____f.Extension = "jpg" Or ____f.Extension = "jpeg") Then ____f.Extension = String.Empty + postUrl = .Value({"author"}, "uniqueId") + If Not postUrl.IsEmptyString Then + postUrl = $"https://www.tiktok.com/@{postUrl}/video/{postID}" + _TempMediaList.Add(New UserMedia(postUrl, UTypes.Video) With { + .File = $"{title}.mp4", + .SpecialFolder = __specFolder_Cr(String.Empty), + .Post = New UserPost(postID, postDate), + .PostText = pText, + .PostTextFileSpecialFolder = DownloadTextSpecialFolder, + .PostTextFile = $"{ .File.Name}.txt" + }) + If Not gdlTmpIDs.ContainsKey(postID) Then gdlTmpIDs.Add(postID, _TempMediaList.Count - 1) + End If + Else + Continue For + End If + End With + Next + End If + End With + Else + With j.ItemF({0, "webapp.video-detail", "itemInfo", "itemStruct"}) + If .ListExists Then + postID = .Value("id") + postID2 = $"{photoPrefix}{postID}" + 'If Not _TempPostsList.Contains(postID2) Then _TempPostsList.ListAddValue(postID2, LNC) Else Exit For 'Exit Sub + postDate = AConvert(Of Date)(.Value("createTime"), UnixDate32Provider, Nothing) + If Not Section = Sections.UserStories Then + Select Case CheckDatesLimit(postDate, SimpleDateConverter) + Case DateResult.Skip : Continue For + Case DateResult.Exit : Exit For 'Exit Sub + End Select + End If + + If Not infoParsed Then + With .Item("author") + If .ListExists Then + infoParsed = True + SimpleDownloadAvatar(.Value("avatarLarger").IfNullOrEmpty(.Value("avatarMedium")).IfNullOrEmpty(.Value("avatarThumb")), + Function(ByVal ____url As String) As SFile + Dim ____f As SFile = CreateFileFromUrl(____url) + If Not ____f.Name.IsEmptyString Then ____f.Name = ____f.Name.Replace(":", "_").Replace("~", "-") + If Not ____f.Extension.IsEmptyString Then + If Not (____f.Extension = "jpg" Or ____f.Extension = "jpeg") Then + ____f.Extension = RegexReplace(____f.Extension, RParams.DMS("(.+)\?", 1, EDP.ReturnValue)) + If Not ____f.Extension.IsEmptyString AndAlso Not (____f.Extension = "jpg" Or ____f.Extension = "jpeg") Then ____f.Extension = String.Empty + End If End If - End If - Return ____f - End Function) - UserSiteNameUpdate(.Value("nickname")) - UserDescriptionUpdate(.Value("signature")) + Return ____f + End Function) + UserSiteNameUpdate(.Value("nickname")) + UserDescriptionUpdate(.Value("signature")) + End If + End With + End If + + title = GetNewFileName(.Value({"imagePost"}, "title").StringRemoveWinForbiddenSymbols, + TitleUseNative, RemoveTagsFromTitle, TitleAddVideoID, postID, titleRegex) + pText = .Value({"imagePost"}, "title") + If Not .Value("desc").IsEmptyString Then pText &= vbCr & vbCr & .Value("desc") + postUrl = $"https://www.tiktok.com/@{Name}/photo/{postID}" + With .Item({"imagePost", "images"}) + If .ListExists Then + If Not _TempPostsList.Contains(postID2) Then + _TempPostsList.ListAddValue(postID2, LNC) + If gdlTmpIDs.ContainsKey(postID) Then + _TempMediaList.RemoveAt(gdlTmpIDs(postID)) + gdlTmpIDs.Remove(postID) + End If + Else + Continue For 'Exit Sub + End If + i = 0 + c = .Count + cc = Math.Max(c.ToString.Length, 3) + For Each photo In .Self + i += 1 + imgUrl = photo.ItemF(photoNode).XmlIfNothingValue + If Not imgUrl.IsEmptyString Then _ + _TempMediaList.Add(New UserMedia(imgUrl, UTypes.Picture) With { + .URL_BASE = postUrl, + .SpecialFolder = __specFolder_Cr("Photo"), + .File = $"{title}{IIf(c > 1, $"_{i.NumToString(ANumbers.Formats.NumberGroup, cc)}", String.Empty)}.jpg", + .Post = New UserPost(postID, postDate), + .PostText = pText, + .PostTextFileSpecialFolder = DownloadTextSpecialFolder, + .PostTextFile = $"{ .File.Name}.txt" + }) + Next End If End With End If - - title = GetNewFileName(.Value({"imagePost"}, "title").StringRemoveWinForbiddenSymbols, - TitleUseNative, RemoveTagsFromTitle, TitleAddVideoID, postID, titleRegex) - pText = .Value({"imagePost"}, "title") - If Not .Value("desc").IsEmptyString Then pText &= vbCr & vbCr & .Value("desc") - postUrl = $"https://www.tiktok.com/@{Name}/photo/{postID}" - With .Item({"imagePost", "images"}) - If .ListExists Then - i = 0 - c = .Count - cc = Math.Max(c.ToString.Length, 3) - For Each photo In .Self - i += 1 - imgUrl = photo.ItemF(photoNode).XmlIfNothingValue - If Not imgUrl.IsEmptyString Then _ - _TempMediaList.Add(New UserMedia(imgUrl, UTypes.Picture) With { - .URL_BASE = postUrl, - .SpecialFolder = "Photo", - .File = $"{title}{IIf(c > 1, $"_{i.NumToString(ANumbers.Formats.NumberGroup, cc)}", String.Empty)}.jpg", - .Post = New UserPost(postID, postDate), - .PostText = pText, - .PostTextFileSpecialFolder = DownloadTextSpecialFolder, - .PostTextFile = $"{ .File.Name}.txt" - }) - Next - End If - End With - End If - End With + End With + End If j.Dispose() End If End If @@ -368,6 +516,9 @@ Namespace API.TikTok End If End If + j.DisposeIfReady + _TempPostsList.ListAddList(gdlTmpIDs.Keys) + gdlTmpIDs.Clear() If _TempMediaList.Count > 0 Then LastDownloadDate = Now Catch ex As Exception ProcessException(ex, Token, $"data downloading error [{URL}]") @@ -452,8 +603,17 @@ Namespace API.TikTok End Function #End Region #Region "GDL Support" - Private Function CreateGDLCommand(ByVal URL As String) As String - Return $"""{Settings.GalleryDLFile}"" --verbose --no-download --no-skip --write-pages {URL}" + Private Function CreateGDLCommand(ByVal URL As String, Optional ByVal SectionCommand As String = Nothing, + Optional ByVal IsDownload As Boolean = False, Optional ByVal Output As SFile = Nothing) As String + Dim command$ = $"""{Settings.GalleryDLFile}"" " + If Not IsDownload Then + command &= "--verbose --no-download --no-skip --write-pages " + Else + command &= $"--dest ""{Output.PathNoSeparator}"" " + End If + If Not CBool(If(IsSingleObjectDownload, MySettings.UseParsedVideoDateSTD, MySettings.UseParsedVideoDate).Value) Then command &= "--no-mtime " + command &= $"{SectionCommand} {URL}" + Return command End Function #End Region #Region "DownloadContent, DownloadFile" @@ -465,7 +625,16 @@ Namespace API.TikTok End Function Protected Overrides Function DownloadFile(ByVal URL As String, ByVal Media As UserMedia, ByVal DestinationFile As SFile, ByVal Token As CancellationToken) As SFile Using b As New TokenBatch(Token) With {.FileExchanger = RootCacheTikTok} - b.Execute(CreateYTCommand(DestinationFile, URL, True)) + If URL.EndsWith(GDL_POSTFIX) Then + ValidateCache() + Dim tmpPath As SFile + With UserCache.NewInstance : .Validate() : tmpPath = .RootDirectory : End With + b.Execute(CreateGDLCommand(URL.Replace(GDL_POSTFIX, String.Empty),, True, tmpPath)) + tmpPath = SFile.GetFiles(tmpPath, "*.mp4", IO.SearchOption.AllDirectories, EDP.ReturnValue).FirstOrDefault + If Not tmpPath.IsEmptyString Then SFile.Move(tmpPath, DestinationFile) + Else + b.Execute(CreateYTCommand(DestinationFile, URL, True)) + End If End Using If DestinationFile.Exists Then Return DestinationFile Else Return Nothing End Function diff --git a/SCrawler/API/TikTok/UserExchangeOptions.vb b/SCrawler/API/TikTok/UserExchangeOptions.vb index 5ec2154..f1ccfbc 100644 --- a/SCrawler/API/TikTok/UserExchangeOptions.vb +++ b/SCrawler/API/TikTok/UserExchangeOptions.vb @@ -6,9 +6,16 @@ ' ' This program is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY +Imports SCrawler.Plugin Imports SCrawler.Plugin.Attributes Namespace API.TikTok Friend Class UserExchangeOptions : Inherits Base.EditorExchangeOptionsBase + + Friend Property GetTimeline As Boolean + + Friend Property GetStoriesUser As Boolean + + Friend Property GetReposts As Boolean Friend Property RemoveTagsFromTitle As Boolean @@ -27,6 +34,9 @@ Namespace API.TikTok MyBase.New(u) _ApplyBase_Name = False MySettings = u.HOST.Source + GetTimeline = u.GetTimeline + GetStoriesUser = u.GetStoriesUser + GetReposts = u.GetReposts RemoveTagsFromTitle = u.RemoveTagsFromTitle TitleUseNative = u.TitleUseNative TitleAddVideoID = u.TitleAddVideoID @@ -38,6 +48,9 @@ Namespace API.TikTok MyBase.New(s) _ApplyBase_Name = False MySettings = s + GetTimeline = s.GetTimeline.Value + GetStoriesUser = s.GetStoriesUser.Value + GetReposts = s.GetReposts.Value RemoveTagsFromTitle = s.RemoveTagsFromTitle.Value TitleUseNative = s.TitleUseNative.Value TitleAddVideoID = s.TitleAddVideoID.Value diff --git a/SCrawler/API/Twitter/UserData.vb b/SCrawler/API/Twitter/UserData.vb index aa4387a..6a7f946 100644 --- a/SCrawler/API/Twitter/UserData.vb +++ b/SCrawler/API/Twitter/UserData.vb @@ -112,14 +112,6 @@ Namespace API.Twitter Return HOST.Source End Get End Property - Private FileNameProvider As ANumbers = Nothing - Private Sub ResetFileNameProvider(Optional ByVal GroupSize As Integer? = Nothing) - FileNameProvider = New ANumbers With {.FormatOptions = ANumbers.Options.FormatNumberGroup + ANumbers.Options.Groups} - FileNameProvider.GroupSize = If(GroupSize, 3) - End Sub - Private Function RenameGdlFile(ByVal Input As SFile, ByVal i As Integer) As SFile - Return SFile.Rename(Input, $"{Input.PathWithSeparator}{i.NumToString(FileNameProvider)}.{Input.Extension}",, EDP.ThrowException) - End Function Friend Function GetUserUrl() As String Return $"https://x.com{IIf(IsCommunity, SiteSettings.CommunitiesUser, String.Empty)}/{NameTrue}" End Function @@ -479,10 +471,10 @@ Namespace API.Twitter ThrowAny(Token) Dim timelineFiles As List(Of SFile) = SFile.GetFiles(dir, "*.txt",, EDP.ReturnValue) If timelineFiles.ListExists Then - ResetFileNameProvider(Math.Max(timelineFiles.Count.ToString.Length, 2)) + GDLResetFileNameProvider(Math.Max(timelineFiles.Count.ToString.Length, 2)) 'rename files If Not DEBUG_PROFILE Then - For i = 0 To timelineFiles.Count - 1 : timelineFiles(i) = RenameGdlFile(timelineFiles(i), i) : Next + For i = 0 To timelineFiles.Count - 1 : timelineFiles(i) = GDLRenameFile(timelineFiles(i), i) : Next End If 'parse files For i = 0 To timelineFiles.Count - 1 @@ -681,14 +673,14 @@ nextpIndx: Dim f As SFile = GetDataFromGalleryDL("https://x.com/i/bookmarks", Settings.Cache, True, Token) Dim files As List(Of SFile) = SFile.GetFiles(f, "*.txt") If files.ListExists Then - ResetFileNameProvider(Math.Max(files.Count.ToString.Length, 3)) + GDLResetFileNameProvider(Math.Max(files.Count.ToString.Length, 3)) Dim id$ Dim nodes As List(Of String()) = GetContainerSubnodes() Dim node$() Dim j As EContainer, jj As EContainer Dim jErr As New ErrorsDescriber(EDP.ReturnValue) For i% = 0 To files.Count - 1 - f = RenameGdlFile(files(i), i) + f = GDLRenameFile(files(i), i) j = JsonDocument.Parse(f.GetText, jErr) If Not j Is Nothing Then With j.ItemF({"data", 0, "timeline", "instructions", 0, "entries"}) @@ -1140,7 +1132,7 @@ nextpIndx: Dim files As List(Of SFile) Dim lim% Dim specFolder$ = IIf(_ReparseLikes, "Likes", String.Empty) - ResetFileNameProvider() + GDLResetFileNameProvider() cache = If(IsSingleObjectDownload, Settings.Cache, CreateCache()) If _ReparseLikes Then lim = LikesPosts.Count Else lim = _ContentList.Count ProgressPre.ChangeMax(lim) @@ -1166,7 +1158,7 @@ nextpIndx: files = SFile.GetFiles(f, "*.txt") If files.ListExists Then For ii = 0 To files.Count - 1 - f = RenameGdlFile(files(ii), ii) + f = GDLRenameFile(files(ii), ii) j = JsonDocument.Parse(f.GetText) If Not j Is Nothing Then With j.ItemF({"data", 0, "instructions", 0, "entries"}) diff --git a/SCrawler/API/Xhamster/SiteSettings.vb b/SCrawler/API/Xhamster/SiteSettings.vb index 0eac1f2..a58b9a2 100644 --- a/SCrawler/API/Xhamster/SiteSettings.vb +++ b/SCrawler/API/Xhamster/SiteSettings.vb @@ -14,6 +14,9 @@ Imports PersonalUtilities.Functions.RegularExpressions Namespace API.Xhamster Friend Class SiteSettings : Inherits SiteSettingsBase +#Region "Consts" + Friend Const GetMomentsCaption As String = "Get moments (short videos)" +#End Region #Region "Declarations" Private Const CAT_YTDLP As String = "yt-dlp support" Private ReadOnly Property SiteDomains As PropertyValue @@ -45,6 +48,8 @@ Namespace API.Xhamster End Property Friend ReadOnly Property UseYTDLPForceDisableInternal As PropertyValue + + Friend ReadOnly Property GetMoments As PropertyValue Friend Overrides Property DownloadText As PropertyValue Friend Overrides Property DownloadTextPosts As PropertyValue Friend Overrides Property DownloadTextSpecialFolder As PropertyValue @@ -61,10 +66,11 @@ Namespace API.Xhamster UseYTDLPJSON = New PropertyValue(True) UseYTDLPDownload = New PropertyValue(True) UseYTDLPForceDisableInternal = New PropertyValue(False) + GetMoments = New PropertyValue(True) _SubscriptionsAllowed = True UrlPatternUser = "https://xhamster.com/{0}/{1}" - UserRegex = RParams.DMS($"/({UserOption}|{ChannelOption}|{P_Creators})/([^/]+)(\Z|.*)", 0, RegexReturn.ListByMatch) + UserRegex = RParams.DMS($"/({UserOption}|{UserOption2}|{ChannelOption}|{P_Creators})/([^/]+)(\Z|.*)", 0, RegexReturn.ListByMatch) ImageVideoContains = "xhamster" UserOptionsType = GetType(UserExchangeOptions) UseNetscapeCookies = True @@ -113,6 +119,7 @@ Namespace API.Xhamster #Region "IsMyUser, IsMyImageVideo" Friend Const ChannelOption As String = "channels" Friend Const UserOption As String = "users/profiles" + Private Const UserOption2 As String = "users" Friend Const P_Search As String = "search" Friend Const P_Tags As String = "tags" Friend Const P_Categories As String = "categories" diff --git a/SCrawler/API/Xhamster/UserData.vb b/SCrawler/API/Xhamster/UserData.vb index 9ebc33b..995dc08 100644 --- a/SCrawler/API/Xhamster/UserData.vb +++ b/SCrawler/API/Xhamster/UserData.vb @@ -740,10 +740,17 @@ Namespace API.Xhamster #Region "yt-dlp support" Private Function YTDLPGetInfo(ByVal URL As String, ByVal n As Integer) As SFile Try - If MyCache Is Nothing Then MyCache = CreateCache() : MyCache.Validate() - Dim path As SFile = MyCache.NewPath + Dim cc As CacheKeeper + If IsSingleObjectDownload Then + cc = Settings.Cache + Else + If MyCache Is Nothing Then MyCache = CreateCache() : MyCache.Validate() + cc = MyCache + End If + Dim path As SFile = cc.NewPath Dim c$ = If(MySettings.CookiesNetscapeFile.Exists, $" --no-cookies-from-browser --cookies ""{MySettings.CookiesNetscapeFile}""", String.Empty) Dim cmd$ = $"{Settings.YtdlpFile} --write-info-json --skip-download{c} {URL} -o ""{path.PathWithSeparator}file""" + path.Exists() Using ytdlp As New YTDLP.YTDLPBatch(TokenPersonal,, path) : ytdlp.Encoding = Settings.CMDEncoding : ytdlp.Execute(cmd) : End Using Return SFile.GetFiles(path, "*.json",, EDP.ReturnValue).FirstOrDefault Catch ex As Exception diff --git a/SCrawler/API/Xhamster/UserExchangeOptions.vb b/SCrawler/API/Xhamster/UserExchangeOptions.vb index 0c7f3a1..fbfd5f7 100644 --- a/SCrawler/API/Xhamster/UserExchangeOptions.vb +++ b/SCrawler/API/Xhamster/UserExchangeOptions.vb @@ -10,7 +10,7 @@ Imports SCrawler.API.Base Imports SCrawler.Plugin.Attributes Namespace API.Xhamster Friend NotInheritable Class UserExchangeOptions : Inherits API.Base.EditorExchangeOptionsBase_P - + Friend Property GetMoments As Boolean = False Friend Sub New() MyBase.New @@ -19,6 +19,10 @@ Namespace API.Xhamster MyBase.New(DirectCast(u, UserData)) GetMoments = DirectCast(u, UserData).GetMoments End Sub + Friend Sub New(ByVal s As SiteSettings) + MyBase.New(s) + GetMoments = s.GetMoments.Value + End Sub Friend Overrides Sub Apply(ByRef u As IPSite) MyBase.Apply(u) DirectCast(u, UserData).GetMoments = GetMoments diff --git a/SCrawler/Download/Automation/AutoDownloader.vb b/SCrawler/Download/Automation/AutoDownloader.vb index 865096b..455b390 100644 --- a/SCrawler/Download/Automation/AutoDownloader.vb +++ b/SCrawler/Download/Automation/AutoDownloader.vb @@ -410,7 +410,6 @@ Namespace DownloadObjects With newObj .Name = String.Empty .Enabled = Enabled - .Groups.ListAddList(Groups, LAP.ClearBeforeAdd) .IsManual = IsManual .Timer = Timer .StartupDelay = StartupDelay @@ -690,7 +689,6 @@ Namespace DownloadObjects If Not disposedValue And disposing Then [Stop]() UserKeys.ListClearDispose() - Groups.Clear() End If MyBase.Dispose(disposing) End Sub diff --git a/SCrawler/Download/Groups/DownloadGroup.vb b/SCrawler/Download/Groups/DownloadGroup.vb index 50a0bf8..364bc38 100644 --- a/SCrawler/Download/Groups/DownloadGroup.vb +++ b/SCrawler/Download/Groups/DownloadGroup.vb @@ -365,17 +365,29 @@ Namespace DownloadObjects.Groups (.Sites.Count = 0 OrElse .Sites.Contains(user.Site)) AndAlso (.SitesExcluded.Count = 0 OrElse Not .SitesExcluded.Contains(user.Site)) Dim users As New List(Of IUserData) + Dim l As New ListAddParams(LAP.IgnoreICopier) If Not .GroupsOnly Or (.GroupsOnly And .Groups.Count = 0) Then users.ListAddList(Settings.GetUsers(Function(user) CheckLabels.Invoke(user) AndAlso CheckSites.Invoke(user) AndAlso CheckParams.Invoke(user) AndAlso CheckSubscription.Invoke(user) AndAlso - CheckDays.Invoke(user) AndAlso CheckDateRange.Invoke(user)), LAP.IgnoreICopier) + CheckDays.Invoke(user) AndAlso CheckDateRange.Invoke(user)), l) End If - If .Groups.Count > 0 And Settings.Groups.Count > 0 Then + If Settings.Groups.Count > 0 Then Dim i% - For Each groupName$ In .Groups - i = Settings.Groups.IndexOf(groupName) - If i >= 0 Then users.ListAddList(Settings.Groups(i).GetUsers, LAP.NotContainsOnly, LAP.IgnoreICopier) - Next + Dim groupName$ + l.NotContainsOnly = True + If .Groups.Count > 0 Then + For Each groupName In .Groups + i = Settings.Groups.IndexOf(groupName) + If i >= 0 Then users.ListAddList(Settings.Groups(i).GetUsers, l) + Next + End If + l.DisableDispose = True + If .GroupsExcluded.Count > 0 Then + For Each groupName In .GroupsExcluded + i = Settings.Groups.IndexOf(groupName) + If i >= 0 Then users.ListDisposeRemove(Settings.Groups(i).GetUsers, l) + Next + End If End If If .UsersCount <> 0 And users.ListExists Then diff --git a/SCrawler/Download/Groups/GroupDefaults.vb b/SCrawler/Download/Groups/GroupDefaults.vb index 03ed13b..eb896aa 100644 --- a/SCrawler/Download/Groups/GroupDefaults.vb +++ b/SCrawler/Download/Groups/GroupDefaults.vb @@ -58,6 +58,7 @@ Namespace DownloadObjects.Groups Private ReadOnly Sites As List(Of String) Private ReadOnly SitesExcluded As List(Of String) Private ReadOnly Groups As List(Of String) + Private ReadOnly GroupsExcluded As List(Of String) Private ReadOnly TT_MAIN As ToolTip Friend ReadOnly Property GroupsOnly As Boolean Get @@ -72,6 +73,7 @@ Namespace DownloadObjects.Groups Sites = New List(Of String) SitesExcluded = New List(Of String) Groups = New List(Of String) + GroupsExcluded = New List(Of String) TT_MAIN = New ToolTip InitTextBox(TXT_LABELS, "Labels", {New ActionButton(ADB.Edit) With {.ToolTipText = "Edit selected labels"}, @@ -82,7 +84,8 @@ Namespace DownloadObjects.Groups New ActionButton(ADB.Delete) With {.ToolTipText = "Edit excluded sites"}, ADB.Clear}) TXT_SITES.TextBoxReadOnly = True - InitTextBox(TXT_GROUPS, "Groups", {New ActionButton(ADB.Edit) With {.ToolTipText = "Edit selected groups"}, ADB.Clear}, CaptionModes.CheckBox) + InitTextBox(TXT_GROUPS, "Groups", {New ActionButton(ADB.Edit) With {.ToolTipText = "Edit selected groups"}, + New ActionButton(ADB.Delete) With {.ToolTipText = "Edit excluded groups"}, ADB.Clear}, CaptionModes.CheckBox) With TXT_GROUPS .TextBoxReadOnly = True .CaptionCheckAlign = ContentAlignment.MiddleLeft @@ -301,6 +304,7 @@ Namespace DownloadObjects.Groups Sites.Clear() SitesExcluded.Clear() Groups.Clear() + GroupsExcluded.Clear() CH_REGULAR.Dispose() CH_TEMPORARY.Dispose() CH_FAV.Dispose() @@ -363,7 +367,7 @@ Namespace DownloadObjects.Groups End If End Using End With - Case ADB.Clear : Labels.Clear() : LabelsExcluded.Clear() : TXT_LABELS.Clear() : UpdateLabelsText() + Case ADB.Clear : Labels.Clear() : LabelsExcluded.Clear() : UpdateLabelsText() End Select End Sub Private Sub TXT_SITES_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As ActionButtonEventArgs) Handles TXT_SITES.ActionOnButtonClick @@ -379,36 +383,38 @@ Namespace DownloadObjects.Groups End If End Using End With - Case ADB.Clear : Sites.Clear() : SitesExcluded.Clear() : TXT_SITES.Clear() : UpdateSitesText() + Case ADB.Clear : Sites.Clear() : SitesExcluded.Clear() : UpdateSitesText() End Select End Sub Private Sub TXT_GROUPS_ActionOnButtonClick(ByVal Sender As ActionButton, ByVal e As ActionButtonEventArgs) Handles TXT_GROUPS.ActionOnButtonClick Select Case Sender.DefaultButton - Case ADB.Edit - Using f As New LabelsForm(Groups, (From g As DownloadGroup In Settings.Groups Where Not g.IsViewFilter Select g.Name)) With { - .Text = "Groups (F3 to edit)", - .Icon = My.Resources.GroupByIcon_16, - .IsGroups = True - } - f.ShowDialog() - If f.DialogResult = DialogResult.OK Then Groups.ListAddList(f.LabelsList, LAP.ClearBeforeAdd) : UpdateGroupsText() - End Using - Case ADB.Clear : Groups.Clear() : TXT_GROUPS.Clear() : UpdateGroupsText() + Case ADB.Edit, ADB.Delete + With If(Sender.DefaultButton = ADB.Edit, Groups, GroupsExcluded) + Using f As New LabelsForm(.Self, (From g As DownloadGroup In Settings.Groups Where Not g.IsViewFilter Select g.Name)) With { + .Text = $"Groups {IIf(Sender.DefaultButton = ADB.Delete, "excluded ", String.Empty)}(F3 to edit)", + .Icon = My.Resources.GroupByIcon_16, + .IsGroups = True + } + f.ShowDialog() + If f.DialogResult = DialogResult.OK Then .ListAddList(f.LabelsList, LAP.ClearBeforeAdd) : UpdateGroupsText() + End Using + End With + Case ADB.Clear : Groups.Clear() : GroupsExcluded.Clear() : UpdateGroupsText() End Select End Sub Private Sub UpdateLabelsText() - TXT_LABELS.Clear() - If Not _JustExcludeOptions Then TXT_LABELS.Text = Labels.ListToString - If LabelsExcluded.Count > 0 Then TXT_LABELS.Text.StringAppend($"EXCLUDED: {LabelsExcluded.ListToString}", "; ") + __UpdateTextImpl(TXT_LABELS, Labels, LabelsExcluded) End Sub Private Sub UpdateSitesText() - TXT_SITES.Clear() - If Not _JustExcludeOptions Then TXT_SITES.Text = Sites.ListToString - If SitesExcluded.Count > 0 Then TXT_SITES.Text.StringAppend($"EXCLUDED: {SitesExcluded.ListToString}", "; ") + __UpdateTextImpl(TXT_SITES, Sites, SitesExcluded) End Sub Private Sub UpdateGroupsText() - TXT_GROUPS.Clear() - TXT_GROUPS.Text = Groups.ListToString + __UpdateTextImpl(TXT_GROUPS, Groups, GroupsExcluded) + End Sub + Private Sub __UpdateTextImpl(ByRef txt As TextBoxExtended, ByVal filter As List(Of String), ByVal excluded As List(Of String)) + txt.Clear() + txt.Text = filter.ListToString + If excluded.Count > 0 Then txt.Text.StringAppend($"EXCLUDED: {excluded.ListToString}", "; ") End Sub #End Region #Region "Get/set" @@ -455,6 +461,7 @@ Namespace DownloadObjects.Groups .SitesExcluded.ListAddList(SitesExcluded) .Groups.Clear() .Groups.ListAddList(Groups) + .GroupsExcluded.ListAddList(GroupsExcluded) .GroupsOnly = GroupsOnly End With End If @@ -505,6 +512,7 @@ Namespace DownloadObjects.Groups UpdateSitesText() Groups.ListAddList(.Groups) + GroupsExcluded.ListAddList(.GroupsExcluded) TXT_GROUPS.Checked = .GroupsOnly UpdateGroupsText() End With @@ -513,14 +521,12 @@ Namespace DownloadObjects.Groups #End Region #Region "Enabled" Private _Enabled As Boolean = True - Private _JustExcludeOptions As Boolean = False Friend Overloads Property Enabled() As Boolean Get Return _Enabled End Get Set(ByVal e As Boolean) _Enabled = e - _JustExcludeOptions = False TP_1.Enabled = e TP_2.Enabled = e TP_3.Enabled = e diff --git a/SCrawler/Download/Groups/GroupParameters.vb b/SCrawler/Download/Groups/GroupParameters.vb index 72fc735..1270a55 100644 --- a/SCrawler/Download/Groups/GroupParameters.vb +++ b/SCrawler/Download/Groups/GroupParameters.vb @@ -17,6 +17,7 @@ Namespace DownloadObjects.Groups ReadOnly Property Sites As List(Of String) ReadOnly Property SitesExcluded As List(Of String) ReadOnly Property Groups As List(Of String) + ReadOnly Property GroupsExcluded As List(Of String) Property GroupsOnly As Boolean Property Regular As Boolean Property Temporary As Boolean @@ -59,6 +60,7 @@ Namespace DownloadObjects.Groups Protected Const Name_Sites As String = "Sites" Protected Const Name_Sites_Excluded As String = "SitesExcluded" Protected Const Name_Groups As String = "Groups" + Protected Const Name_GroupsExcluded As String = "GroupsExcluded" Protected Const Name_GroupsOnly As String = "GroupsOnly" Protected Const Name_DaysNumber As String = "DaysNumber" Protected Const Name_DaysIsDownloaded As String = "DaysIsDownloaded" @@ -79,6 +81,7 @@ Namespace DownloadObjects.Groups Friend ReadOnly Property Sites As List(Of String) Implements IGroup.Sites Friend ReadOnly Property SitesExcluded As List(Of String) Implements IGroup.SitesExcluded Friend ReadOnly Property Groups As List(Of String) Implements IGroup.Groups + Friend ReadOnly Property GroupsExcluded As List(Of String) Implements IGroup.GroupsExcluded Friend Property GroupsOnly As Boolean = False Implements IGroup.GroupsOnly Friend Property Regular As Boolean = True Implements IGroup.Regular Friend Property Temporary As Boolean = True Implements IGroup.Temporary @@ -105,6 +108,7 @@ Namespace DownloadObjects.Groups Sites = New List(Of String) SitesExcluded = New List(Of String) Groups = New List(Of String) + GroupsExcluded = New List(Of String) End Sub #End Region #Region "Base functions" @@ -129,6 +133,7 @@ Namespace DownloadObjects.Groups Sites.ListAddList(.Sites, LAP.ClearBeforeAdd) SitesExcluded.ListAddList(.SitesExcluded, LAP.ClearBeforeAdd) Groups.ListAddList(.Groups, LAP.ClearBeforeAdd) + GroupsExcluded.ListAddList(.GroupsExcluded, LAP.ClearBeforeAdd) GroupsOnly = .GroupsOnly Regular = .Regular Temporary = .Temporary @@ -163,6 +168,7 @@ Namespace DownloadObjects.Groups If Not e.Value(Name_Sites).IsEmptyString Then Sites.ListAddList(e.Value(Name_Sites).Split("|"), l) If Not e.Value(Name_Sites_Excluded).IsEmptyString Then SitesExcluded.ListAddList(e.Value(Name_Sites_Excluded).Split("|"), l) If Not e.Value(Name_Groups).IsEmptyString Then Groups.ListAddList(e.Value(Name_Groups).Split("|"), l) + If Not e.Value(Name_GroupsExcluded).IsEmptyString Then GroupsExcluded.ListAddList(e.Value(Name_GroupsExcluded).Split("|"), l) GroupsOnly = e.Value(Name_GroupsOnly).FromXML(Of Boolean)(False) Regular = e.Value(Name_Regular).FromXML(Of Boolean)(True) @@ -202,6 +208,7 @@ Namespace DownloadObjects.Groups New EContainer(Name_Sites, Sites.ListToString("|")), New EContainer(Name_Sites_Excluded, SitesExcluded.ListToString("|")), New EContainer(Name_Groups, Groups.ListToString("|")), + New EContainer(Name_GroupsExcluded, GroupsExcluded.ListToString("|")), New EContainer(Name_GroupsOnly, GroupsOnly.BoolToInteger), New EContainer(Name_Regular, Regular.BoolToInteger), New EContainer(Name_Temporary, Temporary.BoolToInteger), @@ -233,6 +240,7 @@ Namespace DownloadObjects.Groups Sites.Clear() SitesExcluded.Clear() Groups.Clear() + GroupsExcluded.Clear() End If disposedValue = True End If diff --git a/SCrawler/MainFrame.Designer.vb b/SCrawler/MainFrame.Designer.vb index 9da8d5e..19142a9 100644 --- a/SCrawler/MainFrame.Designer.vb +++ b/SCrawler/MainFrame.Designer.vb @@ -368,7 +368,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 (Ctrl+F)" + Me.BTT_FEED.ToolTipText = "Feed of recently downloaded data (Alt+F)" ' 'BTT_CHANNELS ' diff --git a/SCrawler/MainFrame.resx b/SCrawler/MainFrame.resx index fec7b8b..a698771 100644 --- a/SCrawler/MainFrame.resx +++ b/SCrawler/MainFrame.resx @@ -184,36 +184,37 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABkSURBVDhPY6AKyO86WFDQfeg/iIYKkQZAmkNbnvyXta76 - DxViYGFi+Y8PQ5VBAMhmkGYgJs8FAw9GA5EKILFiWUFixfL/IBoqRBoAafYsOvpf0jiTvEAE2QzSLGmU - MeQCkYEBAD3tUdo+/cEPAAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABkSURBVDhPY2CgBsjvOlhQ0H3oP4hGlyMKgDSHtjz5L2td + 9R8mxsLE8h8fRjEAZDNIs6x1FXkuGHgwGohUAIkVywoSK5b/B9HockQBkGbPoqP/JY0zyQtEkM0gzZJG + GeS5YEABAD3tUdqXHMg6AAAAAElFTkSuQmCC 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 - TgDQASA1MVpwzwAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIFSURBVDhPpZLtS1NhGMbPPxJmmlYSgqHiKzGU1EDxg4iK + YKyG2WBogqMYJQOtCEVRFBGdTBCJfRnkS4VaaWNT5sqx1BUxRXxDHYxAJLvkusEeBaPAB+5z4Jzn+t3X + /aLhnEfjo8m+dCoa+7/C3O2Hqe0zDC+8KG+cRZHZhdzaaWTVTCLDMIY0vfM04Nfh77/G/sEhwpEDbO3t + I7TxE8urEVy99fT/AL5gWDLrTB/hnF4XsW0khCu5ln8DmJliT2AXrcNBsU1gj/MH4nMeKwBrPktM28xM + cX79DFKrHHD5d9D26hvicx4pABt2lpg10zYzU0zr7+e3xXGcrkEB2O2TNec9nJFwB3alZn5jZorfeDZh + 6Q3g8s06BeCoKF4MRURoH1+BY2oNCbeb0TIclIYxOhzf8frTOuo7FxCbbVIAzpni0iceEc8vhzEwGkJD + lx83ymxifejdKjRNk/8PWnyIyTQqAJek0jqHwfEVscu31baIu8+90sTE4nY025dQ2/5FIPpnXlzKuK8A + HBUzHot52djqQ6HZhfR7IwK4mKpHtvEDMqvfCiQ6zaAAXM8x94aIWTNrLLG4kVUzgaTSPlzLtyJOZxbb + 1wtfyg4Q+AfA3aZlButjSfxGcUJBk4g5tuP3haQKRKXcUQDOmbvNTpPOJeFFjordZmbWTNvMTHFUcpUC + nOccAdABIDXXE1nzAAAAAElFTkSuQmCC diff --git a/SCrawler/My Project/AssemblyInfo.vb b/SCrawler/My Project/AssemblyInfo.vb index d816d67..3d9ac49 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/SCrawler.vbproj b/SCrawler/SCrawler.vbproj index 715bc07..93a1b54 100644 --- a/SCrawler/SCrawler.vbproj +++ b/SCrawler/SCrawler.vbproj @@ -255,6 +255,7 @@ +