summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/lsg_irc/last_fm_plugin.ex76
1 files changed, 49 insertions, 27 deletions
diff --git a/lib/lsg_irc/last_fm_plugin.ex b/lib/lsg_irc/last_fm_plugin.ex
index 5bf582d..04f887c 100644
--- a/lib/lsg_irc/last_fm_plugin.ex
+++ b/lib/lsg_irc/last_fm_plugin.ex
@@ -89,7 +89,8 @@ defmodule LSG.IRC.LastFmPlugin do
defp irc_now_playing(nick_or_user, message, state) do
nick_or_user = String.strip(nick_or_user)
- id_or_user = if account = IRC.Account.find_always_by_nick(message.network, message.channel, nick_or_user) do
+
+ id_or_user = if account = IRC.Account.get(nick_or_user) || IRC.Account.find_always_by_nick(message.network, message.channel, nick_or_user) do
account.id
else
nick_or_user
@@ -97,15 +98,22 @@ defmodule LSG.IRC.LastFmPlugin do
username = case :dets.lookup(state.dets, id_or_user) do
[{_, username}] -> username
- _ -> id_or_user
+ _ ->
+ id_or_user
end
case now_playing(username) do
{:error, text} when is_binary(text) ->
message.replyfun.(text)
{:ok, map} when is_map(map) ->
- text = format_now_playing(map)
- user = lookup_nick(username, state)
+ track = fetch_track(username, map)
+ text = format_now_playing(map, track)
+ user = if account = IRC.Account.get(username) do
+ user = IRC.UserTrack.find_by_account(message.network, account)
+ if(user, do: user.nick, else: account.name)
+ else
+ username
+ end
if user && text do
message.replyfun.("#{user} #{text}")
else
@@ -118,26 +126,40 @@ defmodule LSG.IRC.LastFmPlugin do
defp now_playing(user) do
api = Application.get_env(:lsg, :lastfm)[:api_key]
- url = "http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&format=json&limit=1" <> "&api_key=" <> api <> "&user="<> user
+ url = "http://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&format=json&limit=1&extended=1" <> "&api_key=" <> api <> "&user="<> user
case HTTPoison.get(url) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} -> Jason.decode(body)
- {:ok, %HTTPoison.Response{status_code: 400}} -> {:error, "last.fm: utilisateur #{user} inexistant"}
+ {:ok, %HTTPoison.Response{status_code: 404}} -> {:error, "last.fm: utilisateur \"#{user}\" inexistant"}
{:ok, %HTTPoison.Response{status_code: code}} -> {:error, "last.fm: erreur #{to_string(code)}"}
error ->
Logger.error "Lastfm http error: #{inspect error}"
:error
end
end
+ defp fetch_track(user, %{"recenttracks" => %{"track" => [ t = %{"name" => name, "artist" => %{"name" => artist}} | _]}}) do
+ api = Application.get_env(:lsg, :lastfm)[:api_key]
+ url = "http://ws.audioscrobbler.com/2.0/?method=track.getInfo&format=json" <> "&api_key=" <> api <> "&username="<> user <> "&artist="<>URI.encode(artist)<>"&track="<>URI.encode(name)
+ case HTTPoison.get(url) do
+ {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
+ case Jason.decode(body) do
+ {:ok, body} -> body["track"] || %{}
+ _ -> %{}
+ end
+ error ->
+ Logger.error "Lastfm http error: #{inspect error}"
+ :error
+ end
+ end
- defp format_now_playing(%{"recenttracks" => %{"track" => [track = %{"@attr" => %{"nowplaying" => "true"}}, _old]}}) do
- format_track(true, track)
+ defp format_now_playing(%{"recenttracks" => %{"track" => [track = %{"@attr" => %{"nowplaying" => "true"}} | _]}}, et) do
+ format_track(true, track, et)
end
- defp format_now_playing(%{"recenttracks" => %{"track" => [track]}}) do
- format_track(false, track)
+ defp format_now_playing(%{"recenttracks" => %{"track" => [track | _]}}, et) do
+ format_track(false, track, et)
end
- defp format_now_playing(%{"error" => err, "message" => message}) do
+ defp format_now_playing(%{"error" => err, "message" => message}, _) do
"last.fm error #{err}: #{message}"
end
@@ -145,22 +167,22 @@ defmodule LSG.IRC.LastFmPlugin do
nil
end
- defp format_track(np, track) do
- album = if track["album"]["#text"] do
- " (" <> track["album"]["#text"] <> ")"
- else
- ""
- end
- action = if np, do: "écoute ", else: "a écouté "
- action <> track["artist"]["#text"] <> " - " <> track["name"] <> album <> " — " <> track["url"]
- end
-
- defp lookup_nick(username, state) do
- case :dets.match(state.dets, {:'$1', username}) do
- [[match]] -> match
- [[match] | _many] -> match
- _ -> username
- end
+ defp format_track(np, track, extended) do
+ artist = track["artist"]["name"]
+ album = if track["album"]["#text"], do: " (" <> track["album"]["#text"] <> ")", else: ""
+ name = track["name"] <> album
+ action = if np, do: "écoute ", else: "a écouté"
+ love = if track["loved"] != "0", do: "❤️"
+ count = if x = extended["userplaycount"], do: "x#{x} #{love}"
+ tags = (get_in(extended, ["toptags", "tag"]) || [])
+ |> Enum.map(fn(tag) -> tag["name"] end)
+ |> Enum.filter(& &1)
+ |> Enum.join(", ")
+
+ [action, artist, name, count, tags, track["url"]]
+ |> Enum.filter(& &1)
+ |> Enum.map(&String.trim(&1))
+ |> Enum.join(" - ")
end
end