#! /usr/bin/env python # -*- coding: iso8859-15 -*- """ Configuration de base des différents transpondeurs disponibles Ce fichier contient la liste des chaines pour chaque transpondeur. Pour chaque chaine, on doit indiquer le nom de la chaine et au minimum : - Le pid audio - Le pid video - Le pid PMT, ce pid contient la liste des differents flux associes a une chaine VLC a besoin de ce PID pour lire le flux Les pids facultatifs sont les suivants : - Le PID PCR qui indique la base de temps (Program Clock Reference) et permet de mieux reconstituer les flux un peu defecteux, et sert aussi pour synchroniser les informations teletexte. Il est conseille de le mettre, et il est souvent present avec le flux video (cas de la TNT) - Les PIDs de teletexte """ #Auteur : Frédéric Pauget #Maintenance et adaptations : DUBOST Brice #Licence : GPLv2 from commands import getoutput from time import sleep import os, socket IP = socket.gethostbyaddr(socket.gethostname())[-1][0] class CarteOqp(Exception) : """ La carte est déja utilisée """ class NotRunning(Exception) : """ La carte ne diffuse rien """ class carte : """ Classe parent de toute classe de transpondeur """ # Niveux de verbosite : # 0 : ne dit rien # 1 : messages à caractères informatifs # 2 : messages de debug # 3 : ne permet pas à mumudvb de daemonizer verbose = 3 CONF_FILE = "/etc/sat/carte%i.conf" # %i : numero de la carte timeout_accord=20 #en secondes timeout_no_diff=60 #en secondes entete_conf = """### Fichier généré, NE PAS EDITER freq=%(freq)i pol=%(pol)s srate=%(srate)i card=%(card)i timeout_accord=%(timeout_accord)i timeout_no_diff=%(timeout_no_diff)i """ entete_conf_TNT = """### Fichier généré, NE PAS EDITER freq=%(freq)i qam=%(qam)s trans_mode=%(trans_mode)s bandwidth=%(bandwidth)s guardinterval=%(guardinterval)s coderate=%(coderate)s card=%(card)i timeout_accord=%(timeout_accord)i timeout_no_diff=%(timeout_no_diff)i """ chaine_template = """ip=%(ip)s port=1234 name=%(name)s pids=%(pids)s """ pid_file = "/var/run/mumudvb/mumudvb_carte%i.pid" # % num carte mumudvb = "/usr/local/bin/mumudvb " def __cmp__(a,b) : for attr in ( 'card', 'freq', 'chaines' ) : if getattr(a,attr) != getattr(b,attr) : return -2 return 0 def __init__(self,card) : """ Initalisation card est le numéro (entier) de la carte correspondante """ try : self.freq = int(str(self.__class__).split('_')[-1]) except : # On ne pourra pas faire grand chose à part killer le flux de la carte self.freq = '' pass self.card = card def gen_conf(self) : """ Génère le fichier de conf """ if not self.freq : if self.verbose > 1 : print "Instance ne permettant pas la génération de la conf" return fd = open(self.CONF_FILE % self.card,'w') # Entète du fichier try: fd.write( self.entete_conf_TNT % { 'qam' : self.qam, 'trans_mode' : self.trans_mode , 'bandwidth' : self.bandwidth, 'guardinterval' : self.guardinterval , 'coderate' : self.coderate, 'freq' : self.freq , 'card' : self.card , 'timeout_accord' : self.timeout_accord , 'timeout_no_diff' : self.timeout_no_diff } ) except: fd.write( self.entete_conf % { 'pol' : self.pol, 'srate' : self.srate , 'freq' : self.freq , 'card' : self.card , 'timeout_accord' : self.timeout_accord , 'timeout_no_diff' : self.timeout_no_diff } ) # Chaines n = 0 for pids, name in self.chaines.items() : ip = '239.%s.20%i.2%02i' % ( IP.split('.')[-1], self.card, n) n += 1 fd.write(self.chaine_template % vars()) fd.close() def get_pid(self) : """ Retourne le pid associé à la carte """ try: pid = int(open(self.pid_file % self.card).readline().strip()) if self.verbose > 1 : print 'pid : %i' % pid , return pid except : raise NotRunning def is_running(self) : """ Vérifie si le process correspondant à la carte toune """ if self.verbose > 1 : redir = '' else : redir = '>/dev/null 2>&1' try : if not os.system('ps %i %s' % (self.get_pid() , redir) ) : # Il tourne return True except NotRunning : pass return False def start(self) : """ Lance la diffusion """ if not self.freq : if self.verbose > 1 : print "Instance ne permettant pas le lancement d'un flux" return if self.verbose >0 : print "Lancement de %s sur la carte %i" % (str(self.__class__).split('.')[-1], self.card) if self.is_running() : raise CarteOqp if self.verbose >0 : print "\tGénération de la conf...", self.gen_conf() if self.verbose >0 : print "OK" cmd = '%s -c %s' % ( self.mumudvb, self.CONF_FILE % self.card ) if self.verbose > 2 : cmd += ' -d -s' if self.verbose > 1 : print "\tCommande : %s" % cmd for i in range(2*self.timeout_accord) : if not i%5 and i <= self.timeout_accord : if self.verbose > 0 and i : print "ATTENTE/ERREUR" # On fait une tentative de lancement toutes les 5s (en cas de pb de diseq) if self.verbose > 0 : print "\tTentative %i" %(i/5+1) , os.system(cmd) sleep(1) if self.is_running() : if self.verbose > 0 : print 'OK' break sleep(1) if not self.is_running() : if self.verbose > 0 : print 'ABANDON' raise NotRunning def stop(self) : """ Arrète la diffusion de la carte """ if self.verbose >0 : print "Arret diffusion carte %i..." % self.card , try : # Ca tourne au moins ? if not self.is_running() : if self.verbose >0 : print "carte déja arrétée" return os.kill(self.get_pid(),15) sleep(1) if not self.is_running() : if self.verbose >0 : print "OK" return # Crève !! if not self.is_running() : if self.verbose >0 : print "SIGKILL" return os.kill(self.get_pid(),9) # Salloperie raise CarteOqp except NotRunning : # Parfait, c'était le but pass def restart(self) : """ Redémarre le flux """ self.stop() self.start() class Hotbird_10796(carte) : pol='v' srate=27500 chaines = { '3336 3306' : 'rad fra Radio FG', '3534 1001' : 'rad fra France Inter', '3535 1002' : 'rad fra France Info' } class Hotbird_10873(carte) : pol='v' srate=27500 chaines = { '3101 3131' : 'rad fra Europe 1', '3102 3132' : 'rad fra Europe 2', '3103 3133' : 'rad fra RFM', '3105 3135' : 'rad fra RTL', '3107 3137' : 'rad fra Radio Classique', '3238 3208' : 'rad fra Alouette' } class Hotbird_10911(carte) : pol='v' srate=27500 chaines = { '3207 3237' : 'rad fra RFI', '1004 3531' : 'rad fra France Musiques', '1005 3533' : 'rad fra FIP', '1003 3536' : 'rad fra France Culture', '1008 3538' : 'rad fra Le Mouv', '5801 5831' : 'rad fra Meteo Express', '5800 5820 5830' : 'fra Meteo Express' } class Hotbird_11137(carte) : pol='h' srate=27500 chaines = { '3521 3641 717 3601' : 'fra TV5 FBS', '3522 3642 719 3602' : 'fra TV5 Europe', '3523 3643 265' : 'ita Roma uno', '3524 3644 3664 262' : 'ara ANN', '3526 3646 263' : 'ara Kurdistan TV', '3528 3648 3668 264' : 'ita Videolina', '3532 3672 259' : 'ita Euroconference' } class Hotbird_11200(carte) : pol='V' srate=27500 chaines = { '366 367 2560' : 'ita Elite shopping TV', '386 387 512' : 'x-ero All Sex', '397 398 399' : 'ita StarSat', '394 395 4864' : 'ita Play TV', '400 404 402' : 'ita People TV', '405 406 407' : 'ita Roma Sat' } class Hotbird_11240(carte) : pol='v' srate=27500 chaines = { '244 245 246' : 'fra France 24', '247 248 249' : 'eng France 24', '160 80 81 1280 132 35' : 'fra Canal_plus' } class Hotbird_11604(carte) : pol='h' srate=27500 chaines = { '500 1056 1057' : 'ita TLA', '172 173 600 8040' : 'ger Das Erste', '800 1010 1011' : 'autres DW tv arabic', '1000 1001 1002 700' : 'ger DW TV', '175 176 900 177' : 'ger RTL2 Schweiz', '1600 1080 1081' : 'x-ero hot arab tv', '2300 2310 2320' : 'x-ero top porn stars', '180 181 1100 182' : 'ger SUPER RTL Schweiz' } class Hotbird_11623(carte) : pol='v' srate=27500 chaines = { '230 250 210 297' : 'fra 123sat', '225 245 205' : 'fra Best Of Shopping', '221 241 201' : 'x-ero Videosexy TV', '231 251 32 8190' : 'x-ero SexySat 3', '227 247 287 5008' : 'rom TV Romania International' } class Hotbird_11642(carte) : pol='h' srate=27500 chaines = { '1360 1320 5003' : 'eng Bloomberg Europe', '1460 1420 5004' : 'ger Bloomberg TV Deutschland', '1560 1520 5005' : 'eng Bloomberg U.K.', '2101 2111 256 128 2121' : 'gr ERT Sat' } class Hotbird_11727(carte) : pol='v' srate=27500 chaines = { '2711 2712 257 2710' : 'fra La Locale', '2791 2792 269' : 'ita Sicilia International (SET)', '2751 2752 266' : 'ita Sardegna Uno Sat', '6507 6662' : 'rad eng BBC English (Europe)', '6510 6692' : 'rad eng BBC English News', '7302 6571' : 'rad eng BBC Feed 1', '7312 6572' : 'rad eng BBC Feed 2', '7322 6573' : 'rad eng BBC Feed 3', '7332 6574' : 'rad eng BBC Feed 4', '7342 6575' : 'rad eng BBC Feed 5', '7352 6576' : 'rad eng BBC Feed 6'} class Hotbird_11785(carte) : #Serie espagnole, a mettre a jour pol='h' srate=27500 chaines = { '3521 3522 3520 3525' : 'esp TVE International', '3569 3570 3568 3573' : 'esp Canal 24 Horas', '3553 3554 3552' : 'esp TVE Internacional Asia/Africa' } class Hotbird_12111(carte) : pol='v' srate=27500 chaines = { '240 241 1028' : 'ara Al Jazeera Documentary', '250 251 1029' : 'ara Al Jazeera Mubasher', '260 261 1030' : 'ita Ceramicanda', '270 271 1031' : 'ara Al Jazeera Satellite Channel', '310 311 1040' : 'ita Radio Radio TV'} class Hotbird_12476(carte) : pol='h' srate=27500 chaines = { '600 601 602' : 'ara 2M', '600 603' : 'ara radio 2M', '551 552 550' : 'x-ero X Stream'} class Hotbird_12558(carte) : pol='v' srate=27500 chaines = { '6660 6661 6659' : 'ita Administra.it', '6916 6917 6915 6930' : 'ita 24 Ore' } class Hotbird_12577(carte) : pol='h' srate=27500 chaines = { '1204 1304 1104' : 'fra telesud', '1206 1306 1106' : 'x-ero Full X 4 free', '1218 1313 33 34' : 'x-ero sexysat 4', '1209 1309 1109' : 'fra liberty TV', '1239 1339 1139' : 'ned liberty TV' } class Hotbird_12597(carte) : pol='v' srate=27500 chaines = { '80 81 1024' : 'rus sport planeta', '163 92 41 1027 55' : 'eng BBC World', '167 108 1031' : 'rus ORT International', '2221 2231 2232 2233 2234 2235 2236 2237 2238 1034 768' : 'fra autres Euronews', '2221 2232 1034 768' : 'eng Euronews', '161 84 1025' : 'fra KTO' } class Hotbird_12673(carte) : pol='v' srate=27500 chaines = { '308 309 306 307' : 'ara Al Maghribiyah', '35 36 33 34 38' : 'ara TVM inter l', '46 47 44 45' : 'ara Arabiaa'} class TNT_base(carte) : qam="auto" trans_mode="auto" guardinterval="auto" coderate="auto" bandwidth="8MHz" class TNT_R1_586000(TNT_base) : chaines = { '120 130 110 140' : 'fra TNT02 France 2', '210 220 230 240' : 'fra TNT03 France 3', '410 420 430 440' : 'fra TNT14 France 4', '310 320 330 340' : 'fra TNT05 France 5', '510 520 530 542' : 'fra TNT07 Arte', '510 520 531 542' : 'ger Arte', '610 620 630 640' : 'fra TNT13 LCP Public Senat' } class TNT_R2_474000(TNT_base) : chaines = { '160 80 1280 32' : 'fra TNT08 Direct 8', '161 84 1281' : 'fra TNT10 TMC', '162 88 1282' : 'fra TNT15 BFM TV', '163 92 1283' : 'fra TNT16 i tele', '164 96 1284' : 'fra TNT17 europe2 TV', '165 100 1285' : 'fra TNT18 Gulli'} class TNT_R3_522000(TNT_base) : chaines = { '160 170 120 122 1280' : 'fra TNT04 Canal'} class TNT_R4_498000(TNT_base) : chaines = { '120 130 131 110 140' : 'fra TNT06 M6', '220 230 210 240' : 'fra TNT09 W9', '320 330 310' : 'fra TNT11 NT1'} class TNT_R6_562000(TNT_base) : chaines = { '120 130 100 140 131 150' : 'fra TNT01 TF1', '220 230 231 200' : 'fra TNT12 NRJ12'} class TNT_R5_538000(TNT_base) : chaines = { '110 120 131' : 'fra TNT TEST_HD1', '210 220 231' : 'fra TNT TEST_HD2', '310 320 331' : 'fra TNT TEST_HD3'}