Added merge
All checks were successful
Publish Metadata Agent Image / build-and-push-image (push) Successful in 1m7s
Publish Web Player Image / build-and-push-image (push) Successful in 1m11s
Publish Server Image / build-and-push-image (push) Successful in 2m14s

This commit is contained in:
2026-03-19 00:55:49 +00:00
parent 4a272f373d
commit e1782a6e3b
13 changed files with 949 additions and 23 deletions

View File

@@ -25,6 +25,18 @@ pub async fn run(state: Arc<AppState>) {
Ok(count) => tracing::info!(count, "re-processed pending tracks"),
Err(e) => tracing::error!(?e, "pending re-processing failed"),
}
// Process pending merge proposals
match db::get_pending_merges_for_processing(&state.pool).await {
Ok(merge_ids) => {
for merge_id in merge_ids {
if let Err(e) = crate::merge::propose_merge(&state, merge_id).await {
tracing::error!(id = %merge_id, ?e, "Merge proposal failed");
let _ = db::update_merge_status(&state.pool, merge_id, "error", Some(&e.to_string())).await;
}
}
}
Err(e) => tracing::error!(?e, "Failed to load pending merges"),
}
tokio::time::sleep(interval).await;
}
}
@@ -161,13 +173,14 @@ async fn reprocess_pending(state: &Arc<AppState>) -> anyhow::Result<usize> {
.join(sanitize_filename(album))
.join(&dest_filename);
let storage_path = if dest.exists() && !source.exists() {
dest.to_string_lossy().to_string()
let (storage_path, was_merged) = if dest.exists() && !source.exists() {
(dest.to_string_lossy().to_string(), false)
} else if source.exists() {
match mover::move_to_storage(
&state.config.storage_dir, artist, album, &dest_filename, source,
).await {
Ok(p) => p.to_string_lossy().to_string(),
Ok(mover::MoveOutcome::Moved(p)) => (p.to_string_lossy().to_string(), false),
Ok(mover::MoveOutcome::Merged(p)) => (p.to_string_lossy().to_string(), true),
Err(e) => {
tracing::error!(id = %pt.id, ?e, "Failed to move file");
db::update_pending_status(&state.pool, pt.id, "error", Some(&e.to_string())).await?;
@@ -181,7 +194,12 @@ async fn reprocess_pending(state: &Arc<AppState>) -> anyhow::Result<usize> {
};
match db::approve_and_finalize(&state.pool, pt.id, &storage_path).await {
Ok(track_id) => tracing::info!(id = %pt.id, track_id, "Track finalized"),
Ok(track_id) => {
if was_merged {
let _ = db::update_pending_status(&state.pool, pt.id, "merged", None).await;
}
tracing::info!(id = %pt.id, track_id, "Track finalized");
}
Err(e) => tracing::error!(id = %pt.id, ?e, "Failed to finalize"),
}
}
@@ -472,10 +490,17 @@ async fn process_file(state: &Arc<AppState>, file_path: &std::path::Path) -> any
)
.await
{
Ok(storage_path) => {
Ok(outcome) => {
let (storage_path, was_merged) = match outcome {
mover::MoveOutcome::Moved(p) => (p, false),
mover::MoveOutcome::Merged(p) => (p, true),
};
let rel_path = storage_path.to_string_lossy().to_string();
match db::approve_and_finalize(&state.pool, pending_id, &rel_path).await {
Ok(track_id) => {
if was_merged {
let _ = db::update_pending_status(&state.pool, pending_id, "merged", None).await;
}
tracing::info!(file = filename, track_id, storage = %rel_path, "Track finalized in database");
}
Err(e) => {