Example #1
0
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()
Example #2
0
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()
Example #3
0
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()
Example #4
0
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()