fix chromecast and music sync
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 4 Jul 2020 17:22:42 +0000 (19:22 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 4 Jul 2020 17:22:42 +0000 (19:22 +0200)
.gitignore
.vscode/launch.json [new file with mode: 0644]
music_assistant/metadata.py
music_assistant/models/musicprovider.py
music_assistant/playerproviders/chromecast.py

index 521495779ff0e589653ef473f6dfc2a9ac186e7b..74b79be4e44c4c63d4d2d58c3816cce14b45e369 100644 (file)
@@ -8,3 +8,4 @@ music_assistant/config.json
 music_assistant/testrun.sh
 build/
 dist/
+venv/
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644 (file)
index 0000000..846fad2
--- /dev/null
@@ -0,0 +1,27 @@
+{
+    // Use IntelliSense to learn about possible attributes.
+    // Hover to view descriptions of existing attributes.
+    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "Python: Module",
+            "type": "python",
+            "request": "launch",
+            "module": "music_assistant"
+        },
+        {
+            "name": "Python: Huidige bestand",
+            "type": "python",
+            "request": "launch",
+            "program": "${file}",
+            "console": "integratedTerminal"
+        },
+        {
+            "name": "Python: Attach using Process Id",
+            "type": "python",
+            "request": "attach",
+            "processId": "${command:pickProcess}"
+        }
+    ]
+}
\ No newline at end of file
index 9d28795abdd0a805c00ee19cc2be756e0e7a316b..1b0c803189d1347f793d08dcf57fc33557a35e6d 100755 (executable)
@@ -4,6 +4,7 @@
 import re
 
 import aiohttp
+import json
 from asyncio_throttle import Throttler
 from music_assistant.cache import use_cache
 from music_assistant.utils import LOGGER, compare_strings, get_compare_string
@@ -250,7 +251,7 @@ class FanartTv:
             ) as response:
                 try:
                     result = await response.json()
-                except aiohttp.client_exceptions.ContentTypeError:
+                except (aiohttp.client_exceptions.ContentTypeError, json.decoder.JSONDecodeError):
                     LOGGER.error("Failed to retrieve %s", endpoint)
                     text_result = await response.text()
                     LOGGER.debug(text_result)
index 7fd88f88065f0aafe489c31232010bdf7b066be9..47b703ddc83296841b768a4b52c18c8f24c9da51 100755 (executable)
@@ -46,7 +46,7 @@ class MusicProvider:
         item_id = await self.mass.db.get_database_id(
             provider, prov_item_id, MediaType.Artist
         )
-        if item_id is not None:
+        if item_id is None:
             # artist not yet in local database so fetch details
             cache_key = f"{self.prov_id}.get_artist.{prov_item_id}"
             artist_details = await cached(
@@ -172,7 +172,7 @@ class MusicProvider:
         item_id = await self.mass.db.get_database_id(
             provider, prov_item_id, MediaType.Album
         )
-        if not item_id:
+        if item_id is None:
             # album not yet in local database so fetch details
             if not album_details:
                 cache_key = f"{self.prov_id}.get_album.{prov_item_id}"
@@ -216,7 +216,7 @@ class MusicProvider:
         item_id = await self.mass.db.get_database_id(
             provider, prov_item_id, MediaType.Track
         )
-        if not item_id:
+        if item_id is None:
             # track not yet in local database so fetch details
             if not track_details:
                 cache_key = f"{self.prov_id}.get_track.{prov_item_id}"
@@ -275,7 +275,7 @@ class MusicProvider:
         db_id = await self.mass.db.get_database_id(
             provider, prov_playlist_id, MediaType.Playlist
         )
-        if not db_id:
+        if db_id is None:
             # item not yet in local database so fetch and store details
             item_details = await self.get_playlist(prov_playlist_id)
             db_id = await self.mass.db.add_playlist(item_details)
@@ -288,7 +288,7 @@ class MusicProvider:
         db_id = await self.mass.db.get_database_id(
             provider, prov_radio_id, MediaType.Radio
         )
-        if not db_id:
+        if db_id is None:
             # item not yet in local database so fetch and store details
             item_details = await self.get_radio(prov_radio_id)
             db_id = await self.mass.db.add_radio(item_details)
index 66867e02a33dea278f0a431098ebd49108a10499..729f8de41c0fae98cd0021f49b58aa67d1623e0c 100644 (file)
@@ -20,6 +20,7 @@ from pychromecast.socket_client import (
     CONNECTION_STATUS_CONNECTED,
     CONNECTION_STATUS_DISCONNECTED,
 )
+import zeroconf
 
 PROV_ID = "chromecast"
 PROV_NAME = "Chromecast"
@@ -278,10 +279,15 @@ class ChromecastProvider(PlayerProvider):
                 # cleanup cast object
                 del player.cc
                 self.mass.run_task(self.remove_player(player.player_id))
+        
         # search for available chromecasts
-        from pychromecast.discovery import start_discovery, stop_discovery
 
-        def discovered_callback(name):
+        def list_devices():
+            LOGGER.debug("Currently known cast devices:")
+            for uuid, service in listener.services.items():
+                LOGGER.debug("  {} {}".format(uuid, service))
+
+        def add_callback(name):
             """Called when zeroconf has discovered a (new) chromecast."""
             discovery_info = listener.services[name]
             ip_address, port, uuid, model_name, friendly_name = discovery_info
@@ -290,9 +296,20 @@ class ChromecastProvider(PlayerProvider):
                 self.__chromecast_discovered(player_id, discovery_info)
             self.__update_group_players()
 
-        listener, browser = start_discovery(discovered_callback)
+        def remove_callback(uuid, name, service):
+            LOGGER.debug("Lost mDNS service for cast device {} {}".format(uuid, service))
+            list_devices()
+
+        def update_callback(uuid, name):
+            LOGGER.debug("Updated mDNS service for cast device {}".format(uuid))
+            list_devices()
+        
+        listener = pychromecast.CastListener(add_callback, remove_callback, update_callback)
+        zconf = zeroconf.Zeroconf()
+        browser = pychromecast.discovery.start_discovery(listener, zconf)
+        
         time.sleep(30)  # run discovery for 30 seconds
-        stop_discovery(browser)
+        pychromecast.stop_discovery(browser)
         LOGGER.debug("Chromecast discovery completed...")
         self._discovery_running = False