From e8f393c5a05a6dbd4f85cb9f983a0162705c3045 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Thu, 5 Mar 2026 19:54:32 +0000 Subject: [PATCH] Guard against nil medium in scrobble_medium Closes #76 --- lib/music_library/scrobble_activity.ex | 52 +++++++++++++++----------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/lib/music_library/scrobble_activity.ex b/lib/music_library/scrobble_activity.ex index 73cd3783..c4884372 100644 --- a/lib/music_library/scrobble_activity.ex +++ b/lib/music_library/scrobble_activity.ex @@ -67,35 +67,36 @@ defmodule MusicLibrary.ScrobbleActivity do end def scrobble_medium(number, release_with_tracks, {:finished_at, finished_at}) do - medium_duration = - release_with_tracks.media - |> Enum.find(fn medium -> medium.number == number end) - |> Release.medium_duration() + case find_medium(release_with_tracks, number) do + {:ok, medium} -> + medium_duration = Release.medium_duration(medium) + started_at = DateTime.add(finished_at, -medium_duration, :millisecond) + scrobble_medium(number, release_with_tracks, {:started_at, started_at}) - started_at = DateTime.add(finished_at, -medium_duration, :millisecond) - scrobble_medium(number, release_with_tracks, {:started_at, started_at}) + {:error, :medium_not_found} -> + {:error, :medium_not_found} + end end def scrobble_medium(number, release_with_tracks, {:started_at, started_at}) do - medium_duration = - release_with_tracks.media - |> Enum.find(fn medium -> medium.number == number end) - |> Release.medium_duration() + case find_medium(release_with_tracks, number) do + {:ok, medium} -> + medium_duration = Release.medium_duration(medium) - if medium_duration == 0 do - {:error, :no_duration} - else - with {:ok, session_key} <- fetch_session_key() do - medium = - release_with_tracks.media - |> Enum.find(fn medium -> medium.number == number end) + if medium_duration == 0 do + {:error, :no_duration} + else + with {:ok, session_key} <- fetch_session_key() do + {scrobbles, _finished_at} = + medium.tracks + |> to_scrobbles(release_with_tracks, started_at) - {scrobbles, _finished_at} = - medium.tracks - |> to_scrobbles(release_with_tracks, started_at) + LastFm.scrobble(scrobbles, session_key) + end + end - LastFm.scrobble(scrobbles, session_key) - end + {:error, :medium_not_found} -> + {:error, :medium_not_found} end end @@ -176,6 +177,13 @@ defmodule MusicLibrary.ScrobbleActivity do end) end + defp find_medium(release_with_tracks, number) do + case Enum.find(release_with_tracks.media, fn medium -> medium.number == number end) do + nil -> {:error, :medium_not_found} + medium -> {:ok, medium} + end + end + defp main_artist_name([]), do: nil defp main_artist_name([artist | _rest]), do: artist.name