kandi background
Explore Kits

yt-dlp | A youtube-dl fork with additional features and fixes

 by   yt-dlp Python Version: 2022.04.08 License: Unlicense

 by   yt-dlp Python Version: 2022.04.08 License: Unlicense

Download this library from

kandi X-RAY | yt-dlp Summary

yt-dlp is a Python library. yt-dlp has no bugs, it has no vulnerabilities, it has build file available, it has a Permissive License and it has medium support. You can install using 'pip install yt-dlp' or download it from GitHub, PyPI.
yt-dlp is a youtube-dl fork based on the now inactive youtube-dlc. The main focus of this project is adding new features and patches while also keeping up to date with the original project.
Support
Support
Quality
Quality
Security
Security
License
License
Reuse
Reuse

kandi-support Support

  • yt-dlp has a medium active ecosystem.
  • It has 22499 star(s) with 1719 fork(s). There are 192 watchers for this library.
  • There were 1 major release(s) in the last 6 months.
  • There are 453 open issues and 1802 have been closed. On average issues are closed in 11 days. There are 54 open pull requests and 0 closed requests.
  • It has a neutral sentiment in the developer community.
  • The latest version of yt-dlp is 2022.04.08
yt-dlp Support
Best in #Python
Average in #Python
yt-dlp Support
Best in #Python
Average in #Python

quality kandi Quality

  • yt-dlp has 0 bugs and 0 code smells.
yt-dlp Quality
Best in #Python
Average in #Python
yt-dlp Quality
Best in #Python
Average in #Python

securitySecurity

  • yt-dlp has no vulnerabilities reported, and its dependent libraries have no vulnerabilities reported.
  • yt-dlp code analysis shows 0 unresolved vulnerabilities.
  • There are 0 security hotspots that need review.
yt-dlp Security
Best in #Python
Average in #Python
yt-dlp Security
Best in #Python
Average in #Python

license License

  • yt-dlp is licensed under the Unlicense License. This license is Permissive.
  • Permissive licenses have the least restrictions, and you can use them in most projects.
yt-dlp License
Best in #Python
Average in #Python
yt-dlp License
Best in #Python
Average in #Python

buildReuse

  • yt-dlp releases are available to install and integrate.
  • Deployable package is available in PyPI.
  • Build file is available. You can build the component from source.
  • Installation instructions, examples and code snippets are available.
  • It has 162659 lines of code, 4842 functions and 1043 files.
  • It has medium code complexity. Code complexity directly impacts maintainability of the code.
yt-dlp Reuse
Best in #Python
Average in #Python
yt-dlp Reuse
Best in #Python
Average in #Python
Top functions reviewed by kandi - BETA

kandi has reviewed yt-dlp and discovered the below as its top functions. This is intended to give you an instant insight into yt-dlp implemented functionality, and help decide if they suit your requirements.

  • Create an option parser .
  • Extract mvpd auth data .
  • Processes info .
  • Validate options .
  • Parse MPD formats .
  • Extract metadata from a video .
  • Interpret an expression .
  • Extract an anime entry .
  • Parse options .
  • Get information about a video .

yt-dlp Key Features

Based on youtube-dl 2021.12.17 commit/5add3f4 and youtube-dlc 2020.11.11-3 commit/f9401f2: You get all the features and patches of youtube-dlc in addition to the latest youtube-dl

SponsorBlock Integration: You can mark/remove sponsor sections in youtube videos by utilizing the SponsorBlock API

Format Sorting: The default format sorting options have been changed so that higher resolution and better codecs will be now preferred instead of simply using larger bitrate. Furthermore, you can now specify the sort order using -S. This allows for much easier format selection than what is possible by simply using --format (examples)

Merged with animelover1984/youtube-dl: You get most of the features and improvements from animelover1984/youtube-dl including --write-comments, BiliBiliSearch, BilibiliChannel, Embedding thumbnail in mp4/ogg/opus, playlist infojson etc. Note that the NicoNico improvements are not available. See #31 for details.

Youtube improvements: All Feeds (:ytfav, :ytwatchlater, :ytsubs, :ythistory, :ytrec) and private playlists supports downloading multiple pages of content Search (ytsearch:, ytsearchdate:), search URLs and in-channel search works Mixes supports downloading multiple pages of content Some (but not all) age-gated content can be downloaded without cookies Fix for n-sig based throttling Redirect channel's home URL automatically to /video to preserve the old behaviour 255kbps audio is extracted (if available) from youtube music when premium cookies are given Youtube music Albums, channels etc can be downloaded (except self-uploaded music) Download livestreams from the start using --live-from-start (experimental)

Cookies from browser: Cookies can be automatically extracted from all major web browsers using --cookies-from-browser BROWSER[+KEYRING][:PROFILE]

Split video by chapters: Videos can be split into multiple files based on chapters using --split-chapters

Multi-threaded fragment downloads: Download multiple fragments of m3u8/mpd videos in parallel. Use --concurrent-fragments (-N) option to set the number of threads used

Aria2c with HLS/DASH: You can use aria2c as the external downloader for DASH(mpd) and HLS(m3u8) formats

New and fixed extractors: Many new extractors have been added and a lot of existing ones have been fixed. See the changelog or the list of supported sites

New MSOs: Philo, Spectrum, SlingTV, Cablevision, RCN

Subtitle extraction from manifests: Subtitles can be extracted from streaming media manifests. See commit/be6202f for details

Multiple paths and output templates: You can give different output templates and download paths for different types of files. You can also set a temporary path where intermediary files are downloaded to using --paths (-P)

Portable Configuration: Configuration files are automatically loaded from the home and root directories. See configuration for details

Output template improvements: Output templates can now have date-time formatting, numeric offsets, object traversal etc. See output template for details. Even more advanced operations can also be done with the help of --parse-metadata and --replace-in-metadata

Other new options: Many new options have been added such as --concat-playlist, --print, --wait-for-video, --sleep-requests, --convert-thumbnails, --write-link, --force-download-archive, --force-overwrites, --break-on-reject etc

Improvements: Regex and other operators in --match-filter, multiple --postprocessor-args and --downloader-args, faster archive checking, more format selection options, merge multi-video/audio, multiple --config-locations, --exec at different stages, etc

Plugins: Extractors and PostProcessors can be loaded from an external file. See plugins for details

Self-updater: The releases can be updated using yt-dlp -U

Using the release binary

copy iconCopydownload iconDownload
sudo curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/yt-dlp
sudo chmod a+rx /usr/local/bin/yt-dlp

With

copy iconCopydownload iconDownload
python3 -m pip install -U yt-dlp

With

copy iconCopydownload iconDownload
brew install yt-dlp/taps/yt-dlp

COMPILE

copy iconCopydownload iconDownload
py -m pip install -U pyinstaller -r requirements.txt
py devscripts/make_lazy_extractors.py
py pyinst.py

USAGE AND OPTIONS

copy iconCopydownload iconDownload
yt-dlp [OPTIONS] [--] URL [URL...]

General Options:

copy iconCopydownload iconDownload
-h, --help                       Print this help text and exit
--version                        Print program version and exit
-U, --update                     Update this program to latest version. Make
                                 sure that you have sufficient permissions
                                 (run with sudo if needed)
-i, --ignore-errors              Ignore download and postprocessing errors.
                                 The download will be considered successful
                                 even if the postprocessing fails
--no-abort-on-error              Continue with next video on download
                                 errors; e.g. to skip unavailable videos in
                                 a playlist (default)
--abort-on-error                 Abort downloading of further videos if an
                                 error occurs (Alias: --no-ignore-errors)
--dump-user-agent                Display the current user-agent and exit
--list-extractors                List all supported extractors and exit
--extractor-descriptions         Output descriptions of all supported
                                 extractors and exit
--force-generic-extractor        Force extraction to use the generic
                                 extractor
--default-search PREFIX          Use this prefix for unqualified URLs. For
                                 example "gvsearch2:" downloads two videos
                                 from google videos for the search term
                                 "large apple". Use the value "auto" to let
                                 yt-dlp guess ("auto_warning" to emit a
                                 warning when guessing). "error" just throws
                                 an error. The default value "fixup_error"
                                 repairs broken URLs, but emits an error if
                                 this is not possible instead of searching
--ignore-config                  Don't load any more configuration files
                                 except those given by --config-locations.
                                 For backward compatibility, if this option
                                 is found inside the system configuration
                                 file, the user configuration is not loaded.
                                 (Alias: --no-config)
--no-config-locations            Do not load any custom configuration files
                                 (default). When given inside a
                                 configuration file, ignore all previous
                                 --config-locations defined in the current
                                 file
--config-locations PATH          Location of the main configuration file;
                                 either the path to the config or its
                                 containing directory. Can be used multiple
                                 times and inside other configuration files
--flat-playlist                  Do not extract the videos of a playlist,
                                 only list them
--no-flat-playlist               Extract the videos of a playlist
--live-from-start                Download livestreams from the start.
                                 Currently only supported for YouTube
                                 (Experimental)
--no-live-from-start             Download livestreams from the current time
                                 (default)
--wait-for-video MIN[-MAX]       Wait for scheduled streams to become
                                 available. Pass the minimum number of
                                 seconds (or range) to wait between retries
--no-wait-for-video              Do not wait for scheduled streams (default)
--mark-watched                   Mark videos watched (even with --simulate).
                                 Currently only supported for YouTube
--no-mark-watched                Do not mark videos watched (default)
--no-colors                      Do not emit color codes in output
--compat-options OPTS            Options that can help keep compatibility
                                 with youtube-dl or youtube-dlc
                                 configurations by reverting some of the
                                 changes made in yt-dlp. See "Differences in
                                 default behavior" for details

Network Options:

copy iconCopydownload iconDownload
--proxy URL                      Use the specified HTTP/HTTPS/SOCKS proxy.
                                 To enable SOCKS proxy, specify a proper
                                 scheme. For example
                                 socks5://user:pass@127.0.0.1:1080/. Pass in
                                 an empty string (--proxy "") for direct
                                 connection
--socket-timeout SECONDS         Time to wait before giving up, in seconds
--source-address IP              Client-side IP address to bind to
-4, --force-ipv4                 Make all connections via IPv4
-6, --force-ipv6                 Make all connections via IPv6

Geo-restriction:

copy iconCopydownload iconDownload
--geo-verification-proxy URL     Use this proxy to verify the IP address for
                                 some geo-restricted sites. The default
                                 proxy specified by --proxy (or none, if the
                                 option is not present) is used for the
                                 actual downloading
--geo-bypass                     Bypass geographic restriction via faking
                                 X-Forwarded-For HTTP header (default)
--no-geo-bypass                  Do not bypass geographic restriction via
                                 faking X-Forwarded-For HTTP header
--geo-bypass-country CODE        Force bypass geographic restriction with
                                 explicitly provided two-letter ISO 3166-2
                                 country code
--geo-bypass-ip-block IP_BLOCK   Force bypass geographic restriction with
                                 explicitly provided IP block in CIDR
                                 notation

Video Selection:

copy iconCopydownload iconDownload
--playlist-start NUMBER          Playlist video to start at (default is 1)
--playlist-end NUMBER            Playlist video to end at (default is last)
--playlist-items ITEM_SPEC       Playlist video items to download. Specify
                                 indices of the videos in the playlist
                                 separated by commas like: "--playlist-items
                                 1,2,5,8" if you want to download videos
                                 indexed 1, 2, 5, 8 in the playlist. You can
                                 specify range: "--playlist-items
                                 1-3,7,10-13", it will download the videos
                                 at index 1, 2, 3, 7, 10, 11, 12 and 13
--min-filesize SIZE              Do not download any videos smaller than
                                 SIZE (e.g. 50k or 44.6m)
--max-filesize SIZE              Do not download any videos larger than SIZE
                                 (e.g. 50k or 44.6m)
--date DATE                      Download only videos uploaded on this date.
                                 The date can be "YYYYMMDD" or in the format
                                 "(now|today)[+-][0-9](day|week|month|year)(s)?"
--datebefore DATE                Download only videos uploaded on or before
                                 this date. The date formats accepted is the
                                 same as --date
--dateafter DATE                 Download only videos uploaded on or after
                                 this date. The date formats accepted is the
                                 same as --date
--match-filter FILTER            Generic video filter. Any field (see
                                 "OUTPUT TEMPLATE") can be compared with a
                                 number or a string using the operators
                                 defined in "Filtering formats". You can
                                 also simply specify a field to match if the
                                 field is present and "!field" to check if
                                 the field is not present. In addition,
                                 Python style regular expression matching
                                 can be done using "~=", and multiple
                                 filters can be checked with "&". Use a "\"
                                 to escape "&" or quotes if needed. Eg:
                                 --match-filter "!is_live & like_count>?100
                                 & description~='(?i)\bcats \& dogs\b'"
                                 matches only videos that are not live, has
                                 a like count more than 100 (or the like
                                 field is not available), and also has a
                                 description that contains the phrase "cats
                                 & dogs" (ignoring case)
--no-match-filter                Do not use generic video filter (default)
--no-playlist                    Download only the video, if the URL refers
                                 to a video and a playlist
--yes-playlist                   Download the playlist, if the URL refers to
                                 a video and a playlist
--age-limit YEARS                Download only videos suitable for the given
                                 age
--download-archive FILE          Download only videos not listed in the
                                 archive file. Record the IDs of all
                                 downloaded videos in it
--no-download-archive            Do not use archive file (default)
--max-downloads NUMBER           Abort after downloading NUMBER files
--break-on-existing              Stop the download process when encountering
                                 a file that is in the archive
--break-on-reject                Stop the download process when encountering
                                 a file that has been filtered out
--break-per-input                Make --break-on-existing and --break-on-
                                 reject act only on the current input URL
--no-break-per-input             --break-on-existing and --break-on-reject
                                 terminates the entire download queue
--skip-playlist-after-errors N   Number of allowed failures until the rest
                                 of the playlist is skipped

Download Options:

copy iconCopydownload iconDownload
-N, --concurrent-fragments N     Number of fragments of a dash/hlsnative
                                 video that should be downloaded
                                 concurrently (default is 1)
-r, --limit-rate RATE            Maximum download rate in bytes per second
                                 (e.g. 50K or 4.2M)
--throttled-rate RATE            Minimum download rate in bytes per second
                                 below which throttling is assumed and the
                                 video data is re-extracted (e.g. 100K)
-R, --retries RETRIES            Number of retries (default is 10), or
                                 "infinite"
--file-access-retries RETRIES    Number of times to retry on file access
                                 error (default is 10), or "infinite"
--fragment-retries RETRIES       Number of retries for a fragment (default
                                 is 10), or "infinite" (DASH, hlsnative and
                                 ISM)
--skip-unavailable-fragments     Skip unavailable fragments for DASH,
                                 hlsnative and ISM (default)
                                 (Alias: --no-abort-on-unavailable-fragment)
--abort-on-unavailable-fragment  Abort downloading if a fragment is unavailable
                                 (Alias: --no-skip-unavailable-fragments)
--keep-fragments                 Keep downloaded fragments on disk after
                                 downloading is finished
--no-keep-fragments              Delete downloaded fragments after
                                 downloading is finished (default)
--buffer-size SIZE               Size of download buffer (e.g. 1024 or 16K)
                                 (default is 1024)
--resize-buffer                  The buffer size is automatically resized
                                 from an initial value of --buffer-size
                                 (default)
--no-resize-buffer               Do not automatically adjust the buffer size
--http-chunk-size SIZE           Size of a chunk for chunk-based HTTP
                                 downloading (e.g. 10485760 or 10M) (default
                                 is disabled). May be useful for bypassing
                                 bandwidth throttling imposed by a webserver
                                 (experimental)
--playlist-reverse               Download playlist videos in reverse order
--no-playlist-reverse            Download playlist videos in default order
                                 (default)
--playlist-random                Download playlist videos in random order
--xattr-set-filesize             Set file xattribute ytdl.filesize with
                                 expected file size
--hls-use-mpegts                 Use the mpegts container for HLS videos;
                                 allowing some players to play the video
                                 while downloading, and reducing the chance
                                 of file corruption if download is
                                 interrupted. This is enabled by default for
                                 live streams
--no-hls-use-mpegts              Do not use the mpegts container for HLS
                                 videos. This is default when not
                                 downloading live streams
--downloader [PROTO:]NAME        Name or path of the external downloader to
                                 use (optionally) prefixed by the protocols
                                 (http, ftp, m3u8, dash, rstp, rtmp, mms) to
                                 use it for. Currently supports native,
                                 aria2c, avconv, axel, curl, ffmpeg, httpie,
                                 wget (Recommended: aria2c). You can use
                                 this option multiple times to set different
                                 downloaders for different protocols. For
                                 example, --downloader aria2c --downloader
                                 "dash,m3u8:native" will use aria2c for
                                 http/ftp downloads, and the native
                                 downloader for dash/m3u8 downloads (Alias:
                                 --external-downloader)
