Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#126 Le 02/08/2010, à 13:17

Vermouth

Re : TVDownloader: télécharger les médias du net !

ludovic889 a écrit :

Arte: Émission trouvée /fr/videos/360_geo-3333124.html
DEPRECATED: Plugin.getPage()
Arte: ... videoRef : 3333162
Arte: ... Player : http://videos.arte.tv/blob/web/i18n/view/player_9-3188338-data-4755951.swf
DEPRECATED: Plugin.getPage()
Arte: ... Titre : 360° - GÉO
Arte: ... Date : Lun., 26. juil. 2010, 18h05
Arte: ... Lien : rtmp://artestras.fcod.llnwd.net/a3903/o35/MP4:geo/videothek/ALL/arteprod/A7_SGT_ENC_08_042394-000-A_PG_HQ_FR?h=3f1c346ca4f8ada38280c64316a5030c -W http://videos.arte.tv/blob/web/i18n/view/player_9-3188338-data-4755951.sw

Tu doit pas avoir une version incompatible du plugin arte.
Pour l'instant le prog évolu beaucoup donc ça pose problème niveau compatibilité des plugins.
Laissez nous quelque version pour stabiliser le truc.
T'as la version 0.3 je suppose...

De manière général, si vous voyer des DEPRECATED c'est que le plugin aurai besoin d'une mise à jour.
Les plugins compatible avec la version 0.2 ne le sous pas avec la 0.3 et inversement. C'est une petite erreur "stratégique" j'ai l'impression XD !


Android !
\_/°<

   coin coin...

Hors ligne

#127 Le 02/08/2010, à 13:20

albh

Re : TVDownloader: télécharger les médias du net !

Oui oui, il est bien coché, et je ne vois pas les émissions, la chaîne et les styles et tout ça s'affiche bien.

Hors ligne

#128 Le 02/08/2010, à 13:48

Vermouth

Re : TVDownloader: télécharger les médias du net !

albh a écrit :

Oui oui, il est bien coché, et je ne vois pas les émissions, la chaîne et les styles et tout ça s'affiche bien.

Oaui bein c'est sûrement ce que je t'ai dit avant:

Vermouth a écrit :

Tu doit pas avoir une version incompatible du plugin arte.

Mais c'est pas 100% imcompatible c'est pour ça que des trucs s'affiche...


Android !
\_/°<

   coin coin...

Hors ligne

#129 Le 02/08/2010, à 13:52

albh

Re : TVDownloader: télécharger les médias du net !

Hum je vais patienter alors:D

Hors ligne

#130 Le 02/08/2010, à 14:07

ludovic889

Re : TVDownloader: télécharger les médias du net !

bon ben merci,

attendons la prochaine version


Ce n'est pas grave de ne pas avoir l'heure si on a le temps.

Hors ligne

#131 Le 02/08/2010, à 14:10

BmD_Online

Re : TVDownloader: télécharger les médias du net !

Essayez cette version, elle devrait marcher pour Arte+7 et ArteLiveWeb.
Je viens encore de tester à l'instant :

#!/usr/bin/env python
# -*- coding:Utf-8 -*-

#########################################
# Licence : GPL2 ; voir fichier LICENSE #
#########################################

#~ Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence Publique Générale GNU publiée par la Free Software Foundation (version 2 ou bien toute autre version ultérieure choisie par vous).
#~ Ce programme est distribué car potentiellement utile, mais SANS AUCUNE GARANTIE, ni explicite ni implicite, y compris les garanties de commercialisation ou d'adaptation dans un but spécifique. Reportez-vous à la Licence Publique Générale GNU pour plus de détails.
#~ Vous devez avoir reçu une copie de la Licence Publique Générale GNU en même temps que ce programme ; si ce n'est pas le cas, écrivez à la Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, États-Unis.

###########
# Modules #
###########

import os

from Plugin import Plugin
from Fichier import Fichier
from urllib import quote,unquote
import re,unicodedata
import time,rfc822 # for RFC822 datetime format (rss feed)
from htmlentitydefs import name2codepoint

##########
# Classe #
##########

