1
1
mirror of https://github.com/wader/fq.git synced 2024-11-27 14:14:58 +03:00
fq/format/id3/id3v1.go

237 lines
4.6 KiB
Go
Raw Normal View History

2020-06-08 03:29:51 +03:00
package id3
import (
"strings"
"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
}