5
0

vivy: tv: update scripts

This commit is contained in:
louis f 2021-04-19 18:07:40 -04:00
parent 7ed7202602
commit 61544e9ba1
Signed by: louis
GPG Key ID: 44D7E1DE4E23D6F2
13 changed files with 188 additions and 124 deletions

View File

@ -1,7 +1,10 @@
import vapoursynth as vs import vapoursynth as vs
from yt_common.automation import SelfRunner
from yt_common.source import waka_replace
from lvsfunc.types import Range from lvsfunc.types import Range
from lvsfunc.dehardsub import HardsubSign, bounded_dehardsub from lvsfunc.dehardsub import HardsubSign, HardsubMask, bounded_dehardsub
from typing import List from typing import List
@ -9,14 +12,21 @@ import os
import sys import sys
sys.path.append("..") sys.path.append("..")
from vivy_common import (SelfRunner, antialias, deband, denoise, # noqa: E402 from vivy_common import (VivyConfig, VivySource, antialias, deband, denoise, # noqa: E402
finalize, fsrcnnx_rescale, letterbox_edgefix, source) finalize, fsrcnnx_rescale, letterbox_edgefix)
core = vs.core core = vs.core
EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0])) EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
SIGNS_RU: List[HardsubSign] = [ CONFIG: VivyConfig = VivyConfig(EPNUM)
SOURCE: VivySource = VivySource(CONFIG)
WAKA_REPLACE: List[List[Range]] = [
[],
[]
]
SIGNS_RU: List[HardsubMask] = [
HardsubSign((5283, 5403), ((226, 786), (1214, 102)), highpass=2000), HardsubSign((5283, 5403), ((226, 786), (1214, 102)), highpass=2000),
HardsubSign((6778, 6888), ((588, 454), (434, 63)), highpass=2000), HardsubSign((6778, 6888), ((588, 454), (434, 63)), highpass=2000),
HardsubSign((9017, 9070), ((975, 301), (157, 24)), highpass=2000), HardsubSign((9017, 9070), ((975, 301), (157, 24)), highpass=2000),
@ -42,9 +52,11 @@ LETTERBOX: List[Range] = [
def filter_basic() -> vs.VideoNode: def filter_basic() -> vs.VideoNode:
waka, ref = source(EPNUM) wakas, ref = SOURCE.source()
waka = waka[:37301] + core.std.BlankClip(waka, length=6) + waka[37301:] wakas = [waka[:37301] + core.std.BlankClip(waka, length=6) + waka[37301:] for waka in wakas]
src = bounded_dehardsub(waka, ref, SIGNS_RU) waka = wakas[0]
waka, wakas = waka_replace(waka, wakas[1:], WAKA_REPLACE)
src = bounded_dehardsub(waka, ref, SIGNS_RU, wakas)
return src return src
@ -61,6 +73,6 @@ def filter() -> vs.VideoNode:
if __name__ == "__main__": if __name__ == "__main__":
SelfRunner(EPNUM, filter, filter_basic) SelfRunner(CONFIG, filter, filter_basic)
else: else:
filter() filter()

View File

@ -1,7 +1,10 @@
import vapoursynth as vs import vapoursynth as vs
from yt_common.automation import SelfRunner
from yt_common.source import waka_replace
from lvsfunc.types import Range from lvsfunc.types import Range
from lvsfunc.dehardsub import HardsubSign, bounded_dehardsub from lvsfunc.dehardsub import HardsubMask, HardsubSign, bounded_dehardsub
from typing import List from typing import List
@ -9,37 +12,44 @@ import os
import sys import sys
sys.path.append("..") sys.path.append("..")
from vivy_common import (SelfRunner, antialias, deband, denoise, finalize, # noqa: E402 from vivy_common import (VivyConfig, VivySource, antialias, deband, denoise, finalize, # noqa: E402
fsrcnnx_rescale, source) fsrcnnx_rescale)
core = vs.core core = vs.core
EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0])) EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
SIGNS_RU: List[HardsubSign] = [ CONFIG: VivyConfig = VivyConfig(EPNUM)
HardsubSign((125, 245), ((220, 865), (992, 98)), refframe=143), SOURCE: VivySource = VivySource(CONFIG)
HardsubSign((865, 896), ((1173, 539), (232, 40)), highpass=2000),
HardsubSign((2274, 2318), ((431, 671), (1068, 142)), highpass=2000), WAKA_REPLACE: List[List[Range]] = [
HardsubSign((2391, 2426), ((116, 62), (1471, 311)), highpass=2000), [],
HardsubSign((2427, 2452), ((317, 728), (1176, 80)), highpass=2000), [],
HardsubSign((3776, 3871), ((782, 286), (748, 76)), highpass=2000), ]
HardsubSign((3877, 3950), ((866, 524), (494, 53)), highpass=2000), SIGNS_RU: List[HardsubMask] = [
HardsubSign((6498, 6542), ((696, 296), (493, 31)), highpass=2000), HardsubSign((125, 245), ((220, 865), (992, 98)), refframe=143, blur=False),
HardsubSign((7212, 7221), ((430, 666), (1066, 149)), highpass=2000), HardsubSign((865, 896), ((1173, 539), (232, 40)), highpass=2000, blur=False),
HardsubSign((7222, 7233), ((317, 728), (1179, 84)), highpass=2000), HardsubSign((2274, 2318), ((431, 671), (1068, 142)), highpass=2000, blur=False),
HardsubSign((7234, 7245), ((410, 303), (1169, 129)), highpass=2000), HardsubSign((2391, 2426), ((116, 62), (1471, 311)), highpass=2000, blur=False),
HardsubSign((7246, 7254), ((514, 687), (807, 90)), highpass=2000), HardsubSign((2427, 2452), ((317, 728), (1176, 80)), highpass=2000, blur=False),
HardsubSign((27488, 27630), ((778, 287), (758, 78)), highpass=2000), HardsubSign((3776, 3871), ((782, 286), (748, 76)), highpass=2000, blur=False),
HardsubSign((27636, 27779), ((756, 449), (792, 87)), highpass=2000), HardsubSign((3877, 3950), ((866, 524), (494, 53)), highpass=2000, blur=False),
HardsubSign((28907, 28934), ((758, 454), (787, 79)), highpass=2000), HardsubSign((6498, 6542), ((696, 296), (493, 31)), highpass=2000, blur=False),
HardsubSign((28945, 28954), ((773, 481), (758, 57)), highpass=2000), HardsubSign((7212, 7221), ((430, 666), (1066, 149)), highpass=2000, blur=False),
HardsubSign((28986, 29019), ((621, 748), (657, 52)), highpass=2000), HardsubSign((7222, 7233), ((317, 728), (1179, 84)), highpass=2000, blur=False),
HardsubSign((29053, 29061), ((621, 748), (657, 52)), highpass=2000), HardsubSign((7234, 7245), ((410, 303), (1169, 129)), highpass=2000, blur=False),
HardsubSign((29062, 29077), ((649, 333), (742, 53)), highpass=2000), HardsubSign((7246, 7254), ((514, 687), (807, 90)), highpass=2000, blur=False),
HardsubSign((29615, 29674), ((336, 74), (1244, 76)), highpass=2000), HardsubSign((27488, 27630), ((778, 287), (758, 78)), highpass=2000, blur=False),
HardsubSign((29675, 29758), ((587, 68), (750, 85)), highpass=2000), HardsubSign((27636, 27779), ((756, 449), (792, 87)), highpass=2000, blur=False),
HardsubSign((30259, 30977), ((293, 843), (1321, 227)), highpass=2000), HardsubSign((28907, 28934), ((758, 454), (787, 79)), highpass=2000, blur=False),
HardsubSign((32608, 32703), ((281, 859), (890, 101)), highpass=2000), HardsubSign((28945, 28954), ((773, 481), (758, 57)), highpass=2000, blur=False),
HardsubSign((28986, 29019), ((621, 748), (657, 52)), highpass=2000, blur=False),
HardsubSign((29053, 29061), ((621, 748), (657, 52)), highpass=2000, blur=False),
HardsubSign((29062, 29077), ((649, 333), (742, 53)), highpass=2000, blur=False),
HardsubSign((29615, 29674), ((336, 74), (1244, 76)), highpass=2000, blur=False),
HardsubSign((29675, 29758), ((587, 68), (750, 85)), highpass=2000, blur=False),
HardsubSign((30259, 30977), ((293, 843), (1321, 227)), highpass=2000, blur=False),
HardsubSign((32608, 32703), ((281, 859), (890, 101)), highpass=2000, blur=False),
] ]
CREDITS: List[Range] = [(30152, 32343)] CREDITS: List[Range] = [(30152, 32343)]
PIXELSHIT: List[Range] = [ PIXELSHIT: List[Range] = [
@ -50,9 +60,11 @@ NOAA: List[Range] = PIXELSHIT
def filter_basic() -> vs.VideoNode: def filter_basic() -> vs.VideoNode:
waka, ref = source(EPNUM) wakas, ref = SOURCE.source()
waka = waka[:32344] + waka[32349:] wakas = [waka[:32344] + waka[32349:] for waka in wakas]
src = bounded_dehardsub(waka, ref, SIGNS_RU) waka = wakas[0]
waka, wakas = waka_replace(waka, wakas[1:], WAKA_REPLACE)
src = bounded_dehardsub(waka, ref, SIGNS_RU, wakas)
return src return src
@ -68,6 +80,6 @@ def filter() -> vs.VideoNode:
if __name__ == "__main__": if __name__ == "__main__":
SelfRunner(EPNUM, filter, filter_basic) SelfRunner(CONFIG, filter, filter_basic)
else: else:
filter() filter()

View File

@ -1,7 +1,10 @@
import vapoursynth as vs import vapoursynth as vs
from yt_common.automation import SelfRunner
from yt_common.source import waka_replace
from lvsfunc.types import Range from lvsfunc.types import Range
from lvsfunc.dehardsub import HardsubSign, bounded_dehardsub from lvsfunc.dehardsub import HardsubMask, HardsubLine, HardsubSign, bounded_dehardsub
from typing import List from typing import List
@ -9,26 +12,31 @@ import os
import sys import sys
sys.path.append("..") sys.path.append("..")
from vivy_common import (SelfRunner, antialias, deband, denoise, # noqa: E402 from vivy_common import (VivyConfig, VivySource, antialias, deband, denoise, # noqa: E402
finalize, fsrcnnx_rescale, letterbox_edgefix, source) finalize, fsrcnnx_rescale, letterbox_edgefix)
core = vs.core core = vs.core
EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0])) EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
SIGNS_RU: List[HardsubSign] = [ CONFIG: VivyConfig = VivyConfig(EPNUM)
HardsubSign((1371, 3157), ((293, 872), (1323, 162)), highpass=20000), SOURCE: VivySource = VivySource(CONFIG)
HardsubSign((3572, 3688), ((236, 860), (821, 103)), refframe=3671),
WAKA_REPLACE: List[List[Range]] = [
[(29968, 30792)],
[(31727, 31879)],
]
SIGNS_RU: List[HardsubMask] = [
HardsubLine((1371, 3157), ((293, 872), (1323, 162))),
HardsubSign((3572, 3688), ((236, 860), (821, 103)), refframes=3671),
HardsubSign((4040, 4105), ((937, 18), (811, 338))), HardsubSign((4040, 4105), ((937, 18), (811, 338))),
HardsubSign((4040, 4105), ((132, 671), (384, 211))), HardsubSign((4040, 4105), ((132, 671), (384, 211))),
HardsubSign((8135, 8259), ((583, 65), (744, 80))), HardsubSign((8135, 8259), ((583, 65), (744, 80))),
HardsubSign((9572, 9596), ((573, 74), (768, 79))), HardsubSign((9571, 9596), ((573, 74), (768, 79))),
HardsubSign((21874, 21942), ((532, 131), (445, 228)), highpass=2000), HardsubSign((21874, 21942), ((532, 131), (445, 228)), refframes=21942, highpass=2000),
HardsubSign((29968, 31084), ((293, 872), (1323, 162)), highpass=20000), HardsubLine((29968, 31084), ((293, 872), (1323, 182))),
HardsubSign((30002, 30792), ((302, 73), (1328, 142)), highpass=2000, expand=10), HardsubLine((32540, 32651), ((293, 872), (1323, 162))),
HardsubSign((31727, 31879), ((293, 872), (1323, 162)), highpass=20000), HardsubSign((33948, 34044), ((267, 857), (1067, 104)), refframes=34030),
HardsubSign((32540, 32651), ((293, 872), (1323, 162)), highpass=20000),
HardsubSign((33948, 34044), ((267, 857), (1067, 104)), refframe=34030),
] ]
NOSCALE: List[Range] = [] NOSCALE: List[Range] = []
NOAA: List[Range] = [] NOAA: List[Range] = []
@ -36,7 +44,9 @@ LETTERBOX: List[Range] = [(0, 432)]
def filter_basic() -> vs.VideoNode: def filter_basic() -> vs.VideoNode:
waka, ref = source(EPNUM) wakas, ref = SOURCE.source()
waka = wakas[0]
waka, wakas = waka_replace(waka, wakas[1:], WAKA_REPLACE)
src = bounded_dehardsub(waka, ref, SIGNS_RU) src = bounded_dehardsub(waka, ref, SIGNS_RU)
return src return src
@ -54,6 +64,6 @@ def filter() -> vs.VideoNode:
if __name__ == "__main__": if __name__ == "__main__":
SelfRunner(EPNUM, filter, filter_basic) SelfRunner(CONFIG, filter, filter_basic)
else: else:
filter() filter()

