Can scrobble track maps
This commit is contained in:
@@ -75,6 +75,37 @@ defmodule LastFm.API do
|
||||
|> get_request()
|
||||
end
|
||||
|
||||
def scrobble(tracks, session_key, config) do
|
||||
params =
|
||||
%{"api_key" => config.api_key, "method" => "track.scrobble", "sk" => session_key}
|
||||
|
||||
track_params =
|
||||
tracks
|
||||
|> Enum.with_index()
|
||||
|> Enum.flat_map(fn {track, index} ->
|
||||
track
|
||||
|> Enum.map(fn {key, value} ->
|
||||
{"#{key}[#{index}]", value}
|
||||
end)
|
||||
end)
|
||||
|> Enum.into(%{})
|
||||
|
||||
params =
|
||||
params
|
||||
|> Map.merge(track_params)
|
||||
|
||||
sorted_params = Enum.sort(params)
|
||||
|
||||
signature = signature(sorted_params, config.shared_secret)
|
||||
|
||||
body = Map.merge(params, %{"api_sig" => signature, "format" => "json"})
|
||||
|
||||
config
|
||||
|> new_request()
|
||||
|> Req.merge(url: "/", form: body)
|
||||
|> post_request()
|
||||
end
|
||||
|
||||
defp signature(params, shared_secret) do
|
||||
encoded_params =
|
||||
Enum.map_join(params, fn {key, value} ->
|
||||
@@ -175,6 +206,19 @@ defmodule LastFm.API do
|
||||
end
|
||||
end
|
||||
|
||||
defp post_request(request) do
|
||||
case Req.post(request) do
|
||||
{:ok, %{body: %ErrorResponse{} = error_response}} ->
|
||||
{:error, error_response.error}
|
||||
|
||||
{:ok, response} ->
|
||||
{:ok, response.body}
|
||||
|
||||
error ->
|
||||
error
|
||||
end
|
||||
end
|
||||
|
||||
defp log_attempt(request) do
|
||||
url = URI.to_string(request.url)
|
||||
api_key = Req.Request.get_private(request, :api_key)
|
||||
|
||||
Reference in New Issue
Block a user