2023.11.13.1

PornHub: add playlists downloading
This commit is contained in:
Andy
2023-11-13 23:13:53 +03:00
parent f08a5f9259
commit 96705f1c59
9 changed files with 57 additions and 29 deletions

View File

@@ -18,6 +18,7 @@ Namespace API.Base
Tags = 2 Tags = 2
Categories = 3 Categories = 3
Pornstars = 4 Pornstars = 4
Playlists = 5
End Enum End Enum
Friend Structure UserMedia : Implements IUserMedia, IEquatable(Of UserMedia), IEContainerProvider Friend Structure UserMedia : Implements IUserMedia, IEquatable(Of UserMedia), IEContainerProvider
#Region "XML Names" #Region "XML Names"

View File

@@ -169,6 +169,11 @@ Namespace API.Base
Protected Const Name_UseMD5Comparison As String = "UseMD5Comparison" Protected Const Name_UseMD5Comparison As String = "UseMD5Comparison"
Protected Const Name_RemoveExistingDuplicates As String = "RemoveExistingDuplicates" Protected Const Name_RemoveExistingDuplicates As String = "RemoveExistingDuplicates"
Protected Const Name_StartMD5Checked As String = "StartMD5Checked" Protected Const Name_StartMD5Checked As String = "StartMD5Checked"
#Region "Additional names"
Protected Const Name_SiteMode As String = "SiteMode"
Protected Const Name_TrueName As String = "TrueName"
Protected Const Name_Arguments As String = "Arguments"
#End Region
#End Region #End Region
#Region "Declarations" #Region "Declarations"
#Region "Host, Site, Progress" #Region "Host, Site, Progress"

View File

@@ -18,7 +18,6 @@ Namespace API.Mastodon
Friend Class UserData : Inherits Twitter.UserData Friend Class UserData : Inherits Twitter.UserData
#Region "XML names" #Region "XML names"
Private Const Name_UserDomain As String = "UserDomain" Private Const Name_UserDomain As String = "UserDomain"
Private Const Name_TrueName As String = "TrueName"
#End Region #End Region
#Region "Declarations" #Region "Declarations"
Private _UserDomain As String = String.Empty Private _UserDomain As String = String.Empty

View File

@@ -24,6 +24,7 @@ Namespace API.PornHub
0, RegexOptions.Singleline, RegexReturn.List, EDP.ReturnValue, UnicodeHexConverter) 0, RegexOptions.Singleline, RegexReturn.List, EDP.ReturnValue, UnicodeHexConverter)
Friend ReadOnly RegexVideo_Video_VideoKey As RParams = RParams.DMS("viewkey=([\w\d]+)", 1, EDP.ReturnValue) Friend ReadOnly RegexVideo_Video_VideoKey As RParams = RParams.DMS("viewkey=([\w\d]+)", 1, EDP.ReturnValue)
Friend ReadOnly RegexVideoPageTitle As RParams = RParams.DMS("meta (property|name)=""[^:]+?:title"" content=""([^""]+)""", 2, EDP.ReturnValue) Friend ReadOnly RegexVideoPageTitle As RParams = RParams.DMS("meta (property|name)=""[^:]+?:title"" content=""([^""]+)""", 2, EDP.ReturnValue)
Friend ReadOnly RegexDataToken As RParams = RParams.DMS("data-token=""([^""]+)", 1, EDP.ReturnValue)
#End Region #End Region
#Region "Declarations M3U8" #Region "Declarations M3U8"
Friend ReadOnly Regex_M3U8_FilesList As RParams = RParams.DM("RESOLUTION=\d+x(\d+).*?[\r\n]*?(.+?m3u8.*)", 0, RegexReturn.List, EDP.ReturnValue) Friend ReadOnly Regex_M3U8_FilesList As RParams = RParams.DM("RESOLUTION=\d+x(\d+).*?[\r\n]*?(.+?m3u8.*)", 0, RegexReturn.List, EDP.ReturnValue)

View File

@@ -29,7 +29,7 @@ Namespace API.PornHub
Private Const Name_DownloadFavorite As String = "DownloadFavorite" Private Const Name_DownloadFavorite As String = "DownloadFavorite"
Private Const Name_DownloadGifs As String = "DownloadGifs" Private Const Name_DownloadGifs As String = "DownloadGifs"
Private Const Name_DownloadPhotoOnlyFromModelHub As String = "DownloadPhotoOnlyFromModelHub" Private Const Name_DownloadPhotoOnlyFromModelHub As String = "DownloadPhotoOnlyFromModelHub"
Private Const Name_IsUser As String = "IsUser" <Obsolete> Private Const Name_IsUser As String = "IsUser"
#End Region #End Region
#Region "Structures" #Region "Structures"
Private Structure FlashVar : Implements IRegExCreator Private Structure FlashVar : Implements IRegExCreator
@@ -117,6 +117,8 @@ Namespace API.PornHub
Private Const PersonTypeUser As String = "users" Private Const PersonTypeUser As String = "users"
Private Const PersonTypePornstar As String = "pornstar" Private Const PersonTypePornstar As String = "pornstar"
Private Const PersonTypeCannel As String = "channels" Private Const PersonTypeCannel As String = "channels"
Private Const PersonTypePlaylist As String = "playlist"
Private Const PlaylistsLabelName As String = "Playlist"
#End Region #End Region
#Region "Person" #Region "Person"
Friend Property PersonType As String Friend Property PersonType As String
@@ -133,7 +135,7 @@ Namespace API.PornHub
#Region "Advanced fields" #Region "Advanced fields"
Friend Overrides ReadOnly Property FeedIsUser As Boolean Friend Overrides ReadOnly Property FeedIsUser As Boolean
Get Get
Return IsUser Return IsUser Or SiteMode = SiteModes.Playlists
End Get End Get
End Property End Property
Private Property PhotoPageModel As PhotoPageModels = PhotoPageModels.Undefined Private Property PhotoPageModel As PhotoPageModels = PhotoPageModels.Undefined
@@ -144,12 +146,12 @@ Namespace API.PornHub
Friend Property DownloadFavorite As Boolean = False Friend Property DownloadFavorite As Boolean = False
Friend Property DownloadGifs As Boolean Friend Property DownloadGifs As Boolean
Friend Property DownloadPhotoOnlyFromModelHub As Boolean = True Friend Property DownloadPhotoOnlyFromModelHub As Boolean = True
Private _IsUser As Boolean = True
Friend Overrides ReadOnly Property IsUser As Boolean Friend Overrides ReadOnly Property IsUser As Boolean
Get Get
Return _IsUser Return SiteMode = SiteModes.User
End Get End Get
End Property End Property
Friend Property SiteMode As SiteModes = SiteModes.User
Friend Property QueryString As String Friend Property QueryString As String
Get Get
If IsUser Then If IsUser Then
@@ -164,7 +166,7 @@ Namespace API.PornHub
End Property End Property
Friend Overrides ReadOnly Property SpecialLabels As IEnumerable(Of String) Friend Overrides ReadOnly Property SpecialLabels As IEnumerable(Of String)
Get Get
Return {SearchRequestLabelName} Return {SearchRequestLabelName, PlaylistsLabelName}
End Get End Get
End Property End Property
#End Region #End Region
@@ -204,26 +206,32 @@ Namespace API.PornHub
#Region "Loader" #Region "Loader"
Private Function UpdateUserOptions(Optional ByVal Force As Boolean = False, Optional ByVal NewUrl As String = Nothing) As Boolean Private Function UpdateUserOptions(Optional ByVal Force As Boolean = False, Optional ByVal NewUrl As String = Nothing) As Boolean
If Not Force OrElse (Not IsUser AndAlso Not NewUrl.IsEmptyString AndAlso MyFileSettings.Exists) Then If Not Force OrElse (Not IsUser AndAlso Not SiteMode = SiteModes.Playlists AndAlso Not NewUrl.IsEmptyString AndAlso MyFileSettings.Exists) Then
Dim eObj As Plugin.ExchangeOptions = Nothing Dim eObj As Plugin.ExchangeOptions = Nothing
If Force Then eObj = MySettings.IsMyUser(NewUrl) If Force Then eObj = MySettings.IsMyUser(NewUrl)
If (Force And Not eObj.UserName.IsEmptyString) Or (Not Force And Not Name.IsEmptyString And NameTrue.IsEmptyString) Then If (Force And Not eObj.UserName.IsEmptyString) Or (Not Force And Not Name.IsEmptyString And NameTrue.IsEmptyString) Then
If Not If(Force, eObj.Options, Options).IsEmptyString Then If Not If(Force, eObj.Options, Options).IsEmptyString Then
If IsUser And Force Then If (IsUser Or SiteMode = SiteModes.Playlists) And Force Then
Return False Return False
Else Else
_IsUser = False SiteMode = SiteModes.Search
Options = If(Force, eObj.Options, Options) Options = If(Force, eObj.Options, Options)
If Options.ToLower.StartsWith(PersonTypePlaylist) Then
SiteMode = SiteModes.Playlists
NameTrue = Options.ToLower.Replace(PersonTypePlaylist, String.Empty).StringTrim.TrimStart("/")
Else
NameTrue = Options NameTrue = Options
End If
If Not Force Then If Not Force Then
Settings.Labels.Add(SearchRequestLabelName) Dim l$ = IIf(SiteMode = SiteModes.Playlists, PlaylistsLabelName, SearchRequestLabelName)
Labels.ListAddValue(SearchRequestLabelName, LNC) Settings.Labels.Add(l)
Labels.ListAddValue(l, LNC)
Labels.Sort() Labels.Sort()
Return True Return True
End If End If
End If End If
Else Else
_IsUser = True SiteMode = SiteModes.User
Dim n$() = Name.Split("_") Dim n$() = Name.Split("_")
If n.ListExists(2) Then If n.ListExists(2) Then
NameTrue = Name.Replace($"{n(0)}_", String.Empty) NameTrue = Name.Replace($"{n(0)}_", String.Empty)
@@ -247,7 +255,14 @@ Namespace API.PornHub
DownloadFavorite = .Value(Name_DownloadFavorite).FromXML(Of Boolean)(False) DownloadFavorite = .Value(Name_DownloadFavorite).FromXML(Of Boolean)(False)
DownloadGifs = .Value(Name_DownloadGifs).FromXML(Of Integer)(False) DownloadGifs = .Value(Name_DownloadGifs).FromXML(Of Integer)(False)
DownloadPhotoOnlyFromModelHub = .Value(Name_DownloadPhotoOnlyFromModelHub).FromXML(Of Boolean)(True) DownloadPhotoOnlyFromModelHub = .Value(Name_DownloadPhotoOnlyFromModelHub).FromXML(Of Boolean)(True)
_IsUser = .Value(Name_IsUser).FromXML(Of Boolean)(True) If .Contains(Name_SiteMode) Then
SiteMode = .Value(Name_SiteMode).FromXML(Of Integer)(SiteModes.User)
Else
'TODELETE: PornHub 'IsUser' 20231113
#Disable Warning BC40008
SiteMode = IIf(.Value(Name_IsUser).FromXML(Of Boolean)(True), SiteModes.User, SiteModes.Search)
#Enable Warning
End If
UpdateUserOptions() UpdateUserOptions()
Else Else
If UpdateUserOptions() Then .Value(Name_LabelsName) = LabelsString If UpdateUserOptions() Then .Value(Name_LabelsName) = LabelsString
@@ -261,7 +276,7 @@ Namespace API.PornHub
.Add(Name_DownloadFavorite, DownloadFavorite.BoolToInteger) .Add(Name_DownloadFavorite, DownloadFavorite.BoolToInteger)
.Add(Name_DownloadGifs, DownloadGifs.BoolToInteger) .Add(Name_DownloadGifs, DownloadGifs.BoolToInteger)
.Add(Name_DownloadPhotoOnlyFromModelHub, DownloadPhotoOnlyFromModelHub.BoolToInteger) .Add(Name_DownloadPhotoOnlyFromModelHub, DownloadPhotoOnlyFromModelHub.BoolToInteger)
.Add(Name_IsUser, IsUser.BoolToInteger) .Add(Name_SiteMode, CInt(SiteMode))
'Debug.WriteLine(GetNonUserUrl(0)) 'Debug.WriteLine(GetNonUserUrl(0))
'Debug.WriteLine(GetNonUserUrl(2)) 'Debug.WriteLine(GetNonUserUrl(2))
@@ -271,8 +286,11 @@ Namespace API.PornHub
#End Region #End Region
#Region "Downloading" #Region "Downloading"
#Region "Download override" #Region "Download override"
Private Const PlayListUrlPattern As String = "https://www.pornhub.com/playlist/viewChunked?id={0}&token={1}&page={2}"
Private PlaylistToken As String = String.Empty
Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken) Protected Overrides Sub DownloadDataF(ByVal Token As CancellationToken)
Try Try
PlaylistToken = String.Empty
Responser.ResetStatus() Responser.ResetStatus()
If IsSavedPosts Then If IsSavedPosts Then
@@ -283,7 +301,11 @@ Namespace API.PornHub
Dim limit% = If(DownloadTopCount, -1) Dim limit% = If(DownloadTopCount, -1)
If DownloadVideos Then If DownloadVideos Then
If IsSavedPosts Or Not IsUser Or PersonType = PersonTypeUser Then If SiteMode = SiteModes.Playlists Then
Responser.Mode = Responser.Modes.Default
GetPlaylistToken(Token)
DownloadUserVideos(1, VideoTypes.Favorite, False, Token)
ElseIf IsSavedPosts Or Not IsUser Or PersonType = PersonTypeUser Then
DownloadUserVideos(1, VideoTypes.Favorite, False, Token) DownloadUserVideos(1, VideoTypes.Favorite, False, Token)
Else Else
If DownloadUploaded Then If DownloadUploaded Then
@@ -365,6 +387,9 @@ Namespace API.PornHub
Throw New ArgumentException($"Type '{Type}' is not implemented in the video download function", "Type") Throw New ArgumentException($"Type '{Type}' is not implemented in the video download function", "Type")
End If End If
If Page > 1 Then URL &= $"?page={Page}" If Page > 1 Then URL &= $"?page={Page}"
ElseIf SiteMode = SiteModes.Playlists Then
If PlaylistToken.IsEmptyString Then Throw New ArgumentNullException("PlaylistToken", "Unable to get 'PlaylistToken'")
URL = String.Format(PlayListUrlPattern, NameTrue, PlaylistToken, Page)
Else Else
URL = GetNonUserUrl(Page) URL = GetNonUserUrl(Page)
End If End If
@@ -375,7 +400,7 @@ Namespace API.PornHub
Dim r$ = Responser.GetResponse(URL) Dim r$ = Responser.GetResponse(URL)
If Not r.IsEmptyString Then If Not r.IsEmptyString Then
Dim l As List(Of UserVideo) = RegexFields(Of UserVideo)(r, {RegexUserVideos}, {6, 7, 3, 10}) Dim l As List(Of UserVideo) = RegexFields(Of UserVideo)(r, {RegexUserVideos}, {6, 7, 3, 10})
If l.ListExists Then l = l.ListTake(3, l.Count).ToList If l.ListExists And Not SiteMode = SiteModes.Playlists Then l = l.ListTake(3, l.Count).ToList
If l.ListExists Then If l.ListExists Then
If IsUser Then If IsUser Then
If Type = VideoTypes.Favorite Then If Type = VideoTypes.Favorite Then
@@ -419,6 +444,15 @@ Namespace API.PornHub
ProgressPre.Perform() ProgressPre.Perform()
End Try End Try
End Sub End Sub
Private Sub GetPlaylistToken(ByVal Token As CancellationToken)
Dim URL$ = GetNonUserUrl(0)
Try
Dim r$ = Responser.GetResponse(URL)
If Not r.IsEmptyString Then PlaylistToken = RegexReplace(r, RegexDataToken)
Catch ex As Exception
ProcessException(ex, Token, $"token getting error [{URL}]")
End Try
End Sub
#End Region #End Region
#Region "Download GIF" #Region "Download GIF"
Private Sub DownloadUserGifs(ByVal Token As CancellationToken) Private Sub DownloadUserGifs(ByVal Token As CancellationToken)

View File

@@ -23,9 +23,6 @@ Imports CView = SCrawler.API.Reddit.IRedditView.View
Imports CPeriod = SCrawler.API.Reddit.IRedditView.Period Imports CPeriod = SCrawler.API.Reddit.IRedditView.Period
Namespace API.Reddit Namespace API.Reddit
Friend Class UserData : Inherits UserDataBase : Implements IChannelLimits, IRedditView Friend Class UserData : Inherits UserDataBase : Implements IChannelLimits, IRedditView
#Region "XML names"
Private Const Name_TrueName As String = "TrueName"
#End Region
#Region "Declarations" #Region "Declarations"
Private Const CannelsLabelName As String = "Channels" Private Const CannelsLabelName As String = "Channels"
Friend Const CannelsLabelName_ChannelsForm As String = "RChannels" Friend Const CannelsLabelName_ChannelsForm As String = "RChannels"

View File

@@ -20,9 +20,6 @@ Namespace API.ThisVid
Private Const Name_DownloadPrivate As String = "DownloadPrivate" Private Const Name_DownloadPrivate As String = "DownloadPrivate"
Private Const Name_DownloadFavourite As String = "DownloadFavourite" Private Const Name_DownloadFavourite As String = "DownloadFavourite"
Private Const Name_DifferentFolders As String = "DifferentFolders" Private Const Name_DifferentFolders As String = "DifferentFolders"
Private Const Name_TrueName As String = "TrueName"
Private Const Name_SiteMode As String = "SiteMode"
Private Const Name_Arguments As String = "Arguments"
#End Region #End Region
#Region "Structures" #Region "Structures"
Private Structure Album : Implements IRegExCreator Private Structure Album : Implements IRegExCreator

