diff --git a/.env.sample b/.env.sample index 92c84ee..c506d1a 100644 --- a/.env.sample +++ b/.env.sample @@ -16,9 +16,10 @@ REDIS_URL= # Required for Zoom.us integration ZOOM_API_KEY= ZOOM_API_SECRET= +ZOOM_ACCOUNT_NUMBER= ZOOM_PRO_USERS_LIMIT= # defaults to 3 ZOOM_USER_TYPE= # 'pro' / 'basic' -ZOOM_ENABLE_RECORDINGS=0 # 0 / 1 +ZOOM_ENABLE_RECORDINGS= # true / false (default: false) # Token for webhooks authorization ZOOM_VERIFICATION_TOKEN= diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index aec98e3..b69b710 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -20,6 +20,7 @@ class Admin::AccountsController < Admin::ApplicationController def show @videos = filtered_account_videos.order(created_at: :desc, project_id: :desc).paginate(page: params[:page]) + @broadcasts = account_broadcasts.order(created_at: :desc, project_id: :desc).paginate(page: params[:page]) end def edit @@ -70,4 +71,8 @@ class Admin::AccountsController < Admin::ApplicationController @account.videos end end + + def account_broadcasts + @account.broadcasts + end end diff --git a/app/controllers/admin/broadcasts_controller.rb b/app/controllers/admin/broadcasts_controller.rb new file mode 100644 index 0000000..8e37c18 --- /dev/null +++ b/app/controllers/admin/broadcasts_controller.rb @@ -0,0 +1,24 @@ +class Admin::BroadcastsController < Admin::ApplicationController + before_action :set_broadcast, only: [:edit, :update] + + def edit + end + + def update + if @broadcast.update(broadcast_update_params) + redirect_to [:admin, @broadcast.project.account], notice: t(".notice") + else + render :edit + end + end + + private + + def set_broadcast + @broadcast = authorize policy_scope(Broadcast).find(params[:id]) + end + + def broadcast_update_params + params.require(:broadcast).permit(:stream_url_override, :stream_key_override, :director_mode_video_embed) + end +end diff --git a/app/controllers/broadcast_recordings_controller.rb b/app/controllers/broadcast_recordings_controller.rb new file mode 100644 index 0000000..477edda --- /dev/null +++ b/app/controllers/broadcast_recordings_controller.rb @@ -0,0 +1,26 @@ +class BroadcastRecordingsController < ApplicationController + layout "project" + + before_action :set_project + before_action :set_broadcast + before_action :set_recording + + def destroy + @recording.update(hidden: true) + @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) + end + + private + + def set_project + @project = policy_scope(Project).find(params[:project_id]) + end + + def set_broadcast + @broadcast = authorize policy_scope(@project.broadcasts).find(params[:broadcast_id]) + end + + def set_recording + @recording = authorize policy_scope(@broadcast.broadcast_recordings).find(params[:id]) + end +end diff --git a/app/controllers/broadcasts_controller.rb b/app/controllers/broadcasts_controller.rb index 072498b..22d59bc 100644 --- a/app/controllers/broadcasts_controller.rb +++ b/app/controllers/broadcasts_controller.rb @@ -27,7 +27,7 @@ class BroadcastsController < ApplicationController def show @conference_url = url_for [@broadcast.project, @broadcast, :zoom_meeting] - @recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page]) + @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) @files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page]) render layout: 'application' end diff --git a/app/controllers/public/broadcasts_controller.rb b/app/controllers/public/broadcasts_controller.rb index bad8a1c..aca8f57 100644 --- a/app/controllers/public/broadcasts_controller.rb +++ b/app/controllers/public/broadcasts_controller.rb @@ -5,7 +5,7 @@ class Public::BroadcastsController < Public::BaseController def show @conference_url = broadcast_zoom_meeting_url(@broadcast.token) @multi_view_broadcasts = multi_view_broadcasts - @recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page]) + @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) @files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page]) render 'broadcasts/show' diff --git a/app/controllers/stream_notifications_controller.rb b/app/controllers/stream_notifications_controller.rb index 76a77c8..ad4a7cb 100644 --- a/app/controllers/stream_notifications_controller.rb +++ b/app/controllers/stream_notifications_controller.rb @@ -35,7 +35,7 @@ class StreamNotificationsController < ApplicationController duration = notification.dig(:data, :duration) recording = @broadcast.broadcast_recordings.create!(asset_uid: asset_uid, asset_playback_uid: playback_uid, file_name: file_name, duration: duration) - recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page]) + recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank") message = "Your recent live stream has been recorded and is available for download here: #{link}" diff --git a/app/models/account.rb b/app/models/account.rb index de3a812..6c89d62 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -5,6 +5,7 @@ class Account < ApplicationRecord has_many :users, through: :account_auths has_many :projects, dependent: :destroy has_many :videos, through: :projects + has_many :broadcasts, through: :projects has_many :contract_templates, through: :projects validates :name, presence: true diff --git a/app/models/broadcast.rb b/app/models/broadcast.rb index d1f6943..349ea65 100644 --- a/app/models/broadcast.rb +++ b/app/models/broadcast.rb @@ -35,7 +35,11 @@ class Broadcast < ApplicationRecord end def stream_server_url - ENV['MUX_BROADCAST_SERVER_URL'] + stream_url_override.presence || ENV["MUX_BROADCAST_SERVER_URL"] + end + + def stream_server_key + stream_key_override.presence || stream_key end def zoom_meeting_url diff --git a/app/models/broadcast_recording.rb b/app/models/broadcast_recording.rb index 6ad23bd..a7add7d 100644 --- a/app/models/broadcast_recording.rb +++ b/app/models/broadcast_recording.rb @@ -5,6 +5,8 @@ class BroadcastRecording < ApplicationRecord validates :asset_uid, uniqueness: true + scope :visible, -> { where(hidden: false) } + def download_url "https://stream.mux.com/#{asset_playback_uid}/#{file_name}?download=#{download_file_name}" end diff --git a/app/policies/broadcast_recording_policy.rb b/app/policies/broadcast_recording_policy.rb new file mode 100644 index 0000000..7423f2d --- /dev/null +++ b/app/policies/broadcast_recording_policy.rb @@ -0,0 +1,9 @@ +class BroadcastRecordingPolicy < ApplicationPolicy + def destroy? + if user.nil? || user.user.nil? + return false + end + + user.manager? || user.account_manager? + end +end diff --git a/app/views/admin/accounts/_broadcast.html.erb b/app/views/admin/accounts/_broadcast.html.erb new file mode 100644 index 0000000..3d4cc59 --- /dev/null +++ b/app/views/admin/accounts/_broadcast.html.erb @@ -0,0 +1,13 @@ +
| Project | +Name | ++ |
|---|
Recordings will appear here
') +<% end %> +$("#broadcast_recordings").html("<%= j render(partial: 'broadcasts/broadcast_recordings', locals: { recordings: @recordings, broadcast: @broadcast }) %>"); \ No newline at end of file diff --git a/app/views/broadcasts/_broadcast.html.erb b/app/views/broadcasts/_broadcast.html.erb index 8cfb573..c40b09c 100644 --- a/app/views/broadcasts/_broadcast.html.erb +++ b/app/views/broadcasts/_broadcast.html.erb @@ -16,8 +16,8 @@