Sha256: 9c3b0c8370f92e8686dc253399c7921e933d97b13562eca86cba231ded3a181c

Contents?: true

Size: 1.41 KB

Versions: 4

Compression:

Stored size: 1.41 KB

Contents

require 'forwardable'

module Mp3file::ID3v2
  class Tag
    extend Forwardable

    def_delegators(:@header, :version, :unsynchronized, :extended_header, 
      :compression, :experimental, :footer)

    attr_reader(:header, :frames, :unused_bytes)

    FRAME_HEADER_NAME_REGEX = /[A-Z][A-Z0-9]{2,3}/

    def initialize(io)
      @header = Header.new(io)
      load_frames(io)
      used_bytes = @frames.inject(0) { |m, f| m += f.size }
      @unused_bytes = @header.tag_size - used_bytes
    end

    def load_frames(io)
      @frames = []

      data = io.read(@header.tag_size)
      data.force_encoding("ASCII-8BIT")
      offset = 0

      frame_offset, frame = get_next_frame_header(data, offset)
      while frame
        @frames << frame
        offset = frame_offset + frame.size
        frame_offset, frame = get_next_frame_header(data, offset)
      end
    end

    def size
      @header.tag_size + 10
    end

    def get_next_frame_header(data, offset)
      md = data.match(FRAME_HEADER_NAME_REGEX, offset)

      while md
        frame_offset = md.begin(0)
        io = StringIO.new(data[frame_offset, 32])
        frame = FrameHeader.new(io, self)

        if frame.frame_id.to_s =~ FRAME_HEADER_NAME_REGEX
          return [ frame_offset, frame ]
        else
          frame_offset = md.end(0) + 1
          md = data.match(FRAME_HEADER_NAME_REGEX, frame_offset)
        end
      end

      [ nil, nil ]
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
mp3file-1.0.3 lib/mp3file/id3v2/tag.rb
mp3file-1.0.2 lib/mp3file/id3v2/tag.rb
mp3file-1.0.1 lib/mp3file/id3v2/tag.rb
mp3file-1.0.0 lib/mp3file/id3v2/tag.rb