diff --git a/libs/portal/xtream/feature/src/lib/xtream-workspace-route-session.service.ts b/libs/portal/xtream/feature/src/lib/xtream-workspace-route-session.service.ts
index dcd15b41b..63247e585 100644
--- a/libs/portal/xtream/feature/src/lib/xtream-workspace-route-session.service.ts
+++ b/libs/portal/xtream/feature/src/lib/xtream-workspace-route-session.service.ts
@@ -92,7 +92,7 @@ function toContentInitBlockReason(
}
function toCachedContentScope(
- section: PortalRailSection | null
+ section: string | null
): XtreamCachedContentScope | null {
switch (section) {
case 'live':
@@ -101,6 +101,13 @@ function toCachedContentScope(
case 'search':
case 'recently-added':
return section;
+ // Neither reads one content type: both match TMDB titles against
+ // the whole catalog, so they take the aggregate scope search uses.
+ // Without it an expired or offline portal skips hydration and the
+ // page answers "not in your library" from an empty catalog.
+ case 'actor':
+ case 'discover':
+ return 'search';
default:
return null;
}
diff --git a/libs/ui/shared-portals/src/lib/title-results/title-results.component.html b/libs/ui/shared-portals/src/lib/title-results/title-results.component.html
index 72fd642bb..89a1db829 100644
--- a/libs/ui/shared-portals/src/lib/title-results/title-results.component.html
+++ b/libs/ui/shared-portals/src/lib/title-results/title-results.component.html
@@ -59,69 +59,75 @@
{{ emptyMessageKey() | translate }}
+ } @else { + +