-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfulltext.go
105 lines (89 loc) · 2.12 KB
/
fulltext.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package id3
import (
"encoding/hex"
"github.com/golang/glog"
"golang.org/x/text/language"
)
type FullTextFrame struct {
frameBase
language language.Base
description string
text string
}
func newFullTextFrame(tag *Tag, header *frameHeader, data []byte) (Frame, error) {
ftf := &FullTextFrame{}
ftf.header = header
l := len(data)
textEncoding, encoding, err := extractEncoding(l, data)
if err != nil {
return nil, err
}
langCode := string(data[1:4])
if langCode == "xxx" || langCode == "XXX" || langCode == "\x00\x00\x00" {
langCode = "ENG"
}
ftf.language, err = language.ParseBase(langCode)
if err != nil {
glog.Errorf("Bad language: %v %v", langCode, hex.EncodeToString(data))
return nil, err
}
description, i, err := trimForEncoding(l-4, data[4:], textEncoding, false)
if err != nil {
return nil, err
}
ftf.description, err = decodeString(description, encoding)
if err != nil {
return nil, err
}
text, _, err := trimForEncoding(l-(i+4), data[i+4:], textEncoding, false)
if err != nil {
return nil, err
}
if len(text) > 0 {
ftf.text, err = decodeString(text, encoding)
if err != nil {
return nil, err
}
}
return ftf, nil
}
func newDescribedFrame(tag *Tag, header *frameHeader, data []byte) (Frame, error) {
ftf := &FullTextFrame{}
ftf.header = header
l := len(data)
textEncoding, encoding, err := extractEncoding(l, data)
if err != nil {
return nil, err
}
description, i, err := trimForEncoding(l, data, textEncoding, true)
if err != nil {
return nil, err
}
ftf.description, err = decodeString(description, encoding)
if err != nil {
return nil, err
}
text, _, err := trimForEncoding(l-i, data[i:], textEncoding, false)
if err != nil {
return nil, err
}
if len(text) > 0 {
ftf.text, err = decodeString(text, encoding)
if err != nil {
return nil, err
}
}
return ftf, nil
}
func (ftf *FullTextFrame) String() string {
return ftf.text
}
func (ftf *FullTextFrame) Bytes() []byte {
return []byte(ftf.text)
}
func (ftf *FullTextFrame) Description() string {
return ftf.description
}
func (ftf *FullTextFrame) Language() language.Base {
return ftf.language
}