diff --git a/lib/pinchflat/media/media_item.ex b/lib/pinchflat/media/media_item.ex index a570560..f0ed063 100644 --- a/lib/pinchflat/media/media_item.ex +++ b/lib/pinchflat/media/media_item.ex @@ -9,6 +9,7 @@ defmodule Pinchflat.Media.MediaItem do alias __MODULE__ alias Pinchflat.Repo + alias Pinchflat.Sources alias Pinchflat.Tasks.Task alias Pinchflat.Sources.Source alias Pinchflat.Media.MediaQuery @@ -130,16 +131,23 @@ defmodule Pinchflat.Media.MediaItem do defp update_upload_date_index(%{changes: changes} = changeset) when is_map_key(changes, :upload_date) do source_id = get_field(changeset, :source_id) + source = Sources.get_source!(source_id) + # Channels should count down from 99, playlists should count up from 0 + # This reflects the fact that channels prepend new videos to the top of the list + # and playlists append new videos to the bottom of the list. + default_index = if source.collection_type == :channel, do: 99, else: 0 + aggregator = if source.collection_type == :channel, do: :min, else: :max + change_direction = if source.collection_type == :channel, do: -1, else: 1 current_max = MediaQuery.new() |> MediaQuery.for_source(source_id) |> MediaQuery.where_uploaded_on_date(changes.upload_date) - |> Repo.aggregate(:max, :upload_date_index) + |> Repo.aggregate(aggregator, :upload_date_index) case current_max do - nil -> put_change(changeset, :upload_date_index, 0) - max -> put_change(changeset, :upload_date_index, max + 1) + nil -> put_change(changeset, :upload_date_index, default_index) + max -> put_change(changeset, :upload_date_index, max + change_direction) end end diff --git a/test/pinchflat/downloading/download_option_builder_test.exs b/test/pinchflat/downloading/download_option_builder_test.exs index 9cf3048..9c4fc3f 100644 --- a/test/pinchflat/downloading/download_option_builder_test.exs +++ b/test/pinchflat/downloading/download_option_builder_test.exs @@ -39,7 +39,7 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do assert {:ok, res} = DownloadOptionBuilder.build(media_item) - assert {:output, "/tmp/test/media/00.%(ext)s"} in res + assert {:output, "/tmp/test/media/99.%(ext)s"} in res end test "uses source's output override if present", %{media_item: media_item} do diff --git a/test/pinchflat/media_test.exs b/test/pinchflat/media_test.exs index 576e16a..a6468e0 100644 --- a/test/pinchflat/media_test.exs +++ b/test/pinchflat/media_test.exs @@ -37,17 +37,90 @@ defmodule Pinchflat.MediaTest do end end - describe "schema when testing upload_date_index" do + describe "schema when testing upload_date_index and source is a channel" do + test "upload_date_index is set to 99 if it's the only video uploaded that day" do + upload_date = Date.utc_today() + source = source_fixture(%{collection_type: :channel}) + media_item = media_item_fixture(%{source_id: source.id, upload_date: upload_date}) + + assert media_item.upload_date_index == 99 + end + + test "upload_date_index is set to 98 if it's the second video uploaded that day" do + upload_date = Date.utc_today() + source = source_fixture(%{collection_type: :channel}) + + media_item_one = media_item_fixture(%{source_id: source.id, upload_date: upload_date}) + media_item_two = media_item_fixture(%{source_id: source.id, upload_date: upload_date}) + + assert media_item_one.upload_date_index == 99 + assert media_item_two.upload_date_index == 98 + end + + test "upload_date_index doesn't decrement if the video is uploaded on a different day" do + today = Date.utc_today() + one_day_ago = Date.add(today, -1) + source = source_fixture(%{collection_type: :channel}) + + media_item_new = media_item_fixture(%{source_id: source.id, upload_date: today}) + media_item_old = media_item_fixture(%{source_id: source.id, upload_date: one_day_ago}) + + assert media_item_new.upload_date_index == 99 + assert media_item_old.upload_date_index == 99 + end + + test "recomputes upload_date_index if an upload_date is changed...somehow" do + today = Date.utc_today() + one_day_ago = Date.add(today, -1) + source = source_fixture(%{collection_type: :channel}) + + media_item_new = media_item_fixture(%{source_id: source.id, upload_date: today}) + media_item_old = media_item_fixture(%{source_id: source.id, upload_date: one_day_ago}) + + {:ok, updated_media_item} = Media.update_media_item(media_item_old, %{upload_date: today}) + + assert media_item_new.upload_date_index == 99 + assert updated_media_item.upload_date_index == 98 + end + + test "upload_date_index doesn't decrement if the video is for a different source" do + today = Date.utc_today() + + source_one = source_fixture(%{collection_type: :channel}) + source_two = source_fixture(%{collection_type: :channel}) + + media_item_one = media_item_fixture(%{source_id: source_one.id, upload_date: today}) + media_item_two = media_item_fixture(%{source_id: source_two.id, upload_date: today}) + + assert media_item_one.upload_date_index == 99 + assert media_item_two.upload_date_index == 99 + end + + test "upload_date_index doesn't decrement if the a video's upload_date is updated but doesn't change" do + today = Date.utc_today() + source = source_fixture(%{collection_type: :channel}) + + media_item_one = media_item_fixture(%{source_id: source.id, upload_date: today}) + _media_item_two = media_item_fixture(%{source_id: source.id, upload_date: today}) + + {:ok, updated_media_item} = Media.update_media_item(media_item_one, %{upload_date: today, title: "New title"}) + + assert updated_media_item.upload_date_index == 99 + end + end + + describe "schema when testing upload_date_index and source is a playlist" do test "upload_date_index is set to 0 if it's the only video uploaded that day" do upload_date = Date.utc_today() - media_item = media_item_fixture(%{upload_date: upload_date}) + source = source_fixture(%{collection_type: :playlist}) + media_item = media_item_fixture(%{source_id: source.id, upload_date: upload_date}) assert media_item.upload_date_index == 0 end test "upload_date_index is set to 1 if it's the second video uploaded that day" do upload_date = Date.utc_today() - source = source_fixture() + source = source_fixture(%{collection_type: :playlist}) media_item_one = media_item_fixture(%{source_id: source.id, upload_date: upload_date}) media_item_two = media_item_fixture(%{source_id: source.id, upload_date: upload_date}) @@ -59,7 +132,7 @@ defmodule Pinchflat.MediaTest do test "upload_date_index doesn't increment if the video is uploaded on a different day" do today = Date.utc_today() one_day_ago = Date.add(today, -1) - source = source_fixture() + source = source_fixture(%{collection_type: :playlist}) media_item_new = media_item_fixture(%{source_id: source.id, upload_date: today}) media_item_old = media_item_fixture(%{source_id: source.id, upload_date: one_day_ago}) @@ -71,7 +144,7 @@ defmodule Pinchflat.MediaTest do test "recomputes upload_date_index if an upload_date is changed...somehow" do today = Date.utc_today() one_day_ago = Date.add(today, -1) - source = source_fixture() + source = source_fixture(%{collection_type: :playlist}) media_item_new = media_item_fixture(%{source_id: source.id, upload_date: today}) media_item_old = media_item_fixture(%{source_id: source.id, upload_date: one_day_ago}) @@ -85,8 +158,8 @@ defmodule Pinchflat.MediaTest do test "upload_date_index doesn't increment if the video is for a different source" do today = Date.utc_today() - source_one = source_fixture() - source_two = source_fixture() + source_one = source_fixture(%{collection_type: :playlist}) + source_two = source_fixture(%{collection_type: :playlist}) media_item_one = media_item_fixture(%{source_id: source_one.id, upload_date: today}) media_item_two = media_item_fixture(%{source_id: source_two.id, upload_date: today}) @@ -97,7 +170,7 @@ defmodule Pinchflat.MediaTest do test "upload_date_index doesn't increment if the a video's upload_date is updated but doesn't change" do today = Date.utc_today() - source = source_fixture() + source = source_fixture(%{collection_type: :playlist}) media_item_one = media_item_fixture(%{source_id: source.id, upload_date: today}) _media_item_two = media_item_fixture(%{source_id: source.id, upload_date: today})