8000 Add new mediatypes to Music Assistant integration by marcelveldt · Pull Request #139338 · home-assistant/core · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Add new mediatypes to Music Assistant integration #139338

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Feb 28, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions homeassistant/components/music_assistant/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
ATTR_ALBUM_TYPE,
ATTR_ALBUMS,
ATTR_ARTISTS,
ATTR_AUDIOBOOKS,
ATTR_CONFIG_ENTRY_ID,
ATTR_FAVORITE,
ATTR_ITEMS,
Expand All @@ -32,6 +33,7 @@
ATTR_OFFSET,
ATTR_ORDER_BY,
ATTR_PLAYLISTS,
ATTR_PODCASTS,
ATTR_RADIO,
ATTR_SEARCH,
ATTR_SEARCH_ALBUM,
Expand All @@ -48,7 +50,15 @@

if TYPE_CHECKING:
from music_assistant_client import MusicAssistantClient
from music_assistant_models.media_items import Album, Artist, Playlist, Radio, Track
from music_assistant_models.media_items import (
Album,
Artist,
Audiobook,
Playlist,
Podcast,
Radio,
Track,
)

from . import MusicAssistantConfigEntry

Expand Down Expand Up @@ -155,6 +165,14 @@ async def handle_search(call: ServiceCall) -> ServiceResponse:
media_item_dict_from_mass_item(mass, item)
for item in search_results.radio
],
ATTR_AUDIOBOOKS: [
media_item_dict_from_mass_item(mass, item)
for item in search_results.audiobooks
],
ATTR_PODCASTS: [
media_item_dict_from_mass_item(mass, item)
for item in search_results.podcasts
],
}
)
return response
Expand All @@ -175,7 +193,13 @@ async def handle_get_library(call: ServiceCall) -> ServiceResponse:
"order_by": order_by,
}
library_result: (
list[Album] | list[Artist] | list[Track] | list[Radio] | list[Playlist]
list[Album]
| list[Artist]
| list[Track]
| list[Radio]
| list[Playlist]
| list[Audiobook]
| list[Podcast]
)
if media_type == MediaType.ALBUM:
library_result = await mass.music.get_library_albums(
Expand All @@ -199,6 +223,14 @@ async def handle_get_library(call: ServiceCall) -> ServiceResponse:
library_result = await mass.music.get_library_playlists(
**base_params,
)
elif media_type == MediaType.AUDIOBOOK:
library_result = await mass.music.get_library_audiobooks(
**base_params,
)
elif media_type == MediaType.PODCAST:
library_result = await mass.music.get_library_podcasts(
**base_params,
)
else:
raise ServiceValidationError(f"Unsupported media type {media_type}")

Expand Down
2 changes: 2 additions & 0 deletions homeassistant/components/music_assistant/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
ATTR_ALBUMS = "albums"
ATTR_TRACKS = "tracks"
ATTR_PLAYLISTS = "playlists"
ATTR_AUDIOBOOKS = "audiobooks"
ATTR_PODCASTS = "podcasts"
ATTR_RADIO = "radio"
ATTR_ITEMS = "items"
ATTR_RADIO_MODE = "radio_mode"
Expand Down
8 changes: 8 additions & 0 deletions homeassistant/components/music_assistant/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
ATTR_ALBUM,
ATTR_ALBUMS,
ATTR_ARTISTS,
ATTR_AUDIOBOOKS,
ATTR_BIT_DEPTH,
ATTR_CONTENT_TYPE,
ATTR_CURRENT_INDEX,
Expand All @@ -31,6 +32,7 @@
ATTR_OFFSET,
ATTR_ORDER_BY,
ATTR_PLAYLISTS,
ATTR_PODCASTS,
ATTR_PROVIDER,
ATTR_QUEUE_ID,
ATTR_QUEUE_ITEM_ID,
Expand Down Expand Up @@ -101,6 +103,12 @@ def media_item_dict_from_mass_item(
vol.Required(ATTR_RADIO): vol.All(
cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)]
),
vol.Required(ATTR_AUDIOBOOKS): vol.All(
cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)]
),
vol.Required(ATTR_PODCASTS): vol.All(
cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)]
),
},
)

Expand Down
7 changes: 7 additions & 0 deletions homeassistant/components/music_assistant/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ play_media:
options:
- artist
- album
- audiobook
- folder
- playlist
- podcast
- track
- radio
artist:
Expand Down Expand Up @@ -118,7 +121,9 @@ search:
options:
- artist
- album
- audiobook
- playlist
- podcast
- track
- radio
artist:
Expand Down Expand Up @@ -160,7 +165,9 @@ get_library:
options:
- artist
- album
- audiobook
- playlist
- podcast
- track
- radio
favorite:
Expand Down
3 changes: 3 additions & 0 deletions homeassistant/components/music_assistant/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -195,8 +195,11 @@
"options": {
"artist": "Artist",
"album": "Album",
"audiobook": "Audiobook",
"folder": "Folder",
"track": "Track",
"playlist": "Playlist",
"podcast": "Podcast",
"radio": "Radio"
}
},
Expand Down
26 changes: 25 additions & 1 deletion tests/components/music_assistant/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,15 @@
from unittest.mock import AsyncMock, MagicMock

from music_assistant_models.enums import EventType
from music_assistant_models.media_items import Album, Artist, Playlist, Radio, Track
from music_assistant_models.media_items import (
Album,
Artist,
Audiobook,
Playlist,
Podcast,
Radio,
Track,
)
from music_assistant_models.player import Player
from music_assistant_models.player_queue import PlayerQueue
from syrupy import SnapshotAssertion
Expand Down Expand Up @@ -60,6 +68,10 @@ async def setup_integration_from_fixtures(
music.get_playlist_tracks = AsyncMock(return_value=library_playlist_tracks)
library_radios = create_library_radios_from_fixture()
music.get_library_radios = AsyncMock(return_value=library_radios)
library_audiobooks = create_library_audiobooks_from_fixture()
music.get_library_audiobooks = AsyncMock(return_value=library_audiobooks)
library_podcasts = create_library_podcasts_from_fixture()
music.get_library_podcasts = AsyncMock(return_value=library_podcasts)
music.get_item_by_uri = AsyncMock()

config_entry.add_to_hass(hass)
Expand Down Expand Up @@ -130,6 +142,18 @@ def create_library_radios_from_fixture() -> list[Radio]:
return [Radio.from_dict(radio_data) for radio_data in fixture_data]


def create_library_audiobooks_from_fixture() -> list[Audiobook]:
"""Create MA Audiobooks from fixture."""
fixture_data = load_and_parse_fixture("library_audiobooks")
return [Audiobook.from_dict(radio_data) for radio_data in fixture_data]


def create_library_podcasts_from_fixture() -> list[Podcast]:
"""Create MA Podcasts from fixture."""
fixture_data = load_and_parse_fixture("library_podcasts")
return [Podcast.from_dict(radio_data) for radio_data in fixture_data]


async def trigger_subscription_callback(
hass: HomeAssistant,
client: MagicMock,
Expand Down
Loading
0