1
0
Fork 0
mirror of https://github.com/ytdl-org/youtube-dl.git synced 2024-11-18 08:16:10 +00:00

[XVideos] Add XVideosCategoryIE for category and tag pages

This commit is contained in:
dirkf 2023-10-16 04:11:53 +01:00
parent 352ec03ec9
commit 45088c6301
2 changed files with 90 additions and 0 deletions

View file

@ -1621,6 +1621,7 @@ from .xtube import XTubeUserIE, XTubeIE
from .xuite import XuiteIE from .xuite import XuiteIE
from .xvideos import ( from .xvideos import (
XVideosIE, XVideosIE,
XVideosCategoryIE,
XVideosChannelIE, XVideosChannelIE,
XVideosPlaylistIE, XVideosPlaylistIE,
XVideosRelatedIE, XVideosRelatedIE,

View file

@ -471,6 +471,95 @@ class XVideosPlaylistIE(XVideosPlaylistBaseIE):
return title return title
class XVideosCategoryIE(XVideosPlaylistBaseIE):
_VALID_URL = r'''(?x)
https?://
(?:[^/]+\.)?xvideos\d*\.com/
(?P<type>(?P<c>c)|tags)
(?P<sub>(?:/[dmqs]:[\w-]+)*)/(?P<id>\w+(?(c)-\d+))
(?:/(?P<pnum>\d+))?
'''
_TESTS = [{
'note': 'videos in category for this month',
'url': 'https://www.xvideos.com/c/m:month/ASMR-229',
'info_dict': {
'id': 'c/ASMR-229/m:month',
'title': 'Category:ASMR (m=month)',
},
'playlist_mincount': 100,
}, {
'note': 'page 3 of videos in category for this month',
'url': 'https://www.xvideos.com/c/m:month/ASMR-229/2',
'info_dict': {
'id': 'c/ASMR-229/m:month/2',
'title': 'Category:ASMR (m=month,p3)',
},
'playlist_count': 27,
}, {
'note': 'videos tagged yiff',
'url': 'https://www.xvideos.com/tags/yiff',
'info_dict': {
'id': 'tags/yiff',
'title': 'Tag:yiff',
},
'playlist_mincount': 80,
}, {
'note': 'page 3 of videos tagged yiff',
'url': 'https://www.xvideos.com/tags/yiff/2',
'info_dict': {
'id': 'tags/yiff/2',
'title': 'Tag:yiff (p3)',
},
'playlist_count': 27,
}, {
'note': 'long videos tagged yiff',
'url': 'https://www.xvideos.com/tags/d:10-20min/yiff',
'info_dict': {
'id': 'tags/yiff/d:10-20min',
'title': 'Tag:yiff (d=10-20min)',
},
'playlist_mincount': 20,
'playlist_maxcount': 40,
}, {
'note': 'videos tagged yiff, longest first',
'url': 'https://www.xvideos.com/tags/s:length/yiff',
'info_dict': {
'id': 'tags/yiff/s:length',
'title': 'Tag:yiff (s=length)',
},
'playlist': [{
'info_dict': {
'id': r're:\d+',
'ext': 'mp4',
'title': r're:\w+',
'uploader': r're:\w+',
'age_limit': int,
'duration': 'lambda c: c >= 1321' # for video 38266161
},
}],
}]
def _get_playlist_id(self, playlist_id, **kwargs):
url = kwargs['url']
c_type, sub = self._match_valid_url(url).group('type', 'sub')
sub = sub.split('/')
sub.append(kwargs.get('pnum'))
return join_nonempty(c_type, playlist_id, *sub, delim='/')
def _get_title(self, page, playlist_id, **kwargs):
pl_id = playlist_id.split('/')
title = '%s:%s' % ((
'Category', pl_id[1].rsplit('-', 1)[0]) if pl_id[0] == 'c'
else ('Tag', pl_id[1]))
pnum = int_or_none(pl_id[-1])
if pnum:
pl_id[-1] = 'p%d' % (pnum + 1)
subs = ','.join(x.replace(':', '=', 1) for x in pl_id[2:])
if subs:
title = '%s (%s)' % (title, subs)
return title
class XVideosChannelIE(XVideosPlaylistBaseIE): class XVideosChannelIE(XVideosPlaylistBaseIE):
_VALID_URL = r'''(?x) _VALID_URL = r'''(?x)
https?:// https?://