]+\bhref=[^>]+>([^<]+)', div)
+
+ return {
+ 'id': video_id,
+ 'uploader': video_uploader,
+ 'upload_date': upload_date,
+ 'title': title,
+ 'thumbnail': thumbnail,
+ 'duration': duration,
+ 'view_count': view_count,
+ 'like_count': like_count,
+ 'dislike_count': dislike_count,
+ 'comment_count': comment_count,
+ 'formats': formats,
+ 'age_limit': 18,
+ 'tags': extract_list('tags'),
+ 'categories': extract_list('categories'),
+ 'subtitles': subtitles,
+ }
+
+ #def _real_initialize(self):
+ # self._login()
+
+
+class PornHubPlaylistBaseIE(PornHubBaseIE):
+ def _extract_entries(self, webpage, host):
+ # Only process container div with main playlist content skipping
+ # drop-down menu that uses similar pattern for videos (see
+ # https://github.com/ytdl-org/youtube-dl/issues/11594).
+ container = self._search_regex(
+ r'(?s)(]+class=["\']container.+)', webpage,
+ 'container', default=webpage)
+
+ return [
+ self.url_result(
+ 'http://www.%s/%s' % (host, video_url),
+ PornHubIE.ie_key(), video_title=title)
+ for video_url, title in orderedSet(re.findall(
+ r'href="/?(view_video\.php\?.*\bviewkey=[\da-z]+[^"]*)"[^>]*\s+title="([^"]+)"',
+ container))
+ ]
+
+ def _real_extract(self, url):
+ mobj = re.match(self._VALID_URL, url)
+ host = mobj.group('host')
+ playlist_id = mobj.group('id')
+
+ webpage = self._download_webpage(url, playlist_id)
+
+ entries = self._extract_entries(webpage, host)
+
+ playlist = self._parse_json(
+ self._search_regex(
+ r'(?:playlistObject|PLAYLIST_VIEW)\s*=\s*({.+?});', webpage,
+ 'playlist', default='{}'),
+ playlist_id, fatal=False)
+ title = playlist.get('title') or self._search_regex(
+ r'>Videos\s+in\s+(.+?)\s+[Pp]laylist<', webpage, 'title', fatal=False)
+
+ return self.playlist_result(
+ entries, playlist_id, title, playlist.get('description'))
+
+
+class PornHubPlaylistIE(PornHubPlaylistBaseIE):
+ _VALID_URL = r'https?://(?:[^/]+\.)?(?Ppornhub\.(?:com|net))/playlist/(?P\d+)'
+ _TESTS = [{
+ 'url': 'http://www.pornhub.com/playlist/4667351',
+ 'info_dict': {
+ 'id': '4667351',
+ 'title': 'Nataly Hot',
+ },
+ 'playlist_mincount': 2,
+ }, {
+ 'url': 'https://de.pornhub.com/playlist/4667351',
+ 'only_matching': True,
+ }]
+
+
+class PornHubUserVideosIE(PornHubPlaylistBaseIE):
+ _VALID_URL = r'https?://(?:[^/]+\.)?(?Ppornhub\.(?:com|net))/(?:(?:user|channel)s|model|pornstar)/(?P[^/]+)/videos'
+ _TESTS = [{
+ 'url': 'http://www.pornhub.com/users/zoe_ph/videos/public',
+ 'info_dict': {
+ 'id': 'zoe_ph',
+ },
+ 'playlist_mincount': 171,
+ }, {
+ 'url': 'http://www.pornhub.com/users/rushandlia/videos',
+ 'only_matching': True,
+ }, {
+ # default sorting as Top Rated Videos
+ 'url': 'https://www.pornhub.com/channels/povd/videos',
+ 'info_dict': {
+ 'id': 'povd',
+ },
+ 'playlist_mincount': 293,
+ }, {
+ # Top Rated Videos
+ 'url': 'https://www.pornhub.com/channels/povd/videos?o=ra',
+ 'only_matching': True,
+ }, {
+ # Most Recent Videos
+ 'url': 'https://www.pornhub.com/channels/povd/videos?o=da',
+ 'only_matching': True,
+ }, {
+ # Most Viewed Videos
+ 'url': 'https://www.pornhub.com/channels/povd/videos?o=vi',
+ 'only_matching': True,
+ }, {
+ 'url': 'http://www.pornhub.com/users/zoe_ph/videos/public',
+ 'only_matching': True,
+ }, {
+ 'url': 'https://www.pornhub.com/model/jayndrea/videos/upload',
+ 'only_matching': True,
+ }, {
+ 'url': 'https://www.pornhub.com/pornstar/jenny-blighe/videos/upload',
+ 'only_matching': True,
+ }]
+
+ def _real_extract(self, url):
+ mobj = re.match(self._VALID_URL, url)
+ host = mobj.group('host')
+ user_id = mobj.group('id')
+
+ entries = []
+ for page_num in itertools.count(1):
+ try:
+ webpage = self._download_webpage(
+ url, user_id, 'Downloading page %d' % page_num,
+ query={'page': page_num})
+ except ExtractorError as e:
+ if isinstance(e.cause, compat_HTTPError) and e.cause.code == 404:
+ break
+ raise
+ page_entries = self._extract_entries(webpage, host)
+ if not page_entries:
+ break
+ entries.extend(page_entries)
+
+ return self.playlist_result(entries, user_id)
diff --git a/youtube_dl/extractor/pornhub.py b/youtube_dl/extractor/pornhub.py
index 12d60d610..c83a1ee5c 100644
--- a/youtube_dl/extractor/pornhub.py
+++ b/youtube_dl/extractor/pornhub.py
@@ -60,6 +60,24 @@ class PornHubIE(PornHubBaseIE):
(?P[\da-z]+)
'''
_TESTS = [{
+ 'url': 'http://www.pornhub.com/view_video.php?viewkey=648719015',
+ 'md5': '1e19b41231a02eba417839222ac9d58e',
+ 'info_dict': {
+ 'id': '648719015',
+ 'ext': 'mp4',
+ 'title': 'Seductive Indian beauty strips down and fingers her pink pussy',
+ 'uploader': 'Babes',
+ 'upload_date': '20130628',
+ 'duration': 361,
+ 'view_count': int,
+ 'like_count': int,
+ 'dislike_count': int,
+ 'comment_count': int,
+ 'age_limit': 18,
+ 'tags': list,
+ 'categories': list,
+ },
+ }, {
'url': 'https://fr.pornhubpremium.com/view_video.php?viewkey=ph5cd051fa7a6fc',
'md5': '42a65f5b095445ce2089954990fd7515',
'info_dict': {
@@ -80,24 +98,7 @@ class PornHubIE(PornHubBaseIE):
'params': {
'username': "tdsist",
'password': "ZtOUktu0QP",
- },
- }, {
- 'url': 'http://www.pornhub.com/view_video.php?viewkey=648719015',
- 'md5': '1e19b41231a02eba417839222ac9d58e',
- 'info_dict': {
- 'id': '648719015',
- 'ext': 'mp4',
- 'title': 'Seductive Indian beauty strips down and fingers her pink pussy',
- 'uploader': 'Babes',
- 'upload_date': '20130628',
- 'duration': 361,
- 'view_count': int,
- 'like_count': int,
- 'dislike_count': int,
- 'comment_count': int,
- 'age_limit': 18,
- 'tags': list,
- 'categories': list,
+ 'skip_download': True,
},
}, {
# non-ASCII title
@@ -106,7 +107,7 @@ class PornHubIE(PornHubBaseIE):
'id': '1331683002',
'ext': 'mp4',
'title': '重庆婷婷女王足交',
- 'uploader': 'Unknown',
+ 'uploader': 'unknown',
'upload_date': '20150213',
'duration': 1753,
'view_count': int,
@@ -122,13 +123,14 @@ class PornHubIE(PornHubBaseIE):
},
}, {
# subtitles
- 'url': 'https://www.pornhub.com/view_video.php?viewkey=ph5af5fef7c2aa7',
+ 'url': 'https://fr.pornhub.com/view_video.php?viewkey=ph5a73f8c84d1a9',
'info_dict': {
- 'id': 'ph5af5fef7c2aa7',
+ 'id': 'ph5a73f8c84d1a9',
'ext': 'mp4',
- 'title': 'BFFS - Cute Teen Girls Share Cock On the Floor',
- 'uploader': 'BFFs',
- 'duration': 622,
+ 'title': 'Watching Porn With step Sister',
+ 'uploader': 'MissaX',
+ 'upload_date': '20180202',
+ 'duration': 1481,
'view_count': int,
'like_count': int,
'dislike_count': int,
@@ -138,7 +140,8 @@ class PornHubIE(PornHubBaseIE):
'categories': list,
'subtitles': {
'en': [{
- "ext": 'srt'
+ 'url': 'https://www.pornhub.com/video/caption?id=152944181',
+ 'ext': 'srt'
}]
},
},