diff --git a/Symphogear/XV [BD]/05/ep5pv_ac.py b/Symphogear/XV [BD]/05/ep5pv_ac.py index efbbef1..78235f9 100755 --- a/Symphogear/XV [BD]/05/ep5pv_ac.py +++ b/Symphogear/XV [BD]/05/ep5pv_ac.py @@ -7,6 +7,6 @@ import vapoursynth as vs core = vs.core ac = acsuite.AC() -path = r"bdmv/KIXA_90889/BDMV/STREAM/00004.m2ts" +path = r"../bdmv/KIXA_90889/BDMV/STREAM/00004.m2ts" src = core.lsmas.LWLibavSource(path) ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep5pv.wav") diff --git a/Symphogear/XV [BD]/06/ep6.vpy b/Symphogear/XV [BD]/06/ep6.vpy index 87aa9cf..4fa4ae4 100644 --- a/Symphogear/XV [BD]/06/ep6.vpy +++ b/Symphogear/XV [BD]/06/ep6.vpy @@ -23,8 +23,8 @@ FADE_RANGES: List[FadeRange] = [ W2X_DENOISE: List[Range] = [ (OP[0]+1859, OP[0]+1896) # flashy OP scene ] -DEBAND_HARD: List[Range] = [] -DEBAND_HARDER: List[Range] = [] +DEBAND_HARD: List[Range] = [(25301, 25403)] # chris henshin +DEBAND_HARDER: List[Range] = [(25347, 25361)] # chris henshin src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts") src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00006.m2ts")[:-24] diff --git a/Symphogear/XV [BD]/06/ep6pv_ac.py b/Symphogear/XV [BD]/06/ep6pv_ac.py index e68c243..02d7a3b 100755 --- a/Symphogear/XV [BD]/06/ep6pv_ac.py +++ b/Symphogear/XV [BD]/06/ep6pv_ac.py @@ -7,6 +7,6 @@ import vapoursynth as vs core = vs.core ac = acsuite.AC() -path = r"bdmv/KIXA_90889/BDMV/STREAM/00006.m2ts" +path = r"../bdmv/KIXA_90889/BDMV/STREAM/00006.m2ts" src = core.lsmas.LWLibavSource(path) ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep6pv.wav") diff --git a/Symphogear/XV [BD]/07/ep7.vpy b/Symphogear/XV [BD]/07/ep7.vpy new file mode 100644 index 0000000..feb9662 --- /dev/null +++ b/Symphogear/XV [BD]/07/ep7.vpy @@ -0,0 +1,62 @@ +import vapoursynth as vs + +from toolz.functoolz import compose +from typing import List, Optional, Tuple + +import sys +sys.path.append("..") + +from xv_common import (FadeRange, Range, denoise, descale, w2x, deband, + mask_oped, mask_logo, finalize) # noqa: E402 + +core = vs.core +core.max_cache_size = 1024 + +OP: Optional[Tuple[int, int]] = (2566, 4962) +ED: Optional[Tuple[int, int]] = None +LOGO: Range = (17059, 17236) +NO_SCALE: List[Range] = [ + (31876, 34045), # credits + (34516, 34587), # next episode title +] +FORCE_SCALE: List[Range] = [ + (7692, 8889), # kiri henshin + (30734, 31260), # carol henshin +] +FADE_RANGES: List[FadeRange] = [ + FadeRange(ref=5041, range_=(4976, 5057)), # title +] + +W2X_DENOISE: List[Range] = [] +if OP is not None: + W2X_DENOISE.append( + (OP[0]+1859, OP[0]+1896), # flashy OP scene + ) + +DEBAND_HARD: List[Range] = [ + (7797, 7887), # kiri henshin + 9062, # ??? +] +DEBAND_HARDER: List[Range] = [ + (7815, 7851), # kiri henshin +] + +src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90891/BDMV/STREAM/00003.m2ts") +src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90891/BDMV/STREAM/00004.m2ts")[:-24] +src_op = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24] +src_ed = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24] +src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416] +src = src_ep + src_pv +src = src.fmtc.bitdepth(bits=16) +den = denoise(src) + +final = compose( + finalize, + mask_logo(src=den, src_logo=src_logo, range=LOGO), + mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed), + deband(hard=DEBAND_HARD, harder=DEBAND_HARDER), + w2x(w2x_range=W2X_DENOISE), + descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES) +)(den) + +final.set_output() diff --git a/Symphogear/XV [BD]/07/ep7pv_ac.py b/Symphogear/XV [BD]/07/ep7pv_ac.py new file mode 100755 index 0000000..d854983 --- /dev/null +++ b/Symphogear/XV [BD]/07/ep7pv_ac.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 + +import acsuite +import os +import vapoursynth as vs + +core = vs.core + +ac = acsuite.AC() +path = r"../bdmv/KIXA_90890/BDMV/STREAM/00004.m2ts" +src = core.lsmas.LWLibavSource(path) +ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep7pv.wav") diff --git a/Symphogear/XV [BD]/08/ep8.vpy b/Symphogear/XV [BD]/08/ep8.vpy new file mode 100644 index 0000000..d72a03d --- /dev/null +++ b/Symphogear/XV [BD]/08/ep8.vpy @@ -0,0 +1,55 @@ +import vapoursynth as vs + +from toolz.functoolz import compose +from typing import List, Optional, Tuple + +import sys +sys.path.append("..") + +from xv_common import (FadeRange, Range, denoise, descale, w2x, deband, + mask_oped, mask_logo, finalize) # noqa: E402 + +core = vs.core +core.max_cache_size = 1024 + +OP: Optional[Tuple[int, int]] = (2230, 4626) +ED: Optional[Tuple[int, int]] = None +LOGO: Range = (14350, 14515) +NO_SCALE: List[Range] = [ + (31822, 34045), # credits + (34493, 34573), # next episode title +] +FORCE_SCALE: List[Range] = [ + (1797, 1955), # carol henshin + (30972, 31573), # miku henshin +] +FADE_RANGES: List[FadeRange] = [] + +W2X_DENOISE: List[Range] = [] +if OP is not None: + W2X_DENOISE.append( + (OP[0]+1859, OP[0]+1896), # flashy OP scene + ) + +DEBAND_HARD: List[Range] = [] +DEBAND_HARDER: List[Range] = [] + +src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90891/BDMV/STREAM/00005.m2ts") +src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90891/BDMV/STREAM/00006.m2ts")[:-24] +src_op = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24] +src_ed = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24] +src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416] +src = src_ep + src_pv +src = src.fmtc.bitdepth(bits=16) +den = denoise(src) + +final = compose( + finalize, + mask_logo(src=den, src_logo=src_logo, range=LOGO), + mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed), + deband(hard=DEBAND_HARD, harder=DEBAND_HARDER), + w2x(w2x_range=W2X_DENOISE), + descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES) +)(den) + +final.set_output() diff --git a/Symphogear/XV [BD]/08/ep8pv_ac.py b/Symphogear/XV [BD]/08/ep8pv_ac.py new file mode 100755 index 0000000..4e8baff --- /dev/null +++ b/Symphogear/XV [BD]/08/ep8pv_ac.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 + +import acsuite +import os +import vapoursynth as vs + +core = vs.core + +ac = acsuite.AC() +path = r"../bdmv/KIXA_90890/BDMV/STREAM/00006.m2ts" +src = core.lsmas.LWLibavSource(path) +ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep8pv.wav") diff --git a/Symphogear/XV [BD]/09/ep9.vpy b/Symphogear/XV [BD]/09/ep9.vpy new file mode 100644 index 0000000..72a827e --- /dev/null +++ b/Symphogear/XV [BD]/09/ep9.vpy @@ -0,0 +1,59 @@ +import vapoursynth as vs + +from toolz.functoolz import compose +from typing import List, Optional, Tuple + +import sys +sys.path.append("..") + +from xv_common import (FadeRange, Range, denoise, descale, descale720, + w2x, deband, mask_oped, mask_logo, finalize) # noqa: E402 + +core = vs.core +core.max_cache_size = 1024 + +S1 = [(0, 69), (132, 383)] +G = [(384, 439)] +GX = [(70, 131), (440, 489)] +AXZ = [(490, 682)] +OP: Optional[Tuple[int, int]] = (1296, 3692) +ED: Optional[Tuple[int, int]] = (31623, 33780) +LOGO: Range = (12265, 12430) +NO_SCALE: List[Range] = [ + (34513, 34605), # next episode title +] +FORCE_SCALE: List[Range] = [] +FORCE_SCALE = FORCE_SCALE + AXZ +FADE_RANGES: List[FadeRange] = [ + FadeRange(ref=3763, range_=(3694, 3775)), +] + +W2X_DENOISE: List[Range] = [] +if OP is not None: + W2X_DENOISE.append( + (OP[0]+1859, OP[0]+1896), # flashy OP scene + ) + +DEBAND_HARD: List[Range] = [] +DEBAND_HARDER: List[Range] = [] + +src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90892/BDMV/STREAM/00003.m2ts") +src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90892/BDMV/STREAM/00004.m2ts")[:-24] +src_op = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24] +src_ed = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24] +src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416] +src = src_ep + src_pv +src = src.fmtc.bitdepth(bits=16) +den = denoise(src) + +final = compose( + finalize, + mask_logo(src=den, src_logo=src_logo, range=LOGO), + mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed), + deband(hard=DEBAND_HARD, harder=DEBAND_HARDER), + w2x(w2x_range=W2X_DENOISE), + descale720(src=den, ranges=S1+G+GX), + descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES) +)(den) + +final.set_output() diff --git a/Symphogear/XV [BD]/09/ep9pv_ac.py b/Symphogear/XV [BD]/09/ep9pv_ac.py new file mode 100755 index 0000000..fe8baaf --- /dev/null +++ b/Symphogear/XV [BD]/09/ep9pv_ac.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 + +import acsuite +import os +import vapoursynth as vs + +core = vs.core + +ac = acsuite.AC() +path = r"../bdmv/KIXA_90891/BDMV/STREAM/00004.m2ts" +src = core.lsmas.LWLibavSource(path) +ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep9pv.wav") diff --git a/Symphogear/XV [BD]/10/ep10.vpy b/Symphogear/XV [BD]/10/ep10.vpy new file mode 100644 index 0000000..d7d6fc7 --- /dev/null +++ b/Symphogear/XV [BD]/10/ep10.vpy @@ -0,0 +1,55 @@ +import vapoursynth as vs + +from toolz.functoolz import compose +from typing import List, Optional, Tuple + +import sys +sys.path.append("..") + +from xv_common import (FadeRange, Range, denoise, descale, w2x, deband, + mask_oped, mask_logo, finalize) # noqa: E402 + +core = vs.core +core.max_cache_size = 1024 + +OP: Optional[Tuple[int, int]] = (5563, 7959) +ED: Optional[Tuple[int, int]] = (31338, 33494) +LOGO: Range = (17924, 18089) +NO_SCALE: List[Range] = [ + (34515, 34607), # next episode title +] +FORCE_SCALE: List[Range] = [ + (19155, 20461), # shriabe henshin +] +FADE_RANGES: List[FadeRange] = [ + FadeRange(ref=8026, range_=(7961, 8042)), +] + +W2X_DENOISE: List[Range] = [] +if OP is not None: + W2X_DENOISE.append( + (OP[0]+1859, OP[0]+1896), # flashy OP scene + ) + +DEBAND_HARD: List[Range] = [] +DEBAND_HARDER: List[Range] = [] + +src_ep = core.lsmas.LWLibavSource("../bdmv/KIXA_90892/BDMV/STREAM/00005.m2ts") +src_pv = core.lsmas.LWLibavSource("../bdmv/KIXA_90892/BDMV/STREAM/00006.m2ts")[:-24] +src_op = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00007.m2ts")[24:-24] +src_ed = core.lsmas.LWLibavSource("../bdmv/KIXA_90889/BDMV/STREAM/00008.m2ts")[24:-24] +src_logo = core.lsmas.LWLibavSource("../bdmv/KIXA_90890/BDMV/STREAM/00005.m2ts")[18416] +src = src_ep + src_pv +src = src.fmtc.bitdepth(bits=16) +den = denoise(src) + +final = compose( + finalize, + mask_logo(src=den, src_logo=src_logo, range=LOGO), + mask_oped(src=den, op=OP, ed=ED, src_op=src_op, src_ed=src_ed), + deband(hard=DEBAND_HARD, harder=DEBAND_HARDER), + w2x(w2x_range=W2X_DENOISE), + descale(force_scale=FORCE_SCALE, no_scale=NO_SCALE, fade_ranges=FADE_RANGES) +)(den) + +final.set_output() diff --git a/Symphogear/XV [BD]/10/ep10pv_ac.py b/Symphogear/XV [BD]/10/ep10pv_ac.py new file mode 100755 index 0000000..6666c69 --- /dev/null +++ b/Symphogear/XV [BD]/10/ep10pv_ac.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 + +import acsuite +import os +import vapoursynth as vs + +core = vs.core + +ac = acsuite.AC() +path = r"../bdmv/KIXA_90891/BDMV/STREAM/00006.m2ts" +src = core.lsmas.LWLibavSource(path) +ac.eztrim(src, [(0, -24)], os.path.splitext(path)[0] + ".wav", "ep10pv.wav") diff --git a/Symphogear/XV [BD]/xv_common/__init__.py b/Symphogear/XV [BD]/xv_common/__init__.py index 748d585..d8f03c5 100644 --- a/Symphogear/XV [BD]/xv_common/__init__.py +++ b/Symphogear/XV [BD]/xv_common/__init__.py @@ -1,2 +1,2 @@ -from .scale import FadeRange, descale +from .scale import FadeRange, descale, descale720 from .filter import Range, denoise, w2x, deband, mask_oped, mask_logo, finalize diff --git a/Symphogear/XV [BD]/xv_common/filter.py b/Symphogear/XV [BD]/xv_common/filter.py index 2834703..af5cc2f 100644 --- a/Symphogear/XV [BD]/xv_common/filter.py +++ b/Symphogear/XV [BD]/xv_common/filter.py @@ -5,7 +5,7 @@ from kagefunc import adaptive_grain, retinex_edgemask from lvsfunc.misc import replace_ranges from mvsfunc import BM3D from toolz.functoolz import curry -from typing import List, Tuple, Union +from typing import List, Optional, Tuple, Union from vardefunc import dcm core = vs.core @@ -54,14 +54,18 @@ def deband(clip: vs.VideoNode, hard: List[Range], @curry def mask_oped(clip: vs.VideoNode, src: vs.VideoNode, - op: Tuple[int, int], ed: Tuple[int, int], src_op: vs.VideoNode, - src_ed: vs.VideoNode) -> vs.VideoNode: - credit_op_m = dcm(clip, src[op[0]:op[1]+1], - src_op[:op[1]-op[0]+1], op[0], op[1], 2, 2) - credit_ed_m = dcm(clip, src[ed[0]:ed[1]+1], - src_ed[:ed[1]-ed[0]+1], ed[0], ed[1], 2, 2) - credit_m = core.std.Expr([credit_op_m, credit_ed_m], 'x y +') - return core.std.MaskedMerge(clip, src, credit_m) + op: Optional[Tuple[int, int]], ed: Optional[Tuple[int, int]], + src_op: vs.VideoNode, src_ed: vs.VideoNode) -> vs.VideoNode: + merge = clip + if op is not None: + credit_op_m = dcm(clip, src[op[0]:op[1]+1], + src_op[:op[1]-op[0]+1], op[0], op[1], 2, 2) + merge = core.std.MaskedMerge(merge, src, credit_op_m) + if ed is not None: + credit_ed_m = dcm(clip, src[ed[0]:ed[1]+1], + src_ed[:ed[1]-ed[0]+1], ed[0], ed[1], 2, 2) + merge = core.std.MaskedMerge(merge, src, credit_ed_m) + return merge @curry diff --git a/Symphogear/XV [BD]/xv_common/scale.py b/Symphogear/XV [BD]/xv_common/scale.py index a0ac645..ad8b212 100644 --- a/Symphogear/XV [BD]/xv_common/scale.py +++ b/Symphogear/XV [BD]/xv_common/scale.py @@ -1,7 +1,6 @@ import vapoursynth as vs import vsutil -from functools import partial from kagefunc import retinex_edgemask from lvsfunc.aa import upscaled_sraa from lvsfunc.kernels import Bicubic @@ -20,6 +19,7 @@ class FadeRange(NamedTuple): range_: Tuple[int, int] +@curry def _sraa_frameeval(n: int, clip: vs.VideoNode, w: int, h: int ) -> vs.VideoNode: frame = clip.get_frame(n) @@ -33,8 +33,8 @@ def _sraa_frameeval(n: int, clip: vs.VideoNode, w: int, h: int def _sraa_reupscale(clip: vs.VideoNode, width: int, height: int ) -> vs.VideoNode: - sraa = clip.std.FrameEval(partial(_sraa_frameeval, clip=clip, w=width, - h=height)) + sraa = clip.std.FrameEval(_sraa_frameeval(clip=clip, w=width, + h=height)) scale = sraa.resize.Spline36(width, height, format=vs.GRAY16) return scale @@ -44,16 +44,18 @@ def _fade_ranges_with_refs(clip: vs.VideoNode, reupscaled: vs.VideoNode, mask = core.std.BlankClip(clip) for r in ranges: rmask = core.std.Expr([clip[r.ref], reupscaled[r.ref]], "x y - abs") + rmask = rmask.std.Binarize(1500) rmask = vsutil.iterate(rmask, core.std.Maximum, 4) - rmask = rmask.std.Binarize(4000) + rmask = vsutil.iterate(rmask, core.std.Inflate, 2) rmask = core.std.Expr([mask, rmask], "x y +") mask = replace_ranges(mask, rmask, [r.range_]) return mask -def _really_dumb_inverse_mask(clip: vs.VideoNode, reupscaled: vs.VideoNode, - ranges: List[FadeRange]) -> vs.VideoNode: +@curry +def _inverse_mask(clip: vs.VideoNode, reupscaled: vs.VideoNode, + ranges: List[FadeRange] = []) -> vs.VideoNode: reupscaled = reupscaled.resize.Bicubic(format=clip.format.id) line_mask = retinex_edgemask(clip, 0.0001).std.Binarize(10000) fade_mask = _fade_ranges_with_refs(clip, reupscaled, ranges) @@ -65,20 +67,31 @@ def _really_dumb_inverse_mask(clip: vs.VideoNode, reupscaled: vs.VideoNode, def descale(clip: vs.VideoNode, force_scale: List[Range], no_scale: List[Range], fade_ranges: List[FadeRange], show_mask: bool = False) -> vs.VideoNode: - dmask = partial(_really_dumb_inverse_mask, ranges=fade_ranges) kernel = Bicubic(b=1/3, c=1/3) heights = [871, 872, 873] y = vsutil.get_y(clip) ys = ldescale(y, upscaler=_sraa_reupscale, height=heights, - kernel=kernel, threshold=0.003, mask=dmask, - show_mask=show_mask) + kernel=kernel, threshold=0.003, + mask=_inverse_mask(ranges=fade_ranges), show_mask=show_mask) if show_mask: return ys yf = ldescale(y, upscaler=_sraa_reupscale, height=heights, - kernel=kernel, threshold=0, mask=dmask) + kernel=kernel, threshold=0, + mask=_inverse_mask(ranges=fade_ranges)) yd = replace_ranges(ys, yf, force_scale) scaled = core.std.ShufflePlanes([yd, clip], planes=[0, 1, 2], colorfamily=vs.YUV) scaled = replace_ranges(scaled, clip, no_scale) return scaled + + +@curry +def descale720(clip: vs.VideoNode, src: vs.VideoNode, ranges: List[Range] + ) -> vs.VideoNode: + y = ldescale(vsutil.get_y(src), upscaler=_sraa_reupscale, height=720, + kernel=Bicubic(b=1/3, c=1/3), threshold=0, mask=_inverse_mask) + scaled = core.std.ShufflePlanes([y, src], planes=[0, 1, 2], + colorfamily=vs.YUV) + scaled = replace_ranges(clip, scaled, ranges) + return scaled