* Made method to getting singular media details; Renamed other related method * Takes a fun and flirty digression to remove abstractions around yt-dlp since I'm 100% committed to using it exclusively * Removed commented test code * Lays the groundwork for fast indexing * Added module for working with youtube RSS feed * Added methods to kick off indexing workers from RSS response * Improve short detection (#59) * Made media attribute-related yt-dlp calls return a struct * Added shorts attribute to media items * Added ability to discern a short from yt-dlp response * Updated search to use new shorts attribute * Fast index UI (#63) * Added fast_index field and adds it to source form * Added fast indexing to source changeset operations * Added fast indexing worker and updated other modules to start using it * Handled fast index worker on source update * Add support modals (#65) * Added fast indexing upgrade modal * Improved modal on smaller screens * Updated links to work again * Added donation modal * Reverted source fast index to 15 minutes * Removed unneeded HTML attributes from old alpine approach
80 lines
1.9 KiB
Elixir
80 lines
1.9 KiB
Elixir
defmodule Pinchflat.Sources.Source do
|
|
@moduledoc """
|
|
The Source schema.
|
|
"""
|
|
|
|
use Ecto.Schema
|
|
import Ecto.Changeset
|
|
import Pinchflat.Utils.ChangesetUtils
|
|
|
|
alias Pinchflat.Tasks.Task
|
|
alias Pinchflat.Media.MediaItem
|
|
alias Pinchflat.Profiles.MediaProfile
|
|
|
|
@allowed_fields ~w(
|
|
collection_name
|
|
collection_id
|
|
collection_type
|
|
custom_name
|
|
index_frequency_minutes
|
|
fast_index
|
|
download_media
|
|
last_indexed_at
|
|
original_url
|
|
media_profile_id
|
|
)a
|
|
|
|
@required_fields ~w(
|
|
collection_name
|
|
collection_id
|
|
collection_type
|
|
custom_name
|
|
index_frequency_minutes
|
|
fast_index
|
|
download_media
|
|
original_url
|
|
media_profile_id
|
|
)a
|
|
|
|
schema "sources" do
|
|
field :custom_name, :string
|
|
field :collection_name, :string
|
|
field :collection_id, :string
|
|
field :collection_type, Ecto.Enum, values: [:channel, :playlist]
|
|
field :index_frequency_minutes, :integer, default: 60 * 24
|
|
field :fast_index, :boolean, default: false
|
|
field :download_media, :boolean, default: true
|
|
field :last_indexed_at, :utc_datetime
|
|
# This should only be used for user reference going forward
|
|
# as the collection_id should be used for all API calls
|
|
field :original_url, :string
|
|
|
|
belongs_to :media_profile, MediaProfile
|
|
|
|
has_many :tasks, Task
|
|
has_many :media_items, MediaItem, foreign_key: :source_id
|
|
|
|
timestamps(type: :utc_datetime)
|
|
end
|
|
|
|
@doc false
|
|
def changeset(source, attrs) do
|
|
source
|
|
|> cast(attrs, @allowed_fields)
|
|
|> dynamic_default(:custom_name, fn cs -> get_field(cs, :collection_name) end)
|
|
|> validate_required(@required_fields)
|
|
|> unique_constraint([:collection_id, :media_profile_id])
|
|
end
|
|
|
|
@doc false
|
|
def index_frequency_when_fast_indexing do
|
|
# 30 days in minutes
|
|
60 * 24 * 30
|
|
end
|
|
|
|
@doc false
|
|
def fast_index_frequency do
|
|
# minutes
|
|
15
|
|
end
|
|
end
|