Prepare podcast emissions using LiveFlow
Persist scheduled emissions, expose owner-only planning controls in PostIt and publish optional presentation-only announcements on Yavsc.Org. Preserve manual broadcasting and authenticated playback. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
parent
e3b4414ab1
commit
4a5a3c8844
28 changed files with 5960 additions and 29 deletions
|
|
@ -84,6 +84,46 @@ connecté (`sub`, audience `api`, scope `api` attendu par Yavsc.Api).
|
|||
Ce jeton reste côté serveur. Une adresse API manquante renvoie 503 ;
|
||||
une panne de l'API renvoie une erreur explicite, pas un catalogue vide.
|
||||
|
||||
### Emissions preparees
|
||||
|
||||
PostIt permet de preparer, modifier et supprimer une emission avant son
|
||||
demarrage : titre, date/heure locale, duree entiere positive en minutes et
|
||||
annonce publique optionnelle. Les horaires sont previsionnels : la camera,
|
||||
le demarrage et l'arret restent manuels. Les heures locales inexistantes ou
|
||||
ambigues au changement d'heure sont refusees.
|
||||
|
||||
La table existante `LiveFlow` conserve la preparation et son proprietaire ;
|
||||
`PodcastId` (GUID unique) relie cette emission au manifeste media sur disque.
|
||||
`PodcastResponse` reste un DTO, enrichi de `FlowId`, `ScheduledStartAt`,
|
||||
`PlannedDurationMinutes` et `PublicAnnouncement`. Un etat `Planned`
|
||||
precede le direct ; la date previsionnelle n'est jamais confondue avec
|
||||
`CreatedAt` du direct ni la duree previsionnelle avec les secondes enregistrees.
|
||||
Les anciens manifestes sans `LiveFlow` restent lisibles ; aucune copie ou
|
||||
migration de leurs medias n'est requise. Le demarrage immediat historique
|
||||
reste disponible sans preparation.
|
||||
|
||||
L'API propose `POST /api/v1/podcasts/planned`,
|
||||
`PUT /api/v1/podcasts/{id}/planned` et `POST /api/v1/podcasts/{id}/start`.
|
||||
La preparation n'est visible que du proprietaire, meme avec une annonce ;
|
||||
les nouvelles routes de mutation exigent le scope `api`. Le demarrage
|
||||
conserve le GUID et les tentatives concurrentes reutilisent le meme direct.
|
||||
Une emission demarree ne peut plus etre reprogrammee ou redemarree apres
|
||||
sa fin. Les medias restent geres par `ILiveProcessor`, avec ses quotas,
|
||||
expiration, reprise et preparation MP4. Une suppression conserve un
|
||||
marqueur en base pour ne pas ressusciter une emission deja supprimee.
|
||||
Le verrou de coordination suit le deploiement mono-processus du stockage
|
||||
media actuel ; un deploiement multi-instance necessiterait un stockage et
|
||||
une coordination distribues.
|
||||
|
||||
Seul `GET /api/v1/podcasts/announcements` est anonyme : titre, nom d'auteur,
|
||||
horaire UTC, duree et texte public, sans URL de flux ni metadonnees privees.
|
||||
`/Podcast/Announcements` affiche ces annonces avec encodage Razor et sans
|
||||
jeton utilisateur. Retirer le texte public avant le debut retire l'annonce.
|
||||
Les annonces restent disponibles apres le direct jusqu'a suppression du
|
||||
podcast. Les pages et toutes les routes de lecture restent authentifiees.
|
||||
Appliquer la migration `PodcastScheduling` au deploiement, apres celle des
|
||||
dons ; aucune migration de production n'est appliquee automatiquement ici.
|
||||
|
||||
### Dons PayPal aux performers
|
||||
|
||||
Les dons sont gérés par Yavsc.Org, pas par un lien de paiement externe
|
||||
|
|
|
|||
|
|
@ -82,13 +82,16 @@ dotnet test --project src/test/Yavsc.Org.Tests/Yavsc.Org.Tests.csproj \
|
|||
--filter-class '*PodcastWebTests' --filter-class '*PerformerDonationTests'
|
||||
dotnet test --project src/test/Yavsc.Api.Tests/Yavsc.Api.Tests.csproj \
|
||||
--filter-class '*LiveProcessorTests' --filter-class '*PodcastControllerTests' \
|
||||
--filter-class '*PodcastReplayTests' --filter-class '*PerformerDonationSettingsTests'
|
||||
--filter-class '*PodcastReplayTests' --filter-class '*PodcastScheduleTests' \
|
||||
--filter-class '*PerformerDonationSettingsTests'
|
||||
dotnet test --project src/PostIt/PostIt.Tests/PostIt.Tests.csproj \
|
||||
--filter-class '*PodcastTests' --filter-class '*PodcastReplayTests' \
|
||||
--filter-class '*YavscApiClientTests' --filter-class '*PodcastNativeCaptureTests' \
|
||||
--filter-class '*PerformerDonationSettingsTests'
|
||||
dotnet test --project src/PostIt/PostIt.Tests/PostIt.Tests.csproj \
|
||||
--filter-method '*Shared_page_exposes_running_capture_preview_and_clears_it_before_disposal'
|
||||
dotnet test --project src/PostIt/PostIt.Tests/PostIt.Tests.csproj \
|
||||
--filter-class '*PodcastScheduleTests'
|
||||
```
|
||||
|
||||
Les tests serveur couvrent HTTP/authentification, proprietaire, sequences,
|
||||
|
|
@ -97,6 +100,12 @@ apres interruption/redemarrage, dans des dossiers temporaires isoles.
|
|||
Les tests de configuration PayPal couvrent la lecture privee, la creation,
|
||||
la validation avant toute sauvegarde, l'effacement, la compatibilite des anciens
|
||||
clients, ainsi que le chargement, la liaison du champ et l'enregistrement PostIt.
|
||||
Les tests `PodcastScheduleTests` couvrent la preparation persistante dans
|
||||
`LiveFlow`, la confidentialite, l'annonce/unpublication, les controles
|
||||
proprietaire, la validation et le demarrage manuel idempotent.
|
||||
La preparation PostIt et les tests de capture headless ont ete verifies
|
||||
separement : leur selection groupee peut rester bloquee alors que chaque
|
||||
test cible reussit isole.
|
||||
Installer FFmpeg 5+ et ffprobe pour ces tests serveur : ils generent une
|
||||
source H.264/AAC synthetique de quatre secondes, verifient le remuxage reel
|
||||
(pistes, duree, faststart, decodage et seek a deux secondes), puis les reponses
|
||||
|
|
|
|||
Loading…
Reference in a new issue