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.

#276 Le 07/06/2013, à 18:37

Nai2Lille

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

k3c a écrit :

Rien ne sait télécharger M6, car ils ont mis des DRM, et c'est loin d'être trivial à résoudre.

Ah ok sad

Malheureusement la discussion est en anglais... hmm

k3c a écrit :

Edit2 : KSV a mis à jour son script il y a 9 jours, il faut que je mette à jour ma version Python
https://github.com/K-S-V/Scripts
et que je lance son programme avec --update

J'ai téléchargé la dernière version du script, mais la mise à jour de Python ne se fait elle pas comme n'importe quelle mise à jour avec le "Gestionnaire de mise à jour" ?


OS : Ubuntu 13.04 32 bits
Processeur : Intel® Celeron(R) CPU 550 @ 2.00GHz
Mémoire : 2Gio
Carte graphique : Intel® 965GM x86/MMX/SSE2

Hors ligne

#277 Le 07/06/2013, à 19:40

11gjm

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

Bonjour ,

@Nai2Lille : régulièrement je lance la commande ; sous win je n'ai pas de "Gestionnaire de MàJ" .

php AdobeHDS.php --update

A+ .

Hors ligne

#278 Le 07/06/2013, à 20:30

11gjm

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

Bonjour ,

" Hors sujet "
Le FMI s'est planté !!!

ffmpeg -i "http://podcast.bfmbusiness.com/channel78/20130607_experts_1.mp3" -f mp3 "20130607_experts.mp3"
...

A+ .

Hors ligne

#279 Le 07/06/2013, à 21:27

k3c

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

>>>J'ai téléchargé la dernière version du script, mais la mise à jour de Python ne se fait elle pas comme n'importe quelle mise à jour avec le "Gestionnaire de mise à jour" ?

Si tu veux changer de version de Python, il te faudra le faire à la main, ou cela se fera lors d'une nouvelle version d'Ubuntu.

Par contre un script Python ou Php, quand il change de version, c'est à toi de le mettre à jour.
Mais KSV a pensé à cela, tu fais juste, comme indiqué par 11gjm

php AdobeHDS.php --update

et ça t'installe la dernière version.


Archlinux sur Xiaomi Air 13

Hors ligne

#280 Le 09/06/2013, à 11:34

11gjm

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

Bonjour ,

Pour ceux qui seraient intéressés : "api.php , 1.8" ( pour Linux et Windows ) à :
http://forum.wiziwig.eu/threads/49818-S … ost1599229

Linux
http://www.mediafire.com/?06hdmidahyk18b5

Windows
http://www.mediafire.com/?20cvch5svpkf9n0

Cordialement .

Dernière modification par 11gjm (Le 09/06/2013, à 11:37)

Hors ligne

#281 Le 09/06/2013, à 16:50

11gjm

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

Bonjour ,

Modifié le 12 juin à 13H .

Dany Boon - Le pitbull ( 5mn45 )

http://www.youtube.com/watch?v=fyX3D-XW5os

Cordialement .

Dernière modification par 11gjm (Le 12/06/2013, à 11:55)

Hors ligne

#282 Le 09/06/2013, à 21:00

pacome

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

Bonsoir,

J'ai fait quelques recherches pour trouver ce qui clochait avec les replays des experts.
tcpdump et ngrep m'ont amené à tester ce player swf ( http://www.wat.tv/images/v40/LoaderExportV3.swf ) mais sans succès pour le moment.

Par contre à force d'essayer en SD puis en HD (pour les traces), j'ai remarqué que je n'avais pas non plus la vidéo en HD dans le navigateur (les lags, j'ai l'habitude, mais là pas d'image du tout!), et qu'en plus beaucoup de commentaires (sous la vidéo...) signalaient précisément ce problème!
Le dernier commentaire indique que ça (a) fonctionne(é) le 7/6, mais le script rencontre toujours le même problème.

Si toutefois certains d'entre-vous souhaitent télécharger la version SD, il suffit de commenter les lignes 234 à 237 du script v0.9.4.5 et de rajouter HD = False au même niveau d'indentation (dans une copie du script: ce n'est qu'une verrue temporaire!):

#    try:
#        HD = videoInfos["media"]["files"][0]["hasHD"]
#    except:
#        HD = False
    HD = False

Plus simplement avec sed (dans le répertoire où se trouve le script):

sed -e '234,237 s/^\(.*\)/#\1/' -e '238i\    HD = False' watdl.py > watdlSD.py
chmod 775 watdlSD.py
./watdlSD.py -V http://videos.tf1.fr/les-experts-manhattan/episode-6-saison-09-la-dame-du-lac-7979209.html

