feat: per-join crossfade durations + acrossfade curve in build_crossfade_merge_command
This commit is contained in:
@@ -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 ---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user