From 62c8355fb10d37d8d5688f719a9933b4dd9708a6 Mon Sep 17 00:00:00 2001
From: louis <louis@poweris.moe>
Date: Sat, 5 Jun 2021 18:57:50 -0400
Subject: [PATCH] yt_common: better audio handling

---
 .../S2 [BD]/01/01.vpy                         |  9 +--
 .../S2 [BD]/02/02.vpy                         |  9 +--
 .../S2 [BD]/03/03.vpy                         |  9 +--
 .../S2 [BD]/04/04.vpy                         |  9 +--
 .../S2 [BD]/05/05.vpy                         |  9 +--
 .../S2 [BD]/06/06.vpy                         |  9 +--
 .../S2 [BD]/07/07.vpy                         |  9 +--
 .../S2 [BD]/08/08.vpy                         |  9 +--
 .../S2 [BD]/09/09.vpy                         |  9 +--
 .../S2 [BD]/10/10.vpy                         |  9 +--
 .../S2 [BD]/11/11.vpy                         |  9 +--
 .../S2 [BD]/12/12.vpy                         | 10 +--
 .../S2 [BD]/nced/nced.vpy                     |  9 +--
 .../S2 [BD]/ncop/ncop.vpy                     |  9 +--
 .../S2 [BD]/recap/recap.vpy                   |  8 +--
 .../tensura_common/__init__.py                |  3 +-
 .../tensura_common/config.py                  | 23 +++++--
 yt_common/yt_common/__init__.py               |  2 +-
 yt_common/yt_common/audio.py                  | 65 +++++++++++++++++++
 yt_common/yt_common/automation.py             | 29 ++++++---
 yt_common/yt_common/config.py                 | 46 +------------
 yt_common/yt_common/source.py                 |  4 ++
 yt_common/yt_common/util.py                   |  5 ++
 23 files changed, 190 insertions(+), 122 deletions(-)
 create mode 100644 yt_common/yt_common/audio.py
 create mode 100644 yt_common/yt_common/util.py

diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/01/01.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/01/01.vpy
index f73df56..3865466 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/01/01.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/01/01.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner, Zone
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -15,9 +16,9 @@ from typing import List, Tuple
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210326][Tensei Shitara Slime Datta Ken 2nd Season][Vol.1]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00006.m2ts"), (24, -50))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/02/02.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/02/02.vpy
index 4d5bfa0..dcd2ecf 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/02/02.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/02/02.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.misc import replace_ranges
 from lvsfunc.types import Range
@@ -14,9 +15,9 @@ from typing import List
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210326][Tensei Shitara Slime Datta Ken 2nd Season][Vol.1]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00007.m2ts"), (None, -49))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/03/03.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/03/03.vpy
index d8b8f15..0f4e565 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/03/03.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/03/03.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner, Zone
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.misc import replace_ranges
 from lvsfunc.types import Range
