summaryrefslogtreecommitdiff
path: root/youtube_dl/extractor/xnxx.py
blob: ac1ccc4043ead820283c4cba57a0bb7873de9872 (plain)
    1 # coding: utf-8
    2 from __future__ import unicode_literals
    3 
    4 import re
    5 
    6 from .common import InfoExtractor
    7 from ..utils import (
    8     determine_ext,
    9     int_or_none,
   10     NO_DEFAULT,
   11     str_to_int,
   12 )
   13 
   14 
   15 class XNXXIE(InfoExtractor):
   16     _VALID_URL = r'https?://(?:video|www)\.xnxx\.com/video-?(?P<id>[0-9a-z]+)/'
   17     _TESTS = [{
   18         'url': 'http://www.xnxx.com/video-55awb78/skyrim_test_video',
   19         'md5': '7583e96c15c0f21e9da3453d9920fbba',
   20         'info_dict': {
   21             'id': '55awb78',
   22             'ext': 'mp4',
   23             'title': 'Skyrim Test Video',
   24             'thumbnail': r're:^https?://.*\.jpg',
   25             'duration': 469,
   26             'view_count': int,
   27             'age_limit': 18,
   28         },
   29     }, {
   30         'url': 'http://video.xnxx.com/video1135332/lida_naked_funny_actress_5_',
   31         'only_matching': True,
   32     }, {
   33         'url': 'http://www.xnxx.com/video-55awb78/',
   34         'only_matching': True,
   35     }]
   36 
   37     def _real_extract(self, url):
   38         video_id = self._match_id(url)
   39 
   40         webpage = self._download_webpage(url, video_id)
   41 
   42         def get(meta, default=NO_DEFAULT, fatal=True):
   43             return self._search_regex(
   44                 r'set%s\s*\(\s*(["\'])(?P<value>(?:(?!\1).)+)\1' % meta,
   45                 webpage, meta, default=default, fatal=fatal, group='value')
   46 
   47         title = self._og_search_title(
   48             webpage, default=None) or get('VideoTitle')
   49 
   50         formats = []
   51         for mobj in re.finditer(
   52                 r'setVideo(?:Url(?P<id>Low|High)|HLS)\s*\(\s*(?P<q>["\'])(?P<url>(?:https?:)?//.+?)(?P=q)', webpage):
   53             format_url = mobj.group('url')
   54             if determine_ext(format_url) == 'm3u8':
   55                 formats.extend(self._extract_m3u8_formats(
   56                     format_url, video_id, 'mp4', entry_protocol='m3u8_native',
   57                     preference=1, m3u8_id='hls', fatal=False))
   58             else:
   59                 format_id = mobj.group('id')
   60                 if format_id:
   61                     format_id = format_id.lower()
   62                 formats.append({
   63                     'url': format_url,
   64                     'format_id': format_id,
   65                     'quality': -1 if format_id == 'low' else 0,
   66                 })
   67         self._sort_formats(formats)
   68 
   69         thumbnail = self._og_search_thumbnail(webpage, default=None) or get(
   70             'ThumbUrl', fatal=False) or get('ThumbUrl169', fatal=False)
   71         duration = int_or_none(self._og_search_property('duration', webpage))
   72         view_count = str_to_int(self._search_regex(
   73             r'id=["\']nb-views-number[^>]+>([\d,.]+)', webpage, 'view count',
   74             default=None))
   75 
   76         return {
   77             'id': video_id,
   78             'title': title,
   79             'thumbnail': thumbnail,
   80             'duration': duration,
   81             'view_count': view_count,
   82             'age_limit': 18,
   83             'formats': formats,
   84         }

Generated by cgit