def download_hds(options, url, swf=None): data = get_http_data(url) streams = {} bootstrap = {} xml = ET.XML(data) prefix = xml.find("{http://ns.adobe.com/f4m/1.0}id").text if sys.version_info < (2, 7): bootstrapIter = xml.getiterator("{http://ns.adobe.com/f4m/1.0}bootstrapInfo") mediaIter = xml.getiterator("{http://ns.adobe.com/f4m/1.0}media") else: bootstrapIter = xml.iter("{http://ns.adobe.com/f4m/1.0}bootstrapInfo") mediaIter = xml.iter("{http://ns.adobe.com/f4m/1.0}media") for i in bootstrapIter: bootstrap[i.attrib["id"]] = i.text for i in mediaIter: streams[int(i.attrib["bitrate"])] = {"url": i.attrib["url"], "bootstrapInfoId": i.attrib["bootstrapInfoId"], "metadata": i.find("{http://ns.adobe.com/f4m/1.0}metadata").text} test = select_quality(options, streams) bootstrap = base64.b64decode(bootstrap[test["bootstrapInfoId"]]) box = readboxtype(bootstrap, 0) if box[2] == "abst": antal = readbox(bootstrap, box[0]) baseurl = url[0:url.rfind("/")] i = 1 if options.output != "-": extension = re.search("(\.[a-z0-9]+)$", options.output) if not extension: options.output = "%s.flv" % options.output log.info("Outfile: %s", options.output) file_d = open(options.output, "wb") else: file_d = sys.stdout metasize = struct.pack(">L", len(base64.b64decode(test["metadata"])))[1:] file_d.write(binascii.a2b_hex(b"464c560105000000090000000012")) file_d.write(metasize) file_d.write(binascii.a2b_hex(b"00000000000000")) file_d.write(base64.b64decode(test["metadata"])) file_d.write(binascii.a2b_hex(b"00000000")) total = antal[1]["total"] eta = ETA(total) while i <= total: url = "%s/%sSeg1-Frag%s" % (baseurl, test["url"], i) if options.output != "-": eta.update(i) progressbar(total, i, ''.join(["ETA: ", str(eta)])) data = get_http_data(url) number = decode_f4f(i, data) file_d.write(data[number:]) i += 1 if options.output != "-": file_d.close() progress_stream.write('\n')
def download(self): """ Get the stream from HTTP """ data = self.http.request("get", self.url, stream=True) try: total_size = data.headers['content-length'] except KeyError: total_size = 0 total_size = int(total_size) bytes_so_far = 0 file_d = output(self.options, "mp4") if hasattr(file_d, "read") is False: return eta = ETA(total_size) for i in data.iter_content(8192): bytes_so_far += len(i) file_d.write(i) if self.options.output != "-" and not self.options.silent: eta.update(bytes_so_far) progressbar(total_size, bytes_so_far, ''.join(["ETA: ", str(eta)])) if self.options.output != "-": file_d.close() self.finished = True
def download(self): if self.options.live and not self.options.force: raise LiveHDSException(self.url) querystring = self.kwargs["querystring"] cookies = self.kwargs["cookies"] bootstrap = base64.b64decode(self.kwargs["bootstrap"]) box = readboxtype(bootstrap, 0) antal = None if box[2] == b"abst": antal = readbox(bootstrap, box[0]) baseurl = self.kwargs["manifest"][0:self.kwargs["manifest"].rfind("/")] file_d = output(self.options, "flv") if hasattr(file_d, "read") is False: return metasize = struct.pack(">L", len(base64.b64decode( self.kwargs["metadata"])))[1:] file_d.write(binascii.a2b_hex(b"464c560105000000090000000012")) file_d.write(metasize) file_d.write(binascii.a2b_hex(b"00000000000000")) file_d.write(base64.b64decode(self.kwargs["metadata"])) file_d.write(binascii.a2b_hex(b"00000000")) i = 1 start = antal[1]["first"] total = antal[1]["total"] eta = ETA(total) while i <= total: url = "%s/%sSeg1-Frag%s?%s" % (baseurl, self.url, start, querystring) if self.options.output != "-" and not self.options.silent: eta.update(i) progressbar(total, i, ''.join(["ETA: ", str(eta)])) data = self.http.request("get", url, cookies=cookies) if data.status_code == 404: break data = data.content number = decode_f4f(i, data) file_d.write(data[number:]) i += 1 start += 1 if self.options.output != "-": file_d.close() if not self.options.silent: progress_stream.write('\n') self.finished = True
def download(self): if self.options.live and not self.options.force: raise LiveHDSException(self.url) querystring = self.kwargs["querystring"] bootstrap = base64.b64decode(self.kwargs["bootstrap"]) box = readboxtype(bootstrap, 0) antal = None if box[2] == b"abst": antal = readbox(bootstrap, box[0]) baseurl = self.kwargs["manifest"][0:self.kwargs["manifest"].rfind("/")] if self.options.output != "-": extension = re.search(r"(\.[a-z0-9]+)$", self.options.output) if not extension: self.options.output = "%s.flv" % self.options.output log.info("Outfile: %s", self.options.output) if os.path.isfile(self.options.output) and not self.options.force: log.info("File already exists. use --force to overwrite") return file_d = open(self.options.output, "wb") else: file_d = sys.stdout metasize = struct.pack(">L", len(base64.b64decode(self.kwargs["metadata"])))[1:] file_d.write(binascii.a2b_hex(b"464c560105000000090000000012")) file_d.write(metasize) file_d.write(binascii.a2b_hex(b"00000000000000")) file_d.write(base64.b64decode(self.kwargs["metadata"])) file_d.write(binascii.a2b_hex(b"00000000")) i = 1 start = antal[1]["first"] total = antal[1]["total"] eta = ETA(total) while i <= total: url = "%s/%sSeg1-Frag%s?%s" % (baseurl, self.url, start, querystring) if self.options.output != "-": eta.update(i) progressbar(total, i, ''.join(["ETA: ", str(eta)])) data = get_http_data(url) number = decode_f4f(i, data) file_d.write(data[number:]) i += 1 start += 1 if self.options.output != "-": file_d.close() progress_stream.write('\n')
def _download_url(self, url, audio=False, total_size=None): cookies = self.kwargs["cookies"] data = self.http.request("get", url, cookies=cookies, headers={'Range': 'bytes=0-8192'}) if not total_size: try: total_size = data.headers['Content-Range'] total_size = total_size[total_size.find("/") + 1:] total_size = int(total_size) except KeyError: raise KeyError("Can't get the total size.") bytes_so_far = 8192 if audio: file_d = output(copy.copy(self.options), "m4a") else: file_d = output(self.options, self.options.other) if file_d is None: return file_d.write(data.content) eta = ETA(total_size) while bytes_so_far < total_size: if not self.options.silent: eta.update(bytes_so_far) progressbar(total_size, bytes_so_far, ''.join(["ETA: ", str(eta)])) old = bytes_so_far + 1 bytes_so_far = total_size bytes_range = "bytes={0}-{1}".format(old, bytes_so_far) data = self.http.request("get", url, cookies=cookies, headers={'Range': bytes_range}) file_d.write(data.content) file_d.close() progressbar(bytes_so_far, total_size, "ETA: complete") progress_stream.write('\n') self.finished = True
def download(self): if self.options.live and not self.options.force: raise LiveHDSException(self.url) querystring = self.kwargs["querystring"] cookies = self.kwargs["cookies"] bootstrap = base64.b64decode(self.kwargs["bootstrap"]) box = readboxtype(bootstrap, 0) antal = None if box[2] == b"abst": antal = readbox(bootstrap, box[0]) baseurl = self.kwargs["manifest"][0:self.kwargs["manifest"].rfind("/")] file_d = output(self.options, "flv") if hasattr(file_d, "read") is False: return metasize = struct.pack(">L", len(base64.b64decode(self.kwargs["metadata"])))[1:] file_d.write(binascii.a2b_hex(b"464c560105000000090000000012")) file_d.write(metasize) file_d.write(binascii.a2b_hex(b"00000000000000")) file_d.write(base64.b64decode(self.kwargs["metadata"])) file_d.write(binascii.a2b_hex(b"00000000")) i = 1 start = antal[1]["first"] total = antal[1]["total"] eta = ETA(total) while i <= total: url = "%s/%sSeg1-Frag%s?%s" % (baseurl, self.url, start, querystring) if self.options.output != "-" and not self.options.silent: eta.update(i) progressbar(total, i, ''.join(["ETA: ", str(eta)])) data = self.http.request("get", url, cookies=cookies) if data.status_code == 404: break data = data.content number = decode_f4f(i, data) file_d.write(data[number:]) i += 1 start += 1 if self.options.output != "-": file_d.close() if not self.options.silent: progress_stream.write('\n') self.finished = True
def _download(self, url, audio=False): cookies = self.kwargs["cookies"] data = self.http.request("get", url, cookies=cookies, headers={'Range': 'bytes=0-8192'}) try: total_size = data.headers['Content-Range'] total_size = total_size[total_size.find("/") + 1:] except KeyError: total_size = 0 total_size = int(total_size) bytes_so_far = 8192 if audio: file_d = output(copy.copy(self.options), "m4a") else: file_d = output(self.options, self.options.other) if hasattr(file_d, "read") is False: return file_d.write(data.content) eta = ETA(total_size) while bytes_so_far < total_size: old = bytes_so_far + 1 bytes_so_far = old + 1000000 if bytes_so_far > total_size: bytes_so_far = total_size bytes_range = "bytes=%s-%s" % (old, bytes_so_far) data = self.http.request("get", url, cookies=cookies, headers={'Range': bytes_range}) file_d.write(data.content) if self.options.output != "-" and not self.options.silent: eta.update(old) progressbar(total_size, old, ''.join(["ETA: ", str(eta)])) if self.options.output != "-": file_d.close() progressbar(bytes_so_far, total_size, "ETA: complete") progress_stream.write('\n') self.finished = True
def download(self): if self.options.live and not self.options.force: raise LiveHDSException(self.url) querystring = self.kwargs["querystring"] bootstrap = base64.b64decode(self.kwargs["bootstrap"]) box = readboxtype(bootstrap, 0) antal = None if box[2] == b"abst": antal = readbox(bootstrap, box[0]) baseurl = self.kwargs["manifest"][0:self.kwargs["manifest"].rfind("/")] file_d = output(self.options, "flv") if hasattr(file_d, "read") is False: return metasize = struct.pack(">L", len(base64.b64decode(self.kwargs["metadata"])))[1:] file_d.write(binascii.a2b_hex(b"464c560105000000090000000012")) file_d.write(metasize) file_d.write(binascii.a2b_hex(b"00000000000000")) file_d.write(base64.b64decode(self.kwargs["metadata"])) file_d.write(binascii.a2b_hex(b"00000000")) i = 1 start = antal[1]["first"] total = antal[1]["total"] eta = ETA(total) while i <= total: url = "%s/%sSeg1-Frag%s?%s" % (baseurl, self.url, start, querystring) if self.options.output != "-": eta.update(i) progressbar(total, i, ''.join(["ETA: ", str(eta)])) error, data = get_http_data(url) if error: log.error("Missing segment in playlist") return number = decode_f4f(i, data) file_d.write(data[number:]) i += 1 start += 1 if self.options.output != "-": file_d.close() progress_stream.write('\n')
def _download(self, url, audio=False): cookies = self.kwargs["cookies"] data = self.http.request( "get", url, cookies=cookies, headers={'Range': 'bytes=0-8192'}) try: total_size = data.headers['Content-Range'] total_size = total_size[total_size.find("/") + 1:] except KeyError: total_size = 0 total_size = int(total_size) bytes_so_far = 8192 if audio: file_d = output(copy.copy(self.options), "m4a") else: file_d = output(self.options, self.options.other) if hasattr(file_d, "read") is False: return file_d.write(data.content) eta = ETA(total_size) while bytes_so_far < total_size: old = bytes_so_far + 1 bytes_so_far = old + 1000000 if bytes_so_far > total_size: bytes_so_far = total_size bytes_range = "bytes=%s-%s" % (old, bytes_so_far) data = self.http.request( "get", url, cookies=cookies, headers={'Range': bytes_range}) file_d.write(data.content) if self.options.output != "-" and not self.options.silent: eta.update(old) progressbar(total_size, old, ''.join(["ETA: ", str(eta)])) if self.options.output != "-": file_d.close() progress_stream.write('\n') self.finished = True