From 481ad650a40ff2e8541b310dd81ccfb3be13127a Mon Sep 17 00:00:00 2001 From: Kieran Eglin Date: Mon, 15 Jul 2024 15:28:15 -0700 Subject: [PATCH] Improved the way playlist_indexes are rejected on update --- lib/pinchflat/media/media.ex | 7 ++++++- lib/pinchflat/yt_dlp/media.ex | 5 ++--- test/pinchflat/media_test.exs | 19 ++++++++++++++++++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/lib/pinchflat/media/media.ex b/lib/pinchflat/media/media.ex index 191b28f..159c8b7 100644 --- a/lib/pinchflat/media/media.ex +++ b/lib/pinchflat/media/media.ex @@ -142,12 +142,17 @@ defmodule Pinchflat.Media do """ def create_media_item_from_backend_attrs(source, media_attrs_struct) do attrs = Map.merge(%{source_id: source.id}, Map.from_struct(media_attrs_struct)) + # Some fields should only be set on insert and not on update. + fields_to_drop_on_update = [:playlist_index] %MediaItem{} |> MediaItem.changeset(attrs) |> Repo.insert( on_conflict: [ - set: Map.to_list(attrs) + set: + attrs + |> Map.drop(fields_to_drop_on_update) + |> Map.to_list() ], conflict_target: [:source_id, :media_id] ) diff --git a/lib/pinchflat/yt_dlp/media.ex b/lib/pinchflat/yt_dlp/media.ex index eafa6f9..cecf08a 100644 --- a/lib/pinchflat/yt_dlp/media.ex +++ b/lib/pinchflat/yt_dlp/media.ex @@ -11,8 +11,7 @@ defmodule Pinchflat.YtDlp.Media do :livestream, :short_form_content, :uploaded_at, - :duration_seconds, - :playlist_index + :duration_seconds ] defstruct [ @@ -109,7 +108,7 @@ defmodule Pinchflat.YtDlp.Media do duration_seconds: response["duration"] && round(response["duration"]), short_form_content: response["webpage_url"] && short_form_content?(response), uploaded_at: response["upload_date"] && parse_uploaded_at(response), - playlist_index: response["playlist_index"] + playlist_index: response["playlist_index"] || 0 } end diff --git a/test/pinchflat/media_test.exs b/test/pinchflat/media_test.exs index 13bfb8b..c95b4d0 100644 --- a/test/pinchflat/media_test.exs +++ b/test/pinchflat/media_test.exs @@ -689,7 +689,24 @@ defmodule Pinchflat.MediaTest do assert {:ok, %MediaItem{} = media_item_2} = Media.create_media_item_from_backend_attrs(source, different_attrs) assert media_item_1.id == media_item_2.id - assert media_item_2.title == different_attrs.title + assert Repo.reload(media_item_2).title == different_attrs.title + end + + test "doesn't update fields like playlist_index" do + source = source_fixture() + + media_attrs = + media_attributes_return_fixture() + |> Phoenix.json_library().decode!() + |> Map.put("playlist_index", 1) + |> YtDlpMedia.response_to_struct() + + different_attrs = %YtDlpMedia{media_attrs | playlist_index: 9999} + + assert {:ok, %MediaItem{} = _media_item_1} = Media.create_media_item_from_backend_attrs(source, media_attrs) + assert {:ok, %MediaItem{} = media_item_2} = Media.create_media_item_from_backend_attrs(source, different_attrs) + + assert Repo.reload(media_item_2).playlist_index == media_attrs.playlist_index end end