diff --git a/m3u8downloader/__init__.py b/m3u8downloader/__init__.py index 3d26edf777ed646f93a5251a6de0c443c106c694..3d187266f146fb216a04537da37dc5df0811acc4 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 973480d4acad8ed3533132da7884d25c20f29a70..4c84f4b89605ea26a202a9eb8af6daa86a21e66b 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 a69a67c140e0a5328338cb50e1865e7c664acfd5..fdbe2533d1b58506efd26bfcd03c998cc9eff0f8 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