From 95a14ab2f6a36ada02210dd150869517694b2513 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Mon, 31 Aug 2020 18:19:00 +0200 Subject: [PATCH] Upstream sync --- .../channels/broadcasts.coffee.erb | 3 + .../javascripts/switch_director_mode.js | 4 + app/assets/stylesheets/application.scss | 34 +++ app/channels/broadcasts_channel.rb | 2 + app/controllers/api/user_token_controller.rb | 1 + ...roadcast_recording_starrings_controller.rb | 34 +++ .../broadcast_recordings_controller.rb | 18 +- app/controllers/broadcasts_controller.rb | 3 +- .../public/broadcasts_controller.rb | 2 +- app/models/broadcast_recording.rb | 21 +- app/policies/broadcast_recording_policy.rb | 14 +- .../create.js.erb | 1 + .../_edit_broadcast_recording_modal.html.erb | 24 ++ .../_refresh_recordings_list.js.erb | 11 + app/views/broadcast_recordings/destroy.js.erb | 7 +- app/views/broadcast_recordings/edit.js.erb | 6 + app/views/broadcast_recordings/update.js.erb | 1 + .../_broadcast_recording_nav.html.erb | 4 +- .../broadcasts/_broadcast_recordings.html.erb | 31 ++- .../broadcasts/_broadcast_status.html.erb | 26 +- app/views/broadcasts/_live_take.html.erb | 12 + app/views/broadcasts/_video.html.erb | 2 +- app/views/broadcasts/show.html.erb | 236 ++++++++---------- config/initializers/session_cookie.rb | 1 + config/locales/en.yml | 3 + config/routes.rb | 4 +- ...and_description_to_broadcast_recordings.rb | 6 + ...171649_add_star_to_broadcast_recordings.rb | 5 + db/structure.sql | 23 +- spec/channels/broadcasts_channel_spec.rb | 2 + ...ast_recording_starrings_controller_spec.rb | 48 ++++ .../broadcast_recordings_controller_spec.rb | 52 +++- .../controllers/broadcasts_controller_spec.rb | 41 +-- .../public/broadcasts_controller_spec.rb | 10 +- spec/factories/broadcast_recordings.rb | 4 + .../features/user_managing_broadcasts_spec.rb | 151 +---------- spec/models/broadcast_recording_spec.rb | 15 +- 37 files changed, 487 insertions(+), 375 deletions(-) create mode 100644 app/assets/javascripts/switch_director_mode.js create mode 100644 app/controllers/broadcast_recording_starrings_controller.rb create mode 100644 app/views/broadcast_recording_starrings/create.js.erb create mode 100644 app/views/broadcast_recordings/_edit_broadcast_recording_modal.html.erb create mode 100644 app/views/broadcast_recordings/_refresh_recordings_list.js.erb create mode 100644 app/views/broadcast_recordings/edit.js.erb create mode 100644 app/views/broadcast_recordings/update.js.erb create mode 100644 app/views/broadcasts/_live_take.html.erb create mode 100644 config/initializers/session_cookie.rb create mode 100644 db/migrate/20200820082501_add_name_and_description_to_broadcast_recordings.rb create mode 100644 db/migrate/20200824171649_add_star_to_broadcast_recordings.rb create mode 100644 spec/controllers/broadcast_recording_starrings_controller_spec.rb diff --git a/app/assets/javascripts/channels/broadcasts.coffee.erb b/app/assets/javascripts/channels/broadcasts.coffee.erb index b2e1f4a..9765bc2 100644 --- a/app/assets/javascripts/channels/broadcasts.coffee.erb +++ b/app/assets/javascripts/channels/broadcasts.coffee.erb @@ -24,6 +24,8 @@ $(document).on "turbolinks:load", -> stream_selected = $("#broadcast_video").data('videoType') == 'stream'; if data.streamer_status == 'recording' && data.status == 'active' && stream_selected $("#broadcast_video").html data.video_content + $("#live_take").html data.live_take_content + new (Clappr.Player)( <%= "baseUrl: 'http://cdn.clappr.io/latest'," if Rails.env.test? %> parentId: '#broadcast_video' @@ -35,6 +37,7 @@ $(document).on "turbolinks:load", -> hlsMinimumDvrSize: 1) if data.streamer_status == "idle" && data.status == "idle" $("#broadcast_video").html data.video_content + $("#live_take").html data.live_take_content showBroadcastRecordings: (data) -> $(".flash-message").html data.flash_content diff --git a/app/assets/javascripts/switch_director_mode.js b/app/assets/javascripts/switch_director_mode.js new file mode 100644 index 0000000..76a88f6 --- /dev/null +++ b/app/assets/javascripts/switch_director_mode.js @@ -0,0 +1,4 @@ +$(document).on("click", "#director_mode_switch", function() { + // JQuery click event trigger was not working. + document.getElementById("director_mode_link").click(); +}); diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index b14620f..87ffb26 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -412,6 +412,16 @@ a[data-behavior=seekable-timecode] { background-color: rgba($black, 0.05); } +// Black background +.bg-black { + background-color: $black; +} + +// White background +.bg-white { + background-color: $white; +} + // Custom width .w-65 { width: 65% !important; @@ -422,8 +432,32 @@ a[data-behavior=seekable-timecode] { max-height: 30rem; } +// Max-width 75% +.max-w-75 { + max-width: 75%; +} + // Fix height and width .fix-h-and-w { width: 308px; height:308px; } + +// Dropdown shown state overrride +.override-dropdown-show-state { + color: $white !important; + background-color: $black !important; + border-color: transparent !important; +} + +// Override custom switch color +.override-custom-control-label::before { + background-color: #000000; +} + +// Override nav tab design +.override-nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active { + background: transparent; + border-color: transparent; + border-bottom: 3px solid #ff0000; +} diff --git a/app/channels/broadcasts_channel.rb b/app/channels/broadcasts_channel.rb index ad96756..5109d93 100644 --- a/app/channels/broadcasts_channel.rb +++ b/app/channels/broadcasts_channel.rb @@ -11,6 +11,7 @@ class BroadcastsChannel < ApplicationCable::Channel def self.broadcast_stream_updates(broadcast) status_content = ApplicationController.render partial: "broadcasts/broadcast_status", locals: { broadcast: broadcast } video_content = ApplicationController.render partial: "broadcasts/video", locals: { broadcast: broadcast } + live_take = ApplicationController.render partial: "broadcasts/live_take", locals: { broadcast: broadcast } broadcast_to broadcast, { event: :broadcast_stream_update, @@ -18,6 +19,7 @@ class BroadcastsChannel < ApplicationCable::Channel playback_url: broadcast.stream_playback_url, full_live_stream_playback_url: broadcast.full_live_stream_playback_url, video_content: video_content, + live_take_content: live_take, status_content: status_content, streamer_status: broadcast.streamer_status } diff --git a/app/controllers/api/user_token_controller.rb b/app/controllers/api/user_token_controller.rb index cae81f9..2f64c9e 100644 --- a/app/controllers/api/user_token_controller.rb +++ b/app/controllers/api/user_token_controller.rb @@ -4,6 +4,7 @@ require './lib/knock_monkeypatch' class Api::UserTokenController < Knock::AuthTokenController include Oath::ControllerHelpers + include RememberMe::Controller skip_before_action :verify_authenticity_token before_action :sign_in_user diff --git a/app/controllers/broadcast_recording_starrings_controller.rb b/app/controllers/broadcast_recording_starrings_controller.rb new file mode 100644 index 0000000..226ab60 --- /dev/null +++ b/app/controllers/broadcast_recording_starrings_controller.rb @@ -0,0 +1,34 @@ +class BroadcastRecordingStarringsController < ApplicationController + layout "project" + + before_action :set_project + before_action :set_broadcast + before_action :set_recording + + def create + @recording.toggle_star + set_recordings + end + + private + + def broadcast_recording_params + params.require(:broadcast_recording).permit(:name, :description) + end + + 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[:broadcast_recording_id]) + end + + def set_recordings + @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) + end +end diff --git a/app/controllers/broadcast_recordings_controller.rb b/app/controllers/broadcast_recordings_controller.rb index 477edda..86d09f0 100644 --- a/app/controllers/broadcast_recordings_controller.rb +++ b/app/controllers/broadcast_recordings_controller.rb @@ -5,13 +5,25 @@ class BroadcastRecordingsController < ApplicationController before_action :set_broadcast before_action :set_recording + def edit + end + + def update + @recording.update(broadcast_recording_params) + set_recordings + end + def destroy @recording.update(hidden: true) - @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) + set_recordings end private + def broadcast_recording_params + params.require(:broadcast_recording).permit(:name, :description) + end + def set_project @project = policy_scope(Project).find(params[:project_id]) end @@ -23,4 +35,8 @@ class BroadcastRecordingsController < ApplicationController def set_recording @recording = authorize policy_scope(@broadcast.broadcast_recordings).find(params[:id]) end + + def set_recordings + @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) + end end diff --git a/app/controllers/broadcasts_controller.rb b/app/controllers/broadcasts_controller.rb index e6249cc..1e8839d 100644 --- a/app/controllers/broadcasts_controller.rb +++ b/app/controllers/broadcasts_controller.rb @@ -32,6 +32,7 @@ class BroadcastsController < ApplicationController @conference_url = conference_url_for(@broadcast) @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 @@ -113,7 +114,7 @@ class BroadcastsController < ApplicationController end def conference_url_for(broadcast) - broadcast.video_conference_url_override || url_for([broadcast.project, broadcast, :zoom_meeting]) + broadcast.video_conference_url_override.presence || url_for([broadcast.project, broadcast, :zoom_meeting]) end def log_create_analytics diff --git a/app/controllers/public/broadcasts_controller.rb b/app/controllers/public/broadcasts_controller.rb index 47c28e5..84ecd35 100644 --- a/app/controllers/public/broadcasts_controller.rb +++ b/app/controllers/public/broadcasts_controller.rb @@ -44,7 +44,7 @@ class Public::BroadcastsController < Public::BaseController end def conference_url_for(broadcast) - broadcast.video_conference_url_override || broadcast_zoom_meeting_url(broadcast.token) + broadcast.video_conference_url_override.presence || broadcast_zoom_meeting_url(broadcast.token) end class MultiViewBroadcast diff --git a/app/models/broadcast_recording.rb b/app/models/broadcast_recording.rb index a7add7d..167a647 100644 --- a/app/models/broadcast_recording.rb +++ b/app/models/broadcast_recording.rb @@ -7,8 +7,10 @@ class BroadcastRecording < ApplicationRecord scope :visible, -> { where(hidden: false) } + before_save :set_title_and_description + def download_url - "https://stream.mux.com/#{asset_playback_uid}/#{file_name}?download=#{download_file_name}" + "https://stream.mux.com/#{asset_playback_uid}/#{file_name}?download=#{name}" end def playback_url @@ -16,6 +18,21 @@ class BroadcastRecording < ApplicationRecord end def download_file_name - "#{broadcast_name}_Date_#{created_at.in_time_zone(broadcast.shoot_location_time_zone).strftime("%Y-%m-%d")}_Time_#{created_at.in_time_zone(broadcast.shoot_location_time_zone).strftime("%T")}".parameterize + "#{broadcast_name}_Date_#{Time.now.in_time_zone(broadcast.shoot_location_time_zone).strftime("%Y-%m-%d")}_Time_#{Time.now.in_time_zone(broadcast.shoot_location_time_zone).strftime("%T")}".parameterize + end + + def toggle_star + toggle! :starred + end + + def thumbnail_url(width = 300) + "https://image.mux.com/#{asset_playback_uid}/thumbnail.jpg?width=#{width}" + end + + private + + def set_title_and_description + self.name ||= download_file_name + self.description ||= "No description provided for this recording." end end diff --git a/app/policies/broadcast_recording_policy.rb b/app/policies/broadcast_recording_policy.rb index 7423f2d..6a94c84 100644 --- a/app/policies/broadcast_recording_policy.rb +++ b/app/policies/broadcast_recording_policy.rb @@ -1,9 +1,21 @@ class BroadcastRecordingPolicy < ApplicationPolicy + def create? + true + end + def destroy? if user.nil? || user.user.nil? return false end - + user.manager? || user.account_manager? end + + def edit? + destroy? + end + + def update? + edit? + end end diff --git a/app/views/broadcast_recording_starrings/create.js.erb b/app/views/broadcast_recording_starrings/create.js.erb new file mode 100644 index 0000000..04272c7 --- /dev/null +++ b/app/views/broadcast_recording_starrings/create.js.erb @@ -0,0 +1 @@ +$("#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/broadcast_recordings/_edit_broadcast_recording_modal.html.erb b/app/views/broadcast_recordings/_edit_broadcast_recording_modal.html.erb new file mode 100644 index 0000000..2228e8a --- /dev/null +++ b/app/views/broadcast_recordings/_edit_broadcast_recording_modal.html.erb @@ -0,0 +1,24 @@ +<%= content_tag :div, class: "modal modal-right", id: "edit_broadcast_recording_modal", aria: { labelledby: "modalLabel", hidden: true }, role: "dialog", tabindex: -1 do %> + +<% end %> diff --git a/app/views/broadcast_recordings/_refresh_recordings_list.js.erb b/app/views/broadcast_recordings/_refresh_recordings_list.js.erb new file mode 100644 index 0000000..890d685 --- /dev/null +++ b/app/views/broadcast_recordings/_refresh_recordings_list.js.erb @@ -0,0 +1,11 @@ +$('[data-id="<%= dom_id(@recording) %>"]').remove(); +<% if @recordings.empty? %> + $("#broadcast_recordings_nav").append('') +<% end %> +$("#broadcast_recordings").html("<%= j render(partial: 'broadcasts/broadcast_recordings', locals: { recordings: @recordings, broadcast: @broadcast }) %>"); + +// Close and remove the modal +$("#edit_broadcast_recording_modal").on("hidden.bs.modal", function (e) { + $("#edit_broadcast_recording_modal").remove(); +}); +$("#edit_broadcast_recording_modal").modal("hide"); diff --git a/app/views/broadcast_recordings/destroy.js.erb b/app/views/broadcast_recordings/destroy.js.erb index 0359114..de2425d 100644 --- a/app/views/broadcast_recordings/destroy.js.erb +++ b/app/views/broadcast_recordings/destroy.js.erb @@ -1,6 +1 @@ -var dom_id = "<%= dom_id(@recording) %>" -$('[data-id="' + dom_id + '"]').remove(); -<% if @recordings.empty? %> - $("#broadcast_recordings_nav").append('') -<% end %> -$("#broadcast_recordings").html("<%= j render(partial: 'broadcasts/broadcast_recordings', locals: { recordings: @recordings, broadcast: @broadcast }) %>"); \ No newline at end of file +<%= render("broadcast_recordings/refresh_recordings_list") %> \ No newline at end of file diff --git a/app/views/broadcast_recordings/edit.js.erb b/app/views/broadcast_recordings/edit.js.erb new file mode 100644 index 0000000..0e5c0c1 --- /dev/null +++ b/app/views/broadcast_recordings/edit.js.erb @@ -0,0 +1,6 @@ +<% # Remove the modal if it already exists %> +$("#edit_broadcast_recording_modal").remove(); + +<% # Create and show the modal %> +$("body").append("<%= j render(partial: 'edit_broadcast_recording_modal', locals: { project: @project, broadcast: @broadcast, recording: @recording }) %>"); +$("#edit_broadcast_recording_modal").modal("toggle"); diff --git a/app/views/broadcast_recordings/update.js.erb b/app/views/broadcast_recordings/update.js.erb new file mode 100644 index 0000000..f7f8a97 --- /dev/null +++ b/app/views/broadcast_recordings/update.js.erb @@ -0,0 +1 @@ +<%= render("broadcast_recordings/refresh_recordings_list") %> diff --git a/app/views/broadcasts/_broadcast_recording_nav.html.erb b/app/views/broadcasts/_broadcast_recording_nav.html.erb index bf80413..f8372b2 100644 --- a/app/views/broadcasts/_broadcast_recording_nav.html.erb +++ b/app/views/broadcasts/_broadcast_recording_nav.html.erb @@ -1,3 +1 @@ -<%= link_to broadcast_recording.download_file_name, "javascript:void(0);", class: "dropdown-item", data: { behavior: "play_recording", playback_url: broadcast_recording.playback_url, id: dom_id(broadcast_recording) } %> - - +<%= link_to broadcast_recording.name, "javascript:void(0);", class: "dropdown-item", data: { behavior: "play_recording", playback_url: broadcast_recording.playback_url, id: dom_id(broadcast_recording) } %> diff --git a/app/views/broadcasts/_broadcast_recordings.html.erb b/app/views/broadcasts/_broadcast_recordings.html.erb index 73f6f91..c6b8f89 100644 --- a/app/views/broadcasts/_broadcast_recordings.html.erb +++ b/app/views/broadcasts/_broadcast_recordings.html.erb @@ -1,18 +1,29 @@ <% if recordings.present? %> -

Click below to download the recordings of the live stream.

- +
<%= will_paginate(recordings, params: {controller: "broadcasts", action: "show", project_id: broadcast.project_id, id: broadcast.id, page: params[:page], active_tab: 'recordings'}) %>
<% else %> -

Recording of the live stream will appear here.

+

Recording of the live stream will appear here.

<% end %> diff --git a/app/views/broadcasts/_broadcast_status.html.erb b/app/views/broadcasts/_broadcast_status.html.erb index 2c94608..9e34bfa 100644 --- a/app/views/broadcasts/_broadcast_status.html.erb +++ b/app/views/broadcasts/_broadcast_status.html.erb @@ -1,21 +1,13 @@ <% if broadcast.streamer_connected? || (broadcast.streamer_recording? && !broadcast.active?) %> -
- <%= fa_icon "info-circle" %> - Live stream has connected successfully and will be available soon. -
+

Live stream has connected successfully and will be available soon.

+
Connected
<% elsif broadcast.streamer_recording? && broadcast.active? %> -
- <%= fa_icon "success" %> - Live stream has begun, click play to watch it. -
+

Live stream has begun, click play to watch it.

+
Live
<% elsif broadcast.streamer_disconnected? %> -
- <%= fa_icon "warning" %> - Live stream got disconnected. -
+

Live stream got disconnected.

+
Disconnected
<% elsif (broadcast.idle? && broadcast.streamer_idle?) || (broadcast.created? && broadcast.streamer_idle?) %> -
- <%= fa_icon "info-circle" %> - Live stream is waiting to begin. -
-<% end %> \ No newline at end of file +

Live stream is waiting to begin.

+
Idle
+<% end %> diff --git a/app/views/broadcasts/_live_take.html.erb b/app/views/broadcasts/_live_take.html.erb new file mode 100644 index 0000000..97a42b8 --- /dev/null +++ b/app/views/broadcasts/_live_take.html.erb @@ -0,0 +1,12 @@ +
+
+
+
<%= broadcast.name %>
+ Created - <%= time_ago_in_words(broadcast.created_at) + " ago" %> +
+
+ <%= render partial: 'broadcasts/broadcast_status', locals: { broadcast: broadcast } %> +
+
+
+
\ No newline at end of file diff --git a/app/views/broadcasts/_video.html.erb b/app/views/broadcasts/_video.html.erb index e0e9ad2..e518594 100644 --- a/app/views/broadcasts/_video.html.erb +++ b/app/views/broadcasts/_video.html.erb @@ -9,7 +9,7 @@ - diff --git a/app/views/broadcasts/show.html.erb b/app/views/broadcasts/show.html.erb index a63ac4f..4b9707f 100644 --- a/app/views/broadcasts/show.html.erb +++ b/app/views/broadcasts/show.html.erb @@ -14,159 +14,135 @@ <% end %> <% content_for :header do %> -
-
-
- <%= product_wordmark(:direct_me, class: 'navbar-brand') %> -
-
-
+
<% end %> -
-
-
-
-
-

<%= @broadcast.name %>

-
+ Video player will appear here when the stream becomes available.