Python (PyQt) et télévision...

smog

Membre actif
17 Août 2005
717
93
50
Bonjour à tous,

Je travaille sur un projet pour aider une personne handicapée.
Sa maladie a entraîné une tétraplégie ; elle peut bouger sa tête latéralement, ce qui permet d'utiliser un pointeur laser sur ses branches de lunettes, pour éclairer des capteurs (LDR) qui commandent une interface graphique en python (PyQt6).
Cette interface commande des éléments de domotique (interrupteurs, lampes, téléphone, etc.) et permet de lancer la TV.
J'en suis encore en phases de tests et d'optimisation.

Mais je me suis demandé si, plutôt que d'utiliser une TV externe, on ne pourrait pas intégrer le flux TNT à l'intérieur d'une fenêtre de PyQt.
Je n'ai encore rien trouvé de probant "sur le papier" (surtout des API vers des fournisseurs de contenu, chaînes en ligne donc).
Je ne sais même pas si ça a un sens, vu que tout est sur Raspberry Pi (3 mais je peux passer au 4 voire au 5) et que lorsque j'ai testé une fois AMZ Video, c'était pas terrible (performances très moyennes).
Mais au cas où, auriez-vous une piste pour ce genre de problématique ?
Idéalement, le flux TV, donc, à l'intérieur de ma fenêtre PyQt. Qu'il vienne d'une clé TNT ou par tout autre moyen, peu importe.

Merci à vous !
 
Salut,
Ça me parait difficile d'obtenir les flux provenant des fournisseurs de contenu, un autre moyen pourrait être les playlists m3u8, Free par exemple le propose pour toutes les chaines TNT.

Un exemple en PyQt5 avec Vlc et une url m3u8:

Python:
import sys
import platform
from PyQt5 import QtWidgets, QtGui, QtCore
import vlc

url = "http://livetv.ktv.zone/3/play.m3u8" # TF1

class Player(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Media Player")
        self.instance = vlc.Instance("--verbose=-1")
        self.instance.log_unset()
        self.media = None
        self.mediaplayer = self.instance.media_player_new()
        self.create_ui()
        self.is_paused = False

    def create_ui(self):
       
        self.widget = QtWidgets.QWidget(self)
        self.setCentralWidget(self.widget)
        self.videoframe = QtWidgets.QFrame()
        self.palette = self.videoframe.palette()
        self.palette.setColor(QtGui.QPalette.Window, QtGui.QColor(0, 0, 0))
        self.videoframe.setPalette(self.palette)
        self.videoframe.setAutoFillBackground(True)
        self.hbuttonbox = QtWidgets.QHBoxLayout()
        self.playbutton = QtWidgets.QPushButton("Play")
        self.hbuttonbox.addWidget(self.playbutton)
        self.playbutton.clicked.connect(self.play_pause)
        self.stopbutton = QtWidgets.QPushButton("Stop")
        self.hbuttonbox.addWidget(self.stopbutton)
        self.stopbutton.clicked.connect(self.stop)
        self.hbuttonbox.addStretch(1)
        self.volumeslider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
        self.volumeslider.setMaximum(100)
        self.volumeslider.setValue(self.mediaplayer.audio_get_volume())
        self.volumeslider.setToolTip("Volume")
        self.hbuttonbox.addWidget(self.volumeslider)
        self.volumeslider.valueChanged.connect(self.set_volume)
        self.vboxlayout = QtWidgets.QVBoxLayout()
        self.vboxlayout.addWidget(self.videoframe)
        self.vboxlayout.addLayout(self.hbuttonbox)
        self.widget.setLayout(self.vboxlayout)

    def play_pause(self):
       
        if self.mediaplayer.is_playing():
            self.mediaplayer.pause()
            self.playbutton.setText("Play")
            self.is_paused = True
        else:
            if self.mediaplayer.play() == -1:
                self.read_url()
                return
           
            self.mediaplayer.play()
            self.playbutton.setText("Pause")
            self.is_paused = False

    def stop(self):
        self.mediaplayer.stop()
        self.playbutton.setText("Play")

    def read_url(self):
       
        self.media = self.instance.media_new(url)
        self.media.get_mrl()
        self.mediaplayer.set_media(self.media)
        self.setWindowTitle(self.media.get_meta(0))
       
        if platform.system() == "Linux":
            self.mediaplayer.set_xwindow(int(self.videoframe.winId()))
        elif platform.system() == "Windows":
            self.mediaplayer.set_hwnd(int(self.videoframe.winId()))
        elif platform.system() == "Darwin":
            self.mediaplayer.set_nsobject(int(self.videoframe.winId()))

        self.play_pause()

    def set_volume(self, volume):
        self.mediaplayer.audio_set_volume(volume)


if __name__ == "__main__":    
   
    app = QtWidgets.QApplication(sys.argv)
    player = Player()
    player.show()
    player.resize(640, 380)
    sys.exit(app.exec_())
 
Mille mercis Garkam.
Je n'ai pas Free mais je vais voir si je peux adapter, sinon je testerai auprès d'un abonné Free.
Je reviens après test !
Encore un immense merci pour ton aide.
 
De rien, si ça peut aider.
J'ai précisé free, car la playlist est fiable, mais tu peux très bien utiliser l'url qui est dans le script ci-dessus.
Si tu incrémentes la valeur numérique contenue dans l'url, tu devrais avoir toutes les chaines de la TNT.

Python:
url = "http://livetv.ktv.zone/3/play.m3u8" # TF1
url = "http://livetv.ktv.zone/4/play.m3u8" # France 2
url = "http://livetv.ktv.zone/5/play.m3u8" # France 3
# etc...
 
  • J’aime
Réactions: smog