J'ai obtenu:

INFO:	20:34:18: verbose mode
INFO:	20:34:18: url: ['http://videos.tf1.fr/les-experts-manhattan/episode-6-saison-09-la-dame-du-lac-7979209.html']
INFO:	20:34:20: rtmpdump --resume --rtmp "rtmpe://wske.wat.tv/ondemand/mp4:vod/H264-384x288/41/61/10564161.h264" --port 443 --timeout 10 --swfVfy http://www.wat.tv/images/v40/PlayerWat.swf -o "episode-6-saison-09-la-dame-du-lac-7979209-10564161.mp4"
INFO:	21:19:32: Téléchargement incomplet: nouvel essai dans 3s...
INFO:	21:19:35: rtmpdump --resume --rtmp "rtmpe://wske.wat.tv/ondemand/mp4:vod/H264-384x288/41/61/10564161.h264" --port 443 --timeout 10 --swfVfy http://www.wat.tv/images/v40/PlayerWat.swf -o "episode-6-saison-09-la-dame-du-lac-7979209-10564161.mp4"
INFO:	21:22:03: Téléchargement terminé
INFO:	21:22:03: conversion ffmpeg fileName → tmpFileName (pour corriger le conteneur)
INFO:	21:22:19: episode-6-saison-09-la-dame-du-lac-7979209-10564161.mp4 est maintenant disponible!

Et un fichier SD (640×360) de 124Mo.

À+

Hors ligne

#283 Le 10/06/2013, à 12:44

11gjm

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

Bonjour ,

@Pacome : Résultats de mes essais à l'aide de batchs sous Win ( pas par python ) .
Pour la vidéo :

http://videos.tf1.fr/les-experts-manhattan/episode-6-saison-09-la-dame-du-lac-7979209.html

---
captvty donne 2 flux possibles :
_ episode-6-saison-09---la-dame-du-lac
_ episode-6-saison-09---la-dame-du-lac-hd
---

Avec ta ligne , de commandes , précédente : "rtmpdump...mp4" , en ayant remplacé --port 443 par --port 1935 .
Ça fonctionne . Obtenu fichier .mp4 ( AVC 640x360 ; AAC 48 Khz ) ( taille : 127.333 Ko ) .

Cordialement .

Dernière modification par 11gjm (Le 10/06/2013, à 12:46)

Hors ligne

#284 Le 10/06/2013, à 20:40

k3c

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

@ pacome

>>>Si toutefois certains d'entre-vous souhaitent télécharger la version SD, il suffit de commenter les lignes 234 à 237 du script v0.9.4.5 et de rajouter HD = False au même niveau d'indentation (dans une copie du script: ce n'est qu'une verrue temporaire!):

On pourrait aussi passer SD en 2 ème paramètre, et dans ce cas, on ne prend pas la version HD ?


Archlinux sur Xiaomi Air 13

Hors ligne

#285 Le 10/06/2013, à 21:19

11gjm

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

Bonjour ,

Concernant "PlayerWat.swf" ne faudrait-il pas indiquer "PlayerWat.swf?revision=4.1.148" ?

A+ .

Hors ligne

#286 Le 11/06/2013, à 12:07

11gjm

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

Bonjour ,

@Tous : INFO .

VLC 2.0.7 vient de sortir .
VLC media player : http://www.videolan.org/vlc/

Dans la page se rendre au paragraphe "Téléchargements officiels de VLC média player" ,
afin de connaître les diverses possibilités .

A+ .

Hors ligne

#287 Le 11/06/2013, à 16:51

11gjm

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

Bonjour ,

@Pacome : essai impossible ; PB d'indentation : en direct ou avec sed .

A+ .

Hors ligne

#288 Le 11/06/2013, à 20:27

pacome

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

Salut!

@k3c & 11gjm:
Bonne idée une l'option supplémentaire! ça évite les "verrues" et les erreurs d'indentation... wink

Voici donc une version 0.9.4.6 de watdl.py (v0.9.4.5) qui intègre l'option -s, --standard-definition qui ne recherche pas de version Haute-Définition de la vidéo:

#!/usr/bin/python
#-*- coding:utf-8 -*-
# TF1 TMC NT1 HD1 V0.9.4.6 par k3c, bibichouchou et pacome

# args & log
import argparse
from time import localtime, strftime
import logging

import subprocess, re, sys, shlex
import socket
import urllib2                  # → urlopen & exceptions
import hashlib                  # → sha256sum
import hmac
import zlib
import StringIO
import time, md5, random, urllib2, json
import bs4 as BeautifulSoup
import os                       # → os.rename
from urlparse import urlparse

# global var
scriptName='watdl.py'
scriptVersion='0.9.4.6'

# programmes externes utilisés
ffmpegEx='ffmpeg'               # ou avconv
rtmpdumpEx='rtmpdump'
curlEx='curl'

# Player swf
defaultSwfPlayerUrl='http://www.wat.tv/images/v40/PlayerWat.swf'
KEY = "Genuine Adobe Flash Player 001"

listeUserAgents = [ 
    'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1',
    'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1',
    'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.',
    'Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori',
    'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1',
    'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.940.0 Safari/535.8' ]

WEBROOTWAT="http://www.wat.tv"
wat_url="/web/"
jsonVideosInfos=""

# random user agent
ua=random.choice(listeUserAgents)

# global logger
log=logging.getLogger(__name__)

def checkExternalProgram(prog, optArg='', expectedValue=''):
    """ Permet de vérifier la présence des programmes externes requis """
    log.debug('→checkExternalProgram(%s, %s, %s)'%(prog, optArg, expectedValue))
    args=shlex.split('%s %s' % (prog, optArg))
    try:
        process=subprocess.Popen(args,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.STDOUT)
        stdout, stderr = process.communicate()
        if expectedValue == '':
            return True
        else:
            if expectedValue in stdout: # à améliorer pour versions > ...
                return True
            else:
                return False
    except OSError:
        log.error('Le programme %s n\'est pas présent sur votre système' % (prog))
        return False

def get_soup(url, referer, ua):
    """ on récupère la soupe """
    req  = urllib2.Request(url)
    req.add_header('User-Agent', ua)
    req.add_header('Referer', referer)
    soup = urllib2.urlopen(req).read()
    log.debug('←get_soup(%s, %s, %s): %s' % (url, referer, ua, soup))
    return soup

def get_wat(id, HDFlag):
    """la fonction qui permet de retrouver une video sur wat"""
    def base36encode(number):
        if not isinstance(number, (int, long)):
            raise TypeError('number must be an integer')
        if number < 0:
            raise ValueError('number must be positive')
        alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        base36 = ''
        while number:
            number, i = divmod(number, 36)
            base36 = alphabet[i] + base36
        return base36 or alphabet[0]
    if HDFlag:
        wat_url = "/webhd/"
    else:
        wat_url = "/web/"
    ts = base36encode(int(time.time())-60)
    timesec = hex(int(ts, 36))[2:]
    while(len(timesec)<8):
        timesec = "0"+timesec
    token = md5.new(
        "9b673b13fa4682ed14c3cfa5af5310274b514c4133e9b3a81e6e3aba00912564" +
        wat_url + str(id) + "" + timesec).hexdigest()
    id_url1 = (WEBROOTWAT + "/get" + wat_url + str(id) + "?token=" + token +
    "/" + str(timesec) + "&country=FR&getURL=1")
    log.debug('←get_wat(%s, %s):%s' %(id, HDFlag, id_url1))
    return id_url1

def swfPlayerHashAndSize(swfPlayerUrl):
    """
    Calcule et renvoie le tuple (hash, taille) du player swf
    ← (swfHash, swfSize)
    """
    global KEY
    try:
        swfPlayer= urllib2.urlopen(swfPlayerUrl).read()
    except (ValueError, urllib2.URLError):
        log.error('→swfPlayerHashAndSize(%s): Url invalide!' % (swfPlayerUrl))
        raise
    except urllib2.HTTPError:
        log.error('→swfPlayerHashAndSize(%s): Pb http!' % (swfPlayerUrl))
        raise

    swfPlayerHash=hashlib.sha256(swfPlayer).hexdigest()
    if type(swfPlayer) is str:
        swfData=StringIO.StringIO(swfPlayer)
    swfData.seek(0, 0)
    magic=swfData.read(3)
    if magic != "CWS":
        log.error("Pas de CWS...")
        raise ValueError('NoCWS')
    else:
        unzPlayer="FWS" + swfData.read(5) + zlib.decompress(swfData.read())
        unzPlayerSize=len(unzPlayer)
        unzPlayerHash = hmac.new(KEY, unzPlayer, hashlib.sha256).hexdigest()
    log.debug('←computeSwfPlayerHash(%s):(%s, %s)' %(
            swfPlayerUrl, unzPlayerHash, unzPlayerSize))
    return (unzPlayerHash, unzPlayerSize)

