Skip to main content

remata/
lib.rs

1//! # Media Metadata Parser
2//!
3//! A lightweight, dependency-free Rust library for extracting metadata from
4//! multiple audio and container formats.
5//!
6//! ## Supported Formats
7//!
8//! This crate provides parsers for:
9//!
10//! - **ID3** (v1 and v2) – MP3 metadata
11//! - **RIFF INFO** – WAV/AVI metadata
12//! - **ASF** – Windows Media formats (WMA/WMV)
13//! - **Atom (MP4/M4A)** – iTunes-style metadata
14//! - **Vorbis Comments** – FLAC and Ogg containers
15//! - **AIFF** – Audio Interchange File Format
16//!
17//! Each format is parsed into a strongly-typed Rust structure with optional fields.
18//!
19//! ## Design Goals
20//!
21//! - ✅ Zero dependencies (standard library only)
22//! - ✅ Fast and minimal allocations
23//! - ✅ Unified, ergonomic API
24//! - ✅ Graceful handling of missing fields
25//!
26//! ---
27//!
28//! ## Quick Start
29//!
30//! ### Example: Parsing ID3 (MP3)
31//!
32//! ```no_run
33//! use std::fs;
34//! use remata::Id3;
35//! use remata::ParserError;
36//!
37//! let data = fs::read("audio.mp3")?;
38//!
39//! let meta: Result<Id3, ParserError> = Id3::parse(&data);
40//! println!("{}", meta?);
41//! # Ok::<(), ParserError>(())
42//! ```
43//!
44//! ---
45//!
46//! ### Example: Parsing RIFF (WAV)
47//!
48//! ```no_run
49//! use std::fs;
50//! use remata::RiffMeta;
51//! use remata::ParserError;
52//!
53//! let data = fs::read("audio.wav")?;
54//!
55//! let meta: Result<RiffMeta, ParserError> = RiffMeta::parse(&data);
56//!
57//! if let Ok(meta) = meta {
58//!     if let Some(title) = meta.title {
59//!         println!("Title: {}", title);
60//!     }
61//! }
62//! # Ok::<(), ParserError>(())
63//! ```
64//!
65//! ---
66//!
67//! ### Example: Parsing ASF (WMA/WMV)
68//!
69//! ```no_run
70//! use std::fs;
71//! use remata::AsfMeta;
72//! use remata::ParserError;
73//!
74//! let data = fs::read("audio.wma")?;
75//!
76//! let meta: Result<AsfMeta, ParserError> = AsfMeta::parse(&data);
77//! println!("{}", meta?);
78//! # Ok::<(), ParserError>(())
79//! ```
80//!
81//! ---
82//!
83//! ### Example: Parsing MP4 / M4A (Atom)
84//!
85//! ```no_run
86//! use std::fs;
87//! use remata::AtomMeta;
88//! use remata::ParserError;
89//!
90//! let data = fs::read("audio.m4a")?;
91//!
92//! let meta: Result<AtomMeta, ParserError> = AtomMeta::parse(&data);
93//!
94//! if let Ok(meta) = meta {
95//!     if let Some(artist) = meta.artist {
96//!         println!("Artist: {}", artist);
97//!     }
98//! }
99//! # Ok::<(), ParserError>(())
100//! ```
101//!
102//! ---
103//!
104//! ### Example: Parsing FLAC / Ogg (Vorbis Comments)
105//!
106//! ```no_run
107//! use std::fs;
108//! use remata::Vob;
109//! use remata::ParserError;
110//!
111//! let data = fs::read("audio.flac")?;
112//!
113//! let meta: Result<Vob, ParserError> = Vob::parse(&data);
114//! println!("{}", meta?);
115//! # Ok::<(), ParserError>(())
116//! ```
117//!
118//! ---
119//!
120//! ## Error Handling
121//!
122//! All parsers now return the unified [`ParserError`] type. This error contains
123//! a human-readable message and can be propagated or logged.
124//!
125//! ```no_run
126//! use remata::{Vob, ParserError};
127//!
128//! match Vob::parse(&[]) {
129//!     Ok(meta) => println!("{}", meta),
130//!     Err(err) => eprintln!("Error: {}", err.message),
131//! }
132//! ```
133//!
134//! ---
135//!
136//! ## Notes
137//!
138//! - Not all metadata fields are guaranteed to be present.
139//! - Unknown or unsupported tags are safely ignored.
140//! - Binary data (e.g., cover art) is exposed as raw bytes.
141//!
142//! ---
143//!
144//! ## Re-exports
145//!
146//! All metadata types are re-exported at the crate root for convenience.
147mod error;
148mod readers;
149
150pub use readers::{
151    AiffMeta,
152    Id3,
153    RiffMeta,
154    AsfMeta,
155    Vob,
156    AtomMeta,
157};
158pub use error::ParserError;