16

is there any documentation for use youtube-dl as a python library in a project?

I know that I can use the main class, but I can't find any documentation or example...

import youtube_dl

ydl = youtube_dl.YoutubeDL(params)

... ?
4

4 回答 4

9

If you download a version from github you can generate sphinx-docs which is useful for developement. Then using pythons help function usually gives some idea what the purpose of a function is

>>> import youtube_dl as yt
>>> help(yt)

Furthermore I find ipython a useful tool to explore code using the %edit magic.

%edit yt.main 

would bring you directly to the source of the main function.

于 2014-10-21T20:48:03.257 回答
9

similar question: How to use youtube-dl from a python program

Check this file in sources: https://github.com/rg3/youtube-dl/blob/master/youtube_dl/__init__.py

You need options dict (originally generated using parameters received from command line):

ydl_opts = {
    'usenetrc': opts.usenetrc,
    'username': opts.username,
    'password': opts.password,
    # ... all options list available in sources
    'exec_cmd': opts.exec_cmd,
}

and then create YoutubeDL instance and call some methods with self-described names:

with YoutubeDL(ydl_opts) as ydl:
    ydl.print_debug_header()
    ydl.add_default_info_extractors()

    # PostProcessors
    # Add the metadata pp first, the other pps will copy it
    if opts.addmetadata:
        ydl.add_post_processor(FFmpegMetadataPP())
    if opts.extractaudio:
        ydl.add_post_processor(FFmpegExtractAudioPP(preferredcodec=opts.audioformat, preferredquality=opts.audioquality, nopostoverwrites=opts.nopostoverwrites))
    if opts.recodevideo:
        ydl.add_post_processor(FFmpegVideoConvertor(preferedformat=opts.recodevideo))
    if opts.embedsubtitles:
        ydl.add_post_processor(FFmpegEmbedSubtitlePP(subtitlesformat=opts.subtitlesformat))
    if opts.xattrs:
        ydl.add_post_processor(XAttrMetadataPP())
    if opts.embedthumbnail:
        if not opts.addmetadata:
            ydl.add_post_processor(FFmpegAudioFixPP())
        ydl.add_post_processor(AtomicParsleyPP())


    # Please keep ExecAfterDownload towards the bottom as it allows the user to modify the final file in any way.
    # So if the user is able to remove the file before your postprocessor runs it might cause a few problems.
    if opts.exec_cmd:
        ydl.add_post_processor(ExecAfterDownloadPP(
            verboseOutput=opts.verbose, exec_cmd=opts.exec_cmd))

    # Update version
    if opts.update_self:
        update_self(ydl.to_screen, opts.verbose)

    # Remove cache dir
    if opts.rm_cachedir:
        ydl.cache.remove()

    # Maybe do nothing
    if (len(all_urls) < 1) and (opts.load_info_filename is None):
        if not (opts.update_self or opts.rm_cachedir):
            parser.error(u'you must provide at least one URL')
        else:
            sys.exit()

    try:
        if opts.load_info_filename is not None:
            retcode = ydl.download_with_info_file(opts.load_info_filename)
        else:
            retcode = ydl.download(all_urls)
    except MaxDownloadsReached:
        ydl.to_screen(u'--max-download limit reached, aborting.')
        retcode = 101
于 2014-10-21T21:18:59.300 回答
8

The official documentation now contains a section about embedding youtube-dl. You're on the right track;

import youtube_dl

with youtube_dl.YoutubeDL({}) as ydl:
    ydl.download(['http://www.youtube.com/watch?v=BaW_jenozKc'])

is a good minimal program.

于 2014-12-15T23:34:17.293 回答
5

You can use these options referenced from the main source code

