From 420a868e71a2034eeb314d9f68fc016c06af8a0c Mon Sep 17 00:00:00 2001 From: fmnijk Date: Thu, 13 May 2021 23:52:08 +0800 Subject: [PATCH 1/4] Add --ugoira-conv-copy option and "repeat-last" configuration option --- gallery_dl/option.py | 13 +++++++++++++ gallery_dl/postprocessor/ugoira.py | 22 ++++++++++++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/gallery_dl/option.py b/gallery_dl/option.py index 6018542e6b..3a24b0234a 100644 --- a/gallery_dl/option.py +++ b/gallery_dl/option.py @@ -359,6 +359,19 @@ def build_parser(): }, help="Convert Pixiv Ugoira to WebM in VP9 lossless mode", ) + postprocessor.add_argument( + "--ugoira-conv-copy", + dest="postprocessors", action="append_const", const={ + "name" : "ugoira", + "ffmpeg-twopass": False, + "whitelist" : ("pixiv", "danbooru"), + "libx264-prevent-odd": False, + "extension" : "mkv", + "re-encoding" : False, + "repeat-last" : False, + }, + help="Convert Pixiv Ugoira to MKV in copy mode (without re-encoding)", + ) postprocessor.add_argument( "--write-metadata", dest="postprocessors", diff --git a/gallery_dl/postprocessor/ugoira.py b/gallery_dl/postprocessor/ugoira.py index e8a2c5911b..7628d7997d 100644 --- a/gallery_dl/postprocessor/ugoira.py +++ b/gallery_dl/postprocessor/ugoira.py @@ -26,6 +26,8 @@ def __init__(self, job, options): self.twopass = options.get("ffmpeg-twopass", False) self.output = options.get("ffmpeg-output", True) self.delete = not options.get("keep-files", False) + self.repeat = options.get("repeat-last", True if self.extension != "gif" else False) + self.re_encodeing = options.get("re-encoding", True) ffmpeg = options.get("ffmpeg-location") self.ffmpeg = util.expand_path(ffmpeg) if ffmpeg else "ffmpeg" @@ -90,18 +92,26 @@ def convert(self, pathfmt): for frame in self._frames: file.write("file '{}'\n".format(frame["file"])) file.write("duration {}\n".format(frame["delay"] / 1000)) - if self.extension != "gif": + if self.repeat: # repeat the last frame to prevent it from only being # displayed for a very short amount of time file.write("file '{}'\n".format(self._frames[-1]["file"])) # collect command-line arguments args = [self.ffmpeg] - if rate_in: - args += ("-r", str(rate_in)) - args += ("-i", ffconcat) - if rate_out: - args += ("-r", str(rate_out)) + if self.re_encodeing: + if rate_in: + args += ("-r", str(rate_in)) + args += ("-i", ffconcat) + if rate_out: + args += ("-r", str(rate_out)) + else: + if rate_in: + args += ("-framerate", str(rate_in)) + args += ("-i", tempdir + "/%6d.jpg") + if rate_out: + args += ("-framerate", str(rate_out)) + args += ("-codec", "copy") if self.prevent_odd: args += ("-vf", "crop=iw-mod(iw\\,2):ih-mod(ih\\,2)") if self.args: From 755723a7e53eaa181d161367e5e206a34d88da7a Mon Sep 17 00:00:00 2001 From: fmnijk Date: Fri, 14 May 2021 00:33:26 +0800 Subject: [PATCH 2/4] update configuration.rst --- docs/configuration.rst | 21 +++++++++++++++++++++ gallery_dl/postprocessor/ugoira.py | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index 0cd00db52e..7e49705631 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -2491,6 +2491,27 @@ Description to reduce an odd width/height by 1 pixel and make them even. +ugoira.repeat-last-frame +-------------------------- +Type + ``bool`` +Default + ``False`` +Description + Repeat the last frame to prevent it from only being + displayed for a very short amount of time. + + +ugoira.re-encoding +-------------------------- +Type + ``bool`` +Default + ``True`` +Description + * ``"False"``: Prevent re-encoding during conversion. + + zip.compression --------------- Type diff --git a/gallery_dl/postprocessor/ugoira.py b/gallery_dl/postprocessor/ugoira.py index 7628d7997d..4abd4ca429 100644 --- a/gallery_dl/postprocessor/ugoira.py +++ b/gallery_dl/postprocessor/ugoira.py @@ -26,7 +26,7 @@ def __init__(self, job, options): self.twopass = options.get("ffmpeg-twopass", False) self.output = options.get("ffmpeg-output", True) self.delete = not options.get("keep-files", False) - self.repeat = options.get("repeat-last", True if self.extension != "gif" else False) + self.repeat = options.get("repeat-last-frame", False) self.re_encodeing = options.get("re-encoding", True) ffmpeg = options.get("ffmpeg-location") From e165c8b8ee99c3944bd86e2ee911535f389beba5 Mon Sep 17 00:00:00 2001 From: fmnijk Date: Wed, 9 Jun 2021 21:34:42 +0800 Subject: [PATCH 3/4] test mkvmerge --- gallery_dl/postprocessor/ugoira.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/gallery_dl/postprocessor/ugoira.py b/gallery_dl/postprocessor/ugoira.py index a8fe2b545c..4e54d269db 100644 --- a/gallery_dl/postprocessor/ugoira.py +++ b/gallery_dl/postprocessor/ugoira.py @@ -105,6 +105,24 @@ def convert(self, pathfmt): else: args.append(pathfmt.realpath) self._exec(args) + + # test mkvmerge + timecodes = tempdir + "/timecodes.txt" + content = ["# timestamp format v2"] + append = content.append + timecode = 0 + append("{}".format(timecode)) + for frame in self._frames: + timecode = timecode + frame["delay"] + append("{}".format(timecode)) + if self.repeat: + append("{}".format(timecode)) + append("") + with open(timecodes, "w") as file: + file.write("\n".join(content)) + self._exec("mkvmerge --timecodes 0:{}/timecodes.txt -o {} = {}".format( + tempdir, tempdir + "/mkvmerge.mkv", pathfmt.realpath)) + os.replace(tempdir + "/mkvmerge.mkv", pathfmt.realpath) except OSError as exc: print() self.log.error("Unable to invoke FFmpeg (%s: %s)", @@ -169,4 +187,4 @@ def calculate_framerate(framelist): return (fps, None) if len(counter) == 1 else (None, fps) -__postprocessor__ = UgoiraPP \ No newline at end of file +__postprocessor__ = UgoiraPP From 980314ed7f45ef0a5d8181b3605f56bb7a949a34 Mon Sep 17 00:00:00 2001 From: fmnijk Date: Thu, 10 Jun 2021 20:46:31 +0800 Subject: [PATCH 4/4] Update ugoira.py --- gallery_dl/postprocessor/ugoira.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gallery_dl/postprocessor/ugoira.py b/gallery_dl/postprocessor/ugoira.py index 4e54d269db..925679744f 100644 --- a/gallery_dl/postprocessor/ugoira.py +++ b/gallery_dl/postprocessor/ugoira.py @@ -122,7 +122,8 @@ def convert(self, pathfmt): file.write("\n".join(content)) self._exec("mkvmerge --timecodes 0:{}/timecodes.txt -o {} = {}".format( tempdir, tempdir + "/mkvmerge.mkv", pathfmt.realpath)) - os.replace(tempdir + "/mkvmerge.mkv", pathfmt.realpath) + from shutil import move + move(tempdir + "/mkvmerge.mkv", pathfmt.realpath) except OSError as exc: print() self.log.error("Unable to invoke FFmpeg (%s: %s)",