merge: clear the clippy backlog and unify lock helpers (D1-warnings, D3)

51 clippy warnings -> 0, with 8 justified #[allow]s (IPC arity, specta wire
types, and the 9 test-only await-holding-lock sites). 27 raw lock calls moved to
the poison-tolerant helpers - all of them test code; production was already
clean.

Caught a non-neutral clippy --fix: removing the redundant 'use hostname;' in
credentials.rs orphaned its #[cfg(target_os = "linux")] onto SERVICE_NAME,
which would have cfg'd the constant out of every non-Linux build. Compiles clean
on Linux, so only Windows/macOS CI would have caught it.
This commit is contained in:
2026-08-16 23:06:33 +02:00
27 changed files with 173 additions and 109 deletions
+16 -9
View File
@@ -1490,6 +1490,10 @@ pub async fn player_seek_video(
/// TRACES: UR-021 | IR-019, DR-024
#[tauri::command]
#[specta::specta]
// Two of the eight arguments are Tauri `State<'_, _>` injections, not caller
// input. Folding the rest into a struct would change the IPC contract and the
// generated TypeScript for no readability gain.
#[allow(clippy::too_many_arguments)]
pub async fn player_switch_audio_track(
player: State<'_, PlayerStateWrapper>,
repository_manager: State<'_, super::repository::RepositoryManagerWrapper>,
@@ -1569,6 +1573,10 @@ pub async fn player_switch_audio_track(
/// TRACES: UR-074 | DR-162
#[tauri::command]
#[specta::specta]
// Three of the nine arguments are Tauri `State<'_, _>` injections, not caller
// input. Folding the rest into a struct would change the IPC contract and the
// generated TypeScript for no readability gain.
#[allow(clippy::too_many_arguments)]
pub async fn player_set_stream_quality(
player: State<'_, PlayerStateWrapper>,
repository_manager: State<'_, super::repository::RepositoryManagerWrapper>,
@@ -1805,7 +1813,7 @@ pub async fn player_get_status(
let local_media = {
let queue_arc = controller.queue();
let queue = queue_arc.lock().map_err(|e| e.to_string())?;
queue.current().map(|item| MergedMediaItem::from(item))
queue.current().map(MergedMediaItem::from)
};
let local_is_playing = status.state.is_playing();
@@ -1829,10 +1837,7 @@ pub async fn player_get_status(
log::info!("[PlayerCommands] Merging remote session state");
// Merge media item
status.merged_media = session
.now_playing_item
.as_ref()
.map(|item| MergedMediaItem::from(item));
status.merged_media = session.now_playing_item.as_ref().map(MergedMediaItem::from);
// Merge isPlaying (NOT isPaused!)
status.merged_is_playing = session
@@ -2762,6 +2767,8 @@ pub async fn player_disable_jellyfin(player: State<'_, PlayerStateWrapper>) -> R
#[cfg(test)]
mod tests {
use crate::utils::lock::MutexSafe;
/// The subtitle list the frontend resolved must survive the IPC hop and end
/// up on the `MediaItem` the native backend loads.
///
@@ -3084,7 +3091,7 @@ mod tests {
let database = Database::open_in_memory().unwrap();
{
let conn = database.connection();
let conn = conn.lock().unwrap();
let conn = conn.lock_safe();
conn.execute_batch(&format!(
r#"
INSERT INTO servers (id, name, url) VALUES ('srv', 'Test', 'http://test');
@@ -3140,7 +3147,7 @@ mod tests {
assert_eq!(switched, 1, "only the download whose file exists switches");
let queue = controller.queue();
let queue_lock = queue.lock().unwrap();
let queue_lock = queue.lock_safe();
match &queue_lock.items()[0].source {
MediaSource::Local {
file_path,
@@ -3169,7 +3176,7 @@ mod tests {
index_number: Option<i32>,
}
let mut tracks = vec![
let mut tracks = [
MockTrack {
id: "track1".to_string(),
name: "Song 1".to_string(),
@@ -3262,7 +3269,7 @@ mod tests {
}
// Create tracks in random order (not sorted)
let mut tracks = vec![
let mut tracks = [
MockTrack {
id: "id5".to_string(),
name: "Track 5".to_string(),