import os
import subprocess
import config
env = dict(os.environ)
env['LANG']='C'
def printerr(r):
print('process returned with error:', r.returncode)
print('command:', r.args)
print('output:', r.stdout)
print('error:', r.stderr)
return
def ffmpeg(src, dst):
r = subprocess.run(
[ config.ffprobe, '-v', 'error', '-show_entries', 'format=duration:stream=codec_type', '-of', 'default=noprint_wrappers=1', src ],
capture_output = True, text = True, env = env )
if r.returncode: return #printerr(r)
video = False; audio = False; duration = 0
for l in r.stdout.split():
f = l.split('=', 1)
if len(f) != 2: continue
if l == 'codec_type=video': video = True
if l == 'codec_type=audio': audio = True
if l.startswith('duration='):
try: duration = float(l[9:])
except ValueError: pass
if not duration: return
if video:
filters = "select='gte(t,%f)',thumbnail,scale=%d:%d:force_original_aspect_ratio=decrease:force_divisible_by=2" % (duration/4, config.thumbw, config.thumbh)
r = subprocess.run(
[ config.ffmpeg, '-i', src, '-vf', filters, '-frames:v', '1', '-y', dst ],
capture_output = True, text = True, env = env )
#if r.returncode: printerr(r)
if not r.returncode and os.path.isfile(dst): return dst
if audio:
filters = "showwavespic=s=%dx%d:scale=sqrt:colors=%06x" % (config.thumbw, config.thumbh, config.thumbcolor)
r = subprocess.run(
[ config.ffmpeg, '-i', src, '-filter_complex', filters, '-frames:v', '1', '-y', dst ],
capture_output = True, text = True, env = env )
#if r.returncode: printerr(r)
if not r.returncode and os.path.isfile(dst): return dst
def magick(src, dst):
r = subprocess.run(
[ config.magick, src, '-resize', '%dx%d>' % (config.thumbw, config.thumbh), dst ],
capture_output = True, text = True, env = env )
if r.returncode: return #printerr(r)
if not r.returncode and os.path.isfile(dst): return dst
def make(src, dst):
return ffmpeg(src, dst) or magick(src, dst)