mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +00:00 
			
		
		
		
	[youku] Modernize somewhat
This commit is contained in:
		| @@ -1,5 +1,7 @@ | |||||||
| # coding: utf-8 | # coding: utf-8 | ||||||
|  |  | ||||||
|  | from __future__ import unicode_literals | ||||||
|  |  | ||||||
| import json | import json | ||||||
| import math | import math | ||||||
| import random | import random | ||||||
| @@ -13,18 +15,25 @@ from ..utils import ( | |||||||
|  |  | ||||||
|  |  | ||||||
| class YoukuIE(InfoExtractor): | class YoukuIE(InfoExtractor): | ||||||
|     _VALID_URL =  r'(?:(?:http://)?(?:v|player)\.youku\.com/(?:v_show/id_|player\.php/sid/)|youku:)(?P<ID>[A-Za-z0-9]+)(?:\.html|/v\.swf|)' |     _VALID_URL = r'''(?x) | ||||||
|     _TEST =   { |         (?: | ||||||
|         u"url": u"http://v.youku.com/v_show/id_XNDgyMDQ2NTQw.html", |             http://(?:v|player)\.youku\.com/(?:v_show/id_|player\.php/sid/)| | ||||||
|         u"file": u"XNDgyMDQ2NTQw_part00.flv", |             youku:) | ||||||
|         u"md5": u"ffe3f2e435663dc2d1eea34faeff5b5b", |         (?P<id>[A-Za-z0-9]+)(?:\.html|/v\.swf|) | ||||||
|         u"params": {u"test": False}, |     ''' | ||||||
|         u"info_dict": { |     _TEST = { | ||||||
|             u"title": u"youtube-dl test video \"'/\\ä↭𝕐" |         'url': 'http://v.youku.com/v_show/id_XNDgyMDQ2NTQw.html', | ||||||
|  |         'md5': 'ffe3f2e435663dc2d1eea34faeff5b5b', | ||||||
|  |         'params': { | ||||||
|  |             'test': False | ||||||
|  |         }, | ||||||
|  |         'info_dict': { | ||||||
|  |             'id': 'XNDgyMDQ2NTQw_part00', | ||||||
|  |             'ext': 'flv', | ||||||
|  |             'title': 'youtube-dl test video "\'/\\ä↭𝕐' | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     def _gen_sid(self): |     def _gen_sid(self): | ||||||
|         nowTime = int(time.time() * 1000) |         nowTime = int(time.time() * 1000) | ||||||
|         random1 = random.randint(1000,1998) |         random1 = random.randint(1000,1998) | ||||||
| @@ -55,49 +64,42 @@ class YoukuIE(InfoExtractor): | |||||||
|  |  | ||||||
|     def _real_extract(self, url): |     def _real_extract(self, url): | ||||||
|         mobj = re.match(self._VALID_URL, url) |         mobj = re.match(self._VALID_URL, url) | ||||||
|         if mobj is None: |         video_id = mobj.group('id') | ||||||
|             raise ExtractorError(u'Invalid URL: %s' % url) |  | ||||||
|         video_id = mobj.group('ID') |  | ||||||
|  |  | ||||||
|         info_url = 'http://v.youku.com/player/getPlayList/VideoIDS/' + video_id |         info_url = 'http://v.youku.com/player/getPlayList/VideoIDS/' + video_id | ||||||
|  |  | ||||||
|         jsondata = self._download_webpage(info_url, video_id) |         config = self._download_json(info_url, video_id) | ||||||
|  |  | ||||||
|         self.report_extraction(video_id) |         error_code = config['data'][0].get('error_code') | ||||||
|         try: |         if error_code: | ||||||
|             config = json.loads(jsondata) |             # -8 means blocked outside China. | ||||||
|             error_code = config['data'][0].get('error_code') |             error = config['data'][0].get('error')  # Chinese and English, separated by newline. | ||||||
|             if error_code: |             raise ExtractorError(error or 'Server reported error %i' % error_code, | ||||||
|                 # -8 means blocked outside China. |                 expected=True) | ||||||
|                 error = config['data'][0].get('error')  # Chinese and English, separated by newline. |  | ||||||
|                 raise ExtractorError(error or u'Server reported error %i' % error_code, |  | ||||||
|                     expected=True) |  | ||||||
|  |  | ||||||
|             video_title =  config['data'][0]['title'] |         video_title = config['data'][0]['title'] | ||||||
|             seed = config['data'][0]['seed'] |         seed = config['data'][0]['seed'] | ||||||
|  |  | ||||||
|             format = self._downloader.params.get('format', None) |         format = self._downloader.params.get('format', None) | ||||||
|             supported_format = list(config['data'][0]['streamfileids'].keys()) |         supported_format = list(config['data'][0]['streamfileids'].keys()) | ||||||
|  |  | ||||||
|             if format is None or format == 'best': |         # TODO proper format selection | ||||||
|                 if 'hd2' in supported_format: |         if format is None or format == 'best': | ||||||
|                     format = 'hd2' |             if 'hd2' in supported_format: | ||||||
|                 else: |                 format = 'hd2' | ||||||
|                     format = 'flv' |  | ||||||
|                 ext = u'flv' |  | ||||||
|             elif format == 'worst': |  | ||||||
|                 format = 'mp4' |  | ||||||
|                 ext = u'mp4' |  | ||||||
|             else: |             else: | ||||||
|                 format = 'flv' |                 format = 'flv' | ||||||
|                 ext = u'flv' |             ext = 'flv' | ||||||
|  |         elif format == 'worst': | ||||||
|  |             format = 'mp4' | ||||||
|  |             ext = 'mp4' | ||||||
|  |         else: | ||||||
|  |             format = 'flv' | ||||||
|  |             ext = 'flv' | ||||||
|  |  | ||||||
|  |         fileid = config['data'][0]['streamfileids'][format] | ||||||
|             fileid = config['data'][0]['streamfileids'][format] |         keys = [s['k'] for s in config['data'][0]['segs'][format]] | ||||||
|             keys = [s['k'] for s in config['data'][0]['segs'][format]] |         # segs is usually a dictionary, but an empty *list* if an error occured. | ||||||
|             # segs is usually a dictionary, but an empty *list* if an error occured. |  | ||||||
|         except (UnicodeDecodeError, ValueError, KeyError): |  | ||||||
|             raise ExtractorError(u'Unable to extract info section') |  | ||||||
|  |  | ||||||
|         files_info=[] |         files_info=[] | ||||||
|         sid = self._gen_sid() |         sid = self._gen_sid() | ||||||
| @@ -106,9 +108,8 @@ class YoukuIE(InfoExtractor): | |||||||
|         #column 8,9 of fileid represent the segment number |         #column 8,9 of fileid represent the segment number | ||||||
|         #fileid[7:9] should be changed |         #fileid[7:9] should be changed | ||||||
|         for index, key in enumerate(keys): |         for index, key in enumerate(keys): | ||||||
|  |  | ||||||
|             temp_fileid = '%s%02X%s' % (fileid[0:8], index, fileid[10:]) |             temp_fileid = '%s%02X%s' % (fileid[0:8], index, fileid[10:]) | ||||||
|             download_url = 'http://f.youku.com/player/getFlvPath/sid/%s_%02X/st/flv/fileid/%s?k=%s' % (sid, index, temp_fileid, key) |             download_url = 'http://k.youku.com/player/getFlvPath/sid/%s_%02X/st/flv/fileid/%s?k=%s' % (sid, index, temp_fileid, key) | ||||||
|  |  | ||||||
|             info = { |             info = { | ||||||
|                 'id': '%s_part%02d' % (video_id, index), |                 'id': '%s_part%02d' % (video_id, index), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister