| 
									
										
										
										
											2015-03-14 19:55:42 +01:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							| 
									
										
										
										
											2015-03-04 22:33:56 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | import re | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from .common import PostProcessor | 
					
						
							|  |  |  | from ..utils import PostProcessingError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MetadataFromTitlePPError(PostProcessingError): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class MetadataFromTitlePP(PostProcessor): | 
					
						
							|  |  |  |     def __init__(self, downloader, titleformat): | 
					
						
							| 
									
										
										
										
											2015-03-14 19:55:42 +01:00
										 |  |  |         super(MetadataFromTitlePP, self).__init__(downloader) | 
					
						
							| 
									
										
										
										
											2015-03-04 22:33:56 +01:00
										 |  |  |         self._titleformat = titleformat | 
					
						
							| 
									
										
										
										
											2015-03-14 19:55:42 +01:00
										 |  |  |         self._titleregex = self.format_to_regex(titleformat) | 
					
						
							| 
									
										
										
										
											2015-03-04 22:33:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-14 19:55:42 +01:00
										 |  |  |     def format_to_regex(self, fmt): | 
					
						
							| 
									
										
										
										
											2015-03-04 22:33:56 +01:00
										 |  |  |         """
 | 
					
						
							|  |  |  |         Converts a string like | 
					
						
							|  |  |  |            '%(title)s - %(artist)s' | 
					
						
							|  |  |  |         to a regex like | 
					
						
							|  |  |  |            '(?P<title>.+)\ \-\ (?P<artist>.+)' | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         lastpos = 0 | 
					
						
							| 
									
										
										
										
											2016-02-14 15:37:17 +06:00
										 |  |  |         regex = '' | 
					
						
							| 
									
										
										
										
											2015-03-04 22:33:56 +01:00
										 |  |  |         # replace %(..)s with regex group and escape other string parts | 
					
						
							|  |  |  |         for match in re.finditer(r'%\((\w+)\)s', fmt): | 
					
						
							|  |  |  |             regex += re.escape(fmt[lastpos:match.start()]) | 
					
						
							|  |  |  |             regex += r'(?P<' + match.group(1) + '>.+)' | 
					
						
							|  |  |  |             lastpos = match.end() | 
					
						
							|  |  |  |         if lastpos < len(fmt): | 
					
						
							|  |  |  |             regex += re.escape(fmt[lastpos:len(fmt)]) | 
					
						
							|  |  |  |         return regex | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def run(self, info): | 
					
						
							|  |  |  |         title = info['title'] | 
					
						
							|  |  |  |         match = re.match(self._titleregex, title) | 
					
						
							|  |  |  |         if match is None: | 
					
						
							|  |  |  |             raise MetadataFromTitlePPError('Could not interpret title of video as "%s"' % self._titleformat) | 
					
						
							|  |  |  |         for attribute, value in match.groupdict().items(): | 
					
						
							|  |  |  |             value = match.group(attribute) | 
					
						
							|  |  |  |             info[attribute] = value | 
					
						
							|  |  |  |             self._downloader.to_screen('[fromtitle] parsed ' + attribute + ': ' + value) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-18 11:36:42 +02:00
										 |  |  |         return [], info |