Browse Source

⪦ Error fixing and small improvements ⪧

main
Unbewohnte 3 years ago
parent
commit
77600f7723
  1. 4
      README.md
  2. BIN
      testData/testwritev1.mp3
  3. 10
      v2/frame.go
  4. 2
      v2/frame_test.go
  5. 72
      v2/header.go
  6. 8
      v2/header_test.go

4
README.md

@ -12,12 +12,12 @@
To download package source: To download package source:
``` ```
go get github.com/Unbewohnte/id3ed go get github.com/Unbewohnte/id3ed/...
``` ```
To compile package: To compile package:
``` ```
go install github.com/Unbewohnte/id3ed go install github.com/Unbewohnte/id3ed/...
``` ```
--- ---

BIN
testData/testwritev1.mp3

Binary file not shown.

10
v2/frame.go

@ -21,17 +21,19 @@ type Frame struct {
Contents string Contents string
} }
// NOT TESTED ! Reads v2.3 | v2.4 frame // Reads ID3v2.3.0 or ID3v2.4.0 frame
func ReadFrame(rs io.Reader) (*Frame, error) { func ReadFrame(rs io.Reader, version uint) (*Frame, error) {
var frameHeader FrameHeader var frameHeader FrameHeader
var frame Frame var frame Frame
// ID
identifier, err := util.ReadToString(rs, 4) identifier, err := util.ReadToString(rs, 4)
if err != nil { if err != nil {
return nil, err return nil, err
} }
frameHeader.ID = identifier frameHeader.ID = identifier
// Size
framesizeBytes, err := util.Read(rs, 4) framesizeBytes, err := util.Read(rs, 4)
if err != nil { if err != nil {
return nil, err return nil, err
@ -44,18 +46,20 @@ func ReadFrame(rs io.Reader) (*Frame, error) {
frameHeader.FrameSize = framesize frameHeader.FrameSize = framesize
// Flags
frameFlagsBytes, err := util.Read(rs, 2) frameFlagsBytes, err := util.Read(rs, 2)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// STILL NOT IMPLEMENTED FLAG HANDLING !
frameFlags, err := util.BytesToInt(frameFlagsBytes) frameFlags, err := util.BytesToInt(frameFlagsBytes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
frameHeader.Flags = int(frameFlags) frameHeader.Flags = int(frameFlags)
// Body
frameContents, err := util.Read(rs, uint64(framesize)) frameContents, err := util.Read(rs, uint64(framesize))
if err != nil { if err != nil {
return nil, err return nil, err

2
v2/frame_test.go

@ -16,7 +16,7 @@ func TestReadFrame(t *testing.T) {
// read right after header`s bytes // read right after header`s bytes
f.Seek(int64(HEADERSIZE), io.SeekStart) f.Seek(int64(HEADERSIZE), io.SeekStart)
firstFrame, err := ReadFrame(f) firstFrame, err := ReadFrame(f, 24)
if err != nil { if err != nil {
t.Errorf("ReadFrame failed: %s", err) t.Errorf("ReadFrame failed: %s", err)
} }

72
v2/header.go

@ -4,20 +4,28 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"io" "io"
"strconv"
"github.com/Unbewohnte/id3ed/util" "github.com/Unbewohnte/id3ed/util"
) )
type HeaderFlags struct {
Unsynchronisated bool
HasExtendedHeader bool
Experimental bool
FooterPresent bool
}
// ID3v2.x header structure // ID3v2.x header structure
type Header struct { type Header struct {
Identifier string Identifier string
Version string Flags HeaderFlags
Unsynchronisated bool Version uint
Compressed bool
Size int64 // size of the whole tag - 10 header bytes Size int64 // size of the whole tag - 10 header bytes
} }
// Reads and structuralises ID3v2 header // Reads and structuralises ID3v2.3.0 or ID3v2.4.0 header
func GetHeader(rs io.ReadSeeker) (*Header, error) { func GetHeader(rs io.ReadSeeker) (*Header, error) {
var header Header var header Header
@ -51,23 +59,63 @@ func GetHeader(rs io.ReadSeeker) (*Header, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
header.Version = fmt.Sprintf("%d%d", -majorVersion, revisionNumber)
version, err := strconv.Atoi(fmt.Sprintf("%d%d", majorVersion, revisionNumber))
if err != nil {
return nil, err
}
header.Version = uint(version)
// flags // flags
flags, err := util.Read(rs, 1) flags, err := util.Read(rs, 1)
if err != nil { if err != nil {
return nil, err return nil, err
} }
bits := fmt.Sprintf("%08b", flags) // 1 byte is 8 bits
if bits[0] == 1 { flagBits := fmt.Sprintf("%08b", flags) // 1 byte is 8 bits
header.Unsynchronisated = true
// v3.0 and v4.0 have different amount of flags
switch version {
case 30:
if flagBits[0] == 1 {
header.Flags.Unsynchronisated = true
} else { } else {
header.Unsynchronisated = false header.Flags.Unsynchronisated = false
} }
if bits[1] == 1 { if flagBits[1] == 1 {
header.Compressed = true header.Flags.HasExtendedHeader = true
} else { } else {
header.Compressed = false header.Flags.HasExtendedHeader = false
}
if flagBits[2] == 1 {
header.Flags.Experimental = true
} else {
header.Flags.Experimental = false
}
// always false, because ID3v2.3.0 does not support footers
header.Flags.FooterPresent = false
case 40:
if flagBits[0] == 1 {
header.Flags.Unsynchronisated = true
} else {
header.Flags.Unsynchronisated = false
}
if flagBits[1] == 1 {
header.Flags.HasExtendedHeader = true
} else {
header.Flags.HasExtendedHeader = false
}
if flagBits[2] == 1 {
header.Flags.Experimental = true
} else {
header.Flags.Experimental = false
}
if flagBits[3] == 1 {
header.Flags.FooterPresent = true
} else {
header.Flags.FooterPresent = false
}
} }
// size // size

8
v2/header_test.go

@ -23,12 +23,12 @@ func TestGetHeader(t *testing.T) {
t.Errorf("GetHeader failed: expected identifier %s; got %s", "ID3", header.Identifier) t.Errorf("GetHeader failed: expected identifier %s; got %s", "ID3", header.Identifier)
} }
if header.Compressed != false { if header.Flags.HasExtendedHeader != false {
t.Errorf("GetHeader failed: expected flag %v; got %v", false, header.Compressed) t.Errorf("GetHeader failed: expected flag %v; got %v", false, header.Flags.HasExtendedHeader)
} }
if header.Unsynchronisated != false { if header.Flags.Unsynchronisated != false {
t.Errorf("GetHeader failed: expected flag %v; got %v", false, header.Unsynchronisated) t.Errorf("GetHeader failed: expected flag %v; got %v", false, header.Flags.Unsynchronisated)
} }
if header.Size != 1138 { if header.Size != 1138 {

Loading…
Cancel
Save