diff --git a/services/bright/lib/bright/b2.ex b/services/bright/lib/bright/b2.ex
index 2f6c820..28cf7b7 100644
--- a/services/bright/lib/bright/b2.ex
+++ b/services/bright/lib/bright/b2.ex
@@ -36,6 +36,7 @@ defmodule Bright.B2 do
end
cdn_url = "#{s3_cdn_endpoint}/#{object_key}"
+ IO.puts "putting local_file=#{local_file} to bucket=#{bucket} s3_cdn_endpoint=#{s3_cdn_endpoint} key=#{object_key}"
local_file
|> S3.Upload.stream_file
diff --git a/services/bright/lib/bright/cache.ex b/services/bright/lib/bright/cache.ex
index e49e649..24d2cef 100644
--- a/services/bright/lib/bright/cache.ex
+++ b/services/bright/lib/bright/cache.ex
@@ -38,9 +38,12 @@ defmodule Bright.Cache do
# |> Kernel.<>(".#{ext}")
end
+ def get_cache_dir do
+ @cache_dir
+ end
# Ensure the cache directory exists
- defp ensure_cache_dir! do
+ def ensure_cache_dir! do
unless File.exists?(@cache_dir) do
File.mkdir_p!(@cache_dir)
end
diff --git a/services/bright/lib/bright/downloader.ex b/services/bright/lib/bright/downloader.ex
index 0fc141f..16354fd 100644
--- a/services/bright/lib/bright/downloader.ex
+++ b/services/bright/lib/bright/downloader.ex
@@ -3,31 +3,54 @@ defmodule Bright.Downloader do
Downloader functions
"""
-
def get(url) do
+ filename = Bright.Cache.generate_filename(url)
- local_file = Bright.Cache.generate_filename(url)
- headers = %{}
- case HTTPoison.get(url, headers) do
- {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
- case File.write(local_file, body) do
- :ok -> {:ok, local_file}
- end
+ IO.puts("Downloader downloading to filename=#{filename}")
- {:ok, %HTTPoison.Response{status_code: status, body: body}} ->
- {:error, %{status: status, body: body}}
-
- {:error, %HTTPoison.Error{reason: reason}} ->
- {:error, reason}
-
- failed ->
- Logger.error("Failed to GET #{url}")
- {:error, :failed}
+ try do
+ {download!(url, filename), filename}
+ rescue
+ exception ->
+ {:error, Exception.message(exception)}
end
-
-
-
-
end
+ # greets https://elixirforum.com/t/how-to-download-big-files/9173/4
+ defp download!(file_url, filename) do
+ file =
+ if File.exists?(filename) do
+ File.open!(filename, [:append])
+ else
+ File.touch!(filename)
+ File.open!(filename, [:append])
+ end
+
+ %HTTPoison.AsyncResponse{id: ref} = HTTPoison.get!(file_url, %{}, stream_to: self())
+
+ append_loop(ref, file)
+ end
+
+ defp append_loop(ref, file) do
+ receive do
+ %HTTPoison.AsyncChunk{chunk: chunk, id: ^ref} ->
+ IO.binwrite(file, chunk)
+ append_loop(ref, file)
+
+ %HTTPoison.AsyncEnd{id: ^ref} ->
+ File.close(file)
+
+ # need something to handle errors like request timeout and such
+ # otherwise it will loop forever
+ # don't know what httpoison returns in case of an error ...
+ # you can inspect `_other` below to find out
+ # and match on the error to exit the loop early
+ other ->
+ IO.puts(
+ "!!!!!!!!!!!!!! WARNING: append_loop is doing it's recursive thing which may cause an infinite loop. @todo please implement error handling. other=#{inspect(other)}"
+ )
+
+ append_loop(ref, file)
+ end
+ end
end
diff --git a/services/bright/lib/bright/oban_workers/create_hls_playlist.ex b/services/bright/lib/bright/oban_workers/create_hls_playlist.ex
index b1d5c3f..c2d9645 100644
--- a/services/bright/lib/bright/oban_workers/create_hls_playlist.ex
+++ b/services/bright/lib/bright/oban_workers/create_hls_playlist.ex
@@ -2,7 +2,7 @@
defmodule Bright.ObanWorkers.CreateHlsPlaylist do
- use Oban.Worker, queue: :default, max_attempts: 1
+ use Oban.Worker, queue: :default, max_attempts: 6
alias Bright.Repo
alias Bright.Streams.Vod
@@ -10,18 +10,18 @@ defmodule Bright.ObanWorkers.CreateHlsPlaylist do
require Logger
@auth_token Application.get_env(:bright, :superstreamer_auth_token)
- @superstreamer_url Application.get_env(:bright, :superstreamer_url)
+ @superstreamer_url System.get_env("SUPERSTREAMER_URL")
@public_s3_endpoint Application.get_env(:bright, :s3_cdn_endpoint)
# args: %{"vod_id" => 10, "input_url" => "http://38.242.193.246:8081/fixtures/2024-12-19T03-10-30Z.ts"}
@impl Oban.Worker
- def perform(%Oban.Job{args: %{"vod_id" => vod_id, "input_url" => input_url}}) do
- Logger.info(">>>> create_hls_playlist is performing. input_url=#{input_url} vod_id=#{vod_id}")
+ def perform(%Oban.Job{args: %{"vod_id" => vod_id}}) do
+ Logger.info(">>>> create_hls_playlist is performing. vod_id=#{vod_id}")
vod = Repo.get!(Vod, vod_id)
- payload = build_payload(input_url)
+ payload = build_payload(vod.origin_temp_input_url)
Logger.info("Starting transcoding for VOD ID #{vod_id}")
@@ -43,12 +43,12 @@ defmodule Bright.ObanWorkers.CreateHlsPlaylist do
%{
"inputs" => [
%{"type" => "audio", "path" => input_url, "language" => "eng"},
- # %{"type" => "video", "path" => input_url}
+ %{"type" => "video", "path" => input_url}
],
"streams" => [
- # %{"type" => "video", "codec" => "h264", "height" => 1080},
- # %{"type" => "video", "codec" => "h264", "height" => 720},
- # %{"type" => "video", "codec" => "h264", "height" => 144},
+ %{"type" => "video", "codec" => "h264", "height" => 1080},
+ # %{"type" => "video", "codec" => "h264", "height" => 720}, # when I enabled this, I see a superstreamer error? -- "header 'content-length' is listed in signed headers, but is not present "
+ %{"type" => "video", "codec" => "h264", "height" => 144},
%{"type" => "audio", "codec" => "aac"}
],
"tag" => "create_hls_playlist"
@@ -64,6 +64,8 @@ defmodule Bright.ObanWorkers.CreateHlsPlaylist do
Logger.info("auth headers as follows")
Logger.info(inspect(headers))
+ Logger.info("@superstreamer_url=#{@superstreamer_url}")
+
if is_nil(@superstreamer_url) do
Logger.error("The @superstreamer_url is nil. This must be set before proceeding.")
diff --git a/services/bright/lib/bright/oban_workers/create_s3_asset.ex b/services/bright/lib/bright/oban_workers/create_s3_asset.ex
index 122db13..6888f02 100644
--- a/services/bright/lib/bright/oban_workers/create_s3_asset.ex
+++ b/services/bright/lib/bright/oban_workers/create_s3_asset.ex
@@ -8,18 +8,21 @@ defmodule Bright.ObanWorkers.CreateS3Asset do
alias Bright.Downloader
alias Bright.B2
alias Bright.Repo
+ alias Bright.Streams.{
+ Stream,
+ Vod
+ }
@impl Oban.Worker
- def perform(%Oban.Job{args: %{"input_url" => input_url, "vod_id" => vod_id}}) do
+ def perform(%Oban.Job{args: %{"vod_id" => vod_id}}) do
Logger.info("CreateS3Asset begin.")
vod = Repo.get!(Vod, vod_id)
- basename = Cache.generate_basename(input_url)
- with {:ok, local_file} <- Downloader.get(input_url),
- {:ok, object_key} <- B2.put(local_file, basename) do
- update_vod_with_s3_asset(vod, object_key)
+ with {:ok, local_file} <- Downloader.get(vod.origin_temp_input_url),
+ {:ok, %{key: key, cdn_url: cdn_url}} <- B2.put(local_file) do
+ update_vod_with_s3_asset(vod, cdn_url)
else
{:error, reason} ->
@@ -28,21 +31,13 @@ defmodule Bright.ObanWorkers.CreateS3Asset do
end
end
- defp update_vod_with_s3_asset(vod, object_key) do
- basename = Path.basename(vod.thumbnail_url)
- s3_cdn_url = B2.generate_cdn_url(object_key)
- vod
- |> Ecto.Changeset.change(s3_cdn_url: s3_cdn_url)
- |> Repo.update!()
+ defp update_vod_with_s3_asset(vod, s3_cdn_url) do
+ case Repo.update(vod |> Ecto.Changeset.change(s3_cdn_url: s3_cdn_url)) do
+ {:ok, updated_vod} -> {:ok, updated_vod}
+ {:error, changeset} -> {:error, changeset}
+ end
end
- # defp update_vod_with_playlist_url(vod, asset_id) do
- # playlist_url = generate_playlist_url(asset_id)
- # Logger.info("playlist_url=#{playlist_url}")
- # vod
- # |> Ecto.Changeset.change(playlist_url: playlist_url)
- # |> Repo.update!()
- # end
end
diff --git a/services/bright/lib/bright/oban_workers/process_vod.ex b/services/bright/lib/bright/oban_workers/process_vod.ex
index 42bd290..d05d226 100644
--- a/services/bright/lib/bright/oban_workers/process_vod.ex
+++ b/services/bright/lib/bright/oban_workers/process_vod.ex
@@ -19,8 +19,8 @@ defmodule Bright.ObanWorkers.ProcessVod do
if vod.origin_temp_input_url do
- unless vod.playlist_url, do: queue_create_hls_playlist(vod)
unless vod.s3_cdn_url, do: queue_create_s3_asset(vod)
+ unless vod.playlist_url, do: queue_create_hls_playlist(vod)
unless vod.thumbnail_url, do: queue_create_thumbnail(vod)
end
@@ -29,18 +29,18 @@ defmodule Bright.ObanWorkers.ProcessVod do
end
- defp queue_create_hls_playlist(%Vod{id: id, origin_temp_input_url: url}) do
- job_args = %{vod_id: id, input_url: url}
+ defp queue_create_hls_playlist(%Vod{id: id}) do
+ job_args = %{vod_id: id}
Oban.insert!(CreateHlsPlaylist.new(job_args))
end
- defp queue_create_s3_asset(%Vod{id: id, origin_temp_input_url: url}) do
- job_args = %{vod_id: id, input_url: url}
+ defp queue_create_s3_asset(%Vod{id: id}) do
+ job_args = %{vod_id: id}
Oban.insert!(CreateS3Asset.new(job_args))
end
- defp queue_create_thumbnail(%Vod{id: id, origin_temp_input_url: url}) do
- job_args = %{vod_id: id, input_url: url}
+ defp queue_create_thumbnail(%Vod{id: id}) do
+ job_args = %{vod_id: id}
Oban.insert!(CreateThumbnail.new(job_args))
end
diff --git a/services/bright/lib/bright/streams/vod.ex b/services/bright/lib/bright/streams/vod.ex
index a99c471..0cf648e 100644
--- a/services/bright/lib/bright/streams/vod.ex
+++ b/services/bright/lib/bright/streams/vod.ex
@@ -6,9 +6,6 @@ defmodule Bright.Streams.Vod do
field :origin_temp_input_url, :string
field :playlist_url, :string
field :s3_cdn_url, :string
- field :s3_upload_id, :string
- field :s3_key, :string
- field :s3_bucket, :string
field :mux_asset_id, :string
field :mux_playback_id, :string
field :ipfs_cid, :string
@@ -24,7 +21,7 @@ defmodule Bright.Streams.Vod do
@doc false
def changeset(vod, attrs) do
vod
- |> cast(attrs, [:s3_cdn_url, :s3_upload_id, :s3_key, :s3_bucket, :mux_asset_id, :mux_playback_id, :ipfs_cid, :torrent, :stream_id, :origin_temp_input_url, :playlist_url, :thumbnail_url])
+ |> cast(attrs, [:s3_cdn_url, :mux_asset_id, :mux_playback_id, :ipfs_cid, :torrent, :stream_id, :origin_temp_input_url, :playlist_url, :thumbnail_url])
|> validate_required([:stream_id])
end
diff --git a/services/bright/lib/bright_web/controllers/vod_html/index.html.heex b/services/bright/lib/bright_web/controllers/vod_html/index.html.heex
index c05a9d8..af2e106 100644
--- a/services/bright/lib/bright_web/controllers/vod_html/index.html.heex
+++ b/services/bright/lib/bright_web/controllers/vod_html/index.html.heex
@@ -9,10 +9,7 @@
<.table id="vods" rows={@vods} row_click={&JS.navigate(~p"/vods/#{&1}")}>
<:col :let={vod} label="ID">{vod.id}
- <:col :let={vod} label="S3 cdn url">{vod.s3_cdn_url}
- <:col :let={vod} label="S3 upload">{vod.s3_upload_id}
- <:col :let={vod} label="S3 key">{vod.s3_key}
- <:col :let={vod} label="S3 bucket">{vod.s3_bucket}
+ <:col :let={vod} label="S3 CDN URL">{vod.s3_cdn_url}
<:col :let={vod} label="Mux asset">{vod.mux_asset_id}
<:col :let={vod} label="Mux playback">{vod.mux_playback_id}
<:col :let={vod} label="Ipfs cid">{vod.ipfs_cid}
diff --git a/services/bright/lib/bright_web/controllers/vod_html/show.html.heex b/services/bright/lib/bright_web/controllers/vod_html/show.html.heex
index 5628ced..cace0f5 100644
--- a/services/bright/lib/bright_web/controllers/vod_html/show.html.heex
+++ b/services/bright/lib/bright_web/controllers/vod_html/show.html.heex
@@ -46,15 +46,18 @@
<.list>
- <:item title="Origin Temporary Input URL">{@vod.origin_temp_input_url}
+ <:item title="Source VOD File">
+ <%= if @vod.s3_cdn_url do %>
+
+ Download
+
+ <% end %>
+
+ <:item title="Thumbnail URL">
<:item title="HLS Playlist URL">{@vod.playlist_url}
- <:item title="S3 CDN url">{@vod.s3_cdn_url}
- <:item title="S3 upload">{@vod.s3_upload_id}
- <:item title="S3 key">{@vod.s3_key}
- <:item title="S3 bucket">{@vod.s3_bucket}
- <:item title="Thumbnail URL">{@vod.thumbnail_url}
- <:item title="Ipfs CID">{@vod.ipfs_cid}
<:item title="Torrent">{@vod.torrent}
+ <:item title="Ipfs CID">{@vod.ipfs_cid}
+ <%# <:item title="Origin Temporary Input URL">{@vod.origin_temp_input_url} %>
diff --git a/services/bright/lib/bright_web/controllers/vod_html/vod_form.html.heex b/services/bright/lib/bright_web/controllers/vod_html/vod_form.html.heex
index ba9ec28..1f9f31b 100644
--- a/services/bright/lib/bright_web/controllers/vod_html/vod_form.html.heex
+++ b/services/bright/lib/bright_web/controllers/vod_html/vod_form.html.heex
@@ -5,9 +5,6 @@
<.input field={f[:origin_temp_input_url]} type="text" label="Import VOD from URL" />
<.input field={f[:playlist_url]} type="text" label="HLS Playlist URL" />
<.input field={f[:s3_cdn_url]} type="text" label="S3 cdn url" />
- <.input field={f[:s3_upload_id]} type="text" label="S3 upload" />
- <.input field={f[:s3_key]} type="text" label="S3 key" />
- <.input field={f[:s3_bucket]} type="text" label="S3 bucket" />
<.input field={f[:mux_asset_id]} type="text" label="Mux asset" />
<.input field={f[:mux_playback_id]} type="text" label="Mux playback" />
<.input field={f[:ipfs_cid]} type="text" label="Ipfs cid" />
diff --git a/services/bright/priv/repo/migrations/20250122181020_remove_redundant_s3_from_vod.exs b/services/bright/priv/repo/migrations/20250122181020_remove_redundant_s3_from_vod.exs
new file mode 100644
index 0000000..7182381
--- /dev/null
+++ b/services/bright/priv/repo/migrations/20250122181020_remove_redundant_s3_from_vod.exs
@@ -0,0 +1,11 @@
+defmodule Bright.Repo.Migrations.RemoveRedundantS3FromVod do
+ use Ecto.Migration
+
+ def change do
+ alter table(:vods) do
+ remove :s3_upload_id
+ remove :s3_key
+ remove :s3_bucket
+ end
+ end
+end
diff --git a/services/bright/test/bright/b2_test.exs b/services/bright/test/bright/b2_test.exs
index b0cd85c..1168995 100644
--- a/services/bright/test/bright/b2_test.exs
+++ b/services/bright/test/bright/b2_test.exs
@@ -8,6 +8,7 @@ defmodule Bright.B2Test do
describe "B2" do
alias Bright.B2
+ alias Bright.Cache
@tag :acceptance
test "put/1" do
@@ -19,7 +20,8 @@ defmodule Bright.B2Test do
@tag :acceptance
test "put/2" do
local_file = Path.absname("test/fixtures/SampleVideo_1280x720_1mb.mp4")
- object_key = "test/SampleVideo_1280x720_1mb.mp4"
+ basename = Cache.generate_basename(local_file)
+ object_key = "test/#{basename}"
{:ok, %{key: key, cdn_url: cdn_url}} = B2.put(local_file, object_key)
assert Regex.match?(~r/SampleVideo/, key)
end
diff --git a/services/bright/test/bright/cache_test.ex b/services/bright/test/bright/cache_test.ex
index f5e8143..970cb3c 100644
--- a/services/bright/test/bright/cache_test.ex
+++ b/services/bright/test/bright/cache_test.ex
@@ -7,6 +7,10 @@ defmodule Bright.CacheTest do
describe "cache" do
+ @tag :unit
+ test "get_cache_dir/0" do
+ assert Regex.match?(~r/.cache\/futureporn/, Cache.get_cache_dir())
+ end
@tag :unit
diff --git a/services/bright/test/bright/downloader_test.exs b/services/bright/test/bright/downloader_test.exs
index 05503a1..c83b4c6 100644
--- a/services/bright/test/bright/downloader_test.exs
+++ b/services/bright/test/bright/downloader_test.exs
@@ -4,10 +4,13 @@ defmodule Bright.DownloaderTest do
use Bright.DataCase
alias Bright.Downloader
+ alias Bright.Cache
@test_fixture "https://futureporn-b2.b-cdn.net/projekt-melody.jpg"
describe "downloader" do
+
+ @tag :integration
test "get/1" do
{:ok, local_file} = Downloader.get(@test_fixture)
@@ -18,6 +21,38 @@ defmodule Bright.DownloaderTest do
end
+
+ @tag :integration
+ test "cache directory creation" do
+ cache_dir = Cache.get_cache_dir()
+ end
+
+ @tag :integration
+ test "downloading 1MB file" do
+ {:ok, local_file} = Downloader.get("https://futureporn-b2.b-cdn.net/SampleVideo_1280x720_1mb.mp4")
+ assert File.exists?(local_file)
+ {:ok, stat} = File.stat(local_file)
+ assert stat.size > 0, "File is empty"
+ end
+
+ @tag :integration
+ test "downloading 10MB file" do
+ {:ok, local_file} = Downloader.get("https://futureporn-b2.b-cdn.net/SampleVideo_1280x720_10mb.mp4")
+ assert File.exists?(local_file)
+ {:ok, stat} = File.stat(local_file)
+ assert stat.size > 0, "File is empty"
+ end
+
+ @tag :integration
+ test "downloading 20MB file" do
+ {:ok, local_file} = Downloader.get("https://futureporn-b2.b-cdn.net/SampleVideo_1280x720_20mb.mp4")
+ assert File.exists?(local_file)
+ {:ok, stat} = File.stat(local_file)
+ assert stat.size > 0, "File is empty"
+ end
+
+
+
end
end
diff --git a/services/bright/test/bright/oban_workers/create_hls_playlist_test.exs b/services/bright/test/bright/oban_workers/create_hls_playlist_test.exs
index 2802f92..040e53f 100644
--- a/services/bright/test/bright/oban_workers/create_hls_playlist_test.exs
+++ b/services/bright/test/bright/oban_workers/create_hls_playlist_test.exs
@@ -42,6 +42,8 @@ defmodule Bright.CreateHlsPlaylistTest do
refute_enqueued worker: CreateHlsPlaylist
end
+
+
end
diff --git a/services/bright/test/bright/oban_workers/create_ipfs_cid_test.exs b/services/bright/test/bright/oban_workers/create_ipfs_cid_test.exs
new file mode 100644
index 0000000..e69de29
diff --git a/services/bright/test/bright/oban_workers/create_s3_asset_test.exs b/services/bright/test/bright/oban_workers/create_s3_asset_test.exs
index 945145b..40151e6 100644
--- a/services/bright/test/bright/oban_workers/create_s3_asset_test.exs
+++ b/services/bright/test/bright/oban_workers/create_s3_asset_test.exs
@@ -8,7 +8,10 @@ defmodule Bright.ObanWorkers.CreateS3AssetTest do
}
alias Bright.Cache
alias Bright.Streams
- alias Bright.Streams.Stream
+ alias Bright.Streams.{
+ Stream,
+ Vod
+ }
# @tag :unit
# test "creating a new s3 asset (unit test)" do
@@ -24,27 +27,44 @@ defmodule Bright.ObanWorkers.CreateS3AssetTest do
# end
-
- @tag :integration
- test "sheduling upon vod creation" do
- example_video = "http://example.com/video.ts"
- stream_attrs = %{date: ~U[2024-12-28 03:31:00Z], title: "some title", notes: "some notes"}
- {:ok, %Stream{} = stream} = Streams.create_stream(stream_attrs)
- {:ok, _vod} = Streams.create_vod(%{stream_id: stream.id, origin_temp_input_url: example_video})
- assert_enqueued worker: ProcessVod, queue: :default
- Oban.drain_queue(queue: :default) # ProcessVod is what queues CreateS3Asset so we need to make it run
- assert_enqueued worker: CreateS3Asset, queue: :default
- end
+ describe "CreateS3Asset" do
+ import Bright.StreamsFixtures
+ @example_url "https://futureporn-b2.b-cdn.net/big_buck_bunny_720p_1mb.mp4"
- @tag :integration
- test "not scheduled when origin_temp_input_url is missing" do
- stream_attrs = %{date: ~U[2024-12-28 03:31:00Z], title: "some title", notes: "some notes"}
- {:ok, %Stream{} = stream} = Streams.create_stream(stream_attrs)
- {:ok, _vod} = Streams.create_vod(%{stream_id: stream.id})
+ @tag :integration
+ test "s3 asset creation" do
+ stream = stream_fixture()
+ vod = vod_fixture(%{s3_cdn_url: nil, stream_id: stream.id, origin_temp_input_url: @example_url})
+ {:ok, %Vod{} = vod} = perform_job(CreateS3Asset, %{vod_id: vod.id})
+ IO.puts "s3_cdn_url=#{vod.s3_cdn_url}"
+ assert Regex.match?(~r/^https:\/\/.*big_buck_bunny_720p_1mb\.mp4$/, vod.s3_cdn_url)
+ end
+
+
+ @tag :integration
+ test "sheduling upon vod creation" do
+ example_video = "http://example.com/video.ts"
+ stream_attrs = %{date: ~U[2024-12-28 03:31:00Z], title: "some title", notes: "some notes"}
+ {:ok, %Stream{} = stream} = Streams.create_stream(stream_attrs)
+ {:ok, _vod} = Streams.create_vod(%{stream_id: stream.id, origin_temp_input_url: example_video})
+ assert_enqueued worker: ProcessVod, queue: :default
+ Oban.drain_queue(queue: :default) # ProcessVod is what queues CreateS3Asset so we need to make it run
+ assert_enqueued worker: CreateS3Asset, queue: :default
+ end
+
+
+ @tag :integration
+ test "not scheduled when origin_temp_input_url is missing" do
+
+ stream_attrs = %{date: ~U[2024-12-28 03:31:00Z], title: "some title", notes: "some notes"}
+ {:ok, %Stream{} = stream} = Streams.create_stream(stream_attrs)
+ {:ok, _vod} = Streams.create_vod(%{stream_id: stream.id})
+
+ refute_enqueued worker: CreateS3Asset
+ end
- refute_enqueued worker: CreateS3Asset
end
# @tag :acceptance
diff --git a/services/bright/test/bright/oban_workers/create_torrent_test.exs b/services/bright/test/bright/oban_workers/create_torrent_test.exs
new file mode 100644
index 0000000..d16aa78
--- /dev/null
+++ b/services/bright/test/bright/oban_workers/create_torrent_test.exs
@@ -0,0 +1,42 @@
+
+defmodule Bright.CreateTorrentTest do
+ use Bright.DataCase
+ use Oban.Testing, repo: Bright.Repo
+
+ require Logger
+
+
+ alias Bright.ObanWorkers.{ProcessVod, CreateTorrent}
+ alias Bright.Streams
+ alias Bright.Streams.Stream
+
+
+ describe "CreateTorrent" do
+
+ import Bright.StreamsFixtures
+
+ @tag :integration
+ test "sheduling upon vod creation" do
+ example_video = "http://example.com/video.ts"
+ stream_attrs = %{date: ~U[2024-12-28 03:31:00Z], title: "some title", notes: "some notes"}
+ {:ok, %Stream{} = stream} = Streams.create_stream(stream_attrs)
+ {:ok, _vod} = Streams.create_vod(%{stream_id: stream.id, origin_temp_input_url: example_video})
+ assert_enqueued worker: ProcessVod, queue: :default
+ assert %{success: 1} = Oban.drain_queue(queue: :default) # ProcessVod is what queues CreateThumbnail so we need to make it run
+ assert_enqueued [worker: CreateTorrent, queue: :default], 1000
+ end
+
+
+ @tag :integration
+ test "not scheduled when origin_temp_input_url is missing" do
+ stream_attrs = %{date: ~U[2024-12-28 03:31:00Z], title: "some title", notes: "some notes"}
+ {:ok, %Stream{} = stream} = Streams.create_stream(stream_attrs)
+ {:ok, _vod} = Streams.create_vod(%{stream_id: stream.id})
+ refute_enqueued worker: CreateTorrent
+ end
+
+
+ end
+
+
+end
diff --git a/services/bright/test/bright/oban_workers/process_vod_test.exs b/services/bright/test/bright/oban_workers/process_vod_test.exs
index cd07b94..456cf41 100644
--- a/services/bright/test/bright/oban_workers/process_vod_test.exs
+++ b/services/bright/test/bright/oban_workers/process_vod_test.exs
@@ -45,7 +45,7 @@ defmodule Bright.ObanWorkers.ProcessVodTest do
stream = stream_fixture()
vod_fixture(%{s3_cdn_url: nil, stream_id: stream.id, origin_temp_input_url: @example_url})
assert_enqueued worker: ProcessVod, queue: :default
- assert %{success: 1} = Oban.drain_queue(queue: :default, with_safety: false) # ProcessVod is what queues CreateThumbnail so we need to make it run
+ assert %{success: 1} = Oban.drain_queue(queue: :default, with_safety: false) # ProcessVod is what queues CreateS3Asset so we need to make it run
assert_enqueued worker: CreateS3Asset, queue: :default
end
@@ -55,7 +55,7 @@ defmodule Bright.ObanWorkers.ProcessVodTest do
vod_fixture(%{playlist_url: nil, stream_id: stream.id, origin_temp_input_url: @example_url})
assert_enqueued worker: ProcessVod, queue: :default
- assert %{success: 1} = Oban.drain_queue(queue: :default, with_safety: false) # ProcessVod is what queues CreateThumbnail so we need to make it run
+ assert %{success: 1} = Oban.drain_queue(queue: :default, with_safety: false) # ProcessVod is what queues CreateHlsPlaylist so we need to make it run
assert_enqueued worker: CreateHlsPlaylist, queue: :default
end