def __init__(self, yid, opts=dict()): if self.RICKASTLEY: yid = "dQw4w9WgXcQ" #trolololo if not isinstance(yid, str) or len(yid) != 11: raise ValueError("yid expected to be valid Youtube movie identifier") #FIXME self.data = tempfile.SpooledTemporaryFile() self.global_dl_lock = False self.thread = [] self.avail = range_t() self.safe_range = range_t() self.processing_range = range_t() self.spooled = 1; self.filesize = 4096 self.r_session = requests.Session() self.yid = yid self.opts = opts self.url = dict() fmt = "/".join(f for f in [opts.get('format'), self.SET_FMT, self.FALLBACK_FMT] if f and isinstance(f, str)) self.ytdl = youtube_dl.YoutubeDL({"quiet": True, "format": fmt}) self.ytdl.add_info_extractor( self.ytdl.get_info_extractor("Youtube") )
def __init__(self, yid, opts=dict()): if self.RICKASTLEY: yid = "dQw4w9WgXcQ" #trolololo if not isinstance(yid, str) or len(yid) != 11: raise ValueError( "yid expected to be valid Youtube movie identifier") #FIXME self.data = tempfile.SpooledTemporaryFile() self.global_dl_lock = False self.thread = [] self.avail = range_t() self.safe_range = range_t() self.processing_range = range_t() self.spooled = 1 self.filesize = 4096 self.r_session = requests.Session() self.yid = yid self.opts = opts self.url = dict() fmt = "/".join( f for f in [opts.get('format'), self.SET_FMT, self.FALLBACK_FMT] if f and isinstance(f, str)) self.ytdl = youtube_dl.YoutubeDL({"quiet": True, "format": fmt}) self.ytdl.add_info_extractor(self.ytdl.get_info_extractor("Youtube"))
def read(self, offset, length, fh): """ Read data. Method returns data instantly, if they're avaialable and in ``self.safe_range``. Otherwise data is downloaded and then returned. Parameters ---------- start : int Left boundary of desired data range. end : int Right boundary of desired data range. fh : int File descriptor. """ current = (offset, offset + length) safe = [ current[0] - ( 8 * length ), current[1] + ( 16 * length ) ] if safe[0] < 0: safe[0] = 0 if safe[1] > self.filesize: safe[1] = self.filesize safe = tuple(safe) need = [ safe[0] - ( 8 * length ), safe[1] + ( 16 * length ) ] if need[0] < 0: need[0] = 0 if need[1] > self.filesize: need[1] = self.filesize need = tuple(need) ws = range_t() if self.processing_range.contains(need): # needed range overlaps with currently processed. ws += self.processing_range - (self.processing_range - need) # to make that simplier, range_t should be updated FIXME if current not in self.safe_range: # data is read outside of ``self.safe_range`` - we have to download a bit. dls = range_t({need}) - self.avail # missing data range. dls -= ws # we substract ranges, that we wait for, because somebody else takes care of them. self.processing_range += dls for r in dls.toset(): _t = Thread( target=Downloader.fetch, args=(self, r, fh) ) # download _t.daemon = True _t.start() self.thread.append(_t) self.avail.setWaiting(need) # wait for data we need to be ready. self.safe_range += safe #if offset > self.spooled * 2 * 1024**2: # zapisujemy dane na dysk # self.data.rollover() # self.spooled += 1 # done, we can return data: self.data.seek(offset) return self.data.read(length) #FIXME - error handling
def __init__(self, yid): if self.RICKASTLEY: yid = "dQw4w9WgXcQ" #trolololo if not isinstance(yid, str) or len(yid) != 11: raise ValueError("yid expected to be valid Youtube movie identifier") #FIXME self.data = tempfile.SpooledTemporaryFile() self.global_dl_lock = False self.thread = [] self.avail = range_t() self.safe_range = range_t() self.processing_range = range_t() self.spooled = 1; self.filesize = 4096 self.r_session = requests.Session() self.yid = yid self.ytdl = youtube_dl.YoutubeDL({"quiet": True, "format": "bestvideo+bestaudio"}) self.ytdl.add_info_extractor( self.ytdl.get_info_extractor("Youtube") )