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:
parent
218f61b95d
commit
383c0650d7
@ -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
|
@ -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)]))
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user