From 71b640cc5b2f15a6913a720b589bdd3ed318c154 Mon Sep 17 00:00:00 2001 From: Philipp Hagemeister Date: Mon, 15 Dec 2014 01:26:18 +0100 Subject: [PATCH] [YoutubeDL] Add declarative version of progress hooks --- README.md | 9 ++++++++- youtube_dl/YoutubeDL.py | 24 ++++++++++++++++++++++-- youtube_dl/downloader/common.py | 17 ++--------------- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index edfcfc223..bd35a8214 100644 --- a/README.md +++ b/README.md @@ -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. -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 @@ -553,6 +553,12 @@ Here's a more complete example of a program that only outputs errors, and downlo def error(self, msg): print(msg) + + def my_hook(d): + if d['status'] == 'finished': + print('Done downloading, now converting ...') + + ydl_opts = { 'format': 'bestaudio/best', 'postprocessors': [{ @@ -561,6 +567,7 @@ Here's a more complete example of a program that only outputs errors, and downlo 'preferredquality': '64', }], 'logger': MyLogger(), + 'progress_hooks': [my_hook], } with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download(['http://www.youtube.com/watch?v=BaW_jenozKc']) diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 6acfd8cf9..bea1ef83c 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -182,10 +182,27 @@ class YoutubeDL(object): Pass in 'in_playlist' to only show this behavior for playlist items. postprocessors: A list of dictionaries, each with an entry - key: The name of the postprocessor. See - youtube_dl/postprocessor/__init__.py for a list. + * key: The name of the postprocessor. See + youtube_dl/postprocessor/__init__.py for a list. as well as any further keyword arguments for the 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 FileDownloader: @@ -273,6 +290,9 @@ class YoutubeDL(object): pp = pp_class(self, **compat_kwargs(pp_def)) 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): # short YouTube ID starting with dash? idxs = [ diff --git a/youtube_dl/downloader/common.py b/youtube_dl/downloader/common.py index 8181bca09..d3e0b0110 100644 --- a/youtube_dl/downloader/common.py +++ b/youtube_dl/downloader/common.py @@ -305,19 +305,6 @@ class FileDownloader(object): ph(status) def add_progress_hook(self, ph): - """ ph gets called on download progress, with a dictionary with the entries - * filename: The final filename - * 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. - """ + # See YoutubeDl.py (search for progress_hooks) for a description of + # this interface self._progress_hooks.append(ph)