--downloader-args NAME:ARGS      Give these arguments to the external
                                 downloader. Specify the downloader name and
                                 the arguments separated by a colon ":". For
                                 ffmpeg, arguments can be passed to
                                 different positions using the same syntax
                                 as --postprocessor-args. You can use this
                                 option multiple times to give different
                                 arguments to different downloaders (Alias:
                                 --external-downloader-args)

Filesystem Options:

copy iconCopydownload iconDownload
-a, --batch-file FILE            File containing URLs to download ("-" for
                                 stdin), one URL per line. Lines starting
                                 with "#", ";" or "]" are considered as
                                 comments and ignored
--no-batch-file                  Do not read URLs from batch file (default)
-P, --paths [TYPES:]PATH         The paths where the files should be
                                 downloaded. Specify the type of file and
                                 the path separated by a colon ":". All the
                                 same TYPES as --output are supported.
                                 Additionally, you can also provide "home"
                                 (default) and "temp" paths. All
                                 intermediary files are first downloaded to
                                 the temp path and then the final files are
                                 moved over to the home path after download
                                 is finished. This option is ignored if
                                 --output is an absolute path
-o, --output [TYPES:]TEMPLATE    Output filename template; see "OUTPUT
                                 TEMPLATE" for details
--output-na-placeholder TEXT     Placeholder value for unavailable meta
                                 fields in output filename template
                                 (default: "NA")
--restrict-filenames             Restrict filenames to only ASCII
                                 characters, and avoid "&" and spaces in
                                 filenames
--no-restrict-filenames          Allow Unicode characters, "&" and spaces in
                                 filenames (default)
--windows-filenames              Force filenames to be Windows-compatible
--no-windows-filenames           Make filenames Windows-compatible only if
                                 using Windows (default)
--trim-filenames LENGTH          Limit the filename length (excluding
                                 extension) to the specified number of
                                 characters
-w, --no-overwrites              Do not overwrite any files
--force-overwrites               Overwrite all video and metadata files.
                                 This option includes --no-continue
--no-force-overwrites            Do not overwrite the video, but overwrite
                                 related files (default)
-c, --continue                   Resume partially downloaded files/fragments
                                 (default)
--no-continue                    Do not resume partially downloaded
                                 fragments. If the file is not fragmented,
                                 restart download of the entire file
--part                           Use .part files instead of writing directly
                                 into output file (default)
--no-part                        Do not use .part files - write directly
                                 into output file
--mtime                          Use the Last-modified header to set the
                                 file modification time (default)
--no-mtime                       Do not use the Last-modified header to set
                                 the file modification time
--write-description              Write video description to a .description
                                 file
--no-write-description           Do not write video description (default)
--write-info-json                Write video metadata to a .info.json file
                                 (this may contain personal information)
--no-write-info-json             Do not write video metadata (default)
--write-playlist-metafiles       Write playlist metadata in addition to the
                                 video metadata when using --write-info-json,
                                 --write-description etc. (default)
--no-write-playlist-metafiles    Do not write playlist metadata when using
                                 --write-info-json, --write-description etc.
--clean-infojson                 Remove some private fields such as
                                 filenames from the infojson. Note that it
                                 could still contain some personal
                                 information (default)
--no-clean-infojson              Write all fields to the infojson
--write-comments                 Retrieve video comments to be placed in the
                                 infojson. The comments are fetched even
                                 without this option if the extraction is
                                 known to be quick (Alias: --get-comments)
--no-write-comments              Do not retrieve video comments unless the
                                 extraction is known to be quick (Alias:
                                 --no-get-comments)
--load-info-json FILE            JSON file containing the video information
                                 (created with the "--write-info-json"
                                 option)
--cookies FILE                   Netscape formatted file to read cookies
                                 from and dump cookie jar in
--no-cookies                     Do not read/dump cookies from/to file
                                 (default)
--cookies-from-browser BROWSER[+KEYRING][:PROFILE]
                                 The name of the browser and (optionally)
                                 the name/path of the profile to load
                                 cookies from, separated by a ":". Currently
                                 supported browsers are: brave, chrome,
                                 chromium, edge, firefox, opera, safari,
                                 vivaldi. By default, the most recently
                                 accessed profile is used. The keyring used
                                 for decrypting Chromium cookies on Linux
                                 can be (optionally) specified after the
                                 browser name separated by a "+". Currently
                                 supported keyrings are: basictext,
                                 gnomekeyring, kwallet
--no-cookies-from-browser        Do not load cookies from browser (default)
--cache-dir DIR                  Location in the filesystem where youtube-dl
                                 can store some downloaded information (such
                                 as client ids and signatures) permanently.
                                 By default $XDG_CACHE_HOME/yt-dlp or
                                 ~/.cache/yt-dlp
--no-cache-dir                   Disable filesystem caching
--rm-cache-dir                   Delete all filesystem cache files

Thumbnail Options:

copy iconCopydownload iconDownload
--write-thumbnail                Write thumbnail image to disk
--no-write-thumbnail             Do not write thumbnail image to disk
                                 (default)
--write-all-thumbnails           Write all thumbnail image formats to disk
--list-thumbnails                List available thumbnails of each video.
                                 Simulate unless --no-simulate is used

Internet Shortcut Options:

copy iconCopydownload iconDownload
--write-link                     Write an internet shortcut file, depending
                                 on the current platform (.url, .webloc or
                                 .desktop). The URL may be cached by the OS
--write-url-link                 Write a .url Windows internet shortcut. The
                                 OS caches the URL based on the file path
--write-webloc-link              Write a .webloc macOS internet shortcut
--write-desktop-link             Write a .desktop Linux internet shortcut

Verbosity and Simulation Options:

copy iconCopydownload iconDownload
-q, --quiet                      Activate quiet mode. If used with
                                 --verbose, print the log to stderr
--no-warnings                    Ignore warnings
-s, --simulate                   Do not download the video and do not write
                                 anything to disk
--no-simulate                    Download the video even if printing/listing
                                 options are used
--ignore-no-formats-error        Ignore "No video formats" error. Useful for
                                 extracting metadata even if the videos are
                                 not actually available for download
                                 (experimental)
--no-ignore-no-formats-error     Throw error when no downloadable video
                                 formats are found (default)
--skip-download                  Do not download the video but write all
                                 related files (Alias: --no-download)
-O, --print [WHEN:]TEMPLATE      Field name or output template to print to
                                 screen, optionally prefixed with when to
                                 print it, separated by a ":". Supported
                                 values of "WHEN" are the same as that of
                                 --use-postprocessor, and "video" (default).
                                 Implies --quiet and --simulate (unless
                                 --no-simulate is used). This option can be
                                 used multiple times
--print-to-file [WHEN:]TEMPLATE FILE
                                 Append given template to the file. The
                                 values of WHEN and TEMPLATE are same as
                                 that of --print. FILE uses the same syntax
                                 as the output template. This option can be
                                 used multiple times
-j, --dump-json                  Quiet, but print JSON information for each
                                 video. Simulate unless --no-simulate is
                                 used. See "OUTPUT TEMPLATE" for a
                                 description of available keys
-J, --dump-single-json           Quiet, but print JSON information for each
                                 url or infojson passed. Simulate unless
                                 --no-simulate is used. If the URL refers to
                                 a playlist, the whole playlist information
                                 is dumped in a single line
--force-write-archive            Force download archive entries to be
                                 written as far as no errors occur, even if
                                 -s or another simulation option is used
                                 (Alias: --force-download-archive)
--newline                        Output progress bar as new lines
--no-progress                    Do not print progress bar
--progress                       Show progress bar, even if in quiet mode
--console-title                  Display progress in console titlebar
--progress-template [TYPES:]TEMPLATE
                                 Template for progress outputs, optionally
                                 prefixed with one of "download:" (default),
                                 "download-title:" (the console title),
                                 "postprocess:",  or "postprocess-title:".
                                 The video's fields are accessible under the
                                 "info" key and the progress attributes are
                                 accessible under "progress" key. E.g.:
                                 --console-title --progress-template
                                 "download-title:%(info.id)s-%(progress.eta)s"
-v, --verbose                    Print various debugging information
--dump-pages                     Print downloaded pages encoded using base64
                                 to debug problems (very verbose)
