Formatting

This commit is contained in:
Connor Johnstone
2026-03-18 15:36:22 -04:00
parent 1d1674e3a1
commit 3494de1133
3 changed files with 27 additions and 34 deletions

View File

@@ -20,38 +20,33 @@ async fn process_file(
let file_path_str = scanned.path.to_string_lossy().to_string(); let file_path_str = scanned.path.to_string_lossy().to_string();
// Check if file already exists with same mtime // Check if file already exists with same mtime
if let Some(existing) = queries::tracks::get_by_path(conn, &file_path_str).await? { if let Some(existing) = queries::tracks::get_by_path(conn, &file_path_str).await?
if let Some(existing_mtime) = existing.file_mtime { && let Some(existing_mtime) = existing.file_mtime
// Compare at second granularity && existing_mtime.and_utc().timestamp() == scanned.mtime.and_utc().timestamp()
if existing_mtime.and_utc().timestamp() == scanned.mtime.and_utc().timestamp() { {
tracing::debug!(path = %file_path_str, "skipping (mtime unchanged)"); tracing::debug!(path = %file_path_str, "skipping (mtime unchanged)");
return Ok(false); return Ok(false);
}
}
} }
// Extract metadata (CPU-bound, run in blocking thread) // Extract metadata (CPU-bound, run in blocking thread)
let path = scanned.path.clone(); let path = scanned.path.clone();
let mut meta: MusicMetadata = tokio::task::spawn_blocking(move || { let mut meta: MusicMetadata =
metadata::extract_metadata(&path) tokio::task::spawn_blocking(move || metadata::extract_metadata(&path)).await??;
})
.await??;
// Fallback: if missing title or artist from tags, try parsing from filename ("Artist - Title.ext") // Fallback: if missing title or artist from tags, try parsing from filename ("Artist - Title.ext")
if meta.title.is_none() || meta.artist.is_none() { if (meta.title.is_none() || meta.artist.is_none())
if let Some(stem) = scanned.path.file_stem().and_then(|s| s.to_str()) { && let Some(stem) = scanned.path.file_stem().and_then(|s| s.to_str())
if let Some((artist, title)) = stem.split_once(" - ") { && let Some((artist, title)) = stem.split_once(" - ")
let artist = artist.trim(); {
let title = title.trim(); let artist = artist.trim();
if !artist.is_empty() && !title.is_empty() { let title = title.trim();
tracing::debug!(path = %file_path_str, artist = artist, title = title, "parsed metadata from filename"); if !artist.is_empty() && !title.is_empty() {
if meta.artist.is_none() { tracing::debug!(path = %file_path_str, artist = artist, title = title, "parsed metadata from filename");
meta.artist = Some(artist.to_string()); if meta.artist.is_none() {
} meta.artist = Some(artist.to_string());
if meta.title.is_none() { }
meta.title = Some(title.to_string()); if meta.title.is_none() {
} meta.title = Some(title.to_string());
}
} }
} }
} }
@@ -69,10 +64,7 @@ async fn process_file(
} }
// Upsert artist (use album_artist if available, fall back to artist) // Upsert artist (use album_artist if available, fall back to artist)
let artist_name = meta let artist_name = meta.album_artist.as_deref().or(meta.artist.as_deref());
.album_artist
.as_deref()
.or(meta.artist.as_deref());
let artist_id = match artist_name { let artist_id = match artist_name {
Some(name) if !name.is_empty() => { Some(name) if !name.is_empty() => {
Some(queries::artists::upsert(conn, name, None).await?.id) Some(queries::artists::upsert(conn, name, None).await?.id)

View File

@@ -7,7 +7,10 @@ use shanty_db::Database;
use shanty_index::{ScanConfig, run_scan}; use shanty_index::{ScanConfig, run_scan};
#[derive(Parser)] #[derive(Parser)]
#[command(name = "shanty-index", about = "Index music files into the Shanty database")] #[command(
name = "shanty-index",
about = "Index music files into the Shanty database"
)]
struct Cli { struct Cli {
/// Directory to scan for music files. /// Directory to scan for music files.
path: PathBuf, path: PathBuf,

View File

@@ -45,9 +45,7 @@ fn file_type_to_codec(ft: FileType) -> &'static str {
/// Extract metadata from a music file. This is CPU-bound (sync). /// Extract metadata from a music file. This is CPU-bound (sync).
pub fn extract_metadata(path: &Path) -> IndexResult<MusicMetadata> { pub fn extract_metadata(path: &Path) -> IndexResult<MusicMetadata> {
let tagged_file = Probe::open(path)? let tagged_file = Probe::open(path)?.options(ParseOptions::default()).read()?;
.options(ParseOptions::default())
.read()?;
let mut meta = MusicMetadata::default(); let mut meta = MusicMetadata::default();