38 lines
1.4 KiB
Python
38 lines
1.4 KiB
Python
# concat_opus.py — Concatenate all opus files in a user directory in random order into a single stream.opus
|
|
import os
|
|
import random
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
def concat_opus_files(user_dir: Path, output_file: Path):
|
|
"""
|
|
Concatenate all .opus files in user_dir (except stream.opus) in random order into output_file.
|
|
Overwrites output_file if exists. Creates it if missing.
|
|
"""
|
|
files = [f for f in user_dir.glob('*.opus') if f.name != 'stream.opus']
|
|
if not files:
|
|
raise FileNotFoundError(f"No opus files to concatenate in {user_dir}")
|
|
random.shuffle(files)
|
|
|
|
# Create a filelist for ffmpeg concat
|
|
filelist_path = user_dir / 'filelist.txt'
|
|
with open(filelist_path, 'w') as f:
|
|
for opusfile in files:
|
|
f.write(f"file '{opusfile.resolve()}'\n")
|
|
|
|
# ffmpeg concat demuxer (no re-encoding)
|
|
cmd = [
|
|
'ffmpeg', '-y', '-f', 'concat', '-safe', '0', '-i', str(filelist_path),
|
|
'-c', 'copy', str(output_file)
|
|
]
|
|
try:
|
|
subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
|
except subprocess.CalledProcessError as e:
|
|
raise RuntimeError(f"FFmpeg concat failed: {e}")
|
|
finally:
|
|
if filelist_path.exists():
|
|
filelist_path.unlink()
|
|
if not output_file.exists():
|
|
raise RuntimeError("Concatenation did not produce output.")
|
|
return output_file
|