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.

#1 Le 02/04/2014, à 07:33

nesthib

[script/python] Télécharger les émissions quotidiennes de Canal+

Pour faire suite à cette discussion, et parce que les émissions de Canal sont parfois difficilement accessibles sous Linux (flash…), j'ai écrit un script qui correspond mieux à mes attentes. Je pense que cette version est plus efficace que ceux proposés dans la discussion citée précédemment. En particulier mon script :

  • permet de télécharger les émissions par ordre de nouveauté

  • est pilotable entièrement en ligne de commande à l'aide d'options :

    • --shows affiche la liste des émissions disponibles

    • -f formatage automatiquement le nom des fichiers avec différentes infos sur la vidéo (titre, date, émission…)

    • -q choix de la qualité (200, 400, 800, 1500k)

    • -l/-t/-m sélection avancée des vidéos à télécharger (n dernières, émission du jour, émissions depuis une date donnée)

    • -r reprendre un téléchargement interrompu

    • -i afficher la liste des vidéos disponible pour une émission donnée

    • -x télécharger une vidéo donnée ou une plage (ex. 1,3-5,7)

exemples :
Obtenir de l'aide sur le script :

cpdl --help

Télécharger les guignols et le zapping du jour :

cpdl -t gdi zap

Afficher les émissions du petit journal et du grand journal des 7 derniers jours (mais sans télécharger) :

cpdl lpj lgj zap -l7 -i

Télécharger le zapping et le petit journal depuis le 27 mars 2014 et formater les nom de fichiers de la forme « LPJ_2014-03-27_Titre_de_la_vidéo.mp4 » :

cpdl zap lpj -m 2014-03-27 -f '%S_%D_%t.%e'

TODO :

  • Améliorer la gestion des émissions en plusieurs parties

  • Gérer le téléchargement de vidéos spécifiques

  • Prendre en charger un fichier de conf et ajouter un mode « auto »

  • Envisager une interface interactive

Le script (nécessite les paquets python-beautifulsoup, python-eventlet et rtmpdump) :

#!/usr/bin/python
#coding: utf-8

import os, sys, re
import subprocess
import logging as log
from datetime import datetime, timedelta
from BeautifulSoup import BeautifulSoup as BS

try:
    import eventlet
    from eventlet.green import urllib2
except ImportError:
    import urllib2

URL_PROGS = 'http://www.canalplus.fr/rest/bootstrap.php?/bigplayer/getMEAs/%s'
URL_VIDEO = 'http://www.canalplus.fr/rest/bootstrap.php?/bigplayer/getVideos/%s'
QUAL      = {1: 'mobile',
             2: 'bas_debit',
             3: 'haut_debit',
             4: 'hd',
             5: 'hds',
             6: 'hls',
             }
PROGLIST  = [
#             (130,	'act',	"Action discrete"),
#             (304,	'',	"Action discrete"),
#             (371,	'',	"Action discrete"),
#             ( 62,	'bdj',	"Le boucan du jour"),
#             (627,	'',	"Bref"),
             (104,	'lgj',	"Le grand journal"),
             (254,	'gro',	"Groland"),
             ( 48,	'gdi',	"Guignols de l'info (les)"),
#             (242,	'hoc',	"Du hard ou du cochon"),
#             (451,	'jcc',	"Jamel comedy club"),
             (896,	'jdh',	"Le journal du hard"),
#             ( 39,	'mat',	"La matinale"),
#             (215,	'mdh',	"Le meilleur du hier"),
#             ( 47,	'pdn',	"Les pépites du net"),
             (249,	'lpj',	"Petit journal (le)"),
#             (843,	'qdp',	"La question de plus"])
#             (294,	'cel',	"La revue de presse de Catherine et Eliane"),
#             (1082,	'slt',	"Salut les terriens"),
#             ( 41,	'',	"Salut les terriens"),
#             ( 74,	'',	"Salut les terriens"),
#             (105,	'',	"Salut les terriens"),
#             (110,	'',	"Salut les terriens"),
#             (316,	'',	"Salut les terriens"),
#             (371,	'',	"Salut les terriens"),
#             (680,	'',	"Salut les terriens - edito de Blako"),
#             (1064,	'',	"Salut les terriens - Gaspard Proust"),
#             (1072,	'',	"Salut les terriens - les martiens de la semaine"),
#             (252,	'sav',	"SAV des émissions"),
#             (936,	'tec',	"Tweet en clair"),
             (201,	'zap',	"Zapping (le)"),
            ]

