Added support for Flac metadata

This commit is contained in:
Antoine Gersant 2016-11-16 17:27:53 -08:00
parent c3e5e27f23
commit 88318e5b4f
5 changed files with 42 additions and 2 deletions

13
Cargo.lock generated
View file

@ -10,6 +10,7 @@ dependencies = [
"iron 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"kernel32-sys 0.2.2 (git+https://github.com/retep998/winapi-rs)",
"lewton 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"metaflac 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"mount 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"ogg 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"oven 1.0.0 (git+https://github.com/agersant/oven?branch=remove_cookie_dep)",
@ -454,6 +455,17 @@ dependencies = [
"libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "metaflac"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"num 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "mime"
version = "0.2.2"
@ -1131,6 +1143,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084"
"checksum matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "15305656809ce5a4805b1ff2946892810992197ce1270ff79baded852187942e"
"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
"checksum metaflac 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "66d5865b6103db7bccad008e6d50195236116a44ef67879645bcbc1ce1e9c58b"
"checksum mime 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5c93a4bd787ddc6e7833c519b73a50883deb5863d76d9b71eb8216fb7f94e66"
"checksum mime_guess 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e9a7d89cb3bce9145b0d0339a0588b044e3e3e3faa1dcd74822ebdc36bfac020"
"checksum miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d1f4d337a01c32e1f2122510fed46393d53ca35a7f429cb0450abaedfa3ed54"

View file

@ -14,6 +14,7 @@ id3 = { git = "https://github.com/jameshurst/rust-id3" }
image = "0.10.3"
iron = "0.4.0"
lewton = "0.4.0"
metaflac = "0.1.4"
mount = "0.2.1"
ogg = "0.4.0"
oven = { git = "https://github.com/agersant/oven", branch = "remove_cookie_dep" }

View file

@ -5,6 +5,7 @@ use std::io;
use id3;
use image;
use lewton;
use metaflac;
#[derive(Debug)]
pub enum PError {
@ -58,6 +59,12 @@ impl From<lewton::VorbisError> for PError {
}
}
impl From<metaflac::Error> for PError {
fn from(_: metaflac::Error) -> PError {
PError::MetadataDecodingError
}
}
impl error::Error for PError {
fn description(&self) -> &str {
match *self {

View file

@ -6,6 +6,7 @@ extern crate id3;
extern crate image;
extern crate iron;
extern crate lewton;
extern crate metaflac;
extern crate mount;
extern crate ogg;
extern crate oven;

View file

@ -1,6 +1,7 @@
use ape;
use id3::Tag;
use id3;
use lewton::inside_ogg::OggStreamReader;
use metaflac;
use ogg::PacketReader;
use regex::Regex;
use std::fs;
@ -23,6 +24,7 @@ pub struct SongTags {
impl SongTags {
pub fn read(path: &Path) -> Result<SongTags, PError> {
match utils::get_audio_format(path) {
Some(AudioFormat::FLAC) => SongTags::read_flac(path),
Some(AudioFormat::MP3) => SongTags::read_id3(path),
Some(AudioFormat::MPC) => SongTags::read_ape(path),
Some(AudioFormat::OGG) => SongTags::read_vorbis(path),
@ -31,7 +33,7 @@ impl SongTags {
}
fn read_id3(path: &Path) -> Result<SongTags, PError> {
let tag = try!(Tag::read_from_path(path));
let tag = try!(id3::Tag::read_from_path(path));
let artist = tag.artist().map(|s| s.to_string());
let album_artist = tag.album_artist().map(|s| s.to_string());
@ -133,4 +135,20 @@ impl SongTags {
Ok(tags)
}
fn read_flac(path: &Path) -> Result<SongTags, PError> {
let tag = try!(metaflac::Tag::read_from_path(path));
let vorbis = try!(tag.vorbis_comments().ok_or(PError::MetadataDecodingError));
let disc_number = vorbis.get("DISCNUMBER").and_then(|d| d[0].parse::<u32>().ok());
let year = vorbis.get("DATE").and_then(|d| d[0].parse::<i32>().ok());
Ok(SongTags {
artist: vorbis.artist().map(|v| v[0].clone()),
album_artist: vorbis.album_artist().map(|v| v[0].clone()),
album: vorbis.album().map(|v| v[0].clone()),
title: vorbis.title().map(|v| v[0].clone()),
disc_number: disc_number,
track_number: vorbis.track(),
year: year,
})
}
}