Fix for m3u8 ATVP + DSNP
This commit is contained in:
parent
b3601b2d12
commit
bb3087750f
Binary file not shown.
@ -37,40 +37,14 @@ def parse(master, source=None):
|
|||||||
# uses master.session_keys instead of master.keys as master.keys is ONLY EXT-X-KEYS and
|
# uses master.session_keys instead of master.keys as master.keys is ONLY EXT-X-KEYS and
|
||||||
# doesn't include EXT-X-SESSION-KEYS which is whats used for variant playlist M3U8.
|
# doesn't include EXT-X-SESSION-KEYS which is whats used for variant playlist M3U8.
|
||||||
try:
|
try:
|
||||||
psshPR = [
|
psshPR = [x.uri.split(",")[-1] for x in master.session_keys if x.keyformat.lower() == "com.microsoft.playready"][0]
|
||||||
session_key.uri.split(",")[-1]
|
except IndexError:
|
||||||
for session_key in master.session_keys
|
psshPR = [x.uri.split(",")[-1] for x in master.session_keys if x.keyformat.lower() == "com.microsoft.playready"]
|
||||||
if (
|
|
||||||
session_key.keyformat.lower() == "com.microsoft.playready"
|
|
||||||
and
|
|
||||||
source == "DSNP"
|
|
||||||
and
|
|
||||||
x.stream_info.characteristics.lower().replace('"', "") in session_key.characteristics.lower().split(",")
|
|
||||||
)
|
|
||||||
][0]
|
|
||||||
except:
|
|
||||||
try:
|
|
||||||
psshPR = [x.uri.split(",")[-1] for x in master.session_keys if x.keyformat.lower() == "com.microsoft.playready"][0]
|
|
||||||
except IndexError:
|
|
||||||
psshPR = [x.uri.split(",")[-1] for x in master.session_keys if x.keyformat.lower() == "com.microsoft.playready"]
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
psshWV = [
|
psshWV = [x.uri.split(",")[-1] for x in master.session_keys if x.keyformat.lower() == "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"][0]
|
||||||
session_key.uri.split(",")[-1]
|
|
||||||
for session_key in master.session_keys
|
|
||||||
if (
|
|
||||||
session_key.keyformat.lower() == "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"
|
|
||||||
and
|
|
||||||
source == "DSNP"
|
|
||||||
and
|
|
||||||
x.stream_info.characteristics.lower().replace('"', "") in session_key.characteristics.lower().split(",")
|
|
||||||
)
|
|
||||||
][0]
|
|
||||||
except IndexError:
|
except IndexError:
|
||||||
try:
|
psshWV = [x.uri.split(",")[-1] for x in master.session_keys if x.keyformat.lower() == "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"]
|
||||||
psshWV = [x.uri.split(",")[-1] for x in master.session_keys if x.keyformat.lower() == "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"][0]
|
|
||||||
except IndexError:
|
|
||||||
psshWV = [x.uri.split(",")[-1] for x in master.session_keys if x.keyformat.lower() == "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"]
|
|
||||||
# if pssh:
|
# if pssh:
|
||||||
# pssh = base64.b64decode(pssh)
|
# pssh = base64.b64decode(pssh)
|
||||||
# # noinspection PyBroadException
|
# # noinspection PyBroadException
|
||||||
@ -108,8 +82,24 @@ def parse(master, source=None):
|
|||||||
descriptor=Track.Descriptor.M3U,
|
descriptor=Track.Descriptor.M3U,
|
||||||
# decryption
|
# decryption
|
||||||
encrypted=bool(master.keys or master.session_keys),
|
encrypted=bool(master.keys or master.session_keys),
|
||||||
psshWV=psshWV,
|
psshWV= [
|
||||||
psshPR=psshPR,
|
session_key.uri.split(",")[-1]
|
||||||
|
for session_key in master.session_keys
|
||||||
|
if (
|
||||||
|
session_key.keyformat.lower() == "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"
|
||||||
|
and
|
||||||
|
x.stream_info.characteristics.lower().replace('"', "") in session_key.characteristics.lower().split(",")
|
||||||
|
)
|
||||||
|
][0] if source == "DSNP" else (psshWV if psshWV != [] else None),
|
||||||
|
psshPR=[
|
||||||
|
session_key.uri.split(",")[-1]
|
||||||
|
for session_key in master.session_keys
|
||||||
|
if (
|
||||||
|
session_key.keyformat.lower() == "com.microsoft.playready"
|
||||||
|
and
|
||||||
|
x.stream_info.characteristics.lower().replace('"', "") in session_key.characteristics.lower().split(",")
|
||||||
|
)
|
||||||
|
][0] if source == "DSNP" else (psshPR if psshPR != [] else None),
|
||||||
# extra
|
# extra
|
||||||
extra=x
|
extra=x
|
||||||
) for x in master.playlists],
|
) for x in master.playlists],
|
||||||
|
|||||||
@ -106,7 +106,7 @@ class AppleTVPlus(BaseService):
|
|||||||
id_=self.title,
|
id_=self.title,
|
||||||
type_=Title.Types.MOVIE,
|
type_=Title.Types.MOVIE,
|
||||||
name=title_information["title"],
|
name=title_information["title"],
|
||||||
#year=datetime.utcfromtimestamp(title_information["releaseDate"] / 1000).year,
|
year=datetime.utcfromtimestamp(title_information["releaseDate"] / 1000).year,
|
||||||
original_lang=title_information["originalSpokenLanguages"][0]["locale"],
|
original_lang=title_information["originalSpokenLanguages"][0]["locale"],
|
||||||
source=self.ALIASES[0],
|
source=self.ALIASES[0],
|
||||||
service_data=title_information
|
service_data=title_information
|
||||||
@ -117,8 +117,8 @@ class AppleTVPlus(BaseService):
|
|||||||
id_=self.title,
|
id_=self.title,
|
||||||
type_=Title.Types.MOVIE,
|
type_=Title.Types.MOVIE,
|
||||||
name=title_information["title"],
|
name=title_information["title"],
|
||||||
#year=datetime.utcfromtimestamp(title_information["releaseDate"] / 1000).year,
|
year=datetime.utcfromtimestamp(title_information["releaseDate"] / 1000).year,
|
||||||
#original_lang=title_information["originalSpokenLanguages"][0]["locale"],
|
original_lang=title_information["originalSpokenLanguages"][0]["locale"],
|
||||||
source=self.ALIASES[0],
|
source=self.ALIASES[0],
|
||||||
service_data=title_information
|
service_data=title_information
|
||||||
)
|
)
|
||||||
@ -243,13 +243,7 @@ class AppleTVPlus(BaseService):
|
|||||||
)
|
)
|
||||||
])
|
])
|
||||||
except:
|
except:
|
||||||
return Tracks([
|
return Tracks([x for x in tracks])
|
||||||
# multiple CDNs, only want one
|
|
||||||
x for x in tracks
|
|
||||||
#if any(
|
|
||||||
# cdn in as_list(x.url)[0].split("?")[1].split("&") for cdn in ["cdn=ak", "cdn=vod-ak-aoc.tv.apple.com"]
|
|
||||||
#)
|
|
||||||
])
|
|
||||||
|
|
||||||
def get_chapters(self, title):
|
def get_chapters(self, title):
|
||||||
return []
|
return []
|
||||||
@ -284,7 +278,10 @@ class AppleTVPlus(BaseService):
|
|||||||
if not e.response.text:
|
if not e.response.text:
|
||||||
raise self.log.exit(" - No license returned!")
|
raise self.log.exit(" - No license returned!")
|
||||||
raise self.log.exit(f" - Unable to obtain license (error code: {e.response.json()['errorCode']})")
|
raise self.log.exit(f" - Unable to obtain license (error code: {e.response.json()['errorCode']})")
|
||||||
return base64.b64decode(res['streaming-response']['streaming-keys'][0]["license"])
|
try:
|
||||||
|
return base64.b64decode(res['streaming-response']['streaming-keys'][0]["license"])
|
||||||
|
except:
|
||||||
|
raise self.log.exit(res['streaming-response'])
|
||||||
|
|
||||||
# Service specific functions
|
# Service specific functions
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@ aria2c:
|
|||||||
cdm:
|
cdm:
|
||||||
default: 'hisense_smarttv_he55a7000euwts_sl3000'
|
default: 'hisense_smarttv_he55a7000euwts_sl3000'
|
||||||
Amazon: 'hisense_smarttv_he55a7000euwts_sl3000'
|
Amazon: 'hisense_smarttv_he55a7000euwts_sl3000'
|
||||||
|
AppleTVPlus: 'mtc_mtc_atv_atv_sl3000'
|
||||||
Hotstar: 'xiaomi_mi_a1_15.0.0_60ceee88_8159_l3'
|
Hotstar: 'xiaomi_mi_a1_15.0.0_60ceee88_8159_l3'
|
||||||
Jio: 'xiaomi_mi_a1_15.0.0_60ceee88_8159_l3'
|
Jio: 'xiaomi_mi_a1_15.0.0_60ceee88_8159_l3'
|
||||||
DisneyPlus: 'mtc_mtc_atv_atv_sl3000'
|
DisneyPlus: 'mtc_mtc_atv_atv_sl3000'
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user