Fix playback of provided plain url (#353)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 31 May 2022 15:29:21 +0000 (17:29 +0200)
committerGitHub <noreply@github.com>
Tue, 31 May 2022 15:29:21 +0000 (17:29 +0200)
music_assistant/controllers/stream.py
music_assistant/models/enums.py
music_assistant/models/player_queue.py
music_assistant/models/queue_item.py

index 1e35909c1582262986169bf70de273138c363bb9..29c1767a2c63c49df0910eb70c87fb162d912a4b 100644 (file)
@@ -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
 
index e3bb43cdede8605c7d4d6b36882f4a9666de97e3..b1495e1dbf8fa72e288a247641b2b625cb01107e 100644 (file)
@@ -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."""
index 628bfccca33ef30576c3347db4a3851e48fa3d6d..047d1150a6691670a0fc0f2cf4c839a47d4a923a 100644 (file)
@@ -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
 
index 64cce2f89d155b254b2ef9c2e6492029cb636a19..b5dba9cf671b77d6b2ca0a59c5544bc8954fc8b8 100644 (file)
@@ -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."""