dtas 0.18.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a3234969a259bbd208ab8990043cada0a730f7a26fbd926e9faa8e7a817900f6
4
- data.tar.gz: 20a1d5e7e193a8121c004e87cbe24dd15b760c3a680eb5a85652d5620a06d3b8
3
+ metadata.gz: e243e5ce687818e957241adc639e6a0557d6b4caff54fe423241a30cfbd0368f
4
+ data.tar.gz: 54d936c09a7ca62d97ce41f23e9c3db70b92765cea257cc34f7bbd21059ba938
5
5
  SHA512:
6
- metadata.gz: c8538abec27232c2a97be96e9f5d6983fc073c138f78df7472971c2d35242026dc889ab58daddead8e461835cfc334c9a55a9b41035ae4fd685b552e2af618bc
7
- data.tar.gz: 9919b3bbeeead4c49d07a68e9f65451c243564815f532ba36c85cd3f04dc948af652952fae4168992538f5c17469b8a9a75ca07d81bf75856ee79edfebf4b2c9
6
+ metadata.gz: 937e5a36a9fcfe06011871c047a6cda9a8d402a3fea84a68a7214315e9228db03d8f7277d29adca0139ccc7358897a4985d606a96c156432ce53cba1a51fd801
7
+ data.tar.gz: 9aaed956fd48e6b5c0d45c0ef91a440bd6c4f53def5bfa5390ea5bd2315686dc199e0c0c007e2c1d8c2992bf9c386d3991b7c6fd183577f4e00bda860c09cf36
@@ -41,6 +41,12 @@ Silent operation, commands are not printed as executed
41
41
  Disable automatic setting of the DITHERFX env. This also passes
42
42
  the option to L<sox(1)> via SOX_OPTS.
43
43
 
44
+ =item -E, --err-suffix SUFFIX
45
+
46
+ Write the contents of C<stderr>. This is useful for capturing
47
+ the per-track output of the L<sox(1)> C<stats> effect when
48
+ combined with parallel C<--jobs>.
49
+
44
50
  =item -O, --outdir OUTDIR
45
51
 
46
52
  Set output directory instead of current directory.
data/GIT-VERSION-GEN CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # Copyright (C) 2013-2020 all contributors <dtas-all@nongnu.org>
2
+ # Copyright (C) 2013-2021 all contributors <dtas-all@nongnu.org>
3
3
  # License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
4
4
  # frozen_string_literal: true
5
5
  CONSTANT = "DTAS::VERSION"
data/INSTALL CHANGED
@@ -1,4 +1,4 @@
1
- Uncommon for audio software, dtas is implemented in Ruby.
1
+ Uncommon for audio software, dtas is currently implemented in Ruby.
2
2
 
3
3
  The latest stable release or development snapshot of Ruby is recommended.
4
4
  However, Ruby 1.9.3 and later works, but older versions of Ruby do not.
@@ -8,13 +8,14 @@ dtas-player uses SoX by default and you will need it unless you've
8
8
  reconfigured dtas-player to use something else.
9
9
 
10
10
  mp3gain is required if you want to use ReplayGain with MP3s
11
+ (it is no longer in new versions of Debian)
11
12
 
12
13
  If you only intend to use dtas-cueedit, you will need metaflac(1) from
13
14
  the FLAC package.
14
15
 
15
- Debian 7+ users can install dependencies easily:
16
+ Debian 10+ users can install dependencies easily:
16
17
 
17
- sudo apt-get install sox libsox-fmt-all mp3gain flac ruby-dev
18
+ sudo apt-get install sox libsox-fmt-all flac ruby-dev ruby-charlock-holmes
18
19
 
19
20
  For future upgrades of dtas
20
21
 
@@ -28,10 +29,10 @@ For future upgrades of dtas
28
29
 
29
30
  Grab the latest tarball from our HTTPS site:
30
31
 
31
- https://80x24.org/dtas/2020/dtas-0.18.0.tar.gz
32
+ https://80x24.org/dtas/2021/dtas-0.18.1.tar.gz
32
33
 
33
- $ tar zxvf dtas-0.18.0.tar.gz
34
- $ cd dtas-0.18.0
34
+ $ tar zxvf dtas-0.18.1.tar.gz
35
+ $ cd dtas-0.18.1
35
36
  $ sudo ruby setup.rb
36
37
 
37
38
  GNU/Linux users may optionally install the "sleepy_penguin" RubyGem
@@ -49,5 +50,5 @@ No subscription is necessary to post to the mailing list.
49
50
 
50
51
  # COPYRIGHT
51
52
 
52
- Copyright 2013-2020 all contributors <dtas-all@nongnu.org>
53
+ Copyright 2013-2021 all contributors <dtas-all@nongnu.org>
53
54
  License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
data/README CHANGED
@@ -82,8 +82,13 @@ Mailing list archives available at <https://80x24.org/dtas-all/> or
82
82
  No subscription is necessary to post to the mailing list.
83
83
  You may also read via:
84
84
  NNTP: <nntp://news.public-inbox.org/inbox.comp.audio.dtas>
85
- <nntp://news.gmane.org/gmane.comp.audio.dtas.general>
85
+ <nntp://ou63pmih66umazou.onion/inbox.comp.audio.dtas>
86
+ <nntp://news.gmane.io/gmane.comp.audio.dtas.general>
87
+ IMAP: <imaps://anon:mous@public-inbox.org/inbox.comp.audio.dtas.0>
88
+ <imap://anon:mous@ou63pmih66umazou.onion/inbox.comp.audio.dtas.0>
86
89
  Atom: <https://80x24.org/dtas-all/new.atom>
90
+ <http://ou63pmih66umazou.onion/dtas-all/new.atom>
91
+ (.onion URLs require Tor: <https://www.torproject.org/>)
87
92
 
88
93
  ## Copyright
89
94
 
data/bin/dtas-console CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- # Copyright (C) 2013-2020 all contributors <dtas-all@nongnu.org>
2
+ # Copyright (C) 2013-2021 all contributors <dtas-all@nongnu.org>
3
3
  # License: GPL-3.0+ <https://www.gnu.org/licenses/gpl-3.0.txt>
4
4
  # frozen_string_literal: true
5
5
  #
@@ -112,7 +112,8 @@ def rg_string(rg, current)
112
112
  rv
113
113
  end
114
114
 
115
- def may_fail(res, events)
115
+ def may_fail(c, req, events)
116
+ res = c.req(req)
116
117
  events << res if res != "OK"
117
118
  end
118
119
 
@@ -227,17 +228,17 @@ def may_fail(res, events)
227
228
  when $stdin
228
229
  # keybindings taken from mplayer / vi
229
230
  case key = Curses.getch
230
- when "j" then c.req_ok("seek -5")
231
- when "k" then c.req_ok("seek +5")
231
+ when "j" then may_fail(c, "seek -5", events)
232
+ when "k" then may_fail(c, "seek +5", events)
232
233
  when "q" then exit(0)
233
- when Curses::KEY_DOWN then c.req_ok("seek -60")
234
- when Curses::KEY_UP then c.req_ok("seek +60")
235
- when Curses::KEY_LEFT then c.req_ok("seek -10")
236
- when Curses::KEY_RIGHT then c.req_ok("seek +10")
237
- when Curses::KEY_BACKSPACE then c.req_ok("seek 0")
234
+ when Curses::KEY_DOWN then may_fail(c, "seek -60", events)
235
+ when Curses::KEY_UP then may_fail(c, "seek +60", events)
236
+ when Curses::KEY_LEFT then may_fail(c, "seek -10", events)
237
+ when Curses::KEY_RIGHT then may_fail(c, "seek +10", events)
238
+ when Curses::KEY_BACKSPACE then may_fail(c, "seek 0", events)
238
239
  # yes, some of us have long audio files
239
- when Curses::KEY_PPAGE then c.req_ok("seek +600")
240
- when Curses::KEY_NPAGE then c.req_ok("seek -600")
240
+ when Curses::KEY_PPAGE then may_fail(c, "seek +600", events)
241
+ when Curses::KEY_NPAGE then may_fail(c, "seek -600", events)
241
242
  when '9' then c.req_ok('rg volume-=0.01')
242
243
  when '0' then c.req_ok('rg volume+=0.01')
243
244
  when '=' then c.req_ok('rg volume=1')
@@ -248,8 +249,8 @@ def may_fail(res, events)
248
249
  when "f" then c.req_ok("rg fallback_gain-=1")
249
250
  when ">" then c.req_ok("tl next")
250
251
  when "<" then c.req_ok("tl prev")
251
- when "!" then may_fail(c.req("cue prev"), events)
252
- when "@" then may_fail(c.req("cue next"), events)
252
+ when "!" then may_fail(c, "cue prev", events)
253
+ when "@" then may_fail(c, "cue next", events)
253
254
  when "o" then tfmt = update_tfmt(prec_step[prec_nr], tsec = !tsec)
254
255
  when " "
255
256
  c.req("play_pause")
data/bin/dtas-splitfx CHANGED
@@ -23,6 +23,9 @@
23
23
  end
24
24
  op.on('-b', '--bits RATE', Integer) { |val| opts[:bits] = val }
25
25
  op.on('-t', '--trim POSITION') { |val| opts[:trim] = val.tr(',', ' ') }
26
+ op.on('-E', '--err-suffix SUFFIX') do |val|
27
+ opts[:err_suffix] = val.start_with?('.') ? val.freeze : ".#{val}"
28
+ end
26
29
  op.on('-p', '--sox-pipe') do
27
30
  opts[:sox_pipe] = true
28
31
  default_target = 'sox'
@@ -30,6 +33,10 @@
30
33
  op.parse!(ARGV)
31
34
  end
32
35
 
36
+ if opts[:sox_pipe] && opts[:err_suffix]
37
+ abort '--err-suffix and --sox-pipe are mutually exclusive'
38
+ end
39
+
33
40
  args = []
34
41
  ARGV.each do |arg|
35
42
  case arg
data/lib/dtas/encoding.rb CHANGED
@@ -11,15 +11,14 @@ def self.extended(mod)
11
11
  private
12
12
 
13
13
  def try_enc_harder(str, enc, old) # :nodoc:
14
+ begin
15
+ require 'charlock_holmes'
16
+ @charlock_holmes = CharlockHolmes::EncodingDetector.new
17
+ rescue LoadError
18
+ @charlock_holmes = false
19
+ end if @charlock_holmes.nil?
20
+
14
21
  case @charlock_holmes
15
- when nil
16
- begin
17
- require 'charlock_holmes'
18
- @charlock_holmes = CharlockHolmes::EncodingDetector.new
19
- rescue LoadError
20
- warn "`charlock_holmes` gem not available for encoding detection"
21
- @charlock_holmes = false
22
- end
23
22
  when false
24
23
  enc_fallback(str, enc, old)
25
24
  else
@@ -197,19 +197,20 @@ def __goto_offset_samples(offset)
197
197
  end
198
198
  end
199
199
 
200
+ def __offset_to_i(offset, src)
201
+ # either "999s" for 999 samples or HH:MM:SS for time
202
+ offset.sub!(/s\z/, '') ? offset.to_i : src.format.hhmmss_to_samples(offset)
203
+ end
204
+
200
205
  def __offset_to_samples(offset)
201
- offset.sub!(/s\z/, '') and return offset.to_i
202
- @current.format.hhmmss_to_samples(offset)
206
+ __offset_to_i(offset, @current)
203
207
  end
204
208
 
205
209
  # returns seek offset as an Integer in sample count
206
- def __seek_offset_adj(dir, offset)
207
- if offset.sub!(/s\z/, '')
208
- offset = offset.to_i
209
- else # time
210
- offset = @current.format.hhmmss_to_samples(offset)
211
- end
212
- n = __current_decoded_samples + (dir * offset)
210
+ def __seek_offset_adj(dir, offset,
211
+ src = @current,
212
+ current_decoded_samples = __current_decoded_samples)
213
+ n = current_decoded_samples + (dir * __offset_to_i(offset, src))
213
214
  n = 0 if n < 0
214
215
  "#{n}s"
215
216
  end
@@ -391,15 +392,17 @@ def seek_internal(cur, offset)
391
392
  end
392
393
  end
393
394
 
395
+ def __offset_direction(offset)
396
+ offset.sub!(/\A\+/, '') ? 1 : (offset.sub!(/\A-/, '') ? -1 : nil)
397
+ end
398
+
394
399
  def dpc_seek(io, msg)
395
400
  offset = msg[0] or return io.emit('ERR usage: seek OFFSET')
396
401
  if @current
397
402
  if @current.respond_to?(:infile)
398
403
  begin
399
- if offset.sub!(/\A\+/, '')
400
- offset = __seek_offset_adj(1, offset)
401
- elsif offset.sub!(/\A-/, '')
402
- offset = __seek_offset_adj(-1, offset)
404
+ if direction = __offset_direction(offset)
405
+ offset = __seek_offset_adj(direction, offset)
403
406
  # else: pass to sox directly
404
407
  end
405
408
  rescue ArgumentError
@@ -413,7 +416,12 @@ def dpc_seek(io, msg)
413
416
  case file = @queue[0]
414
417
  when String
415
418
  @queue[0] = [ file, offset ]
416
- when Array
419
+ when Array # offset already stored, adjust
420
+ if direction = __offset_direction(offset)
421
+ tmp = try_file(*file)
422
+ cur_off = __offset_to_i(file[1].dup, tmp)
423
+ offset = __seek_offset_adj(direction, offset, tmp, cur_off)
424
+ end
417
425
  file[1] = offset
418
426
  else
419
427
  return io.emit("ERR unseekable")
data/lib/dtas/splitfx.rb CHANGED
@@ -207,11 +207,11 @@ def splitfx_spawn(target, t, opts)
207
207
  env["DITHERFX"] = "dither -s"
208
208
  end
209
209
  comments = Tempfile.new(%W(dtas-splitfx-#{t.comments["TRACKNUMBER"]} .txt))
210
- comments.sync = true
211
210
  t.comments.each do |k,v|
212
211
  env[k] = v.to_s
213
212
  comments.puts("#{k}=#{v}")
214
213
  end
214
+ comments.flush
215
215
  env["COMMENTS"] = "--comment-file=#{comments.path}"
216
216
  infile_env(env, @infile)
217
217
  outarg = outfmt.to_sox_arg
@@ -250,7 +250,10 @@ def splitfx_spawn(target, t, opts)
250
250
  command = 'true' if opts[:dryrun] # still gotta fork
251
251
 
252
252
  # pgroup: false so Ctrl-C on command-line will immediately stop everything
253
- [ dtas_spawn(env, command, pgroup: false), comments ]
253
+ o = { pgroup: false }
254
+ e = opts[:err_suffix] and
255
+ o[:err] = [ "#{env['OUTDIR']}#{env['TRACKNUMBER']}#{e}", 'a' ]
256
+ [ dtas_spawn(env, command, o), comments ]
254
257
  end
255
258
 
256
259
  def load_tracks!(hash)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dtas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.18.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - dtas hackers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-03 00:00:00.000000000 Z
11
+ date: 2021-02-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |-
14
14
  Free Software command-line tools for audio playback, mastering, and