def rtmpDownload(rtmpUrl,
                 swfPlayerUrl,
                 swfForceRefresh,
                 swfComputeHashSize,
                 fileName,
                 swfHash=None,
                 swfSize=None):
    """ Appel de rtmpdump avec traitement des options et reprise (récursif)
    """
    log.debug('→rtmpDownload(%s, %s, %s, %s, %s, %s, %s)' % (
            rtmpUrl, swfPlayerUrl, swfForceRefresh, swfComputeHashSize,
            fileName, swfHash, swfSize))
    rtmpCmd = '%s --resume --rtmp "%s" --port 443 --timeout 10' % (
        rtmpdumpEx, rtmpUrl)    # initialisation de la commande

    if swfComputeHashSize:
        if not swfHash and not swfSize: # pour ne pas recalculer en récursion
            try:
                (swfHash, swfSize)=swfPlayerHashAndSize(swfPlayerUrl)
            except:
                log.warning('Impossible de calculer le hash/size du player swf!')
                log.info('calcul du hash/size par %s' % (rtmpdumpEx))
                return rtmpDownload(rtmpUrl, swfPlayerUrl, swfForceRefresh,
                                    False, fileName)
            if swfForceRefresh:
                log.warning('pas encore codé!')
                # et je ne sais pas si ça le sera... ;)
            rtmpCmd += ' --swfhash %s --swfsize %i' % (swfHash, swfSize)
    else:
        if swfForceRefresh:
            rtmpCmd += ' --swfVfy %s --swfAge 0' % (swfPlayerUrl)
        else:
            rtmpCmd += ' --swfVfy %s' % (swfPlayerUrl)
    rtmpCmd += ' -o "%s"' % (fileName)
    log.info(rtmpCmd)
    rtmpCall = shlex.split(rtmpCmd)
    rtmpProc = subprocess.Popen(rtmpCall,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.STDOUT)
    (stdout, stderr) = rtmpProc.communicate()
    if rtmpProc.returncode == 1:   # sortie en erreur →
        if swfComputeHashSize:     # on ré-essaye avec le calcul par rtmpdump
            return rtmpDownload(rtmpUrl, swfPlayerUrl, swfForceRefresh,
                                 False, fileName)
        elif not swfForceRefresh: # on ré-essaye en forçant le recalcul
                return rtmpDownload(rtmpUrl, swfPlayerUrl, True,
                                    False, fileName)
        else:               # rtmpdump computation & refresh KO →
            log.warning ('Veuillez ré-essayer plus tard (pb réseau ou algo?)')
    elif rtmpProc.returncode == 2:   # téléchargement incomplet →
        log.info('Téléchargement incomplet: nouvel essai dans 3s...')
        time.sleep(3)                # petite temporisation
        if swfComputeHashSize:       # pas la peine de les recalculer
            return rtmpDownload(rtmpUrl, swfPlayerUrl, swfForceRefresh,
                                swfComputeHashSize, fileName, swfHash, swfSize)
        elif swfForceRefresh:   # pas la peine de le refaire
            return rtmpDownload(rtmpUrl, swfPlayerUrl, False,
                                swfComputeHashSize , fileName)
        else:                   # on rappelle avec les mêmes options
            return rtmpDownload(rtmpUrl, swfPlayerUrl, swfForceRefresh,
                                swfComputeHashSize, fileName, swfHash, swfSize)
    else:
        return rtmpProc.returncode # = 0

