dtas.git  about / heads / tags
duct tape audio suite for *nix
blob cc96d545555103cf54ba2bf9578ed7c64fac03cf 1756 bytes (raw)
$ git show tfx-pu:lib/dtas/replaygain.rb	# shows this blob on the CLI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
# Copyright (C) 2013-2015 all contributors <dtas-all@nongnu.org>
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)

# Represents ReplayGain metadata for a DTAS::Source, only used by -player
# cleanup/validate values to prevent malicious files from making us
# run arbitrary commands
# *_peak values are 0..inf (1.0 being full scale, but >1 is possible
# *_gain values are specified in dB

class DTAS::ReplayGain # :nodoc:
  ATTRS = %w(reference_loudness track_gain album_gain track_peak album_peak)
  ENV_ATTRS = {}
  ATTRS.each do |a|
    attr_reader a
    ENV_ATTRS["REPLAYGAIN_#{a.upcase}"] = a
  end

  def check_gain(val)
    /([+-]?\d+(?:\.\d+)?)/ =~ val ? $1 : nil
  end

  def check_float(val)
    /(\d+(?:\.\d+)?)/ =~ val ? $1 : nil
  end

  # note: this strips the "dB" suffix, but that should be easier for apps
  # to deal with anyways...
  def to_env
    rv = {}
    # this will cause nil to be set if some envs are missing, this causes
    # Process.spawn to unset the environment if it was previously set
    # (leaked from some other process)
    ENV_ATTRS.each do |env_name, attr_name|
      rv[env_name] = __send__(attr_name)
    end
    rv
  end

  def initialize(comments)
    comments or return

    # the replaygain standard specifies 89.0 dB, but maybe some apps are
    # different...
    @reference_loudness = check_gain(comments["REPLAYGAIN_REFERENCE_LOUDNESS"])

    @track_gain = check_gain(comments["REPLAYGAIN_TRACK_GAIN"])
    @album_gain = check_gain(comments["REPLAYGAIN_ALBUM_GAIN"])
    @track_peak = check_float(comments["REPLAYGAIN_TRACK_PEAK"])
    @album_peak = check_float(comments["REPLAYGAIN_ALBUM_PEAK"])
  end

  def self.new(comments)
    tmp = super
    tmp.track_gain ? tmp : nil
  end
end

git clone git://80x24.org/dtas.git
git clone https://80x24.org/dtas.git