|
|
|
|
@ -3030,9 +3030,16 @@ impl DynamicPlaylistProvider for EmbyProvider {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let item = self
|
|
|
|
|
let item = match self
|
|
|
|
|
.fetch_item(&resolved, ¤t_id, ctx.request_context())
|
|
|
|
|
.await?;
|
|
|
|
|
.await
|
|
|
|
|
{
|
|
|
|
|
Ok(item) => item,
|
|
|
|
|
Err(error) if emby_browse_path_can_end_at_missing_ancestor(&error, &segments) => {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
Err(error) => return Err(error),
|
|
|
|
|
};
|
|
|
|
|
segments.push(DynamicBrowsePathSegment {
|
|
|
|
|
name: item.name,
|
|
|
|
|
target: Self::encode_target(¤t_id)?,
|
|
|
|
|
@ -3049,6 +3056,13 @@ impl DynamicPlaylistProvider for EmbyProvider {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn emby_browse_path_can_end_at_missing_ancestor(
|
|
|
|
|
error: &ProviderError,
|
|
|
|
|
resolved_segments: &[DynamicBrowsePathSegment],
|
|
|
|
|
) -> bool {
|
|
|
|
|
!resolved_segments.is_empty() && matches!(error, ProviderError::NotFound)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests {
|
|
|
|
|
use super::*;
|
|
|
|
|
@ -3092,6 +3106,27 @@ mod tests {
|
|
|
|
|
assert!(EmbyProvider::emby_list_item_from_item(item).is_folder);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn browse_path_stops_only_when_an_ancestor_is_missing() {
|
|
|
|
|
let resolved = vec![DynamicBrowsePathSegment {
|
|
|
|
|
name: "Visible folder".to_string(),
|
|
|
|
|
target: crate::models::ProviderTarget::emby("visible-folder".to_string()),
|
|
|
|
|
}];
|
|
|
|
|
|
|
|
|
|
assert!(emby_browse_path_can_end_at_missing_ancestor(
|
|
|
|
|
&ProviderError::NotFound,
|
|
|
|
|
&resolved,
|
|
|
|
|
));
|
|
|
|
|
assert!(!emby_browse_path_can_end_at_missing_ancestor(
|
|
|
|
|
&ProviderError::NotFound,
|
|
|
|
|
&[],
|
|
|
|
|
));
|
|
|
|
|
assert!(!emby_browse_path_can_end_at_missing_ancestor(
|
|
|
|
|
&ProviderError::Authentication("expired".to_string()),
|
|
|
|
|
&resolved,
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn playback_cache_key_is_room_scoped() {
|
|
|
|
|
let room_a = RoomId::expect_positive(1);
|
|
|
|
|
|