defmodule Spotify.Recommendation do @moduledoc """ Spotify can make recommendations for you by providing seed data. The recommendation comes with tracks and the seed object *Note: The possibilities here are quite large. Please read the spotify documentation. https://developer.spotify.com/web-api/get-recommendations/ """ use Spotify.Responder import Spotify.Helpers alias Spotify.{ Client, Recommendation, Seed, Track } defstruct ~w[ tracks seeds ]a @doc """ Create a playlist-style listening experience based on seed artists, tracks and genres. **The response generated by this can vary. Your milage may vary. Because of this, you may want to use `get_recommendations_url` and use your own implementation for this function.** [Spotify Documentation](https://developer.spotify.com/web-api/get-recommendations/) **Method**: `GET` **Params**: **The params for this endpoint are complex. Refer to spotify docs** Spotify.Recommendation.get_recommendations(seed_artists: "1,2" energy: "6") # => { :ok, %Recommendation{tracks: tracks, seeds: seeds} } """ def get_recommendations(conn, params) do url = get_recommendations_url(params) conn |> Client.get(url) |> handle_response end @doc """ Create a playlist-style listening experience based on seed artists, tracks and genres. iex> Spotify.Recommendation.get_recommendations_url(limit: 5) "https://api.spotify.com/v1/recommendations?limit=5" """ def get_recommendations_url(params) do "https://api.spotify.com/v1/recommendations" <> query_string(params) end @doc """ Implements the hook required by the Responder behavior. """ def build_response(body) do seeds = Enum.map(body["seeds"], &to_struct(Seed, &1)) tracks = Enum.map(body["tracks"], &to_struct(Track, &1)) %Recommendation{tracks: tracks, seeds: seeds} end end