defmodule Algora.Library.Segment do alias Algora.Library alias Algora.Library.{Segment, Subtitle} use Ecto.Schema import Ecto.Changeset schema "segments" do field :start, :float field :end, :float field :body, :string field :embedding, {:array, :float} belongs_to :video, Library.Video belongs_to :starting_subtitle, Library.Subtitle belongs_to :ending_subtitle, Library.Subtitle timestamps() end @doc false def changeset(segment, attrs) do segment |> cast(attrs, [:body, :start, :end]) |> validate_required([:body, :start, :end]) end def init([]), do: nil def init(subtitles) do body = subtitles |> Enum.map_join("", fn %Subtitle{body: body} -> body end) starting_subtitle = subtitles |> Enum.at(0) ending_subtitle = subtitles |> Enum.at(-1) %Segment{ body: body, start: starting_subtitle.start, end: ending_subtitle.end, video_id: starting_subtitle.video_id, starting_subtitle_id: starting_subtitle.id, ending_subtitle_id: ending_subtitle.id } end end