class WahWah::Mp3Tag

Public Instance Methods

id3_version() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 36
def id3_version
  @id3_tag&.version
end
id3v2?() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 28
def id3v2?
  @id3_tag.instance_of? ID3::V2
end
invalid_id3?() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 32
def invalid_id3?
  @id3_tag.nil?
end
is_vbr?() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 40
def is_vbr?
  mpeg_frame_header.valid? && (xing_header.valid? || vbri_header.valid?)
end

Private Instance Methods

bytes_count() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 103
def bytes_count
  return xing_header.bytes_count if xing_header.valid?
  vbri_header.bytes_count if vbri_header.valid?
end
frames_count() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 98
def frames_count
  return xing_header.frames_count if xing_header.valid?
  vbri_header.frames_count if vbri_header.valid?
end
mpeg_frame_header() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 68
def mpeg_frame_header
  # Because id3v2 tag on the file header so skip id3v2 tag
  @mpeg_frame_header ||= Mp3::MpegFrameHeader.new(@file_io, id3v2? ? @id3_tag&.size : 0)
end
parse() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 45
def parse
  @id3_tag = parse_id3_tag
  parse_duration if mpeg_frame_header.valid?
end
parse_duration() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 58
def parse_duration
  if is_vbr?
    @duration = (frames_count * (mpeg_frame_header.samples_per_frame / sample_rate.to_f)).round
    @bitrate = bytes_count * 8 / @duration / 1000 unless @duration.zero?
  else
    @bitrate = mpeg_frame_header.frame_bitrate
    @duration = (file_size - (@id3_tag&.size || 0)) * 8 / (@bitrate * 1000) unless @bitrate.zero?
  end
end
parse_id3_tag() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 50
def parse_id3_tag
  id3_v1_tag = ID3::V1.new(@file_io.dup)
  id3_v2_tag = ID3::V2.new(@file_io.dup)

  return id3_v2_tag if id3_v2_tag.valid?
  id3_v1_tag if id3_v1_tag.valid?
end
vbri_header() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 77
def vbri_header
  @vbri_header ||= Mp3::VbriHeader.new(@file_io, vbri_header_offset)
end
vbri_header_offset() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 91
def vbri_header_offset
  mpeg_frame_header_position = mpeg_frame_header.position
  mpeg_frame_header_size = Mp3::MpegFrameHeader::HEADER_SIZE

  mpeg_frame_header_position + mpeg_frame_header_size + 32
end
xing_header() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 73
def xing_header
  @xing_header ||= Mp3::XingHeader.new(@file_io, xing_header_offset)
end
xing_header_offset() click to toggle source
# File lib/wahwah/mp3_tag.rb, line 81
def xing_header_offset
  mpeg_frame_header_position = mpeg_frame_header.position
  mpeg_frame_header_size = Mp3::MpegFrameHeader::HEADER_SIZE
  mpeg_frame_side_info_size = mpeg_version == 'MPEG1' ?
    (channel_mode == 'Single Channel' ? 17 : 32) :
    (channel_mode == 'Single Channel' ? 9 : 17)

  mpeg_frame_header_position + mpeg_frame_header_size + mpeg_frame_side_info_size
end