PROGS = {P[1]:(P[0],P[2]) for P in PROGLIST}

# generate list from printer-like ranges
fromrange = lambda s: list(a for b in (range(int(x[0]),int(x[-1])+1) for x in [y.split('-') for y in s.split(',') if s]) for a in b)

def get_videos(id):
    """Generates list of videos for program"""
    log.debug('Opening "%s"' % (URL_PROGS % id))
    soup = BS(urllib2.urlopen(URL_PROGS % id))
    videos = []
    for mea in soup.findAll('mea'):
        videos.append( {'id': mea.find('id').text,
                       'title': mea.find('titre').text,
                       'subtitle': mea.find('sous_titre').text,
                       })
    return videos

def get_video_info(id, show=None):
    """Get infos and URL for a given video"""
    soup = BS(urllib2.urlopen(URL_VIDEO % id))
    log.debug('Opening "%s"' % (URL_VIDEO % id))
    d = datetime.strptime(soup.find('date').text, '%d/%m/%Y').strftime('%Y-%m-%d')
    try:
        duration = int(soup.find('duration').text)
    except ValueError:
        duration = None
    video = {'id': int(id),
             'show': show,
             'date': d,
             'title': soup.find('titre').text.replace('/', '-'),
             'subtitle': soup.find('sous_titre').text.replace('/', '-'),
             'duration': duration,
             'urls': {},
             }
    for (q, i) in QUAL.items():
        try:
            video['urls'][q] = soup.find(i).text
        except AttributeError:
            pass
#    return soup
    return video

def video_list(id, limit=None, datelimit=None):
    """Builds video list for program"""
    try:
        show = id
        id = PROGS[id][0]
    except KeyError:
        log.error('Invalid show "%s" (Available shows are "%s")' % (show, '", "'.join(sorted(PROGS))))
        show = id
    videos = get_videos(id)
    if videos:
        log.info('Found %s video(s) info for "%s"' % (len(videos), show))
    if limit:
        videos = videos[:limit]
    ids = [v['id'] for v in videos ]
    # asynchronously download video infos
    pool = eventlet.GreenPool()
    videos = []
    for video in pool.imap(lambda i: get_video_info(i, show), ids):
        if datelimit and video['date'] and video['date'] < datelimit:
            log.debug('Reached date limit: %s < %s' % (video['date'], datelimit))
            break
        videos.append(video)
    # make sure videos are sorted by date
    videos.sort(key=lambda x:x['date'])
    videos.reverse()
    olddate = ''
    for video in videos:
        if video['date'] == olddate:
            n += 1
        else:
            olddate = video['date'] ; n = 0
        video['n'] = n
    return videos

def download_video(url, out, duration=None, resume=False, quiet=False):
    import fcntl
    """Downloads video"""
    log.info('Downloading "%s" (%s)' % (out, url))
    if url.startswith('rtmp://'):
        RESUME = ('-e' if resume else '')
        QUIET  = ('-q' if quiet  else '')
        p = subprocess.Popen(('rtmpdump', RESUME, QUIET, '-r', url, '-o', out))
        p.wait()
#        p1 = subprocess.Popen(('rtmpdump', RESUME, QUIET, '-r', url, '-o', out), stderr = subprocess.PIPE, close_fds=True)
#        while p1.poll() is None:
#            out = p1.stderr.read(32)
#            if out == '' and p1.poll() != None:
#                break
#            if 'kB /' in out:
#                sys.stdout.write(out)
#                sys.stdout.flush()
    elif url.endswith('.m3u8'):
        cmd_args = ['avconv', '-i', url, '-ss', '00:00:00']
        if duration:
            cmd_args.extend(['-t', str(duration)])
        cmd_args.extend(['-codec', 'copy', out])
        p = subprocess.Popen(cmd_args)
        p.wait()
    else:
        with open(out, 'w') as f:
            f.write(urllib2.urlopen(url))

if __name__ == '__main__':
    import argparse

    log.basicConfig(level=log.DEBUG,
                    format='%(asctime)s [%(levelname)s] %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename=os.path.expanduser('~/.cpdl.log'),)
    stdoutLog = log.StreamHandler(stream=sys.stdout)
    stdoutLog.setFormatter(log.Formatter("[%(levelname).1s]  %(message)s"))
    stdoutLog.setLevel(log.ERROR)
    log.getLogger().addHandler(stdoutLog)

    parser = argparse.ArgumentParser(description='Download videos from Canal+')
#    parser.add_argument('-s', '--show', nargs='+', help='Show(s) to download')
    parser.add_argument('--shows', action='store_true', help='List available shows')
    parser.add_argument('show', metavar='SHOW', nargs='*', help='Show(s) to download')
    parser.add_argument('-i', '--list', action='store_true', help='Display available videos')

    group_time = parser.add_mutually_exclusive_group()
    group_time.add_argument('-t', '--today', action='store_true', help="Download today's videos")
    group_time.add_argument('-y', '--yesterday', action='store_true', help="Download yesterday's videos")
    group_time.add_argument('-l', '--last', metavar='N', type=int, nargs='?', help="Download last (N) videos", const=1)
    group_time.add_argument('-x', '--videos', metavar='XXX', type=str, help="Download given videos (1,2-4,7)")
    def validDate(d): # validation for the date format (YYYY-MM-DD)
        import re
        try:
            return re.match('\d{4}-\d\d-\d\d', d).group(0)
        except AttributeError:
            raise argparse.ArgumentTypeError('String "%s" does not match required format (YYYY-MM-DD)' % (d,))
    group_time.add_argument('-m', '--max-date', metavar='date', type=validDate, nargs=1, help="Download videos more recent than <date> (YYYY-MM-DD)")

    group_log = parser.add_mutually_exclusive_group()
    group_log.add_argument('-v', '--verbose', action='count', default=2, help='Verbosity (add several to increase)')
    group_log.add_argument('-V', '--quiet', action='store_true', help='No output')

    parser.add_argument('-f', '--format', metavar='XXX', help='Filename format (default "%%S_%%d_%%t(%%Q).%%e")\n' +
                                                              '%%S SHOW, %%s show, %%D YYYY-MM-DD, %%d YYYYMMDD, ' +
                                                              '%%T title, %%t subtitle, %%e .ext, %%n video number (same date), ' +
                                                              '%%q quality (1–4), %%Q quality (200-1500k)',  default='%S_%d_%t(%Q).%e')
    parser.add_argument('-q', '--quality', metavar='N', type=int, help='Quality (1–4)', default=6)
    parser.add_argument('-n', '--no-act', action='store_true', help='Dry run (do not download videos)')
    parser.add_argument('-P', '--play', action='store_true', help='Play video with vlc')
    parser.add_argument('-r', '--resume', action='store_true', help='Resume interrupted download')
    parser.add_argument('--no-sort', action='store_true', help='Do not download the newest videos first (group by show)')

    args = parser.parse_args()
    stdoutLog.setLevel(log.ERROR-10*min(args.verbose,3)) # set log level for stdout (v: WARN; vv: INFO; vvv+: DEBUG)
    args.quiet and stdoutLog.setLevel(log.CRITICAL)      # if quiet, set log level to CRITICAL
    if args.shows:
#        log.error('Available shows are "%s"' % ('", "'.join(sorted(PROGS))))
        log.error('Available shows are %s' % ', '.join(['"%s" (%s)' % (s[0], s[1][1]) for s in sorted(PROGS.items())]))
        sys.exit()
    log.debug(args)

    # Let's start serious stuff
    if args.show:
        shows_infos = {}
        log.debug('Downloading infos for shows "%s)' % '), "'.join(['%s" (%s' % (P, PROGS[P][1]) for P in args.show if P in PROGS]))
        videos = []
        for show in args.show:
            show = show.lower()
            limit = None ; datelimit = None
            if args.today:
                limit = 3 # max 3 videos per day for one show
                datelimit = datetime.today().strftime('%Y-%m-%d')
            if args.yesterday:
                limit = 6 # max 3 videos per day for one show
                datelimit = (datetime.today()-timedelta(1)).strftime('%Y-%m-%d')
            elif args.last:
                limit = args.last
            elif args.max_date:
                datelimit = args.max_date[0]
            v = video_list(show, limit, datelimit)
            if not ((args.today or args.yesterday) and v and v[0]['date'] != datelimit):
                videos.extend(v)
            log.debug('Retrieved infos for %s videos%s' % (len(videos),
                                                            (' (max-date: %s)' % datelimit if datelimit else
                                                             ' (limit: %s)' % limit if limit else '')))
        # sort by date so that the newest videos are downloaded first
        if not args.no_sort:
            videos.sort(key=lambda x:x['date'], reverse=True)
        log.info('%s video(s) to download' % len(videos))

        if args.videos:
            vrange = fromrange(args.videos)
            if not args.last:
                args.last = max(vrange)

        i = 0
        Q = {1: '200k', 2: '400k', 3: '800k', 4: '1500k', 5:'HDS', 6:'HLS' }
        if args.list:
           for v in videos:
                i+=1
                if args.videos and i not in vrange:
                    continue
                print(u'[%s] %s (%s) %s "%s – %s"' % (i, v['date'], v['id'], v['show'].upper(), v['title'], v['subtitle']))
                q = max(1,min(args.quality, 6))
                url = v['urls'][q]
                log.debug('Download URL "%s"' % url)
        else:
            for v in videos:
                i+=1
                if args.videos and i not in vrange:
                    continue
                q = max(1,min(args.quality, 6))
                url = v['urls'][q]
                ext = url.rsplit('.', 1)[-1]
                filename = args.format.replace('%S', v['show'].upper()).replace('%s', v['show']).replace('%D', v['date']).replace('%e', ext).replace('%T', v['title']).replace('%t', v['subtitle'])
                filename = filename.replace('%d', v['date'].replace('-', '')).replace('%q', str(q)).replace('%Q', Q[q]).replace('%n', '-%s' % v['n'] if v['n'] else '')
                filename = re.sub(r'\s+', '_', filename)
                filename = filename.replace('.m3u8', '.mp4')
                filename = os.path.expanduser(filename)
                if os.path.exists(filename) and not os.path.getsize(filename):
                   os.remove(filename)
                   log.info('Deleting empty file "%s"' % filename)
                if args.play:
                    p = subprocess.Popen(('vlc', url))
                    p.wait()
                elif args.resume or not os.path.exists(filename):
                    if args.resume and os.path.exists(filename):
                        log.info('Resuming downloading video "%s" from show "%s" as "%s"' % (v['id'], v['show'], filename))
                    else:
                        log.info('Downloading video "%s" from show "%s" as "%s"' % (v['id'], v['show'], filename))
                    log.debug('Download URL "%s"' % url)
                    if not args.no_act:
                        download_video(url, filename, duration=v['duration'], resume=args.resume, quiet=args.quiet)
                else:
                    log.info('NOT downloading video "%s" from show "%s", file already exists: "%s"' % (v['id'], v['show'], filename))

NB. n'oubliez pas de rendre le script exécutable et de le placer dans un des dossiers du PATH (voir messages #8 et #12 si vous ne savez pas comment faire).

edit : changement du chemin du log – ajout de quelques fonctionnalités

Dernière modification par nesthib (Le 19/04/2014, à 03:22)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#2 Le 02/04/2014, à 10:00

kasuke

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Salut !
Merci pour ce script mais je pense que je dois m'y prendre comme un manchot.
J'ai copié/collé ton script et je l'ai nommé Canal+, sans extension et j'ai fais un chmod +x, mais lorsque je double clique dessus, il me demande si je veux l'exécuter, soit en dans un terminal soit lancer direct mais peu importe le choix il ne se passe rien.
Alors j'aurais aimé avoir un peu plus d'info pour se servir du script, il faut d'autres choses ?

Hors ligne

#3 Le 02/04/2014, à 12:20

Gaara

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Salut, renomme ton fichier avec l'extension .py
Essaye de le lancer au terminal avec

python ton_fichier.py

ça devrait marcher

Dernière modification par gaara92 (Le 02/04/2014, à 12:20)


Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid

                                        <code>zenity  --question --title "Alert"  --text "Microsoft Windows has been found! Would you like to remove it?"</code>

Hors ligne

#4 Le 02/04/2014, à 13:08

kasuke

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

kasuke@kasuke-P15xSM:~/Vidéos$ python Canal.py 
Traceback (most recent call last):
  File "Canal.py", line 137, in <module>
    filename=os.path.expanduser('~/.cplus/log'),)
  File "/usr/lib/python2.7/logging/__init__.py", line 1519, in basicConfig
    hdlr = FileHandler(filename, mode)
  File "/usr/lib/python2.7/logging/__init__.py", line 897, in __init__
    StreamHandler.__init__(self, self._open())
  File "/usr/lib/python2.7/logging/__init__.py", line 916, in _open
    stream = open(self.baseFilename, self.mode)
IOError: [Errno 2] No such file or directory: '/home/kasuke/.cplus/log'

Je suppose qu'il faut mettre le fichier dans un endroit spécial ou pas ?

Hors ligne

#5 Le 02/04/2014, à 15:20

nesthib

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

J'ai changé le chemin par défaut du log (~/.cpdl.log), j'avais gardé le chemin du script d'origine cité dans mon lien. Tu ne devrais plus avoir d'erreur.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#6 Le 02/04/2014, à 15:30

kasuke

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Donc j'édit le fichier avec ton code et ça devrait fonctionner ? Je le laisse en .py ?
Je viens de test via la commande

kasuke@kasuke-P15xSM:~/Vidéos$ python Canal.py 
kasuke@kasuke-P15xSM:~/Vidéos$ 

Sauf qu'il s'est rien passé je crois big_smile, j'ai jamais réussi à faire fonctionner un script ><, si tu vois une erreur de ma part dis le moi.
J'ai test autre chose

kasuke@kasuke-P15xSM:~/Vidéos$ python Canal.py cpdl -s gdi zap -t
usage: Canal.py [-h] [-s SHOW [SHOW ...]] [-i] [-t | -l [N] | -m date]
                [-v | -V] [-f XXX] [-q N] [-n] [--no-sort]