--write-pages                    Write downloaded intermediary pages to
                                 files in the current directory to debug
                                 problems
--print-traffic                  Display sent and read HTTP traffic

Workarounds:

copy iconCopydownload iconDownload
--encoding ENCODING              Force the specified encoding (experimental)
--legacy-server-connect          Explicitly allow HTTPS connection to
                                 servers that do not support RFC 5746 secure
                                 renegotiation
--no-check-certificates          Suppress HTTPS certificate validation
--prefer-insecure                Use an unencrypted connection to retrieve
                                 information about the video (Currently
                                 supported only for YouTube)
--user-agent UA                  Specify a custom user agent
--referer URL                    Specify a custom referer, use if the video
                                 access is restricted to one domain
--add-header FIELD:VALUE         Specify a custom HTTP header and its value,
                                 separated by a colon ":". You can use this
                                 option multiple times
--bidi-workaround                Work around terminals that lack
                                 bidirectional text support. Requires bidiv
                                 or fribidi executable in PATH
--sleep-requests SECONDS         Number of seconds to sleep between requests
                                 during data extraction
--sleep-interval SECONDS         Number of seconds to sleep before each
                                 download. This is the minimum time to sleep
                                 when used along with --max-sleep-interval
                                 (Alias: --min-sleep-interval)
--max-sleep-interval SECONDS     Maximum number of seconds to sleep. Can
                                 only be used along with --min-sleep-interval
--sleep-subtitles SECONDS        Number of seconds to sleep before each
                                 subtitle download

Video Format Options:

copy iconCopydownload iconDownload
-f, --format FORMAT              Video format code, see "FORMAT SELECTION"
                                 for more details
-S, --format-sort SORTORDER      Sort the formats by the fields given, see
                                 "Sorting Formats" for more details
--S-force, --format-sort-force   Force user specified sort order to have
                                 precedence over all fields, see "Sorting
                                 Formats" for more details
--no-format-sort-force           Some fields have precedence over the user
                                 specified sort order (default), see
                                 "Sorting Formats" for more details
--video-multistreams             Allow multiple video streams to be merged
                                 into a single file
--no-video-multistreams          Only one video stream is downloaded for
                                 each output file (default)
--audio-multistreams             Allow multiple audio streams to be merged
                                 into a single file
--no-audio-multistreams          Only one audio stream is downloaded for
                                 each output file (default)
--prefer-free-formats            Prefer video formats with free containers
                                 over non-free ones of same quality. Use
                                 with "-S ext" to strictly prefer free
                                 containers irrespective of quality
--no-prefer-free-formats         Don't give any special preference to free
                                 containers (default)
--check-formats                  Check that the selected formats are
                                 actually downloadable
--check-all-formats              Check all formats for whether they are
                                 actually downloadable
--no-check-formats               Do not check that the formats are actually
                                 downloadable
-F, --list-formats               List available formats of each video.
                                 Simulate unless --no-simulate is used
--merge-output-format FORMAT     If a merge is required (e.g.
                                 bestvideo+bestaudio), output to given
                                 container format. One of mkv, mp4, ogg,
                                 webm, flv. Ignored if no merge is required

Subtitle Options:

copy iconCopydownload iconDownload
--write-subs                     Write subtitle file
--no-write-subs                  Do not write subtitle file (default)
--write-auto-subs                Write automatically generated subtitle file
                                 (Alias: --write-automatic-subs)
--no-write-auto-subs             Do not write auto-generated subtitles
                                 (default) (Alias: --no-write-automatic-subs)
--list-subs                      List available subtitles of each video.
                                 Simulate unless --no-simulate is used
--sub-format FORMAT              Subtitle format, accepts formats
                                 preference, for example: "srt" or
                                 "ass/srt/best"
--sub-langs LANGS                Languages of the subtitles to download (can
                                 be regex) or "all" separated by commas.
                                 (Eg: --sub-langs "en.*,ja") You can prefix
                                 the language code with a "-" to exempt it
                                 from the requested languages. (Eg:
                                 --sub-langs all,-live_chat) Use --list-subs
                                 for a list of available language tags

Authentication Options:

copy iconCopydownload iconDownload
-u, --username USERNAME          Login with this account ID
-p, --password PASSWORD          Account password. If this option is left
                                 out, yt-dlp will ask interactively
-2, --twofactor TWOFACTOR        Two-factor authentication code
-n, --netrc                      Use .netrc authentication data
--netrc-location PATH            Location of .netrc authentication data;
                                 either the path or its containing
                                 directory. Defaults to ~/.netrc
--video-password PASSWORD        Video password (vimeo, youku)
--ap-mso MSO                     Adobe Pass multiple-system operator (TV
                                 provider) identifier, use --ap-list-mso for
                                 a list of available MSOs
--ap-username USERNAME           Multiple-system operator account login
--ap-password PASSWORD           Multiple-system operator account password.
                                 If this option is left out, yt-dlp will ask
                                 interactively
--ap-list-mso                    List all supported multiple-system
                                 operators

Post-Processing Options:

copy iconCopydownload iconDownload
-x, --extract-audio              Convert video files to audio-only files
                                 (requires ffmpeg and ffprobe)
--audio-format FORMAT            Specify audio format to convert the audio
                                 to when -x is used. Currently supported
                                 formats are: best (default) or one of
                                 best|aac|flac|mp3|m4a|opus|vorbis|wav|alac
--audio-quality QUALITY          Specify ffmpeg audio quality, insert a
                                 value between 0 (best) and 10 (worst) for
                                 VBR or a specific bitrate like 128K
                                 (default 5)
--remux-video FORMAT             Remux the video into another container if
                                 necessary (currently supported: mp4|mkv|flv
                                 |webm|mov|avi|mp3|mka|m4a|ogg|opus). If
                                 target container does not support the
                                 video/audio codec, remuxing will fail. You
                                 can specify multiple rules; Eg.
                                 "aac>m4a/mov>mp4/mkv" will remux aac to
                                 m4a, mov to mp4 and anything else to mkv.
--recode-video FORMAT            Re-encode the video into another format if
                                 re-encoding is necessary. The syntax and
                                 supported formats are the same as --remux-video
--postprocessor-args NAME:ARGS   Give these arguments to the postprocessors.
                                 Specify the postprocessor/executable name
                                 and the arguments separated by a colon ":"
                                 to give the argument to the specified
                                 postprocessor/executable. Supported PP are:
                                 Merger, ModifyChapters, SplitChapters,
                                 ExtractAudio, VideoRemuxer, VideoConvertor,
                                 Metadata, EmbedSubtitle, EmbedThumbnail,
                                 SubtitlesConvertor, ThumbnailsConvertor,
                                 FixupStretched, FixupM4a, FixupM3u8,
                                 FixupTimestamp and FixupDuration. The
                                 supported executables are: AtomicParsley,
                                 FFmpeg and FFprobe. You can also specify
                                 "PP+EXE:ARGS" to give the arguments to the
                                 specified executable only when being used
                                 by the specified postprocessor.
                                 Additionally, for ffmpeg/ffprobe, "_i"/"_o"
                                 can be appended to the prefix optionally
                                 followed by a number to pass the argument
                                 before the specified input/output file. Eg:
                                 --ppa "Merger+ffmpeg_i1:-v quiet". You can
                                 use this option multiple times to give
                                 different arguments to different
                                 postprocessors. (Alias: --ppa)
-k, --keep-video                 Keep the intermediate video file on disk
                                 after post-processing
--no-keep-video                  Delete the intermediate video file after
                                 post-processing (default)
--post-overwrites                Overwrite post-processed files (default)
--no-post-overwrites             Do not overwrite post-processed files
--embed-subs                     Embed subtitles in the video (only for mp4,
                                 webm and mkv videos)
--no-embed-subs                  Do not embed subtitles (default)
--embed-thumbnail                Embed thumbnail in the video as cover art
--no-embed-thumbnail             Do not embed thumbnail (default)
--embed-metadata                 Embed metadata to the video file. Also
                                 embeds chapters/infojson if present unless
                                 --no-embed-chapters/--no-embed-info-json
                                 are used (Alias: --add-metadata)
--no-embed-metadata              Do not add metadata to file (default)
                                 (Alias: --no-add-metadata)
--embed-chapters                 Add chapter markers to the video file
                                 (Alias: --add-chapters)
--no-embed-chapters              Do not add chapter markers (default)
                                 (Alias: --no-add-chapters)
--embed-info-json                Embed the infojson as an attachment to
                                 mkv/mka video files
--no-embed-info-json             Do not embed the infojson as an attachment
                                 to the video file
--parse-metadata FROM:TO         Parse additional metadata like title/artist
                                 from other fields; see "MODIFYING METADATA"
                                 for details
--replace-in-metadata FIELDS REGEX REPLACE
                                 Replace text in a metadata field using the
                                 given regex. This option can be used
                                 multiple times
--xattrs                         Write metadata to the video file's xattrs
                                 (using dublin core and xdg standards)
--concat-playlist POLICY         Concatenate videos in a playlist. One of
                                 "never", "always", or "multi_video"
                                 (default; only when the videos form a
                                 single show). All the video files must have
                                 same codecs and number of streams to be
                                 concatable. The "pl_video:" prefix can be
                                 used with "--paths" and "--output" to set
                                 the output filename for the split files.
                                 See "OUTPUT TEMPLATE" for details
--fixup POLICY                   Automatically correct known faults of the
                                 file. One of never (do nothing), warn (only
                                 emit a warning), detect_or_warn (the
                                 default; fix file if we can, warn
                                 otherwise), force (try fixing even if file
                                 already exists)
--ffmpeg-location PATH           Location of the ffmpeg binary; either the
                                 path to the binary or its containing
                                 directory
--exec [WHEN:]CMD                Execute a command, optionally prefixed with
                                 when to execute it (after_move if
                                 unspecified), separated by a ":". Supported
                                 values of "WHEN" are the same as that of
                                 --use-postprocessor. Same syntax as the
                                 output template can be used to pass any
                                 field as arguments to the command. After
                                 download, an additional field "filepath"
                                 that contains the final path of the
                                 downloaded file is also available, and if
                                 no fields are passed, %(filepath)q is
                                 appended to the end of the command. This
                                 option can be used multiple times
--no-exec                        Remove any previously defined --exec
--convert-subs FORMAT            Convert the subtitles to another format
                                 (currently supported: srt|vtt|ass|lrc)
                                 (Alias: --convert-subtitles)
--convert-thumbnails FORMAT      Convert the thumbnails to another format
                                 (currently supported: jpg|png)
--split-chapters                 Split video into multiple files based on
                                 internal chapters. The "chapter:" prefix
                                 can be used with "--paths" and "--output"
                                 to set the output filename for the split
                                 files. See "OUTPUT TEMPLATE" for details
--no-split-chapters              Do not split video based on chapters
                                 (default)
--remove-chapters REGEX          Remove chapters whose title matches the
                                 given regular expression. Time ranges
                                 prefixed by a "*" can also be used in place
                                 of chapters to remove the specified range.
                                 Eg: --remove-chapters "*10:15-15:00"
                                 --remove-chapters "intro". This option can
                                 be used multiple times
--no-remove-chapters             Do not remove any chapters from the file
                                 (default)
--force-keyframes-at-cuts        Force keyframes around the chapters before
                                 removing/splitting them. Requires a
                                 re-encode and thus is very slow, but the
                                 resulting video may have fewer artifacts
                                 around the cuts
--no-force-keyframes-at-cuts     Do not force keyframes around the chapters
                                 when cutting/splitting (default)
--use-postprocessor NAME[:ARGS]  The (case sensitive) name of plugin
                                 postprocessors to be enabled, and
                                 (optionally) arguments to be passed to it,
                                 separated by a colon ":". ARGS are a
                                 semicolon ";" delimited list of NAME=VALUE.
                                 The "when" argument determines when the
                                 postprocessor is invoked. It can be one of
                                 "pre_process" (after extraction),
                                 "before_dl" (before video download),
                                 "post_process" (after video download;
                                 default), "after_move" (after moving file
                                 to their final locations), "after_video"
                                 (after downloading and processing all
                                 formats of a video), or "playlist" (end of
                                 playlist). This option can be used multiple
                                 times to add different postprocessors

SponsorBlock Options:

copy iconCopydownload iconDownload
--sponsorblock-mark CATS         SponsorBlock categories to create chapters
                                 for, separated by commas. Available
                                 categories are all, default(=all), sponsor,
                                 intro, outro, selfpromo, preview, filler,
                                 interaction, music_offtopic, poi_highlight.
                                 You can prefix the category with a "-" to
                                 exempt it. See [1] for description of the
                                 categories. Eg: --sponsorblock-mark all,-preview
                                 [1] https://wiki.sponsor.ajay.app/w/Segment_Categories
--sponsorblock-remove CATS       SponsorBlock categories to be removed from
                                 the video file, separated by commas. If a
                                 category is present in both mark and
                                 remove, remove takes precedence. The syntax
                                 and available categories are the same as
                                 for --sponsorblock-mark except that
                                 "default" refers to "all,-filler" and
                                 poi_highlight is not available
--sponsorblock-chapter-title TEMPLATE
                                 The title template for SponsorBlock
                                 chapters created by --sponsorblock-mark.
                                 The same syntax as the output template is
                                 used, but the only available fields are
                                 start_time, end_time, category, categories,
                                 name, category_names. Defaults to
                                 "[SponsorBlock]: %(category_names)l"
--no-sponsorblock                Disable both --sponsorblock-mark and
                                 --sponsorblock-remove
--sponsorblock-api URL           SponsorBlock API location, defaults to
                                 https://sponsor.ajay.app

Extractor Options:

copy iconCopydownload iconDownload
--extractor-retries RETRIES      Number of retries for known extractor
                                 errors (default is 3), or "infinite"
--allow-dynamic-mpd              Process dynamic DASH manifests (default)
                                 (Alias: --no-ignore-dynamic-mpd)
--ignore-dynamic-mpd             Do not process dynamic DASH manifests
                                 (Alias: --no-allow-dynamic-mpd)
--hls-split-discontinuity        Split HLS playlists to different formats at
                                 discontinuities such as ad breaks
--no-hls-split-discontinuity     Do not split HLS playlists to different
                                 formats at discontinuities such as ad
                                 breaks (default)
--extractor-args KEY:ARGS        Pass these arguments to the extractor. See
                                 "EXTRACTOR ARGUMENTS" for details. You can
                                 use this option multiple times to give
                                 arguments for different extractors

CONFIGURATION

copy iconCopydownload iconDownload
# Lines starting with # are comments

# Always extract audio
-x

# Do not copy the mtime
--no-mtime

# Use this proxy
--proxy 127.0.0.1:3128

# Save all videos under YouTube directory in your home directory
-o ~/YouTube/%(title)s.%(ext)s

Authentication with

copy iconCopydownload iconDownload
touch $HOME/.netrc
chmod a-rwx,u+rw $HOME/.netrc

OUTPUT TEMPLATE

copy iconCopydownload iconDownload
%(name[.keys][addition][>strf][,alternate][&replacement][|default])[flags][width][.precision][length]type

Format Selection examples

copy iconCopydownload iconDownload
# Download and merge the best video-only format and the best audio-only format,
# or download the best combined format if video-only format is not available
$ yt-dlp -f "bv+ba/b"

# Download best format that contains video,
# and if it doesn't already have an audio stream, merge it with best audio-only format
$ yt-dlp -f "bv*+ba/b"

# Same as above
$ yt-dlp

# Download the best video-only format and the best audio-only format without merging them
# For this case, an output template should be used since
# by default, bestvideo and bestaudio will have the same file name.
$ yt-dlp -f "bv,ba" -o "%(title)s.f%(format_id)s.%(ext)s"

# Download and merge the best format that has a video stream,
# and all audio-only formats into one file
$ yt-dlp -f "bv*+mergeall[vcodec=none]" --audio-multistreams

# Download and merge the best format that has a video stream,
# and the best 2 audio-only formats into one file
$ yt-dlp -f "bv*+ba+ba.2" --audio-multistreams


# The following examples show the old method (without -S) of format selection
# and how to use -S to achieve a similar but (generally) better result

# Download the worst video available (old method)
$ yt-dlp -f "wv*+wa/w"

# Download the best video available but with the smallest resolution
$ yt-dlp -S "+res"

# Download the smallest video available
$ yt-dlp -S "+size,+br"



# Download the best mp4 video available, or the best video if no mp4 available
$ yt-dlp -f "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b"

# Download the best video with the best extension
# (For video, mp4 > webm > flv. For audio, m4a > aac > mp3 ...)
$ yt-dlp -S "ext"



