#!/usr/bin/env python # -*- coding: utf-8 -*- #Chaines de television et flux associes chaines = {"France 2":"201", "France 3 national":"202", "France 5":"203", "Euronews":"205", "Arte":"204", "Direct 8":"372", "W9":"373", "NT1":"374", "NRJ 12 5.1":"381", "NRJ 12 Stéréo":"382", "La Chaîne Parlementaire":"226", "France 4":"376", "BFM TV":"418", "i>TELE":"417", "Europe 2 TV":"416", "Gulli":"419", "RTL9":"210", "AB 1":"211", "TV5":"206", "France ô":"238", "Game One":"220", "MTV France":"219", "ZIK":"218", "L'Equipe TV":"209", "AB Moteurs":"222", "Motors TV":"216", "Bloomberg TV":"207", "CNBC":"208", "Sky News International":"355", "KTO":"223", "TFJ":"224", "Beur TV":"225", "Demain !":"227", "Fashion TV":"221", "Teleplaisance.org":"320", "Liberty TV.com":"215", "Freenews TV":"428", "Best of Shopping":"358", "M6 Boutique":"359", "Astro Center TV":"415", "TLM":"267", "TLT":"281", "TV7 Bordeaux":"268", "TV8 Mont-Blanc":"319", "TéléGrenoble":"423", "Telif":"360", "La Locale":"363", "Normandie TV":"383", "Télénantes/Nantes 7":"389", "La Chaîne Marseille":"414", "T.TV":"385", "God TV":"386", "Arte Allemand":"270", "DW-TV":"312", "ETB Sat":"371", "Real Madrid TV":"387", "RTPi":"388", "Rai Uno":"309", "Rai Due":"314", "Rai Tre":"315", "TV Polonia":"278", "Bulgaria TV":"321", "TV Romania":"318", "RTR Planeta":"317", "Adjara TV":"316", "2M Maroc":"272", "RTM Maroc":"273", "Canal Algérie":"274", "TV7 Tunisia":"277", "TRT INT":"369", "Kanal 7 INT":"370", "Samanyolu TV":"391", "Armenia TV":"380", "Al Masriya":"275", "Al jazeera":"276", "Al Jazeera Children":"412", "Phoenix Chinese News and Entertainment":"266", "CCTV 4":"271", "France 3 national":"258", "France 3 Alsace":"280", "France 3 Alpes":"283", "France 3 Aquitaine":"284", "France 3 Auvergne":"285", "France 3 Bourgogne":"279", "France 3 Bretagne":"286", "France 3 Centre":"287", "France 3 Champagne-Ardenne":"288", "France 3 Côte-d'Azur":"290", "France 3 Franche-Comté":"291", "France 3 Languedoc-Roussillon":"292", "France 3 Lorraine":"294", "France 3 Midi Pyrénées":"295", "France 3 Nord Pas-de-Calais":"296", "France 3 Haute-Normandie":"297", "France 3 Basse-Normandie":"298", "France 3 Paris Ile-de-France":"257", "France 3 Pays de Loire":"299", "France 3 Picardie":"300", "France 3 Poitou-Charentes":"301", "France 3 Provence-Alpes":"302", "France 3 Rhône-Alpes":"303", "Mire FREEBOX":"308"} #Partie fixe de l'adresse du flux flux = "rtsp://mafreebox.freebox.fr/freeboxtv/" from qt import * import sys import commands #Interface class Interface(QDialog): def __init__(self,parent = None,name = None,modal = 0,fl = 0): QDialog.__init__(self,parent,name,modal,fl) if not name : self.setName("Interface") InterfaceLayout = QGridLayout(self,1,1,11,6,"InterfaceLayout") self.buttonGroup1 = QButtonGroup(self,"buttonGroup1") self.buttonGroup1.setColumnLayout(0,Qt.Vertical) self.buttonGroup1.layout().setSpacing(6) self.buttonGroup1.layout().setMargin(11) buttonGroup1Layout = QGridLayout(self.buttonGroup1.layout()) buttonGroup1Layout.setAlignment(Qt.AlignTop) self.chaine = QComboBox(0,self.buttonGroup1,"chaine") buttonGroup1Layout.addWidget(self.chaine,0,0) InterfaceLayout.addWidget(self.buttonGroup1,1,0) self.buttonGroup3 = QButtonGroup(self,"buttonGroup3") self.buttonGroup3.setColumnLayout(0,Qt.Vertical) self.buttonGroup3.layout().setSpacing(6) self.buttonGroup3.layout().setMargin(11) buttonGroup3Layout = QGridLayout(self.buttonGroup3.layout()) buttonGroup3Layout.setAlignment(Qt.AlignTop) self.fichierSortie = QLineEdit("/home/machin/emission.avi", self.buttonGroup3, "fichierSortie") buttonGroup3Layout.addWidget(self.fichierSortie,0,0) InterfaceLayout.addWidget(self.buttonGroup3,0,0) self.buttonGroup2 = QButtonGroup(self,"buttonGroup2") self.buttonGroup2.setColumnLayout(0,Qt.Vertical) self.buttonGroup2.layout().setSpacing(6) self.buttonGroup2.layout().setMargin(11) buttonGroup2Layout = QGridLayout(self.buttonGroup2.layout()) buttonGroup2Layout.setAlignment(Qt.AlignTop) layout4 = QVBoxLayout(None,0,6,"layout4") self.textLabel1 = QLabel(self.buttonGroup2,"textLabel1") layout4.addWidget(self.textLabel1) self.dateDebut = QDateTimeEdit(QDateTime.currentDateTime(), self.buttonGroup2, "dateDebut") layout4.addWidget(self.dateDebut) buttonGroup2Layout.addLayout(layout4,0,0) layout5 = QVBoxLayout(None,0,6,"layout5") self.textLabel2 = QLabel(self.buttonGroup2,"textLabel2") layout5.addWidget(self.textLabel2) self.dateFin = QDateTimeEdit(QDateTime.currentDateTime(), self.buttonGroup2, "dateFin") layout5.addWidget(self.dateFin) buttonGroup2Layout.addLayout(layout5,0,1) InterfaceLayout.addWidget(self.buttonGroup2,2,0) layout6 = QHBoxLayout(None,0,6,"layout6") spacer1 = QSpacerItem(170,21,QSizePolicy.Expanding,QSizePolicy.Minimum) layout6.addItem(spacer1) self.valider = QPushButton(self,"valider") layout6.addWidget(self.valider) self.quitter = QPushButton(self,"quitter") layout6.addWidget(self.quitter) InterfaceLayout.addLayout(layout6,3,0) self.languageChange() self.resize(QSize(374,293).expandedTo(self.minimumSizeHint())) self.clearWState(Qt.WState_Polished) def languageChange(self): self.setCaption(self.__tr("Enregistrement")) self.buttonGroup1.setTitle(self.__trUtf8("\x43\x68\x61\xc3\xae\x6e\x65")) self.chaine.clear() for chaineName in chaines : self.chaine.insertItem(self.__tr(chaineName)) self.buttonGroup3.setTitle(self.__tr("Fichier")) self.buttonGroup2.setTitle(self.__tr("Heures")) self.textLabel1.setText(self.__trUtf8("\x44\xc3\xa9\x62\x75\x74")) self.textLabel2.setText(self.__tr("Fin")) self.valider.setText(self.__tr("Valider")) self.quitter.setText(self.__tr("Quitter")) def __tr(self,s,c = None): return qApp.translate("Interface",s,c) def __trUtf8(self,s,c = None): return qApp.translate("Interface",s,c,QApplication.UnicodeUTF8) def quitter() : form.close() sys.exit() def valider() : message = "L'enregistrement de \"" + str(form.chaine.currentText()) + "\" commencera le \n" + str(form.dateDebut.dateTime().toString("ddd d MMMM yyyy hh:mm")) + "\net finira le \n" + str(form.dateFin.dateTime().toString("ddd d MMMM yyyy hh:mm")) + "\n" confirmation = QMessageBox.question(form, "Enregistrement", message, QMessageBox.Ok, QMessageBox.Cancel) if confirmation == QMessageBox.Ok : #Programmation de l'enregistrement avec mencoder sortie = str(form.fichierSortie.text()) atjob = "echo \"mencoder "+ flux + chaines[str(form.chaine.currentText())] + " -oac copy -ovc copy -vf pp=md -of mpeg -o " + sortie + "\" | at " + str(form.dateDebut.dateTime().toString("hhmm MMMM d")) atjobkill = "echo \"killall mencoder\" | at " + str(form.dateFin.dateTime().toString("hhmm MMMM d")) commands.getoutput(atjob) commands.getoutput(atjobkill) form.close() sys.exit() else : form.close() sys.exit() app = QApplication(sys.argv) form = Interface() form.show() form.connect(form.quitter, SIGNAL("clicked()"), quitter) form.connect(form.valider, SIGNAL("clicked()"), valider) app.exec_loop()