@@ -14,9 +15,9 @@ from typing import List
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210326][Tensei Shitara Slime Datta Ken 2nd Season][Vol.1]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00008.m2ts"), (None, -50))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/04/04.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/04/04.vpy
index cba33a7..43fcbb9 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/04/04.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/04/04.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -15,9 +16,9 @@ from typing import List, Tuple
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210326][Tensei Shitara Slime Datta Ken 2nd Season][Vol.1]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00009.m2ts"), (None, -51))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/05/05.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/05/05.vpy
index b2442ed..8d4ee79 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/05/05.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/05/05.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -15,9 +16,9 @@ from typing import List, Tuple
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210326][Tensei Shitara Slime Datta Ken 2nd Season][Vol.1]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00010.m2ts"), (None, -24))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/06/06.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/06/06.vpy
index ebbbbb3..dc4941f 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/06/06.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/06/06.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner, Zone
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -15,9 +16,9 @@ from typing import List, Tuple
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210326][Tensei Shitara Slime Datta Ken 2nd Season][Vol.1]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00011.m2ts"), (24, -25))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/07/07.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/07/07.vpy
index e6108db..9400b26 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/07/07.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/07/07.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner, Zone
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -15,9 +16,9 @@ from typing import List, Tuple
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210526][Tensei Shitara Slime Datta Ken 2nd Season][Vol.2]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00006.m2ts"), (24, -50))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/08/08.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/08/08.vpy
index ff0a310..f14f49c 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/08/08.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/08/08.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner, Zone
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -15,9 +16,9 @@ from typing import List, Tuple
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210526][Tensei Shitara Slime Datta Ken 2nd Season][Vol.2]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00007.m2ts"), (None, -51))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/09/09.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/09/09.vpy
index 70b666a..acdcc10 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/09/09.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/09/09.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -15,9 +16,9 @@ from typing import List, Tuple
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210526][Tensei Shitara Slime Datta Ken 2nd Season][Vol.2]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00008.m2ts"), (None, -50))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/10/10.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/10/10.vpy
index 37583d1..84e9c4f 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/10/10.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/10/10.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner
 from yt_common.chapters import Chapter, Edition
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -15,9 +16,9 @@ from typing import List, Tuple
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210526][Tensei Shitara Slime Datta Ken 2nd Season][Vol.2]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource([
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource([
     FileTrim(os.path.join(BDMV, "00009.m2ts"), (None, None)),
     FileTrim(os.path.join(BDMV, "00010.m2ts"), (None, -49)),
     FileTrim(os.path.join(BDMV, "00016.m2ts"), (13348, 15699)),
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/11/11.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/11/11.vpy
index 0369cb2..8726b1c 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/11/11.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/11/11.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner, Zone
 from yt_common.chapters import Chapter, Edition
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -15,9 +16,9 @@ from typing import List, Tuple
 import os
 
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210526][Tensei Shitara Slime Datta Ken 2nd Season][Vol.2]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource([
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource([
     FileTrim(os.path.join(BDMV, "00011.m2ts"), (None, -49)),
     FileTrim(os.path.join(BDMV, "00017.m2ts"), (None, 3158)),
     FileTrim(os.path.join(BDMV, "00017.m2ts"), (33342, 33927)),
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/12/12.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/12/12.vpy
index 90798b3..56a6105 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/12/12.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/12/12.vpy	
@@ -1,10 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner, Zone
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -14,10 +15,11 @@ from typing import List, Tuple
 
 import os
 
+
 EPNUM: int = int(os.path.basename(os.path.splitext(__file__)[0]))
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(EPNUM)
+CONFIG: TenSuraS2Config = TenSuraS2Config(EPNUM)
 BDMV: str = "../bdmv/[BDMV][210526][Tensei Shitara Slime Datta Ken 2nd Season][Vol.2]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00012.m2ts"), (None, -26))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/nced/nced.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/nced/nced.vpy
index 974129d..0d7da1c 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/nced/nced.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/nced/nced.vpy	
@@ -1,9 +1,10 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -14,9 +15,9 @@ from typing import List, Tuple
 import os
 
 DESC: str = os.path.basename(os.path.splitext(__file__)[0])
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(DESC)
+CONFIG: TenSuraS2Config = TenSuraS2Config(DESC)
 BDMV: str = "../bdmv/[BDMV][210526][Tensei Shitara Slime Datta Ken 2nd Season][Vol.2]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00015.m2ts"), (24, -24))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/ncop/ncop.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/ncop/ncop.vpy
index 61cc30c..b94e4cb 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/ncop/ncop.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/ncop/ncop.vpy	
@@ -1,9 +1,10 @@
 import vapoursynth as vs
 
-from tensura_common import TenSuraS2BDConfig, antialias, deband, denoise, descale, edgefix, finalize, regrain
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband,
+                            denoise, descale, edgefix, finalize, regrain)
 
 from yt_common.automation import SelfRunner
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -14,9 +15,9 @@ from typing import List, Tuple
 import os
 
 DESC: str = os.path.basename(os.path.splitext(__file__)[0])
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(DESC)
+CONFIG: TenSuraS2Config = TenSuraS2Config(DESC)
 BDMV: str = "../bdmv/[BDMV][210526][Tensei Shitara Slime Datta Ken 2nd Season][Vol.2]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00014.m2ts"), (24, -24))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/S2 [BD]/recap/recap.vpy b/Tensei Shitara Slime Datta Ken/S2 [BD]/recap/recap.vpy
index 06a9d33..6ec5847 100644
--- a/Tensei Shitara Slime Datta Ken/S2 [BD]/recap/recap.vpy	
+++ b/Tensei Shitara Slime Datta Ken/S2 [BD]/recap/recap.vpy	
@@ -1,11 +1,11 @@
 import vapoursynth as vs
 
-from tensura_common import (TenSuraS2BDConfig, antialias, deband, denoise, descale,
+from tensura_common import (TenSuraS2Config, TenSuraS2BDSource, antialias, deband, denoise, descale,
                             edgefix, finalize, megurumono_scenefilter, regrain)
 
 from yt_common.automation import SelfRunner, Zone
 from yt_common.chapters import Chapter
-from yt_common.source import FileTrim, SimpleSource
+from yt_common.source import FileTrim
 
 from lvsfunc.mask import BoundingBox
 from lvsfunc.misc import replace_ranges
@@ -16,9 +16,9 @@ from typing import List, Tuple
 import os
 
 DESC: str = os.path.basename(os.path.splitext(__file__)[0])
-CONFIG: TenSuraS2BDConfig = TenSuraS2BDConfig(DESC)
+CONFIG: TenSuraS2Config = TenSuraS2Config(DESC)
 BDMV: str = "../bdmv/[BDMV][210326][Tensei Shitara Slime Datta Ken 2nd Season][Vol.1]/BDMV/STREAM"
-SOURCE: SimpleSource = SimpleSource(
+SOURCE: TenSuraS2BDSource = TenSuraS2BDSource(
     FileTrim(os.path.join(BDMV, "00013.m2ts"), (24, -24))
 )
 
diff --git a/Tensei Shitara Slime Datta Ken/tensura_common/__init__.py b/Tensei Shitara Slime Datta Ken/tensura_common/__init__.py
index ea6d99c..169ee88 100644
--- a/Tensei Shitara Slime Datta Ken/tensura_common/__init__.py	
+++ b/Tensei Shitara Slime Datta Ken/tensura_common/__init__.py	
@@ -1,3 +1,4 @@
-from .config import TenSuraS2Config, TenSuraS2BDConfig, TenSuraS1BDConfig  # noqa: F401
+from .config import (TenSuraS2Config, TenSuraS2Source, TenSuraS2BDSource,  # noqa: F401
+                     TenSuraS1BDConfig, TenSuraS1BDSource)
 from .filter import (antialias, deband, denoise, descale, edgefix, finalize,  # noqa: F401
                      megurumono_scenefilter, regrain)
diff --git a/Tensei Shitara Slime Datta Ken/tensura_common/config.py b/Tensei Shitara Slime Datta Ken/tensura_common/config.py
index afad1f5..9f98849 100644
--- a/Tensei Shitara Slime Datta Ken/tensura_common/config.py	
+++ b/Tensei Shitara Slime Datta Ken/tensura_common/config.py	
@@ -1,6 +1,8 @@
-from yt_common.config import Config, FlacMixin, OpusMixin
+from yt_common.audio import AudioStream, CodecPassthrough, CodecOpus, CodecFlac
+from yt_common.config import Config
+from yt_common.source import SimpleSource
 
-from typing import Union
+from typing import List, Union
 
 import os
 
@@ -8,7 +10,7 @@ RESOLUTION: int = 1080
 DATAPATH: str = os.path.dirname(__file__)
 
 
-class TenSuraS1BDConfig(OpusMixin, Config):
+class TenSuraS1BDConfig(Config):
     def __init__(self, desc: Union[str, int]) -> None:
         super().__init__(
             desc,
@@ -19,6 +21,11 @@ class TenSuraS1BDConfig(OpusMixin, Config):
         )
 
 
+class TenSuraS1BDSource(SimpleSource):
+    def audio_streams(self) -> List[AudioStream]:
+        return [AudioStream(0, CodecOpus())]
+
+
 class TenSuraS2Config(Config):
     def __init__(self, desc: Union[str, int]) -> None:
         super().__init__(
@@ -30,5 +37,11 @@ class TenSuraS2Config(Config):
         )
 
 
-class TenSuraS2BDConfig(FlacMixin, TenSuraS2Config):
-    pass
+class TenSuraS2Source(SimpleSource):
+    def audio_streams(self) -> List[AudioStream]:
+        return [AudioStream(0, CodecPassthrough())]
+
+
+class TenSuraS2BDSource(SimpleSource):
+    def audio_streams(self) -> List[AudioStream]:
+        return [AudioStream(0, CodecFlac())]
diff --git a/yt_common/yt_common/__init__.py b/yt_common/yt_common/__init__.py
index 57a5874..5082dbb 100644
--- a/yt_common/yt_common/__init__.py
+++ b/yt_common/yt_common/__init__.py
@@ -1 +1 @@
-from . import antialiasing, automation, chapters, config, data, deband, logging, scale, source  # noqa: F401
+from . import antialiasing, audio, automation, chapters, config, data, deband, logging, scale, source  # noqa: F401
diff --git a/yt_common/yt_common/audio.py b/yt_common/yt_common/audio.py
new file mode 100644
index 0000000..ee25b1b
--- /dev/null
+++ b/yt_common/yt_common/audio.py
@@ -0,0 +1,65 @@
+from abc import ABC, abstractmethod
+from subprocess import call
+from typing import List, NamedTuple
+
+from .util import get_temp_filename
+
+
+class AudioEncoder(ABC):
+    @abstractmethod
+    def encode_audio(self, afile: str) -> str:
+        pass
+
+
+class FFAudio(AudioEncoder):
+    def encode_audio(self, afile: str) -> str:
+        out = get_temp_filename(prefix="_ffaudio_encode_", suffix=".mka")
+        ffmpeg_args = [
+            "ffmpeg",
+            "-hide_banner", "-loglevel", "panic",
+            "-i", afile,
+            "-y",
+            "-map", "0:a",
+        ] + self.codec_args() + [out]
+        print("+ " + " ".join(ffmpeg_args))
+        call(ffmpeg_args)
+        return out
+
+    @abstractmethod
+    def codec_args(self) -> List[str]:
+        pass
+
+
+class CodecPassthrough(AudioEncoder):
+    def encode_audio(self, afile: str) -> str:
+        return afile
+
+
+class CodecOpus(FFAudio):
+    bitrate: int
+
+    def __init__(self, bitrate: int = 192) -> None:
+        self.bitrate = bitrate
+
+    def codec_args(self) -> List[str]:
+        return ["-c:a", "libopus", "-b:a", f"{self.bitrate}k", "-sample_fmt", "s16"]
+
+
+class CodecFdkAac(FFAudio):
+    bitrate: int
+
+    def __init__(self, bitrate: int = 256) -> None:
+        self.bitrate = bitrate
+
+    def codec_args(self) -> List[str]:
+        return ["-c:a", "libfdk_aac", "-b:a", f"{self.bitrate}k", "-sample_fmt", "s16"]
+
+
+class CodecFlac(FFAudio):
+    def codec_args(self) -> List[str]:
+        return ["-c:a", "flac"]
+
+
+class AudioStream(NamedTuple):
+    stream_index: int  # zero-indexed, ignores video streams
+    codec: AudioEncoder
diff --git a/yt_common/yt_common/automation.py b/yt_common/yt_common/automation.py
index 6af56e0..3e226da 100644
--- a/yt_common/yt_common/automation.py
+++ b/yt_common/yt_common/automation.py
@@ -7,7 +7,6 @@ import random
 import shutil
 import string
 import subprocess
-import tempfile
 
 from lvsfunc.render import clip_async_render, find_scene_changes
 
@@ -16,6 +15,7 @@ from typing import Any, BinaryIO, Callable, List, NamedTuple, Optional, Sequence
 from .chapters import Chapter, Edition, make_chapters, make_qpfile
 from .config import Config
 from .logging import log
+from .util import get_temp_filename
 from .source import FileSource
 
 core = vs.core
@@ -23,10 +23,6 @@ core = vs.core
 AUDIO_PFX: str = "_audiogetter_temp_"
 
 
-def get_temp_filename(prefix: str = "", suffix: str = "") -> str:
-    return f"{prefix}{next(tempfile._get_candidate_names())}{suffix}"  # type: ignore
-
-
 def bin_to_plat(binary: str) -> str:
     if os.name == "nt":
         return binary if binary.lower().endswith(".exe") else f"{binary}.exe"
@@ -153,27 +149,40 @@ class AudioGetter():
         self.cleanup = set()
 
     def trim_audio(self, ftrim: Optional[acsuite.types.Trim] = None) -> str:
+        streams = sorted(self.src.audio_streams(), key=lambda s: s.stream_index)
+        if len(streams) == 0:
+            return ""
         trims = self.src.audio_src()
+        ffmpeg = acsuite.ffmpeg.FFmpegAudio()
 
         tlist: List[str] = []
         for t in trims:
             audio_cut = acsuite.eztrim(t.path, t.trim or (0, None), ref_clip=self.src.audio_ref(),
-                                       outfile=get_temp_filename(prefix=AUDIO_PFX, suffix=".mka"),
-                                       streams=0)[0]
+                                       outfile=get_temp_filename(prefix=AUDIO_PFX+"cut_", suffix=".mka"),
+                                       streams=[s.stream_index for s in streams])[0]
             self.cleanup.add(audio_cut)
             tlist.append(audio_cut)
 
         if len(tlist) > 1:
-            ffmpeg = acsuite.ffmpeg.FFmpegAudio()
             audio_cut = ffmpeg.concat(*tlist)
             self.cleanup.add(audio_cut)
 
         if ftrim:
             audio_cut = acsuite.eztrim(audio_cut, ftrim, ref_clip=self.src.source(),
-                                       outfile=get_temp_filename(prefix=AUDIO_PFX, suffix=".mka"))[0]
+                                       outfile=get_temp_filename(prefix=AUDIO_PFX+"fcut_", suffix=".mka"))[0]
             self.cleanup.add(audio_cut)
 
-        audio_cut = self.config.encode_audio(audio_cut)
+        if len(streams) > 1:
+            splits = [get_temp_filename(prefix=AUDIO_PFX+"split_", suffix=".mka") for _ in range(0, len(streams))]
+            ffmpeg.split(audio_cut, splits)
+            self.cleanup |= set(splits)
+            encode = [streams[i].codec.encode_audio(f) for i, f in enumerate(splits)]
+            self.cleanup |= set(encode)
+            audio_cut = get_temp_filename(prefix=AUDIO_PFX+"join_", suffix=".mka")
+            ffmpeg.join(audio_cut, *encode)
+        else:
+            audio_cut = streams[0].codec.encode_audio(audio_cut)
+
         self.cleanup.add(audio_cut)
 
         return audio_cut
diff --git a/yt_common/yt_common/config.py b/yt_common/yt_common/config.py
index d741eec..ee4b169 100644
--- a/yt_common/yt_common/config.py
+++ b/yt_common/yt_common/config.py
@@ -1,8 +1,6 @@
 import os
-import subprocess
 
-from abc import ABC, abstractmethod
-from typing import List, Union
+from typing import Union
 
 
 class Config():
@@ -23,45 +21,3 @@ class Config():
         fname = filename.format(epnum=self.desc, title=self.title,
                                 title_long=self.title_long, resolution=self.resolution)
         return os.path.join(f"../{self.desc}/", fname)
-
-    def encode_audio(self, afile: str) -> str:
-        return afile  # default: passthrough
-
-
-class AudioEncoder(ABC):
-    @abstractmethod
-    def encode_audio(self, afile: str) -> str:
-        pass
-
-
-class FFAudio(AudioEncoder):
-    def encode_audio(self, afile: str) -> str:
-        ffmpeg_args = [
-            "ffmpeg",
-            "-hide_banner", "-loglevel", "panic",
-            "-i", afile,
-            "-y",
-            "-map", "0:a",
-        ] + self.codec_args() + ["_ffaudio_encode.mka"]
-        print("+ " + " ".join(ffmpeg_args))
-        subprocess.call(ffmpeg_args)
-        return "_ffaudio_encode.mka"
-
-    @abstractmethod
-    def codec_args(self) -> List[str]:
-        pass
-
-
-class OpusMixin(FFAudio):
-    def codec_args(self) -> List[str]:
-        return ["-c:a", "libopus", "-b:a", "192k", "-sample_fmt", "s16"]
-
-
-class FdkAacMixin(FFAudio):
-    def codec_args(self) -> List[str]:
-        return ["-c:a", "libfdk_aac", "-b:a", "256k", "-sample_fmt", "s16"]
-
-
-class FlacMixin(FFAudio):
-    def codec_args(self) -> List[str]:
-        return ["-c:a", "flac"]
diff --git a/yt_common/yt_common/source.py b/yt_common/yt_common/source.py
index aa2a419..3e506d5 100644
--- a/yt_common/yt_common/source.py
+++ b/yt_common/yt_common/source.py
@@ -12,6 +12,7 @@ import os
 from abc import ABC, abstractmethod
 from typing import Any, List, NamedTuple, Optional, Tuple, Union
 
+from .audio import AudioStream, CodecPassthrough
 from .config import Config
 from .logging import log
 
@@ -74,6 +75,9 @@ class FileSource(ABC):
     def audio_src(self) -> List[FileTrim]:
         pass
 
+    def audio_streams(self) -> List[AudioStream]:
+        return [AudioStream(0, CodecPassthrough())]  # default: passthrough first stream
+
     @abstractmethod
     def source(self) -> vs.VideoNode:
         pass
diff --git a/yt_common/yt_common/util.py b/yt_common/yt_common/util.py
new file mode 100644
index 0000000..d808066
--- /dev/null
+++ b/yt_common/yt_common/util.py
@@ -0,0 +1,5 @@
+import tempfile
+
+
+def get_temp_filename(prefix: str = "", suffix: str = "") -> str:
+    return f"{prefix}{next(tempfile._get_candidate_names())}{suffix}"  # type: ignore