Canal.py: error: unrecognized arguments: cpdl
kasuke@kasuke-P15xSM:~/Vidéos$ 

big_smile je crois que je comprends pas trop comment on doit s'en servir

Dernière modification par kasuke (Le 02/04/2014, à 15:32)

Hors ligne

#7 Le 02/04/2014, à 15:47

k3c

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Essaie

python Canal.py -s gdi zap -t

Archlinux sur Xiaomi Air 13

Hors ligne

#8 Le 02/04/2014, à 15:48

nesthib

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Oui, je crois que tu ne sais pas trop de servir de la ligne de commande wink Mais ça c'est pas grave, tu vas apprendre. Si tu lis bien les messages d'erreur à chaque fois tu pourrais comprendre par toi même ce qui ne va pas.

Commence par créer le dossier ~/bin (« ~ » représente ton home), ouvre un terminal et lance :

mkdir ~/bin

Copie ensuite mon script dans le dossier ~/bin avec le nom cpdl (sans extension)
Rends le script exécutable :

chmod +x ~/bin/cpdl

Vérifie que le dossier ~/bin est dans le $PATH, ouvre un nouveau terminal et lance :

echo $PATH

le retour doit comporter quelque part /home/<utilisateur>/bin

Ensuite il suffit de lancer le script ainsi :

cpdl --help

Pour afficher les dernières vidéos des émissions « guignols de l'info » et « zapping »

cpdl -s gdi zap -l -i

en détail, -s gdi zap signifie de travailler sur les émissions « guignols de l'info » (gdi) et « zapping » (zap), -l de ne prendre en compte que la dernières vidéos de chaque émission et -i affiche seulement la liste des vidéos sans ne rien faire (il suffirait de supprimer cette option pour télécharger les vidéos).


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#9 Le 02/04/2014, à 16:03

kasuke

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

tout s’éclaire d'un coup ! big_smile

