mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	 phiresky
					phiresky
				
			
				
					committed by
					
						 Jaime Marquínez Ferrándiz
						Jaime Marquínez Ferrándiz
					
				
			
			
				
	
			
			
			 Jaime Marquínez Ferrándiz
						Jaime Marquínez Ferrándiz
					
				
			
						parent
						
							082b1155a3
						
					
				
				
					commit
					e7db87f700
				
			| @@ -213,6 +213,11 @@ def _real_main(argv=None): | ||||
|     # PostProcessors | ||||
|     postprocessors = [] | ||||
|     # Add the metadata pp first, the other pps will copy it | ||||
|     if opts.metafromtitle: | ||||
|         postprocessors.append({ | ||||
|             'key': 'MetadataFromTitle', | ||||
|             'titleformat': opts.metafromtitle | ||||
|         }) | ||||
|     if opts.addmetadata: | ||||
|         postprocessors.append({'key': 'FFmpegMetadata'}) | ||||
|     if opts.extractaudio: | ||||
|   | ||||
| @@ -735,6 +735,15 @@ def parseOpts(overrideArguments=None): | ||||
|         '--add-metadata', | ||||
|         action='store_true', dest='addmetadata', default=False, | ||||
|         help='write metadata to the video file') | ||||
|     postproc.add_option( | ||||
|         '--metadata-from-title', | ||||
|         metavar='FORMAT', dest='metafromtitle', | ||||
|         help='parse additional metadata like song title / artist from the video title. \n' | ||||
|              'The format syntax is the same as --output, ' | ||||
|              'the parsed parameters replace existing values.\n' | ||||
|              'Additional templates: %(songtitle), %(album), %(artist). \n' | ||||
|              'Example: --metadata-from-title "%(artist)s - %(title)s" matches a title like ' | ||||
|              '"Coldplay - Paradise"') | ||||
|     postproc.add_option( | ||||
|         '--xattrs', | ||||
|         action='store_true', dest='xattrs', default=False, | ||||
|   | ||||
| @@ -15,6 +15,7 @@ from .ffmpeg import ( | ||||
| ) | ||||
| from .xattrpp import XAttrMetadataPP | ||||
| from .execafterdownload import ExecAfterDownloadPP | ||||
| from .metadatafromtitle import MetadataFromTitlePP | ||||
|  | ||||
|  | ||||
| def get_postprocessor(key): | ||||
| @@ -34,5 +35,6 @@ __all__ = [ | ||||
|     'FFmpegPostProcessor', | ||||
|     'FFmpegSubtitlesConvertorPP', | ||||
|     'FFmpegVideoConvertorPP', | ||||
|     'MetadataFromTitlePP', | ||||
|     'XAttrMetadataPP', | ||||
| ] | ||||
|   | ||||
| @@ -541,11 +541,15 @@ class FFmpegEmbedSubtitlePP(FFmpegPostProcessor): | ||||
| class FFmpegMetadataPP(FFmpegPostProcessor): | ||||
|     def run(self, info): | ||||
|         metadata = {} | ||||
|         if info.get('title') is not None: | ||||
|         if info.get('songtitle') is not None: | ||||
|             metadata['title'] = info['songtitle'] | ||||
|         elif info.get('title') is not None: | ||||
|             metadata['title'] = info['title'] | ||||
|         if info.get('upload_date') is not None: | ||||
|             metadata['date'] = info['upload_date'] | ||||
|         if info.get('uploader') is not None: | ||||
|         if info.get('artist') is not None: | ||||
|             metadata['artist'] = info['artist'] | ||||
|         elif info.get('uploader') is not None: | ||||
|             metadata['artist'] = info['uploader'] | ||||
|         elif info.get('uploader_id') is not None: | ||||
|             metadata['artist'] = info['uploader_id'] | ||||
| @@ -554,6 +558,8 @@ class FFmpegMetadataPP(FFmpegPostProcessor): | ||||
|             metadata['comment'] = info['description'] | ||||
|         if info.get('webpage_url') is not None: | ||||
|             metadata['purl'] = info['webpage_url'] | ||||
|         if info.get('album') is not None: | ||||
|             metadata['album'] = info['album'] | ||||
|  | ||||
|         if not metadata: | ||||
|             self._downloader.to_screen('[ffmpeg] There isn\'t any metadata to add') | ||||
|   | ||||
							
								
								
									
										48
									
								
								youtube_dl/postprocessor/metadatafromtitle.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								youtube_dl/postprocessor/metadatafromtitle.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| # -*- coding: utf-8 -*- | ||||
|  | ||||
| import re | ||||
|  | ||||
| from .common import PostProcessor | ||||
| from ..utils import PostProcessingError | ||||
|  | ||||
|  | ||||
| class MetadataFromTitlePPError(PostProcessingError): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class MetadataFromTitlePP(PostProcessor): | ||||
|     def __init__(self, downloader, titleformat): | ||||
|         self._titleformat = titleformat | ||||
|         self._titleregex = self.fmtToRegex(titleformat) | ||||
|  | ||||
|     def fmtToRegex(self, fmt): | ||||
|         """ | ||||
|         Converts a string like | ||||
|            '%(title)s - %(artist)s' | ||||
|         to a regex like | ||||
|            '(?P<title>.+)\ \-\ (?P<artist>.+)' | ||||
|         and a list of the named groups [title, artist] | ||||
|         """ | ||||
|         lastpos = 0 | ||||
|         regex = "" | ||||
|         groups = [] | ||||
|         # 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) | ||||
|  | ||||
|         return True, info | ||||
		Reference in New Issue
	
	Block a user