Example #1
0
    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") )
Example #2
0
    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"))
Example #3
0
    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
Example #4
0
    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") )