View File

@ -1,8 +1,10 @@
import vapoursynth as vs import vapoursynth as vs
from yt_common.automation import SelfRunner
from yt_common.source import waka_replace
from lvsfunc.types import Range from lvsfunc.types import Range
from lvsfunc.dehardsub import HardsubLine, HardsubSign, HardsubMask, bounded_dehardsub from lvsfunc.dehardsub import HardsubLine, HardsubSign, HardsubMask, bounded_dehardsub
from yt_common import SelfRunner
from typing import List from typing import List
@ -11,7 +13,7 @@ import sys
sys.path.append("..") sys.path.append("..")
from vivy_common import (VivyConfig, VivySource, antialias, deband, denoise, # noqa: E402 from vivy_common import (VivyConfig, VivySource, antialias, deband, denoise, # noqa: E402
finalize, fsrcnnx_rescale, letterbox_edgefix, waka_replace) finalize, fsrcnnx_rescale, letterbox_edgefix)
core = vs.core core = vs.core
@ -19,6 +21,11 @@ core = vs.core
EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0])) EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
CONFIG: VivyConfig = VivyConfig(EPNUM) CONFIG: VivyConfig = VivyConfig(EPNUM)
SOURCE: VivySource = VivySource(CONFIG) SOURCE: VivySource = VivySource(CONFIG)
WAKA_REPLACE: List[List[Range]] = [
[(30119, 30969)],
[],
]
SIGNS_RU: List[HardsubMask] = [ SIGNS_RU: List[HardsubMask] = [
HardsubLine((1278, 3392), ((275, 918), (1356, 112))), HardsubLine((1278, 3392), ((275, 918), (1356, 112))),
HardsubSign((3452, 3572), ((232, 857), (1077, 114)), refframes=3500), HardsubSign((3452, 3572), ((232, 857), (1077, 114)), refframes=3500),
@ -30,10 +37,6 @@ SIGNS_RU: List[HardsubMask] = [
NOSCALE: List[Range] = [] NOSCALE: List[Range] = []
NOAA: List[Range] = [] NOAA: List[Range] = []
LETTERBOX: List[Range] = [(0, 1151)] LETTERBOX: List[Range] = [(0, 1151)]
WAKA_REPLACE: List[List[Range]] = [
[(30119, 30969)],
[],
]
def filter_basic() -> vs.VideoNode: def filter_basic() -> vs.VideoNode:

View File

@ -1,2 +1,2 @@
from .filter import antialias, deband, denoise, finalize, fsrcnnx_rescale, letterbox_edgefix # noqa: F401 from .filter import antialias, deband, denoise, finalize, fsrcnnx_rescale, letterbox_edgefix # noqa: F401
from .util import SelfRunner, glob_crc, source # noqa: F401 from .config import VivyConfig, VivySource # noqa: F401

View File

@ -1,4 +1,8 @@
from yt_common import Config, FunimationSource import vapoursynth as vs
from yt_common import source
from yt_common.logging import log
from yt_common.config import Config
import os import os
@ -7,7 +11,6 @@ from typing import List
TITLE: str = "Vivy" TITLE: str = "Vivy"
TITLE_LONG: str = f"{TITLE} - Fluorite Eye's Song" TITLE_LONG: str = f"{TITLE} - Fluorite Eye's Song"
RESOLUTION: int = 1080 RESOLUTION: int = 1080
SUBGROUP: str = "YameteTomete"
DATAPATH: str = os.path.dirname(__file__) DATAPATH: str = os.path.dirname(__file__)
WAKA_RU_FILENAME: str = f"{TITLE}_{{epnum:02d}}_RU_HD.mp4" WAKA_RU_FILENAME: str = f"{TITLE}_{{epnum:02d}}_RU_HD.mp4"
@ -15,6 +18,9 @@ WAKA_FR_FILENAME: str = f"{TITLE}_{{epnum:02d}}_FR_HD.mp4"
WAKA_DE_FILENAME: str = f"{TITLE} - Fluorite Eyes Song E{{epnum:02d}} [1080p][AAC][JapDub][GerSub][Web-DL].mkv" WAKA_DE_FILENAME: str = f"{TITLE} - Fluorite Eyes Song E{{epnum:02d}} [1080p][AAC][JapDub][GerSub][Web-DL].mkv"
core = vs.core
class VivyConfig(Config): class VivyConfig(Config):
def __init__(self, epnum: int) -> None: def __init__(self, epnum: int) -> None:
super().__init__( super().__init__(
@ -26,7 +32,17 @@ class VivyConfig(Config):
) )
class VivySource(FunimationSource): class VivySource(source.FunimationSource):
def get_amazon(self) -> vs.VideoNode:
# ep1-3 have good funi video, let's just use that
if self.config.epnum < 4:
raise FileNotFoundError()
if not os.path.isfile(self.config.format_filename(source.AMAZON_FILENAME)):
log.warn("Amazon not found, falling back to Funimation")
raise FileNotFoundError()
log.success("Found Amazon video")
return core.ffms2.Source(self.config.format_filename(source.AMAZON_FILENAME))
def get_waka_filenames(self) -> List[str]: def get_waka_filenames(self) -> List[str]:
return [self.config.format_filename(f) for f in [ return [self.config.format_filename(f) for f in [
WAKA_RU_FILENAME, WAKA_RU_FILENAME,

View File

@ -1 +1 @@
x265 --input - --y4m --input-depth 10 --output-depth 10 --input-csp i420 --profile main10 --colormatrix bt709 --colorprim bt709 --transfer bt709 --preset slower --rc-lookahead 72 --keyint 360 --min-keyint 23 --subme 5 --qcomp 0.7 --crf 15 --aq-mode 3 --aq-strength 0.9 --bframes 16 --psy-rd 0.95 --psy-rdoq 1.8 --rdoq-level 1 --deblock -2:-2 --no-sao --frames {frames:d} --output {filename:s}.h265 x265 --input - --y4m --input-depth 10 --output-depth 10 --input-csp i420 --profile main10 --colormatrix bt709 --colorprim bt709 --transfer bt709 --preset slower --rc-lookahead 72 --keyint 360 --min-keyint 23 --subme 5 --qcomp 0.7 --crf 15 --aq-mode 3 --aq-strength 0.9 --bframes 16 --psy-rd 0.95 --psy-rdoq 1.8 --rdoq-level 1 --deblock -2:-2 --no-sao --no-open-gop --frames {frames:d} --output {filename:s}.h265

View File

@ -1,3 +1 @@
from .config import Config # noqa: F401 from . import config, automation, logging, source # noqa: F401
from .automation import SelfRunner # noqa: F401
from .source import DehardsubFileFinder, FunimationSource # noqa: F401

View File

@ -9,7 +9,7 @@ import subprocess
from typing import Any, BinaryIO, Callable, List, Optional, Sequence, Union, cast from typing import Any, BinaryIO, Callable, List, Optional, Sequence, Union, cast
from .config import Config from .config import Config
from .log import status, warn, error, success from .logging import log
from .source import AMAZON_FILENAME, ER_FILENAME, SUBSPLS_FILENAME, FUNI_INTRO, glob_crc from .source import AMAZON_FILENAME, ER_FILENAME, SUBSPLS_FILENAME, FUNI_INTRO, glob_crc
core = vs.core core = vs.core
@ -26,7 +26,7 @@ def bin_to_plat(binary: str) -> str:
def forward_signal(signum: int, frame: Any, process: Any) -> None: def forward_signal(signum: int, frame: Any, process: Any) -> None:
warn("Forwarding SIGINT") log.warn("Forwarding SIGINT")
process.send_signal(signum) process.send_signal(signum)
@ -55,12 +55,12 @@ class Encoder():
outfile = self.out_template.format(filename=filename) outfile = self.out_template.format(filename=filename)
if os.path.isfile(outfile) and not self.force: if os.path.isfile(outfile) and not self.force:
warn("Existing output detected, skipping encode!") log.warn("Existing output detected, skipping encode!")
return outfile return outfile
params = [p.format(frames=end-start, filename=filename) for p in self.params] params = [p.format(frames=end-start, filename=filename) for p in self.params]
status("--- RUNNING ENCODE ---") log.status("--- RUNNING ENCODE ---")
print("+ " + " ".join([self.binary] + list(params))) print("+ " + " ".join([self.binary] + list(params)))
@ -76,10 +76,10 @@ class Encoder():
# vapoursynth should handle this itself but just in case # vapoursynth should handle this itself but just in case
if process.returncode != 0: if process.returncode != 0:
error("--- ENCODE FAILED ---") log.error("--- ENCODE FAILED ---")
raise BrokenPipeError(f"Pipe to {self.binary} broken") raise BrokenPipeError(f"Pipe to {self.binary} broken")
success("--- ENCODE FINISHED ---") log.success("--- ENCODE FINISHED ---")
self.cleanup.append(outfile) self.cleanup.append(outfile)
return outfile return outfile
@ -136,7 +136,7 @@ class AudioGetter():
if os.path.isfile(self.config.format_filename(AMAZON_FILENAME)): if os.path.isfile(self.config.format_filename(AMAZON_FILENAME)):
self.audio_file = self.config.format_filename(AMAZON_FILENAME) self.audio_file = self.config.format_filename(AMAZON_FILENAME)
self.video_src = core.ffms2.Source(self.audio_file) self.video_src = core.ffms2.Source(self.audio_file)
success("Found Amazon audio") log.success("Found Amazon audio")
return return
# as of Ep4 SubsPlease is using new funi 128kbps aac while erai has 256kbps still # as of Ep4 SubsPlease is using new funi 128kbps aac while erai has 256kbps still
@ -147,15 +147,15 @@ class AudioGetter():
elif os.path.isfile(glob_crc(self.config.format_filename(SUBSPLS_FILENAME))): elif os.path.isfile(glob_crc(self.config.format_filename(SUBSPLS_FILENAME))):
self.audio_file = glob_crc(self.config.format_filename(SUBSPLS_FILENAME)) self.audio_file = glob_crc(self.config.format_filename(SUBSPLS_FILENAME))
self.video_src = core.ffms2.Source(self.audio_file) self.video_src = core.ffms2.Source(self.audio_file)
warn("Using SubsPlease, audio may be worse than Erai-Raws") log.warn("Using SubsPlease, audio may be worse than Erai-Raws")
else: else:
raise FileNotFoundError() raise FileNotFoundError()
except FileNotFoundError: except FileNotFoundError:
error("Could not find audio") log.error("Could not find audio")
raise raise
self.audio_start = FUNI_INTRO self.audio_start = FUNI_INTRO
warn("No Amazon audio, falling back to Funi") log.warn("No Amazon audio, falling back to Funi")
def trim_audio(self, src: vs.VideoNode, def trim_audio(self, src: vs.VideoNode,
trims: Union[acsuite.Trim, List[acsuite.Trim], None] = None) -> str: trims: Union[acsuite.Trim, List[acsuite.Trim], None] = None) -> str:
@ -213,11 +213,11 @@ class SelfRunner():
parser.add_argument("-s", "--start", nargs='?', type=int, help="Start encode at frame START") parser.add_argument("-s", "--start", nargs='?', type=int, help="Start encode at frame START")
parser.add_argument("-e", "--end", nargs='?', type=int, help="Stop encode at frame END (inclusive)") parser.add_argument("-e", "--end", nargs='?', type=int, help="Stop encode at frame END (inclusive)")
parser.add_argument("-k", "--keep", help="Keep raw video", action="store_true") parser.add_argument("-k", "--keep", help="Keep raw video", action="store_true")
parser.add_argument("-c", "--encoder", type=str, help="Override detected encoder binary") parser.add_argument("-b", "--encoder", type=str, help="Override detected encoder binary")
parser.add_argument("-f", "--force", help="Overwrite existing intermediaries", action="store_true") parser.add_argument("-f", "--force", help="Overwrite existing intermediaries", action="store_true")
parser.add_argument("-a", "--audio", type=str, help="Force audio file") parser.add_argument("-a", "--audio", type=str, help="Force audio file")
parser.add_argument("-x", "--suffix", type=str, help="Change the suffix of the mux") parser.add_argument("-x", "--suffix", type=str, help="Change the suffix of the mux")
parser.add_argument("-d", "--no-metadata", help="No extra metadata in premux", action="store_true") parser.add_argument("-c", "--no-chapters", help="No chapters in premux", action="store_true")
args = parser.parse_args() args = parser.parse_args()
self.workraw = args.workraw if workraw_filter else False self.workraw = args.workraw if workraw_filter else False
@ -226,10 +226,10 @@ class SelfRunner():
self.clip = workraw_filter() if workraw_filter and self.workraw else final_filter() self.clip = workraw_filter() if workraw_filter and self.workraw else final_filter()
basename = "workraw-settings" if self.workraw else "final-settings" basename = "workraw-settings" if self.workraw else "final-settings"
settings_path = os.path.join(os.path.dirname(__file__), basename) settings_path = os.path.join(self.config.datapath, basename)
if not os.path.isfile(settings_path): if not os.path.isfile(settings_path):
raise FileNotFoundError("Failed to find {basename}!") raise FileNotFoundError(f"Failed to find {settings_path}!")
start = args.start if args.start is not None else 0 start = args.start if args.start is not None else 0
if args.end is not None: if args.end is not None:
@ -254,33 +254,32 @@ class SelfRunner():
self.encoder = Encoder(self.config.epnum, settings_path, args.encoder, args.force) self.encoder = Encoder(self.config.epnum, settings_path, args.encoder, args.force)
self.video_file = self.encoder.encode(self.clip, f"{self.config.epnum:02d}_{start}_{end}", start, end) self.video_file = self.encoder.encode(self.clip, f"{self.config.epnum:02d}_{start}_{end}", start, end)
status("--- LOOKING FOR AUDIO ---") log.status("--- LOOKING FOR AUDIO ---")
self.audio = AudioGetter(self.config, args.audio) self.audio = AudioGetter(self.config, args.audio)
status("--- TRIMMING AUDIO ---") log.status("--- TRIMMING AUDIO ---")
self.audio_file = self.audio.trim_audio(self.clip, (start, end)) self.audio_file = self.audio.trim_audio(self.clip, (start, end))
try: try:
status("--- MUXING FILE ---") log.status("--- MUXING FILE ---")
if self._mux(f"{self.config.title.lower()}_{self.config.epnum:02d}_{self.suffix}.mkv", if self._mux(f"{self.config.title.lower()}_{self.config.epnum:02d}_{self.suffix}.mkv",
not args.no_metadata, not args.no_chapters and start == 0 and end == self.clip.num_frames) != 0:
not args.no_metadata and start == 0 and end == self.clip.num_frames) != 0:
raise Exception("mkvmerge failed") raise Exception("mkvmerge failed")
except Exception: except Exception:
error("--- MUXING FAILED ---") log.error("--- MUXING FAILED ---")
self.audio.do_cleanup() self.audio.do_cleanup()
raise raise
success("--- MUXING SUCCESSFUL ---") log.success("--- MUXING SUCCESSFUL ---")
self.audio.do_cleanup() self.audio.do_cleanup()
if not args.keep: if not args.keep:
self.encoder.do_cleanup() self.encoder.do_cleanup()
success("--- ENCODE COMPLETE ---") log.success("--- ENCODE COMPLETE ---")
def _mux(self, name: str, metadata: bool = True, chapters: bool = True) -> int: def _mux(self, name: str, chapters: bool = True) -> int:
mkvtoolnix_args = [ mkvtoolnix_args = [
"mkvmerge", "mkvmerge",
"--output", name, "--output", name,
@ -292,11 +291,6 @@ class SelfRunner():
"(", self.audio_file, ")", "(", self.audio_file, ")",
"--track-order", "0:0,0:1", "--track-order", "0:0,0:1",
] ]
if metadata:
mkvtoolnix_args += [
"--title", f"[{self.config.subgroup}] {self.config.title_long} - {self.config.epnum:02d}",
]
if chapters: if chapters:
chap = [f for f in [f"{self.config.epnum:02d}.xml", "chapters.xml"] if os.path.isfile(f)] chap = [f for f in [f"{self.config.epnum:02d}.xml", "chapters.xml"] if os.path.isfile(f)]
if len(chap) != 0: if len(chap) != 0:

View File

@ -4,7 +4,6 @@ class Config():
title_long: str title_long: str
resolution: int resolution: int
datapath: str datapath: str
subgroup: str
def __init__(self, epnum: int, title: str, title_long: str, resolution: int, datapath: str) -> None: def __init__(self, epnum: int, title: str, title_long: str, resolution: int, datapath: str) -> None:
self.epnum = epnum self.epnum = epnum

View File

@ -1,23 +0,0 @@
# TODO: real logging shit not this jank-ass crap
STATUS: str = '\033[94m'
WARNING: str = '\033[93m'
ERROR: str = '\033[91m'
SUCCESS: str = '\033[92m'
RESET: str = '\033[0m'
def status(s: str) -> None:
print(f"{STATUS}{s}{RESET}")
def warn(s: str) -> None:
print(f"{WARNING}{s}{RESET}")
def error(s: str) -> None:
print(f"{ERROR}{s}{RESET}")
def success(s: str) -> None:
print(f"{SUCCESS}{s}{RESET}")

View File

@ -0,0 +1,25 @@
# TODO: real logging shit not this jank-ass crap
STATUS: str = '\033[94m'
WARNING: str = '\033[93m'
ERROR: str = '\033[91m'
SUCCESS: str = '\033[92m'
RESET: str = '\033[0m'
class log():
@staticmethod
def status(s: str) -> None:
print(f"{STATUS}{s}{RESET}")
@staticmethod
def warn(s: str) -> None:
print(f"{WARNING}{s}{RESET}")
@staticmethod
def error(s: str) -> None:
print(f"{ERROR}{s}{RESET}")
@staticmethod
def success(s: str) -> None:
print(f"{SUCCESS}{s}{RESET}")

View File

@ -2,6 +2,9 @@ import vapoursynth as vs
import vsutil import vsutil
from lvsfunc.types import Range
import lvsfunc as lvf
import glob import glob
import os import os
@ -9,7 +12,7 @@ from abc import ABC, abstractmethod
from typing import List, Tuple from typing import List, Tuple
from .config import Config from .config import Config
from .log import warn, error, success from .logging import log
core = vs.core core = vs.core
@ -19,6 +22,21 @@ FUNI_INTRO: int = 289
AMAZON_FILENAME: str = "{title_long} - {epnum:02d} (Amazon Prime CBR {resolution}p).mkv" AMAZON_FILENAME: str = "{title_long} - {epnum:02d} (Amazon Prime CBR {resolution}p).mkv"
def waka_replace(src: vs.VideoNode, wakas: List[vs.VideoNode], ranges: List[List[Range]]
) -> Tuple[vs.VideoNode, List[vs.VideoNode]]:
if len(wakas) == 0:
return src, wakas
if len(ranges) != len(wakas):
raise ValueError("waka_replace: 'Different number of range sets and wakas supplied'!")
new_wakas = []
for waka, r in zip(wakas, ranges):
tmp = src
src = lvf.misc.replace_ranges(src, waka, r)
new_wakas.append(lvf.misc.replace_ranges(waka, tmp, r))
return src, new_wakas
def glob_crc(pattern: str) -> str: def glob_crc(pattern: str) -> str:
res = glob.glob(glob.escape(pattern).replace("$CRC", "*")) res = glob.glob(glob.escape(pattern).replace("$CRC", "*"))
if len(res) == 0: if len(res) == 0:
@ -50,16 +68,16 @@ class DehardsubFileFinder(ABC):
class FunimationSource(DehardsubFileFinder): class FunimationSource(DehardsubFileFinder):
def get_amazon(self) -> vs.VideoNode: def get_amazon(self) -> vs.VideoNode:
if not os.path.isfile(self.config.format_filename(AMAZON_FILENAME)): if not os.path.isfile(self.config.format_filename(AMAZON_FILENAME)):
warn("Amazon not found, falling back to Funimation") log.warn("Amazon not found, falling back to Funimation")
raise FileNotFoundError() raise FileNotFoundError()
success("Found Amazon video") log.success("Found Amazon video")
return core.ffms2.Source(self.config.format_filename(AMAZON_FILENAME)) return core.ffms2.Source(self.config.format_filename(AMAZON_FILENAME))
def get_funi_filename(self) -> str: def get_funi_filename(self) -> str:
if os.path.isfile(self.config.format_filename(ER_FILENAME)): if os.path.isfile(self.config.format_filename(ER_FILENAME)):
return self.config.format_filename(ER_FILENAME) return self.config.format_filename(ER_FILENAME)
error("Erai-raws not found, falling back to SubsPlease") log.error("Erai-raws not found, falling back to SubsPlease")
return glob_crc(self.config.format_filename(SUBSPLS_FILENAME)) return glob_crc(self.config.format_filename(SUBSPLS_FILENAME))
def get_funi(self) -> vs.VideoNode: def get_funi(self) -> vs.VideoNode: