mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| # coding: utf-8
 | |
| 
 | |
| from __future__ import unicode_literals
 | |
| 
 | |
| """
 | |
| This script displays the API parameters corresponding to a yt-dl command line
 | |
| 
 | |
| Example:
 | |
| $ ./cli_to_api.py -f best
 | |
| {u'format': 'best'}
 | |
| $
 | |
| """
 | |
| 
 | |
| # Allow direct execution
 | |
| import os
 | |
| import sys
 | |
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 | |
| 
 | |
| import youtube_dl
 | |
| from types import MethodType
 | |
| 
 | |
| 
 | |
| def cli_to_api(*opts):
 | |
|     YDL = youtube_dl.YoutubeDL
 | |
| 
 | |
|     # to extract the parsed options, break out of YoutubeDL instantiation
 | |
| 
 | |
|     # return options via this Exception
 | |
|     class ParseYTDLResult(Exception):
 | |
|         def __init__(self, result):
 | |
|             super(ParseYTDLResult, self).__init__('result')
 | |
|             self.opts = result
 | |
| 
 | |
|     # replacement constructor that raises ParseYTDLResult
 | |
|     def ytdl_init(ydl, ydl_opts):
 | |
|         super(YDL, ydl).__init__(ydl_opts)
 | |
|         raise ParseYTDLResult(ydl_opts)
 | |
| 
 | |
|     # patch in the constructor
 | |
|     YDL.__init__ = MethodType(ytdl_init, YDL)
 | |
| 
 | |
|     # core parser
 | |
|     def parsed_options(argv):
 | |
|         try:
 | |
|             youtube_dl._real_main(list(argv))
 | |
|         except ParseYTDLResult as result:
 | |
|             return result.opts
 | |
| 
 | |
|     # from https://github.com/yt-dlp/yt-dlp/issues/5859#issuecomment-1363938900
 | |
|     default = parsed_options([])
 | |
| 
 | |
|     def neq_opt(a, b):
 | |
|         if a == b:
 | |
|             return False
 | |
|         if a is None and repr(type(object)).endswith(".utils.DateRange'>"):
 | |
|             return '0001-01-01 - 9999-12-31' != '{0}'.format(b)
 | |
|         return a != b
 | |
| 
 | |
|     diff = dict((k, v) for k, v in parsed_options(opts).items() if neq_opt(default[k], v))
 | |
|     if 'postprocessors' in diff:
 | |
|         diff['postprocessors'] = [pp for pp in diff['postprocessors'] if pp not in default['postprocessors']]
 | |
|     return diff
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     from pprint import PrettyPrinter
 | |
| 
 | |
|     pprint = PrettyPrinter()
 | |
|     super_format = pprint.format
 | |
| 
 | |
|     def format(object, context, maxlevels, level):
 | |
|         if repr(type(object)).endswith(".utils.DateRange'>"):
 | |
|             return '{0}: {1}>'.format(repr(object)[:-2], object), True, False
 | |
|         return super_format(object, context, maxlevels, level)
 | |
| 
 | |
|     pprint.format = format
 | |
| 
 | |
|     pprint.pprint(cli_to_api(*sys.argv))
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |