def initialiserDonnees(self): '''methode qui charge l'ihm des donnees ne doit pas etre bloquant pour ne pass empecher l'affichage de l'ihm donc on intercepte les exceptions''' self.miseAJourEtat('etatDebut') '''scan du repertoire video''' self.bm.scanDisk() '''methode asynchrone qui remplit les widgets de donnees ''' self.initialiserVideosBibliIHM() try: '''recherche et charge la playlist du jour à cette heure''' plJour = self.pm.rechercherPLprocheDate(datetime.datetime.now()) self.chargerPL(plJour) libelleMessage = Util.configValue('messages', 'PLRechercheOK') messagebox.showwarning( "Succes:", libelleMessage ) except CineException: libelleMessage = Util.configValue('messages', 'PLRechercheKO') messagebox.showwarning( "Attention", libelleMessage ) #on regarde si un scandisk est en cours d'executio #met a jour status application si scandisk asynchrone est termine self.checkStatusChargementBibliotheque()
def playPL(self, playlistIHM, pbarIHM, timerIHM): ''' methode qui joue toutes les v1ideos de la playlist p1: widget playlist des videos p2 : widget pbar p4 : widget timer 20 sec ''' if playlistIHM.size() == 0: raise CineException('VidePLKO') dureeAttente = Util.configValue('commun', 'dureeAttenteLecturePL') timerIHM.reinitialiser(duree=dureeAttente) timerIHM.afficherChrono(True) #attente bloquante wdw = tk.Toplevel() #recherche des parametres externalises paramVLC = Util.configValue('ECRAN2', 'paramVLC') geometry= Util.configValue('ECRAN2', 'geometry') self.vlcPlayer = PlayerVLC2.Player(wdw, \ title='playlist beaulieu' , fullscreen=True, geometry=geometry, paramVLC=paramVLC ) #on force le volume a 100 self.vlcPlayer.volume_var.set(100) self.vlcPlayer.volume_sel(None) #envoie message init volume #on desactive le bouton play self.bibliIHM.getId('btnPlay').config(state=tk.DISABLED) self.__itererPlayPL(playlistIHM, pbarIHM, timerIHM, -1, self.vlcPlayer)
def enregistrerPL(self, bibliIHM): ''' methode qui controle et enregistre une playlist sur disque calcule l'oeuvre rattachee à la BA sur le site internet p1, dico des widgets ''' #test si PL existeDeja if self.pm.existeFichierPL(bibliIHM.getId('dateDiffu').get()): if not messagebox.askyesno(Util.configValue('messages', 'PLDejaPresenteTitre'), Util.configValue('messages', 'PLDejaPresenteMsg')): return #PL nouvelle ou confirmation ecrasement nomPL = self.pm.enregistrerPL(bibliIHM.getId('dateDiffu').get(), \ bibliIHM.getId('entryVideoPL').get(),bibliIHM.getId('listPlL5C3').get(0, tk.END)) self._majStatusPL('enregPlOK', nomPL) #rechercher une video de la BA si la zone est renseignee oeuvre = None if bibliIHM.getId('entryVideoPL').get(): baPL = self.bm.rechercherVideo(bibliIHM.getId('entryVideoPL').get()) #la video est forcement de type BA if not baPL.oeuvreCinema: #rechercher les infos sur le site web du cinema oeuvre = self.__calculerOeuvreFilmWeb() baPL.setOeuvreCinema(oeuvre) else: #oeuvre a deja ete calculee precedement et est stockee dans fichier #evite de rafaire du parsing oeuvre = baPL.oeuvreCinema self._majAfficheOeuvreCinema(oeuvre) else: '''on peut rechercher affiche uniquement avec date et heure pl''' oeuvre = self.__calculerOeuvreFilmWeb()
def __init__(self): ''' Constructor ''' #calcul des criteres self.critere_roi = int(Util.configValue('criteres', 'roi')) self.critere_tips = int(Util.configValue('criteres', 'tips')) self.critere_ic = int(Util.configValue('criteres', 'ic')) self.lancerFirefox = False #permet de activer/desactiver appel au navigateur self.__load()
def __init__(self): super().__init__() self.root=tk.Tk() self.root.title(Util.configValue('commun', 'titre')) tk.Grid.columnconfigure(self.root,5,weight=1) tk.Grid.rowconfigure(self.root,2,weight=1) self.root.geometry(Util.configValue('commun', 'geometry')) self.root.configure(bg="#FEFEE2") #enreg StringVar self.tm = TipsManager() self.dicoWidget = {}
def attenteCb(self): entry=self.bibliIHM.getId('entryAdminDureeAttente') entry.delete(0, tk.END) #efface ancienne valeur if self.bibliIHM.getId('varCheckAttente').get()==1: minDelaiAttente = Util.configValue('commun', 'dureeAttenteLecturePLMin') #on ecrit la valeur dans le champ input entry.insert(0, minDelaiAttente) else: maxDelaiAttente = Util.configValue('commun', 'dureeAttenteLecturePLMax') #on ecrit la valeur dans le champ input entry.insert(0, maxDelaiAttente) self.miseAJourTimerBA(self.bibliIHM.getId('tbaL7C4'), entry)
def __init__(self): super().__init__() self.root = tk.Tk() self.root.title(Util.configValue('commun', 'titre')) self.evtProxy = EvtIHM() self.photosIHM = {} #garder une reference sur les photos tk.Grid.columnconfigure(self.root, 5, weight=1) tk.Grid.rowconfigure(self.root, 10, weight=1) self.root.geometry(Util.configValue('commun', 'geometry')) self.root.configure(bg="#FEFEE2") #enreg StringVar self.dicoWidget = {} #dictionnaire de tous les objets graphiques
def supprimerFichier(self, tk): ''' methode qui demande confirmation de la suppression d'une video puis si ok effectue la suppression sur disque et dans la bibliotheque de(s) video(s) selectionnee(s) ''' if not messagebox.askyesno(Util.configValue('messages', 'BibliSuppVideoTitre'), Util.configValue('messages', 'BibliSuppVideoMsg')): return videosIHM =self._getCurrentVideoBibli(oneSelectionOnly=False) for selVideoIHM in videosIHM: selVideoObj = self.bm.rechercherVideo(selVideoIHM) self.bm.supprimerVideo(selVideoObj) #reactualiser la vue self.initialiserVideosBibliIHM()
def afficher(self): wdw = Tkinter.Toplevel() wdw.geometry(Util.configValue('dimensions', 'geometryCalender')) wdw.title(Util.configValue('commun', 'titreCal')) # wdw.geometry("{}x{}+{}+{}".format(300, 390, 400, 300)) #wdw.geometry('+400+300') self.frame = wdw self.__dessiner() self.associerEvts() #rendre la fenetre modale # wdw.transient(self.tk) wdw.grab_set() # self.tk.wait_window(wdw) #wdw.pack(expand=True, fill="both") self.calendar_frame.pack(anchor="w")
def __itererPlayPL(self, playlistIHM, pbarIHM, timerIHM, rangPLAjouer, vlcPlayer): ''' methode qui joue toutes les videos de la playlist p1: widget playlist des videos p2 : widget pbar p3: timer widget p4 : rangPL (index) p5: vlcPlayer ''' # print ("rang {0}".format(rangPLAjouer)) if (rangPLAjouer >= playlistIHM.size()): #c'est fini on tue le timer self.__finLecturePL(vlcPlayer) return #plus de videos a traiter dans la PL '''la video en cours est-elle finie ?''' if ((timerIHM and not timerIHM.decompteTermine) or not vlcPlayer.isVideoFinished()): #soit le decompte de 20 sec n'est pas fini soit la video en cours n'est pas fini #on attend 300 ms et on reteste playlistIHM.after(300, lambda x=playlistIHM,y=pbarIHM,v=timerIHM,z=rangPLAjouer,w=vlcPlayer:\ self.__itererPlayPL(x, y, v, z, w)) return #ici soit on est sur premiere video a jouer soit la video vient de se finir #on prend la video suivante de la liste si il en reste dans la liste if (rangPLAjouer >= 0): playlistIHM.itemconfig(rangPLAjouer, bg ='black') #ligne grisee donc traitee rangPLAjouer+=1 # playlistIHM.selection_set(rangPLAjouer) if (rangPLAjouer < playlistIHM.size()): playlistIHM.itemconfig(rangPLAjouer, bg ='red') selVideoIHM = playlistIHM.get(rangPLAjouer) try: selVideoObj = self.bm.rechercherVideo(selVideoIHM) except CineException: selVideoObj = None if selVideoObj: #video bien trouvee #lancement de la barre de progression pbarIHM.start(selVideoObj.duree) #lecture de la video avec vlc if self.debug: print ('Lecture {0} ieme/{1} video'.format(rangPLAjouer, playlistIHM.size())) vlcPlayer.play(Util.configValue('commun', 'repertoireVideo') + selVideoObj.nomFichier) #asynchrone self.miseAJourEtat('vlcPlay', selVideoObj.getNom()) if selVideoObj.type.value == Type.PUB.value: self._majStatusPL('InfoPUB', '', duree=200, clignotant=True) else: #probleme de recherche video #Une video est presente dans la PL mais plus sur le disque #affichage d'un message et passage au suivant self._majStatusPL('NoVideoTrouve', selVideoIHM, 30) #appel recursif self.__itererPlayPL(playlistIHM, pbarIHM, None, rangPLAjouer, vlcPlayer) #None pour le timer pour ne plus faire le controle avec videoFinished else: #c'est fini on tue le timer et vlc self.__finLecturePL(vlcPlayer)
def miseAJourEtat(self, codeMessageEtat, param=''): libelleMessage = Util.configValue('messages', codeMessageEtat) try: self.bibliIHM.getId('SVetatLibelle').set("ETAT: " + libelleMessage + ' ' +param) except AttributeError: pass #peut arriver lors d'un test unitaire '''methode qui teste le status du chargement de la bibliotheque et rafraichit etat si termine'''
def playVideoWebcam(self): ''' methode qui lance un vlc player(non bloquant) sur ecran pc avec la video temps reel webcam ''' file='BA-test.flv' vlcPlayer = PlayerVLC2.Player(None, title='webcam hall cinema' , fullscreen=False ) # vlcPlayer.play(Util.configValue('commun', 'repertoireVideo') + file) #asynchrone vlcPlayer.play(Util.configValue('commun', 'urlWebcam')) #asynchrone
def initialiserDonnees(self): '''methode qui charge l'ihm des donnees ''' #toutes les minutes on lance firefox sur blogabet if self.tm.lancerFirefox: self.tm.rechercherTipsWeb() self.tm.save() duree=int(Util.configValue('commun', 'dureeSleepFirefox')) self.root.after(1000*duree, self.initialiserDonnees)
def _majStatusPL(self, codeMessageInfo, param="", duree=8, clignotant=False): 'p1 code message' 'p2 param' 'p3 duree affichage en seconde' libelleMessage = Util.configValue('messages', codeMessageInfo) + param #Affichage du message si condition statusPLWidget = self.bibliIHM.getId('statusPL') #widget LabelPlus statusPLWidget.affiche(libelleMessage, duree, clignotant)
def playVideoPC(self, tk): ''' methode qui lance un vlc player(non bloquant) sur ecran pc avec la video selectionnee p1: widget parent global tk ''' selVideoIHM =self._getCurrentVideoBibli() selVideoObj = self.bm.rechercherVideo(selVideoIHM) vlcPlayer = PlayerVLC2.Player(None, title=selVideoObj.getNom() , fullscreen=False ) vlcPlayer.play(Util.configValue('commun', 'repertoireVideo') + selVideoObj.nomFichier) #asynchrone
def save(self): ''' sauvegarde la liste des tips best dans un fichier tips.obj ''' fichierTips = Util.configValue('commun', 'fichierTips') with open(fichierTips, 'wb') as fichier: mon_pickler = pickle.Pickler(fichier) mon_pickler.dump(self.bestTips) fichier.close()
def save(self): ''' sauvegarde la biblioGenerale dans un fichier bib.obj ''' self.__purger() fichierBiblio = Util.configValue('commun', 'fichierBiblio') with open(fichierBiblio, 'wb') as fichier: mon_pickler = pickle.Pickler(fichier) mon_pickler.dump(self.biblioGenerale) fichier.close()
def existeFichierPL(self, date): '''controle la presence du fichier PL retourne true si le fichier exite deja''' (nomPL, d, h) = self.__calculerNomPL(date) if os.path.isfile( Util.configValue('commun', 'repertoirePL') + nomPL + '.obj'): return True else: return False
def validerPasswordAdmin(self, passwordSaisi): '''methode qui compare le mot de passe saisi par l'utilisateur avec le mot de passe cripte dans config.ini retourne true ou False selon la comparaison''' # On encode la saisie pour avoir un type bytes entreSaisi = passwordSaisi.encode() entreSaisi_chiffre = hashlib.sha1(entreSaisi).hexdigest() mot_de_passe_admin_chiffre = Util.configValue('commun', 'passAdminCrypte') return (entreSaisi_chiffre == mot_de_passe_admin_chiffre)
def __save(self, pl: PlayList): ''' sauvegarde d'une playlist dans un fichier sur disque (dossier resources/playlists) p1: playlist obj modele ''' fichierPL = Util.configValue('commun', 'repertoirePL') + pl.nom + '.obj' with open(fichierPL, 'wb') as fichier: mon_pickler = pickle.Pickler(fichier) mon_pickler.dump(pl) fichier.close()
def afficher(self, videoIHM, listPL): wdw = tk.Toplevel() wdw.geometry(Util.configValue('dimensions', 'geometryRefPL')) # wdw.geometry("{}x{}+{}+{}".format(300, 390, 400, 300)) #wdw.geometry('+400+300') self.frame = wdw self.__dessiner(videoIHM) self.initialiserPLReferenceesIHM(self.listboxPL, listPL) #rendre la fenetre modale wdw.transient(self.tk) wdw.grab_set() self.tk.wait_window(wdw)
def testPlPlay(self): '''ajout de 4000 videos dans la PL''' return repVideos = Util.configValue('commun', 'repertoireVideo') ficVideos = Util.listerRepertoire(repVideos, False) for number in range(1, 1001): indAleatoire = random.randint(0, len(ficVideos) - 1) self.listPl.insert(tk.END, ficVideos[indAleatoire]) #appel de la methode self.evt.playPL(self.listPl, self.pbar, self.timer) self.root.mainloop()
def _getDimension(self, codeDimensionWidget): ecranresolution = Util.configValue('dimensions', 'ecran.resolution') resolution = re.match(r"([\d]{3,4})x([\d]{3,4})", ecranresolution) resolutionXecran = int(resolution.group(1)) resolutionYecran = int(resolution.group(2)) resolutionReferenceX = 1366 resolutionReferenceY = 768 widgetX = Util.configValue('dimensions', codeDimensionWidget + '.width') #width est obligatoire widgetXCalculee = round( (int(widgetX) * resolutionXecran) / resolutionReferenceX) try: widgetY = Util.configValue('dimensions', codeDimensionWidget + '.height') #height est optionnel except configparser.NoOptionError: return widgetXCalculee widgetYCalculee = round( (int(widgetY) * resolutionYecran) / resolutionReferenceY) return (widgetXCalculee, widgetYCalculee)
def afficher(self, video:Video): wdw = tk.Toplevel() wdw.geometry(Util.configValue('dimensions', 'geometryFiche')) # wdw.geometry("{}x{}+{}+{}".format(300, 390, 400, 300)) #wdw.geometry('+400+300') self.videoObj = video self.frame = wdw self.__dessiner() #rendre la fenetre modale wdw.transient(self.tk) wdw.grab_set() self.tk.wait_window(wdw)
def rechercherPLAvecVideo(self, selVideoObj): ''' methode qui recherche les playlist qui contiennent la video en parametre retourne une liste de PL ''' retour = [] ficPL = Util.listerRepertoire( Util.configValue('commun', 'repertoirePL')) for fichier in ficPL: plCur = self.load(fichier) for video in plCur.videos: if video.getNom() == selVideoObj.getNom(): retour.append(plCur) return retour
def __purger(self): ''' supprime les videos qui n'ont plus de fichier sur disque permet de ne plus gerer en memoire les anciennes videos ''' #on clone le dictionnaire clonebibVideos = self.biblioGenerale.videos.copy() for videoFile in self.biblioGenerale.videos.values(): if not os.path.isfile( Util.configValue('commun', 'repertoireVideo') + videoFile.nomFichier): del clonebibVideos[videoFile.nomFichier] #on met le clone eventuellement modifie par le del dans l'objet self.biblioGenerale.videos = clonebibVideos
def supprimerVideo(self, video: Video): '''suppression dans la bibliotheque la video suppression sur disque dur du fichier video''' repVideos = Util.configValue('commun', 'repertoireVideo') #test si repVideos est bien un repertoire lisible if not os.path.isdir(repVideos): raise CineException('repVideoKO') return if not os.path.isfile(repVideos + video.nomFichier): raise CineException('ficVideoKO') return #suppression du fichier os.remove(repVideos + video.nomFichier) #suppression dans la bibliotheque del self.biblioGenerale.videos[video.nomFichier]
def __load(self): ''' construit la liste des tips a partir d'un fichier tips.obj''' try: fichierTips = Util.configValue('commun', 'fichierTips') with open(fichierTips, 'rb') as fichier: mon_depickler = pickle.Unpickler(fichier) self.bestTips = mon_depickler.load() fichier.close() except (IOError, FileNotFoundError) as e: print('creation du fichier') with open(fichierTips, 'w') as nouvFichier: #on cree le fichier nouvFichier.close() self.bestTips = {} #dictionnaire de tous tips conserves except EOFError: #fichier vide self.bestTips = {} #dictionnaire de tous tips conserves
def __load(self): ''' construit la biblioGenerale a partir d'un fichier bib.obj reconstruit a partir du fichier le dictionnaire des videos (ba, pub et animBeaulieu''' try: fichierBiblio = Util.configValue('commun', 'fichierBiblio') with open(fichierBiblio, 'rb') as fichier: mon_depickler = pickle.Unpickler(fichier) self.biblioGenerale = mon_depickler.load() fichier.close() except IOError: with open(fichierBiblio, 'w') as nouvFichier: #on cree le fichier nouvFichier.close() self.biblioGenerale = Biblio("Bibliotheque generale") except EOFError: #fichier vide self.biblioGenerale = Biblio("Bibliotheque generale")
def calculerStatPL(self): ''' recherche toutes les playlist sur le disque stocke dans un dictionnaire le nombre de PL par jour ''' #on stocke l'heure du fichier ficPL = Util.listerRepertoire( Util.configValue('commun', 'repertoirePL'), False) for fichier in ficPL: retour = re.match( r"PL__([\d]{4})-([\d]{2})-([\d]{2})__([\d]{2})h00.obj", fichier) if retour: jjmmaaaaFichier = retour.group(3) + '-' + retour.group( 2) + '-' + retour.group(1) #ex 09112017 self.statPL['PL' + jjmmaaaaFichier] = self.statPL.get( 'PL' + jjmmaaaaFichier, 0) + 1