Blob Blame History Raw

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)