From fcdae8f925955093247c262eb560bac916ec348e Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Wed, 7 May 2025 08:31:39 +0100 Subject: [PATCH] Extract LastFm.API.Signature --- lib/last_fm/api.ex | 29 ++++++++--------------------- lib/last_fm/api/signature.ex | 13 +++++++++++++ 2 files changed, 21 insertions(+), 21 deletions(-) create mode 100644 lib/last_fm/api/signature.ex diff --git a/lib/last_fm/api.ex b/lib/last_fm/api.ex index 65986fe6..c23c18ba 100644 --- a/lib/last_fm/api.ex +++ b/lib/last_fm/api.ex @@ -1,20 +1,20 @@ defmodule LastFm.API do require Logger - alias LastFm.{API.ErrorResponse, Artist, Session, Track} + alias LastFm.{Artist, Session, Track} + alias LastFm.API.{ErrorResponse, Signature} def get_session(token, config) do - # Note that params needs to be ordered alphabetically params = - [ + %{ api_key: config.api_key, method: "auth.getSession", token: token - ] + } - signature = signature(params, config.shared_secret) + signature = Signature.generate(params, config.shared_secret) - params = Keyword.put(params, :api_sig, signature) + params = Map.put(params, "api_sig", signature) config |> new_request() @@ -39,13 +39,9 @@ defmodule LastFm.API do end) |> Enum.into(%{}) - params = - params - |> Map.merge(track_params) + params = Map.merge(params, track_params) - sorted_params = Enum.sort(params) - - signature = signature(sorted_params, config.shared_secret) + signature = Signature.generate(params, config.shared_secret) body = Map.merge(params, %{"api_sig" => signature, "format" => "json"}) @@ -55,15 +51,6 @@ defmodule LastFm.API do |> post_request() end - defp signature(params, shared_secret) do - encoded_params = - Enum.map_join(params, fn {key, value} -> - "#{key}#{value}" - end) - - :crypto.hash(:md5, encoded_params <> shared_secret) |> Base.encode16(case: :lower) - end - def get_recent_tracks(config) do params = config diff --git a/lib/last_fm/api/signature.ex b/lib/last_fm/api/signature.ex new file mode 100644 index 00000000..b82ca4f1 --- /dev/null +++ b/lib/last_fm/api/signature.ex @@ -0,0 +1,13 @@ +defmodule LastFm.API.Signature do + def generate(params, shared_secret) do + encoded_params = + params + # Params needs to be ASCII ordered alphabetically + |> Enum.sort() + |> Enum.map_join(fn {key, value} -> + "#{key}#{value}" + end) + + :crypto.hash(:md5, encoded_params <> shared_secret) |> Base.encode16(case: :lower) + end +end