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
use super::constants::GENRES;
use super::tag::Id3v1Tag;
pub fn parse_id3v1(reader: [u8; 128]) -> Id3v1Tag {
let mut tag = Id3v1Tag {
title: None,
artist: None,
album: None,
year: None,
comment: None,
track_number: None,
genre: None,
};
let reader = &reader[3..];
tag.title = decode_text(&reader[..30]);
tag.artist = decode_text(&reader[30..60]);
tag.album = decode_text(&reader[60..90]);
tag.year = decode_text(&reader[90..94]);
let range = if reader[119] == 0 && reader[123] != 0 {
tag.track_number = Some(reader[123]);
94_usize..122
} else {
94..124
};
tag.comment = decode_text(&reader[range]);
if reader[124] < GENRES.len() as u8 {
tag.genre = Some(reader[124]);
}
tag
}
fn decode_text(data: &[u8]) -> Option<String> {
let read = data
.iter()
.filter(|c| **c != 0)
.map(|c| *c as char)
.collect::<String>();
if read.is_empty() {
None
} else {
Some(read)
}
}