nubilesporn.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import re
  2. from .common import InfoExtractor
  3. from ..utils import (
  4. clean_html,
  5. float_or_none,
  6. format_field,
  7. get_element_by_class,
  8. get_element_by_id,
  9. get_element_html_by_class,
  10. get_elements_by_class,
  11. int_or_none,
  12. try_call,
  13. unified_timestamp,
  14. urlencode_postdata,
  15. )
  16. class NubilesPornIE(InfoExtractor):
  17. _NETRC_MACHINE = 'nubiles-porn'
  18. _VALID_URL = r'''(?x)
  19. https://members\.nubiles-porn\.com/video/watch/(?P<id>\d+)
  20. (?:/(?P<display_id>[\w\-]+-s(?P<season>\d+)e(?P<episode>\d+)))?
  21. '''
  22. _TESTS = [{
  23. 'url': 'https://members.nubiles-porn.com/video/watch/165320/trying-to-focus-my-one-track-mind-s3e1',
  24. 'md5': 'fa7f09da8027c35e4bdf0f94f55eac82',
  25. 'info_dict': {
  26. 'id': '165320',
  27. 'title': 'Trying To Focus My One Track Mind - S3:E1',
  28. 'ext': 'mp4',
  29. 'display_id': 'trying-to-focus-my-one-track-mind-s3e1',
  30. 'thumbnail': 'https://images.nubiles-porn.com/videos/trying_to_focus_my_one_track_mind/samples/cover1280.jpg',
  31. 'description': 'md5:81f3d4372e0e39bff5c801da277a5141',
  32. 'timestamp': 1676160000,
  33. 'upload_date': '20230212',
  34. 'channel': 'Younger Mommy',
  35. 'channel_id': '64',
  36. 'channel_url': 'https://members.nubiles-porn.com/video/website/64',
  37. 'like_count': int,
  38. 'average_rating': float,
  39. 'age_limit': 18,
  40. 'categories': ['Big Boobs', 'Big Naturals', 'Blowjob', 'Brunette', 'Cowgirl', 'Girl Orgasm', 'Girl-Boy',
  41. 'Glasses', 'Hardcore', 'Milf', 'Shaved Pussy', 'Tattoos', 'YoungerMommy.com'],
  42. 'tags': list,
  43. 'cast': ['Kenzie Love'],
  44. 'availability': 'needs_auth',
  45. 'series': 'Younger Mommy',
  46. 'series_id': '64',
  47. 'season': 'Season 3',
  48. 'season_number': 3,
  49. 'episode': 'Episode 1',
  50. 'episode_number': 1,
  51. },
  52. }]
  53. def _perform_login(self, username, password):
  54. login_webpage = self._download_webpage('https://nubiles-porn.com/login', video_id=None)
  55. inputs = self._hidden_inputs(login_webpage)
  56. inputs.update({'username': username, 'password': password})
  57. self._request_webpage('https://nubiles-porn.com/authentication/login', None, data=urlencode_postdata(inputs))
  58. def _real_extract(self, url):
  59. url_match = self._match_valid_url(url)
  60. video_id = url_match.group('id')
  61. page = self._download_webpage(url, video_id)
  62. media_entries = self._parse_html5_media_entries(
  63. url, get_element_by_class('watch-page-video-wrapper', page), video_id)[0]
  64. channel_id, channel_name = self._search_regex(
  65. r'/video/website/(?P<id>\d+).+>(?P<name>\w+).com', get_element_html_by_class('site-link', page),
  66. 'channel', fatal=False, group=('id', 'name')) or (None, None)
  67. channel_name = re.sub(r'([^A-Z]+)([A-Z]+)', r'\1 \2', channel_name)
  68. return {
  69. 'id': video_id,
  70. 'title': self._search_regex('<h2>([^<]+)</h2>', page, 'title', fatal=False),
  71. 'formats': media_entries.get('formats'),
  72. 'display_id': url_match.group('display_id'),
  73. 'thumbnail': media_entries.get('thumbnail'),
  74. 'description': clean_html(get_element_html_by_class('content-pane-description', page)),
  75. 'timestamp': unified_timestamp(get_element_by_class('date', page)),
  76. 'channel': channel_name,
  77. 'channel_id': channel_id,
  78. 'channel_url': format_field(channel_id, None, 'https://members.nubiles-porn.com/video/website/%s'),
  79. 'like_count': int_or_none(get_element_by_id('likecount', page)),
  80. 'average_rating': float_or_none(get_element_by_class('score', page)),
  81. 'age_limit': 18,
  82. 'categories': try_call(lambda: list(map(clean_html, get_elements_by_class('btn', get_element_by_class('categories', page))))),
  83. 'tags': try_call(lambda: list(map(clean_html, get_elements_by_class('btn', get_elements_by_class('tags', page)[1])))),
  84. 'cast': get_elements_by_class('content-pane-performer', page),
  85. 'availability': 'needs_auth',
  86. 'series': channel_name,
  87. 'series_id': channel_id,
  88. 'season_number': int_or_none(url_match.group('season')),
  89. 'episode_number': int_or_none(url_match.group('episode')),
  90. }