Add artist to track when possible
authorMarvin Schenkel <marvinschenkel@gmail.com>
Wed, 6 Jul 2022 15:29:49 +0000 (17:29 +0200)
committerMarvin Schenkel <marvinschenkel@gmail.com>
Wed, 6 Jul 2022 15:29:49 +0000 (17:29 +0200)
examples/ytmusic.py
music_assistant/controllers/music/__init__.py
music_assistant/music_providers/ytmusic.py

index e6247f48a867930758360febe9291f3055262c44..6e7c77bb2d4f6f50d7892cbacb80ecb54015c00a 100644 (file)
@@ -123,31 +123,29 @@ async def main():
 
     async with MusicAssistant(mass_conf) as mass:
         # get some data
-        ytm = mass.music.get_provider(ProviderType.YTMUSIC)
+        ytm = mass.music.get_provider(ProviderType.YTMUSIC)
         # track = await ytm.get_track("pE3ju1qS848")
         # album = await ytm.get_album("MPREb_AYetWMZunqA")
         # await ytm.get_artist_albums("UCFpQsnvFBNlXi7rwQo6IW7g")
-        # albums = await ytm.get_artist_albums("UCFpQsnvFBNlXi7rwQo6IW7g")*")
+        tracks = await ytm.get_album_tracks("MPREb_LbqtMRfZssH")
+        # artist = await ytm.get_artist("UCRwXXG8ovUxqsJe_VwzdnXg")
+        # print(artist)
+        for track in tracks:
+            print(track)
         # start sync
-        await mass.music.start_sync(schedule=3)
-        artists = await mass.music.artists.count()
-        print(f"Got {artists} artists in library")
-        albums = await mass.music.albums.count()
-        print(f"Got {albums} albums in library")
-        tracks = await mass.music.tracks.count()
-        print(f"Got {tracks} tracks in library")
-        playlists = await mass.music.playlists.library()
-        print(f"Got {len(playlists)} playlists in library")
+        await mass.music.start_sync(schedule=3)
+        artists = await mass.music.artists.count()
+        print(f"Got {artists} artists in library")
+        albums = await mass.music.albums.count()
+        print(f"Got {albums} albums in library")
+        tracks = await mass.music.tracks.count()
+        print(f"Got {tracks} tracks in library")
+        playlists = await mass.music.playlists.library()
+        print(f"Got {len(playlists)} playlists in library")
         # artists = await mass.music.artists.count()
         # print(f"Got {artists} artists in library")
         # albums = await mass.music.albums.count()
         # print(f"Got {albums} albums in library")
-        # sd = await yt.get_stream_details(track.item_id)
-        # print(sd.data)
-
-        # test_player1 = TestPlayer("test1")
-        # await mass.players.register_player(test_player1)
-        # await test_player1.active_queue.play_media(track.uri)
 
         await asyncio.sleep(3600)
 
index b0727179e3217a5fe8976061b462df8fa4b81fb3..81073cdefb426a23ae3deb4bdc63b61f8d08db4e 100755 (executable)
@@ -35,9 +35,9 @@ from music_assistant.music_providers.filesystem import FileSystemProvider
 from music_assistant.music_providers.qobuz import QobuzProvider
 from music_assistant.music_providers.spotify import SpotifyProvider
 from music_assistant.music_providers.tunein import TuneInProvider
-from music_assistant.music_providers.ytmusic import YTMusic
 from music_assistant.music_providers.url import PROVIDER_CONFIG as URL_CONFIG
 from music_assistant.music_providers.url import URLProvider
+from music_assistant.music_providers.ytmusic import YoutubeMusicProvider
 
 if TYPE_CHECKING:
     from music_assistant.mass import MusicAssistant
@@ -47,7 +47,7 @@ PROV_MAP = {
     ProviderType.SPOTIFY: SpotifyProvider,
     ProviderType.QOBUZ: QobuzProvider,
     ProviderType.TUNEIN: TuneInProvider,
-    ProviderType.YTMUSIC: YTMusic,
+    ProviderType.YTMUSIC: YoutubeMusicProvider,
 }
 
 
index 574f88a6631a542fbe06eefd5774bd58a3a8eba7..332770a5fce196636ac15d44e16082a6e9b9830e 100644 (file)
@@ -1,5 +1,4 @@
-"""YT Music support for MusicAssistant."""
-import json
+"""Youtube Music support for MusicAssistant."""
 import re
 from datetime import date
 from typing import AsyncGenerator, Dict, List, Optional
@@ -31,7 +30,7 @@ YTM_DOMAIN = "https://music.youtube.com"
 YTM_BASE_URL = f"{YTM_DOMAIN}/youtubei/v1/"
 
 
-class YTMusic(MusicProvider):
+class YoutubeMusicProvider(MusicProvider):
     """Provider for Youtube Music."""
 
     _attr_type = ProviderType.YTMUSIC
@@ -185,8 +184,11 @@ class YTMusic(MusicProvider):
             )
             artists = []
             for artist in item["artists"]:
+                artist_id = artist["id"]
+                if not artist_id:
+                    artist_id = "ytm_va"
                 album_artist = Artist(
-                    item_id=artist["id"], name=artist["name"], provider=self.type
+                    item_id=artist_id, name=artist["name"], provider=self.type
                 )
                 album_artist.add_provider_id(
                     MediaItemProviderId(
@@ -492,8 +494,11 @@ class YTMusic(MusicProvider):
         artists = []
         for parsed_artist in parsed_album["artists"]:
             if parsed_artist["id"]:
+                artist_id = parsed_artist["id"]
+                if not artist_id:
+                    artist_id = "ytm_va"
                 artist = Artist(
-                    item_id=parsed_artist["id"],
+                    item_id=artist_id,
                     provider=self.type,
                     name=parsed_artist["name"],
                 )
@@ -579,13 +584,21 @@ class YTMusic(MusicProvider):
             name=track_obj["videoDetails"]["title"],
             duration=track_obj["videoDetails"]["lengthSeconds"],
         )
-        print(json.dumps(track_obj))
-        # artist = await self.get_artist(
-        #     track_obj["microformat"]["microformatDataRenderer"]["pageOwnerDetails"][
-        #         "externalChannelId"
-        #     ]
-        # )
-        # track.artists = [artist]
+        artist_id = track_obj["microformat"]["microformatDataRenderer"][
+            "pageOwnerDetails"
+        ]["externalChannelId"]
+        if artist_id == "UCUTXlgdcKU5vfzFqHOWIvkA":
+            artist = Artist(
+                item_id=artist_id, name="Various Artists", provider=self.type
+            )
+            artist.add_provider_id(
+                MediaItemProviderId(
+                    item_id=str(artist_id), prov_type=self.type, prov_id=self.id
+                )
+            )
+        else:
+            artist = await self.get_artist(artist_id)
+        track.artists = [artist]
         images = []
         for thumb in track_obj["microformat"]["microformatDataRenderer"]["thumbnail"][
             "thumbnails"