diff --git a/librespot/audio/__init__.py b/librespot/audio/__init__.py index 920fb39..725d9c1 100644 --- a/librespot/audio/__init__.py +++ b/librespot/audio/__init__.py @@ -331,7 +331,7 @@ class CdnFeedHelper: session: Session, track: Metadata.Track, file: Metadata.AudioFile, resp_or_url: typing.Union[StorageResolve.StorageResolveResponse, str], preload: bool, - halt_listener: HaltListener) -> PlayableContentFeeder.LoadedStream: + halt_listener: HaltListener) -> LoadedStream: if type(resp_or_url) is str: url = resp_or_url else: @@ -345,18 +345,17 @@ class CdnFeedHelper: normalization_data = NormalizationData.read(input_stream) if input_stream.skip(0xA7) != 0xA7: raise IOError("Couldn't skip 0xa7 bytes!") - return PlayableContentFeeder.LoadedStream( + return LoadedStream( track, streamer, normalization_data, - PlayableContentFeeder.Metrics(file.file_id, preload, - -1 if preload else audio_key_time), + file.file_id, preload, audio_key_time ) @staticmethod def load_episode_external( session: Session, episode: Metadata.Episode, - halt_listener: HaltListener) -> PlayableContentFeeder.LoadedStream: + halt_listener: HaltListener) -> LoadedStream: resp = session.client().head(episode.external_url) if resp.status_code != 200: @@ -368,11 +367,11 @@ class CdnFeedHelper: streamer = session.cdn().stream_external_episode( episode, url, halt_listener) - return PlayableContentFeeder.LoadedStream( + return LoadedStream( episode, streamer, None, - PlayableContentFeeder.Metrics(None, False, -1), + None, False, -1 ) @staticmethod @@ -383,7 +382,7 @@ class CdnFeedHelper: resp_or_url: typing.Union[StorageResolve.StorageResolveResponse, str], preload: bool, halt_listener: HaltListener, - ) -> PlayableContentFeeder.LoadedStream: + ) -> LoadedStream: if type(resp_or_url) is str: url = resp_or_url else: @@ -397,12 +396,11 @@ class CdnFeedHelper: normalization_data = NormalizationData.read(input_stream) if input_stream.skip(0xA7) != 0xA7: raise IOError("Couldn't skip 0xa7 bytes!") - return PlayableContentFeeder.LoadedStream( + return LoadedStream( episode, streamer, normalization_data, - PlayableContentFeeder.Metrics(file.file_id, preload, - -1 if preload else audio_key_time), + file.file_id, preload, audio_key_time ) @@ -850,29 +848,13 @@ class PlayableContentFeeder: storage_resolve_response.ParseFromString(body) return storage_resolve_response - class LoadedStream: - episode: Metadata.Episode - track: Metadata.Track - input_stream: GeneralAudioStream - normalization_data: NormalizationData - metrics: PlayableContentFeeder.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 LoadedStream: + episode: Metadata.Episode + track: Metadata.Track + input_stream: GeneralAudioStream + normalization_data: NormalizationData + metrics: Metrics class Metrics: file_id: str @@ -880,13 +862,27 @@ class PlayableContentFeeder: audio_key_time: int def __init__(self, file_id: typing.Union[bytes, None], - preloaded_audio_key: bool, audio_key_time: int): + preloaded_audio_key: bool, audio_key_time: int): self.file_id = None if file_id is None else util.bytes_to_hex( file_id) self.preloaded_audio_key = preloaded_audio_key - self.audio_key_time = audio_key_time - if preloaded_audio_key and audio_key_time != -1: - raise RuntimeError() + self.audio_key_time = -1 if preloaded_audio_key else audio_key_time + + 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: diff --git a/librespot/core.py b/librespot/core.py index c0b10e8..3840776 100644 --- a/librespot/core.py +++ b/librespot/core.py @@ -202,11 +202,14 @@ class ApiClient(Closeable): body = response.content if body is None: - raise RuntimeError() - + raise ConnectionError("Extended Metadata request failed: No response body") + proto = BatchedExtensionResponse() 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 def get_metadata_4_track(self, track: TrackId) -> Metadata.Track: