Skip to content

Commit 94edf23

Browse files
committed
2024.1.12.0
DownloadFeedForm: add an option to create a new feed when adding checked items; add a prompt before clearing the current session MainFrame: add scheduler to tray menu API.Instagram: fix tagged posts downloading API.xHamster: fix profiles downloading; add creators downloading API.YouTube: add error to log (communities)
1 parent 0246af9 commit 94edf23

14 files changed

Lines changed: 173 additions & 100 deletions

File tree

Changelog.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,19 @@
1+
# 2024.1.12.0
2+
3+
*2024-01-12*
4+
5+
- Added
6+
- Feed: added a prompt before clearing the current session
7+
- xHamster: creators
8+
- YouTube communities: add error to log
9+
- Added scheduler to tray menu
10+
- Other improvements
11+
- Fixed
12+
- Feed: there is no option to create a new feed when adding checked items
13+
- **Instagram**: downloading of tagged posts
14+
- xHamster: profiles are not downloading
15+
- Minor bugs
16+
117
# 2023.12.27.0
218

319
*2023-12-27*

SCrawler/API/Base/UserDataBase.vb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1403,7 +1403,7 @@ BlockNullPicture:
14031403
End If
14041404
ff.Name &= "_thumb"
14051405
ff.Extension = "jpg"
1406-
f = Web.FFMPEG.TakeSnapshot(f, ff, Settings.FfmpegFile, TimeSpan.FromSeconds(1),,, EDP.LogMessageValue)
1406+
f = Web.FFMPEG.TakeSnapshot(f, ff, Settings.FfmpegFile, TimeSpan.FromSeconds(1),,, EDP.SendToLog + EDP.ReturnValue)
14071407
If f.Exists Then DirectCast(Data, IDownloadableMedia).ThumbnailFile = f
14081408
End If
14091409
Else

SCrawler/API/Instagram/SiteSettings.vb

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,6 @@ Namespace API.Instagram
6363
Friend Const Header_Browser As String = "Sec-Ch-Ua"
6464
Friend Const Header_BrowserExt As String = "Sec-Ch-Ua-Full-Version-List"
6565
Friend Const Header_Platform As String = "Sec-Ch-Ua-Platform-Version"
66-
<PropertyOption(ControlText:="Hash", ControlToolTip:="Instagram session hash for tagged posts", IsAuth:=True), PXML("InstaHash"), ControlNumber(0), PClonable(Clone:=False)>
67-
Friend ReadOnly Property HashTagged As PropertyValue
6866
<PropertyOption(ControlText:="x-csrftoken", IsAuth:=True, AllowNull:=False), ControlNumber(2), PClonable(Clone:=False)>
6967
Friend ReadOnly Property HH_CSRF_TOKEN As PropertyValue
7068
<PropertyOption(ControlText:="x-ig-app-id", IsAuth:=True, AllowNull:=False), ControlNumber(3), PClonable(Clone:=False)>
@@ -236,7 +234,6 @@ Namespace API.Instagram
236234
.CookiesExtractedAutoSave = False
237235
End With
238236

239-
HashTagged = New PropertyValue(String.Empty, GetType(String))
240237
HH_CSRF_TOKEN = New PropertyValue(token, GetType(String), Sub(v) ChangeResponserFields(NameOf(HH_CSRF_TOKEN), v))
241238
HH_IG_APP_ID = New PropertyValue(app_id, GetType(String), Sub(v) ChangeResponserFields(NameOf(HH_IG_APP_ID), v))
242239
HH_ASBD_ID = New PropertyValue(asbd, GetType(String), Sub(v) ChangeResponserFields(NameOf(HH_ASBD_ID), v))
@@ -249,7 +246,7 @@ Namespace API.Instagram
249246
DownloadTimeline = New PropertyValue(True)
250247
DownloadStories = New PropertyValue(True)
251248
DownloadStoriesUser = New PropertyValue(True)
252-
DownloadTagged = New PropertyValue(False)
249+
DownloadTagged = New PropertyValue(True)
253250

254251
RequestsWaitTimer = New PropertyValue(1000)
255252
RequestsWaitTimerProvider = New TimersChecker(100)

SCrawler/API/Instagram/UserData.vb

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,12 @@ Namespace API.Instagram
255255
If Not IsSavedPosts AndAlso MySiteSettings.BaseAuthExists() Then
256256
If CBool(MySiteSettings.DownloadStories.Value) And GetStories Then s = Sections.Stories : DownloadData(String.Empty, s, Token) : ProgressPre.Done()
257257
If CBool(MySiteSettings.DownloadStoriesUser.Value) And GetStoriesUser Then s = Sections.UserStories : DownloadData(String.Empty, s, Token) : ProgressPre.Done()
258-
If CBool(MySiteSettings.DownloadTagged.Value) And ACheck(MySiteSettings.HashTagged.Value) And GetTaggedData Then s = Sections.Tagged : DownloadData(String.Empty, s, Token) : ProgressPre.Done()
258+
If CBool(MySiteSettings.DownloadTagged.Value) And GetTaggedData Then
259+
s = Sections.Tagged
260+
DownloadData(String.Empty, s, Token)
261+
ProgressPre.Done()
262+
If PostsToReparse.Count > 0 Then DownloadPosts(Token, True)
263+
End If
259264
End If
260265
If WaitNotificationMode = WNM.SkipTemp Or WaitNotificationMode = WNM.SkipCurrent Then WaitNotificationMode = WNM.Notify
261266
Catch eex As ExitException
@@ -460,12 +465,10 @@ Namespace API.Instagram
460465
SavedPostsDownload(String.Empty, Token)
461466
Exit Sub
462467
Case Sections.Tagged
463-
Dim h$ = AConvert(Of String)(MySiteSettings.HashTagged.Value, String.Empty)
464-
If h.IsEmptyString Then Throw New ExitException
465468
Dim vars$ = "{""id"":" & ID & ",""first"":50,""after"":""" & Cursor & """}"
466469
vars = SymbolsConverter.ASCII.EncodeSymbolsOnly(vars)
467-
URL = $"https://www.instagram.com/graphql/query/?query_hash={h}&variables={vars}"
468-
ENode = {"data", "user", 0}
470+
URL = $"https://www.instagram.com/graphql/query/?doc_id=17946422347485809&variables={vars}"
471+
ENode = {"data", "user", "edge_user_to_photos_of_you"}
469472
SpecFolder = TaggedFolder
470473
Case Sections.Stories
471474
If Not StoriesRequested Then
@@ -581,11 +584,12 @@ Namespace API.Instagram
581584
ProcessException(DoEx, Token, $"data downloading error [{URL}]",, Section)
582585
End Try
583586
End Sub
584-
Private Sub DownloadPosts(ByVal Token As CancellationToken)
587+
Private Sub DownloadPosts(ByVal Token As CancellationToken, Optional ByVal IsTagged As Boolean = False)
585588
Dim URL$ = String.Empty
586589
Dim dValue% = 1
587590
Dim _Index% = 0
588591
Dim before%
592+
Dim specFolder$ = IIf(IsTagged, "Tagged", String.Empty)
589593
If PostsToReparse.Count > 0 Then ProgressPre.ChangeMax(PostsToReparse.Count)
590594
Try
591595
Do While dValue = 1
@@ -616,7 +620,7 @@ Namespace API.Instagram
616620
With j("items")
617621
For Each jj In .Self
618622
before = _TempMediaList.Count
619-
ObtainMedia(jj, PostsToReparse(i).ID)
623+
ObtainMedia(jj, PostsToReparse(i).ID, specFolder)
620624
If Not before = _TempMediaList.Count Then _TotalPostsParsed += 1
621625
If _Limit > 0 And _TotalPostsParsed >= _Limit Then Throw New ExitException
622626
Next

SCrawler/API/OnlyFans/SiteSettings.vb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ Namespace API.OnlyFans
148148
DownloadChatMedia = New PropertyValue(True)
149149

150150
LastDateUpdated_XML = New PropertyValue(Now.AddYears(-1), GetType(Date))
151-
UseOldAuthRules = New PropertyValue(False)
151+
'URGENT: OF [UseOldAuthRules = True]
152+
UseOldAuthRules = New PropertyValue(True)
152153
DynamicRulesUpdateInterval = New PropertyValue(60 * 24)
153154
DynamicRulesUpdateIntervalProvider = New FieldsCheckerProviderSimple(Function(v) IIf(AConvert(Of Integer)(v, 0) > 0, v, Nothing),
154155
"The value of [{0}] field must be greater than 0")

SCrawler/API/Xhamster/SiteSettings.vb

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Namespace API.Xhamster
4646

4747
_SubscriptionsAllowed = True
4848
UrlPatternUser = "https://xhamster.com/{0}/{1}"
49-
UserRegex = RParams.DMS($"/({UserOption}|{ChannelOption})/([^/]+)(\Z|.*)", 0, RegexReturn.ListByMatch)
49+
UserRegex = RParams.DMS($"/({UserOption}|{ChannelOption}|{P_Creators})/([^/]+)(\Z|.*)", 0, RegexReturn.ListByMatch)
5050
ImageVideoContains = "xhamster"
5151
End Sub
5252
Friend Overrides Sub EndInit()
@@ -96,8 +96,9 @@ Namespace API.Xhamster
9696
Friend Const P_Search As String = "search"
9797
Friend Const P_Tags As String = "tags"
9898
Friend Const P_Categories As String = "categories"
99-
Friend Const P_Pornstars = "pornstars"
100-
Private ReadOnly NonUsersRegex As RParams = RParams.DM("https?://[^/]+/((gay)/|(shemale)/|)(pornstars|tags|categories|search)/([^/\?]+)[/\?]?(.*)", 0,
99+
Friend Const P_Pornstars As String = "pornstars"
100+
Friend Const P_Creators As String = "creators"
101+
Private ReadOnly NonUsersRegex As RParams = RParams.DM("https?://[^/]+/((gay)/|(shemale)/|)(pornstars|creators|tags|categories|search)/([^/\?]+)[/\?]?(.*)", 0,
101102
RegexReturn.ListByMatch, EDP.ReturnValue)
102103
Private ReadOnly PageRemover_1 As RParams = RParams.DM("[\?&]?[Pp]age=\d+", 0, RegexReturn.Replace, EDP.ReturnValue,
103104
CType(Function(input) String.Empty, Func(Of String, String)))
@@ -106,12 +107,23 @@ Namespace API.Xhamster
106107
Friend Overrides Function IsMyUser(ByVal UserURL As String) As ExchangeOptions
107108
If Not UserURL.IsEmptyString AndAlso Domains.Domains.Count > 0 AndAlso Domains.Domains.Exists(Function(d) UserURL.ToLower.Contains(d.ToLower)) Then
108109
Dim n$, opt$
110+
Dim tryNext As Boolean = False
109111
Dim data As List(Of String) = RegexReplace(UserURL, UserRegex)
110112
If data.ListExists(3) AndAlso Not data(2).IsEmptyString Then
111113
n = data(2)
112-
If Not data(1).IsEmptyString AndAlso data(1) = ChannelOption Then n &= $"@{data(1)}"
113-
Return New ExchangeOptions(Site, n)
114+
If Not data(1).IsEmptyString Then
115+
If data(1) = ChannelOption Then
116+
n &= $"@{data(1)}"
117+
ElseIf data(1) = P_Creators Then
118+
tryNext = True
119+
End If
120+
End If
121+
If Not tryNext Then Return New ExchangeOptions(Site, n)
114122
Else
123+
tryNext = True
124+
End If
125+
126+
If tryNext Then
115127
data = RegexReplace(UserURL, NonUsersRegex)
116128
If data.ListExists(7) AndAlso Not data(5).IsEmptyString Then
117129
n = data(5).StringRemoveWinForbiddenSymbols
@@ -122,6 +134,7 @@ Namespace API.Xhamster
122134
Case P_Tags : mode = SiteModes.Tags
123135
Case P_Categories : mode = SiteModes.Categories
124136
Case P_Pornstars : mode = SiteModes.Pornstars
137+
Case P_Creators : mode = SiteModes.User
125138
Case Else : Return Nothing
126139
End Select
127140
n = $"{CInt(mode)}@{n}"

SCrawler/API/Xhamster/UserData.vb

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Namespace API.Xhamster
1919
Friend Class UserData : Inherits UserDataBase
2020
#Region "XML names"
2121
Private Const Name_Gender As String = "Gender"
22+
Private Const Name_IsCreator As String = "IsCreator"
2223
#End Region
2324
#Region "Declarations"
2425
Friend Overrides ReadOnly Property FeedIsUser As Boolean
@@ -27,6 +28,7 @@ Namespace API.Xhamster
2728
End Get
2829
End Property
2930
Friend Property IsChannel As Boolean = False
31+
Friend Property IsCreator As Boolean = False
3032
Friend Property TrueName As String = String.Empty
3133
Friend Property Gender As String = String.Empty
3234
Friend Property SiteMode As SiteModes = SiteModes.User
@@ -77,7 +79,8 @@ Namespace API.Xhamster
7779
If n.Length = 2 And If(Force, eObj.Options, Options).IsEmptyString Then
7880
If Force Then Return False
7981
TrueName = n(0)
80-
IsChannel = True
82+
IsChannel = n(1) = SiteSettings.ChannelOption
83+
IsCreator = n(1) = SiteSettings.P_Creators
8184
ElseIf IsChannel Then
8285
If Force Then Return False
8386
TrueName = Name
@@ -89,6 +92,7 @@ Namespace API.Xhamster
8992
If n2.ListExists Then
9093
IsChannel = False
9194
__Mode = CInt(n2(0))
95+
IsCreator = __Mode = SiteModes.User
9296
__Gender = n2(1)
9397
__Arguments = n2(3)
9498
__TrueName = n2.ListTake(3, 100, EDP.ReturnValue).ListToString(String.Empty)
@@ -139,6 +143,7 @@ Namespace API.Xhamster
139143
With Container
140144
If Loading Then
141145
IsChannel = .Value(Name_IsChannel).FromXML(Of Boolean)(False)
146+
IsCreator = .Value(Name_IsCreator).FromXML(Of Boolean)(False)
142147
TrueName = .Value(Name_TrueName)
143148
Gender = .Value(Name_Gender)
144149
SiteMode = .Value(Name_SiteMode).FromXML(Of Integer)(SiteModes.User)
@@ -151,6 +156,7 @@ Namespace API.Xhamster
151156
.Value(Name_FriendlyName) = FriendlyName
152157
End If
153158
.Add(Name_IsChannel, IsChannel.BoolToInteger)
159+
.Add(Name_IsCreator, IsCreator.BoolToInteger)
154160
.Add(Name_TrueName, TrueName)
155161
.Add(Name_Gender, Gender)
156162
.Add(Name_SiteMode, CInt(SiteMode))
@@ -178,7 +184,7 @@ Namespace API.Xhamster
178184
#End Region
179185
#Region "Download functions"
180186
Friend Function GetNonUserUrl(ByVal Page As Integer) As String
181-
If SiteMode = SiteModes.User Then
187+
If SiteMode = SiteModes.User And Not IsCreator Then
182188
Return String.Empty
183189
Else
184190
Dim url$ = "https://xhamster.com/"
@@ -188,6 +194,7 @@ Namespace API.Xhamster
188194
Case SiteModes.Categories : url &= SiteSettings.P_Categories
189195
Case SiteModes.Search : url &= SiteSettings.P_Search
190196
Case SiteModes.Pornstars : url &= SiteSettings.P_Pornstars
197+
Case SiteModes.User : url &= SiteSettings.P_Creators
191198
Case Else : Return String.Empty
192199
End Select
193200
url &= $"/{TrueName}"
@@ -224,15 +231,20 @@ Namespace API.Xhamster
224231
Private ReadOnly SessionPosts As List(Of String)
225232
Private _PageVideosRepeat As Integer = 0
226233
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
227-
_TempPhotoData.Clear()
228-
SearchPostsCount = 0
229-
_PageVideosRepeat = 0
230-
SessionPosts.Clear()
231-
If DownloadVideos Then DownloadData(1, True, Token)
232-
If Not IsChannel And DownloadImages And Not IsSubscription Then
233-
DownloadData(1, False, Token)
234-
ReparsePhoto(Token)
235-
End If
234+
Try
235+
_TempPhotoData.Clear()
236+
SearchPostsCount = 0
237+
_PageVideosRepeat = 0
238+
SessionPosts.Clear()
239+
Responser.CookiesAsHeader = True
240+
If DownloadVideos Then DownloadData(1, True, Token)
241+
If Not IsChannel And Not IsCreator And DownloadImages And Not IsSubscription Then
242+
DownloadData(1, False, Token)
243+
ReparsePhoto(Token)
244+
End If
245+
Finally
246+
Responser.CookiesAsHeader = False
247+
End Try
236248
End Sub
237249
Private Overloads Sub DownloadData(ByVal Page As Integer, ByVal IsVideo As Boolean, ByVal Token As CancellationToken)
238250
Dim URL$ = String.Empty
@@ -260,7 +272,7 @@ Namespace API.Xhamster
260272
ElseIf SiteMode = SiteModes.Search Then
261273
URL = GetNonUserUrl(Page)
262274
containerNodes.Add({"searchResult", "models"})
263-
ElseIf SiteMode = SiteModes.Tags Or SiteMode = SiteModes.Categories Or SiteMode = SiteModes.Pornstars Then
275+
ElseIf IsCreator Or SiteMode = SiteModes.Tags Or SiteMode = SiteModes.Categories Or SiteMode = SiteModes.Pornstars Then
264276
URL = GetNonUserUrl(Page)
265277
If SiteMode = SiteModes.Pornstars Then
266278
containerNodes.Add({"trendingVideoListComponent", "models"})
@@ -269,9 +281,11 @@ Namespace API.Xhamster
269281
containerNodes.Add({"pagesCategoryComponent", "trendingVideoListProps", "models"})
270282
containerNodes.Add({"trendingVideoListComponent", "models"})
271283
End If
284+
containerNodes.Add({"trendingVideoSectionComponent", "videoModels"})
272285
Else
273286
URL = $"https://xhamster.com/users/{TrueName}/{IIf(IsVideo, "videos", "photos")}{IIf(Page = 1, String.Empty, $"/{Page}")}"
274287
containerNodes.Add({If(IsVideo, "userVideoCollection", "userGalleriesCollection")})
288+
containerNodes.Add(If(IsVideo, {"videoListComponent", "models"}, {"userGalleriesCollection"}))
275289
End If
276290
ThrowAny(Token)
277291

SCrawler/API/YouTube/UserData.vb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ Namespace API.YouTube
225225
End Sub
226226
Private Sub DownloadCommunity(ByVal Cursor As String, ByVal Token As CancellationToken, Optional ByVal Round As Integer = 0)
227227
Dim URL$ = String.Empty
228+
Const errMsg$ = "community data downloading error"
228229
Try
229230
Const postIdTemp$ = "Community_{0}"
230231
Const specFolder$ = "Community"
@@ -311,6 +312,10 @@ Namespace API.YouTube
311312
Next
312313
End If
313314
End With
315+
Else
316+
With j({"error"})
317+
If .ListExists Then MyMainLOG = $"{ToStringForLog()} {errMsg} [{ .Value("code")}]: { .Value("message")}"
318+
End With
314319
End If
315320
End With
316321
End If
@@ -327,7 +332,7 @@ Namespace API.YouTube
327332

328333
If Not nextToken.IsEmptyString Then DownloadCommunity(nextToken, Token)
329334
Catch ex As Exception
330-
ProcessException(ex, Token, "community data downloading error")
335+
ProcessException(ex, Token, errMsg)
331336
End Try
332337
End Sub
333338
Private Sub GetChannelID()

0 commit comments

Comments
 (0)