feat(channel): page details chaine multi-providers avec onglets et infinite scroll
CI / build-and-test (push) Successful in 13m34s

- Strategy Pattern front: ChannelProviderInterface + 6 providers (yt/dm/tw/pt/od/ru) + factory (ids longs/courts)
- ChannelContentService: cache par onglet/tri/recherche (TTL 5min), pagination nextPage
- ChannelPage: header (banniere/avatar/subs/description ...plus), tabs dynamiques par capabilities, grilles videos/shorts 9:16/playlists/live, recherche debounced, tri recent/populaire, infinite scroll IntersectionObserver, skeletons/empty/error
- Backend: GET /api/channels/:provider/:id/content (videos/shorts/playlists/live) natif par provider
This commit is contained in:
2026-09-25 10:15:12 -04:00
parent fe35340948
commit 97e5de74f5
147 changed files with 7954 additions and 77497 deletions
+4
View File
@@ -15,5 +15,9 @@ TWITCH_CLIENT_SECRET=votre_client_secret_twitch_ici
# Configuration du cache (en millisecondes)
YT_CACHE_TTL_MS=3600000 # 1 heure par défaut
# Téléchargements : providers autorisés (liste CSV) + concurrence max par user
DOWNLOAD_PROVIDERS=youtube,dailymotion,twitch,peertube,odysee,rumble
DOWNLOAD_MAX_CONCURRENT=2
# Configuration du menu (optionnel)
# BASE_MENU_CONFIG_ASSETS=assets/configuration.yml
+39
View File
@@ -0,0 +1,39 @@
# Installation locale — build de l'image depuis le repo, pas de registre.
# Usage: docker compose -f docker-compose/docker-compose.local.yml up -d --build
# Variables d'env lues dans docker-compose/.env (même répertoire).
services:
newtube:
build:
context: ..
dockerfile: docker/Dockerfile.origi
image: newtube-angular:latest
container_name: newtube
ports:
# Hôte 4200 -> conteneur 4000 (4000 reste libre pour le serveur de dev local)
- "${HOST_PORT:-4200}:4000"
environment:
- PORT=${PORT:-4000}
- NODE_ENV=${NODE_ENV:-production}
- JWT_SECRET=${JWT_SECRET:-dev-secret-change-me}
- ACCESS_TTL_MIN=${ACCESS_TTL_MIN:-15}
- REFRESH_TTL_DAYS=${REFRESH_TTL_DAYS:-2}
- REMEMBER_TTL_DAYS=${REMEMBER_TTL_DAYS:-30}
- YT_CACHE_TTL_MS=${YT_CACHE_TTL_MS:-1800000}
- GEMINI_API_KEY=${GEMINI_API_KEY}
- YOUTUBE_API_KEY=${YOUTUBE_API_KEY}
- YOUTUBE_API_KEYS=${YOUTUBE_API_KEYS}
- VIMEO_ACCESS_TOKEN=${VIMEO_ACCESS_TOKEN}
- TWITCH_CLIENT_ID=${TWITCH_CLIENT_ID}
- TWITCH_CLIENT_SECRET=${TWITCH_CLIENT_SECRET}
- DOWNLOAD_PROVIDERS=${DOWNLOAD_PROVIDERS:-youtube,dailymotion,twitch,peertube,odysee,rumble}
- DOWNLOAD_MAX_CONCURRENT=${DOWNLOAD_MAX_CONCURRENT:-2}
- TZ=${TZ:-America/Montreal}
volumes:
# SQLite : volume nommé (locking FS bind monté Windows peu fiable)
- newtube-db:/app/db
# Téléchargements : bind sur le repo, accessibles depuis Windows
- ../tmp/downloads:/app/tmp/downloads
restart: unless-stopped
volumes:
newtube-db:
+2
View File
@@ -19,6 +19,8 @@ services:
- VIMEO_ACCESS_TOKEN=${VIMEO_ACCESS_TOKEN}
- TWITCH_CLIENT_ID=${TWITCH_CLIENT_ID}
- TWITCH_CLIENT_SECRET=${TWITCH_CLIENT_SECRET}
- DOWNLOAD_PROVIDERS=${DOWNLOAD_PROVIDERS:-youtube,dailymotion,twitch,peertube,odysee,rumble}
- DOWNLOAD_MAX_CONCURRENT=${DOWNLOAD_MAX_CONCURRENT:-2}
- TZ=${TZ}
volumes:
- ${DIR_NEWTUBE}/assets:/app/assets
+2 -2
View File
@@ -2,8 +2,8 @@
HOSTNAME=$(hostname)
GEMINI_API_KEY="AIzaSyALfJiYQb6QYUXyUM2AKd7sV1nWV0JALJw"
YOUTUBE_API_KEY="AIzaSyBbeV0sUA7hyNRZsloYPG88yqnSAjefBMo"
YOUTUBE_API_KEYS='["AIzaSyBXL5y8bRMO5WJwIhPK-fhrEPu2aROuKag", "AIzaSyC1rV2Er1n1FHZQoGgQhOxFc3nSlQWhgks", "AIzaSyCumEzXNPJuQjpPpxhP2PYdExqRBDVJqRY"]'
YOUTUBE_API_KEY="AIzaSyBXL5y8bRMO5WJwIhPK-fhrEPu2aROuKag"
YOUTUBE_API_KEYS='["AIzaSyBXL5y8bRMO5WJwIhPK-fhrEPu2aROuKag", "AIzaSyC1rV2Er1n1FHZQoGgQhOxFc3nSlQWhgks", "AIzaSyBZxgB2s1kp9qZhfGRrp69Mdf_9krwppVI"]'
VIMEO_ACCESS_TOKEN="40e09bf643b2ecddf68ed0f5d1574c72"
TWITCH_CLIENT_ID="ikxrqgjivwn4rurhjy2mcfkcq62y3m"
TWITCH_CLIENT_SECRET="kezgpj5vqrk96tu2x3ghmhwipg980p"