A Ruby wrapper for yt-dlp/youtube-dl with progress callbacks.
gem install ytdl
gem 'ytdl'
Make sure you have yt-dlp or youtube-dl installed and available in your PATH
. If you have pip
installed:
pip install yt-dlp
# or
pip install youtube-dl
Minimal example:
YoutubeDL.download('https://www.youtube.com/watch?v=MmIWve5bUpU').call
With callbacks and options:
state = YoutubeDL.download('https://www.youtube.com/watch?v=MmIWve5bUpU', format: 'mp4')
.on_progress do |state:, line:|
puts "Progress: #{state.progress}%"
end
.on_error do |state:, line:|
puts "Error: #{state.error}"
end
.on_complete do |state:, line:|
puts "Complete: #{state.destination}"
end
.call
YoutubeDL.download
returns the state after yt-dlp
has exited. If the download was successful, state.info_json
is loaded into state.info
and the info_json
file deleted.
YoutubeDL::Command.config.executable = 'youtube-dl' # if you're using youtube-dl instead of yt-dlp
YoutubeDL::Command.config.default_options = { some_option: true }
One event is emitted for each line printed by yt-dlp
.
The full list of events types is:
unparsable
: TheOutputParser
couldn't parse the linedestination
: Download destination announcement (stored instate.destination
)info_json
: Info JSON destination announcement (stored instate.info_json
)progress
: Download progress in percentage (stored instate.progress
)error
: An error message (stored instate.error
without theERROR:
prefix)complete
: The download is complete (Info JSON is parsed intostate.info
and deleted,state.destination
now exists)unclear_exit_state
:yt-dlp
exited without error, but eitherdestination
orinfo_json
does not exist
Options passed to YoutubeDL.download
get transformed as follows:
some_option: true
becomes--some-option
some_option: false
becomes--no-some-option
some_option: 'anything'
becomes--some-option anything
some_option: nil
can be used to remove a default option