# Download the best video available but no better than 480p,
# or the worst video if there is no video under 480p
$ yt-dlp -f "bv*[height<=480]+ba/b[height<=480] / wv*+ba/w"

# Download the best video available with the largest height but no better than 480p,
# or the best video with the smallest resolution if there is no video under 480p
$ yt-dlp -S "height:480"

# Download the best video available with the largest resolution but no better than 480p,
# or the best video with the smallest resolution if there is no video under 480p
# Resolution is determined by using the smallest dimension.
# So this works correctly for vertical videos as well
$ yt-dlp -S "res:480"



# Download the best video (that also has audio) but no bigger than 50 MB,
# or the worst video (that also has audio) if there is no video under 50 MB
$ yt-dlp -f "b[filesize<50M] / w"

# Download largest video (that also has audio) but no bigger than 50 MB,
# or the smallest video (that also has audio) if there is no video under 50 MB
$ yt-dlp -f "b" -S "filesize:50M"

# Download best video (that also has audio) that is closest in size to 50 MB
$ yt-dlp -f "b" -S "filesize~50M"



# Download best video available via direct link over HTTP/HTTPS protocol,
# or the best video available via any protocol if there is no such video
$ yt-dlp -f "(bv*+ba/b)[protocol^=http][protocol!*=dash] / (bv*+ba/b)"

# Download best video available via the best protocol
# (https/ftps > http/ftp > m3u8_native > m3u8 > http_dash_segments ...)
$ yt-dlp -S "proto"



# Download the best video with h264 codec, or the best video if there is no such video
$ yt-dlp -f "(bv*[vcodec^=avc1]+ba) / (bv*+ba/b)"

# Download the best video with best codec no better than h264,
# or the best video with worst codec if there is no such video
$ yt-dlp -S "codec:h264"

# Download the best video with worst codec no worse than h264,
# or the best video with best codec if there is no such video
$ yt-dlp -S "+codec:h264"



# More complex examples

# Download the best video no better than 720p preferring framerate greater than 30,
# or the worst video (still preferring framerate greater than 30) if there is no such video
$ yt-dlp -f "((bv*[fps>30]/bv*)[height<=720]/(wv*[fps>30]/wv*)) + ba / (b[fps>30]/b)[height<=720]/(w[fps>30]/w)"

# Download the video with the largest resolution no better than 720p,
# or the video with the smallest resolution available if there is no such video,
# preferring larger framerate for formats with the same resolution
$ yt-dlp -S "res:720,fps"



# Download the video with smallest resolution no worse than 480p,
# or the video with the largest resolution available if there is no such video,
# preferring better codec and then larger total bitrate for the same resolution
$ yt-dlp -S "+res:480,codec,br"

Modifying metadata examples

copy iconCopydownload iconDownload
# Interpret the title as "Artist - Title"
$ yt-dlp --parse-metadata "title:%(artist)s - %(title)s"

# Regex example
$ yt-dlp --parse-metadata "description:Artist - (?P<artist>.+)"

# Set title as "Series name S01E05"
$ yt-dlp --parse-metadata "%(series)s S%(season_number)02dE%(episode_number)02d:%(title)s"

# Set "comment" field in video metadata using description instead of webpage_url
$ yt-dlp --parse-metadata "description:(?s)(?P<meta_comment>.+)" --add-metadata

# Remove "formats" field from the infojson by setting it to an empty string
$ yt-dlp --parse-metadata ":(?P<formats>)" -j

# Replace all spaces and "_" in title and uploader with a `-`
$ yt-dlp --replace-in-metadata "title,uploader" "[ _]" "-"

EMBEDDING YT-DLP

copy iconCopydownload iconDownload
from yt_dlp import YoutubeDL

ydl_opts = {'format': 'bestaudio'}
with YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])

DEPRECATED OPTIONS

copy iconCopydownload iconDownload
-j, --dump-json                  --print "%()j"
-F, --list-formats               --print formats_table
--list-thumbnails                --print thumbnails_table --print playlist:thumbnails_table
--list-subs                      --print automatic_captions_table --print subtitles_table

How to hide error message from youtube-dl / yt-dlp?

copy iconCopydownload iconDownload
import yt_dlp as youtube_dl
from yt_dlp.utils import DownloadError


url = "https://www.twitch.tv/videos/1410795876"

class loggerOutputs:
    def error(msg):
        print("Captured Error: "+msg)
    def warning(msg):
        print("Captured Warning: "+msg)
    def debug(msg):
        print("Captured Log: "+msg)


options = {
    "quiet": True,
    "format": "bestaudio/worst",
    "logger": loggerOutputs,
}

with youtube_dl.YoutubeDL(options) as ydl:
    try:
        info = ydl.extract_info(url, download=False)
    except DownloadError:
        print("An exception has been caught")
 

Porting code from youtube-dl to yt-dlp library for Python Discord Bot

copy iconCopydownload iconDownload
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])
if searchword[0:4] != "http" and searchword[0:3] != "www":
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            info = ydl.extract_info(f"ytsearch:{searchword}", download = False)["entries"][0]
            title = info["title"]
            url = info["webpage_url"]
-----------------------
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            ydl.download([url])
if searchword[0:4] != "http" and searchword[0:3] != "www":
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            info = ydl.extract_info(f"ytsearch:{searchword}", download = False)["entries"][0]
            title = info["title"]
            url = info["webpage_url"]

Heroku FFMPEG Postprocessing error with yt-dlp DownloadError

copy iconCopydownload iconDownload
'ffmpeg_location': './FFMPEG_CONFIG/ffmpeg.exe',
heroku buildpacks:set heroku/python
heroku buildpacks:add --index 1 https://github.com/FFmpeg/FFmpeg.git
-----------------------
'ffmpeg_location': './FFMPEG_CONFIG/ffmpeg.exe',
heroku buildpacks:set heroku/python
heroku buildpacks:add --index 1 https://github.com/FFmpeg/FFmpeg.git

grabbing video title from yt-dlp command line output

copy iconCopydownload iconDownload
from yt_dlp import YoutubeDL

with YoutubeDL() as ydl: 
  info_dict = ydl.extract_info('https://youtu.be/0KFSuoHEYm0', download=False)
  video_url = info_dict.get("url", None)
  video_id = info_dict.get("id", None)
  video_title = info_dict.get('title', None)
  print("Title: " + video_title) # <= Here, you got the video title
#[youtube] 0KFSuoHEYm0: Downloading webpage
#[youtube] 0KFSuoHEYm0: Downloading android player API JSON
#Title: TJ Watt gets his 4th sack of the game vs. Browns
-----------------------
from yt_dlp import YoutubeDL

with YoutubeDL() as ydl: 
  info_dict = ydl.extract_info('https://youtu.be/0KFSuoHEYm0', download=False)
  video_url = info_dict.get("url", None)
  video_id = info_dict.get("id", None)
  video_title = info_dict.get('title', None)
  print("Title: " + video_title) # <= Here, you got the video title
#[youtube] 0KFSuoHEYm0: Downloading webpage
#[youtube] 0KFSuoHEYm0: Downloading android player API JSON
#Title: TJ Watt gets his 4th sack of the game vs. Browns

How to remove &quot;press enter to continue&quot; when running Powershell within Python

copy iconCopydownload iconDownload
'C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe & {yt-dlp https://www.youtube.com/watch?v=jtjnnykvnh4}'

yt-dlp 'rate-limit' not throttiling speed in Python script

copy iconCopydownload iconDownload
ydl_opts = {
        'ratelimit': 500000
    }

with yt_dlp.YoutubeDL(params=ydl_opts) as ydl:
    ydl.download([link]) 
-----------------------
>>> from yt_dlp import FileDownloader
>>> help(FileDownloader)
Help on class FileDownloader in module yt_dlp.downloader.common:

class FileDownloader(builtins.object)
 |  FileDownloader(ydl, params)
 |
 |  File Downloader class.
...
 |  ratelimit:          Download speed limit, in bytes/sec.
...

Python buffered IO ending early streaming with multiple pipes [BOUNTY]

copy iconCopydownload iconDownload
from subprocess import Popen, PIPE, DEVNULL
import threading
import time

COPY_BUFSIZE = 65424

playlist = [
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
]



# Writer thread (read from yt-dlp and write to FFmpeg in chunks of COPY_BUFSIZE bytes).
def writer(yt_dlp_proc, encoder_proc):
    while True:
        yt_dlp_buf = yt_dlp_proc.stdout.read(COPY_BUFSIZE)
        print("READ: yt_dlp")
        if not yt_dlp_buf:
            print("yt-dlp buffer empty")
            break

        written = encoder_proc.stdin.write(yt_dlp_buf)
        print("WRITE: encoder. Bytes: " + str(written))
    
    encoder_proc.stdin.close()  # Close stdin pipe (closing stdin "pushes" the remaining data to stdout).
    encoder_proc.wait()  # Wait for sub-process finish execution.


if __name__ == "__main__":
    rtmp_url = "rtmp://127.0.0.1/live/H1P_x5WPF"

    ffplay_cmd = ['ffplay', '-listen', '1', '-i', rtmp_url] # Start the TCP server first, before the sending client.    
    ffplay_process = Popen(ffplay_cmd, stderr=DEVNULL)  # Use FFplay sub-process for receiving the RTMP video.

    stream_cmd = [
        "ffmpeg", "-loglevel", "error",
        "-hide_banner", "-re", "-i", "-",
        "-c:v", "libx264",
        "-f", "flv",
        "-b:v", "3000k", "-minrate", "3000k",
        "-maxrate", "3000k", "-bufsize", "3000k",
        "-r", "25", "-pix_fmt", "yuv420p",
        rtmp_url #"rtmp://127.0.0.1/live/H1P_x5WPF"
    ]
    print(f'Stream command:\n"{" ".join(stream_cmd)}"')

    encoder_cmd = [
        "ffmpeg", "-re", "-i", "-", "-f", "mpegts",
        "-c", "copy", "-"
    ]
    print(f'Encoder command:\n"{" ".join(encoder_cmd)}"')

    stream_p = Popen(stream_cmd, stdin=PIPE, stderr=DEVNULL)

    for video in playlist:
        yt_dlp_cmd = [
            "yt-dlp", "-q",
            video["url"],
            "-o", "-"
        ]

        print("Now playing: " + video["url"])

        with Popen(yt_dlp_cmd, stdout=PIPE) as yt_dlp_p:
            with Popen(encoder_cmd, stdin=PIPE, stdout=PIPE, stderr=DEVNULL) as encoder_p:

                thread = threading.Thread(target=writer, args=(yt_dlp_p, encoder_p))
                thread.start()  # Start writer thread.

                while True:
                    encoder_buf = encoder_p.stdout.read(COPY_BUFSIZE)

                    if not encoder_buf:
                        print("encoder_buf empty")
                        break

                    print("READ: encoder")

                    stream_bytes_written = stream_p.stdin.write(encoder_buf)
                    print("WRITE: stream, Bytes: " + str(stream_bytes_written))

        thread.join()  # Wait for writer thread to end.
        yt_dlp_p.wait()

    stream_p.stdin.close()  # Close stdin pipe (closing stdin "pushes" the remaining data to stdout).
    stream_p.wait()  # Wait for sub-process finish execution.


    time.sleep(3)  # Wait 3 seconds before closing FFplay
    ffplay_process.kill()  # Forcefully close FFplay sub-process
from pytube import YouTube
from subprocess import Popen, run, PIPE, DEVNULL
import time

playlist = [
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
]

n = len(playlist)

# Build string for concat demuxer https://video.stackexchange.com/a/18256/18277
filter_complex_str = ''
for i in range(n):
    filter_complex_str += f'[{i}:v]setpts=PTS-STARTPTS[v{i}];[{i}:a]asetpts=PTS-STARTPTS[a{i}];'   # "[0:v]setpts=PTS-STARTPTS[v0];[0:a]asetpts=PTS-STARTPTS[a0];[1:v]setpts=PTS-STARTPTS[v1];[1:a]asetpts=PTS-STARTPTS[a1];[2:v]setpts=PTS-STARTPTS[v2];[2:a]asetpts=PTS-STARTPTS[a2]"
for i in range(n):
    filter_complex_str += f'[v{i}][a{i}]'  # ";[v0][a0][v1][a1][v2][a2]"
filter_complex_str += f'concat=n={n}:v=1:a=1[v][a]'

# Get the video stream URL of every YouTube HTTP URL.
# Add -i before each URL (to be used as FFmpeg input).
playlist_url = []
for video in playlist:
    yt = YouTube(video["url"])
    # https://github.com/pytube/pytube/issues/301
    stream_url = yt.streams[0].url  # Get the URL of the video stream
    playlist_url.append('-i')
    playlist_url.append(stream_url)


rtmp_url = "rtmp://127.0.0.1/live/H1P_x5WPF"

ffplay_cmd = ['ffplay', '-listen', '1', '-i', rtmp_url]  # Start the TCP server first, before the sending client.
ffplay_process = Popen(ffplay_cmd, stderr=DEVNULL)  # Use FFplay sub-process for receiving the RTMP video.

stream_cmd = [
    "ffmpeg", "-loglevel", "error",
    "-hide_banner", "-re"] + playlist_url + ["-filter_complex",
    filter_complex_str,  # '[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]'
    "-map", "[v]", "-map", "[a]",
    "-c:v", "libx264",
    "-f", "flv",
    "-b:v", "3000k", "-minrate", "3000k",
    "-maxrate", "3000k", "-bufsize", "3000k",
    "-r", "25", "-pix_fmt", "yuv420p",
    rtmp_url]

run(stream_cmd)

time.sleep(60)  # Wait 60 seconds before closing FFplay
ffplay_process.kill()  # Forcefully close FFplay sub-process
-----------------------
from subprocess import Popen, PIPE, DEVNULL
import threading
import time

COPY_BUFSIZE = 65424

playlist = [
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
]



# Writer thread (read from yt-dlp and write to FFmpeg in chunks of COPY_BUFSIZE bytes).
def writer(yt_dlp_proc, encoder_proc):
    while True:
        yt_dlp_buf = yt_dlp_proc.stdout.read(COPY_BUFSIZE)
        print("READ: yt_dlp")
        if not yt_dlp_buf:
            print("yt-dlp buffer empty")
            break

        written = encoder_proc.stdin.write(yt_dlp_buf)
        print("WRITE: encoder. Bytes: " + str(written))
    
    encoder_proc.stdin.close()  # Close stdin pipe (closing stdin "pushes" the remaining data to stdout).
    encoder_proc.wait()  # Wait for sub-process finish execution.


if __name__ == "__main__":
    rtmp_url = "rtmp://127.0.0.1/live/H1P_x5WPF"

    ffplay_cmd = ['ffplay', '-listen', '1', '-i', rtmp_url] # Start the TCP server first, before the sending client.    
    ffplay_process = Popen(ffplay_cmd, stderr=DEVNULL)  # Use FFplay sub-process for receiving the RTMP video.

    stream_cmd = [
        "ffmpeg", "-loglevel", "error",
        "-hide_banner", "-re", "-i", "-",
        "-c:v", "libx264",
        "-f", "flv",
        "-b:v", "3000k", "-minrate", "3000k",
        "-maxrate", "3000k", "-bufsize", "3000k",
        "-r", "25", "-pix_fmt", "yuv420p",
        rtmp_url #"rtmp://127.0.0.1/live/H1P_x5WPF"
    ]
    print(f'Stream command:\n"{" ".join(stream_cmd)}"')

    encoder_cmd = [
        "ffmpeg", "-re", "-i", "-", "-f", "mpegts",
        "-c", "copy", "-"
    ]
    print(f'Encoder command:\n"{" ".join(encoder_cmd)}"')

    stream_p = Popen(stream_cmd, stdin=PIPE, stderr=DEVNULL)

    for video in playlist:
        yt_dlp_cmd = [
            "yt-dlp", "-q",
            video["url"],
            "-o", "-"
        ]

        print("Now playing: " + video["url"])

        with Popen(yt_dlp_cmd, stdout=PIPE) as yt_dlp_p:
            with Popen(encoder_cmd, stdin=PIPE, stdout=PIPE, stderr=DEVNULL) as encoder_p:

                thread = threading.Thread(target=writer, args=(yt_dlp_p, encoder_p))
                thread.start()  # Start writer thread.

                while True:
                    encoder_buf = encoder_p.stdout.read(COPY_BUFSIZE)

                    if not encoder_buf:
                        print("encoder_buf empty")
                        break

                    print("READ: encoder")

                    stream_bytes_written = stream_p.stdin.write(encoder_buf)
                    print("WRITE: stream, Bytes: " + str(stream_bytes_written))

        thread.join()  # Wait for writer thread to end.
        yt_dlp_p.wait()

    stream_p.stdin.close()  # Close stdin pipe (closing stdin "pushes" the remaining data to stdout).
    stream_p.wait()  # Wait for sub-process finish execution.


    time.sleep(3)  # Wait 3 seconds before closing FFplay
    ffplay_process.kill()  # Forcefully close FFplay sub-process
from pytube import YouTube
from subprocess import Popen, run, PIPE, DEVNULL
import time

playlist = [
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
    {
        # 15 second video
        "url": "https://youtube.com/watch?v=QiInzFHIDp4"
    },
]

n = len(playlist)

# Build string for concat demuxer https://video.stackexchange.com/a/18256/18277
filter_complex_str = ''
for i in range(n):
    filter_complex_str += f'[{i}:v]setpts=PTS-STARTPTS[v{i}];[{i}:a]asetpts=PTS-STARTPTS[a{i}];'   # "[0:v]setpts=PTS-STARTPTS[v0];[0:a]asetpts=PTS-STARTPTS[a0];[1:v]setpts=PTS-STARTPTS[v1];[1:a]asetpts=PTS-STARTPTS[a1];[2:v]setpts=PTS-STARTPTS[v2];[2:a]asetpts=PTS-STARTPTS[a2]"
for i in range(n):
    filter_complex_str += f'[v{i}][a{i}]'  # ";[v0][a0][v1][a1][v2][a2]"
filter_complex_str += f'concat=n={n}:v=1:a=1[v][a]'

# Get the video stream URL of every YouTube HTTP URL.
# Add -i before each URL (to be used as FFmpeg input).
playlist_url = []
for video in playlist:
    yt = YouTube(video["url"])
    # https://github.com/pytube/pytube/issues/301
    stream_url = yt.streams[0].url  # Get the URL of the video stream
    playlist_url.append('-i')
    playlist_url.append(stream_url)


rtmp_url = "rtmp://127.0.0.1/live/H1P_x5WPF"

ffplay_cmd = ['ffplay', '-listen', '1', '-i', rtmp_url]  # Start the TCP server first, before the sending client.
ffplay_process = Popen(ffplay_cmd, stderr=DEVNULL)  # Use FFplay sub-process for receiving the RTMP video.

stream_cmd = [
    "ffmpeg", "-loglevel", "error",
    "-hide_banner", "-re"] + playlist_url + ["-filter_complex",
    filter_complex_str,  # '[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]'
    "-map", "[v]", "-map", "[a]",
    "-c:v", "libx264",
    "-f", "flv",
    "-b:v", "3000k", "-minrate", "3000k",
    "-maxrate", "3000k", "-bufsize", "3000k",
    "-r", "25", "-pix_fmt", "yuv420p",
    rtmp_url]

run(stream_cmd)

time.sleep(60)  # Wait 60 seconds before closing FFplay
ffplay_process.kill()  # Forcefully close FFplay sub-process

macos shell prompt for input then execute

copy iconCopydownload iconDownload
#! /bin/bash

echo "paste youtube url"
read URL
yt-dlp -f 'bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b' "$URL"
-----------------------
yt-dlp -f 'bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b' $URL 
#! /bin/bash

echo "paste youtube url"
read URL
yt-dlp -f 'bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b' $URL
-----------------------
yt-dlp -f 'bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b' $URL 
#! /bin/bash

echo "paste youtube url"
read URL
yt-dlp -f 'bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b' $URL

Powershell replacing : with #

copy iconCopydownload iconDownload
$arr = '-o', "N:/$save_dir/%(upload_date)s_%(title)s_%(id)s.%(ext)s"
& yt-dlp $arr --cache-dir $PSScriptRoot/bin/cache (Get-Clipboard)
$list_dir = , ('-o', "N:/$save_dir/%(upload_date)s_%(title)s_%(id)s.%(ext)s")
ForEach ($item in $list_dir) {
  & yt-dlp $item --cache-dir $PSScriptRoot/bin/cache (Get-Clipboard)
}
-----------------------
$arr = '-o', "N:/$save_dir/%(upload_date)s_%(title)s_%(id)s.%(ext)s"
& yt-dlp $arr --cache-dir $PSScriptRoot/bin/cache (Get-Clipboard)
$list_dir = , ('-o', "N:/$save_dir/%(upload_date)s_%(title)s_%(id)s.%(ext)s")
ForEach ($item in $list_dir) {
  & yt-dlp $item --cache-dir $PSScriptRoot/bin/cache (Get-Clipboard)
}

Community Discussions

Trending Discussions on yt-dlp
  • Error adding playlist in yt-dlp discord.py
  • How to hide error message from youtube-dl / yt-dlp?
  • Porting code from youtube-dl to yt-dlp library for Python Discord Bot
  • mpv doesn't recognise ytdl_path as a key
  • Heroku FFMPEG Postprocessing error with yt-dlp DownloadError
  • grabbing video title from yt-dlp command line output
  • How to remove &quot;press enter to continue&quot; when running Powershell within Python
  • yt-dlp 'rate-limit' not throttiling speed in Python script
  • Abort job on failed fragements yt-dlp
  • Python buffered IO ending early streaming with multiple pipes [BOUNTY]
Trending Discussions on yt-dlp

QUESTION

Error adding playlist in yt-dlp discord.py

Asked 2022-Mar-10 at 08:54

My bot is on Heroku.

[youtube:tab] PL4fGSI1pDJn5kI81J1fYWK5eZRl1zJ5kM: Downloading webpage
WARNING: [youtube:tab] unable to extract yt initial data; please report this issue on  https://github.com/yt-dlp/yt-dlp , filling out the "Broken site" issue template properly. Confirm you are on the latest version using  yt-dlp -U
WARNING: [youtube:tab] Incomplete yt initial data received. Retrying ...
[youtube:tab] PL4fGSI1pDJn5kI81J1fYWK5eZRl1zJ5kM: Downloading webpage (retry #1)
WARNING: [youtube:tab] unable to extract yt initial data; please report this issue on  https://github.com/yt-dlp/yt-dlp , filling out the "Broken site" issue template properly. Confirm you are on the latest version using  yt-dlp -U
WARNING: [youtube:tab] Incomplete yt initial data received. Retrying ...
[youtube:tab] PL4fGSI1pDJn5kI81J1fYWK5eZRl1zJ5kM: Downloading webpage (retry #2)
WARNING: [youtube:tab] unable to extract yt initial data; please report this issue on  https://github.com/yt-dlp/yt-dlp , filling out the "Broken site" issue template properly. Confirm you are on the latest version using  yt-dlp -U
WARNING: [youtube:tab] Incomplete yt initial data received. Retrying ...
[youtube:tab] PL4fGSI1pDJn5kI81J1fYWK5eZRl1zJ5kM: Downloading webpage (retry #3)
WARNING: [youtube:tab] unable to extract yt initial data; please report this issue on  https://github.com/yt-dlp/yt-dlp , filling out the "Broken site" issue template properly. Confirm you are on the latest version using  yt-dlp -U
WARNING: [youtube:tab] Incomplete yt initial data received
ERROR: [youtube:tab] PL4fGSI1pDJn5kI81J1fYWK5eZRl1zJ5kM: Playlists that require authentication may not extract correctly without a successful webpage download. If you are not downloading private content, or your cookies are only for the first account and channel, pass "--extractor-args youtubetab:skip=authcheck" to skip this check 

If I write to the heroku console:

yt-dlp --cookies cookies.txt https://www.youtube.com/playlist?list=PLSdfU8nTff5QcNqq-muG9AZrYiVy4S3zV

the download of music starts (music is not played), but each time it is not very good to write a command to the console. Thanks in advance for your help

ANSWER

Answered 2022-Mar-10 at 08:54

removed from code: "cookiefile": "/config/cookies/cookies.txt" and everything worked

Source https://stackoverflow.com/questions/71412022

Community Discussions, Code Snippets contain sources that include Stack Exchange Network

Vulnerabilities

No vulnerabilities reported

Install yt-dlp

You can install yt-dlp using one of the following methods:.

Support

See CONTRIBUTING.md for instructions on Opening an Issue and Contributing code to the project.

DOWNLOAD this Library from

Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from
over 430 million Knowledge Items
Find more libraries
Reuse Solution Kits and Libraries Curated by Popular Use Cases

Save this library and start creating your kit

Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from
over 430 million Knowledge Items
Find more libraries
Reuse Solution Kits and Libraries Curated by Popular Use Cases

Save this library and start creating your kit

  • © 2022 Open Weaver Inc.