# frozen_string_literal: true require 'etc' require 'open3' require 'media_tools' module Booru module ImageProcessing module ShellHelper FFMPEG_COMMAND_BASE = [ 'ffmpeg', '-loglevel', 'warning', # don't be overly verbose in the logs '-threads', (Etc.nprocessors / 2).to_s, # don't use all our CPUs '-y' # overwrite existing files without asking ] def exec(cmd) write_log("EXEC: #{cmd}") output = `#{cmd} 2>&1` if output.present? write_log("OUTPUT\n#{output}\n") else write_log('') end output end def exec_new(tag, command_and_args) write_log("#{tag}: #{command_and_args.join(' ')}") output, stderr, status = Open3.capture3(*command_and_args) write_log("exit code: #{status}") write_log(output.blank? ? '' : "OUTPUT\n#{output}\n") write_log("STDERR\n#{stderr}") if stderr.present? raise "#{tag} returned exit status: #{status}" if status != 0 output end def ffmpeg(*ffmpeg_args) exec_new('FFMPEG', FFMPEG_COMMAND_BASE + ffmpeg_args) end def optipng(path) exec_new 'OPTIPNG', ['nice', '-n', '19', 'optipng', '-quiet', '-fix', '-i0', '-o3', path] end def jpegtran(path) exec_new 'JPEGTRAN', ['nice', '-n', '19', 'jpegtran', '-optimize', '-outfile', path, path] end def generate_thumb(path, time, dest_path) write_log "generate_thumb(\"#{path}\", #{time}, \"#{dest_path}\")" result = MediaTools.generate_thumb(path, time, dest_path) write_log("result: #{result}") end end end end