mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 22:55:18 +00:00 
			
		
		
		
	Merge branch 'moviefap' of https://github.com/gebn/youtube-dl into gebn-moviefap
This commit is contained in:
		| @@ -311,6 +311,7 @@ from .morningstar import MorningstarIE | |||||||
| from .motherless import MotherlessIE | from .motherless import MotherlessIE | ||||||
| from .motorsport import MotorsportIE | from .motorsport import MotorsportIE | ||||||
| from .movieclips import MovieClipsIE | from .movieclips import MovieClipsIE | ||||||
|  | from .moviefap import MovieFapIE | ||||||
| from .moviezine import MoviezineIE | from .moviezine import MoviezineIE | ||||||
| from .movshare import MovShareIE | from .movshare import MovShareIE | ||||||
| from .mtv import ( | from .mtv import ( | ||||||
|   | |||||||
							
								
								
									
										135
									
								
								youtube_dl/extractor/moviefap.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								youtube_dl/extractor/moviefap.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,135 @@ | |||||||
|  | from __future__ import unicode_literals | ||||||
|  |  | ||||||
|  | import re | ||||||
|  |  | ||||||
|  | from .common import InfoExtractor | ||||||
|  | from ..utils import ( | ||||||
|  |     xpath_text, | ||||||
|  |     str_to_int | ||||||
|  | ) | ||||||
|  | from ..compat import compat_str | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class MovieFapIE(InfoExtractor): | ||||||
|  |     _VALID_URL = r'https?://(?:www\.)?moviefap\.com/videos/(?P<id>[0-9a-f]+)/(?P<name>[a-z-_]+)' | ||||||
|  |     _TESTS = [{ | ||||||
|  |         # normal, multi-format video | ||||||
|  |         'url': 'http://www.moviefap.com/videos/be9867c9416c19f54a4a/experienced-milf-amazing-handjob.html', | ||||||
|  |         'md5': '26624b4e2523051b550067d547615906', | ||||||
|  |         'info_dict': { | ||||||
|  |             'id': 'be9867c9416c19f54a4a', | ||||||
|  |             'ext': 'mp4', | ||||||
|  |             'title': 'Experienced MILF Amazing Handjob', | ||||||
|  |             'description': 'Experienced MILF giving an Amazing Handjob', | ||||||
|  |             'thumbnail': 'http://img.moviefap.com/a16:9w990r/thumbs/be/322032-20l.jpg', | ||||||
|  |             'uploader_id': 'darvinfred06', | ||||||
|  |             'display_id': 'experienced-milf-amazing-handjob', | ||||||
|  |             'categories': ['Amateur', 'Masturbation', 'Mature', 'Flashing'] | ||||||
|  |         } | ||||||
|  |     }, { | ||||||
|  |         # quirky single-format case where the extension is given as fid, but the video is really an flv | ||||||
|  |         'url': 'http://www.moviefap.com/videos/e5da0d3edce5404418f5/jeune-couple-russe.html', | ||||||
|  |         'md5': 'fa56683e291fc80635907168a743c9ad', | ||||||
|  |         'info_dict': { | ||||||
|  |             'id': 'e5da0d3edce5404418f5', | ||||||
|  |             'ext': 'flv', | ||||||
|  |             'title': 'Jeune Couple Russe', | ||||||
|  |             'description': 'Amateur', | ||||||
|  |             'thumbnail': 'http://pic.moviefap.com/thumbs/e5/949-18l.jpg', | ||||||
|  |             'uploader_id': 'whiskeyjar', | ||||||
|  |             'display_id': 'jeune-couple-russe', | ||||||
|  |             'categories': ['Amateur', 'Teen'] | ||||||
|  |         } | ||||||
|  |     }] | ||||||
|  |  | ||||||
|  |     @staticmethod | ||||||
|  |     def __get_thumbnail_data(xml): | ||||||
|  |  | ||||||
|  |         """ | ||||||
|  |         Constructs a list of video thumbnails from timeline preview images. | ||||||
|  |         :param xml: the information XML document to parse | ||||||
|  |         """ | ||||||
|  |  | ||||||
|  |         timeline = xml.find('timeline') | ||||||
|  |         if timeline is None: | ||||||
|  |             # not all videos have the data - ah well | ||||||
|  |             return [] | ||||||
|  |  | ||||||
|  |         # get the required information from the XML | ||||||
|  |         width = str_to_int(timeline.find('imageWidth').text) | ||||||
|  |         height = str_to_int(timeline.find('imageHeight').text) | ||||||
|  |         first = str_to_int(timeline.find('imageFirst').text) | ||||||
|  |         last = str_to_int(timeline.find('imageLast').text) | ||||||
|  |         pattern = timeline.find('imagePattern').text | ||||||
|  |  | ||||||
|  |         # generate the list of thumbnail information dicts | ||||||
|  |         thumbnails = [] | ||||||
|  |         for i in range(first, last + 1): | ||||||
|  |             thumbnails.append({ | ||||||
|  |                 'url': pattern.replace('#', compat_str(i)), | ||||||
|  |                 'width': width, | ||||||
|  |                 'height': height | ||||||
|  |             }) | ||||||
|  |         return thumbnails | ||||||
|  |  | ||||||
|  |     def _real_extract(self, url): | ||||||
|  |  | ||||||
|  |         video_id = self._match_id(url) | ||||||
|  |         webpage = self._download_webpage(url, video_id) | ||||||
|  |  | ||||||
|  |         # find and retrieve the XML document detailing video download URLs | ||||||
|  |         info_url = self._html_search_regex( | ||||||
|  |             r'flashvars\.config = escape\("(.+?)"', webpage, 'player parameters') | ||||||
|  |         xml = self._download_xml(info_url, video_id) | ||||||
|  |  | ||||||
|  |         # find the video container | ||||||
|  |         if xml.find('videoConfig') is not None: | ||||||
|  |             ext = xml.find('videoConfig').find('type').text | ||||||
|  |         else: | ||||||
|  |             ext = 'flv'  # guess... | ||||||
|  |  | ||||||
|  |         # work out the video URL(s) | ||||||
|  |         formats = [] | ||||||
|  |         if xml.find('videoLink') is not None: | ||||||
|  |             # single format available | ||||||
|  |             formats.append({ | ||||||
|  |                 'url': xpath_text(xml, 'videoLink', 'url', True), | ||||||
|  |                 'ext': ext | ||||||
|  |             }) | ||||||
|  |         else: | ||||||
|  |             # multiple formats available | ||||||
|  |             for item in xml.find('quality').findall('item'): | ||||||
|  |                 resolution = xpath_text(item, 'res', 'resolution', True)  # 480p etc. | ||||||
|  |                 formats.append({ | ||||||
|  |                     'url': xpath_text(item, 'videoLink', 'url', True), | ||||||
|  |                     'ext': ext, | ||||||
|  |                     'resolution': resolution, | ||||||
|  |                     'height': int(re.findall(r'\d+', resolution)[0]) | ||||||
|  |                 }) | ||||||
|  |  | ||||||
|  |             self._sort_formats(formats) | ||||||
|  |  | ||||||
|  |         return { | ||||||
|  |             'id': video_id, | ||||||
|  |             'formats': formats, | ||||||
|  |             'title': self._html_search_regex( | ||||||
|  |                 r'<div id="view_title"><h1>(.*?)</h1>', webpage, 'title'), | ||||||
|  |             'display_id': re.compile(self._VALID_URL).match(url).group('name'), | ||||||
|  |             'thumbnails': self.__get_thumbnail_data(xml), | ||||||
|  |             'thumbnail': xpath_text(xml, 'startThumb', 'thumbnail'), | ||||||
|  |             'description': self._html_search_regex( | ||||||
|  |                 r'name="description" value="(.*?)"', webpage, 'description', fatal=False), | ||||||
|  |             'uploader_id': self._html_search_regex( | ||||||
|  |                 r'name="username" value="(.*?)"', webpage, 'uploader_id', fatal=False), | ||||||
|  |             'view_count': str_to_int(self._html_search_regex( | ||||||
|  |                 r'<br>Views <strong>([0-9]+)</strong>', webpage, 'view_count, fatal=False')), | ||||||
|  |             'average_rating': float(self._html_search_regex( | ||||||
|  |                 r'Current Rating<br> <strong>(.*?)</strong>', webpage, 'average_rating', fatal=False)), | ||||||
|  |             'comment_count': str_to_int(self._html_search_regex( | ||||||
|  |                 r'<span id="comCount">([0-9]+)</span>', webpage, 'comment_count', fatal=False)), | ||||||
|  |             'age_limit': 18, | ||||||
|  |             'webpage_url': self._html_search_regex( | ||||||
|  |                 r'name="link" value="(.*?)"', webpage, 'webpage_url', fatal=False), | ||||||
|  |             'categories': self._html_search_regex( | ||||||
|  |                 r'</div>\s*(.*?)\s*<br>', webpage, 'categories', fatal=False).split(', ') | ||||||
|  |         } | ||||||
		Reference in New Issue
	
	Block a user
	 Sergey M․
					Sergey M․