Rename media sources (#25)

* Renamed MediaSource to Sources

* Renamed MediaItem controller namespace
This commit is contained in:
Kieran 2024-02-20 09:48:20 -08:00 committed by GitHub
parent d4d653398b
commit 7d62f7c7df
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
36 changed files with 87 additions and 87 deletions

View file

@ -4,13 +4,13 @@ alias Pinchflat.Tasks.Task
alias Pinchflat.Media.MediaItem
alias Pinchflat.Tasks.SourceTasks
alias Pinchflat.Media.MediaMetadata
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
alias Pinchflat.Profiles.MediaProfile
alias Pinchflat.Tasks
alias Pinchflat.Media
alias Pinchflat.Profiles
alias Pinchflat.MediaSource
alias Pinchflat.Sources
alias Pinchflat.MediaClient.{SourceDetails, VideoDownloader}

View file

@ -8,7 +8,7 @@ defmodule Pinchflat.Media do
alias Pinchflat.Repo
alias Pinchflat.Tasks
alias Pinchflat.Media.MediaItem
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
@doc """
Returns the list of media_items. Returns [%MediaItem{}, ...].

View file

@ -7,7 +7,7 @@ defmodule Pinchflat.Media.MediaItem do
import Ecto.Changeset
alias Pinchflat.Tasks.Task
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
alias Pinchflat.Media.MediaMetadata
alias Pinchflat.Media.MediaItemSearchIndex

View file

@ -6,7 +6,7 @@ defmodule Pinchflat.MediaClient.SourceDetails do
it open-ish for future expansion (just in case).
"""
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
alias Pinchflat.MediaClient.Backends.YtDlp.VideoCollection, as: YtDlpSource
@doc """

View file

@ -1,4 +1,4 @@
defmodule Pinchflat.MediaSource.Source do
defmodule Pinchflat.Sources.Source do
@moduledoc """
The Source schema.
"""

View file

@ -6,7 +6,7 @@ defmodule Pinchflat.Profiles.MediaProfile do
use Ecto.Schema
import Ecto.Changeset
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
@allowed_fields ~w(
name

View file

@ -1,6 +1,6 @@
defmodule Pinchflat.MediaSource do
defmodule Pinchflat.Sources do
@moduledoc """
The MediaSource context.
The Sources context.
"""
import Ecto.Query, warn: false
@ -8,7 +8,7 @@ defmodule Pinchflat.MediaSource do
alias Pinchflat.Tasks
alias Pinchflat.Tasks.SourceTasks
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
alias Pinchflat.MediaClient.SourceDetails
@doc """

View file

@ -8,7 +8,7 @@ defmodule Pinchflat.Tasks do
alias Pinchflat.Tasks.Task
alias Pinchflat.Media.MediaItem
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
@doc """
Returns the list of tasks. Returns [%Task{}, ...]

View file

@ -5,8 +5,8 @@ defmodule Pinchflat.Tasks.SourceTasks do
alias Pinchflat.Media
alias Pinchflat.Tasks
alias Pinchflat.MediaSource
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources
alias Pinchflat.Sources.Source
alias Pinchflat.MediaClient.SourceDetails
alias Pinchflat.Workers.MediaIndexingWorker
alias Pinchflat.Workers.VideoDownloadWorker
@ -43,7 +43,7 @@ defmodule Pinchflat.Tasks.SourceTasks do
"""
def index_media_items(%Source{} = source) do
{:ok, media_attributes} = SourceDetails.get_media_attributes(source.original_url)
MediaSource.update_source(source, %{last_indexed_at: DateTime.utc_now()})
Sources.update_source(source, %{last_indexed_at: DateTime.utc_now()})
media_attributes
|> Enum.map(fn media_attrs ->

View file

@ -7,7 +7,7 @@ defmodule Pinchflat.Tasks.Task do
import Ecto.Changeset
alias Pinchflat.Media.MediaItem
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
schema "tasks" do
belongs_to :job, Oban.Job

View file

@ -8,7 +8,7 @@ defmodule Pinchflat.Workers.MediaIndexingWorker do
alias __MODULE__
alias Pinchflat.Tasks
alias Pinchflat.MediaSource
alias Pinchflat.Sources
alias Pinchflat.Tasks.SourceTasks
@impl Oban.Worker
@ -37,7 +37,7 @@ defmodule Pinchflat.Workers.MediaIndexingWorker do
Returns :ok | {:ok, %Task{}}
"""
def perform(%Oban.Job{args: %{"id" => source_id}}) do
source = MediaSource.get_source!(source_id)
source = Sources.get_source!(source_id)
if source.index_frequency_minutes <= 0 do
:ok

View file

@ -1,4 +1,4 @@
defmodule PinchflatWeb.Media.MediaItemController do
defmodule PinchflatWeb.MediaItems.MediaItemController do
use PinchflatWeb, :controller
alias Pinchflat.Media

View file

@ -1,4 +1,4 @@
defmodule PinchflatWeb.Media.MediaItemHTML do
defmodule PinchflatWeb.MediaItems.MediaItemHTML do
use PinchflatWeb, :html
embed_templates "media_item_html/*"

View file

@ -2,7 +2,7 @@ defmodule PinchflatWeb.Pages.PageController do
use PinchflatWeb, :controller
alias Pinchflat.Repo
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
alias Pinchflat.Profiles.MediaProfile
def home(conn, params) do

View file

@ -1,20 +1,20 @@
defmodule PinchflatWeb.MediaSources.SourceController do
defmodule PinchflatWeb.Sources.SourceController do
use PinchflatWeb, :controller
alias Pinchflat.Repo
alias Pinchflat.Media
alias Pinchflat.Profiles
alias Pinchflat.MediaSource
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources
alias Pinchflat.Sources.Source
def index(conn, _params) do
sources = Repo.preload(MediaSource.list_sources(), :media_profile)
sources = Repo.preload(Sources.list_sources(), :media_profile)
render(conn, :index, sources: sources)
end
def new(conn, _params) do
changeset = MediaSource.change_source(%Source{})
changeset = Sources.change_source(%Source{})
if get_session(conn, :onboarding) do
render(conn, :new,
@ -28,7 +28,7 @@ defmodule PinchflatWeb.MediaSources.SourceController do
end
def create(conn, %{"source" => source_params}) do
case MediaSource.create_source(source_params) do
case Sources.create_source(source_params) do
{:ok, source} ->
redirect_location =
if get_session(conn, :onboarding), do: ~p"/?onboarding=1", else: ~p"/sources/#{source}"
@ -53,7 +53,7 @@ defmodule PinchflatWeb.MediaSources.SourceController do
def show(conn, %{"id" => id}) do
source =
id
|> MediaSource.get_source!()
|> Sources.get_source!()
|> Repo.preload(:media_profile)
pending_media = Media.list_pending_media_items_for(source)
@ -63,16 +63,16 @@ defmodule PinchflatWeb.MediaSources.SourceController do
end
def edit(conn, %{"id" => id}) do
source = MediaSource.get_source!(id)
changeset = MediaSource.change_source(source)
source = Sources.get_source!(id)
changeset = Sources.change_source(source)
render(conn, :edit, source: source, changeset: changeset, media_profiles: media_profiles())
end
def update(conn, %{"id" => id, "source" => source_params}) do
source = MediaSource.get_source!(id)
source = Sources.get_source!(id)
case MediaSource.update_source(source, source_params) do
case Sources.update_source(source, source_params) do
{:ok, source} ->
conn
|> put_flash(:info, "Source updated successfully.")
@ -88,8 +88,8 @@ defmodule PinchflatWeb.MediaSources.SourceController do
end
def delete(conn, %{"id" => id}) do
source = MediaSource.get_source!(id)
{:ok, _source} = MediaSource.delete_source(source)
source = Sources.get_source!(id)
{:ok, _source} = Sources.delete_source(source)
conn
|> put_flash(:info, "Source deleted successfully.")

View file

@ -1,4 +1,4 @@
defmodule PinchflatWeb.MediaSources.SourceHTML do
defmodule PinchflatWeb.Sources.SourceHTML do
use PinchflatWeb, :html
embed_templates "source_html/*"

View file

@ -22,8 +22,8 @@ defmodule PinchflatWeb.Router do
resources "/media_profiles", MediaProfiles.MediaProfileController
resources "/search", Searches.SearchController, only: [:show], singleton: true
resources "/sources", MediaSources.SourceController do
resources "/media", Media.MediaItemController, only: [:show, :delete]
resources "/sources", Sources.SourceController do
resources "/media", MediaItems.MediaItemController, only: [:show, :delete]
end
end

View file

@ -1,7 +1,7 @@
defmodule Pinchflat.MediaClient.Backends.YtDlp.VideoCollectionTest do
use ExUnit.Case, async: true
import Mox
import Pinchflat.MediaSourceFixtures
import Pinchflat.SourcesFixtures
alias Pinchflat.MediaClient.Backends.YtDlp.VideoCollection

View file

@ -2,7 +2,7 @@ defmodule Pinchflat.MediaClient.SourceDetailsTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.ProfilesFixtures
import Pinchflat.MediaSourceFixtures
import Pinchflat.SourcesFixtures
alias Pinchflat.MediaClient.SourceDetails

View file

@ -4,7 +4,7 @@ defmodule Pinchflat.MediaTest do
import Pinchflat.TasksFixtures
import Pinchflat.MediaFixtures
import Pinchflat.ProfilesFixtures
import Pinchflat.MediaSourceFixtures
import Pinchflat.SourcesFixtures
alias Pinchflat.Media
alias Pinchflat.Media.MediaItem

View file

@ -1,14 +1,14 @@
defmodule Pinchflat.MediaSourceTest do
defmodule Pinchflat.SourcesTest do
use Pinchflat.DataCase
import Mox
import Pinchflat.TasksFixtures
import Pinchflat.MediaFixtures
import Pinchflat.ProfilesFixtures
import Pinchflat.MediaSourceFixtures
import Pinchflat.SourcesFixtures
alias Pinchflat.MediaSource
alias Pinchflat.Sources
alias Pinchflat.Tasks.SourceTasks
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
alias Pinchflat.Workers.MediaIndexingWorker
alias Pinchflat.Workers.VideoDownloadWorker
@ -19,14 +19,14 @@ defmodule Pinchflat.MediaSourceTest do
describe "list_sources/0" do
test "it returns all sources" do
source = source_fixture()
assert MediaSource.list_sources() == [source]
assert Sources.list_sources() == [source]
end
end
describe "get_source!/1" do
test "it returns the source with given id" do
source = source_fixture()
assert MediaSource.get_source!(source.id) == source
assert Sources.get_source!(source.id) == source
end
end
@ -40,7 +40,7 @@ defmodule Pinchflat.MediaSourceTest do
collection_type: "channel"
}
assert {:ok, %Source{} = source} = MediaSource.create_source(valid_attrs)
assert {:ok, %Source{} = source} = Sources.create_source(valid_attrs)
assert source.collection_name == "some channel name"
assert String.starts_with?(source.collection_id, "some_channel_id_")
end
@ -54,13 +54,13 @@ defmodule Pinchflat.MediaSourceTest do
collection_type: "playlist"
}
assert {:ok, %Source{} = source} = MediaSource.create_source(valid_attrs)
assert {:ok, %Source{} = source} = Sources.create_source(valid_attrs)
assert source.collection_name == "some playlist name"
assert String.starts_with?(source.collection_id, "some_playlist_id_")
end
test "creation with invalid data returns error changeset" do
assert {:error, %Ecto.Changeset{}} = MediaSource.create_source(@invalid_source_attrs)
assert {:error, %Ecto.Changeset{}} = Sources.create_source(@invalid_source_attrs)
end
test "creation enforces uniqueness of collection_id scoped to the media_profile" do
@ -78,8 +78,8 @@ defmodule Pinchflat.MediaSourceTest do
collection_type: "channel"
}
assert {:ok, %Source{}} = MediaSource.create_source(valid_once_attrs)
assert {:error, %Ecto.Changeset{}} = MediaSource.create_source(valid_once_attrs)
assert {:ok, %Source{}} = Sources.create_source(valid_once_attrs)
assert {:error, %Ecto.Changeset{}} = Sources.create_source(valid_once_attrs)
end
test "creation lets you duplicate collection_ids as long as the media profile is different" do
@ -100,8 +100,8 @@ defmodule Pinchflat.MediaSourceTest do
source_1_attrs = Map.merge(valid_attrs, %{media_profile_id: media_profile_fixture().id})
source_2_attrs = Map.merge(valid_attrs, %{media_profile_id: media_profile_fixture().id})
assert {:ok, %Source{}} = MediaSource.create_source(source_1_attrs)
assert {:ok, %Source{}} = MediaSource.create_source(source_2_attrs)
assert {:ok, %Source{}} = Sources.create_source(source_1_attrs)
assert {:ok, %Source{}} = Sources.create_source(source_2_attrs)
end
test "creation will schedule the indexing task" do
@ -113,7 +113,7 @@ defmodule Pinchflat.MediaSourceTest do
collection_type: "channel"
}
assert {:ok, %Source{} = source} = MediaSource.create_source(valid_attrs)
assert {:ok, %Source{} = source} = Sources.create_source(valid_attrs)
assert_enqueued(worker: MediaIndexingWorker, args: %{"id" => source.id})
end
@ -124,7 +124,7 @@ defmodule Pinchflat.MediaSourceTest do
source = source_fixture()
update_attrs = %{collection_name: "some updated name"}
assert {:ok, %Source{} = source} = MediaSource.update_source(source, update_attrs)
assert {:ok, %Source{} = source} = Sources.update_source(source, update_attrs)
assert source.collection_name == "some updated name"
end
@ -134,7 +134,7 @@ defmodule Pinchflat.MediaSourceTest do
source = source_fixture()
update_attrs = %{original_url: "https://www.youtube.com/channel/abc123"}
assert {:ok, %Source{} = source} = MediaSource.update_source(source, update_attrs)
assert {:ok, %Source{} = source} = Sources.update_source(source, update_attrs)
assert source.collection_name == "some channel name"
assert String.starts_with?(source.collection_id, "some_channel_id_")
end
@ -145,7 +145,7 @@ defmodule Pinchflat.MediaSourceTest do
source = source_fixture(collection_type: "playlist")
update_attrs = %{original_url: "https://www.youtube.com/playlist?list=abc123"}
assert {:ok, %Source{} = source} = MediaSource.update_source(source, update_attrs)
assert {:ok, %Source{} = source} = Sources.update_source(source, update_attrs)
assert source.collection_name == "some playlist name"
assert String.starts_with?(source.collection_id, "some_playlist_id_")
end
@ -156,14 +156,14 @@ defmodule Pinchflat.MediaSourceTest do
source = source_fixture()
update_attrs = %{name: "some updated name"}
assert {:ok, %Source{}} = MediaSource.update_source(source, update_attrs)
assert {:ok, %Source{}} = Sources.update_source(source, update_attrs)
end
test "updating the index frequency will re-schedule the indexing task" do
source = source_fixture()
update_attrs = %{index_frequency_minutes: 123}
assert {:ok, %Source{} = source} = MediaSource.update_source(source, update_attrs)
assert {:ok, %Source{} = source} = Sources.update_source(source, update_attrs)
assert source.index_frequency_minutes == 123
assert_enqueued(worker: MediaIndexingWorker, args: %{"id" => source.id})
end
@ -172,7 +172,7 @@ defmodule Pinchflat.MediaSourceTest do
source = source_fixture()
update_attrs = %{name: "some updated name"}
assert {:ok, %Source{}} = MediaSource.update_source(source, update_attrs)
assert {:ok, %Source{}} = Sources.update_source(source, update_attrs)
refute_enqueued(worker: MediaIndexingWorker, args: %{"id" => source.id})
end
@ -182,7 +182,7 @@ defmodule Pinchflat.MediaSourceTest do
update_attrs = %{download_media: true}
refute_enqueued(worker: VideoDownloadWorker)
assert {:ok, %Source{}} = MediaSource.update_source(source, update_attrs)
assert {:ok, %Source{}} = Sources.update_source(source, update_attrs)
assert_enqueued(worker: VideoDownloadWorker, args: %{"id" => media_item.id})
end
@ -193,7 +193,7 @@ defmodule Pinchflat.MediaSourceTest do
SourceTasks.enqueue_pending_media_tasks(source)
assert_enqueued(worker: VideoDownloadWorker, args: %{"id" => media_item.id})
assert {:ok, %Source{}} = MediaSource.update_source(source, update_attrs)
assert {:ok, %Source{}} = Sources.update_source(source, update_attrs)
refute_enqueued(worker: VideoDownloadWorker)
end
@ -201,29 +201,29 @@ defmodule Pinchflat.MediaSourceTest do
source = source_fixture()
assert {:error, %Ecto.Changeset{}} =
MediaSource.update_source(source, @invalid_source_attrs)
Sources.update_source(source, @invalid_source_attrs)
assert source == MediaSource.get_source!(source.id)
assert source == Sources.get_source!(source.id)
end
end
describe "delete_source/1" do
test "it deletes the source" do
source = source_fixture()
assert {:ok, %Source{}} = MediaSource.delete_source(source)
assert_raise Ecto.NoResultsError, fn -> MediaSource.get_source!(source.id) end
assert {:ok, %Source{}} = Sources.delete_source(source)
assert_raise Ecto.NoResultsError, fn -> Sources.get_source!(source.id) end
end
test "it returns a source changeset" do
source = source_fixture()
assert %Ecto.Changeset{} = MediaSource.change_source(source)
assert %Ecto.Changeset{} = Sources.change_source(source)
end
test "deletion also deletes all associated tasks" do
source = source_fixture()
task = task_fixture(source_id: source.id)
assert {:ok, %Source{}} = MediaSource.delete_source(source)
assert {:ok, %Source{}} = Sources.delete_source(source)
assert_raise Ecto.NoResultsError, fn -> Repo.reload!(task) end
end
end
@ -232,7 +232,7 @@ defmodule Pinchflat.MediaSourceTest do
test "it returns a changeset" do
source = source_fixture()
assert %Ecto.Changeset{} = MediaSource.change_source(source)
assert %Ecto.Changeset{} = Sources.change_source(source)
end
end
@ -241,13 +241,13 @@ defmodule Pinchflat.MediaSourceTest do
stub(YtDlpRunnerMock, :run, &runner_function_mock/3)
source = source_fixture()
assert %Ecto.Changeset{} = MediaSource.change_source_from_url(source, %{})
assert %Ecto.Changeset{} = Sources.change_source_from_url(source, %{})
end
test "it does not fetch source details if the original_url isn't in the changeset" do
expect(YtDlpRunnerMock, :run, 0, &runner_function_mock/3)
changeset = MediaSource.change_source_from_url(%Source{}, %{name: "some updated name"})
changeset = Sources.change_source_from_url(%Source{}, %{name: "some updated name"})
assert %Ecto.Changeset{} = changeset
end
@ -256,7 +256,7 @@ defmodule Pinchflat.MediaSourceTest do
expect(YtDlpRunnerMock, :run, &runner_function_mock/3)
changeset =
MediaSource.change_source_from_url(%Source{}, %{
Sources.change_source_from_url(%Source{}, %{
original_url: "https://www.youtube.com/channel/abc123"
})
@ -270,7 +270,7 @@ defmodule Pinchflat.MediaSourceTest do
media_profile_id = media_profile.id
changeset =
MediaSource.change_source_from_url(%Source{collection_type: :channel}, %{
Sources.change_source_from_url(%Source{collection_type: :channel}, %{
original_url: "https://www.youtube.com/channel/abc123",
media_profile_id: media_profile.id
})
@ -291,7 +291,7 @@ defmodule Pinchflat.MediaSourceTest do
end)
changeset =
MediaSource.change_source_from_url(%Source{}, %{
Sources.change_source_from_url(%Source{}, %{
original_url: "https://www.youtube.com/channel/abc123"
})

View file

@ -4,7 +4,7 @@ defmodule Pinchflat.Tasks.SourceTasksTest do
import Mox
import Pinchflat.TasksFixtures
import Pinchflat.MediaFixtures
import Pinchflat.MediaSourceFixtures
import Pinchflat.SourcesFixtures
alias Pinchflat.Tasks
alias Pinchflat.Tasks.Task

View file

@ -3,7 +3,7 @@ defmodule Pinchflat.TasksTest do
import Pinchflat.JobFixtures
import Pinchflat.TasksFixtures
import Pinchflat.MediaFixtures
import Pinchflat.MediaSourceFixtures
import Pinchflat.SourcesFixtures
alias Pinchflat.Tasks
alias Pinchflat.Tasks.Task

View file

@ -3,7 +3,7 @@ defmodule Pinchflat.Workers.MediaIndexingWorkerTest do
import Mox
import Pinchflat.MediaFixtures
import Pinchflat.MediaSourceFixtures
import Pinchflat.SourcesFixtures
alias Pinchflat.Tasks
alias Pinchflat.Workers.MediaIndexingWorker

View file

@ -4,7 +4,7 @@ defmodule Pinchflat.Workers.VideoDownloadWorkerTest do
import Mox
import Pinchflat.MediaFixtures
alias Pinchflat.MediaSource
alias Pinchflat.Sources
alias Pinchflat.Workers.VideoDownloadWorker
setup :verify_on_exit!
@ -60,7 +60,7 @@ defmodule Pinchflat.Workers.VideoDownloadWorkerTest do
test "it does not download if the source is set to not download", %{media_item: media_item} do
expect(YtDlpRunnerMock, :run, 0, fn _url, _opts, _ot -> :ok end)
MediaSource.update_source(media_item.source, %{download_media: false})
Sources.update_source(media_item.source, %{download_media: false})
perform_job(VideoDownloadWorker, %{id: media_item.id})
end

View file

@ -2,7 +2,7 @@ defmodule PinchflatWeb.PageControllerTest do
use PinchflatWeb.ConnCase
import Pinchflat.ProfilesFixtures
import Pinchflat.MediaSourceFixtures
import Pinchflat.SourcesFixtures
describe "GET / when testing onboarding" do
test "sets the onboarding session to true when onboarding", %{conn: conn} do

View file

@ -3,7 +3,7 @@ defmodule PinchflatWeb.SourceControllerTest do
import Mox
import Pinchflat.ProfilesFixtures
import Pinchflat.MediaSourceFixtures
import Pinchflat.SourcesFixtures
setup do
media_profile = media_profile_fixture()

View file

@ -4,7 +4,7 @@ defmodule Pinchflat.MediaFixtures do
entities via the `Pinchflat.Media` context.
"""
alias Pinchflat.MediaSourceFixtures
alias Pinchflat.SourcesFixtures
@doc """
Generate a media_item.
@ -18,7 +18,7 @@ defmodule Pinchflat.MediaFixtures do
original_url: "https://www.youtube.com/channel/#{Faker.String.base64(12)}",
livestream: false,
media_filepath: "/video/#{Faker.File.file_name(:video)}",
source_id: MediaSourceFixtures.source_fixture().id
source_id: SourcesFixtures.source_fixture().id
})
|> Pinchflat.Media.create_media_item()

View file

@ -1,12 +1,12 @@
defmodule Pinchflat.MediaSourceFixtures do
defmodule Pinchflat.SourcesFixtures do
@moduledoc """
This module defines test helpers for creating
entities via the `Pinchflat.MediaSource` context.
entities via the `Pinchflat.Sources` context.
"""
alias Pinchflat.Repo
alias Pinchflat.ProfilesFixtures
alias Pinchflat.MediaSource.Source
alias Pinchflat.Sources.Source
@doc """
Generate a source.

View file

@ -5,7 +5,7 @@ defmodule Pinchflat.TasksFixtures do
"""
alias Pinchflat.JobFixtures
alias Pinchflat.MediaSourceFixtures
alias Pinchflat.SourcesFixtures
@doc """
Generate a task.
@ -14,7 +14,7 @@ defmodule Pinchflat.TasksFixtures do
{:ok, task} =
attrs
|> Enum.into(%{
source_id: MediaSourceFixtures.source_fixture().id,
source_id: SourcesFixtures.source_fixture().id,
job_id: JobFixtures.job_fixture().id
})
|> Pinchflat.Tasks.create_task()