feat: per-join crossfade durations + acrossfade curve in build_crossfade_merge_command

This commit is contained in:
2026-07-02 17:35:26 +02:00
parent 449b3dfa72
commit a298418156
2 changed files with 97 additions and 17 deletions
+52
View File
@@ -139,6 +139,58 @@ def test_merge_empty_raises():
with pytest.raises(ValueError):
build_crossfade_merge_command([], 0.5, "/o/o.wav")
def test_merge_per_join_crossfades():
cmd = build_crossfade_merge_command(["/a.wav", "/b.wav", "/c.wav"], [0.5, 1.5], "/o/o.wav")
fc = cmd[cmd.index("-filter_complex") + 1]
assert "[0][1]acrossfade=d=0.5[a1]" in fc
assert "[a1][2]acrossfade=d=1.5[out]" in fc
def test_merge_curve_emitted_when_non_default():
cmd = build_crossfade_merge_command(["/a.wav", "/b.wav"], 0.5, "/o/o.wav", curves="exp")
fc = cmd[cmd.index("-filter_complex") + 1]
assert "acrossfade=d=0.5:c1=exp:c2=exp[out]" in fc
def test_merge_default_curve_omits_c1c2():
cmd = build_crossfade_merge_command(["/a.wav", "/b.wav"], 0.5, "/o/o.wav") # tri default
fc = cmd[cmd.index("-filter_complex") + 1]
assert "c1=" not in fc # tri is ffmpeg's default -> omit
def test_merge_per_join_curves_list():
cmd = build_crossfade_merge_command(["/a.wav", "/b.wav", "/c.wav"], 0.5, "/o/o.wav",
curves=["tri", "exp"])
fc = cmd[cmd.index("-filter_complex") + 1]
assert "[0][1]acrossfade=d=0.5[a1]" in fc # tri -> no suffix
assert "acrossfade=d=0.5:c1=exp:c2=exp[out]" in fc # exp on 2nd join
def test_merge_mixed_zero_crossfade():
cmd = build_crossfade_merge_command(["/a.wav", "/b.wav", "/c.wav"], [0.0, 0.5], "/o/o.wav")
fc = cmd[cmd.index("-filter_complex") + 1]
assert "[0][1]concat=n=2:v=0:a=1[a1]" in fc # butt-join 1st
assert "acrossfade=d=0.5" in fc # crossfade 2nd
def test_merge_crossfade_list_length_mismatch_raises():
import pytest
with pytest.raises(ValueError):
build_crossfade_merge_command(["/a.wav", "/b.wav", "/c.wav"], [0.5], "/o/o.wav")
with pytest.raises(ValueError):
build_crossfade_merge_command(["/a.wav", "/b.wav"], [0.5, 0.5], "/o/o.wav")
def test_merge_curves_list_length_mismatch_raises():
import pytest
with pytest.raises(ValueError):
build_crossfade_merge_command(["/a.wav", "/b.wav", "/c.wav"], 0.5, "/o/o.wav", curves=["exp"])
def test_merge_unknown_curve_raises():
import pytest
with pytest.raises(ValueError):
build_crossfade_merge_command(["/a.wav", "/b.wav"], 0.5, "/o/o.wav", curves="bogus")
def test_merge_three_clips_zero_concat_chain():
cmd = build_crossfade_merge_command(["/a.wav", "/b.wav", "/c.wav"], 0.0, "/o/o.wav")
fc = cmd[cmd.index("-filter_complex") + 1]
assert fc.count("concat=n=2:v=0:a=1") == 2
assert "acrossfade" not in fc
# --- ProcessedDB ---