def downloadWatVideo(videoUrl,
                     swfPlayerUrl,
                     swfForceRefresh,
                     swfComputeHashSize,
                     standardDefinition):
    """ recuperation de vidéos sur TF1/TMC/NT1/HD1 (donc WAT)"""
    log.debug('→downloadWatVideo(%s, %s, %s, %s)' % (
            videoUrl, swfPlayerUrl, swfForceRefresh, swfComputeHashSize))
    # timeout en secondes
    socket.setdefaulttimeout(90)
    debut_id = ''
    html = urllib2.urlopen(videoUrl).read()
    # log.debug('html=%s' %(html))
    nom = videoUrl.split('/')[-1:][0]
    no = nom.split('.')[-2:][0]
    soup = BeautifulSoup.BeautifulSoup(html)
    log.debug('soup=%s' %(soup))
    site = urlparse(videoUrl).netloc
    if 'tmc.tv' in site or 'tf1.fr' in site:
        debut_id = str(soup.find('div', attrs={'class' : 'unique' }))
    if 'nt1.tv' in site or 'hd1.tv' in site:
        debut_id = str(soup.find('section', attrs={'class' : 'player-unique' }))
    id = [x.strip() for x in re.findall("mediaId :([^,]*)", debut_id)][0]
    referer = [x.strip() for x in re.findall('url : "(.*?)"', debut_id)][0]
    jsonVideoInfos = get_soup(WEBROOTWAT+'/interface/contentv3/'+id, referer, ua)
    videoInfos = json.loads(jsonVideoInfos)
    log.debug('videoInfos=%s' % (videoInfos))
    if not standardDefinition:
        try:
            HD = videoInfos["media"]["files"][0]["hasHD"]
        except:
            HD = False
    else:
        HD = False

    NumberOfParts = len(videoInfos["media"]["files"])
    ListOfIds = []
    for iPart in range(NumberOfParts):
        ListOfIds.append(videoInfos["media"]["files"][iPart]["id"])
    log.debug('NumberOfParts=%s' % (NumberOfParts))
    for PartId in ListOfIds:
        id_url1 = get_wat(PartId, HD)
        req  = urllib2.Request(id_url1)
        req.add_header('User-Agent', ua)
        req.add_header('Referer', referer)
        data = urllib2.urlopen(req).read()
        # log.debug('data=%s' % (data))
        if data[0:4] == 'http':
            if not checkExternalProgram(curlEx):
                log.warning('Ce script requiert %s' % (curlEx))
            else:
                arguments = '%s "%s" -C - -L -g -A "%s" -o "%s.mp4"' % (
                    curlEx, data, ua, no + "-" + str(PartId))
                log.info(arguments)
                process = subprocess.Popen(arguments,
                                           stdout=subprocess.PIPE,
                                           shell=True).communicate()[0]
            # no retry loop?
        if data[0:4] == 'rtmp':
            # vérification de la présence de rtmpdump v2.4 ou v2.5
            if not (checkExternalProgram(rtmpdumpEx, '-help', 'v2.4') or 
                    checkExternalProgram(rtmpdumpEx, '-help', 'v2.5')): # pas top
                log.warning('Ce script requiert %s v2.4 ou v2.5' % (rtmpdumpEx))
            else:
                if '.hd' in data:
                    rtmpUrl = re.search('rtmpte://(.*)hd', data).group(0)
                if '.h264' in data:
                    rtmpUrl = re.search('rtmpte://(.*)h264', data).group(0)
                # log.debug('rtmpUrl=%s'%(rtmpUrl))
                rtmpUrl = rtmpUrl.replace('rtmpte','rtmpe')
                fName=str(no) + '-' + str(PartId) # nom du fichier sans extension
                fileName=fName+'.mp4'             # nom du fichier avec extension
                if rtmpDownload(rtmpUrl, swfPlayerUrl, swfForceRefresh,
                                swfComputeHashSize, fileName) == 0:
                    log.info('Téléchargement terminé')
                    # ffmpeg est-il disponible?
                    if not checkExternalProgram(ffmpegEx):
                        log.info("L'installation de ffmpeg sur votre système permettrait de corriger automatiquement le conteneur de la vidéo (flash→mp4).")
                    else:
                        log.info('conversion ffmpeg fileName → tmpFileName (pour corriger le conteneur)')
                        tmpFileName = fName+'.tmp.mp4'
                        ffmpegCmd = '%s -i "%s" -acodec copy -vcodec copy "%s"' % (ffmpegEx, fileName, tmpFileName)
                        ffmpegCall = shlex.split(ffmpegCmd)
                        ffmpegProc = subprocess.Popen(ffmpegCall,
                                                      stdout=subprocess.PIPE,
                                                      stderr=subprocess.STDOUT)
                        (stdout, stderr) = ffmpegProc.communicate()
                        if ffmpegProc.returncode != 0:
                            log.error('La conversion ffmpeg s\'est terminée avec le code d\'erreur %i.\nLe fichier %s est néanmois disponible' % (
                                    ffmpegProc.returncode, fileName))
                        else:
                            log.debug('remplacement tmpFileName → fileName')
                            os.rename(tmpFileName, fileName)
                        log.info('%s est maintenant disponible!' % (fileName))
                else:
                    log.info('Problème réseau ou algo?')

