feat: lives PeerTube/Rumble, page Admin, TTL par provider, import/export playlists
CI / build-and-test (push) Successful in 14m56s
CI / build-and-test (push) Successful in 14m56s
#1 Live - PeerTube: API native ?isLive=true (recherche sepiasearch + videos de chaine), mapPeertubeItem exporte la regle live (type/kind/isLive, viewers, jamais de duree), caps pt live:true, themes « En direct » branches pt/ru - Rumble: mode 'live' de scrapeRumbleList (rumble.com/browse/live, SSR), items type:live + extraction channelId (/c/<slug>), route GET /api/rumble/live, onglet chaine live filtre par channelId (plafond page 1 = 50 directs) - Odysee: N/A prouve (proxy na-backend sous jeton, probe 2026-10), caps inchangees - Tests: npm run test:live (25 assertions), assertion adapter_contract mise a jour (seuls tw/pt/ru declarent live) #2 Playlists natives - Twitch: NON FAISABLE — probe avec token app valide: GET/POST /helix/playlists et /helix/playlists/{id}/videos -> 404 (controle /helix/users -> 400). Matrice README: Twitch/Odysee/Rumble en N/A avec preuves #3 Quick wins - Page Administration /#/admin (entree sidebar Informations + i18n nav.admin FR/EN): healthz + providers/metrics rendus (statut, yt-dlp, clés actives/ bannies, anti-ban, cache par provider, compteurs 1h, quota du jour) ; healthz sert aussi sous /proxy/api/healthz - TTL par provider: server/env-ttl.mjs (<BASE>_<P> -> <BASE> -> defaut, jamais nul), branche sur les caches details et transcripts ; suggest reste global (cle agregee multi-providers) ; tests npm run test:cache - Import/Export playlists JSON: GET /playlists/export (newtube-playlists-v1, avant /playlists/:id) + POST /playlists/import (dedoublonnage par titre), boutons [Exporter] [Importer] sur la page listes de lecture README: matrice fournisseurs (Live pt/ru OK, od N/A, playlists N/A prouves), roadmap deplace en ✅ (Live, import/export, Admin, TTL) + 🟡 mis a jour.
This commit is contained in:
@@ -261,11 +261,27 @@ export class ThemePageComponent {
|
||||
// Thème "En direct" : vrais lives uniquement.
|
||||
// - YouTube : search.list eventType=live (pas une recherche textuelle "live").
|
||||
// - Twitch : top streams Helix (la recherche de chaînes "live" est trop restrictive).
|
||||
// - PeerTube : API native `?isLive=true` (instance active).
|
||||
// - Rumble : page SSR rumble.com/browse/live (route /api/rumble/live).
|
||||
if (slug === 'live') {
|
||||
const mode = block.provider === 'youtube' ? 'youtube_eventType_live'
|
||||
: block.provider === 'twitch' ? 'twitch_top_streams'
|
||||
: block.provider === 'peertube' ? 'peertube_islive'
|
||||
: 'rumble_browse_live';
|
||||
// La porte `providerSupportsLive` n'autorise que yt/tw/pt/ru : tout
|
||||
// autre provider ne doit PAS retomber sur la source Rumble par défaut.
|
||||
if (!['youtube', 'twitch', 'peertube', 'rumble'].includes(block.provider)) {
|
||||
block.loading = false; block.error = null; block.items = [];
|
||||
this.blocks.update(a => [...a]);
|
||||
return;
|
||||
}
|
||||
const liveCall = block.provider === 'youtube'
|
||||
? this.api.searchYouTubeLivePage('', null)
|
||||
: this.api.getTwitchTopStreamsPage(null);
|
||||
const mode = block.provider === 'youtube' ? 'youtube_eventType_live' : 'twitch_top_streams';
|
||||
: block.provider === 'twitch'
|
||||
? this.api.getTwitchTopStreamsPage(null)
|
||||
: block.provider === 'peertube'
|
||||
? this.api.searchPeerTubeLivePage(null)
|
||||
: this.api.getRumbleLivePage(null);
|
||||
liveCall.subscribe({
|
||||
next: res => {
|
||||
block.items = this.enrich(res.items || [], block.provider)
|
||||
|
||||
Reference in New Issue
Block a user