From 5cc32de8d2e71bf5cdc244e90e0b6bde048c58a5 Mon Sep 17 00:00:00 2001 From: Benjamin Piouffle Date: Wed, 30 Aug 2023 14:02:44 +0200 Subject: [PATCH] feat: Add job to download captions --- apps/cf_jobs/lib/jobs/download_captions.ex | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 apps/cf_jobs/lib/jobs/download_captions.ex diff --git a/apps/cf_jobs/lib/jobs/download_captions.ex b/apps/cf_jobs/lib/jobs/download_captions.ex new file mode 100644 index 00000000..dd8c4882 --- /dev/null +++ b/apps/cf_jobs/lib/jobs/download_captions.ex @@ -0,0 +1,57 @@ +defmodule CF.Jobs.DownloadCaptions do + @behaviour CF.Jobs.Job + + require Logger + import Ecto.Query + import ScoutApm.Tracing + + alias DB.Repo + alias DB.Schema.UserAction + alias DB.Schema.UsersActionsReport + + alias CF.Jobs.ReportManager + + @name :download_captions + @analyser_id UsersActionsReport.analyser_id(@name) + + # --- Client API --- + + def name, do: @name + + def start_link() do + GenServer.start_link(__MODULE__, :ok, name: __MODULE__) + end + + def init(args) do + {:ok, args} + end + + # 1 minute + @timeout 60_000 + def update() do + GenServer.call(__MODULE__, :download_captions, @timeout) + end + + # --- Server callbacks --- + @transaction_opts [type: "background", name: "download_captions"] + def handle_call(:download_captions, _from, _state) do + get_videos() + |> Enum.map(fn video -> + Logger.info("Downloading captions for video #{video.id}") + download_captions(video) + end) + + {:reply, :ok, :ok} + end + + # Get all videos that need new captions. We fetch new captions: + # - For any videos that doesn't have any captions yet + # - For videos whose captions haven't been updated in the last 30 days + defp get_videos() do + Repo.all( + from v in DB.Schema.Video, + where: v.captions_updated_at == nil or v.captions_updated_at < DateTime.utc_now() - 30, + preload: [:channel] + ) + end +end