From 150dfcfdd4377fa53d85a0efa0b3b949582d97cb Mon Sep 17 00:00:00 2001 From: Yuanle Song <sylecn@gmail.com> Date: Wed, 6 Mar 2019 17:11:17 +0800 Subject: [PATCH] v0.5.0 add progress log for fragment download. also changed ffmpeg log level to warning. --- m3u8downloader/__init__.py | 2 +- m3u8downloader/main.py | 19 ++++++++++++++++--- operational | 5 ++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/m3u8downloader/__init__.py b/m3u8downloader/__init__.py index 3d26edf..3d18726 100644 --- a/m3u8downloader/__init__.py +++ b/m3u8downloader/__init__.py @@ -1 +1 @@ -__version__ = "0.4.1" +__version__ = "0.5.0" diff --git a/m3u8downloader/main.py b/m3u8downloader/main.py index 973480d..4c84f4b 100644 --- a/m3u8downloader/main.py +++ b/m3u8downloader/main.py @@ -143,22 +143,24 @@ class M3u8Downloader: self.media_playlist_localfile = None self.poolsize = 5 + self.total_fragments = 0 # {full_url: local_file} self.fragments = OrderedDict() def start(self): self.download_m3u8_link(self.start_url) - logger.info("%s fragments downloaded", len(self.fragments)) target_mp4 = self.output_filename if not target_mp4.endswith(".mp4"): target_mp4 += ".mp4" - cmd = ["ffmpeg", "-allowed_extensions", "ALL", + cmd = ["ffmpeg", + "-loglevel", "warning", + "-allowed_extensions", "ALL", "-i", self.media_playlist_localfile, "-acodec", "copy", "-vcodec", "copy", "-bsf:a", "aac_adtstoasc", target_mp4] - logger.info("%s", cmd) + logger.info("Running: %s", cmd) proc = subprocess.run(cmd) if proc.returncode != 0: logger.error("run ffmpeg command failed: exitcode=%s", @@ -222,6 +224,15 @@ class M3u8Downloader: """ url, fragment_full_name = result self.fragments[url] = fragment_full_name + # progress log + fetched_fragment = len(self.fragments) + if fetched_fragment == self.total_fragments: + logger.info("100%%, %s fragments fetched", self.total_fragments) + elif fetched_fragment % 10 == 0: + logger.info("[%2.0f%%] %3s/%s fragments fetched", + fetched_fragment * 100.0 / self.total_fragments, + fetched_fragment, + self.total_fragments) def fragment_download_failed(self, e): # pylint: disable=no-self-use """apply_async error callback. @@ -239,6 +250,8 @@ class M3u8Downloader: """ pool = multiprocessing.Pool(self.poolsize) + self.total_fragments = len(fragment_urls) + logger.info("playlist has %s fragments", self.total_fragments) for url in fragment_urls: if url in self.fragments: logger.info("skip downloaded fragment: %s", url) diff --git a/operational b/operational index a69a67c..fdbe253 100644 --- a/operational +++ b/operational @@ -39,6 +39,7 @@ to handle it on ryzen5. * current :entry: ** +* done :entry: ** 2019-03-03 add progress tracking log. do a commit before I add this. @@ -51,7 +52,9 @@ do a commit before I add this. how to add progress log. pool.join() is blocking. -* done :entry: + I can print progress in callback function. + is apply_async callback function called on master process? yes. + ** 2019-03-03 generate mp4 for audio sequence fail. probably because of png ext. https://m3u.x8sinablog.net/20180627/1530068509/vts/audio000.png -- GitLab