improved error catching on get_ext_metadata()

reorganize LoadedStream and Metrics definitions for better external referencing
This commit is contained in:
Googolplexed0
2025-11-10 22:10:54 -06:00
parent 3e52743549
commit 10748b8c5c
2 changed files with 39 additions and 40 deletions

View File

@@ -331,7 +331,7 @@ class CdnFeedHelper:
session: Session, track: Metadata.Track, file: Metadata.AudioFile, session: Session, track: Metadata.Track, file: Metadata.AudioFile,
resp_or_url: typing.Union[StorageResolve.StorageResolveResponse, resp_or_url: typing.Union[StorageResolve.StorageResolveResponse,
str], preload: bool, str], preload: bool,
halt_listener: HaltListener) -> PlayableContentFeeder.LoadedStream: halt_listener: HaltListener) -> LoadedStream:
if type(resp_or_url) is str: if type(resp_or_url) is str:
url = resp_or_url url = resp_or_url
else: else:
@@ -345,18 +345,17 @@ class CdnFeedHelper:
normalization_data = NormalizationData.read(input_stream) normalization_data = NormalizationData.read(input_stream)
if input_stream.skip(0xA7) != 0xA7: if input_stream.skip(0xA7) != 0xA7:
raise IOError("Couldn't skip 0xa7 bytes!") raise IOError("Couldn't skip 0xa7 bytes!")
return PlayableContentFeeder.LoadedStream( return LoadedStream(
track, track,
streamer, streamer,
normalization_data, normalization_data,
PlayableContentFeeder.Metrics(file.file_id, preload, file.file_id, preload, audio_key_time
-1 if preload else audio_key_time),
) )
@staticmethod @staticmethod
def load_episode_external( def load_episode_external(
session: Session, episode: Metadata.Episode, session: Session, episode: Metadata.Episode,
halt_listener: HaltListener) -> PlayableContentFeeder.LoadedStream: halt_listener: HaltListener) -> LoadedStream:
resp = session.client().head(episode.external_url) resp = session.client().head(episode.external_url)
if resp.status_code != 200: if resp.status_code != 200:
@@ -368,11 +367,11 @@ class CdnFeedHelper:
streamer = session.cdn().stream_external_episode( streamer = session.cdn().stream_external_episode(
episode, url, halt_listener) episode, url, halt_listener)
return PlayableContentFeeder.LoadedStream( return LoadedStream(
episode, episode,
streamer, streamer,
None, None,
PlayableContentFeeder.Metrics(None, False, -1), None, False, -1
) )
@staticmethod @staticmethod
@@ -383,7 +382,7 @@ class CdnFeedHelper:
resp_or_url: typing.Union[StorageResolve.StorageResolveResponse, str], resp_or_url: typing.Union[StorageResolve.StorageResolveResponse, str],
preload: bool, preload: bool,
halt_listener: HaltListener, halt_listener: HaltListener,
) -> PlayableContentFeeder.LoadedStream: ) -> LoadedStream:
if type(resp_or_url) is str: if type(resp_or_url) is str:
url = resp_or_url url = resp_or_url
else: else:
@@ -397,12 +396,11 @@ class CdnFeedHelper:
normalization_data = NormalizationData.read(input_stream) normalization_data = NormalizationData.read(input_stream)
if input_stream.skip(0xA7) != 0xA7: if input_stream.skip(0xA7) != 0xA7:
raise IOError("Couldn't skip 0xa7 bytes!") raise IOError("Couldn't skip 0xa7 bytes!")
return PlayableContentFeeder.LoadedStream( return LoadedStream(
episode, episode,
streamer, streamer,
normalization_data, normalization_data,
PlayableContentFeeder.Metrics(file.file_id, preload, file.file_id, preload, audio_key_time
-1 if preload else audio_key_time),
) )
@@ -850,29 +848,13 @@ class PlayableContentFeeder:
storage_resolve_response.ParseFromString(body) storage_resolve_response.ParseFromString(body)
return storage_resolve_response return storage_resolve_response
class LoadedStream:
class LoadedStream:
episode: Metadata.Episode episode: Metadata.Episode
track: Metadata.Track track: Metadata.Track
input_stream: GeneralAudioStream input_stream: GeneralAudioStream
normalization_data: NormalizationData normalization_data: NormalizationData
metrics: PlayableContentFeeder.Metrics metrics: Metrics
def __init__(self, track_or_episode: typing.Union[Metadata.Track,
Metadata.Episode],
input_stream: GeneralAudioStream,
normalization_data: typing.Union[NormalizationData, None],
metrics: PlayableContentFeeder.Metrics):
if type(track_or_episode) is Metadata.Track:
self.track = track_or_episode
self.episode = None
elif type(track_or_episode) is Metadata.Episode:
self.track = None
self.episode = track_or_episode
else:
raise TypeError()
self.input_stream = input_stream
self.normalization_data = normalization_data
self.metrics = metrics
class Metrics: class Metrics:
file_id: str file_id: str
@@ -884,9 +866,23 @@ class PlayableContentFeeder:
self.file_id = None if file_id is None else util.bytes_to_hex( self.file_id = None if file_id is None else util.bytes_to_hex(
file_id) file_id)
self.preloaded_audio_key = preloaded_audio_key self.preloaded_audio_key = preloaded_audio_key
self.audio_key_time = audio_key_time self.audio_key_time = -1 if preloaded_audio_key else audio_key_time
if preloaded_audio_key and audio_key_time != -1:
raise RuntimeError() def __init__(self, track_or_episode: typing.Union[Metadata.Track, Metadata.Episode],
input_stream: GeneralAudioStream,
normalization_data: typing.Union[NormalizationData, None],
file_id: str, preloaded_audio_key: bool, audio_key_time: int):
if type(track_or_episode) is Metadata.Track:
self.track = track_or_episode
self.episode = None
elif type(track_or_episode) is Metadata.Episode:
self.track = None
self.episode = track_or_episode
else:
raise TypeError()
self.input_stream = input_stream
self.normalization_data = normalization_data
self.metrics = self.Metrics(file_id, preloaded_audio_key, audio_key_time)
class StreamId: class StreamId:

View File

@@ -202,11 +202,14 @@ class ApiClient(Closeable):
body = response.content body = response.content
if body is None: if body is None:
raise RuntimeError() raise ConnectionError("Extended Metadata request failed: No response body")
proto = BatchedExtensionResponse() proto = BatchedExtensionResponse()
proto.ParseFromString(body) proto.ParseFromString(body)
mdb: bytes = proto.extended_metadata.pop().extension_data.pop().extension_data.value entityextd = proto.extended_metadata.pop().extension_data.pop()
if entityextd.header.status_code != 200:
raise ConnectionError("Extended Metadata request failed: Status code {}".format(entityextd.header.status_code))
mdb: bytes = entityextd.extension_data.value
return mdb return mdb
def get_metadata_4_track(self, track: TrackId) -> Metadata.Track: def get_metadata_4_track(self, track: TrackId) -> Metadata.Track: