mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	[devscripts] Add a hack to convert command-line options to API options
This commit is contained in:
		
							
								
								
									
										64
									
								
								devscripts/cli_to_api.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										64
									
								
								devscripts/cli_to_api.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | #!/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([]) | ||||||
|  |     diff = dict((k, v) for k, v in parsed_options(opts).items() if 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 pprint | ||||||
|  |     pprint(cli_to_api(*sys.argv)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
		Reference in New Issue
	
	Block a user