Class: DTAS::ReplayGain

Inherits:
Object
  • Object
show all
Defined in:
lib/dtas/replaygain.rb

Overview

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

Constant Summary collapse

ATTRS =

:nodoc:

%w(reference_loudness track_gain album_gain track_peak album_peak)
ENV_ATTRS =
{}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(comments) ⇒ ReplayGain

Returns a new instance of ReplayGain.



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/dtas/replaygain.rb', line 40

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

Class Method Details

.new(comments, field) ⇒ Object



53
54
55
56
# File 'lib/dtas/replaygain.rb', line 53

def self.new(comments, field)
  tmp = super(comments)
  tmp.__send__(field) ? tmp : nil
end

Instance Method Details

#check_float(val) ⇒ Object



23
24
25
# File 'lib/dtas/replaygain.rb', line 23

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

#check_gain(val) ⇒ Object



19
20
21
# File 'lib/dtas/replaygain.rb', line 19

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

#to_envObject

note: this strips the “dB” suffix, but that should be easier for apps to deal with anyways…



29
30
31
32
33
34
35
36
37
38
# File 'lib/dtas/replaygain.rb', line 29

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