Une webradio est composé de divers éléments :
- un encodeur de flux audio, par exemple liquidsoap
- un diffuseur de flux audio, par exemple icecast
- un client de lecture
Radio Tournesol s'insère dans deux de ces éléments :
- l'encodage : le programme génère, à partir d'un planning, la configuration pour liquidsoap qui changer de chaîne en fonction des horaires. De plus un scheduler surveille les publicités et demande à liquidsoap de jouer de la musique à la place de la station s'il en détecte ;
- le client de lecture : Radio Tournesol propose sa propre interface web ainsi qu'une API exposant des données.
Un planificateur (Scheduler
) s'occupe de gérer des objets chaînes Channel
qui contiennent des références vers les
stations utilisées. À intervalle de temps régulier, il appelle une méthode process()
de ces objets qui va lancer
des traitements, par exemple pour aller chercher les informations sur le programme en cours de diffusion.
Elle est composée de stations. Elle va puiser les métadonnées chez les stations enregistrées. Lors de son instanciation, on indique les stations utilisées, son nom (qui sera aussi son endpoint), ainsi que sa table d'horaires. Par exemple la chaîne Tournesol de Radio Pycolore est définie comme suit :
tournesol = Channel(
endpoint="tournesol",
handlers=(AdsHandler,),
timetable={
# (weekday1, weekday2, ...)
(0, 1, 2, 3, 4): [
# (start, end, station_name),
("00:00", "05:00", FranceCulture),
("05:00", "07:00", FranceInfo),
("07:00", "10:00", FranceInter),
("10:00", "11:00", PycolorePlaylistStation),
("11:00", "12:00", FranceCulture),
("12:00", "14:00", FranceInter),
("14:00", "18:00", FranceCulture),
("18:00", "20:00", FranceInter),
("20:00", "21:00", FranceInfo),
("21:00", "22:00", RTL2),
("22:00", "00:00", PycolorePlaylistStation),
],
(5,): [
("00:00", "06:00", FranceCulture),
("06:00", "09:00", FranceInter),
("09:00", "11:00", PycolorePlaylistStation),
("11:00", "14:00", FranceInter),
("14:00", "17:00", FranceCulture),
("17:00", "18:00", FranceInter),
("18:00", "20:00", FranceInter),
("20:00", "21:00", FranceInfo),
("21:00", "00:00", FranceCulture),
],
(6,): [
("00:00", "06:00", FranceCulture),
("06:00", "09:00", FranceInter),
("09:00", "11:00", PycolorePlaylistStation),
("11:00", "14:00", FranceInter),
("14:00", "18:00", FranceMusique),
# ("18:00", "19:00", RTL2),
("18:00", "21:00", FranceInter),
("21:00", "22:00", RTL2),
("22:00", "00:00", PycolorePlaylistStation),
]
},
)
Dans cet exemple, tournesol
fait appel à un Handler
, une classe qui altère les métadonnées une fois qu'elles ont
été récupérées par la station.
Une station représente une station diffusée sur une plage horaire. Elle doit implémenter quatre méthodes pour alimenter la radio et l'API.
get_step()
: cette méthode va chercher les informations sur le programme en cours de diffusion. Par exemple , pour une station telle que France Inter, elle va utiliser l'API de Radio France.get_next_step()
: idem, mais pour le programme suivant.get_schedule()
: renvoie une liste de programme pour une plage de temps donnée.format_stream_metadata()
: cette méthode formate des métadonnées pour les envoyer à l'encodeur qui va les inclure dans le flux audio. Elles sont lues par les lecteurs audio.
Si l'on peut écouter la radio simplement à partir du flux généré par Liquidsoap, il existe aussiun projet d'interface web pour écouter les radios et accéder aux différents programmes depuis le navigateur : Sunflower Webapp.
Vous pouvez cloner le projet pour le tester ou proposer des modifications:
$ git clone https://github.com/Arkelis/sunflower-radio
Les différents composants à installer sur sa machine pour démarrer le projet sont détaillés dans la page INSTALL.md.
Le fichier DEPLOY.md expose la démarche à suivre pour déployer Radio Pycolore sur un serveur Debian 10 Buster.
Voir les milestones.
- Mise à jour des champs en temps réel
-
Jingles horaires et de transition - Mettre une musique à la place de la pub pour RTL 2
- Rendre la page du lecteur responsive
- Thème sombre
-
Faire de la page du lecteur une PWA - Faire du projet une lib