You've already forked algora-tv
							
							
				mirror of
				https://github.com/algora-io/tv.git
				synced 2025-10-30 23:07:56 +02:00 
			
		
		
		
	improve stream status and termination handling (#124)
- only set duration when stream status is stopped - remove unused Library.maybe_update_*/2 - cleanup with statement - fix: video live status was always set to false instead of respecting toggle state
This commit is contained in:
		| @@ -303,52 +303,31 @@ defmodule Algora.Library do | ||||
|  | ||||
|   @type stream_status :: :live | :paused | :resumed | :stopped | ||||
|  | ||||
|   @spec maybe_update_duration(Ecto.Changeset.t(), stream_status) :: Ecto.Changeset.t() | ||||
|   defp maybe_update_duration(changeset, status) | ||||
|     when status in [:live, :resumed], do: changeset | ||||
|  | ||||
|   defp maybe_update_duration(changeset, _) do | ||||
|     with {:ok, duration} <- get_duration(changeset.data), | ||||
|          changeset <- changeset |> put_change(:duration, duration) do | ||||
|       changeset | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   @spec maybe_update_url(Ecto.Changeset.t(), stream_status) :: Ecto.Changeset.t() | ||||
|   defp maybe_update_url(changeset, :stopped) do | ||||
|     changeset |> put_change(:url, Video.url(:vod, changeset.data.uuid, changeset.data.filename)) | ||||
|   end | ||||
|  | ||||
|   defp maybe_update_url(changeset, _), do: changeset | ||||
|  | ||||
|   @spec toggle_stream_status(%Video{}, stream_status) :: :ok | ||||
|   def toggle_stream_status(%Video{} = video, status) do | ||||
|     video = get_video!(video.id) | ||||
|     user = Accounts.get_user!(video.user_id) | ||||
|  | ||||
|     is_live = status == :live or status == :resumed | ||||
|  | ||||
|     Repo.update_all(from(u in Accounts.User, where: u.id == ^video.user_id), | ||||
|       set: [is_live: is_live] | ||||
|     ) | ||||
|  | ||||
|     if status == :live do | ||||
|       Repo.update_all( | ||||
|         from(v in Video, | ||||
|           where: v.user_id == ^video.user_id and (v.id != ^video.id or not (^is_live)) | ||||
|         ), | ||||
|         set: [is_live: false] | ||||
|       ) | ||||
|     end | ||||
|     Repo.update_all( | ||||
|       from(v in Video, where: v.user_id == ^video.user_id and (v.id == ^video.id or v.is_live)), | ||||
|       set: [is_live: dynamic([v], v.id == ^video.id and ^is_live)] | ||||
|     ) | ||||
|  | ||||
|     video = get_video!(video.id) | ||||
|  | ||||
|     if not is_live do | ||||
|       video | ||||
|       |> change() | ||||
|       |> maybe_update_duration(status) | ||||
|       |> maybe_update_url(status) | ||||
|       |> Repo.update() | ||||
|     if status == :stopped do | ||||
|       with {:ok, duration} <- get_duration(video) do | ||||
|         video | ||||
|         |> change() | ||||
|         |> put_change(:duration, duration) | ||||
|         |> put_change(:url, Video.url(:vod, video.uuid, video.filename)) | ||||
|         |> Repo.update() | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     msg = | ||||
|   | ||||
| @@ -49,6 +49,7 @@ defmodule Algora.Pipeline.ClientHandler do | ||||
|   @impl true | ||||
|   def handle_delete_stream(state) do | ||||
|     if state.source_pid != nil, do: send(state.source_pid, :delete_stream) | ||||
|     send(state.pipeline, :delete_stream) | ||||
|     state | ||||
|   end | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user