Replace String.to_integer with safe Integer.parse
Use Integer.parse/1 instead of String.to_integer/1 on user-supplied and external API input to prevent ArgumentError crashes on non-numeric values. Adds fallback defaults or nil returns at each call site.
This commit is contained in:
+12
-4
@@ -67,10 +67,18 @@ defmodule LastFm.Artist do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp get_play_count(api_response) do
|
defp get_play_count(api_response) do
|
||||||
if play_count = get_in(api_response, ["stats", "userplaycount"]) do
|
case get_in(api_response, ["stats", "userplaycount"]) do
|
||||||
String.to_integer(play_count)
|
nil -> 0
|
||||||
else
|
value -> parse_play_count(value)
|
||||||
0
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp parse_play_count(value) when is_binary(value) do
|
||||||
|
case Integer.parse(value) do
|
||||||
|
{int, ""} -> int
|
||||||
|
_ -> 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp parse_play_count(_), do: 0
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -73,8 +73,10 @@ defmodule LastFm.Track do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp parse_scrobble_at_uts(track) do
|
defp parse_scrobble_at_uts(track) do
|
||||||
track["date"]["uts"]
|
case Integer.parse(track["date"]["uts"]) do
|
||||||
|> String.to_integer()
|
{int, ""} -> int
|
||||||
|
_ -> nil
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def changeset(track, attrs) do
|
def changeset(track, attrs) do
|
||||||
|
|||||||
@@ -53,7 +53,13 @@ defmodule MusicBrainz.Artist do
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp parse_discogs_id("https://www.discogs.com/artist/" <> id), do: String.to_integer(id)
|
defp parse_discogs_id("https://www.discogs.com/artist/" <> id) do
|
||||||
|
case Integer.parse(id) do
|
||||||
|
{int, ""} -> int
|
||||||
|
_ -> nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp parse_discogs_id(_other), do: nil
|
defp parse_discogs_id(_other), do: nil
|
||||||
|
|
||||||
defp parse_wikidata_id("https://www.wikidata.org/wiki/" <> id), do: id
|
defp parse_wikidata_id("https://www.wikidata.org/wiki/" <> id), do: id
|
||||||
|
|||||||
@@ -282,7 +282,7 @@ defmodule MusicLibraryWeb.Components.Release do
|
|||||||
def handle_event("scrobble_medium", %{"number" => number}, socket)
|
def handle_event("scrobble_medium", %{"number" => number}, socket)
|
||||||
when release_loaded?(socket.assigns) do
|
when release_loaded?(socket.assigns) do
|
||||||
release_with_tracks = socket.assigns.release_with_tracks.result
|
release_with_tracks = socket.assigns.release_with_tracks.result
|
||||||
number = String.to_integer(number)
|
{number, ""} = Integer.parse(number)
|
||||||
|
|
||||||
case ScrobbleActivity.scrobble_medium(number, release_with_tracks,
|
case ScrobbleActivity.scrobble_medium(number, release_with_tracks,
|
||||||
finished_at: DateTime.utc_now()
|
finished_at: DateTime.utc_now()
|
||||||
@@ -324,7 +324,7 @@ defmodule MusicLibraryWeb.Components.Release do
|
|||||||
end
|
end
|
||||||
|
|
||||||
def handle_event("toggle_medium", %{"medium-number" => number}, socket) do
|
def handle_event("toggle_medium", %{"medium-number" => number}, socket) do
|
||||||
number = String.to_integer(number)
|
{number, ""} = Integer.parse(number)
|
||||||
selected_tracks = socket.assigns.selected_tracks
|
selected_tracks = socket.assigns.selected_tracks
|
||||||
release_with_tracks = socket.assigns.release_with_tracks.result
|
release_with_tracks = socket.assigns.release_with_tracks.result
|
||||||
|
|
||||||
|
|||||||
@@ -28,15 +28,8 @@ defmodule MusicLibraryWeb.CollectionController do
|
|||||||
end
|
end
|
||||||
|
|
||||||
def index(conn, params) do
|
def index(conn, params) do
|
||||||
limit =
|
limit = parse_int(params["limit"], 20)
|
||||||
params
|
offset = parse_int(params["offset"], 0)
|
||||||
|> Map.get("limit", "20")
|
|
||||||
|> String.to_integer()
|
|
||||||
|
|
||||||
offset =
|
|
||||||
params
|
|
||||||
|> Map.get("offset", "0")
|
|
||||||
|> String.to_integer()
|
|
||||||
|
|
||||||
total = Collection.search_records_count("")
|
total = Collection.search_records_count("")
|
||||||
|
|
||||||
@@ -44,4 +37,15 @@ defmodule MusicLibraryWeb.CollectionController do
|
|||||||
|
|
||||||
render(conn, :index, total: total, limit: limit, offset: offset, records: records)
|
render(conn, :index, total: total, limit: limit, offset: offset, records: records)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp parse_int(nil, default), do: default
|
||||||
|
|
||||||
|
defp parse_int(value, default) when is_binary(value) do
|
||||||
|
case Integer.parse(value) do
|
||||||
|
{int, ""} -> int
|
||||||
|
_ -> default
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp parse_int(_, default), do: default
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do
|
|||||||
end
|
end
|
||||||
|
|
||||||
def handle_event("scrobble_medium", %{"medium_number" => number}, socket) do
|
def handle_event("scrobble_medium", %{"medium_number" => number}, socket) do
|
||||||
number = String.to_integer(number)
|
{number, ""} = Integer.parse(number)
|
||||||
|
|
||||||
case ScrobbleActivity.scrobble_medium(number, socket.assigns.release,
|
case ScrobbleActivity.scrobble_medium(number, socket.assigns.release,
|
||||||
finished_at: DateTime.utc_now()
|
finished_at: DateTime.utc_now()
|
||||||
|
|||||||
Reference in New Issue
Block a user