Advertisement
Bruce314

Download Adaptive streams

May 9th, 2011
2,223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.18 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. import urllib
  4. from threading import Thread
  5. import re
  6. from Queue import Queue
  7.  
  8. NUM_WORKERS = 10
  9.  
  10. class Dnld:
  11.   def __init__(self):
  12.     self.Q = Queue()
  13.     for i in xrange(NUM_WORKERS):
  14.       t = Thread(target=self.worker)
  15.       t.setDaemon(True)
  16.       t.start()
  17.  
  18.   def worker(self):
  19.     while True:
  20.       url, localFile = self.Q.get()
  21.       try:
  22.         print ("downloading %s to %s" % (url,localFile))  
  23.         urllib.urlretrieve(url,localFile)    
  24.       except Exception, e:
  25.         Q.put(('error', url, e))
  26.         try: f.close() # clean up
  27.         except: pass
  28.   def download(self, url,localFile):
  29.     self.Q.put((url, localFile))
  30.  
  31. class VariantDownloader(object):
  32.   def __init__(self,downloader,baseUrl):
  33.     print ('> create variant %s' % baseUrl)
  34.     self.chunksUrl=set()
  35.     self.baseUrl=baseUrl
  36.     self.downloader=downloader
  37.     self.reg=re.compile('^(.*ts)[\n\r]*$')
  38.   def refresh(self):
  39.     print ("refresh %s" % self.baseUrl)
  40. #    print (repr(self.chunksUrl))
  41.     f = urllib.urlopen(self.baseUrl)
  42.     data = f.readlines()
  43.     f.close()
  44.     chunks=[]
  45.     for a in data:
  46.       res=self.reg.match(a)
  47.       if res:
  48.         chunks.append(res.group(1))
  49.     for a in set(chunks) - set(self.chunksUrl):
  50.       url=appendUrl(self.baseUrl,a)
  51.       print ('adding chunk %s' % url)
  52.       self.downloader.download(url,'./'+a)
  53.       self.chunksUrl|=set([a])
  54.    
  55.  
  56. class AdassDownloader(object):
  57.   def __init__ (self):
  58.     self.downloader=Dnld()
  59.     self.variants=[]
  60.     self.reg=re.compile('^(.*m3u8)[\n\r]*$')
  61.   def setRoot(self,xUrl):
  62.     print ('> downloading root %s' % xUrl)
  63.     f = urllib.urlopen(xUrl)
  64.     data = f.readlines()
  65.     print (data)
  66.     f.close()
  67.     variant = filter (self.reg.match,data)
  68.     print (variant)
  69.     for a in variant:
  70.       self.variants.append(VariantDownloader(self.downloader,appendUrl(xUrl,a)))
  71.   def go(self):
  72.     while(True):
  73.       for a in self.variants:
  74.         a.refresh()      
  75.  
  76. def appendUrl(base,end):
  77.   newBase='/'.join (base.split('/')[:-1])
  78. #  print (base,end,newBase)
  79.   return newBase+'/'+end  
  80.  
  81. a=AdassDownloader()
  82. a.setRoot('xxx fill me with a start URL !!! xxx')
  83. a.go()
  84. # a.go()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement