diff options
Diffstat (limited to 'youtube_dl/InfoExtractors.py')
| -rw-r--r-- | youtube_dl/InfoExtractors.py | 32 | 
1 files changed, 21 insertions, 11 deletions
| diff --git a/youtube_dl/InfoExtractors.py b/youtube_dl/InfoExtractors.py index 10d40fa65..ddb4aa16b 100644 --- a/youtube_dl/InfoExtractors.py +++ b/youtube_dl/InfoExtractors.py @@ -182,7 +182,7 @@ class YoutubeIE(InfoExtractor):  			end = "%02i:%02i:%02i,%03i" %(end/(60*60), end/60%60, end%60, end%1*1000)  			caption = unescapeHTML(caption)  			caption = unescapeHTML(caption) # double cycle, intentional -			srt += str(n) + '\n' +			srt += str(n+1) + '\n'  			srt += start + ' --> ' + end + '\n'  			srt += caption + '\n\n'  		return srt @@ -311,6 +311,11 @@ class YoutubeIE(InfoExtractor):  				self._downloader.trouble(u'ERROR: "token" parameter not in video info for unknown reason')  			return +		# Check for "rental" videos +		if 'ypc_video_rental_bar_text' in video_info and 'author' not in video_info: +			self._downloader.trouble(u'ERROR: "rental" videos not supported') +			return +  		# Start extracting information  		self.report_information_extraction(video_id) @@ -361,7 +366,8 @@ class YoutubeIE(InfoExtractor):  					srt_list = urllib2.urlopen(request).read()  				except (urllib2.URLError, httplib.HTTPException, socket.error), err:  					raise Trouble(u'WARNING: unable to download video subtitles: %s' % str(err)) -				srt_lang_list = re.findall(r'lang_code="([\w\-]+)"', srt_list) +				srt_lang_list = re.findall(r'name="([^"]*)"[^>]+lang_code="([\w\-]+)"', srt_list) +				srt_lang_list = dict((l[1], l[0]) for l in srt_lang_list)  				if not srt_lang_list:  					raise Trouble(u'WARNING: video has no closed captions')  				if self._downloader.params.get('subtitleslang', False): @@ -369,14 +375,16 @@ class YoutubeIE(InfoExtractor):  				elif 'en' in srt_lang_list:  					srt_lang = 'en'  				else: -					srt_lang = srt_lang_list[0] +					srt_lang = srt_lang_list.keys()[0]  				if not srt_lang in srt_lang_list:  					raise Trouble(u'WARNING: no closed captions found in the specified language') -				request = urllib2.Request('http://video.google.com/timedtext?hl=en&lang=%s&v=%s' % (srt_lang, video_id)) +				request = urllib2.Request('http://www.youtube.com/api/timedtext?lang=%s&name=%s&v=%s' % (srt_lang, srt_lang_list[srt_lang], video_id))  				try:  					srt_xml = urllib2.urlopen(request).read()  				except (urllib2.URLError, httplib.HTTPException, socket.error), err:  					raise Trouble(u'WARNING: unable to download video subtitles: %s' % str(err)) +				if not srt_xml: +					raise Trouble(u'WARNING: unable to download video subtitles')  				video_subtitles = self._closed_captions_xml_to_srt(srt_xml.decode('utf-8'))  			except Trouble as trouble:  				self._downloader.trouble(trouble[0]) @@ -1227,7 +1235,7 @@ class YoutubeSearchIE(InfoExtractor):  		InfoExtractor.__init__(self, downloader)  	def report_download_page(self, query, pagenum): -		"""Report attempt to download playlist page with given number.""" +		"""Report attempt to download search page with given number."""  		query = query.decode(preferredencoding())  		self._downloader.to_screen(u'[youtube] query "%s": Downloading page %s' % (query, pagenum)) @@ -1463,8 +1471,8 @@ class YoutubePlaylistIE(InfoExtractor):  	_VALID_URL = r'(?:https?://)?(?:\w+\.)?youtube\.com/(?:(?:course|view_play_list|my_playlists|artist|playlist)\?.*?(p|a|list)=|user/.*?/user/|p/|user/.*?#[pg]/c/)(?:PL)?([0-9A-Za-z-_]+)(?:/.*?/([0-9A-Za-z_-]+))?.*'  	_TEMPLATE_URL = 'http://www.youtube.com/%s?%s=%s&page=%s&gl=US&hl=en' -	_VIDEO_INDICATOR_TEMPLATE = r'/watch\?v=(.+?)&list=PL%s&' -	_MORE_PAGES_INDICATOR = r'(?m)>\s*Next\s*</a>' +	_VIDEO_INDICATOR_TEMPLATE = r'/watch\?v=(.+?)&list=(PL)?%s&' +	_MORE_PAGES_INDICATOR = r'yt-uix-pager-next'  	IE_NAME = u'youtube:playlist'  	def __init__(self, downloader=None): @@ -2281,12 +2289,14 @@ class EscapistIE(InfoExtractor):  		self.report_extraction(showName)  		try: -			webPageBytes = urllib2.urlopen(url).read() +			webPage = urllib2.urlopen(url) +			webPageBytes = webPage.read() +			m = re.match(r'text/html; charset="?([^"]+)"?', webPage.headers['Content-Type']) +			webPage = webPageBytes.decode(m.group(1) if m else 'utf-8')  		except (urllib2.URLError, httplib.HTTPException, socket.error), err:  			self._downloader.trouble(u'ERROR: unable to download webpage: ' + unicode(err))  			return -		webPage = webPageBytes.decode('utf-8')  		descMatch = re.search('<meta name="description" content="([^"]*)"', webPage)  		description = unescapeHTML(descMatch.group(1))  		imgMatch = re.search('<meta property="og:image" content="([^"]*)"', webPage) @@ -2445,11 +2455,11 @@ class XVideosIE(InfoExtractor):  		# Extract video thumbnail -		mobj = re.search(r'http://(?:img.*?\.)xvideos.com/videos/thumbs/[a-fA-F0-9]/[a-fA-F0-9]/[a-fA-F0-9]/([a-fA-F0-9.]+jpg)', webpage) +		mobj = re.search(r'http://(?:img.*?\.)xvideos.com/videos/thumbs/[a-fA-F0-9]+/[a-fA-F0-9]+/[a-fA-F0-9]+/[a-fA-F0-9]+/([a-fA-F0-9.]+jpg)', webpage)  		if mobj is None:  			self._downloader.trouble(u'ERROR: unable to extract video thumbnail')  			return -		video_thumbnail = mobj.group(1).decode('utf-8') +		video_thumbnail = mobj.group(0).decode('utf-8')  		info = {  			'id': video_id, | 
