Skip to content

Commit e6d5fc2

Browse files
committed
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
1 parent 6d4380c commit e6d5fc2

26 files changed

+458
-159
lines changed

Changelog.md

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,32 @@
22
- [ffmpeg](https://github.com/AAndyProgram/SCrawler/wiki/Settings#ffmpeg)
33
- 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`**
44
- 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`**
5-
- [Gallery-dl](https://github.com/AAndyProgram/SCrawler/wiki/Settings#gallery-dl) - **1.30.10**
6-
- [YT-DLP](https://github.com/AAndyProgram/SCrawler/wiki/Settings#yt-dlp) - **2025.11.12**
5+
- [Gallery-dl](https://github.com/AAndyProgram/SCrawler/wiki/Settings#gallery-dl) - **1.31.3**
6+
- [YT-DLP](https://github.com/AAndyProgram/SCrawler/wiki/Settings#yt-dlp) - **2025.12.08**
77
- [Deno](https://github.com/AAndyProgram/SCrawler/wiki/Settings#deno) - latest *(`2.0.0` or higher)*
88
- [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))
99

10+
# 2026
11+
12+
## 2026.1.17.0
13+
14+
*2026-01-17*
15+
16+
- Add
17+
- Sites:
18+
- OnlyFans: handling error `502`
19+
- Threads: user name and description extraction
20+
- TikTok: **downloading `Stories` and `Reposts`**
21+
- Download groups: excluded groups
22+
- Updated
23+
- yt-dlp up to version **2025.12.08**
24+
- gallery-dl up to version **1.31.3**
25+
- Fixed
26+
- Sites:
27+
- PornHub: videos aren't downloading
28+
- TikTok: new videos aren't downloading
29+
- xHamster: new users aren't added in some cases
30+
1031
# 2025
1132

1233
## 2025.11.25.0
@@ -1765,7 +1786,7 @@ At the requests of some users, I added [screenshots](ProgramScreenshots) of the
17651786
- Wrong some Reddit videos parsing
17661787
- Wrong some Reddit images parsing
17671788

1768-
# 1.0.0.0
1789+
## 1.0.0.0
17691790

17701791
*2021-12-07*
17711792

278 Bytes
Loading
2.76 KB
Loading

SCrawler/API/Base/UserDataBase.vb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,6 +1439,16 @@ BlockNullPicture:
14391439
Cache.Validate()
14401440
Return Cache
14411441
End Function
1442+
#Region "GDL File Names"
1443+
Protected GDLFileNameProvider As ANumbers = Nothing
1444+
Protected Sub GDLResetFileNameProvider(Optional ByVal GroupSize As Integer? = Nothing)
1445+
GDLFileNameProvider = New ANumbers With {.FormatOptions = ANumbers.Options.FormatNumberGroup + ANumbers.Options.Groups}
1446+
GDLFileNameProvider.GroupSize = If(GroupSize, 3)
1447+
End Sub
1448+
Protected Function GDLRenameFile(ByVal Input As SFile, ByVal i As Integer) As SFile
1449+
Return SFile.Rename(Input, $"{Input.PathWithSeparator}{i.NumToString(GDLFileNameProvider)}.{Input.Extension}",, EDP.ThrowException)
1450+
End Function
1451+
#End Region
14421452
#Region "DownloadSingleObject"
14431453
Protected IsSingleObjectDownload As Boolean = False
14441454
Friend Overridable Sub DownloadSingleObject(ByVal Data As YouTube.Objects.IYouTubeMediaContainer, ByVal Token As CancellationToken) Implements IUserData.DownloadSingleObject
@@ -2453,6 +2463,7 @@ stxt:
24532463
_TempPostsList.Clear()
24542464
_MD5List.Clear()
24552465
TokenPersonal = Nothing
2466+
GDLFileNameProvider = Nothing
24562467
If Not ProgressPre Is Nothing Then ProgressPre.Reset() : ProgressPre.Dispose()
24572468
If Not Responser Is Nothing Then Responser.Dispose()
24582469
If Not BTT_CONTEXT_DOWN Is Nothing Then BTT_CONTEXT_DOWN.Dispose()

SCrawler/API/Instagram/UserData.vb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ Namespace API.Instagram
525525
Protected Overrides Sub Responser_ResponseReceived(ByVal Sender As Object, ByVal e As EventArguments.WebDataResponse)
526526
Declarations.UpdateResponser(e, Responser, WwwClaimUpdate)
527527
End Sub
528-
Friend Enum Sections : Timeline : Reels : Tagged : Stories : UserStories : SavedPosts : End Enum
528+
Friend Enum Sections : Timeline : Reels : Tagged : Stories : UserStories : SavedPosts : Reposts : Likes : End Enum
529529
Protected Const StoriesFolder As String = "Stories"
530530
Private Const TaggedFolder As String = "Tagged"
531531
#Region "429 bypass"

SCrawler/API/OnlyFans/DynamicRulesEnv.vb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,12 +219,12 @@ Namespace API.OnlyFans
219219
DynamicRulesXml.Extension = "xml"
220220
ReplacePattern_RepoToRaw = New RParams("(.*github.com/([^/]+)/([^/]+)/blob/(.+))", Nothing, 0,
221221
RegexReturn.ReplaceChangeListMatch, EDP.ReturnValue) With {
222-
.PatternReplacement = "https://raw.githubusercontent.com/{2}/{3}/{4}"}
222+
.PatternReplacement = "https://raw.githubusercontent.com/{2}/{3}/refs/heads/{4}"}
223223
ReplacePattern_JsonInfo = ReplacePattern_RepoToRaw.Copy
224224
ReplacePattern_JsonInfo.PatternReplacement = "https://github.com/{2}/{3}/latest-commit/{4}"
225225
ReplacePattern_RawToRepo = ReplacePattern_RepoToRaw.Copy
226-
ReplacePattern_RawToRepo.Pattern = "(.*raw.githubusercontent.com/([^/]+)/([^/]+)/([^/]+)/(.+))"
227-
ReplacePattern_RawToRepo.PatternReplacement = "https://github.com/{2}/{3}/blob/{4}/{5}"
226+
ReplacePattern_RawToRepo.Pattern = "(.*raw.githubusercontent.com/([^/]+)/([^/]+)(/refs/heads)?/([^/]+)/(.+))"
227+
ReplacePattern_RawToRepo.PatternReplacement = "https://github.com/{2}/{3}/blob/{5}/{6}"
228228
ConfigRulesExtract = RParams.DMS("DYNAMIC_RULE"":(\{.+?\}[\r\n]+)", 1, RegexOptions.Singleline, EDP.ReturnValue)
229229
OFLOG = New TextSaver($"LOGs\OF_{Now:yyyyMMdd_HHmmss}.txt") With {.LogMode = True, .AutoSave = True, .AutoClear = True}
230230
AddHandler OFLOG.TextSaved, AddressOf OFLOG_TextSaved

SCrawler/API/OnlyFans/UserData.vb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ Namespace API.OnlyFans
8888
Private _DownloadedPostsSession As Integer = 0
8989
Private FunctionErr As Integer = FunctionErrDef
9090
Private Const FunctionErrDef As Integer = -100
91+
Private _TimelineDownloading As Boolean = False
9192
Private Sub ValidateOFScraper()
9293
_OFScraperExists = ACheck(MySettings.OFScraperPath.Value) AndAlso CStr(MySettings.OFScraperPath.Value).CSFile.Exists
9394
End Sub
@@ -110,7 +111,9 @@ Namespace API.OnlyFans
110111
If ID.IsEmptyString Then Throw New ArgumentNullException("ID", "Unable to get user ID")
111112
End If
112113

114+
_TimelineDownloading = True
113115
If MediaDownloadTimeline Then DownloadTimeline(IIf(IsSavedPosts, 0, String.Empty), Token)
116+
_TimelineDownloading = False
114117
If Not IsSavedPosts Then
115118
If MediaDownloadStories And FunctionErr = FunctionErrDef Then DownloadStories(Token)
116119
If MediaDownloadHighlights And FunctionErr = FunctionErrDef Then DownloadHighlights(Token)
@@ -827,6 +830,8 @@ Namespace API.OnlyFans
827830
Return 3
828831
ElseIf Responser.StatusCode = Net.HttpStatusCode.InternalServerError Then '500
829832
Return 3
833+
ElseIf Not _TimelineDownloading And Responser.StatusCode = Net.HttpStatusCode.BadGateway Then '502
834+
Return 3
830835
Else
831836
Return 0
832837
End If

SCrawler/API/PornHub/UserData.vb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ Namespace API.PornHub
385385
If PersonType = PersonTypeCannel Then
386386
l = l.ListTake(4, l.Count)
387387
Else
388-
l.RemoveAll(Function(uv) uv.UserRef.IsEmptyString OrElse Not uv.UserRef = usrRef)
388+
l.RemoveAll(Function(uv) Not uv.UserRef.IsEmptyString AndAlso Not uv.UserRef = usrRef)
389389
End If
390390
ElseIf Type = VideoTypes.Favorite Then
391391
l.RemoveAll(Function(uv) uv.Type = VideoTypes.Private)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
' Copyright (C) Andy https://github.com/AAndyProgram
2+
' This program is free software: you can redistribute it and/or modify
3+
' it under the terms of the GNU General Public License as published by
4+
' the Free Software Foundation, either version 3 of the License, or
5+
' (at your option) any later version.
6+
'
7+
' This program is distributed in the hope that it will be useful,
8+
' but WITHOUT ANY WARRANTY
9+
Imports SCrawler.API.Base
10+
Imports PersonalUtilities.Functions.RegularExpressions
11+
Namespace API.ThreadsNet
12+
Friend Module Declarations
13+
Friend ReadOnly RegexUserID As RParams = RParams.DMS("""props"":\{[^\{\}]*?""user_id"":""(\d+)""", 1, EDP.ReturnValue)
14+
Friend ReadOnly RegexUserName As RParams = RParams.DMS("\<meta property=""og:title"" content=""([^\>]+)""\s*/\>", 1, TitleHtmlConverter, EDP.ReturnValue)
15+
Friend ReadOnly RegexUserDescr As RParams = RParams.DMS("\<meta property=""og:description"" content=""([^\>]+)""\s*/\>", 1, HtmlConverter, EDP.ReturnValue)
16+
End Module
17+
End Namespace

SCrawler/API/ThreadsNet/UserData.vb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,10 @@ Namespace API.ThreadsNet
388388
Dim newID$
389389
Dim idStr$ = String.Empty
390390
If Not r.IsEmptyString Then
391+
UserSiteNameUpdate(RegexReplace(r, RegexUserName))
392+
UserDescriptionUpdate(RegexReplace(r, RegexUserDescr))
391393
ParseTokens(r, 0)
392-
newID = RegexReplace(r, RParams.DMS("""props"":\{[^\{\}]*?""user_id"":""(\d+)""", 1, EDP.ReturnValue))
394+
newID = RegexReplace(r, RegexUserID)
393395
If ID.IsEmptyString OrElse ID = newID Then
394396
_IdChanged = ID.IsEmptyString
395397
ID = newID

0 commit comments

Comments
 (0)