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