2017-08-30 1 views
0

J'ai un problème avec le téléchargement de vidéos de mon serveur, par exemple. http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Cornaro%20USLUGE.mp4Python télécharger des vidéos à partir de HTTP URL avec Internet mauvaise

Tout fonctionne parfaitement quand Internet est OK, mais quand je déconnecte le câble LAN de Raspberry Pi et reste comme ça moins de 10-15 secondes. Mais quand Internet est éteint plus de 10-15 secondes, mon téléchargement ne continue pas ou les vidéos ne sont pas correctement téléchargées (je les fusionne plus tard avec MP4Box et elles doivent l'être). Si quelqu'un a une suggestion pour résoudre ce problème et m'aider, je l'apprécierais beaucoup.

Voici mon code:

import os 
import urllib 
import urllib2 
import time 
import commands 
import requests 
import shutil 
from urllib2 import URLError 

urls = ['http://screensfiles.dbtouch.com/screens2/Companies/89/HD/00 APPS OVERVIEW.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Cornaro USLUGE.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/ILIRIJA BIOGRAD 2016.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Restoran marina.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/HT Screens.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Hotels Touch - Tasks.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Croatia Full of life.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/04 PROJECTS.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/05 ATTEND.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Cornaro Hotel.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Plurato dron snimka 2.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Plurato dron snimka 2.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Plurato dron snimka 2.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Cornaro USLUGE.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Cornaro USLUGE.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Hotels Touch - Screens.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Hotels Touch - Screens.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Hotels Touch - Tasks.mp4', 
'http://screensfiles.dbtouch.com/screens2/Companies/89/HD/Hotels Touch - Screens.mp4'] 

directory = "/home/pi/pythonSignage/current_playlist/videos_to_merge/" 


i=1 

for url in urls: 

    i += 1 
    print("current iter: ") 
    print(i) 

    if (len(urls) > 1): 
     url_formatted = url.split('/')[-1].replace(" ", "").replace("%20", "") + " " 
    else: 
     url_formatted = url.split('/')[-1].replace(" ", "").replace("%20", "") 

    url_formatted_name = url.split('/')[-1].replace(" ", "").replace("%20", "").rstrip() 

    while True: 

     print("inside while true") 
     try: 
      """ method 0 doesn't work """ 
      print("try") 
      response = urllib2.urlopen(url, timeout=5) 
      content = response.read() 
      print("content") 
      f = open(directory + url_formatted_name, 'wb') 
      f.write(content) 
      f.close() 

      """ method 1 doesn't work """ 
      #video_fancy_downloader = urllib.FancyURLopener() 
      #video_fancy_downloader.retrieve(url, directory + url_formatted_name) 

      """ method 2 - doesn't work """ 
      #my_file = urllib.URLopener() 
      #my_file = retrieve(url, directory + url_formatted_name) 

      """ method 3 - doesn't work """ 
      #response = requests.get(url, stream=True) 
      #response.raise_for_status() 
      #with open(directory + url_formatted_name, 'wb') as handle: 
      # for block in response.iter_content(1024): 
      #  handle.write(block) 

     except: 
      print("error download, sleep 5 sec") 
      time.sleep(5) 


print("end") 

Répondre

0

j'ai réussi à résoudre mon problème. Peut-être que ce n'est pas la meilleure approche, mais cela fonctionne.

est fonction ici pour télécharger la vidéo et renvoie la réponse:

def do_download(destination, url): 
    comm = ["wget", "-c", "-O", destination, "-t", "15000", "-T", "5", url] 
    proc = subprocess.Popen(comm, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
    tmp = proc.stdout.read() 
    if "wget: unable to resolve host address" in tmp: 
     return False 
    else: 
     return True 

partie essentielle de téléchargement fonction est presque le même, mais maintenant il appelle do_download l'intérieur en boucle et vérifie la réponse:

if os.path.isfile(directory+url_formatted_name) is False: 
    print("must download file!") 

    while downl_success is False: 
     print("inside while true") 
     try: 
      print("try") 

      while(do_download(directory + url_formatted_name, url) is False): 
       print(" ------- inside while for download ----------- ") 
       time.sleep(5) 

      downl_success = True 

      print("file downloaded fully!") 
      break 

     except HTTPError, e: 
      print "HTTPError", e.code, url 
      time.sleep(5) 

     except URLError, e: 
      print "URL Error", e.reason, url 
      time.sleep(5) 

else: 
    print("file already downloaded no need to download it again!")