diff --git a/src/components/shorts/watch-short.component.ts b/src/components/shorts/watch-short.component.ts index 99457db..6cc0c75 100644 --- a/src/components/shorts/watch-short.component.ts +++ b/src/components/shorts/watch-short.component.ts @@ -1471,8 +1471,11 @@ export class WatchShortComponent implements OnDestroy { this.index.set(0); this.nextCursor.set(null); this.seenIds = new Set(); - this.queryIndex = 0; - this.exhaustedQueries = new Set(); + // Requête de départ ALÉATOIRE : sinon chaque rechargement repart de la + // même recherche (« shorts ») et le fournisseur renvoie les mêmes vidéos + // jour après jour. + this.queryIndex = Math.floor(Math.random() * this.queriesFor(this.provider()).length); + this.exhaustedQueries = new Set(); this.catalogActive = false; this.catalogError.set(null); const ready = this.instances.getProviderReadiness(this.provider()); @@ -1772,7 +1775,12 @@ export class WatchShortComponent implements OnDestroy { ); } - /** Dedup inter-pages (clé videoId + provider). */ + /** + * Dedup inter-pages (clé videoId + provider) + mélange du lot neuf. + * Le mélange est volontaire : un rechargement du flux Shorts ne doit pas + * présenter les mêmes vidéos dans le même ordre (même chemin Pour toi, + * qui mélange déjà ses lots par sujet). + */ private dedup(list: Video[]): Video[] { const out: Video[] = []; for (const v of list) { @@ -1781,6 +1789,10 @@ export class WatchShortComponent implements OnDestroy { this.seenIds.add(key); out.push(v); } + for (let i = out.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [out[i], out[j]] = [out[j], out[i]]; + } return out; } diff --git a/src/services/youtube-api.service.ts b/src/services/youtube-api.service.ts index 02ab53e..9c438aa 100644 --- a/src/services/youtube-api.service.ts +++ b/src/services/youtube-api.service.ts @@ -1765,7 +1765,9 @@ export class YoutubeApiService { // tourne sur les top games, ce qui donne toujours des clips récents. // Curseur opaque : "::" (pagination vide = page 1). private twitchTopGameIds: string[] | null = null; - private twitchGameIdx = 0; + // Index de départ ALÉATOIRE : un rechargement ne repart pas toujours du + // même jeu (sinon mêmes clips jour après jour). `++` garde la rotation. + private twitchGameIdx = Math.floor(Math.random() * 1000); private twitchClipsSinceDays = 30; private getTwitchTopGameIds(): Observable {