Sha256: d4135664d95ca09898e6f587288ef54073173f46b98f7f447f4208f3f16e6a5c

Contents?: true

Size: 1.94 KB

Versions: 2

Compression:

Stored size: 1.94 KB

Contents

module Mp3file::ID3v2
  class Header
    attr_reader(
      :version, 
      :unsynchronized, 
      :extended_header, 
      :compression,
      :experimental, 
      :footer, 
      :tag_size)

    class ID3v2HeaderFormat < BinData::Record
      string(:tag_id, read_length: 3, asserted_value: "ID3")
      uint8(:vmaj, assert: -> { (2..4).include?(value) })
      uint8(:vmin)

      bit1(:unsynchronized)
      bit1(:extended_header)
      bit1(:experimental)
      bit1(:footer)
      bit4(:unused)

      uint32be(:size_padded)
    end

    def initialize(io)
      header = nil
      begin
        header = ID3v2HeaderFormat.read(io)
      rescue BinData::ValidityError => ve
        raise InvalidID3v2TagError, ve.message
      end

      @version = Version.new(header.vmaj, header.vmin)

      @unsynchronized = false
      @extended_header = false
      @compression = false
      @experimental = false
      @footer = false

      if @version >= ID3V2_2_0 && @version < ID3V2_3_0
        @unsynchronized = header.unsynchronized == 1
        # Bit 6 was redefined in v2.3.0+, and we picked the new name
        # for it above.
        @compression = header.extended_header == 1
        if header.experimental == 1 || header.footer == 1
          raise InvalidID3v2TagError, "Invalid flag set in ID3v2.2 header"
        end
      elsif @version >= ID3V2_3_0 && @version < ID3V2_4_0
        @unsynchronized = header.unsynchronized == 1
        @extended_header = header.extended_header == 1
        @experimental = header.experimental == 1
        if header.footer == 1
          raise InvalidID3v2TagError, "Invalid flag set in ID3v2.3 header"
        end
      elsif @version >= ID3V2_4_0 
        @unsynchronized = header.unsynchronized == 1
        @extended_header = header.extended_header == 1
        @experimental = header.experimental == 1
        @footer = header.footer == 1
      end

      @tag_size = BitPaddedInt.unpad_number(header.size_padded)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
mp3file-1.3.0 lib/mp3file/id3v2/header.rb
mp3file-1.2.0 lib/mp3file/id3v2/header.rb