[YoutubeDL] Add declarative version of progress hooks

pull/4490/head
Philipp Hagemeister 2014-12-15 01:26:18 +01:00
parent 4f026fafbc
commit 71b640cc5b
3 changed files with 32 additions and 18 deletions

View File

@ -537,7 +537,7 @@ From a Python program, you can embed youtube-dl in a more powerful fashion, like
Most likely, you'll want to use various options. For a list of what can be done, have a look at [youtube_dl/YoutubeDL.py](https://github.com/rg3/youtube-dl/blob/master/youtube_dl/YoutubeDL.py#L69). For a start, if you want to intercept youtube-dl's output, set a `logger` object. Most likely, you'll want to use various options. For a list of what can be done, have a look at [youtube_dl/YoutubeDL.py](https://github.com/rg3/youtube-dl/blob/master/youtube_dl/YoutubeDL.py#L69). For a start, if you want to intercept youtube-dl's output, set a `logger` object.
Here's a more complete example of a program that only outputs errors, and downloads/converts the video as mp3: Here's a more complete example of a program that outputs only errors (and a short message after the download is finished), and downloads/converts the video to an mp3 file:
import youtube_dl import youtube_dl
@ -553,6 +553,12 @@ Here's a more complete example of a program that only outputs errors, and downlo
def error(self, msg): def error(self, msg):
print(msg) print(msg)
def my_hook(d):
if d['status'] == 'finished':
print('Done downloading, now converting ...')
ydl_opts = { ydl_opts = {
'format': 'bestaudio/best', 'format': 'bestaudio/best',
'postprocessors': [{ 'postprocessors': [{
@ -561,6 +567,7 @@ Here's a more complete example of a program that only outputs errors, and downlo
'preferredquality': '64', 'preferredquality': '64',
}], }],
'logger': MyLogger(), 'logger': MyLogger(),
'progress_hooks': [my_hook],
} }
with youtube_dl.YoutubeDL(ydl_opts) as ydl: with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(['http://www.youtube.com/watch?v=BaW_jenozKc']) ydl.download(['http://www.youtube.com/watch?v=BaW_jenozKc'])

View File

@ -182,10 +182,27 @@ class YoutubeDL(object):
Pass in 'in_playlist' to only show this behavior for Pass in 'in_playlist' to only show this behavior for
playlist items. playlist items.
postprocessors: A list of dictionaries, each with an entry postprocessors: A list of dictionaries, each with an entry
key: The name of the postprocessor. See * key: The name of the postprocessor. See
youtube_dl/postprocessor/__init__.py for a list. youtube_dl/postprocessor/__init__.py for a list.
as well as any further keyword arguments for the as well as any further keyword arguments for the
postprocessor. postprocessor.
progress_hooks: A list of functions that get called on download
progress, with a dictionary with the entries
* filename: The final filename
* status: One of "downloading" and "finished"
The dict may also have some of the following entries:
* downloaded_bytes: Bytes on disk
* total_bytes: Size of the whole file, None if unknown
* tmpfilename: The filename we're currently writing to
* eta: The estimated time in seconds, None if unknown
* speed: The download speed in bytes/second, None if
unknown
Progress hooks are guaranteed to be called at least once
(with status "finished") if the download is successful.
The following parameters are not used by YoutubeDL itself, they are used by The following parameters are not used by YoutubeDL itself, they are used by
the FileDownloader: the FileDownloader:
@ -273,6 +290,9 @@ class YoutubeDL(object):
pp = pp_class(self, **compat_kwargs(pp_def)) pp = pp_class(self, **compat_kwargs(pp_def))
self.add_post_processor(pp) self.add_post_processor(pp)
for ph in self.params.get('progress_hooks', []):
self.add_progress_hook(ph)
def warn_if_short_id(self, argv): def warn_if_short_id(self, argv):
# short YouTube ID starting with dash? # short YouTube ID starting with dash?
idxs = [ idxs = [

View File

@ -305,19 +305,6 @@ class FileDownloader(object):
ph(status) ph(status)
def add_progress_hook(self, ph): def add_progress_hook(self, ph):
""" ph gets called on download progress, with a dictionary with the entries # See YoutubeDl.py (search for progress_hooks) for a description of
* filename: The final filename # this interface
* status: One of "downloading" and "finished"
It can also have some of the following entries:
* downloaded_bytes: Bytes on disks
* total_bytes: Total bytes, None if unknown
* tmpfilename: The filename we're currently writing to
* eta: The estimated time in seconds, None if unknown
* speed: The download speed in bytes/second, None if unknown
Hooks are guaranteed to be called at least once (with status "finished")
if the download is successful.
"""
self._progress_hooks.append(ph) self._progress_hooks.append(ph)