Commit 76688c27 authored by Thorfin89's avatar Thorfin89

Ajout soluce info titre

parent a2964d88
...@@ -27,3 +27,9 @@ France Bleu Armorique,FR,Régionale,http://direct.francebleu.fr/live/fbarmorique ...@@ -27,3 +27,9 @@ France Bleu Armorique,FR,Régionale,http://direct.francebleu.fr/live/fbarmorique
RTL,FR,Généraliste,http://icecast.rtl.fr/rtl-1-44-128,rtl.png RTL,FR,Généraliste,http://icecast.rtl.fr/rtl-1-44-128,rtl.png
Europe 1,FR,Généraliste,http://stream.europe1.fr/europe1.mp3,europe-1.png Europe 1,FR,Généraliste,http://stream.europe1.fr/europe1.mp3,europe-1.png
Nostalgie,FR,Divers,http://scdn.nrjaudio.fm/adwz2/fr/30601/mp3_128.mp3,nostalgie.png Nostalgie,FR,Divers,http://scdn.nrjaudio.fm/adwz2/fr/30601/mp3_128.mp3,nostalgie.png
Celtic Music Radio,GB-SCT,Celtic,https://uksoutha.streaming.broadcast.radio/celtic,CelticMusicRadio.png
Smooth Scotland,GB-SCT,Celtic,https://media-ice.musicradio.com/SmoothScotlandMP3,SmoothScotland.png
Expat Radio Scotland,GB-SCT,Oldies,https://everestcast.shoutcastservices.com:1355/stream,ExpatRadioScotland.png
Linn Jazz,GB,Jazz,http://radio.linn.co.uk:8000/autodj,LinnJazz.png
Pure Radio Scotland,GB-SCT,Scotland,https://listen-pureradio.sharp-stream.com/pure_radio.mp3?Device=LivePlayer&_=532281&awparams=companionAds%3Atrue&listenerid=8196d2c78a734f244852a3f8bbbecbcb,PureRadioScotland.png
Irish Pub Radio,IR,Irish,http://solid24.streamupsolutions.com:8026/stream,IrishPubRadio.png
...@@ -100,46 +100,79 @@ Il est également possible de passer des arguments à la fonction directement en ...@@ -100,46 +100,79 @@ Il est également possible de passer des arguments à la fonction directement en
### Affichage des informations sur la radio en cours d'écoute : ### Affichage des informations sur la radio en cours d'écoute :
Source :
- https://github.com/oaubert/python-vlc/issues/72 - https://github.com/oaubert/python-vlc/issues/72
```python ```python
from time import sleep from time import sleep
from vlc import EventType, Media, MediaPlayer, MediaParseFlag, Meta from vlc import EventType, Media, MediaPlayer, MediaParseFlag, Meta
def _media_cb(event, *unused): player = MediaPlayer()
# XXX callback ... never called radio_flux = Media("http://live.leanstream.co/CJOTFM-MP3") # on définit le flux
print(event) player.set_media(radio_flux) # on charge le flux
player.play() # on lance l'écoute de la radio
p = MediaPlayer()
# cmd1 = "sout=file/ts:%s" % outfile info_flux = player.event_manager() # on récupère l'information du flux
#media = Media("http://live.leanstream.co/CJOTFM-MP3") # , cmd1)
media = Media("http://scdn.nrjaudio.fm/adwz2/fr/30601/mp3_128.mp3?origine=fluxradios") # définition des types d'infos à afficher
# media.get_mrl() infos_selected = { # Meta.Album: None,
p.set_media(media) # Meta.AlbumArtist: None,
p.play() # Meta.Artist: None,
# Meta.Title: None,
# Meta.Genre: None,
e = p.event_manager() # Meta.URL: None,
e.event_attach(EventType.MediaMetaChanged, _media_cb, media) Meta.NowPlaying: None
e.event_attach(EventType.MediaParsedChanged, _media_cb, media) }
# define the meta data to show while True: # boucle principale
meta = {Meta.Album: None,
Meta.Genre: None, # using MediaParseFlag.local is not any different
Meta.NowPlaying: None} radio_flux.parse_with_options(MediaParseFlag.network, 2) # 2 sec timeout
# analyse des infos avec saut systématique si info nulle ou inchangée
while True: # loop forever for type_d_info in infos_selected.keys(): # pour chaque type d'info
# XXX using MediaParseFlag.local is not any different info = radio_flux.get_meta(type_d_info) # on récupère l'info
media.parse_with_options(MediaParseFlag.network, 2) # 2 sec timeout
# XXX media.get_parsed_status() always returns .skipped if info != infos_selected[type_d_info]: # si l'info est différente de 'None'
for k in meta.keys(): print(info[4:len(info)-3]) # affiche de l'info 'nettoyée'
v = media.get_meta(k)
if v != meta[k]: # mémorisation de l'info
# print("{} - {}".format(k, v)) infos_selected[type_d_info] = info
print("{}".format(v)) '''
meta[k] = v on charge l'info dans la clé correspondante de
sleep(2) infos_selected[type_d_info]
l'info ne sera pas différente au prochain passage
=> la fonction print n'est plus traitée
jusqu'à ce que l'info change (changement de morceau)
'''
sleep(2) # on relance le test toutes 2 secondes
```
### Affichage du titre écouté (vesion simplifiée de la précédente)
```python
from time import sleep
from vlc import Media, MediaPlayer, Meta
player = MediaPlayer()
radio_flux = Media("http://live.leanstream.co/CJOTFM-MP3") # on définit le flux
player.set_media(radio_flux) # on charge le flux
player.play() # on lance l'écoute de la radio
info_flux = player.event_manager() # on récupère l'information du flux
memo_info = "" # pour mémoriser le titre
while True: # boucle principale
flux_info = radio_flux.get_meta(Meta.NowPlaying) # on récupère l'info sur le titre actuel
if flux_info and flux_info != memo_info: # si le titre donné et est différent de celui mémorisé
print(flux_info[3:len(flux_info) - 2]) # on 'nettoie' le titre
memo_info = flux_info # on mémorise le titre
sleep(2) # on relance le test toutes 2 secondes
``` ```
### Problème de chemin courant ### Problème de chemin courant
......
...@@ -8,7 +8,8 @@ from vlc import Instance ...@@ -8,7 +8,8 @@ from vlc import Instance
''' installer le paquet python-vlc : ''' installer le paquet python-vlc :
$ sudo pip3 install python-vlc $ sudo pip3 install python-vlc
installer aussi l'application VLC ''' installer aussi l'application VLC '''
from pupitre import Pupitre
from pupitre import Pupitre # gestion de l'interface sous Tkinter
# classes --------------------------------- # classes ---------------------------------
......
# Projet : WebRadioPi
# Fichier : pupitre.py
# Auteur : Daniel SAZERAT (thorfin89@free.fr)
import vlc
from time import sleep
from vlc import EventType, Media, MediaPlayer, MediaParseFlag, Meta
# classes ---------------------------------
class Mediainfo:
def __init__(self, flux):
self.flux = flux
print(flux)
self.play()
self.info()
sleep(50)
def play(self):
self.media_player = vlc.MediaPlayer()
radio = vlc.Media(self.flux)
self.media_player.set_media(radio)
self.media_player.play()
def info(self):
info = self.media_player.event_manager()
print(info)
radio1 = Mediainfo("http://live.leanstream.co/CJOTFM-MP3")
\ No newline at end of file
from time import sleep
from vlc import Media, MediaPlayer, Meta
player = MediaPlayer()
radio_flux = Media("http://live.leanstream.co/CJOTFM-MP3") # on définit le flux
player.set_media(radio_flux) # on charge le flux
player.play() # on lance l'écoute de la radio
info_flux = player.event_manager() # on récupère l'information du flux
memo_info = "" # pour mémoriser le titre
while True: # boucle principale
flux_info = radio_flux.get_meta(Meta.NowPlaying) # on récupère l'info sur le titre actuel
if flux_info and flux_info != memo_info: # si le titre donné et est différent de celui mémorisé
info_display = flux_info[4:len(flux_info) - 3] # on 'nettoie' le titre (caractères au début et à la fin)
if info_display[0:3] == " - ":
print("** "+info_display[3:]+" **")
else:
print(info_display)
memo_info = flux_info # on mémorise le titre
sleep(2) # on relance le test toutes 2 secondes
from time import sleep
from vlc import EventType, Media, MediaPlayer, MediaParseFlag, Meta
player = MediaPlayer()
radio_flux = Media("http://live.leanstream.co/CJOTFM-MP3") # on définit le flux
player.set_media(radio_flux) # on charge le flux
player.play() # on lance l'écoute de la radio
info_flux = player.event_manager() # on récupère l'information du flux
# définition des types d'infos à afficher
infos_selected = { # Meta.Album: None,
# Meta.AlbumArtist: None,
# Meta.Artist: None,
# Meta.Title: None,
# Meta.Genre: None,
# Meta.URL: None,
Meta.NowPlaying: None
}
while True: # boucle principale
# using MediaParseFlag.local is not any different
# radio_flux.parse_with_options(MediaParseFlag.network, 2) # 2 sec timeout
# analyse des infos avec saut systématique si info nulle ou inchangée
for type_d_info in infos_selected.keys(): # pour chaque type d'info
info = radio_flux.get_meta(type_d_info) # on récupère l'info
if info != infos_selected[type_d_info]: # si l'info est différente de 'None'
print(info[3:len(info)-2]) # affiche de l'info 'nettoyée'
# mémorisation de l'info
infos_selected[type_d_info] = info
'''
on charge l'info dans la clé correspondante de
infos_selected[type_d_info]
l'info ne sera pas différente au prochain passage
=> la fonction print n'est plus traitée
jusqu'à ce que l'info change (changement de morceau)
'''
sleep(2) # on relance le test toutes 2 secondes
...@@ -4,17 +4,16 @@ ...@@ -4,17 +4,16 @@
# import ---------------------------------- # import ----------------------------------
import tkinter as tk import tkinter as tk
from tkinter import ttk, Scale, HORIZONTAL, CENTER from tkinter import ttk, Scale, HORIZONTAL
from PIL import Image, ImageTk from PIL import Image, ImageTk
import csv import csv
mute = False # le son n'est pas coupé au démarrage mute = False # le son n'est pas coupé au démarrage
bg_color = "#2F7082" bg_color, bg_color_light = "#206080", "#2F6F8F" # couleur de fond
# Chargement du fichier CSV contenant les informations : Nom, Pays, Type, Url, Logo # Chargement du fichier CSV contenant les informations : Nom, Pays, Type, Url, Logo
with open("./data/radios.csv", 'r', encoding='utf-8-sig') as radios_file: with open("./data/radios.csv", 'r', encoding='utf-8-sig') as radios_file:
# utf-8-sig au lieu de utf-8 pour éviter l'erreur sur le nom du 1er champ "\ufeffNom" # 'utf-8-sig' au lieu de 'utf-8' pour éviter l'erreur sur le nom du 1er champ '\ufeffNom'
radios_list = csv.DictReader(radios_file) radios_list = csv.DictReader(radios_file)
radios_list = [dict(ligne) for ligne in radios_list] # transforme en liste de dictionnaires radios_list = [dict(ligne) for ligne in radios_list] # transforme en liste de dictionnaires
...@@ -108,7 +107,7 @@ class Pupitre: ...@@ -108,7 +107,7 @@ class Pupitre:
def menu_droite(self): def menu_droite(self):
# affiche du logo de la radio sélectionnée >>> placer ici l'icone de la radio en 200x200 # affiche du logo de la radio sélectionnée >>> placer ici l'icone de la radio en 200x200
self.lbl_radio_selected = ttk.Label(self.menu) self.lbl_radio_selected = ttk.Label(self.menu, background=bg_color_light)
self.lbl_radio_selected.place(width=225, height=225, x=33, y=33) self.lbl_radio_selected.place(width=225, height=225, x=33, y=33)
# potentiomètre de volume # potentiomètre de volume
...@@ -166,7 +165,7 @@ class Pupitre: ...@@ -166,7 +165,7 @@ class Pupitre:
def radio_stop(self): # arrête le flux radio et réinitialise la zone de droite def radio_stop(self): # arrête le flux radio et réinitialise la zone de droite
self.flux_stop() self.flux_stop()
self.lbl_radio_selected.config(image="") self.lbl_radio_selected.config(image="", background=bg_color_light)
self.lbl_info_radio.config(text="") self.lbl_info_radio.config(text="")
def radio_selected(self, num_radio): # active la radio choisie et affiche le log et le nom def radio_selected(self, num_radio): # active la radio choisie et affiche le log et le nom
...@@ -182,7 +181,7 @@ class Pupitre: ...@@ -182,7 +181,7 @@ class Pupitre:
img = img.resize((logo_size, logo_size), Image.ANTIALIAS) # redimensionne le logo img = img.resize((logo_size, logo_size), Image.ANTIALIAS) # redimensionne le logo
self.logo_selected = ImageTk.PhotoImage(img) self.logo_selected = ImageTk.PhotoImage(img)
self.lbl_radio_selected.config(image=self.logo_selected) # affiche le logo à droite self.lbl_radio_selected.config(image=self.logo_selected, background="white") # affiche le logo à droite
# affiche le nom de la radio sélectionnée # affiche le nom de la radio sélectionnée
self.lbl_info_radio.config(text=radios_list[num_radio]['Nom'], self.lbl_info_radio.config(text=radios_list[num_radio]['Nom'],
......
32 38
\ No newline at end of file \ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment