mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 14:45:14 +00:00 
			
		
		
		
	| @@ -1,115 +1,90 @@ | |||||||
| # coding: utf-8 | # coding: utf-8 | ||||||
|  |  | ||||||
| from __future__ import unicode_literals | from __future__ import unicode_literals | ||||||
|  |  | ||||||
| import datetime |  | ||||||
|  |  | ||||||
| from .common import InfoExtractor | from .common import InfoExtractor | ||||||
|  | from ..utils import ( | ||||||
|  |     int_or_none, | ||||||
|  |     float_or_none, | ||||||
|  |     qualities, | ||||||
|  | ) | ||||||
|  |  | ||||||
|  |  | ||||||
| class GfycatIE(InfoExtractor): | class GfycatIE(InfoExtractor): | ||||||
|     _VALID_URL = r'https?://(?:www\.)?gfycat\.com/(?P<id>[^/?#]+)' |     _VALID_URL = r'https?://(?:www\.)?gfycat\.com/(?P<id>[^/?#]+)' | ||||||
|     _TESTS = [ |     _TEST = { | ||||||
|         { |  | ||||||
|         'url': 'http://gfycat.com/DeadlyDecisiveGermanpinscher', |         'url': 'http://gfycat.com/DeadlyDecisiveGermanpinscher', | ||||||
|         'info_dict': { |         'info_dict': { | ||||||
|             'id': 'DeadlyDecisiveGermanpinscher', |             'id': 'DeadlyDecisiveGermanpinscher', | ||||||
|                 'title':       'Ghost in the Shell', |  | ||||||
|             'ext': 'mp4', |             'ext': 'mp4', | ||||||
|                 'upload_date': '20140913' |             'title': 'Ghost in the Shell', | ||||||
|  |             'timestamp': 1410656006, | ||||||
|  |             'upload_date': '20140914', | ||||||
|  |             'uploader': 'anonymous', | ||||||
|  |             'duration': 10.4, | ||||||
|  |             'view_count': int, | ||||||
|  |             'like_count': int, | ||||||
|  |             'dislike_count': int, | ||||||
|  |             'categories': list, | ||||||
|  |             'age_limit': 0, | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|         },{ |  | ||||||
|             'url': 'http://gfycat.com/pleasinghilariouskusimanse', |  | ||||||
|             'info_dict': { |  | ||||||
|                 'id':          'pleasinghilariouskusimanse', |  | ||||||
|                 'title':       'PleasingHilariousKusimanse', |  | ||||||
|                 'ext':         'webm', |  | ||||||
|                 'upload_date': '20150412' |  | ||||||
|             }, |  | ||||||
|             'params': { |  | ||||||
|                 'format': 'webm', |  | ||||||
|             }, |  | ||||||
|         },{ |  | ||||||
|             'url': 'http://gfycat.com/requiredunkemptbuzzard', |  | ||||||
|             'info_dict': { |  | ||||||
|                 'id':          'requiredunkemptbuzzard', |  | ||||||
|                 'title':       'Headshot!', |  | ||||||
|                 'ext':         'gif', |  | ||||||
|                 'upload_date': '20150129' |  | ||||||
|             }, |  | ||||||
|             'params': { |  | ||||||
|                 'format': 'gif', |  | ||||||
|             }, |  | ||||||
|         }, |  | ||||||
|     ] |  | ||||||
|  |  | ||||||
|     def _real_extract(self, url): |     def _real_extract(self, url): | ||||||
|         video_id = self._match_id(url) |         video_id = self._match_id(url) | ||||||
|         json     = self._download_json("http://gfycat.com/cajax/get/" + video_id, video_id, 'Downloading video info')['gfyItem'] |  | ||||||
|  |  | ||||||
|         # Title |         gfy = self._download_json( | ||||||
|         # Use user title first, else fallback to url formated name |             'http://gfycat.com/cajax/get/%s' % video_id, | ||||||
|         if json['title']: |             video_id, 'Downloading video info')['gfyItem'] | ||||||
|             video_title = json['title'] |  | ||||||
|         else: |  | ||||||
|             video_title = json['gfyName'] |  | ||||||
|  |  | ||||||
|         # Formats |         title = gfy.get('title') or gfy['gfyName'] | ||||||
|         # Pref: mp4, webm, gif |         description = gfy.get('description') | ||||||
|         formats = [{ |         timestamp = int_or_none(gfy.get('createDate')) | ||||||
|             'format_id':  'mp4', |         uploader = gfy.get('userName') | ||||||
|             'ext':        'mp4', |         view_count = int_or_none(gfy.get('views')) | ||||||
|             'url':        json['mp4Url'], |         like_count = int_or_none(gfy.get('likes')) | ||||||
|             'width':      json['width'], |         dislike_count = int_or_none(gfy.get('dislikes')) | ||||||
|             'height':     json['height'], |         age_limit = 18 if gfy.get('nsfw') == '1' else 0 | ||||||
|             'fps':        json['frameRate'], |  | ||||||
|             'filesize':   json['mp4Size'], |  | ||||||
|             'preference': 2 |  | ||||||
|         }, { |  | ||||||
|             'format_id': 'webm', |  | ||||||
|             'ext':       'webm', |  | ||||||
|             'url':        json['webmUrl'], |  | ||||||
|             'width':      json['width'], |  | ||||||
|             'height':     json['height'], |  | ||||||
|             'fps':        json['frameRate'], |  | ||||||
|             'filesize':   json['webmSize'], |  | ||||||
|             'preference': 1 |  | ||||||
|         }, { |  | ||||||
|             'format_id':  'gif', |  | ||||||
|             'ext':        'gif', |  | ||||||
|             'url':        json['gifUrl'], |  | ||||||
|             'width':      json['width'], |  | ||||||
|             'height':     json['height'], |  | ||||||
|             'fps':        json['frameRate'], |  | ||||||
|             'filesize':   json['gifSize'], |  | ||||||
|             'preference': 0 |  | ||||||
|         }] |  | ||||||
|  |  | ||||||
|  |         width = int_or_none(gfy.get('width')) | ||||||
|  |         height = int_or_none(gfy.get('height')) | ||||||
|  |         fps = int_or_none(gfy.get('frameRate')) | ||||||
|  |         num_frames = int_or_none(gfy.get('numFrames')) | ||||||
|  |  | ||||||
|  |         duration = float_or_none(num_frames, fps) if num_frames and fps else None | ||||||
|  |  | ||||||
|  |         categories = gfy.get('tags') or gfy.get('extraLemmas') or [] | ||||||
|  |  | ||||||
|  |         FORMATS = ('gif', 'webm', 'mp4') | ||||||
|  |         quality = qualities(FORMATS) | ||||||
|  |  | ||||||
|  |         formats = [] | ||||||
|  |         for format_id in FORMATS: | ||||||
|  |             video_url = gfy.get('%sUrl' % format_id) | ||||||
|  |             if not video_url: | ||||||
|  |                 continue | ||||||
|  |             filesize = gfy.get('%sSize' % format_id) | ||||||
|  |             formats.append({ | ||||||
|  |                 'url': video_url, | ||||||
|  |                 'format_id': format_id, | ||||||
|  |                 'width': width, | ||||||
|  |                 'height': height, | ||||||
|  |                 'fps': fps, | ||||||
|  |                 'filesize': filesize, | ||||||
|  |                 'quality': quality(format_id), | ||||||
|  |             }) | ||||||
|         self._sort_formats(formats) |         self._sort_formats(formats) | ||||||
|  |  | ||||||
|         # Date |  | ||||||
|         date = datetime.datetime.fromtimestamp( |  | ||||||
|             int(json['createDate']) |  | ||||||
|         ).strftime('%Y%m%d') |  | ||||||
|          |  | ||||||
|         # Length |  | ||||||
|         duration = json['numFrames'] / json['frameRate'] |  | ||||||
|          |  | ||||||
|         # Age limit |  | ||||||
|         # 1 = nsfw / 0 = sfw |  | ||||||
|         if json['nsfw'] == 1: |  | ||||||
|             age_limit = 18 |  | ||||||
|         else: |  | ||||||
|             age_limit = 0 |  | ||||||
|          |  | ||||||
|         return { |         return { | ||||||
|             'id': video_id, |             'id': video_id, | ||||||
|             'title':       video_title, |             'title': title, | ||||||
|             'formats':     formats, |             'description': description, | ||||||
|             'creator':     json['userName'], |             'timestamp': timestamp, | ||||||
|             'description': json['description'], |             'uploader': uploader, | ||||||
|             'upload_date': date, |  | ||||||
|             'categories':  json['tags'], |  | ||||||
|             'age_limit':   age_limit, |  | ||||||
|             'duration': duration, |             'duration': duration, | ||||||
|             'view_count':  json['views'] |             'view_count': view_count, | ||||||
|  |             'like_count': like_count, | ||||||
|  |             'dislike_count': dislike_count, | ||||||
|  |             'categories': categories, | ||||||
|  |             'age_limit': age_limit, | ||||||
|  |             'formats': formats, | ||||||
|         } |         } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sergey M․
					Sergey M․