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:
stabbedbybrick 2024-04-17 12:24:30 +02:00
parent ffbcf011e0
commit 7bffda758f
2 changed files with 17 additions and 3 deletions

View File

@ -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:

View File

@ -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"