class Arte( Plugin ):
    """Classe abstraite Plugin dont doit heriter chacun des plugins"""

    # Nombre maximum de fichiers à rechercher (0 = aucune limite)
    maxDepth = 0
    
    ##
    ## Arte Live Web
    ##
    
    #
    # A/ Recherche des émissions
    #
    # 1. On liste les catégories à partir de la page d'accueil.
    #    Chaque catégorie est une "émission" de la chaine Arte Live Web
    #
    # B/ Recherche des fichiers d'une émission
    #
    # 1. On recherche la page du flux RSS à partir de la page de la catégorie choisie.
    # 2. On extrait la liste des fichiers (les pages de chaque enregistrement proposé)
    # 3. On recherche le numéro eventID à partir de la page de l'enregistrement
    # 4. On recherche les détails de l'enregistrement dans la page xml associée à l'eventID
    #

    ##
    ## Arte+7
    ##
    ## Utilisation de la méthode de Pascal92
    ## http://www.encodage.org/phpBB/viewtopic.php?f=26&t=90
    ##
    
    #
    # A/ Recherche des émissions
    #
    # 1. On liste les chaines à partir de la page d'accueil.
    #    Chaque chaine est une "émission" de la chaine Arte+7
    #
    # B/ Recherche des fichiers d'une émission
    #
    # 1. On charge la page spéciale "videoArtePlusSeptChaineBaseUrl" contenant les fichiers de la chaine choisie
    # 2. On extrait la liste des fichiers (les pages ainsi que nom et date de chaque enregistrement proposé)
    # 3. On recherche le numéro de référence de la vidéo à partir de la page de l'enregistrement
    # 4. On recherche les détails de l'enregistrement dans la page xml associée à la référence
    #
    
    ##
    ## Arte Live Web
    ##
    nomArteLiveWeb = "Arte Live Web"
    # Page permettant de lister les catégories
    listeArteLiveWebCategoriesUrl = "http://liveweb.arte.tv/"
    # Expression régulière pour extraire les catégories
    listeArteLiveWebCategoriesPattern = re.compile("<a href=\"http://liveweb.arte.tv/fr/cat/(.*?)\">(.*?)</a>", re.DOTALL)
    # Rang dans le résultat de l'expression régulière précédente
    categorieArteLiveWeb_LIEN = 0
    categorieArteLiveWeb_NOM = 1
    # Base de la page catégorie, permettant de retrouver le lien du flux RSS
    videoArteLiveWebCategorieBaseUrl = "http://liveweb.arte.tv/fr/cat/"
    # Expression régulière pour extraire le lien du flux RSS
    videoArteLiveWebRSSPattern = re.compile("<a href=\"(http://download.liveweb.arte.tv/o21/liveweb/rss/home.*?\.rss)\"", re.DOTALL)

    # Expression régulière pour extraire le lien vers la page de la video, ainsi que sa date
    videoArteLiveWebVideosPattern = re.compile("<link>(http://liveweb.arte.tv/fr/video/.*?)</link>.*?<pubDate>(.*?)</pubDate>", re.DOTALL)
    #~ videoArteLiveWebEventIDPattern = re.compile("eventID=(.*?)&")
    #~ videoArteLiveWebEventIDPattern = re.compile("new LwEvent('(.*?)', '');")
    videoArteLiveWebEventIDPattern = re.compile("/media/event/(.*?)/", re.DOTALL)
    videoArteLiveWebInfosBaseUrl = "http://arte.vo.llnwd.net/o21/liveweb/events/event-" # ".xml"
    
    videoArteLiveWebTitrePattern = re.compile("<nameFr>(.*?)</nameFr>", re.DOTALL)
    videoArteLiveWebLienPattern = re.compile("<urlHd>(.*?)</urlHd>", re.DOTALL)
    #~ videoArteLiveWebDatePattern = re.compile("<dateEvent>(.*?)</dateEvent>", re.DOTALL)
    
    ##
    ## Arte+7
    ##
    nomArtePlusSept = "Arte+7"
    # Page permettant de lister les chaines
    listeArtePlusSeptChainesUrl = "http://videos.arte.tv/fr/videos/arte7"
    # Expression régulière pour extraire les chaines
    listeArtePlusSeptChainesPattern = re.compile("<a href=\"/fr/videos/chaines/(.*?)\".*?>(.*?)</a>", re.DOTALL)
    # Rang dans le résultat de l'expression régulière précédente
    categorieArtePlusSept_LIEN = 0
    categorieArtePlusSept_NOM = 1
    # Expression régulière pour extraire le channelID du lien de la chaine
    chaineArtePlusSeptChannelIDPattern = re.compile(".*?/index-(.*?)\.html", re.DOTALL)
    # Base de la page chaine, permettant de retrouver les fichiers (lien donné par "listViewUrl" dans la page principale)
    videoArtePlusSeptChaineBaseUrl = "http://videos.arte.tv/fr/do_delegate/videos/arte7/index-3211552,view,asList.html?hash=fr/list/date//1/250/channel-%channel%-program-"

    # Expression régulière pour extraire le lien vers la page de la video, son titre ainsi que sa date
    videoArtePlusSeptVideosPattern = re.compile("<a href=\"(/fr/videos/.*?\.html)\"><span class=\"teaserTitle\">(.*?)</span></a>.*?<td class=\"col2\"><em>(.*?)</em></td>", re.DOTALL)
    # Base de la page permettant de rechercher la référence de la video
    videoArtePlusSeptVideoBaseUrl = "http://videos.arte.tv"
    # Expression régulière pour extraire la référence de la vidéo à lire
    videoArtePlusSeptVideoRefPattern = re.compile("addToPlaylistOpen {ajaxUrl:'/fr/do_addToPlaylist/videos/.*?-(.*?)\.html'}", re.DOTALL)
    videoArtePlusSeptPlayerPattern = re.compile("<param name=\"movie\" value=\"(.*?\.swf)", re.DOTALL)
    # Base de la page XML décrivant la vidéo, ses liens
    videoArtePlusSeptXMLBaseURL = "http://videos.arte.tv/fr/do_delegate/videos/360_geo-%video%,view,asPlayerXml.xml"
    videoArtePlusSeptLienPattern = re.compile("<url quality=\"hd\">(.*?)</url>", re.DOTALL)

    # Ordre des éléments dans le tuple "chaine"
    chaine_NOM = 1
    chaine_LIEN = 0
    
    nom = "Arte"
    url = "http://www.arte.tv/"
    
    def __init__( self ):
        Plugin.__init__(self)
        
        cache = self.chargerCache()
        if cache:
            self.listeChaines = cache
        else:
            self.listeChaines = {}
            self.rafraichir()
        self.listeFichiers = {}

    def htmlentitydecode(self, s):
        # http://wiki.python.org/moin/EscapingHtml
        return re.sub('&(%s);' % '|'.join(name2codepoint), 
                lambda m: unichr(name2codepoint[m.group(1)]), s)

    def rafraichir( self ):
        self.afficher("Création de la liste des chaines...")

        ##
        ## Arte Live Web
        ##
        self.afficher("Récupération de la liste des catégories "+self.nomArteLiveWeb+"...")
        # On crée la chaine
        self.listeChaines[self.nomArteLiveWeb] = []
        # On recherche toutes les catégories
        for item in re.findall(self.listeArteLiveWebCategoriesPattern, self.API.getPage(self.listeArteLiveWebCategoriesUrl)):
            lien = item[self.categorieArteLiveWeb_LIEN]
            nom = item[self.categorieArteLiveWeb_NOM]
            #~ nom = unicode(nom, "iso-8859-1", "replace")
            itemLive = []
            itemLive.insert (self.chaine_LIEN, lien)
            itemLive.insert (self.chaine_NOM, nom)
            # On ajoute la catégorie trouvée si elle n'est pas déjà présente
            if (itemLive not in self.listeChaines[self.nomArteLiveWeb]):
                self.listeChaines[self.nomArteLiveWeb].append(itemLive)

        ##
        ## Arte+7
        ##
        self.afficher("Récupération de la liste des chaines "+self.nomArtePlusSept+"...")
        # On crée la chaine
        self.listeChaines[self.nomArtePlusSept] = []
        # On recherche toutes les catégories
        for item in re.findall(self.listeArtePlusSeptChainesPattern, self.API.getPage(self.listeArtePlusSeptChainesUrl)):
            lien = item[self.categorieArtePlusSept_LIEN]
            nom = item[self.categorieArtePlusSept_NOM]
            #~ nom = unicode(nom, "utf8", "replace")
            #~ nom = self.htmlentitydecode(nom)
            #~ nom = nom.encode("utf-8", "replace")
            itemPlusSept = []
            itemPlusSept.insert (self.chaine_LIEN, lien)
            itemPlusSept.insert (self.chaine_NOM, nom)
            # On ajoute la catégorie trouvée si elle n'est pas déjà présente
            if (itemPlusSept not in self.listeChaines[self.nomArtePlusSept]):
                self.listeChaines[self.nomArtePlusSept].append(itemPlusSept)

        self.sauvegarderCache(self.listeChaines)
    
    def getLienEmission(self, emission):
        #~ emission = unicode( emission, "utf8", "replace" )
        # Cherche dans quelle chaine se trouve l'émission
        #~ self.afficher("Recherche de : "+emission)
        #~ for chaine in self.listeChaines.keys():
        #~     #~ self.afficher("Chaine : "+chaine)
        chaine = self.derniereChaine
        for item in self.listeChaines[chaine]:
            s = item[self.chaine_NOM]
            #~ self.afficher("Item : "+s)
            if (cmp(s, emission)==0):
                s = item[self.chaine_LIEN]
                if (s==""):
                    return None
                else:
                    return quote(s.encode( 'ascii','ignore' ))
    
    def listerChaines( self ):
        t = self.listeChaines.keys()
        t.sort()
        return t
    
    def listerEmissions( self, chaine ):
        t = []
        self.derniereChaine = chaine
        if self.listeChaines.has_key(chaine):
            for item in self.listeChaines[chaine]:
                s = item[self.chaine_NOM]
                #~ t.append(s.decode("iso-8859-1"))
                t.append(s)
            t.sort()
        return t

    def listerFichiersArteLiveWeb( self, emission ):
        """Renvoi la liste des fichiers disponibles pour une emission donnnee"""
        # Renvoi la liste des fichiers (utilisation de la classe Fichier)
        #    [ Fichier ( nom, date, lien) , Fichier( ... ), ... ]
        if self.listeFichiers.has_key(emission):
            return self.listeFichiers[emission]
        
        lien = self.getLienEmission(emission)
        
        if lien == None:
            self.afficher ("Erreur de recherche du lien pour \""+emission+"\"")
        else:
            self.afficher("Récupération de la liste des fichiers pour \""+emission+"\"...")
            # Reconstitution du lien complet
            lien = self.videoArteLiveWebCategorieBaseUrl+lien
            # On recherche l'adresse de la page RSS
            self.afficher ("Recherche du flux RSS \""+emission+"\" à l'adresse "+lien)
            feedURL = re.search(self.videoArteLiveWebRSSPattern, self.API.getPage(lien)).group(1)

            # On recherche toutes les émissions contenues dans le flux RSS
            self.afficher ("Recherche des émissions dans le flux : "+feedURL)
            videos = re.findall(self.videoArteLiveWebVideosPattern, self.API.getPage(feedURL))

            liste = []
            if videos == None:
                return liste

            # Pour chacune des vidéos trouvées
            curDepth = 0
            for fichier in videos:
                #~ curDepth = curDepth+1
                curDepth += 1
                if (self.maxDepth>0 and curDepth>self.maxDepth):
                    break
                
                self.afficher ("Émission trouvée "+fichier[0])
                # Recherche de l'eventID dans la page de l'emission
                fichierInfosEventID_match = re.search (self.videoArteLiveWebEventIDPattern, self.API.getPage(fichier[0]))
                if fichierInfosEventID_match == None:
                    continue
                self.afficher ("... eventID : "+fichierInfosEventID_match.group(1))
                
                # Chargement de la page XML de l'eventID trouvé
                fichierInfos = self.API.getPage(self.videoArteLiveWebInfosBaseUrl+fichierInfosEventID_match.group(1)+".xml")

                titre = re.search(self.videoArteLiveWebTitrePattern, fichierInfos)
                if titre != None:
                    titre = titre.group(1)
                else:
                    curDepth -= 1 # On n'est pas tombé sur une vidéo valide (pas de titre trouvé ?!)
                    continue
                lien = re.search(self.videoArteLiveWebLienPattern, fichierInfos)
                if lien != None:
                    lien = lien.group(1)
                else:
                    curDepth -= 1 # On n'est pas tombé sur une vidéo valide (pas de lien, vidéo Live à venir ??)
                    continue
                #~ date =  re.search(self.videoDatePattern, fichierInfos)
                date =  fichier[1]
                if date != None:
                    rfc_date = rfc822.parsedate(date)
                    # Format année/mois/jour, mieux pour effectuer un tri
                    date = str(rfc_date[0])+"/"+str(rfc_date[1]).zfill(2)+"/"+str(rfc_date[2]).zfill(2)
                else:
                    continue
                
                if not(lien):
                    continue
                
                self.afficher ("... Titre : "+titre)
                self.afficher ("... Date : "+date)
                self.afficher ("... Lien : "+lien)

                # On a le lien brut, il faut l'analyser pour pouvoir effectuer un téléchargement convenable avec rtmpdump
                # un lien du type
                #   rtmp://arte.fcod.llnwd.net/a2306/o25/MP4:liveweb/stream/1399_Suds_Arles_JUSTIN_ADAMS_100715_hd.mp4
                # est téléchargé avec la commande
                #   rtmpdump --host arte.fcod.llnwd.net --port 1935 --protocol RTMP --app a2306/o25 --playpath MP4:liveweb/stream/1399_Suds_Arles_JUSTIN_ADAMS_100715_hd.mp4 --flv 'Justin Adams & Juldeh Camara.mp4'

                urlPattern = re.compile("rtmp://(?P<host>.*?)/(?P<app>.*?)/(?P<playpath>\w*?\:.*)", re.DOTALL)
                urlParts = re.search(urlPattern, lien)
                filePath = urlParts.group("playpath")
                (dirName, fileName) = os.path.split(filePath)
                #~ (fileBaseName, fileExtension)=os.path.splitext(fileName)
                urlRtmpMask = "rtmpdump --host %host% --port 1935 --protocol RTMP --app %app% --playpath %playpath% --flv '%filename%'"
                lien = urlRtmpMask
                lien = lien.replace ("%host%", urlParts.group("host"))
                lien = lien.replace ("%app%", urlParts.group("app"))
                lien = lien.replace ("%playpath%", urlParts.group("playpath"))
                #~ lien = lien.replace ("%filename%", titre+fileExtension)
                lien = lien.replace ("%filename%", fileName)

                self.afficher ("... Commande : "+lien)
                
                
                self.API.ajouterFichier( Fichier( titre, date, lien ) )
                liste.append(Fichier(titre, date, lien))
            self.afficher(str(len(liste))+" fichiers trouvés.")
            self.listeFichiers[emission] = liste
            #~ return liste

    def listerFichiersArtePlusSept( self, emission ):
        """Renvoi la liste des fichiers disponibles pour une emission donnnee"""
        # Renvoi la liste des fichiers (utilisation de la classe Fichier)
        #    [ Fichier ( nom, date, lien) , Fichier( ... ), ... ]
        if self.listeFichiers.has_key(emission):
            return self.listeFichiers[emission]
        
        # Code de la "chaine" Arte+7
        channel = re.search (self.chaineArtePlusSeptChannelIDPattern, self.getLienEmission(emission)).group(1)
        # Construction du lien contenant toutes les émissions de cette chaine
        lien = self.videoArtePlusSeptChaineBaseUrl.replace ("%channel%", channel)
        
        if lien == None:
            self.afficher ("Erreur de recherche du lien pour \""+emission+"\"")
        else:
            self.afficher("Récupération de la liste des fichiers pour \""+emission+"\"...")

            # On recherche toutes les émissions de la chaine
            self.afficher ("Recherche des émissions de la chaine \""+emission+"\" à l'adresse "+lien)
            videos = re.findall(self.videoArtePlusSeptVideosPattern, self.API.getPage(lien))

            liste = []
            if videos == None:
                return liste

            # Pour chacune des vidéos trouvées
            curDepth = 0
            for fichier in videos:
                #~ curDepth = curDepth+1
                curDepth += 1
                if (self.maxDepth>0 and curDepth>self.maxDepth):
                    break
                
                self.afficher ("Émission trouvée "+fichier[0])
                
                fichierInfos = self.API.getPage(self.videoArtePlusSeptVideoBaseUrl+fichier[0])
                
                # Recherche de la référence de la vidéo dans la page de l'emission
                fichierInfosVideoRef_match = re.search (self.videoArtePlusSeptVideoRefPattern, fichierInfos)
                if fichierInfosVideoRef_match == None:
                    continue
                self.afficher ("... videoRef : "+fichierInfosVideoRef_match.group(1))

                # Recherche l'adresse du player video, pour la suite
                fichierInfosPlayer_match = re.search (self.videoArtePlusSeptPlayerPattern, fichierInfos)
                if fichierInfosPlayer_match == None:
                    continue
                self.afficher ("... Player : "+fichierInfosPlayer_match.group(1))
                
                #~ # Chargement de la page XML de la référence trouvée
                fichierInfos = self.API.getPage(self.videoArtePlusSeptXMLBaseURL.replace("%video%",fichierInfosVideoRef_match.group(1)))

                #~ file = open(self.fichierCache+"_web", "w")
                #~ file.write (fichierInfos)
                #~ file.close()

                titre = fichier[1]
                lien = re.search(self.videoArtePlusSeptLienPattern, fichierInfos)
                if lien != None:
                    #~ lien = lien.group(1)
                    # Workaround : on ajoute le nom du player directement ici
                    lien = lien.group(1)+" -W "+fichierInfosPlayer_match.group(1)
                else:
                    continue
                date =  fichier[2]
                
                if not(lien):
                    continue
                
                self.afficher ("... Titre : "+titre)
                self.afficher ("... Date : "+date)
                self.afficher ("... Lien : "+lien)
                
                self.API.ajouterFichier( Fichier( titre, date, lien ) )
                liste.append(Fichier(titre, date, lien))
            self.afficher(str(len(liste))+" fichiers trouvés.")
            self.listeFichiers[emission] = liste
            #~ return liste

    
    def listerFichiers( self, emission ):
        if (self.derniereChaine == self.nomArteLiveWeb):
            #~ return self.listerFichiersArteLiveWeb (emission)
            self.listerFichiersArteLiveWeb (emission)
        elif (self.derniereChaine == self.nomArtePlusSept):
            #~ return self.listerFichiersArtePlusSept (emission)
            self.listerFichiersArtePlusSept (emission)
        else:
            self.afficher("Chaine non prise en compte actuellement")

Hors ligne

#132 Le 02/08/2010, à 14:15

BmD_Online

Re : TVDownloader: télécharger les médias du net !

- Une variable MaxDepth (ligne 33) permet de choisir le nombre maximum de fichier à rechercher par émission.
- Arte+7 télécharge les fichiers correctement, mais avec des noms du genre player_9-3188338-data-4755951.swf.
- Arte Live Web télécharge les fichiers, mais affiche une erreur en console, et dans le répertoire /usr/share/tvdownloader.

C'est le seul moyen actuellement d'arriver à télécharger les émissions. C'est lié aux problèmes d'utilisation de rtmpdump évoqués dans les topics précédents.

Hors ligne

#133 Le 02/08/2010, à 14:22

albh

Re : TVDownloader: télécharger les médias du net !

Alors oui c'est mieux, bien mieux, juste le téléchargement qui se fait pas car il manque "://"

Arte: 12 fichiers trouvés.
RTMPDump v2.3
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
ERROR: RTMP URL: No :// in url!
WARNING: Couldn't parse the specified url (rtmpdump)!
Connecting ...
INFO: Connected...
Starting download at: 0.000 kB
INFO: Metadata:
INFO:   duration              4324.01
INFO:   moovPosition          517461181.00
INFO:   width                 720.00
INFO:   height                400.00
INFO:   videocodecid          avc1
INFO:   audiocodecid          mp4a
INFO:   avcprofile            66.00
INFO:   avclevel              30.00
INFO:   aacaot                2.00
INFO:   videoframerate        25.00
INFO:   audiosamplerate       48000.00
INFO:   audiochannels         2.00
INFO: tags:
INFO:   ©too                 Lavf52.34.0
INFO: trackinfo:
INFO:   length                108096.00
INFO:   timescale             25.00
INFO:   language              und
INFO: sampledescription:
INFO:   sampletype            avc1
INFO:   length                207552512.00
INFO:   timescale             48000.00
INFO:   language              und
INFO: sampledescription:
INFO:   sampletype            mp4a
130.813 kB / 1.24 sec (0.0%)
Caught signal: 13, cleaning up, just a second...
ERROR: WriteN, RTMP send error 32 (42 bytes)
ERROR: RTMP_ReadPacket, failed to read RTMP packet body. len: 70545
133.403 kB / 1.24 sec (0.0%)
Download may be incomplete (downloaded about 0.00%), try resuming

Hors ligne

#134 Le 02/08/2010, à 14:44

chaoswizard

Re : TVDownloader: télécharger les médias du net !

@BmD_Online :
La version 0.4 est en cours de développement et devrait permettre de faire ce que tu veux :

Dans la prochaine version du logiciel (0.4), 2 champs ont été ajoutés :
- Le premier permet de préciser toute la commande de téléchargement a lancer SAUF la partie qui concerne le nom du fichier de sortie (donc pas d'option -o)
- Le second permet de préciser le nom du fichier de sortie

Ces 2 champs sont optionnels.

Format :

self.API.ajouterFichier( Fichier( nom, date, lien, commande, nomFichierSortie ) )

Exemple d'utilisation :

self.API.ajouterFichier( Fichier( ...,
...,
rtmp://arte.fcod.llnwd.net/a2306/o25/MP4:liveweb/stream/1399_Suds_Arles_JUSTIN_ADAMS_100715_hd.mp4,
rtmpdump --host arte.fcod.llnwd.net --port 1935 --protocol RTMP --app a2306/o25 --playpath MP4:liveweb/stream/1399_Suds_Arles_JUSTIN_ADAMS_100715_hd.mp4,
Justin Adams & Juldeh Camara.mp4 ) )

Ubuntu ==> Debian ==> Archlinux

Hors ligne

#135 Le 02/08/2010, à 14:49

BmD_Online

Re : TVDownloader: télécharger les médias du net !

Il faudrait ajouter une gestion des versions des plugins.
Exemple à prendre chez Mozilla : Les addons ont un "minVersion" et un "maxVersion" qui indiquent quelles versions de l'application (firefox, thunderbird) est compatible avec l'addon.

Hors ligne

#136 Le 02/08/2010, à 14:52

Vermouth

Re : TVDownloader: télécharger les médias du net !

BmD_Online a écrit :

Il faudrait ajouter une gestion des versions des plugins.
Exemple à prendre chez Mozilla : Les addons ont un "minVersion" et un "maxVersion" qui indiquent quelles versions de l'application (firefox, thunderbird) est compatible avec l'addon.

Pas bête oui.
Là je travail à rendre le développement de plugin plus facile et pérenne, à uniformiser un peu le tout.

Dernière modification par Vermouth (Le 02/08/2010, à 14:53)


Android !
\_/°<

   coin coin...

Hors ligne

#137 Le 02/08/2010, à 14:52

BmD_Online

Re : TVDownloader: télécharger les médias du net !

albh a écrit :

Alors oui c'est mieux, bien mieux, juste le téléchargement qui se fait pas car il manque "://"

Moi, j'ai le même message, mais ça télécharge.

RTMPDump v2.3
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
ERROR: RTMP URL: No :// in url!
WARNING: Couldn't parse the specified url (rtmpdump)!
Connecting ...
INFO: Connected...
Starting download at: 0.000 kB
INFO: Metadata:
INFO:   duration              3228.42
INFO:   moovPosition          374137777.00
INFO:   width                 720.00
INFO:   height                406.00
INFO:   videocodecid          avc1
INFO:   audiocodecid          mp4a
INFO:   avcprofile            66.00
INFO:   avclevel              30.00
INFO:   aacaot                2.00
INFO:   videoframerate        25.00
INFO:   audiosamplerate       48000.00
INFO:   audiochannels         2.00
INFO: tags:
INFO:   ©too                 Lavf52.34.0
INFO: trackinfo:
INFO:   length                80710.00
INFO:   timescale             25.00
INFO:   language              und
INFO: sampledescription:
INFO:   sampletype            avc1
INFO:   length                154963968.00
INFO:   timescale             48000.00
INFO:   language              und
INFO: sampledescription:
INFO:   sampletype            mp4a
322102.333 kB / 2816.88 sec (87.2%)

Probablement une question d'accès en écriture dans /usr/share/tvdownloader.
Mais ne cherche pas, c'est pas normal de devoir écrire à cet emplacement.
Et, quoi qu'il en soit, ces problèmes devraient être résolus avec la 0.4.

Hors ligne

#138 Le 02/08/2010, à 17:51

chaoswizard

Re : TVDownloader: télécharger les médias du net !

Bon, j'ai corrigé cette histoire de plugins dans le home (ça sera donc pour la version 0.4).

@BmD_Online : Toi qui a l'air de savoir faire marcher rtmpdump, comment tu transformes les liens pour M6 ?
Ex :

rtmpe://m6dev.fcod.llnwd.net:443/a3100/d1/m6_100-mag_56110_300720101850.mp4

Ubuntu ==> Debian ==> Archlinux

Hors ligne

#139 Le 02/08/2010, à 18:15

BmD_Online

Re : TVDownloader: télécharger les médias du net !

chaoswizard a écrit :

Bon, j'ai corrigé cette histoire de plugins dans le home (ça sera donc pour la version 0.4).

@BmD_Online : Toi qui a l'air de savoir faire marcher rtmpdump, comment tu transformes les liens pour M6 ?
Ex :

rtmpe://m6dev.fcod.llnwd.net:443/a3100/d1/m6_100-mag_56110_300720101850.mp4

Youh, j'sais pas.
T'as essayé avec le modèle Arte que j'ai cité plus haut ?

Ca donnerait un truc du genre :
rtmpdump --host m6dev.fcod.llnwd.net --port 443 --protocol RTMP --app a3100/d1 --playpath m6_100-mag_56110_300720101850.mp4 --flv m6_100-mag_56110_300720101850.mp4

J'ai testé et ça ne marche pas.

Il faut voir avec Pascal92, il le fait dans son programme TVO, il doit avoir la méthode exacte.

Hors ligne

#140 Le 02/08/2010, à 21:17

pascal92

Re : TVDownloader: télécharger les médias du net !

Bonsoir,
Rien de particulier pour M6 et W9, inutile de parser l'URL avant, juste le player à indiquer.
Pour reprendre votre exemple :

rtmpdump -r "rtmpe://m6dev.fcod.llnwd.net:443/a3100/d1/m6_100-mag_56110_300720101850.mp4" -W "http://groupemsix.vo.llnwd.net/o24/u/replayrelease/libs/StatPlaylibrary2.swf" -e -o "Votre_chemin\m6_100-mag_56110_300720101850.mp4"

@+

Dernière modification par pascal92 (Le 02/08/2010, à 21:17)

Hors ligne

#141 Le 03/08/2010, à 00:23

olaf.10

Re : TVDownloader: télécharger les médias du net !

pascal92 a écrit :

Bonsoir,
Rien de particulier pour M6 et W9, inutile de parser l'URL avant, juste le player à indiquer.
Pour reprendre votre exemple :

rtmpdump -r "rtmpe://m6dev.fcod.llnwd.net:443/a3100/d1/m6_100-mag_56110_300720101850.mp4" -W "http://groupemsix.vo.llnwd.net/o24/u/replayrelease/libs/StatPlaylibrary2.swf" -e -o "Votre_chemin\m6_100-mag_56110_300720101850.mp4"

@+

Je me permets de corriger, il manque "/mp4:production/regienum/" :

rtmpdump -r "rtmpe://m6dev.fcod.llnwd.net:443/a3100/d1/mp4:production/regienum/m6_100-mag_56110_300720101850.mp4" -W "http://groupemsix.vo.llnwd.net/o24/u/replayrelease/libs/StatPlaylibrary2.swf" -e -o "Votre_chemin\m6_100-mag_56110_300720101850.mp4"

Dans µrecorder je n'indique aucun player (-W), j'imagine que je n'ai pas raison... je ferai des tests demain pour en avoir le coeur net.
Ça ne marche pas, sous Windows, sans cette option -W ?

Hors ligne

#142 Le 03/08/2010, à 05:01

BmD_Online

Re : TVDownloader: télécharger les médias du net !

olaf.10 a écrit :

Je me permets de corriger, il manque "/mp4:production/regienum/" :

rtmpdump -r "rtmpe://m6dev.fcod.llnwd.net:443/a3100/d1/mp4:production/regienum/m6_100-mag_56110_300720101850.mp4" -W "http://groupemsix.vo.llnwd.net/o24/u/replayrelease/libs/StatPlaylibrary2.swf" -e -o "Votre_chemin\m6_100-mag_56110_300720101850.mp4"

Ah ben voilà. Du coup, la commande décomposée comme pour Arte fonctionne :

rtmpdump --host m6dev.fcod.llnwd.net --port 443 --protocol RTMP --app a3100/d1 --playpath mp4:production/regienum/m6_100-mag_56110_300720101850.mp4 --flv m6_100-mag_56110_300720101850.mp4

Hors ligne

#143 Le 03/08/2010, à 05:26

pascal92

Re : TVDownloader: télécharger les médias du net !

olaf.10 a écrit :

Je me permets de corriger, il manque "/mp4:production/regienum/" :

rtmpdump -r "rtmpe://m6dev.fcod.llnwd.net:443/a3100/d1/mp4:production/regienum/m6_100-mag_56110_300720101850.mp4" -W "http://groupemsix.vo.llnwd.net/o24/u/replayrelease/libs/StatPlaylibrary2.swf" -e -o "Votre_chemin\m6_100-mag_56110_300720101850.mp4"

Dans µrecorder je n'indique aucun player (-W), j'imagine que je n'ai pas raison... je ferai des tests demain pour en avoir le coeur net.
Ça ne marche pas, sous Windows, sans cette option -W ?

Arf, je n'avais pas vérifié le lien original wink
Bon retour sieur Olaf
Concernant le player, je le met par sécurité, suivant les version de rtmpdump, il me semble que c'est préférable... (je suis descendu à la 2.2 sur TVO)
@+

Hors ligne

#144 Le 03/08/2010, à 08:17

chaoswizard

Re : TVDownloader: télécharger les médias du net !

Ok, merci à vous 3 !


Ubuntu ==> Debian ==> Archlinux

Hors ligne

#145 Le 03/08/2010, à 11:15

BmD_Online

Re : TVDownloader: télécharger les médias du net !

A propos de Pluzz, j'ai le même problème qu'avec TVO via Wine :
Seulement 195.9Mo sont téléchargés par fichier, puis plus rien. J'ai des émissions incomplètes.
Je viens de lancer manuellement msdl en mode verbose pour voir s'il y a un message d'erreur particulier. Je vous tiendrai au courant.

Hors ligne

#146 Le 03/08/2010, à 13:19

pascal92

Re : TVDownloader: télécharger les médias du net !

Étonnant ce problème avec ce type de lien,
Le problème sur Akamaistream c'est de s'y connecter, et de nombreux outils de téléchargement se plantent à ce niveau (question de protocole). Après ça roule normalement.
Et le resume lui doit fonctionner en cas de pépin.(option -c).

Dernière modification par pascal92 (Le 03/08/2010, à 13:22)

Hors ligne

#147 Le 03/08/2010, à 15:07

BmD_Online

Re : TVDownloader: télécharger les médias du net !

pascal92 a écrit :

Étonnant ce problème avec ce type de lien,
Le problème sur Akamaistream c'est de s'y connecter, et de nombreux outils de téléchargement se plantent à ce niveau (question de protocole). Après ça roule normalement.
Et le resume lui doit fonctionner en cas de pépin.(option -c).

Pour Pluzz ?
Voici ce que donne msdl en mode verbeux :

msdl -v -c mms://a988.v101995.c10199.e.vm.akamaistream.net/7/988/10199/3f97c7e6/ftvigrp.download.akamai.com/10199/cappuccino/production/publication/Autre/Autre/2010/S30/149838_questionmaison_20100731.wmv -o 149838_questionmaison_20100731.wmv

download [ 149838_questionmaison_20100731.wmv ]
url: mms://a988.v101995.c10199.e.vm.akamaistream.net/7/988/10199/3f97c7e6/ftvigrp.download.akamai.com/10199/cappuccino/production/publication/Autre/Autre/2010/S30/149838_questionmaison_20100731.wmv
Host: [ 81.52.170.54:554 ]    connected!
warning: No ETag!!
stream: video 0 RTP/AVP 96
stream: application 0 RTP/AVP 96
stream: audio 0 RTP/AVP 96
stream: video 0 RTP/AVP 96
file size = 211109571
play_duration = 2702
send_duration = 2698
# of packets = 73080
flags = 2
packet_size = 2888
min_packsize = 2888
video stream detected!!!!
audio stream detected!!!!
video stream detected!!!!
stream bitrate properties object
stream count = [0x3] [3]
audio streams: 1, video streams: 2
stream_id   = [0x1] [1]
max bitrate = [0x10716] [67350]
is audio stream
stream_id   = [0x2] [2]
max bitrate = [0x5f48c] [390284]
is video stream
stream_id   = [0x3] [3]
max bitrate = [0x2e96c] [190828]
is video stream
resume "149838_questionmaison_20100731.wmv" : cannot open file for resume
just get file from beginning.
download protocol: rtsp - wms

DL: 205400289/205400289 B -- 100%                      75.7K/s    Complete     
finished!!

FINISHED --00:45:24--

On a "file size = 211109571" mais le fichier final ne fait que 195.9Mo.
Et il précise "cannot open file for resume".

Hors ligne

#148 Le 03/08/2010, à 15:15

BmD_Online

Re : TVDownloader: télécharger les médias du net !

BmD_Online a écrit :

Et il précise "cannot open file for resume".

En relançant la commande, il propose de reprendre où il en était. Mais ne fait rien.
Apparemment, le resume fonctionnerait mais il ne va pas plus loin que 195.9Mo :

Pour commencer :

resume "149838_questionmaison_20100731.wmv": try to resume from 2698s
Range: npt=2692.945-2702.560
download protocol: rtsp - wms

resume: seek OK, start writing from 205397401 [0xc3e1d99]
DL: 205397401/211109571 B --  97%

Puis il dit avoir terminé, mais ne charge rien de plus.

Hors ligne

#149 Le 03/08/2010, à 16:01

chaoswizard

Re : TVDownloader: télécharger les médias du net !

TVO utilise aussi msdl ?
Si oui, c'est pi être un bug de msdl qu'il faudrait soumettre aux développeurs.


Ubuntu ==> Debian ==> Archlinux

Hors ligne

#150 Le 03/08/2010, à 16:25

pascal92

Re : TVDownloader: télécharger les médias du net !

Mais c'est normal big_smile
c'est la norme (erronée certes) du 1 Mo= 1024 Ko etc...

J'ai fait le download du même fichier avec la boite à outil de TVO,
Bizarrement j'ai une légère différence sur la taille du fichier :

download [ D:\Encodage\TVO\video\149838_questionmaison_20100731.wmv ]
Host: [ 80.15.233.140:554 ]    connected!
cygwin warning:
  MS-DOS style path detected: D:\Encodage\TVO\video\149838_questionmaison_201007
31.wmv
  Preferred POSIX equivalent is: /video/149838_questionmaison_20100731.wmv
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user's guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
resume "D:\Encodage\TVO\video\149838_questionmaison_20100731.wmv" : cannot open
file for resume
just get file from beginning.
Speed: 5.000
DL: 205400289/205400289 B -- 100%                      379.1K/s   Complete
finished!!

FINISHED --00:09:03--

ce qui me donne sous mon affreux Windows :
195 Mo (205 400 289 octets) !!!

Au passage après indexation ce fichier fait :143 Mo (150 652 627 octets)

et le mediainfo final :

General
Complete name                    : D:\Encodage\TVO\video\149838_questionmaison_20100731_1.wmv
Format                           : Windows Media
File size                        : 144 MiB
Duration                         : 44mn 57s
Overall bit rate mode            : Constant
Overall bit rate                 : 447 Kbps
Maximum Overall bit rate         : 258 Kbps
Encoded date                     : UTC 2010-07-26 17:17:03.500
Encoder                          : MANREO Encoder
Profil                           : FTVI-350-16-9

Video #1
ID                               : 2
Format                           : VC-1
Format profile                   : MP@ML
Codec ID                         : WMV3
Codec ID/Info                    : Windows Media Video 9
Codec ID/Hint                    : WMV3
Description of the codec         : Windows Media Video 9
Duration                         : 44mn 57s
Bit rate mode                    : Constant
Bit rate                         : 377 Kbps
Width                            : 384 pixels
Height                           : 216 pixels
Display aspect ratio             : 16:9
Frame rate                       : 25.000 fps
Bit depth                        : 8 bits
Scan type                        : Progressive
Bits/(Pixel*Frame)               : 0.182
Stream size                      : 121 MiB (84%)
Language                         : French

Video #2
ID                               : 3
Format                           : VC-1
Format profile                   : MP@LL
Codec ID                         : WMV3
Codec ID/Info                    : Windows Media Video 9
Codec ID/Hint                    : WMV3
Description of the codec         : Windows Media Video 9
Duration                         : 44mn 57s
Bit rate mode                    : Constant
Bit rate                         : 177 Kbps
Width                            : 320 pixels
Height                           : 240 pixels
Display aspect ratio             : 4:3
Frame rate                       : 29.970 fps
Bit depth                        : 8 bits
Scan type                        : Progressive
Bits/(Pixel*Frame)               : 0.077
Stream size                      : 56.9 MiB (40%)
Language                         : French

Audio
ID                               : 1
Format                           : WMA
Format version                   : Version 2
Codec ID                         : 161
Codec ID/Info                    : Windows Media Audio
Description of the codec         : Windows Media Audio 9.1 -  64 kbps, 44 kHz, stereo (A/V) 1-pass CBR
Duration                         : 44mn 57s
Bit rate mode                    : Constant
Bit rate                         : 64.0 Kbps
Channel(s)                       : 2 channels
Sampling rate                    : 44.1 KHz
Bit depth                        : 16 bits
Stream size                      : 20.6 MiB (14%)
Language                         : French

Fichier vérifié et bien complet en lecture smile

Alors pour ton resume qui ne se fait pas...
Il y a un stream qui n'est pas téléchargé par msdl :stream: application 0 RTP/AVP 96
d'où la différence de taille

Dernière modification par pascal92 (Le 03/08/2010, à 17:20)

Hors ligne