fix(iP): Fix missing version data
Some episodes return nothing from the API. In those cases, the episode id will be fetched from the page source code.
This commit is contained in:
parent
ffbcf011e0
commit
7bffda758f
@ -126,13 +126,24 @@ class iP(Service):
|
|||||||
|
|
||||||
def get_tracks(self, title: Union[Movie, Episode]) -> Tracks:
|
def get_tracks(self, title: Union[Movie, Episode]) -> Tracks:
|
||||||
r = self.session.get(url=self.config["endpoints"]["playlist"].format(pid=title.id))
|
r = self.session.get(url=self.config["endpoints"]["playlist"].format(pid=title.id))
|
||||||
r.raise_for_status()
|
if not r.ok:
|
||||||
|
self.log.error(r.text)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
versions = r.json().get("allAvailableVersions")
|
||||||
|
if not versions:
|
||||||
|
r = self.session.get(self.config["base_url"].format(type="episode", pid=title.id))
|
||||||
|
redux = re.search("window.__IPLAYER_REDUX_STATE__ = (.*?);</script>", r.text).group(1)
|
||||||
|
data = json.loads(redux)
|
||||||
|
versions = [
|
||||||
|
{"pid": x.get("id") for x in data["versions"] if not x.get("kind") == "audio-described"}
|
||||||
|
]
|
||||||
|
|
||||||
quality = [
|
quality = [
|
||||||
connection.get("height")
|
connection.get("height")
|
||||||
for i in (
|
for i in (
|
||||||
self.check_all_versions(version)
|
self.check_all_versions(version)
|
||||||
for version in (x.get("pid") for x in r.json()["allAvailableVersions"])
|
for version in (x.get("pid") for x in versions)
|
||||||
)
|
)
|
||||||
for connection in i
|
for connection in i
|
||||||
if connection.get("height")
|
if connection.get("height")
|
||||||
@ -140,7 +151,7 @@ class iP(Service):
|
|||||||
max_quality = max((h for h in quality if h < "1080"), default=None)
|
max_quality = max((h for h in quality if h < "1080"), default=None)
|
||||||
|
|
||||||
media = next((i for i in (self.check_all_versions(version)
|
media = next((i for i in (self.check_all_versions(version)
|
||||||
for version in (x.get("pid") for x in r.json()["allAvailableVersions"]))
|
for version in (x.get("pid") for x in versions))
|
||||||
if any(connection.get("height") == max_quality for connection in i)), None)
|
if any(connection.get("height") == max_quality for connection in i)), None)
|
||||||
|
|
||||||
connection = {}
|
connection = {}
|
||||||
@ -296,6 +307,7 @@ class iP(Service):
|
|||||||
number=ep_num,
|
number=ep_num,
|
||||||
name=ep_name,
|
name=ep_name,
|
||||||
language="en",
|
language="en",
|
||||||
|
data=episode,
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_single_episode(self, url: str) -> Series:
|
def get_single_episode(self, url: str) -> Series:
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
base_url: https://www.bbc.co.uk/iplayer/{type}/{pid}
|
||||||
user_agent: 'smarttv_AFTMM_Build_0003255372676_Chromium_41.0.2250.2'
|
user_agent: 'smarttv_AFTMM_Build_0003255372676_Chromium_41.0.2250.2'
|
||||||
api_key: 'D2FgtcTxGqqIgLsfBWTJdrQh2tVdeaAp'
|
api_key: 'D2FgtcTxGqqIgLsfBWTJdrQh2tVdeaAp'
|
||||||
|
|
||||||
@ -7,3 +8,4 @@ endpoints:
|
|||||||
manifest: "https://open.live.bbc.co.uk/mediaselector/6/select/version/2.0/mediaset/{mediaset}/vpid/{vpid}/"
|
manifest: "https://open.live.bbc.co.uk/mediaselector/6/select/version/2.0/mediaset/{mediaset}/vpid/{vpid}/"
|
||||||
manifest_: 'https://securegate.iplayer.bbc.co.uk/mediaselector/6/select/version/2.0/vpid/{vpid}/format/json/mediaset/{mediaset}/proto/https'
|
manifest_: 'https://securegate.iplayer.bbc.co.uk/mediaselector/6/select/version/2.0/vpid/{vpid}/format/json/mediaset/{mediaset}/proto/https'
|
||||||
search: "https://search.api.bbci.co.uk/formula/iplayer-ibl-root"
|
search: "https://search.api.bbci.co.uk/formula/iplayer-ibl-root"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user