kopia lustrzana https://github.com/jcs/id3-go
don't trust sizes of existing frames, re-calculate
also write new text strings for toc/chap in utf-16master
rodzic
3685b615b7
commit
1c3fc9101a
|
@ -149,3 +149,26 @@ func EncodedDiff(newEncoding byte, newString string, oldEncoding byte, oldString
|
||||||
|
|
||||||
return len(newEncodedString) - len(oldEncodedString), nil
|
return len(newEncodedString) - len(oldEncodedString), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func EncodedStringBytes(s string, encoding byte) ([]byte, error) {
|
||||||
|
encodedString, err := Encoders[encoding].ConvertString(s)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return []byte(encodedString), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func EncodedNullTermStringBytes(s string, encoding byte) ([]byte, error) {
|
||||||
|
encodedBytes, err := EncodedStringBytes(s, encoding)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
nullLength := EncodingNullLengthForIndex(encoding)
|
||||||
|
for x := 0; x < nullLength; x++ {
|
||||||
|
encodedBytes = append(encodedBytes, byte(0x0))
|
||||||
|
}
|
||||||
|
|
||||||
|
return encodedBytes, nil
|
||||||
|
}
|
||||||
|
|
|
@ -36,12 +36,12 @@ func (w *Writer) WriteByte(b byte) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) WriteString(s string, encoding byte) (err error) {
|
func (w *Writer) WriteString(s string, encoding byte) (err error) {
|
||||||
encodedString, err := Encoders[encoding].ConvertString(s)
|
encodedBytes, err := EncodedStringBytes(s, encoding)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = w.Write([]byte(encodedString))
|
_, err = w.Write(encodedBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
50
v2/frame.go
50
v2/frame.go
|
@ -320,14 +320,25 @@ func ParseDescTextFrame(head FrameHead, data []byte) Framer {
|
||||||
if f.encoding, err = rd.ReadByte(); err != nil {
|
if f.encoding, err = rd.ReadByte(); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
f.size = uint32(1)
|
||||||
|
|
||||||
if f.description, err = rd.ReadNullTermString(f.encoding); err != nil {
|
if f.description, err = rd.ReadNullTermString(f.encoding); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
l, err := encodedbytes.EncodedNullTermStringBytes(f.description, f.encoding)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
f.size += uint32(len(l))
|
||||||
|
|
||||||
if f.text, err = rd.ReadRestString(f.encoding); err != nil {
|
if f.text, err = rd.ReadRestString(f.encoding); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
l, err = encodedbytes.EncodedStringBytes(f.text, f.encoding)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
f.size += uint32(len(l))
|
||||||
|
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
@ -421,18 +432,30 @@ func ParseUnsynchTextFrame(head FrameHead, data []byte) Framer {
|
||||||
if f.encoding, err = rd.ReadByte(); err != nil {
|
if f.encoding, err = rd.ReadByte(); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
f.size = uint32(1)
|
||||||
|
|
||||||
if f.language, err = rd.ReadNumBytesString(3); err != nil {
|
if f.language, err = rd.ReadNumBytesString(3); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
f.size += uint32(3)
|
||||||
|
|
||||||
if f.description, err = rd.ReadNullTermString(f.encoding); err != nil {
|
if f.description, err = rd.ReadNullTermString(f.encoding); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
l, err := encodedbytes.EncodedNullTermStringBytes(f.description, f.encoding)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
f.size += uint32(len(l))
|
||||||
|
|
||||||
if f.text, err = rd.ReadRestString(f.encoding); err != nil {
|
if f.text, err = rd.ReadRestString(f.encoding); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
l, err = encodedbytes.EncodedStringBytes(f.text, f.encoding)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
f.size += uint32(len(l))
|
||||||
|
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
@ -497,22 +520,35 @@ func ParseImageFrame(head FrameHead, data []byte) Framer {
|
||||||
if f.encoding, err = rd.ReadByte(); err != nil {
|
if f.encoding, err = rd.ReadByte(); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
f.size = uint32(1)
|
||||||
|
|
||||||
if f.mimeType, err = rd.ReadNullTermString(encodedbytes.NativeEncoding); err != nil {
|
if f.mimeType, err = rd.ReadNullTermString(encodedbytes.NativeEncoding); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
l, err := encodedbytes.EncodedNullTermStringBytes(f.mimeType, encodedbytes.NativeEncoding)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
f.size += uint32(len(l))
|
||||||
|
|
||||||
if f.pictureType, err = rd.ReadByte(); err != nil {
|
if f.pictureType, err = rd.ReadByte(); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
f.size += uint32(1)
|
||||||
|
|
||||||
if f.description, err = rd.ReadNullTermString(f.encoding); err != nil {
|
if f.description, err = rd.ReadNullTermString(f.encoding); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
l, err = encodedbytes.EncodedNullTermStringBytes(f.description, f.encoding)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
f.size += uint32(len(l))
|
||||||
|
|
||||||
if f.data, err = rd.ReadRest(); err != nil {
|
if f.data, err = rd.ReadRest(); err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
f.size += uint32(len(f.data))
|
||||||
|
|
||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
@ -606,11 +642,13 @@ func NewChapterFrame(ft FrameType, element string, startTime uint32, endTime uin
|
||||||
if title != "" {
|
if title != "" {
|
||||||
ft := V23FrameTypeMap["TIT2"]
|
ft := V23FrameTypeMap["TIT2"]
|
||||||
titleFrame = NewTextFrame(ft, title)
|
titleFrame = NewTextFrame(ft, title)
|
||||||
|
titleFrame.(*TextFrame).SetEncoding("UTF-16")
|
||||||
}
|
}
|
||||||
|
|
||||||
if link != "" {
|
if link != "" {
|
||||||
ft := V23FrameTypeMap["WXXX"]
|
ft := V23FrameTypeMap["WXXX"]
|
||||||
linkFrame = NewDescTextFrame(ft, linkTitle, link)
|
linkFrame = NewDescTextFrame(ft, linkTitle, link)
|
||||||
|
linkFrame.(*DescTextFrame).SetEncoding("UTF-16")
|
||||||
}
|
}
|
||||||
|
|
||||||
head := FrameHead{
|
head := FrameHead{
|
||||||
|
@ -728,18 +766,18 @@ func (f ChapterFrame) Title() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ChapterFrame) Bytes() []byte {
|
func (f *ChapterFrame) Bytes() []byte {
|
||||||
f.size = uint32(8 + len(f.Element))
|
f.size = uint32(len(f.Element) + 1 + 4 + 4 + 4 + 4)
|
||||||
|
|
||||||
var titleBytes []byte
|
var titleBytes []byte
|
||||||
if f.titleFrame != nil {
|
if f.titleFrame != nil {
|
||||||
titleBytes = V23Bytes(f.titleFrame)
|
titleBytes = V23Bytes(f.titleFrame)
|
||||||
f.size += uint32(len(titleBytes)) + FrameHeaderSize
|
f.size += uint32(len(titleBytes))
|
||||||
}
|
}
|
||||||
|
|
||||||
var linkBytes []byte
|
var linkBytes []byte
|
||||||
if f.linkFrame != nil {
|
if f.linkFrame != nil {
|
||||||
linkBytes = V23Bytes(f.linkFrame)
|
linkBytes = V23Bytes(f.linkFrame)
|
||||||
f.size += uint32(len(linkBytes)) + FrameHeaderSize
|
f.size += uint32(len(linkBytes))
|
||||||
}
|
}
|
||||||
|
|
||||||
bs := make([]byte, f.size)
|
bs := make([]byte, f.size)
|
||||||
|
@ -828,13 +866,13 @@ func ParseTOCFrame(head FrameHead, data []byte) Framer {
|
||||||
}
|
}
|
||||||
f.Ordered = (b&(1<<0) != 0)
|
f.Ordered = (b&(1<<0) != 0)
|
||||||
f.TopLevel = (b&(1<<1) != 0)
|
f.TopLevel = (b&(1<<1) != 0)
|
||||||
|
f.size += 1
|
||||||
|
|
||||||
b, err = rd.ReadByte()
|
b, err = rd.ReadByte()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
f.size += 1
|
||||||
f.size += 2
|
|
||||||
|
|
||||||
for i := 0; i < int(b); i++ {
|
for i := 0; i < int(b); i++ {
|
||||||
s, err := rd.ReadNullTermString(encodedbytes.NativeEncoding)
|
s, err := rd.ReadNullTermString(encodedbytes.NativeEncoding)
|
||||||
|
@ -863,7 +901,7 @@ func (f TOCFrame) String() string {
|
||||||
func (f *TOCFrame) Bytes() []byte {
|
func (f *TOCFrame) Bytes() []byte {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
size := uint32(len(f.Element) + 1 + 2 + 1)
|
size := uint32(len(f.Element) + 1 + 1 + 1)
|
||||||
for _, e := range f.ChildElements {
|
for _, e := range f.ChildElements {
|
||||||
size += uint32(len(e) + 1)
|
size += uint32(len(e) + 1)
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue