From 6d67d9c2af57233743187a92b7e651174d6eb42b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Mon, 26 Aug 2013 00:35:03 +0000 Subject: process (qx): disambiguate err/err_str, add no_raise I forgot :err is already handled by Process.spawn, so split out the functionality into err_str where we want to use it. Also, add a :no_raise flag which will allow us to better handle avprobe/soxi calls which can fail and avoid needless exceptions. --- lib/dtas/process.rb | 16 +++++++++------- lib/dtas/source/av.rb | 4 ++-- lib/dtas/source/sox.rb | 4 ++-- 3 files changed, 13 insertions(+), 11 deletions(-) (limited to 'lib/dtas') diff --git a/lib/dtas/process.rb b/lib/dtas/process.rb index c19b5c5..2cf59c7 100644 --- a/lib/dtas/process.rb +++ b/lib/dtas/process.rb @@ -46,7 +46,8 @@ module DTAS::Process # :nodoc: r, w = IO.pipe opts = opts.merge(out: w) r.binmode - if err = opts[:err] + no_raise = opts.delete(:no_raise) + if err_str = opts.delete(:err_str) re, we = IO.pipe re.binmode opts[:err] = we @@ -57,16 +58,15 @@ module DTAS::Process # :nodoc: retry end w.close - if err + if err_str we.close res = "" - want = { r => res, re => err } + want = { r => res, re => err_str } begin readable = IO.select(want.keys) or next readable[0].each do |io| - bytes = io.nread begin - want[io] << io.read_nonblock(bytes > 0 ? bytes : 11) + want[io] << io.read_nonblock(2000) rescue Errno::EAGAIN # spurious wakeup, bytes may be zero rescue EOFError @@ -76,12 +76,14 @@ module DTAS::Process # :nodoc: end until want.empty? re.close else - res = r.read + res = r.read # read until EOF end r.close _, status = Process.waitpid2(pid) return res if status.success? - raise RuntimeError, "`#{Shellwords.join(cmd)}' failed: #{status.inspect}" + return status if no_raise + raise RuntimeError, + "`#{Shellwords.join(Array(cmd))}' failed: #{status.inspect}" end # XXX only for DTAS::Source::{Sox,Av}.try diff --git a/lib/dtas/source/av.rb b/lib/dtas/source/av.rb index 1de0a72..66ee320 100644 --- a/lib/dtas/source/av.rb +++ b/lib/dtas/source/av.rb @@ -25,7 +25,7 @@ class DTAS::Source::Av # :nodoc: def self.try(infile, offset = nil) err = "" - DTAS::Process.qx(%W(avprobe #{infile}), err: err) + DTAS::Process.qx(%W(avprobe #{infile}), err_str: err) return if err =~ /Unable to find a suitable output format for/ new(infile, offset) rescue @@ -44,7 +44,7 @@ class DTAS::Source::Av # :nodoc: @format.bits = @precision @comments = {} err = "" - s = qx(%W(avprobe -show_streams -show_format #@infile), err: err) + s = qx(%W(avprobe -show_streams -show_format #@infile), err_str: err) @astreams = [] s.scan(%r{^\[STREAM\]\n(.*?)\n\[/STREAM\]\n}m) do |_| stream = $1 diff --git a/lib/dtas/source/sox.rb b/lib/dtas/source/sox.rb index 086b923..30e7f18 100644 --- a/lib/dtas/source/sox.rb +++ b/lib/dtas/source/sox.rb @@ -19,7 +19,7 @@ class DTAS::Source::Sox # :nodoc: def self.try(infile, offset = nil) err = "" - DTAS::Process.qx(%W(soxi #{infile}), err: err) + DTAS::Process.qx(%W(soxi #{infile}), err_str: err) return if err =~ /soxi FAIL formats:/ new(infile, offset) rescue @@ -69,7 +69,7 @@ class DTAS::Source::Sox # :nodoc: err = "" cmd = %W(soxi -a #@infile) begin - qx(cmd, err: err).split(/\n/).each do |line| + qx(cmd, err_str: err).split(/\n/).each do |line| key, value = line.split(/=/, 2) key && value or next # TODO: multi-line/multi-value/repeated tags -- cgit v1.2.3-24-ge0c7