View File

@@ -17,9 +17,6 @@ Imports UTypes = SCrawler.API.Base.UserMedia.Types
Namespace API.XVIDEOS Namespace API.XVIDEOS
Friend Class UserData : Inherits UserDataBase Friend Class UserData : Inherits UserDataBase
#Region "XML names" #Region "XML names"
Private Const Name_SiteMode As String = "SiteMode"
Private Const Name_TrueName As String = "TrueName"
Private Const Name_Arguments As String = "Arguments"
Private Const Name_PersonType As String = "PersonType" Private Const Name_PersonType As String = "PersonType"
#End Region #End Region
#Region "Structures" #Region "Structures"

View File

@@ -18,10 +18,7 @@ Imports UTypes = SCrawler.API.Base.UserMedia.Types
Namespace API.Xhamster Namespace API.Xhamster
Friend Class UserData : Inherits UserDataBase Friend Class UserData : Inherits UserDataBase
#Region "XML names" #Region "XML names"
Private Const Name_TrueName As String = "TrueName"
Private Const Name_Gender As String = "Gender" Private Const Name_Gender As String = "Gender"
Private Const Name_SiteMode As String = "SiteMode"
Private Const Name_Arguments As String = "Arguments"
#End Region #End Region
#Region "Declarations" #Region "Declarations"
Friend Overrides ReadOnly Property FeedIsUser As Boolean Friend Overrides ReadOnly Property FeedIsUser As Boolean