Improve support for channels
This commit is contained in:
parent
8b523252ff
commit
7f1f1d7940
3 changed files with 93 additions and 12 deletions
|
|
@ -9,6 +9,7 @@ defmodule Pinchflat.Media.MediaItem do
|
||||||
|
|
||||||
alias __MODULE__
|
alias __MODULE__
|
||||||
alias Pinchflat.Repo
|
alias Pinchflat.Repo
|
||||||
|
alias Pinchflat.Sources
|
||||||
alias Pinchflat.Tasks.Task
|
alias Pinchflat.Tasks.Task
|
||||||
alias Pinchflat.Sources.Source
|
alias Pinchflat.Sources.Source
|
||||||
alias Pinchflat.Media.MediaQuery
|
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
|
defp update_upload_date_index(%{changes: changes} = changeset) when is_map_key(changes, :upload_date) do
|
||||||
source_id = get_field(changeset, :source_id)
|
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 =
|
current_max =
|
||||||
MediaQuery.new()
|
MediaQuery.new()
|
||||||
|> MediaQuery.for_source(source_id)
|
|> MediaQuery.for_source(source_id)
|
||||||
|> MediaQuery.where_uploaded_on_date(changes.upload_date)
|
|> MediaQuery.where_uploaded_on_date(changes.upload_date)
|
||||||
|> Repo.aggregate(:max, :upload_date_index)
|
|> Repo.aggregate(aggregator, :upload_date_index)
|
||||||
|
|
||||||
case current_max do
|
case current_max do
|
||||||
nil -> put_change(changeset, :upload_date_index, 0)
|
nil -> put_change(changeset, :upload_date_index, default_index)
|
||||||
max -> put_change(changeset, :upload_date_index, max + 1)
|
max -> put_change(changeset, :upload_date_index, max + change_direction)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ defmodule Pinchflat.Downloading.DownloadOptionBuilderTest do
|
||||||
|
|
||||||
assert {:ok, res} = DownloadOptionBuilder.build(media_item)
|
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
|
end
|
||||||
|
|
||||||
test "uses source's output override if present", %{media_item: media_item} do
|
test "uses source's output override if present", %{media_item: media_item} do
|
||||||
|
|
|
||||||
|
|
@ -37,17 +37,90 @@ defmodule Pinchflat.MediaTest do
|
||||||
end
|
end
|
||||||
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
|
test "upload_date_index is set to 0 if it's the only video uploaded that day" do
|
||||||
upload_date = Date.utc_today()
|
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
|
assert media_item.upload_date_index == 0
|
||||||
end
|
end
|
||||||
|
|
||||||
test "upload_date_index is set to 1 if it's the second video uploaded that day" do
|
test "upload_date_index is set to 1 if it's the second video uploaded that day" do
|
||||||
upload_date = Date.utc_today()
|
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_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})
|
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
|
test "upload_date_index doesn't increment if the video is uploaded on a different day" do
|
||||||
today = Date.utc_today()
|
today = Date.utc_today()
|
||||||
one_day_ago = Date.add(today, -1)
|
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_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})
|
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
|
test "recomputes upload_date_index if an upload_date is changed...somehow" do
|
||||||
today = Date.utc_today()
|
today = Date.utc_today()
|
||||||
one_day_ago = Date.add(today, -1)
|
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_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})
|
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
|
test "upload_date_index doesn't increment if the video is for a different source" do
|
||||||
today = Date.utc_today()
|
today = Date.utc_today()
|
||||||
|
|
||||||
source_one = source_fixture()
|
source_one = source_fixture(%{collection_type: :playlist})
|
||||||
source_two = source_fixture()
|
source_two = source_fixture(%{collection_type: :playlist})
|
||||||
|
|
||||||
media_item_one = media_item_fixture(%{source_id: source_one.id, upload_date: today})
|
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})
|
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
|
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()
|
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_one = media_item_fixture(%{source_id: source.id, upload_date: today})
|
||||||
_media_item_two = media_item_fixture(%{source_id: source.id, upload_date: today})
|
_media_item_two = media_item_fixture(%{source_id: source.id, upload_date: today})
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue