2022-08-16 09:05:18 +01:00
|
|
|
use std::path::PathBuf;
|
|
|
|
|
2023-10-20 18:32:58 +01:00
|
|
|
use serde::Deserialize;
|
|
|
|
|
2023-01-14 16:53:53 +00:00
|
|
|
use crate::utils::format_detection::FileFormat;
|
2023-01-08 10:24:44 +00:00
|
|
|
|
2022-10-22 15:15:37 +01:00
|
|
|
#[derive(Debug, Clone)]
|
2022-08-16 09:05:18 +01:00
|
|
|
pub struct Tags {
|
2023-10-19 17:22:01 +01:00
|
|
|
pub title: String,
|
|
|
|
pub artist: String,
|
2023-10-20 18:04:22 +01:00
|
|
|
pub track_number: Option<u64>,
|
2023-01-08 10:24:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for Tags {
|
2023-10-19 17:22:01 +01:00
|
|
|
fn default() -> Self {
|
|
|
|
Tags {
|
|
|
|
title: "".to_string(),
|
|
|
|
artist: "".to_string(),
|
2023-10-20 18:04:22 +01:00
|
|
|
track_number: None,
|
2023-10-19 17:22:01 +01:00
|
|
|
}
|
|
|
|
}
|
2023-01-08 10:24:44 +00:00
|
|
|
}
|
|
|
|
|
2023-01-14 16:53:53 +00:00
|
|
|
#[derive(Default, Debug, Clone)]
|
2023-01-08 10:24:44 +00:00
|
|
|
pub struct AudioFileInfo {
|
2023-10-19 17:22:01 +01:00
|
|
|
pub tags: Tags,
|
2023-10-30 23:17:52 +00:00
|
|
|
#[cfg(feature = "replaygain")]
|
2023-10-19 17:22:01 +01:00
|
|
|
pub contains_replaygain: bool,
|
2023-10-30 23:17:52 +00:00
|
|
|
#[cfg(feature = "replaygain")]
|
2023-10-19 17:22:01 +01:00
|
|
|
pub supports_replaygain: bool,
|
|
|
|
pub format: Option<FileFormat>,
|
2022-08-16 09:05:18 +01:00
|
|
|
}
|
|
|
|
|
2022-10-22 15:15:37 +01:00
|
|
|
#[derive(Debug, Clone)]
|
2022-08-16 09:05:18 +01:00
|
|
|
pub struct File {
|
2023-10-19 17:22:01 +01:00
|
|
|
pub filename: String,
|
|
|
|
pub extension: String,
|
2022-08-16 09:05:18 +01:00
|
|
|
|
2023-10-19 17:22:01 +01:00
|
|
|
// relative path to file's folder
|
|
|
|
pub path_to: PathBuf,
|
|
|
|
// path to folder from source
|
|
|
|
pub path_from_source: PathBuf,
|
2023-01-08 10:24:44 +00:00
|
|
|
|
2023-10-19 17:22:01 +01:00
|
|
|
pub extra_files: Vec<File>,
|
2023-01-08 10:24:44 +00:00
|
|
|
|
2023-10-19 17:22:01 +01:00
|
|
|
pub info: AudioFileInfo,
|
2023-10-20 18:32:58 +01:00
|
|
|
|
|
|
|
pub folder_meta: FolderMeta,
|
2022-08-16 09:05:18 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
impl File {
|
2023-10-19 17:22:01 +01:00
|
|
|
pub fn from_path(source_dir: String, full_path: PathBuf) -> File {
|
|
|
|
let full_file_path = PathBuf::from(&source_dir).join(full_path);
|
|
|
|
|
|
|
|
let filename_without_extension = full_file_path
|
|
|
|
.file_stem()
|
|
|
|
.expect("filename invalid")
|
|
|
|
.to_string_lossy()
|
|
|
|
.to_string();
|
|
|
|
|
|
|
|
let extension = full_file_path.extension();
|
|
|
|
|
|
|
|
let extension = if let Some(extension) = extension {
|
|
|
|
extension.to_string_lossy().to_string()
|
|
|
|
} else {
|
|
|
|
"".to_string()
|
|
|
|
};
|
|
|
|
|
|
|
|
let path_from_src = full_file_path
|
|
|
|
.strip_prefix(&source_dir)
|
|
|
|
.expect("couldn't get path relative to source");
|
|
|
|
|
|
|
|
let mut folder_path_from_src = path_from_src.to_path_buf();
|
|
|
|
folder_path_from_src.pop();
|
|
|
|
|
|
|
|
let path_to = PathBuf::from(&source_dir).join(&folder_path_from_src);
|
|
|
|
|
|
|
|
File {
|
|
|
|
filename: filename_without_extension,
|
|
|
|
extension,
|
|
|
|
path_from_source: folder_path_from_src,
|
|
|
|
path_to,
|
|
|
|
extra_files: Vec::new(),
|
|
|
|
info: AudioFileInfo::default(),
|
2023-10-20 18:32:58 +01:00
|
|
|
folder_meta: FolderMeta::default(),
|
2023-10-19 17:22:01 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn join_filename(&self) -> String {
|
|
|
|
format!("{}.{}", self.filename, self.extension)
|
|
|
|
}
|
|
|
|
pub fn join_path_to(&self) -> PathBuf {
|
|
|
|
PathBuf::from(&self.path_to).join(self.join_filename())
|
|
|
|
}
|
|
|
|
pub fn join_path_from_source(&self) -> PathBuf {
|
|
|
|
PathBuf::from(&self.path_from_source).join(self.join_filename())
|
|
|
|
}
|
2022-08-16 09:05:18 +01:00
|
|
|
}
|
2023-10-20 18:32:58 +01:00
|
|
|
|
|
|
|
#[derive(Debug, Clone, Deserialize, Default)]
|
|
|
|
pub struct FolderMeta {
|
|
|
|
pub is_album: bool,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl FolderMeta {
|
|
|
|
pub fn load(path: &PathBuf) -> Result<FolderMeta, Box<dyn std::error::Error>> {
|
|
|
|
let file = std::fs::File::open(path)?;
|
|
|
|
let reader = std::io::BufReader::new(file);
|
|
|
|
|
|
|
|
let u: FolderMeta =
|
|
|
|
serde_yaml::from_reader(reader).expect("error while reading folder meta");
|
|
|
|
Ok(u)
|
|
|
|
}
|
|
|
|
}
|