class PluzzDLM3U8( object ): """ Telechargement des liens m3u8 """ def __init__( self, m3u8URL, nomFichier, navigateur, stopDownloadEvent, progressFnct ): self.m3u8URL = m3u8URL self.nomFichier = nomFichier self.navigateur = navigateur self.stopDownloadEvent = stopDownloadEvent self.progressFnct = progressFnct self.historique = Historique() self.nomFichierFinal = "%s.mkv" % ( self.nomFichier[ :-3 ] ) def ouvrirNouvelleVideo( self ): """ Creer une nouvelle video """ try : # Ouverture du fichier self.fichierVideo = open( self.nomFichier, "wb" ) except : raise PluzzDLException( "Impossible d'écrire dans le répertoire %s" % ( os.getcwd() ) ) # Ajout de l'en-tête # Fait dans creerMKV def ouvrirVideoExistante( self ): """ Ouvre une video existante """ try : # Ouverture du fichier self.fichierVideo = open( self.nomFichier, "a+b" ) except : raise PluzzDLException( "Impossible d'écrire dans le répertoire %s" % ( os.getcwd() ) ) def creerMKV( self ): """ Creer un mkv a partir de la video existante (cree l'en-tete de la video) """ logger.info( "Création du fichier MKV (vidéo finale) ; veuillez attendre quelques instants" ) try: if( os.name == "nt" ): commande = "ffmpeg.exe -i %s -vcodec copy -acodec copy %s 1>NUL 2>NUL" % ( self.nomFichier, self.nomFichierFinal ) else: commande = "ffmpeg -i %s -vcodec copy -acodec copy %s 1>/dev/null 2>/dev/null" % ( self.nomFichier, self.nomFichierFinal ) if( os.system( commande ) == 0 ): os.remove( self.nomFichier ) logger.info( "Fin !" ) else: logger.warning( "Problème lors de la création du MKV avec FFmpeg ; le fichier %s est néanmoins disponible" % ( self.nomFichier ) ) except: raise PluzzDLException( "Impossible de créer la vidéo finale" ) def telecharger( self ): # Recupere le fichier master.m3u8 self.m3u8 = self.navigateur.getFichier( self.m3u8URL ) # Extrait l'URL de base pour tous les fragments self.urlBase = "/".join( self.m3u8URL.split( "/" )[ :-1 ] ) # Recupere le lien avec le plus gros bitrate try: self.listeFragmentsURL = re.findall( ".+?\.m3u8.*", self.m3u8 )[ -1 ] if "://" not in self.listeFragmentsURL: self.listeFragmentsURL = "%s/%s" % ( self.urlBase, self.listeFragmentsURL ) except: raise PluzzDLException( "Impossible de trouver le lien vers la liste des fragments" ) # Recupere la liste des fragments self.listeFragmentsPage = self.navigateur.getFichier( self.listeFragmentsURL ) # Extrait l'URL de tous les fragments self.listeFragments = re.findall( ".+?\.ts", self.listeFragmentsPage ) # # Creation de la video # self.premierFragment = 1 self.telechargementFini = False video = self.historique.getVideo( self.listeFragmentsURL ) # Si la video est dans l'historique if( video is not None ): # Si la video existe sur le disque if( os.path.exists( self.nomFichier ) or os.path.exists( self.nomFichierFinal ) ): if( video.finie ): logger.info( "La vidéo a déjà été entièrement téléchargée" ) if( not os.path.exists( self.nomFichierFinal ) ): self.creerMKV() return else: self.ouvrirVideoExistante() self.premierFragment = video.fragments logger.info( "Reprise du téléchargement de la vidéo au fragment %d" % ( video.fragments ) ) else: self.ouvrirNouvelleVideo() logger.info( u"Impossible de reprendre le téléchargement de la vidéo, le fichier %s n'existe pas" % ( self.nomFichier ) ) else: # Si la video n'est pas dans l'historique self.ouvrirNouvelleVideo() # Nombre de fragments self.nbFragMax = float( len( self.listeFragments ) ) logger.debug( "Nombre de fragments : %d" % ( self.nbFragMax ) ) # Ajout des fragments logger.info( "Début du téléchargement des fragments" ) try : i = self.premierFragment while( i <= self.nbFragMax and not self.stopDownloadEvent.isSet() ): fragURL = self.listeFragments[ i - 1 ] if "://" not in fragURL: fragURL = "%s/%s" % ( self.urlBase, fragURL ) frag = self.navigateur.getFichier( fragURL ) self.fichierVideo.write( frag ) # Affichage de la progression self.progressFnct( min( int( ( i / self.nbFragMax ) * 100 ), 100 ) ) i += 1 if( i == self.nbFragMax + 1 ): self.progressFnct( 100 ) self.telechargementFini = True logger.info( "Fin du téléchargement" ) self.creerMKV() except KeyboardInterrupt: logger.info( "Interruption clavier" ) except: logger.critical( "Erreur inconnue" ) finally : # Ajout dans l'historique self.historique.ajouter( Video( lien = self.listeFragmentsURL, fragments = i, finie = self.telechargementFini ) ) # Fermeture du fichier self.fichierVideo.close()
class DlM3u8(Downloader): """ Téléchargement des liens m3u8 """ def __init__(self, m3u8Url, outDir, codeProgramme, timeStamp, navigateur, stopDownloadEvent, progressFnct): self.m3u8Url = m3u8Url super(DlM3u8, self).__init__(outDir, codeProgramme, timeStamp, "ts", navigateur, stopDownloadEvent, progressFnct) self.historique = Historique() def telecharger(self): # Récupère le fichier master.m3u8 self.m3u8 = self.navigateur.getFichier(self.m3u8Url) # Extrait l'URL de tous les fragments self.listeFragments = re.findall(".+?\.ts", self.m3u8) # # Création de la vidéo # self.premierFragment = 1 self.telechargementFini = False video = self.historique.getVideo(self.m3u8Url) # Si la vidéo est dans l'historique if(video is not None): # Si la vidéo existe sur le disque if(os.path.exists(self.nomFichier)): if(video.finie): logger.info("La vidéo a déjà été entièrement téléchargée") return else: self.ouvrirVideoExistante() self.premierFragment = video.fragments logger.info("Reprise du téléchargement de la vidéo au fragment %d" % (video.fragments)) else: self.ouvrirNouvelleVideo() logger.info("Impossible de reprendre le téléchargement de la vidéo, le fichier %s n'existe pas" % (self.nomFichier)) else: # Si la vidéo n'est pas dans l'historique self.ouvrirNouvelleVideo() # Nombre de fragments self.nbFragMax = float(len(self.listeFragments)) logger.debug("Nombre de fragments: %d" % (self.nbFragMax)) # Ajout des fragments logger.info("Début du téléchargement des fragments") try: i = self.premierFragment while(i <= self.nbFragMax and not self.stopDownloadEvent.isSet()): frag = self.navigateur.getFichier("%s" % ( self.listeFragments[i - 1])) self.fichierVideo.write(frag) # Affichage de la progression self.progressFnct(min(int((i / self.nbFragMax) * 100), 100)) i += 1 if(i == self.nbFragMax + 1): self.progressFnct(100) self.telechargementFini = True logger.info("Fin du téléchargement") except KeyboardInterrupt: logger.info("Interruption clavier") except Exception as inst: logger.critical("Erreur inconnue %s" % inst) finally: # Ajout dans l'historique self.historique.ajouter(Video(lien = self.m3u8Url, fragments = i, finie = self.telechargementFini)) # Fermeture du fichier self.fichierVideo.close()
class PluzzDLM3U8( object ): """ Telechargement des liens m3u8 """ def __init__( self, m3u8URL, nomFichier, navigateur, stopDownloadEvent, progressFnct ): self.m3u8URL = m3u8URL self.nomFichier = nomFichier self.navigateur = navigateur self.stopDownloadEvent = stopDownloadEvent self.progressFnct = progressFnct self.historique = Historique() self.nomFichierFinal = "%s.mkv" % ( self.nomFichier[ :-3 ] ) def ouvrirNouvelleVideo( self ): """ Creer une nouvelle video """ try : # Ouverture du fichier self.fichierVideo = open( self.nomFichier, "wb" ) except : raise PluzzDLException( "Impossible d'écrire dans le répertoire %s" % ( os.getcwd() ) ) # Ajout de l'en-tête # Fait dans creerMKV def ouvrirVideoExistante( self ): """ Ouvre une video existante """ try : # Ouverture du fichier self.fichierVideo = open( self.nomFichier, "a+b" ) except : raise PluzzDLException( "Impossible d'écrire dans le répertoire %s" % ( os.getcwd() ) ) def creerMKV( self ): """ Creer un mkv a partir de la video existante (cree l'en-tete de la video) """ logger.info( "Création du fichier MKV (vidéo finale) ; veuillez attendre quelques instants" ) try: if( os.name == "nt" ): commande = "ffmpeg.exe -i %s -vcodec copy -acodec copy %s 1>NUL 2>NUL" % ( self.nomFichier, self.nomFichierFinal ) else: commande = "ffmpeg -i %s -vcodec copy -acodec copy %s 1>/dev/null 2>/dev/null" % ( self.nomFichier, self.nomFichierFinal ) if( os.system( commande ) == 0 ): os.remove( self.nomFichier ) logger.info( "Fin !" ) else: logger.warning( "Problème lors de la création du MKV avec FFmpeg ; le fichier %s est néanmoins disponible" % ( self.nomFichier ) ) except: raise PluzzDLException( "Impossible de créer la vidéo finale" ) def telecharger( self ): # Recupere le fichier master.m3u8 self.m3u8 = self.navigateur.getFichier( self.m3u8URL ) # Extrait l'URL de base pour tous les fragments self.urlBase = "/".join( self.m3u8URL.split( "/" )[ :-1 ] ) # Recupere le lien avec le plus gros bitrate try: self.listeFragmentsURL = "%s/%s" % ( self.urlBase, re.findall( ".+?\.m3u8.*", self.m3u8 )[ -1 ] ) except: raise PluzzDLException( "Impossible de trouver le lien vers la liste des fragments" ) # Recupere la liste des fragments self.listeFragmentsPage = self.navigateur.getFichier( self.listeFragmentsURL ) # Extrait l'URL de tous les fragments self.listeFragments = re.findall( ".+?\.ts", self.listeFragmentsPage ) # # Creation de la video # self.premierFragment = 1 self.telechargementFini = False video = self.historique.getVideo( self.listeFragmentsURL ) # Si la video est dans l'historique if( video is not None ): # Si la video existe sur le disque if( os.path.exists( self.nomFichier ) or os.path.exists( self.nomFichierFinal ) ): if( video.finie ): logger.info( "La vidéo a déjà été entièrement téléchargée" ) if( not os.path.exists( self.nomFichierFinal ) ): self.creerMKV() return else: self.ouvrirVideoExistante() self.premierFragment = video.fragments logger.info( "Reprise du téléchargement de la vidéo au fragment %d" % ( video.fragments ) ) else: self.ouvrirNouvelleVideo() logger.info( u"Impossible de reprendre le téléchargement de la vidéo, le fichier %s n'existe pas" % ( self.nomFichier ) ) else: # Si la video n'est pas dans l'historique self.ouvrirNouvelleVideo() # Nombre de fragments self.nbFragMax = float( len( self.listeFragments ) ) logger.debug( "Nombre de fragments : %d" % ( self.nbFragMax ) ) # Ajout des fragments logger.info( "Début du téléchargement des fragments" ) try : i = self.premierFragment while( i <= self.nbFragMax and not self.stopDownloadEvent.isSet() ): frag = self.navigateur.getFichier( "%s/%s" % ( self.urlBase, self.listeFragments[ i - 1 ] ) ) self.fichierVideo.write( frag ) # Affichage de la progression self.progressFnct( min( int( ( i / self.nbFragMax ) * 100 ), 100 ) ) i += 1 if( i == self.nbFragMax + 1 ): self.progressFnct( 100 ) self.telechargementFini = True logger.info( "Fin du téléchargement" ) self.creerMKV() except KeyboardInterrupt: logger.info( "Interruption clavier" ) except: logger.critical( "Erreur inconnue" ) finally : # Ajout dans l'historique self.historique.ajouter( Video( lien = self.listeFragmentsURL, fragments = i, finie = self.telechargementFini ) ) # Fermeture du fichier self.fichierVideo.close()
class PluzzDLM3U8(object): """ Telechargement des liens m3u8 """ def __init__(self, m3u8URL, nomFichier, navigateur, stopDownloadEvent, progressFnct): self.m3u8URL = m3u8URL self.nomFichier = nomFichier self.navigateur = navigateur self.stopDownloadEvent = stopDownloadEvent self.progressFnct = progressFnct self.historique = Historique() self.nomFichierFinal = "%s.mp4" % (self.nomFichier[:-3]) def ouvrirNouvelleVideo(self): """ Creer une nouvelle video """ try: # Ouverture du fichier print "Nom Fichier:", self.nomFichier # fullPathFile = os.path.join(os.getcwd(), self.nomFichier) # print "fullPathFile:", fullPathFile self.fichierVideo = open(self.nomFichier, "wb") # self.fichierVideo = open( fullPathFile, "wb" ) except: raise PluzzDLException("Impossible d'écrire dans le répertoire %s" % (os.getcwd())) # Ajout de l'en-tête # Fait dans creerMKV def ouvrirVideoExistante(self): """ Ouvre une video existante """ try: # Ouverture du fichier self.fichierVideo = open(self.nomFichier, "a+b") except: raise PluzzDLException("Impossible d'écrire dans le répertoire %s" % (os.getcwd())) def creerMKV(self): """ Creer un mkv a partir de la video existante (cree l'en-tete de la video) """ logger.info("Création du fichier MKV (vidéo finale); veuillez attendre quelques instants") logger.info("Convert: %s -> %s" % (self.nomFichier, self.nomFichierFinal)) commande = "ffmpeg -i %s -c:a aac -strict -2 -vcodec copy %s" % (self.nomFichier, self.nomFichierFinal) try: if (os.system(commande) == 0): os.remove(self.nomFichier) logger.info("Fin !") else: logger.warning( "Problème lors de la création du MKV avec FFmpeg ; le fichier %s est néanmoins disponible" % ( self.nomFichier)) except: raise PluzzDLException("Impossible de créer la vidéo finale") def telecharger(self): # Recupere le fichier master.m3u8 self.m3u8 = self.navigateur.getFichier(self.m3u8URL) # Extrait l'URL de tous les fragments self.listeFragments = re.findall(".+?\.ts", self.m3u8) if not self.listeFragments: self.listeFragments = [] self.listeM3U8 = re.findall(".+?index_2_av\.m3u8", self.m3u8) for m3u8 in self.listeM3U8: m3u8data = self.navigateur.getFichier(m3u8) self.listeFragments.extend(re.findall(".+?\.ts", m3u8data)) # # Creation de la video # self.premierFragment = 1 self.telechargementFini = False video = self.historique.getVideo(self.m3u8URL) # Si la video est dans l'historique if (video is not None): # Si la video existe sur le disque if (os.path.exists(self.nomFichier) or os.path.exists(self.nomFichierFinal)): if (video.finie): logger.info("La vidéo a déjà été entièrement téléchargée") if (not os.path.exists(self.nomFichierFinal)): self.creerMKV() return else: self.ouvrirVideoExistante() self.premierFragment = video.fragments logger.info("Reprise du téléchargement de la vidéo au fragment %d" % (video.fragments)) else: self.ouvrirNouvelleVideo() logger.info(u"Impossible de reprendre le téléchargement de la vidéo, le fichier %s n'existe pas" % ( self.nomFichier)) else: # Si la video n'est pas dans l'historique self.ouvrirNouvelleVideo() # Nombre de fragments self.nbFragMax = float(len(self.listeFragments)) logger.debug("Nombre de fragments : %d" % (self.nbFragMax)) # Ajout des fragments logger.info("Début du téléchargement des fragments") try: i = self.premierFragment while (i <= self.nbFragMax and not self.stopDownloadEvent.isSet()): frag = self.navigateur.getFichier("%s" % (self.listeFragments[i - 1])) self.fichierVideo.write(frag) # Affichage de la progression self.progressFnct(min(int((i / self.nbFragMax) * 100), 100)) i += 1 if (i == self.nbFragMax + 1): self.progressFnct(100) self.telechargementFini = True logger.info("Fin du téléchargement") self.creerMKV() except KeyboardInterrupt: logger.info("Interruption clavier") except Exception as inst: logger.critical("Erreur inconnue %s" % inst) finally: # Ajout dans l'historique self.historique.ajouter(Video(lien=self.m3u8URL, fragments=i, finie=self.telechargementFini)) # Fermeture du fichier self.fichierVideo.close()