symphonia_metadata/
riff.rs

1// Symphonia
2// Copyright (c) 2019-2022 The Project Symphonia Developers.
3//
4// This Source Code Form is subject to the terms of the Mozilla Public
5// License, v. 2.0. If a copy of the MPL was not distributed with this
6// file, You can obtain one at https://mozilla.org/MPL/2.0/.
7
8//! A RIFF INFO metadata reader.
9
10use lazy_static::lazy_static;
11use std::collections::HashMap;
12use symphonia_core::meta::{StandardTagKey, Tag, Value};
13
14lazy_static! {
15    static ref RIFF_INFO_MAP: HashMap<&'static str, StandardTagKey> = {
16        let mut m = HashMap::new();
17        m.insert("ages", StandardTagKey::Rating);
18        m.insert("cmnt", StandardTagKey::Comment);
19        // Is this the same as a cmnt?
20        m.insert("comm", StandardTagKey::Comment);
21        m.insert("dtim", StandardTagKey::OriginalDate);
22        m.insert("genr", StandardTagKey::Genre);
23        m.insert("iart", StandardTagKey::Artist);
24        // Is this also  the same as cmnt?
25        m.insert("icmt", StandardTagKey::Comment);
26        m.insert("icop", StandardTagKey::Copyright);
27        m.insert("icrd", StandardTagKey::Date);
28        m.insert("idit", StandardTagKey::OriginalDate);
29        m.insert("ienc", StandardTagKey::EncodedBy);
30        m.insert("ieng", StandardTagKey::Engineer);
31        m.insert("ifrm", StandardTagKey::TrackTotal);
32        m.insert("ignr", StandardTagKey::Genre);
33        m.insert("ilng", StandardTagKey::Language);
34        m.insert("imus", StandardTagKey::Composer);
35        m.insert("inam", StandardTagKey::TrackTitle);
36        m.insert("iprd", StandardTagKey::Album);
37        m.insert("ipro", StandardTagKey::Producer);
38        m.insert("iprt", StandardTagKey::TrackNumber);
39        m.insert("irtd", StandardTagKey::Rating);
40        m.insert("isft", StandardTagKey::Encoder);
41        m.insert("isgn", StandardTagKey::Genre);
42        m.insert("isrf", StandardTagKey::MediaFormat);
43        m.insert("itch", StandardTagKey::EncodedBy);
44        m.insert("iwri", StandardTagKey::Writer);
45        m.insert("lang", StandardTagKey::Language);
46        m.insert("prt1", StandardTagKey::TrackNumber);
47        m.insert("prt2", StandardTagKey::TrackTotal);
48        // Same as inam?
49        m.insert("titl", StandardTagKey::TrackTitle);
50        m.insert("torg", StandardTagKey::Label);
51        m.insert("trck", StandardTagKey::TrackNumber);
52        m.insert("tver", StandardTagKey::Version);
53        m.insert("year", StandardTagKey::Date);
54        m
55    };
56}
57
58/// Parse the RIFF INFO block into a `Tag` using the block's identifier tag and a slice
59/// containing the block's contents.
60pub fn parse(tag: [u8; 4], buf: &[u8]) -> Tag {
61    // TODO: Key should be checked that it only contains ASCII characters.
62    let key = String::from_utf8_lossy(&tag);
63    let value = String::from_utf8_lossy(buf);
64
65    // Attempt to assign a standardized tag key.
66    let std_tag = RIFF_INFO_MAP.get(key.to_lowercase().as_str()).copied();
67
68    Tag::new(std_tag, &key, Value::from(value))
69}