mirror of
https://github.com/wader/fq.git
synced 2024-12-01 02:30:32 +03:00
2fc0a71a47
Move scalar into own package. Split scalar code into decode related scalar code (that reads etc) and scalar code that just transform the scalar value. Use a scalar.Mapper interface instead of just a function. Make mappers, assert and validat impement the interface.
230 lines
4.5 KiB
Go
230 lines
4.5 KiB
Go
package id3
|
||
|
||
import (
|
||
"github.com/wader/fq/format"
|
||
"github.com/wader/fq/format/registry"
|
||
"github.com/wader/fq/pkg/decode"
|
||
"github.com/wader/fq/pkg/scalar"
|
||
)
|
||
|
||
// TODO: comment 28 long, zero byte, track number
|
||
|
||
func init() {
|
||
registry.MustRegister(decode.Format{
|
||
Name: format.ID3V1,
|
||
Description: "ID3v1 metadata",
|
||
DecodeFn: id3v1Decode,
|
||
})
|
||
}
|
||
|
||
// Decode ID3v1 tag
|
||
func id3v1Decode(d *decode.D, in interface{}) interface{} {
|
||
d.AssertAtLeastBitsLeft(128 * 8)
|
||
d.FieldUTF8("magic", 3, d.AssertStr("TAG"))
|
||
if d.PeekBits(8) == uint64('+') {
|
||
d.Errorf("looks like id3v11")
|
||
}
|
||
d.FieldUTF8NullFixedLen("song_name", 30)
|
||
d.FieldUTF8NullFixedLen("artist", 30)
|
||
d.FieldUTF8NullFixedLen("album_name", 30)
|
||
d.FieldUTF8NullFixedLen("year", 4)
|
||
d.FieldUTF8NullFixedLen("comment", 30)
|
||
// from https://en.wikipedia.org/wiki/List_of_ID3v1_Genres
|
||
d.FieldU8("genre", scalar.UToSymStr{
|
||
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",
|
||
})
|
||
|
||
return nil
|
||
}
|