URL: https://linuxfr.org/forums/astucesdivers/posts/telecharger-arte-7 Title: Télécharger Arte+7 Authors: VoixOff Date: 2014年05月29日T20:57:14+02:00 License: CC By-SA Tags: wget, arte et python3 Score: 9 Salut à tous Voici une nouvelle version de mon _téléchargeur_ pour Arte+7. Passez la liste des urles [Arte+7](http://www.arte.tv/guide/fr/plus7) en paramètres, et hop! Les options : * `-q HD|DVD` : qualité, HD par défaut * `-t ` : nombre de tentatives pour wget Il nécessite toujours BeautifulSoup 4, mais il utilise wget désormais. La reprise sur erreur ou interruption est gérée par celui-ci. ```Python #!/usr/bin/python3 # -*- coding: utf-8 -*- # # Téléchargeur pour Arte+7 via wget # Ceci est une adaptation du service http://floriancrouzat.net/arte/ de Florian Crouzat # import os import sys import json import shlex import argparse import subprocess import urllib.request from datetime import datetime try: from bs4 import BeautifulSoup except ImportError: print("artedl.py nécessite BeautifulSoup 4.") sys.exit(1) class ArtePlus7NotFound(Exception): pass class ArtePlus7Error(Exception): pass class ArtePlus7: ''' Téléchargeur pour Arte+7 ''' WGET_PATH = [ '/usr/bin/wget' ] WGET_OPTS = [ '-c', '-T', '60' ] QUALITY = { 'HD': 'SQ', 'DVD': 'EQ' } def __init__(self, url, tries=1, quality='HD'): assert tries> 0 and quality in self.QUALITY self.plus7 = url self.tries = tries self.quality = quality self.cmd_line = [] self.video_name = '' self.video_when = '' self.video_excerpt = '' if not self._search_video(): raise ArtePlus7NotFound def _search_video(self): ''' Recherche la vidéo et construit la ligne de commande. Retourne True si trouvée, False sinon. ''' try: url = urllib.request.urlopen(self.plus7) except Exception as e: print("\n{}".format(e)) return False soup = BeautifulSoup(url.read().decode()) divs = soup.find_all('div', {'class':'video-container'}) for a in divs: json_url = a.attrs.get('arte_vp_url', '').replace('/player/', '/') if 'PLUS7' in json_url: break else: print("\nAucune vidéo trouvée : {}".format(self.plus7)) return False jdic = json.loads(urllib.request.urlopen(json_url).read().decode()) vjp = jdic['video'] vti = vjp['VTI'] title = vti.replace('"', '«', 1).replace('"', '»', 1) title = title.translate(str.maketrans('/', 'x', '"')).strip() try: vda = datetime.strptime(vjp['VDA'], '%d/%m/%Y %H:%M:%S %z') except ValueError: vda = datetime.now() vda = vda.replace(vda.year, vda.month, vda.day, vda.hour, vda.minute, 0, 0) self.video_when = vda.strftime('%Y-%m-%d %Hh%M') self.video_name = 'Arte - {} - {}'.format(title, self.video_when) self.video_excerpt = vjp.get('V7T', '') print("\nVidéo trouvée : {}\n{}".format(self.video_name, self.video_excerpt)) for video in vjp['VSR']: if video['VFO'] == 'HBBTV' and video['VMT'] == 'mp4' and video['VQU'] == self.QUALITY[self.quality]: self.video_file = video['VUR'] break else: print("Aucun fichier pour cette qualité : {}\n".format(self.quality)) return False self.cmd_line = self.WGET_PATH + self.WGET_OPTS + [ '-t', str(self.tries), '-O', self.file_from_video(), self.video_file ] return True def file_from_video(self): return self.video_name + '.mp4' def file_from_excerpt(self): return self.video_name + '.txt' def video_exists(self): return os.path.isfile(self.file_from_video()) def delete_video(self): try: os.remove(self.file_from_video()) except FileNotFoundError: pass def touch_video(self): try: os.utime(self.file_from_video()) except FileNotFoundError: pass def dump_video(self): ''' Télécharge la vidéo ''' if not os.path.isfile(self.WGET_PATH[0]): print("artedl.py nécessite wget.") raise ArtePlus7Error try: subprocess.check_call(self.cmd_line) except subprocess.CalledProcessError: print("\nTéléchargement incomplet.\n") except KeyboardInterrupt: print("\nTéléchargement interrompu.\n") else: self.touch_video() return raise ArtePlus7Error def dump_excerpt(self): ''' Sauvegarde le résumé ''' with open(self.file_from_excerpt(), 'w') as fd: fd.write("{}\n{}\n".format(self.video_name, self.video_excerpt)) def show_command(self): ''' Affiche la ligne de commande au format shell ''' quoted_args = [ shlex.quote(arg) for arg in self.cmd_line ] print("\n{}\n".format(' '.join(quoted_args))) if __name__ == '__main__': parser = argparse.ArgumentParser(description="ArtePlus7") parser.add_argument('-q', dest='quality', default='HD', choices=('HD', 'DVD')) parser.add_argument('-t', dest='tries', default=5, type=int) parser.add_argument('url_list', metavar='URL', nargs='+') args = parser.parse_args() for url in args.url_list: try: arte7 = ArtePlus7(url, tries=args.tries, quality=args.quality) except ArtePlus7NotFound: continue arte7.show_command() try: arte7.dump_video() arte7.dump_excerpt() except ArtePlus7Error: break ``` Enjoy!

AltStyle によって変換されたページ (->オリジナル) /