I've written a small python script for mass converting audio files. It uses ffmpeg. The problem is it doesn't work for files with single quotes in their filenames.
script:
import os
import subprocess
import sys
from multiprocessing.pool import ThreadPool as Pool
source_dir="/home/kris/Music/test"
output_dir="/home/kris/Music/test_opus"
def worker(file):
try:
dirname=os.path.dirname(file)
file=file.replace("'","\\\\'")
filename=file.split('.flac')[0]
input_file=f"'{source_dir}/{file}'"
output_file=f"'{output_dir}/{filename}.opus'"
cmd="ffmpeg -n -i "+input_file+" -c:a libopus -b:a 320k "+output_file
print(cmd)
result = subprocess.call(cmd,stdout=subprocess.PIPE,shell=True)
except:
print('item error')
def start():
threads=os.cpu_count()
pool = Pool(threads)
files=os.listdir(source_dir)
for item in files:
pool.apply_async(worker, (item,))
pool.close()
pool.join()
start()
Testing:
Filename:
I'm a file.flac
When escaping single quote
'
with double backslashes\\
-file=file.replace("'","\\\\'")
the cmd for ffmpeg is:
ffmpeg -n -i '/home/kris/Music/test/I\\'m a file.flac' -c:a libopus -b:a 320k '/home/kris/Music/test_opus/I\\'m a file.opus'
ffmpeg returns an error: /home/kris/Music/test/I\\m: No such file or directory
- When escaping single quote
'
with a single backslash\
-file=file.replace("'","\\'")
the cmd for ffmpeg is:
ffmpeg -n -i '/home/kris/Music/test/I\'m a file.flac' -c:a libopus -b:a 320k '/home/kris/Music/test_opus/I\'m a file.opus'
I got an error:
/bin/sh: 1: Syntax error: Unterminated quoted string
According to ffmpeg docs: https://ffmpeg.org/ffmpeg-utils.html#toc-Examples escaping with single backslash should work.