mirror of
https://github.com/Dangoware/dmp-core.git
synced 2025-04-19 17:42:56 -05:00
Updated lofty
to 0.17.0
, fixing several issues
This commit is contained in:
parent
f00df67844
commit
12aaab9174
2 changed files with 31 additions and 22 deletions
|
@ -13,7 +13,7 @@ categories = ["multimedia::audio"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
file-format = { version = "0.22.0", features = ["reader-asf", "reader-ebml", "reader-mp4", "reader-rm", "reader-txt", "reader-xml", "serde"] }
|
file-format = { version = "0.22.0", features = ["reader-asf", "reader-ebml", "reader-mp4", "reader-rm", "reader-txt", "reader-xml", "serde"] }
|
||||||
lofty = "0.16.1"
|
lofty = "0.17.0"
|
||||||
serde = { version = "1.0.191", features = ["derive"] }
|
serde = { version = "1.0.191", features = ["derive"] }
|
||||||
time = "0.3.22"
|
time = "0.3.22"
|
||||||
toml = "0.7.5"
|
toml = "0.7.5"
|
||||||
|
|
|
@ -11,7 +11,7 @@ use std::ops::ControlFlow::{Break, Continue};
|
||||||
use rcue::parser::parse_from_file;
|
use rcue::parser::parse_from_file;
|
||||||
use file_format::{FileFormat, Kind};
|
use file_format::{FileFormat, Kind};
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
use lofty::{AudioFile, ItemKey, ItemValue, Probe, TagType, TaggedFileExt};
|
use lofty::{AudioFile, ItemKey, ItemValue, Probe, TagType, TaggedFileExt, ParseOptions};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
@ -246,7 +246,7 @@ impl Album<'_> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const BLOCKED_EXTENSIONS: [&str; 3] = ["vob", "log", "txt"];
|
const BLOCKED_EXTENSIONS: [&str; 5] = ["vob", "log", "txt", "sf2", "mid"];
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct MusicLibrary {
|
pub struct MusicLibrary {
|
||||||
|
@ -341,6 +341,7 @@ impl MusicLibrary {
|
||||||
config: &Config,
|
config: &Config,
|
||||||
) -> Result<usize, Box<dyn std::error::Error>> {
|
) -> Result<usize, Box<dyn std::error::Error>> {
|
||||||
let mut total = 0;
|
let mut total = 0;
|
||||||
|
let mut errors = 0;
|
||||||
for target_file in WalkDir::new(target_path)
|
for target_file in WalkDir::new(target_path)
|
||||||
.follow_links(true)
|
.follow_links(true)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -381,6 +382,7 @@ impl MusicLibrary {
|
||||||
match self.add_file(&target_file.path()) {
|
match self.add_file(&target_file.path()) {
|
||||||
Ok(_) => total += 1,
|
Ok(_) => total += 1,
|
||||||
Err(_error) => {
|
Err(_error) => {
|
||||||
|
errors += 1;
|
||||||
println!("{}, {:?}: {}", format, target_file.file_name(), _error)
|
println!("{}, {:?}: {}", format, target_file.file_name(), _error)
|
||||||
} // TODO: Handle more of these errors
|
} // TODO: Handle more of these errors
|
||||||
};
|
};
|
||||||
|
@ -388,6 +390,7 @@ impl MusicLibrary {
|
||||||
total += match self.add_cuesheet(&target_file.path().to_path_buf()) {
|
total += match self.add_cuesheet(&target_file.path().to_path_buf()) {
|
||||||
Ok(added) => added,
|
Ok(added) => added,
|
||||||
Err(error) => {
|
Err(error) => {
|
||||||
|
errors += 1;
|
||||||
println!("{}", error);
|
println!("{}", error);
|
||||||
0
|
0
|
||||||
}
|
}
|
||||||
|
@ -398,19 +401,19 @@ impl MusicLibrary {
|
||||||
// Save the database after scanning finishes
|
// Save the database after scanning finishes
|
||||||
self.save(&config).unwrap();
|
self.save(&config).unwrap();
|
||||||
|
|
||||||
|
println!("ERRORS: {}", errors);
|
||||||
|
|
||||||
Ok(total)
|
Ok(total)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_file(&mut self, target_file: &Path) -> Result<(), Box<dyn Error>> {
|
pub fn add_file(&mut self, target_file: &Path) -> Result<(), Box<dyn Error>> {
|
||||||
|
let normal_options = ParseOptions::new().parsing_mode(lofty::ParsingMode::Relaxed);
|
||||||
|
|
||||||
// TODO: Fix error handling here
|
// TODO: Fix error handling here
|
||||||
let tagged_file = match lofty::read_from_path(target_file) {
|
let tagged_file = match Probe::open(target_file)?.options(normal_options).read() {
|
||||||
Ok(tagged_file) => tagged_file,
|
Ok(tagged_file) => tagged_file,
|
||||||
|
|
||||||
Err(_) => match Probe::open(target_file)?.read() {
|
Err(error) => return Err(error.into()),
|
||||||
Ok(tagged_file) => tagged_file,
|
|
||||||
|
|
||||||
Err(error) => return Err(error.into()),
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Ensure the tags exist, if not, insert blank data
|
// Ensure the tags exist, if not, insert blank data
|
||||||
|
@ -435,7 +438,7 @@ impl MusicLibrary {
|
||||||
ItemKey::Comment => Tag::Comment,
|
ItemKey::Comment => Tag::Comment,
|
||||||
ItemKey::AlbumTitle => Tag::Album,
|
ItemKey::AlbumTitle => Tag::Album,
|
||||||
ItemKey::DiscNumber => Tag::Disk,
|
ItemKey::DiscNumber => Tag::Disk,
|
||||||
ItemKey::Unknown(unknown) if unknown == "ACOUSTID_FINGERPRINT" => continue,
|
ItemKey::Unknown(unknown) if unknown == "ACOUSTID_FINGERPRINT" || unknown == "Acoustid Fingerprint" => continue,
|
||||||
ItemKey::Unknown(unknown) => Tag::Key(unknown.to_string()),
|
ItemKey::Unknown(unknown) => Tag::Key(unknown.to_string()),
|
||||||
custom => Tag::Key(format!("{:?}", custom)),
|
custom => Tag::Key(format!("{:?}", custom)),
|
||||||
};
|
};
|
||||||
|
@ -490,7 +493,9 @@ impl MusicLibrary {
|
||||||
|
|
||||||
match self.add_song(new_song) {
|
match self.add_song(new_song) {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(error) => return Err(error),
|
Err(_) => {
|
||||||
|
//return Err(error)
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -532,7 +537,9 @@ impl MusicLibrary {
|
||||||
None => Duration::from_secs(0),
|
None => Duration::from_secs(0),
|
||||||
};
|
};
|
||||||
let mut start = track.indices[0].1;
|
let mut start = track.indices[0].1;
|
||||||
start -= pregap;
|
if !start.is_zero() {
|
||||||
|
start -= pregap;
|
||||||
|
}
|
||||||
|
|
||||||
let duration = match next_track.next() {
|
let duration = match next_track.next() {
|
||||||
Some(future) => match future.indices.get(0) {
|
Some(future) => match future.indices.get(0) {
|
||||||
|
@ -540,17 +547,15 @@ impl MusicLibrary {
|
||||||
None => Duration::from_secs(0)
|
None => Duration::from_secs(0)
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
let tagged_file = match lofty::read_from_path(&audio_location) {
|
match lofty::read_from_path(&audio_location) {
|
||||||
Ok(tagged_file) => tagged_file,
|
Ok(tagged_file) => tagged_file.properties().duration() - start,
|
||||||
|
|
||||||
Err(_) => match Probe::open(&audio_location)?.read() {
|
Err(_) => match Probe::open(&audio_location)?.read() {
|
||||||
Ok(tagged_file) => tagged_file,
|
Ok(tagged_file) => tagged_file.properties().duration() - start,
|
||||||
|
|
||||||
Err(error) => return Err(error.into()),
|
Err(_) => Duration::from_secs(0),
|
||||||
},
|
},
|
||||||
};
|
}
|
||||||
|
|
||||||
tagged_file.properties().duration() - start
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let end = start + duration + postgap;
|
let end = start + duration + postgap;
|
||||||
|
@ -656,18 +661,22 @@ impl MusicLibrary {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Scan the song by a location and update its tags
|
/// Scan the song by a location and update its tags
|
||||||
pub fn update_by_file(&mut self, new_tags: Song) -> Result<(), Box<dyn std::error::Error>> {
|
pub fn update_uri(&mut self, target_uri: &URI, new_tags: Vec<Tag>) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
match self.query_uri(&new_tags.location) {
|
match self.query_uri(target_uri) {
|
||||||
Some(_) => (),
|
Some(_) => (),
|
||||||
None => return Err(format!("URI not in database!").into()),
|
None => return Err(format!("URI not in database!").into()),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for tag in new_tags {
|
||||||
|
println!("{:?}", tag);
|
||||||
|
}
|
||||||
|
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Query the database, returning a list of [Song]s
|
/// Query the database, returning a list of [Song]s
|
||||||
///
|
///
|
||||||
/// The order in which the sort by Vec is arranged
|
/// The order in which the `sort by` Vec is arranged
|
||||||
/// determines the output sorting.
|
/// determines the output sorting.
|
||||||
///
|
///
|
||||||
/// Example:
|
/// Example:
|
||||||
|
|
Loading…
Reference in a new issue