From 3fe05b3c306bc2111a0d5abf39a9cd096a295cad Mon Sep 17 00:00:00 2001 From: Bruno Charest Date: Tue, 29 Sep 2026 09:56:15 -0400 Subject: [PATCH] =?UTF-8?q?fix(twitch):=20token=20partag=C3=A9=20+=20timeo?= =?UTF-8?q?uts=20+=20fan-out=20r=C3=A9duit=20sur=20Home/Explore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../themes/provider-theme-page.component.ts | 28 ++++- src/components/themes/theme-page.component.ts | 28 ++++- src/services/youtube-api.service.ts | 108 ++++++++++++------ 3 files changed, 121 insertions(+), 43 deletions(-) diff --git a/src/components/themes/provider-theme-page.component.ts b/src/components/themes/provider-theme-page.component.ts index 0ea53a6..08d0c54 100644 --- a/src/components/themes/provider-theme-page.component.ts +++ b/src/components/themes/provider-theme-page.component.ts @@ -14,6 +14,7 @@ import { ChannelIdentityComponent } from '../../app/shared/components/channel-id import { InfiniteAnchorComponent } from '../shared/infinite-anchor/infinite-anchor.component'; import { classifyVideo, isLiveVideo, isShortVideo } from '../../app/shared/utils/video-kind'; import { map, of, switchMap, catchError, forkJoin, Observable } from 'rxjs'; +import { timeout } from 'rxjs/operators'; import { PagedResult } from '../../services/youtube-api.service'; const TWITCH_THEME_KEYWORDS: Record = { @@ -316,17 +317,27 @@ export class ProviderThemePageComponent implements OnDestroy { this.cdr.markForCheck(); }; + // Une section lente ne doit jamais bloquer les autres (forkJoin + // échoue dès qu'un appel erreur : chaque section est bornée à 25 s + // et retombe sur une page vide, le filet top-streams suit). + const bounded = (call: Observable>): Observable> => + call.pipe( + timeout(25000), + catchError(() => of({ items: [], nextCursor: null } as PagedResult