From: Marcel van der Veldt Date: Tue, 31 May 2022 15:29:21 +0000 (+0200) Subject: Fix playback of provided plain url (#353) X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=3cfeabbee7a5f79bd0839ba4424721f309ecafc9;p=music-assistant-server.git Fix playback of provided plain url (#353) --- diff --git a/music_assistant/controllers/stream.py b/music_assistant/controllers/stream.py index 1e35909c..29c1767a 100644 --- a/music_assistant/controllers/stream.py +++ b/music_assistant/controllers/stream.py @@ -495,7 +495,7 @@ class StreamController: sample_size = int(sample_rate * (bit_depth / 8) * channels) # 1 second buffer_size = sample_size * (queue.settings.crossfade_duration or 2) # force small buffer for radio to prevent too much lag at start - if queue_track.media_type == MediaType.RADIO: + if queue_track.media_type != MediaType.TRACK: use_crossfade = False buffer_size = sample_size diff --git a/music_assistant/models/enums.py b/music_assistant/models/enums.py index e3bb43cd..b1495e1d 100644 --- a/music_assistant/models/enums.py +++ b/music_assistant/models/enums.py @@ -95,11 +95,10 @@ class ContentType(Enum): PCM_S32LE = "s32le" # PCM signed 32-bit little-endian PCM_F32LE = "f32le" # PCM 32-bit floating-point little-endian PCM_F64LE = "f64le" # PCM 64-bit floating-point little-endian + UNKNOWN = "?" @classmethod - def try_parse( - cls: "ContentType", string: str, fallback: str = "mp3" - ) -> "ContentType": + def try_parse(cls: "ContentType", string: str) -> "ContentType": """Try to parse ContentType from (url)string.""" tempstr = string.lower() if "." in tempstr: @@ -109,7 +108,7 @@ class ContentType(Enum): try: return cls(tempstr) except ValueError: - return cls(fallback) + return cls.UNKNOWN def is_pcm(self): """Return if contentype is PCM.""" diff --git a/music_assistant/models/player_queue.py b/music_assistant/models/player_queue.py index 628bfccc..047d1150 100644 --- a/music_assistant/models/player_queue.py +++ b/music_assistant/models/player_queue.py @@ -7,12 +7,7 @@ from asyncio import Task, TimerHandle from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union from music_assistant.helpers.audio import get_stream_details -from music_assistant.models.enums import ( - EventType, - MediaType, - QueueOption, - RepeatMode, -) +from music_assistant.models.enums import EventType, MediaType, QueueOption, RepeatMode from music_assistant.models.errors import ( MediaNotFoundError, MusicAssistantError, @@ -186,7 +181,7 @@ class PlayerQueue: # invalid MA uri or item not found error if uri.startswith("http"): # a plain url was provided - queue_items.append(QueueItem(uri)) + queue_items.append(QueueItem.from_url(uri)) continue raise MediaNotFoundError(f"Invalid uri: {uri}") from err diff --git a/music_assistant/models/queue_item.py b/music_assistant/models/queue_item.py index 64cce2f8..b5dba9cf 100644 --- a/music_assistant/models/queue_item.py +++ b/music_assistant/models/queue_item.py @@ -45,6 +45,18 @@ class QueueItem(DataClassDictMixin): d.pop("duration") return d + @classmethod + def from_url(cls, url: str) -> QueueItem: + """Create QueueItem from plain url.""" + return cls( + uri=url, + name=url, + duration=None, + media_type=MediaType.UNKNOWN, + image=None, + media_item=None, + ) + @classmethod def from_media_item(cls, media_item: Track | Radio): """Construct QueueItem from track/radio item."""