#!/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()