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 miseAJourTimerBA(self, timerBA, entryNewValueDureeAttente): 'p1 timerBA' 'p2 tk entry' newDureeAttente = entryNewValueDureeAttente.get() timerBA.reinitialiser(duree=newDureeAttente) Util.setConfigValue('commun', 'dureeAttenteLecturePL', newDureeAttente) #modifie la propriete globalement timerBA.afficherChrono(False) #actualise la widget du timerBA
def supprimerVideoPL(self, playlistIHM): ''' methode qui supprime la selection courante de la playlist p1: evt touche suppr p2, playlistIHM ''' if playlistIHM.curselection(): #au moins un element dans la liste #on actualise la duree pl en soustrayant la duree de la video supprimee if playlistIHM.size() ==1: #on supprime la derniere video donc on remet a blanc self.__setChampDisabledValue('entryDureePL', '') else: index = playlistIHM.curselection()[0] # il faut calculer la nouvelle duree en soustrayant selVideoIHM = playlistIHM.get(index) try: selVideoObj = self.bm.rechercherVideo(selVideoIHM) duree = self.bibliIHM.getId('entryDureePL').get() dureeEnSecondes = int(Util.minTosec(duree)) dureeEnSecondes -= selVideoObj.duree self.__setChampDisabledValue('entryDureePL', Util.secToms(dureeEnSecondes)) except CineException: #Cas anormal ou l'objet video n'a pas ete trouve #on ne bloque pas mais on affiche juste un message print ('probleme de recherche video obj') playlistIHM.delete(playlistIHM.curselection()[0])
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 ajouterVideoPL(self, evt): ''' methode qui prend la selection video de la liste IHM et l'ajoute en fin de playlist de l'IHM ''' # get the line's text listWidget = self.bibliIHM.getId('listVideos') plIHM = self.bibliIHM.getId('listPlL5C3') duree = self.bibliIHM.getId('entryDureePL').get() #la duree de la PL est la somme des durees des videos dureeEnSecondes = int(Util.minTosec(duree)) videosIHM = self._getCurrentVideoBibli(oneSelectionOnly=False) for i,selVideoIHM in enumerate(videosIHM): selVideoObj = self.bm.rechercherVideo(selVideoIHM) #controler que la video selectionnee n'est pas une pub inactive (couleur yellow3) if self.bm.getColor(selVideoObj)=='yellow3': raise CineException('PubOutOfDate') if selVideoObj.duree ==0: raise CineException('VideoDureeZero') index = listWidget.curselection()[i] bgVideo = listWidget.itemcget(index, "bg") #permet de recopier l'attribut couleur sur la PL plIHM.insert(tk.END, selVideoIHM) plIHM.itemconfig(tk.END, bg=bgVideo) #mettre a jour la duree PL dureeEnSecondes += selVideoObj.duree self.__setChampDisabledValue('entryDureePL', Util.secToms(dureeEnSecondes))
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 displayTime(self): '''affiche temps et update progress bar''' self.value = time.time() self.strValue.set("{0} / {1} (min)".format(Util.secToms(self.value- self.debuttime),\ Util.secToms(self.duree))) self["value"] = ((self.value - self.debuttime) / self.duree) * 100 #pourcentage du temps ecoule #self.progress.update() if self.value < self.maxtime and not self.ordreStop: # read more bytes after 300 ms self.after(300, self.displayTime)
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 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 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 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 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
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 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 chargerPL(self, pnomPL=None): ''' p1 si à l'init de l'ihm pour charger la playlist du jour methode qui ouvre une boite dialogue pour selectionner fichier playlist remplit les widgets afferent à la playlist à partir de l'objet modele playlist ''' repPL=Util.configValue('commun', 'repertoirePL') if pnomPL: nomficPL=repPL+pnomPL else: #boite de dialogue selection de fichier .obj nomficPL = askopenfilename(title="Ouvrir le fichier playlist:", initialdir=repPL, \ filetypes = [("Fichiers Playlist","*.obj")]) if len(nomficPL) > 0: plAChargee = self.pm.load(nomficPL) #charger les zones de la pl (nomFilm, date, heure) = self.pm.calculerNomIHMPL(plAChargee) entryDate=self.bibliIHM.getId('dateDiffu') entryDate.delete(0, tk.END) entryDate.insert(0,date+heure) entryVideoPL = self.bibliIHM.getId('entryVideoPL') self.__setChampDisabledValue('entryVideoPL', nomFilm) playlistIHM = self.bibliIHM.getId('listPlL5C3') self.viderPL(playlistIHM) #ajouter les videos PlayList dureePL=0 for video in plAChargee.videos: playlistIHM.insert(tk.END, video.getNom()) playlistIHM.itemconfig(tk.END, bg=self.bm.getColor(video)) dureePL+=video.duree self.__setChampDisabledValue('entryDureePL', Util.secToms(dureePL)) #charger la frame affiche film oeuvre = None if entryVideoPL.get(): #si le champ est renseigne alors l'oeuvre fait obligatoirement partie du fichier serialise baPL = self.bm.rechercherVideo(entryVideoPL.get()) #la video est forcement de type BA oeuvre = baPL.oeuvreCinema #on teste au cas ou if oeuvre: self._majAfficheOeuvreCinema(oeuvre) else: '''on peut rechercher affiche uniquement avec date et heure pl''' oeuvre = self.__calculerOeuvreFilmWeb()
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 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 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 _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)