Also another official options resource with a short explanation -> HERE

   ydl_opts = {
        'usenetrc': opts.usenetrc,
        'username': opts.username,
        'password': opts.password,
        'twofactor': opts.twofactor,
        'videopassword': opts.videopassword,
        'ap_mso': opts.ap_mso,
        'ap_username': opts.ap_username,
        'ap_password': opts.ap_password,
        'quiet': (opts.quiet or any_getting or any_printing),
        'no_warnings': opts.no_warnings,
        'forceurl': opts.geturl,
        'forcetitle': opts.gettitle,
        'forceid': opts.getid,
        'forcethumbnail': opts.getthumbnail,
        'forcedescription': opts.getdescription,
        'forceduration': opts.getduration,
        'forcefilename': opts.getfilename,
        'forceformat': opts.getformat,
        'forcejson': opts.dumpjson or opts.print_json,
        'dump_single_json': opts.dump_single_json,
        'simulate': opts.simulate or any_getting,
        'skip_download': opts.skip_download,
        'format': opts.format,
        'listformats': opts.listformats,
        'outtmpl': outtmpl,
        'outtmpl_na_placeholder': opts.outtmpl_na_placeholder,
        'autonumber_size': opts.autonumber_size,
        'autonumber_start': opts.autonumber_start,
        'restrictfilenames': opts.restrictfilenames,
        'ignoreerrors': opts.ignoreerrors,
        'force_generic_extractor': opts.force_generic_extractor,
        'ratelimit': opts.ratelimit,
        'nooverwrites': opts.nooverwrites,
        'retries': opts.retries,
        'fragment_retries': opts.fragment_retries,
        'skip_unavailable_fragments': opts.skip_unavailable_fragments,
        'keep_fragments': opts.keep_fragments,
        'buffersize': opts.buffersize,
        'noresizebuffer': opts.noresizebuffer,
        'http_chunk_size': opts.http_chunk_size,
        'continuedl': opts.continue_dl,
        'noprogress': opts.noprogress,
        'progress_with_newline': opts.progress_with_newline,
        'playliststart': opts.playliststart,
        'playlistend': opts.playlistend,
        'playlistreverse': opts.playlist_reverse,
        'playlistrandom': opts.playlist_random,
        'noplaylist': opts.noplaylist,
        'logtostderr': opts.outtmpl == '-',
        'consoletitle': opts.consoletitle,
        'nopart': opts.nopart,
        'updatetime': opts.updatetime,
        'writedescription': opts.writedescription,
        'writeannotations': opts.writeannotations,
        'writeinfojson': opts.writeinfojson,
        'writethumbnail': opts.writethumbnail,
        'write_all_thumbnails': opts.write_all_thumbnails,
        'writesubtitles': opts.writesubtitles,
        'writeautomaticsub': opts.writeautomaticsub,
        'allsubtitles': opts.allsubtitles,
        'listsubtitles': opts.listsubtitles,
        'subtitlesformat': opts.subtitlesformat,
        'subtitleslangs': opts.subtitleslangs,
        'matchtitle': decodeOption(opts.matchtitle),
        'rejecttitle': decodeOption(opts.rejecttitle),
        'max_downloads': opts.max_downloads,
        'prefer_free_formats': opts.prefer_free_formats,
        'verbose': opts.verbose,
        'dump_intermediate_pages': opts.dump_intermediate_pages,
        'write_pages': opts.write_pages,
        'test': opts.test,
        'keepvideo': opts.keepvideo,
        'min_filesize': opts.min_filesize,
        'max_filesize': opts.max_filesize,
        'min_views': opts.min_views,
        'max_views': opts.max_views,
        'daterange': date,
        'cachedir': opts.cachedir,
        'youtube_print_sig_code': opts.youtube_print_sig_code,
        'age_limit': opts.age_limit,
        'download_archive': download_archive_fn,
        'cookiefile': opts.cookiefile,
        'nocheckcertificate': opts.no_check_certificate,
        'prefer_insecure': opts.prefer_insecure,
        'proxy': opts.proxy,
        'socket_timeout': opts.socket_timeout,
        'bidi_workaround': opts.bidi_workaround,
        'debug_printtraffic': opts.debug_printtraffic,
        'prefer_ffmpeg': opts.prefer_ffmpeg,
        'include_ads': opts.include_ads,
        'default_search': opts.default_search,
        'youtube_include_dash_manifest': opts.youtube_include_dash_manifest,
        'encoding': opts.encoding,
        'extract_flat': opts.extract_flat,
        'mark_watched': opts.mark_watched,
        'merge_output_format': opts.merge_output_format,
        'postprocessors': postprocessors,
        'fixup': opts.fixup,
        'source_address': opts.source_address,
        'call_home': opts.call_home,
        'sleep_interval': opts.sleep_interval,
        'max_sleep_interval': opts.max_sleep_interval,
        'external_downloader': opts.external_downloader,
        'list_thumbnails': opts.list_thumbnails,
        'playlist_items': opts.playlist_items,
        'xattr_set_filesize': opts.xattr_set_filesize,
        'match_filter': match_filter,
        'no_color': opts.no_color,
        'ffmpeg_location': opts.ffmpeg_location,
        'hls_prefer_native': opts.hls_prefer_native,
        'hls_use_mpegts': opts.hls_use_mpegts,
        'external_downloader_args': external_downloader_args,
        'postprocessor_args': postprocessor_args,
        'cn_verification_proxy': opts.cn_verification_proxy,
        'geo_verification_proxy': opts.geo_verification_proxy,
        'config_location': opts.config_location,
        'geo_bypass': opts.geo_bypass,
        'geo_bypass_country': opts.geo_bypass_country,
        'geo_bypass_ip_block': opts.geo_bypass_ip_block,
        # just for deprecation check
        'autonumber': opts.autonumber if opts.autonumber is True else None,
        'usetitle': opts.usetitle if opts.usetitle is True else None,
    }
于 2021-03-19T09:23:19.767 回答