def main():
    """
    Analyse les arguments et lance le téléchargement
    """
    parser=argparse.ArgumentParser(prog=scriptName,
                                   description='Récuperation de vidéos sur TF1/TMC/NT1/HD1 (donc WAT).',
                                   version='%s v%s' % (scriptName,
                                                       scriptVersion))
    verbOrLog=parser.add_mutually_exclusive_group()
    verbOrLog.add_argument('-V', '--verbose',
                           help="affiche des messages",
                           dest='verbose',
                           action='store_true',
                           default=False)
    verbOrLog.add_argument('-l', '--log',
                           help="logue les messages",
                           dest='log',
                           action='store_const',
                           const='%s-%s.log' % (scriptName,
                                                strftime("%Y%m%d%H%M%S",
                                                         localtime())),
                           metavar='FILE')
    parser.add_argument('-p', '--swf-player-url',
                        help='url du player swf à utiliser (défaut= %s)' % (defaultSwfPlayerUrl),
                        dest='swfPlayerUrl',
                        default=defaultSwfPlayerUrl,
                        action='store',
                        metavar='URL')
    parser.add_argument('-f', '--swf-force-refresh',
                        help='force la vérification du hash/size du player swf (met éventuellement à jour ~/.swfinfo)',
                        dest='swfForceRefresh',
                        default=False,
                        action='store_true')
    parser.add_argument('-c', '--swf-compute-hash-size',
                        help='calcul du hash/size par le script',
                        dest='swfComputeHashSize',
                        default=False,
                        action='store_true')
    parser.add_argument('-s', '--standard-definition',
                        help='ne recherche pas de version Haute-Définition',
                        dest='standardDefinition',
                        default=False,
                        action='store_true')
    parser.add_argument('url',
                        help='url de la page de la video',
                        metavar='URL',
                        nargs='+')
    args=parser.parse_args()

    if args.verbose:
        logging.basicConfig(format='%(levelname)s:\t%(asctime)s: %(message)s',
                            datefmt='%H:%M:%S',
                            level=logging.INFO)
        log.info('verbose mode')
    else:
        if args.log:
            logging.basicConfig(filename=args.log,
                                format='%(levelname)s:\t%(asctime)s: %(message)s',
                                datefmt='%H:%M:%S',
                                level=logging.DEBUG)
            log.info(args.log)
        else:
            logging.basicConfig(format='%(message)s',
                                datefmt='%H:%M:%S',
                                level=logging.WARNING)
    if args.url:
        for url in args.url:
            log.info('url: %s' % (args.url))
            downloadWatVideo(url,
                             args.swfPlayerUrl,
                             args.swfForceRefresh,
                             args.swfComputeHashSize,
                             args.standardDefinition)

if __name__ == "__main__":
    main()

(testée avec succès sur l'épisode "La Dame du Lac" SD)

@11gjm:
J'ai essayé différentes variations de l'url du player (avec l'option -p) comme celle que tu proposes, mais sans succès...
As-tu réussi à récupérer une version HD lisible de cet épisode avec captvty (_ episode-6-saison-09---la-dame-du-lac-hd)?

À+

Hors ligne

#289 Le 11/06/2013, à 22:37

11gjm

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

Bonjour ,

@Pacome :

1) la vidéo que j'ai téléchargée à partir de ton lien rtmpe.... => SD ; pas la HD .
2) J'avais entré l'adresse http... dans captvty , et j'avais obtenu les données pour SD et HD
3) Aujourd'hui captvty ne voit plus rien (???) .
4) Voici des infos nouvelles , tirées à partir de :

---
http://videos.tf1.fr/les-experts-manhattan/episode-10-saison-09-bar-clandestin-8000620.html
---
En regardant à l'intérieur du fichier vidéo , j'ai trouvé :
http://www.wat.tv/swfpu/250250nIc0K1110584041
que j'ai entré dans firefox

J'ai obtenu
http://www.wat.tv/images/v40/LoaderExportV3.swf?revision=4.1.170&baseUrl=www.wat.tv&v40=1&videoId=10584041&playerType=tf1Player&browser=firefox&context=swfpu&referer=undefined&ts=mo8z9x&oasTag=WAT%2Ftv%2Ft%2Fcatchup%2Fles-experts-manhattan&contextExport=swfpu&embedMode=direct&isStartAd=1&ad20=1&isOverlay=1&isAd=1&isEndAd=1
---

Nouveau : swf?revision=4.1.170

Je continue mes recherches .

Merci , pour v0.9.4.6 .

Cordialement .

Édit : la vidéo "episode-6-saison-09-la-dame-du-lac-7979209" n'est plus visible en direct .

Dernière modification par 11gjm (Le 11/06/2013, à 23:50)

Hors ligne

#290 Le 12/06/2013, à 11:02

thom83

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

Bonjour,

J'ai fait un essai pour l'épisode 10 de la même série. Sans l'option «-s», il y a des messages d'erreur dont la fin est

File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: No proxy for this secured delivery.

Avec l'option, cela fonctionne, mais avec une qualité pour téléphone portable (120.7 Mo).

Hors ligne

#291 Le 12/06/2013, à 11:57

11gjm

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

Bonjour ,

@thom83 : d'où sors-tu cette option "-s" , à quoi serts-t-elle ?

Cordilalement .

Hors ligne

#292 Le 12/06/2013, à 12:55

thom83

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

@ 11gjm
Cest simple, au #288 ci-dessus :

pacome a écrit :

Voici donc une version 0.9.4.6 de watdl.py (v0.9.4.5) qui intègre l'option -s, --standard-definition qui ne recherche pas de version Haute-Définition de la vidéo:

J'ai donc essayé avec le succès que j'ai indiqué.

Hors ligne

#293 Le 12/06/2013, à 13:04

11gjm

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

Bonjour à tous ,

@thom83 : Merci , j'avais zappé l'info .

@Pacome : Ci-dessous les tests concernant "epi10_sai9_experts" .

"...\python.exe" "watdl_0946.py" -V -s "http://videos.tf1.fr/les-experts-manhattan/episode-10-saison-09-bar-clandestin-8000620.html"
INFO:   13:13:28: verbose mode
INFO:   13:13:28: url: ['http://videos.tf1.fr/les-experts-manhattan/episode-10-saison-09-bar-clandestin-8000620.html']
INFO:   13:13:29: rtmpdump --resume --rtmp "rtmpe://wske.wat.tv/ondemand/mp4:vod/H264-384x288/40/41/10584041.h264" --port 443 --timeout 10 --swfVfy http://www.wat.tv/images/v40/PlayerWat.swf -o "episode-10-saison-09-bar-clandestin-8000620-10584041.mp4"
---
INFO:   13:18:41: Téléchargement incomplet: nouvel essai dans 3s...
INFO:   13:18:44: rtmpdump --resume --rtmp "rtmpe://wske.wat.tv/ondemand/mp4:vod/H264-384x288/40/41/10584041.h264" --port 443 --timeout 10 --swfVfy http://www.wat.tv/images/v40/PlayerWat.swf -o "episode-10-saison-09-bar-clandestin-8000620-10584041.mp4"
---
INFO:   13:22:30: Téléchargement terminé
INFO:   13:22:30: conversion ffmpeg fileName  tmpFileName (pour corriger le conteneur)
Traceback (most recent call last):
  File "watdl_0946.py", line 380, in <module>
    main()
  File "watdl_0946.py", line 377, in main
    args.standardDefinition)
  File "watdl_0946.py", line 300, in downloadWatVideo
    os.rename(tmpFileName, fileName)
WindowsError: [Error 183] Impossible de créer un fichier déjà existant

OBTENU 2 fichiers :
episode-10-saison-09-bar-clandestin-8000620-10584041.tmp.mp4 ( 117.869 ko )
episode-10-saison-09-bar-clandestin-8000620-10584041.mp4 ( 118.603 ko ) <= vidéo OK
---

Avec captvty : rtmpe... .h264 (port 443) => vidéo ( environ 120 Mo )
1er essai = epi10_sai9_experts.tmp.flv ( 66.392 ko ) <= Arrêt
2ème essai = epi10_sai9_experts.flv (118.602 ko ) <= vidéo OK

Cordialement .

Hors ligne

#294 Le 12/06/2013, à 21:47

pacome

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

Bonsoir,

Je suis en train de suivre les indications de pedrogaza pour installer captvty: je n'ai pas grand espoir que ça fonctionne (ben tiens, confirmation en direct: l'install de .net a foiré)... en tout cas pas tout de suite wink

Par contre en allant récupérer captvty je suis tombé sur ce message:

captvty.fr a écrit :

10/06 Certains contenus haute définition de TF1 sont inexploitables (seule la piste audio est présente) en raison d'un problème technique sur la plate-forme d'hébergement WAT.

Donc pour le moment seule la SD (aka «qualité pour téléphone portable» hmm) est disponible.

@thom83:
L'erreur que tu as rencontrée (#290) est d'ailleurs peut-être liée à ce problème, je vais faire des essais.

