Pierre Wessman 7b45d19308 init
2025-01-16 16:22:58 +01:00

60 lines
2.0 KiB
Python

import json
import logging
import spotipy
from pydantic import BaseModel, Field
from spotipy.oauth2 import SpotifyOAuth
from ..base_plugin import BasePlugin
class PlayMusicInput(BaseModel):
query: str = Field(..., description="Can be a song, artist, album, or playlist")
class Plugin(BasePlugin):
def __init__(self, config: dict) -> None:
super().__init__(config=config)
self.spotify = spotipy.Spotify(
auth_manager=SpotifyOAuth(scope="user-library-read", redirect_uri="http://localhost:8080")
)
def _search(self, query: str, limit: int = 10):
_result = self.spotify.search(query, limit=limit)
result = []
for track in _result["tracks"]["items"]:
artists = [artist["name"] for artist in track["artists"]]
result.append(
{
"name": track["name"],
"artists": artists,
"uri": track["uri"]
}
)
return result
def tool_play_music(self, input: PlayMusicInput):
"""
Play music using a search query.
"""
track = self._search(input.query, limit=1)[0]
logging.info(f"Playing {track['name']} by {', '.join(track['artists'])}")
payload = {
"entity_id": self.config["plugins"]["music"]["default_speaker"],
"media_content_id": track["uri"],
"media_content_type": "music",
"enqueue": "play",
}
result = self.homeassistant.call_api(f"services/media_player/play_media", payload=payload)
return json.dumps({"status": "success", "message": f"Playing music.", "track": track})
def tool_stop_music(self):
"""
Stop playback of music.
"""
self.homeassistant.call_api(
f"services/media_player/media_pause", payload={"entity_id": self.config["plugins"]["music"]["default_speaker"]}
)
return json.dumps({"status": "success", "message": f"Music paused."})