Ce document décrit le fonctionnement du système de programmation et d’enregistrement des chroniques radio pour les utilisateurs.
Le système permet aux utilisateurs de programmer l’enregistrement de leurs chroniques favorites. Chaque chronique est définie par un nom, une heure de début et une heure de fin (en secondes depuis le début du programme). Le système utilise Quartz Scheduler pour planifier des jobs d’enregistrement qui, à leur tour, utilisent FFmpeg pour enregistrer le flux audio et le segmenter en fichiers M3U8.
Chronicle.java:
nomDeChronique, startTime (en secondes) et endTime (en secondes).ChroniclesManagerService.java:
Map<String, List<Chronicle>> où la clé est le userID et la valeur est la liste des chroniques associées à cet utilisateur.addChronicle(String userID, Chronicle chronicle): Ajoute une chronique à la liste d’un utilisateur spécifié.getChronicles(String userID): Récupère toutes les chroniques pour un utilisateur donné.RecordingScheduler.java:
start(String userID, Integer hour, Integer minute, Integer duration, String chronicleName, String folderName): Planifie un RadioRecordingJob unique à une heure et minute spécifiques, avec une durée, un nom de chronique et un nom de dossier optionnels.scheduleChronicles(String userID, List<Chronicle> chronicles): La méthode clé qui prend une liste de chroniques pour un utilisateur et les planifie séquentiellement. Elle calcule l’heure de début absolue de chaque chronique en ajoutant son startTime à l’heure de référence 07:00, puis appelle start pour chaque chronique.RadioRecordingJob.java:
org.quartz.Job qui est exécuté par le RecordingScheduler.userID, chronicleName, hour, minute, duration, folderName) du JobDataMap de Quartz.media/userID_[userID]/[folderName] ou media/userID_[userID]/schedule_[timestamp]_[nomDeChronique] si folderName n’est pas fourni.STREAM_URL) et le convertir en segments HLS (MP4) et une playlist M3U8.chronicleName fourni (ex: nomDeChronique.m3u8, nomDeChronique_init.mp4, nomDeChronique_segment_000.m4s).RLACService.java:
RecordingScheduler et ChroniclesManagerService.scheduleAllUserChronicles(String userID): Récupère toutes les chroniques pour l’utilisateur via ChroniclesManagerService et les passe à RecordingScheduler.scheduleChronicles.RLACServerAPI.java:
RecordingScheduler, ChroniclesManagerService et RLACService.POST /api/addChronicle: Permet d’ajouter une chronique spécifique à un utilisateur.
userId, nomDeChroniques, chroniqueRealTimecode (startTime).POST /api/scheduleAllUserChronicles: Déclenche la programmation de toutes les chroniques associées à un userId.
userId. Le système utilise 07:00 comme heure de référence.POST /api/addChronicle. Ces chroniques sont stockées dans ChroniclesManagerService.POST /api/scheduleAllUserChronicles avec son userId.RLACService récupère la liste des chroniques pour cet userId depuis ChroniclesManagerService.RLACService passe cette liste à RecordingScheduler.scheduleChronicles.RecordingScheduler itère sur chaque chronique :
startTime (offset en secondes) à l’heure de référence 07:00.endTime - startTime).session_YYYYMMDD_HHmmss) pour regrouper tous les enregistrements de cette session de planification.JobDetail de type RadioRecordingJob est créé et configuré avec les données de la chronique (userID, nomDeChronique, heure, minute, durée, nom du dossier de session). Un CronTrigger est créé pour déclencher le job à l’heure calculée.RadioRecordingJob: À l’heure prévue, RadioRecordingJob.execute() est appelé :
media/userID_[userID]/[sessionFolderName].chronicleName extrait du JobDataMap, assurant que playlist.m3u8 et les fichiers .mp4/.m4s portent le nom de la chronique.media/userID_[userID]/[sessionFolderName].curl -X POST "http://localhost:8000/api/addChronicle?userId=testUser&nomDeChroniques=MonEmissionTest&chroniqueRealTimecode=0&endTime=600"
curl -X POST "http://localhost:8000/api/addChronicle?userId=testUser&nomDeChroniques=MaSecondeChronique&chroniqueRealTimecode=600&endTime=1200"
(Note: endTime n’est pas utilisé dans addChronicle pour l’instant, mais il est dans l’objet Chronicle.)
testUser:
curl -X POST "http://localhost:8000/api/scheduleAllUserChronicles?userId=testUser"
Ceci planifiera les enregistrements en respectant l’ordre et les durées définies dans les chroniques de l’utilisateur testUser, en commençant à 7h00. Chaque enregistrement sera nommé d’après la chronique correspondante.
gradle run
Attention, si on veut utiliser le workflow avec Python, il faut lancer le serveur Java avant le serveur Python.