2020-06-08 03:29:51 +03:00
|
|
|
|
package id3
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"strings"
|
2021-08-17 13:06:32 +03:00
|
|
|
|
|
|
|
|
|
"github.com/wader/fq/format"
|
|
|
|
|
"github.com/wader/fq/format/registry"
|
|
|
|
|
"github.com/wader/fq/pkg/decode"
|
2020-06-08 03:29:51 +03:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// TODO: comment 28 long, zero byte, track number
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
registry.MustRegister(&decode.Format{
|
|
|
|
|
Name: format.ID3V1,
|
|
|
|
|
Description: "ID3v1 metadata",
|
|
|
|
|
DecodeFn: id3v1Decode,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func field(d *decode.D, name string, nBytes int) {
|
|
|
|
|
d.FieldStrFn(name, func() (string, string) {
|
|
|
|
|
return strings.Trim(d.UTF8(nBytes), "\x00 "), ""
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Decode ID3v1 tag
|
|
|
|
|
func id3v1Decode(d *decode.D, in interface{}) interface{} {
|
|
|
|
|
d.ValidateAtLeastBitsLeft(128 * 8)
|
|
|
|
|
d.FieldValidateUTF8("magic", "TAG")
|
|
|
|
|
if d.PeekBits(8) == uint64('+') {
|
|
|
|
|
d.Invalid("looks like id3v11")
|
|
|
|
|
}
|
|
|
|
|
field(d, "song_name", 30)
|
|
|
|
|
field(d, "artist", 30)
|
|
|
|
|
field(d, "album_name", 30)
|
|
|
|
|
field(d, "year", 4)
|
|
|
|
|
field(d, "comment", 30)
|
|
|
|
|
// from https://en.wikipedia.org/wiki/List_of_ID3v1_Genres
|
|
|
|
|
d.FieldStringMapFn("genre", map[uint64]string{
|
|
|
|
|
0: "Blues",
|
|
|
|
|
1: "Classic Rock",
|
|
|
|
|
2: "Country",
|
|
|
|
|
3: "Dance",
|
|
|
|
|
4: "Disco",
|
|
|
|
|
5: "Funk",
|
|
|
|
|
6: "Grunge",
|
|
|
|
|
7: "Hip-Hop",
|
|
|
|
|
8: "Jazz",
|
|
|
|
|
9: "Metal",
|
|
|
|
|
10: "New Age",
|
|
|
|
|
11: "Oldies",
|
|
|
|
|
12: "Other",
|
|
|
|
|
13: "Pop",
|
|
|
|
|
14: "Rhythm and Blues",
|
|
|
|
|
15: "Rap",
|
|
|
|
|
16: "Reggae",
|
|
|
|
|
17: "Rock",
|
|
|
|
|
18: "Techno",
|
|
|
|
|
19: "Industrial",
|
|
|
|
|
20: "Alternative",
|
|
|
|
|
21: "Ska",
|
|
|
|
|
22: "Death Metal",
|
|
|
|
|
23: "Pranks",
|
|
|
|
|
24: "Soundtrack",
|
|
|
|
|
25: "Euro-Techno",
|
|
|
|
|
26: "Ambient",
|
|
|
|
|
27: "Trip-Hop",
|
|
|
|
|
28: "Vocal",
|
|
|
|
|
29: "Jazz & Funk",
|
|
|
|
|
30: "Fusion",
|
|
|
|
|
31: "Trance",
|
|
|
|
|
32: "Classical",
|
|
|
|
|
33: "Instrumental",
|
|
|
|
|
34: "Acid",
|
|
|
|
|
35: "House",
|
|
|
|
|
36: "Game",
|
|
|
|
|
37: "Sound clip",
|
|
|
|
|
38: "Gospel",
|
|
|
|
|
39: "Noise",
|
|
|
|
|
40: "Alternative Rock",
|
|
|
|
|
41: "Bass",
|
|
|
|
|
42: "Soul",
|
|
|
|
|
43: "Punk",
|
|
|
|
|
44: "Space",
|
|
|
|
|
45: "Meditative",
|
|
|
|
|
46: "Instrumental Pop",
|
|
|
|
|
47: "Instrumental Rock",
|
|
|
|
|
48: "Ethnic",
|
|
|
|
|
49: "Gothic",
|
|
|
|
|
50: "Darkwave",
|
|
|
|
|
51: "Techno-Industrial",
|
|
|
|
|
52: "Electronic",
|
|
|
|
|
53: "Pop-Folk",
|
|
|
|
|
54: "Eurodance",
|
|
|
|
|
55: "Dream",
|
|
|
|
|
56: "Southern Rock",
|
|
|
|
|
57: "Comedy",
|
|
|
|
|
58: "Cult",
|
|
|
|
|
59: "Gangsta",
|
|
|
|
|
60: "Top 40",
|
|
|
|
|
61: "Christian Rap",
|
|
|
|
|
62: "Pop/Funk",
|
|
|
|
|
63: "Jungle music",
|
|
|
|
|
64: "Native US",
|
|
|
|
|
65: "Cabaret",
|
|
|
|
|
66: "New Wave",
|
|
|
|
|
67: "Psychedelic",
|
|
|
|
|
68: "Rave",
|
|
|
|
|
69: "Showtunes",
|
|
|
|
|
70: "Trailer",
|
|
|
|
|
71: "Lo-Fi",
|
|
|
|
|
72: "Tribal",
|
|
|
|
|
73: "Acid Punk",
|
|
|
|
|
74: "Acid Jazz",
|
|
|
|
|
75: "Polka",
|
|
|
|
|
76: "Retro",
|
|
|
|
|
77: "Musical",
|
|
|
|
|
78: "Rock ’n’ Roll",
|
|
|
|
|
79: "Hard Rock",
|
|
|
|
|
80: "Folk",
|
|
|
|
|
81: "Folk-Rock",
|
|
|
|
|
82: "National Folk",
|
|
|
|
|
83: "Swing",
|
|
|
|
|
84: "Fast Fusion",
|
|
|
|
|
85: "Bebop",
|
|
|
|
|
86: "Latin",
|
|
|
|
|
87: "Revival",
|
|
|
|
|
88: "Celtic",
|
|
|
|
|
89: "Bluegrass",
|
|
|
|
|
90: "Avantgarde",
|
|
|
|
|
91: "Gothic Rock",
|
|
|
|
|
92: "Progressive Rock",
|
|
|
|
|
93: "Psychedelic Rock",
|
|
|
|
|
94: "Symphonic Rock",
|
|
|
|
|
95: "Slow Rock",
|
|
|
|
|
96: "Big Band",
|
|
|
|
|
97: "Chorus",
|
|
|
|
|
98: "Easy Listening",
|
|
|
|
|
99: "Acoustic",
|
|
|
|
|
100: "Humour",
|
|
|
|
|
101: "Speech",
|
|
|
|
|
102: "Chanson",
|
|
|
|
|
103: "Opera",
|
|
|
|
|
104: "Chamber Music",
|
|
|
|
|
105: "Sonata",
|
|
|
|
|
106: "Symphony",
|
|
|
|
|
107: "Booty Bass",
|
|
|
|
|
108: "Primus",
|
|
|
|
|
109: "Porn Groove",
|
|
|
|
|
110: "Satire",
|
|
|
|
|
111: "Slow Jam",
|
|
|
|
|
112: "Club",
|
|
|
|
|
113: "Tango",
|
|
|
|
|
114: "Samba",
|
|
|
|
|
115: "Folklore",
|
|
|
|
|
116: "Ballad",
|
|
|
|
|
117: "Power Ballad",
|
|
|
|
|
118: "Rhythmic Soul",
|
|
|
|
|
119: "Freestyle",
|
|
|
|
|
120: "Duet",
|
|
|
|
|
121: "Punk Rock",
|
|
|
|
|
122: "Drum Solo",
|
|
|
|
|
123: "A cappella",
|
|
|
|
|
124: "Euro-House",
|
|
|
|
|
125: "Dance Hall",
|
|
|
|
|
126: "Goa music",
|
|
|
|
|
127: "Drum & Bass",
|
|
|
|
|
128: "Club-House",
|
|
|
|
|
129: "Hardcore Techno",
|
|
|
|
|
130: "Terror",
|
|
|
|
|
131: "Indie",
|
|
|
|
|
132: "BritPop",
|
|
|
|
|
133: "Negerpunk",
|
|
|
|
|
134: "Polsk Punk",
|
|
|
|
|
135: "Beat",
|
|
|
|
|
136: "Christian Gangsta Rap",
|
|
|
|
|
137: "Heavy Metal",
|
|
|
|
|
138: "Black Metal",
|
|
|
|
|
139: "Crossover",
|
|
|
|
|
140: "Contemporary Christian",
|
|
|
|
|
141: "Christian Rock",
|
|
|
|
|
142: "Merengue",
|
|
|
|
|
143: "Salsa",
|
|
|
|
|
144: "Thrash Metal",
|
|
|
|
|
145: "Anime",
|
|
|
|
|
146: "Jpop",
|
|
|
|
|
147: "Synthpop",
|
|
|
|
|
148: "Abstract",
|
|
|
|
|
149: "Art Rock",
|
|
|
|
|
150: "Baroque",
|
|
|
|
|
151: "Bhangra",
|
|
|
|
|
152: "Big beat",
|
|
|
|
|
153: "Breakbeat",
|
|
|
|
|
154: "Chillout",
|
|
|
|
|
155: "Downtempo",
|
|
|
|
|
156: "Dub",
|
|
|
|
|
157: "EBM",
|
|
|
|
|
158: "Eclectic",
|
|
|
|
|
159: "Electro",
|
|
|
|
|
160: "Electroclash",
|
|
|
|
|
161: "Emo",
|
|
|
|
|
162: "Experimental",
|
|
|
|
|
163: "Garage",
|
|
|
|
|
164: "Global",
|
|
|
|
|
165: "IDM",
|
|
|
|
|
166: "Illbient",
|
|
|
|
|
167: "Industro-Goth",
|
|
|
|
|
168: "Jam Band",
|
|
|
|
|
169: "Krautrock",
|
|
|
|
|
170: "Leftfield",
|
|
|
|
|
171: "Lounge",
|
|
|
|
|
172: "Math Rock",
|
|
|
|
|
173: "New Romantic",
|
|
|
|
|
174: "Nu-Breakz",
|
|
|
|
|
175: "Post-Punk",
|
|
|
|
|
176: "Post-Rock",
|
|
|
|
|
177: "Psytrance",
|
|
|
|
|
178: "Shoegaze",
|
|
|
|
|
179: "Space Rock",
|
|
|
|
|
180: "Trop Rock",
|
|
|
|
|
181: "World Music",
|
|
|
|
|
182: "Neoclassical",
|
|
|
|
|
183: "Audiobook",
|
|
|
|
|
184: "Audio Theatre",
|
|
|
|
|
185: "Neue Deutsche Welle",
|
|
|
|
|
186: "Podcast",
|
|
|
|
|
187: "Indie-Rock",
|
|
|
|
|
188: "G-Funk",
|
|
|
|
|
189: "Dubstep",
|
|
|
|
|
190: "Garage Rock",
|
|
|
|
|
191: "Psybient",
|
|
|
|
|
}, "Unknown", d.U8, decode.NumberDecimal)
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|