mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	Add YoutubePlaylistIE class
This commit is contained in:
		
							
								
								
									
										62
									
								
								youtube-dl
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								youtube-dl
									
									
									
									
									
								
							| @@ -676,6 +676,66 @@ class MetacafeIE(InfoExtractor): | |||||||
| 			'ext':		video_extension, | 			'ext':		video_extension, | ||||||
| 			}] | 			}] | ||||||
|  |  | ||||||
|  | class YoutubePlaylistIE(InfoExtractor): | ||||||
|  | 	"""Information Extractor for YouTube playlists.""" | ||||||
|  |  | ||||||
|  | 	_VALID_URL = r'(?:http://)?(?:\w+\.)?youtube.com/view_play_list\?p=(.+)' | ||||||
|  | 	_TEMPLATE_URL = 'http://www.youtube.com/view_play_list?p=%s&page=%s' | ||||||
|  | 	_VIDEO_INDICATOR = r'/watch\?v=(.+?)&' | ||||||
|  | 	_MORE_PAGES_INDICATOR = r'class="pagerNotCurrent">Next</a>' | ||||||
|  | 	_youtube_ie = None | ||||||
|  |  | ||||||
|  | 	def __init__(self, youtube_ie, downloader=None): | ||||||
|  | 		InfoExtractor.__init__(self, downloader) | ||||||
|  | 		self._youtube_ie = youtube_ie | ||||||
|  | 	 | ||||||
|  | 	@staticmethod | ||||||
|  | 	def suitable(url): | ||||||
|  | 		return (re.match(YoutubePlaylistIE._VALID_URL, url) is not None) | ||||||
|  |  | ||||||
|  | 	def report_download_page(self, playlist_id, pagenum): | ||||||
|  | 		"""Report attempt to download playlist page with given number.""" | ||||||
|  | 		self.to_stdout('[youtube] PL %s: Downloading page #%s' % (playlist_id, pagenum)) | ||||||
|  |  | ||||||
|  | 	def _real_initialize(self): | ||||||
|  | 		self._youtube_ie.initialize() | ||||||
|  | 	 | ||||||
|  | 	def _real_extract(self, url): | ||||||
|  | 		# Extract playlist id | ||||||
|  | 		mobj = re.match(self._VALID_URL, url) | ||||||
|  | 		if mobj is None: | ||||||
|  | 			self.to_stderr('ERROR: invalid url: %s' % url) | ||||||
|  | 			return [None] | ||||||
|  |  | ||||||
|  | 		# Download playlist pages | ||||||
|  | 		playlist_id = mobj.group(1) | ||||||
|  | 		video_ids = [] | ||||||
|  | 		pagenum = 1 | ||||||
|  |  | ||||||
|  | 		while True: | ||||||
|  | 			self.report_download_page(playlist_id, pagenum) | ||||||
|  | 			request = urllib2.Request(self._TEMPLATE_URL % (playlist_id, pagenum), None, std_headers) | ||||||
|  | 			try: | ||||||
|  | 				page = urllib2.urlopen(request).read() | ||||||
|  | 			except (urllib2.URLError, httplib.HTTPException, socket.error), err: | ||||||
|  | 				self.to_stderr('ERROR: unable to download webpage: %s' % str(err)) | ||||||
|  | 				return [None] | ||||||
|  |  | ||||||
|  | 			# Extract video identifiers | ||||||
|  | 			ids_in_page = set() | ||||||
|  | 			for mobj in re.finditer(self._VIDEO_INDICATOR, page): | ||||||
|  | 				ids_in_page.add(mobj.group(1)) | ||||||
|  | 			video_ids.extend(list(ids_in_page)) | ||||||
|  |  | ||||||
|  | 			if self._MORE_PAGES_INDICATOR not in page: | ||||||
|  | 				break | ||||||
|  | 			pagenum = pagenum + 1 | ||||||
|  |  | ||||||
|  | 		information = [] | ||||||
|  | 		for id in video_ids: | ||||||
|  | 			information.extend(self._youtube_ie.extract('http://www.youtube.com/watch?v=%s' % id)) | ||||||
|  | 		return information | ||||||
|  |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
| 	try: | 	try: | ||||||
| 		# Modules needed only when running the main program | 		# Modules needed only when running the main program | ||||||
| @@ -751,6 +811,7 @@ if __name__ == '__main__': | |||||||
| 		# Information extractors | 		# Information extractors | ||||||
| 		youtube_ie = YoutubeIE() | 		youtube_ie = YoutubeIE() | ||||||
| 		metacafe_ie = MetacafeIE(youtube_ie) | 		metacafe_ie = MetacafeIE(youtube_ie) | ||||||
|  | 		youtube_pl_ie = YoutubePlaylistIE(youtube_ie) | ||||||
|  |  | ||||||
| 		# File downloader | 		# File downloader | ||||||
| 		fd = FileDownloader({ | 		fd = FileDownloader({ | ||||||
| @@ -769,6 +830,7 @@ if __name__ == '__main__': | |||||||
| 			'ignoreerrors': opts.ignoreerrors, | 			'ignoreerrors': opts.ignoreerrors, | ||||||
| 			'ratelimit': opts.ratelimit, | 			'ratelimit': opts.ratelimit, | ||||||
| 			}) | 			}) | ||||||
|  | 		fd.add_info_extractor(youtube_pl_ie) | ||||||
| 		fd.add_info_extractor(metacafe_ie) | 		fd.add_info_extractor(metacafe_ie) | ||||||
| 		fd.add_info_extractor(youtube_ie) | 		fd.add_info_extractor(youtube_ie) | ||||||
| 		retcode = fd.download(args) | 		retcode = fd.download(args) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user