kasuke@kasuke-P15xSM:~$ echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Je vois pas mon nom d'utilisateur pourtant j'ai suivi tout ce que tu m'as dit.

kasuke@kasuke-P15xSM:~$ cpdl -s gdi -zap -l -i
Commande 'cpdl' non trouvée, vouliez-vous dire :
 La commande 'pdl' du paquet 'pdl' (universe)
cpdl : commande introuvable
kasuke@kasuke-P15xSM:~$ cd bin/
kasuke@kasuke-P15xSM:~/bin$ l
cpdl*
kasuke@kasuke-P15xSM:~/bin$ cpdl -s gdi -zap -l -i
Commande 'cpdl' non trouvée, vouliez-vous dire :
 La commande 'pdl' du paquet 'pdl' (universe)
cpdl : commande introuvable

Du coup ça marche pas hmm

Dernière modification par kasuke (Le 02/04/2014, à 16:04)

Hors ligne

#10 Le 02/04/2014, à 16:11

k3c

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

renomme ton script, de
cpdl*
en
cpdl

et tu re-essayes


Archlinux sur Xiaomi Air 13

Hors ligne

#11 Le 02/04/2014, à 16:18

kasuke

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

non mais il s'appelle déjà cpdl, le symbole * indique juste qu'il est executable, en fait le fait de faire juste l, je me rappel que c'est la commande ls avec plusieurs option.
mais si je fais ls, il n'y a plus d'étoile.

Hors ligne

#12 Le 02/04/2014, à 16:24

nesthib

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Ton dossier ~/bin n'est pas dans le PATH (quand je te dis de faire une vérification et qu'elle n'est pas remplie, la suite ne va pas fonctionner tongue)
Ajoute la ligne suivante à la fin du fichier ~/.bashrc :

PATH=$"$PATH:/home/kasuke/bin"

puis ouvre un nouveau terminal.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#13 Le 02/04/2014, à 16:33

kasuke

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Ah mais j'avais aucune idée qu'il fallait faire ça.
Je crois que c'est bon non ? mais ça les télécharge ?

kasuke@kasuke-P15xSM:~$ echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/kasuke/bin
kasuke@kasuke-P15xSM:~$ cpdl -s gdi zap -l -i
[i]  Found 16 video(s) info for "gdi"
[i]  Found 101 video(s) info for "zap"
[i]  2 video(s) to download
2014-04-02 (1047232) ZAP "Le Zapping – 02-04-14"
2014-04-01 (1046876) GDI "Les Guignols de l'Info du 01-04-14 – Cécile Duflot s'exprime sur Manuel Valls"

Hors ligne

#14 Le 02/04/2014, à 16:36

nesthib

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Non, relis mes messages précédents et l'aide de mon script (option --help) avant de vouloir aller trop vite wink


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#15 Le 02/04/2014, à 16:40

kasuke

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

oui j’étais justement en train de bidouiller et d'essayer de comprendre ton --help mais je dois vraiment être manchot ...

cpdl: error: argument -l/--last: invalid int value: '['
kasuke@kasuke-P15xSM:~$ cpdl -l [N]
usage: cpdl [-h] [-s SHOW [SHOW ...]] [-i] [-t | -l [N] | -m date] [-v | -V]
            [-f XXX] [-q N] [-n] [--no-sort]
cpdl: error: argument -l/--last: invalid int value: '[N]'

J'ai fais comme ce qui était marqué non ? ou alors il faut absolument d'autre paramètre, je suis désolé je comprends vraiment rien big_smile

Hors ligne

#16 Le 02/04/2014, à 17:17

nesthib

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Non, tu n'es pas manchot, simplement débutant, ça n'est pas grave. [N] dénote un argument facultatif (les […]) et en l'occurrence un nombre (précisé dans l'aide). De plus le message d'erreur est explicite « valeur entière invalide ».
Tu n'as pas mis la ligne que tu as lancé, mais si tu veux utiliser l'option -l il faut soit mettre un nombre en argument, soit rien (1 par défaut).

Il faut séparer les différents composantes du script, l'option pour indiquer les émissions (ex. -s lpj zap), celles pour définir une restriction temporelle sur les vidéos à télécharger (ex. -t pour les vidéos du jour, -l pour la dernière vidéo, -l4 pour les 4 dernières vidéos, -m 2013-04-02 pour les vidéos depuis le 02 avril 2014, et par défaut rien pour toutes les vidéos), et enfin quelques options cosmétiques ou modificatrices (-q4 pour choisir la qualité HD, -vvv pour avoir les infos de débogage, -, -i pour avoir la liste des vidéos, -n pour simuler le téléchargement (sans l'effectuer), -f '%S_%d.%e' pour définir le format du nom de fichier, etc.)

Dans ton cas, pour simplement télécharger le dernier zapping :

cpdl -s zap -l

Je me demande si je ne vais pas modifier le script pour supprimer l'option -s, j'en ferai peut être une liste d'arguments à la place (à confirmer).


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#17 Le 02/04/2014, à 18:17

GP974

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Super le script smile
J'ai voulus le tester sur mon Raspberry pi sur debian
mais il semble qu-il ai un probleme

┌┼─┤ user @ raspberrypi ─┤├─ 20:04:41 ─┤
└┼─┤ ~/Tv | $ ▶./Canal.py -s gdi -l1 -f '%S_%D.%e'
[i]  Found 16 video(s) info for "gdi"
[i]  1 video(s) to download
[i]  Downloading video "1046876" from show "gdi" as "GDI_2014-04-01.mp4"
[i]  Downloading "GDI_2014-04-01.mp4" (rtmp://vod-fms.canalplus.fr/ondemand/videos/1404/LES_GUIGNOLS_QUOTIDIEN_140401_AUTO_23903_169_video_L.mp4)
┌┼─┤ user @ raspberrypi ─┤├─ 20:06:27 ─┤
└┼─┤ ~/Tv | $ ▶ll
total 80K
-rwx------ 1 user user 9,5K avril  2 19:56 Canal.py
-rw------- 1 user user  66K avril  2 20:06 GDI_2014-04-01.mp4

┌┼─┤ user @ raspberrypi ─┤├─ 20:08:02 ─┤
└┼─┤ ~ | $ ▶cat .cpdl.log 
2014-04-02 20:04:41 [DEBUG] Namespace(format='%S_%d.%e', last=None, list=False, max_date=None, no_act=False, no_sort=False, quality=2, quiet=False, show=None, today=False, verbose=2)
2014-04-02 20:05:18 [DEBUG] Namespace(format='%S_%D.%e', last=1, list=False, max_date=None, no_act=False, no_sort=False, quality=2, quiet=False, show=['gdi'], today=False, verbose=2)
2014-04-02 20:05:18 [DEBUG] Downloading infos for shows "gdi" (Guignols de l'info (les))
2014-04-02 20:05:18 [DEBUG] Opening "http://www.canalplus.fr/rest/bootstrap.php?/bigplayer/getMEAs/48"
2014-04-02 20:05:27 [INFO] Found 16 video(s) info for "gdi"
2014-04-02 20:05:34 [DEBUG] Opening "http://www.canalplus.fr/rest/bootstrap.php?/bigplayer/getVideos/1046876"
2014-04-02 20:05:34 [DEBUG] Retrieved infos for 1 videos (limit: 1)
2014-04-02 20:05:34 [INFO] 1 video(s) to download
2014-04-02 20:05:34 [INFO] Downloading video "1046876" from show "gdi" as "GDI_2014-04-01.mp4"
2014-04-02 20:05:34 [DEBUG] Download URL "rtmp://vod-fms.canalplus.fr/ondemand/videos/1404/LES_GUIGNOLS_QUOTIDIEN_140401_AUTO_23903_169_video_L.mp4"
2014-04-02 20:05:34 [INFO] Downloading "GDI_2014-04-01.mp4" (rtmp://vod-fms.canalplus.fr/ondemand/videos/1404/LES_GUIGNOLS_QUOTIDIEN_140401_AUTO_23903_169_video_L.mp4)

Je n'obtiens qu'un fichier de 66ko illisible
une idée du problème il faut une machine de compet pour ce script ?

Edit : bon a priori c'est un problème de mémoire Ram avant exécution ~ 110 mo pendant exec 80% ~380 mo puis des la fin (crash ?) retour a ~ 110 mo

Dernière modification par GP974 (Le 02/04/2014, à 19:31)


Ubunteros depuis 10.04 Restez libre avec Linux :)
Fixe : i7 i930@3.2ghz | DDR3 12go | Amd Rx580 | SSD - 120Go S2 | 14.04.05 & Arch
Fixe2 : I5 6500U@2.8ghz | DDR4 8GO | SSD 120 M2 | Arch
Développeur de nvidiux

Hors ligne

#18 Le 02/04/2014, à 22:00

nesthib

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Que te donne la commande :

rtmpdump -r rtmp://vod-fms.canalplus.fr/ondemand/videos/1404/LES_GUIGNOLS_QUOTIDIEN_140401_AUTO_23903_169_video_L.mp4 -o test.mp4

edit : sur une cubie (un peu plus puissant qu'un RPi) ça fonctionne très bien, le fichier téléchargé fait 28M.

Dernière modification par nesthib (Le 02/04/2014, à 22:11)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#19 Le 03/04/2014, à 09:32

kasuke

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Merci pour ces infos smile
Dis moi, tu penses que tu pourrais rajouter un truc comme avec wget pour voir la progression du téléchargement ?
Dans mes tests j'avais fait -l 1 mais il fallait qu'il soit juste à côté.

Hors ligne

#20 Le 03/04/2014, à 12:21

GP974

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Bon ce matin j'ai mis a jour mon rpi redémarrer et arrêter le serveur torrent (Transmission) et ça fonctionne.
Je fait plus de test ce soir avec transmission actif mais pour l'instant ça a l'air d’être ok


Ubunteros depuis 10.04 Restez libre avec Linux :)
Fixe : i7 i930@3.2ghz | DDR3 12go | Amd Rx580 | SSD - 120Go S2 | 14.04.05 & Arch
Fixe2 : I5 6500U@2.8ghz | DDR4 8GO | SSD 120 M2 | Arch
Développeur de nvidiux

Hors ligne

#21 Le 03/04/2014, à 20:23

Xun

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

C'était la question que je me posais — si ça marchait sur plateforme ARM wink

Je m'abonne en tout cas. Et merci smile

Hors ligne

#22 Le 04/04/2014, à 21:33

melixgaro

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

salut,

merci pour le script. Pour une barre de progression, c'est un peu la galère avec le protocole rtmp. J'ai déjà essayé mais ça n'était pas génial. D'après ce que j'ai compris, on ne peut pas connaître d'avance la taille du fichier, seulement la durée de la vidéo. Pour afficher le pourcentage de progression, la commande rtmpdump regarde a un instant t la durée du clip partiel (la partie déjà récupérée). L'évolution de ce pourcentage ne reflète pas vraiment la vitesse de téléchargement.


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#23 Le 05/04/2014, à 02:31

nesthib

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

@kasuke : j'ai mis l'affichage de la sortie de rtmpdump par défaut, tu auras la progression du téléchargement

@Xun : oui bien sûr, ça peut fonctionner sur ARM mais c'est parfois un peu gourmand en ressources

J'ai mis à jour le script, il y a de nouvelles options (--shows pour lister les émissions disponibles, -r/--resume pour reprendre les téléchargements interrompus), une amélioration de l'aide et quelques changements de code (ex. téléchargement des vidéos du jour).


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#24 Le 05/04/2014, à 14:01

toitoinebzh

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

bravo pour ce srcipt, ça marche bien chez moi
par contre, je pense qu'il faudrait modifier le premier post, notamment sur l'option -s qui n'est plus valide maintenant

Hors ligne

#25 Le 05/04/2014, à 16:26

nesthib

Re : [script/python] Télécharger les émissions quotidiennes de Canal+

Ah oui, j'ai corrigé smile
Je précise que les arguments (les identifiants des émissions) peuvent se placer n'importe où, ce qui peut être pratique si on veut par exemple vérifier l'existence d'une nouvelle vidéo manuellement avant de lancer le téléchargement, il suffit d'ajouter à la fin l'option -i puis de remonter dans l'historique et l'enlever.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne