From 09cc2dcf94e862095976d5720bb2fc654089b6b4 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Wed, 25 Mar 2026 11:38:10 +0100 Subject: [PATCH] feat: implement pagination for playlist container browsing Replace single-page browse with paginated loop to handle playlists exceeding BROWSE_PAGE_SIZE (64 items). Each page is fetched with retry logic, and entries are accumulated until fewer than BROWSE_PAGE_SIZE items are returned, ensuring complete playlist refresh. --- pmocontrol/src/control_point.rs | 71 ++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/pmocontrol/src/control_point.rs b/pmocontrol/src/control_point.rs index 224ccaad..b763c326 100644 --- a/pmocontrol/src/control_point.rs +++ b/pmocontrol/src/control_point.rs @@ -1542,37 +1542,52 @@ fn refresh_attached_queue_for( const MAX_BROWSE_ATTEMPTS: usize = 3; const BROWSE_RETRY_DELAY_MS: u64 = 200; - let mut attempt = 1; - let entries = loop { - match music_server.browse_children(&container_id, 0, 64) { - Ok(e) => break e, - Err(err) => { - if attempt >= MAX_BROWSE_ATTEMPTS { - warn!( - renderer = renderer_id.0.as_str(), - server = server_id.0.as_str(), - container = container_id.as_str(), - attempts = attempt, - error = %err, - "Failed to browse playlist container for refresh" - ); - return Err(err); - } + const BROWSE_PAGE_SIZE: u32 = 64; - debug!( - renderer = renderer_id.0.as_str(), - server = server_id.0.as_str(), - container = container_id.as_str(), - attempt, - error = %err, - "Browse attempt failed, retrying" - ); - thread::sleep(Duration::from_millis( - BROWSE_RETRY_DELAY_MS * attempt as u64, - )); - attempt += 1; + // Paginated browse — une playlist peut dépasser BROWSE_PAGE_SIZE items + let entries = { + let mut all_entries = Vec::new(); + let mut offset = 0u32; + loop { + let mut attempt = 1; + let page = loop { + match music_server.browse_children(&container_id, offset, BROWSE_PAGE_SIZE) { + Ok(e) => break e, + Err(err) => { + if attempt >= MAX_BROWSE_ATTEMPTS { + warn!( + renderer = renderer_id.0.as_str(), + server = server_id.0.as_str(), + container = container_id.as_str(), + attempts = attempt, + error = %err, + "Failed to browse playlist container for refresh" + ); + return Err(err); + } + debug!( + renderer = renderer_id.0.as_str(), + server = server_id.0.as_str(), + container = container_id.as_str(), + attempt, + error = %err, + "Browse attempt failed, retrying" + ); + thread::sleep(Duration::from_millis( + BROWSE_RETRY_DELAY_MS * attempt as u64, + )); + attempt += 1; + } + } + }; + let fetched = page.len() as u32; + all_entries.extend(page); + if fetched < BROWSE_PAGE_SIZE { + break; } + offset += fetched; } + all_entries }; debug!(