1
0
mirror of https://github.com/spaam/svtplay-dl.git synced 2024-11-24 04:05:39 +01:00

hds: parse and kwargssupport

This commit is contained in:
Johan Andersson 2014-04-27 13:19:34 +02:00
parent 218f61b95d
commit 383c0650d7
3 changed files with 32 additions and 30 deletions

View File

@ -1,5 +1,6 @@
class VideoRetriever: class VideoRetriever:
def __init__(self, options, url, bitrate): def __init__(self, options, url, bitrate, **kwargs):
self.options = options self.options = options
self.url = url self.url = url
self.bitrate = bitrate self.bitrate = bitrate
self.kwargs = kwargs

View File

@ -41,38 +41,37 @@ class LiveHDSException(HDSException):
super(LiveHDSException, self).__init__( super(LiveHDSException, self).__init__(
url, "This is a live HDS stream, and they are not supported.") url, "This is a live HDS stream, and they are not supported.")
def hdsparse(options, manifest):
data = get_http_data(manifest)
streams = {}
bootstrap = {}
xml = ET.XML(data)
if is_py2_old:
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"])] = HDS(options, i.attrib["url"], i.attrib["bitrate"], manifest=manifest, bootstrap=bootstrap[i.attrib["bootstrapInfoId"]], metadata=i.find("{http://ns.adobe.com/f4m/1.0}metadata").text)
return streams
class HDS(VideoRetriever): class HDS(VideoRetriever):
def download(self): def download(self):
data = get_http_data(self.url)
streams = {}
bootstrap = {}
xml = ET.XML(data)
if self.options.live and not self.options.force: if self.options.live and not self.options.force:
raise LiveHDSException(self.url) raise LiveHDSException(self.url)
if is_py2_old: bootstrap = base64.b64decode(self.kwargs["bootstrap"])
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(self.options, streams)
bootstrap = base64.b64decode(bootstrap[test["bootstrapInfoId"]])
box = readboxtype(bootstrap, 0) box = readboxtype(bootstrap, 0)
antal = None antal = None
if box[2] == b"abst": if box[2] == b"abst":
antal = readbox(bootstrap, box[0]) antal = readbox(bootstrap, box[0])
baseurl = self.url[0:self.url.rfind("/")] baseurl = self.kwargs["manifest"][0:self.kwargs["manifest"].rfind("/")]
i = 1 i = 1
if self.options.output != "-": if self.options.output != "-":
@ -84,16 +83,16 @@ class HDS(VideoRetriever):
else: else:
file_d = sys.stdout file_d = sys.stdout
metasize = struct.pack(">L", len(base64.b64decode(test["metadata"])))[1:] metasize = struct.pack(">L", len(base64.b64decode(self.kwargs["metadata"])))[1:]
file_d.write(binascii.a2b_hex(b"464c560105000000090000000012")) file_d.write(binascii.a2b_hex(b"464c560105000000090000000012"))
file_d.write(metasize) file_d.write(metasize)
file_d.write(binascii.a2b_hex(b"00000000000000")) file_d.write(binascii.a2b_hex(b"00000000000000"))
file_d.write(base64.b64decode(test["metadata"])) file_d.write(base64.b64decode(self.kwargs["metadata"]))
file_d.write(binascii.a2b_hex(b"00000000")) file_d.write(binascii.a2b_hex(b"00000000"))
total = antal[1]["total"] total = antal[1]["total"]
eta = ETA(total) eta = ETA(total)q
while i <= total: while i <= total:
url = "%s/%sSeg1-Frag%s" % (baseurl, test["url"], i) url = "%s/%sSeg1-Frag%s" % (baseurl, self.url, i)
if self.options.output != "-": if self.options.output != "-":
eta.update(i) eta.update(i)
progressbar(total, i, ''.join(["ETA: ", str(eta)])) progressbar(total, i, ''.join(["ETA: ", str(eta)]))

View File

@ -9,7 +9,7 @@ import xml.etree.ElementTree as ET
from svtplay_dl.service import Service, OpenGraphThumbMixin from svtplay_dl.service import Service, OpenGraphThumbMixin
from svtplay_dl.utils import get_http_data from svtplay_dl.utils import get_http_data
from svtplay_dl.utils.urllib import urlparse from svtplay_dl.utils.urllib import urlparse
from svtplay_dl.fetcher.hds import HDS from svtplay_dl.fetcher.hds import HDS, hdsparse
from svtplay_dl.fetcher.hls import HLS, hlsparse from svtplay_dl.fetcher.hls import HLS, hlsparse
from svtplay_dl.fetcher.rtmp import RTMP from svtplay_dl.fetcher.rtmp import RTMP
from svtplay_dl.fetcher.http import HTTP from svtplay_dl.fetcher.http import HTTP
@ -63,7 +63,9 @@ class Svtplay(Service, OpenGraphThumbMixin):
match = re.search(r"\/se\/secure\/", i["url"]) match = re.search(r"\/se\/secure\/", i["url"])
if not match: if not match:
manifest = "%s?hdcore=2.8.0&g=hejsan" % i["url"] manifest = "%s?hdcore=2.8.0&g=hejsan" % i["url"]
yield HDS(options, manifest, i["bitrate"]) streams = hdsparse(options, manifest)
for n in list(streams.keys()):
yield streams[n]
elif parse.scheme == "rtmp": elif parse.scheme == "rtmp":
embedurl = "%s?type=embed" % url embedurl = "%s?type=embed" % url
data = get_http_data(embedurl) data = get_http_data(embedurl)