@11gjm:
Celle-ci par contre (#293) est due au fait que je n'ai pas géré la présence d'un fichier de même nom: à rajouter dans la version suivante donc.

À+

Hors ligne

#295 Le 12/06/2013, à 22:43

11gjm

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

Bonjour ,

@Pacome :  Merci pour ton travail .

Cordialement .

Hors ligne

#296 Le 13/06/2013, à 17:35

Nai2Lille

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

php AdobeHDS.php --update

Ah wé ! Super ! big_smile
J'étais allé chercher le script sur le site cité, mais c'est plus simple ainsi ! smile
Je précise, même si j'y ai pensé tout seul, qu'il faut se placer dans le dossier contenant AdobeHDS.php pour que ça marche smile

Par contre, en allant sur S10Ep09 Manhattan, HDS Link Detector me trouve rien... hmm
J'ai oublié une info ?
Il me semblait que seules les vidéos du groupe M6 n'étaient pas téléchargeables...

Merci en tout cas pour le suivi wink


OS : Ubuntu 13.04 32 bits
Processeur : Intel® Celeron(R) CPU 550 @ 2.00GHz
Mémoire : 2Gio
Carte graphique : Intel® 965GM x86/MMX/SSE2

Hors ligne

#297 Le 13/06/2013, à 18:02

k3c

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

@ Nai2Lille

Il y a en gros 3 façons de diffuser de la vidéo et donc de télécharger
1) rtmpdump pour les flux en rtmp:// et les variantes comme rtmpe...
2) curl ou msdl pour les vidéos "simples"
3) AdobeHDS pour le Http Dynamic Streaming d'Adobe

cela étant dit, je me prends une erreur 403 avec le script de pacome à l'heure actuelle :-(

Edit : Bon finalement ça marche

et donc je note que la commande lancée par le script est (attention, cette commande ne marchera pas longtemps, le script en créera une autre, analogue mais différente)

rtmpdump --resume --rtmp rtmpe://wske.wat.tv/ondemand/mp4:get/3/HD-1280x720/40/41/10584041.hd --port 443 --timeout 10 --swfVfy http://www.wat.tv/images/v40/PlayerWat.swf -o episode-10-saison-09-bar-clandestin-8000620-10584041.mp4

donc cette vidéo se télécharge part retmpdump, ce n'est pas du Adobe Http Dynamic  Streaming (qui découpe en morceaux, et recolle tout à la fin), et Adobehds.php a raison de ne rien trouver.

Dernière modification par k3c (Le 13/06/2013, à 18:58)


Archlinux sur Xiaomi Air 13

Hors ligne

#298 Le 13/06/2013, à 18:28

11gjm

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

Bonjour ,

@Nai2Lille : Pour INFO .


> même si j'y ai pensé tout seul, qu'il faut se placer dans le dossier contenant AdobeHDS.php pour que ça marche

Là , tu touches aux bases de la connaissance des batchs ou scripts .

php étant dans la variable d'environnement , on n'écrit que php .
MAIS , si elle ne l'était pas il faudrait écrire : "x:\toto\php.exe" .

Concernant "AdobeHDS.php" , tu n'est pas obligé de le lancer à partir du répertoire où il réside .
Tu peux écrire : "y:\patati\AdobeHDS.php" .

Par suite , la commande à passer serait du type :

php "y:\patati\AdobeHDS.php"  --update
ou
"x:\toto\php.exe" "y:\patati\AdobeHDS.php"  --update

Cordialement .

Dernière modification par 11gjm (Le 13/06/2013, à 18:29)

Hors ligne

#299 Le 13/06/2013, à 18:59

k3c

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

php est connu par contre,

gg@gg-SATELLITE-L755:~$ which php
/usr/bin/php

Archlinux sur Xiaomi Air 13

Hors ligne

#300 Le 13/06/2013, à 19:34

Nai2Lille

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

11gjm a écrit :

> même si j'y ai pensé tout seul, qu'il faut se placer dans le dossier contenant AdobeHDS.php pour que ça marche
Là , tu touches aux bases de la connaissance des batchs ou scripts.

Oui, mais dans la mesure où tout le monde ne connaît pas forcément ces bases, je me suis dit que ça pouvait être utile à quelqu'un qui retombe sur le sujet smile

11gjm a écrit :

Concernant "AdobeHDS.php" , tu n'est pas obligé de le lancer à partir du répertoire où il réside .
Tu peux écrire : "y:\patati\AdobeHDS.php".

Oui, j'ai hésité à le mettre big_smile

Autre question, comment obtiens-tu le lien à utiliser pour rtmpe ?
Aussi, comment sais-tu que tel ou tel site de replay utilise telle ou telle manière de diffusion ?

Bien à vous,
Naï.


OS : Ubuntu 13.04 32 bits
Processeur : Intel® Celeron(R) CPU 550 @ 2.00GHz
Mémoire : 2Gio
Carte graphique : Intel® 965GM x86/MMX/SSE2

Hors ligne