diff --git a/app/controllers/concerns/bbb_server.rb b/app/controllers/concerns/bbb_server.rb
index 39a0f086..d38d52da 100644
--- a/app/controllers/concerns/bbb_server.rb
+++ b/app/controllers/concerns/bbb_server.rb
@@ -108,6 +108,16 @@ module BbbServer
bbb_server.send_api_request("updateRecordings", meta)
end
+ # Update a recording from a room
+ def publish_recording(record_id)
+ bbb_server.publish_recordings(record_id, true)
+ end
+
+ # Update a recording from a room
+ def unpublish_recording(record_id)
+ bbb_server.publish_recordings(record_id, false)
+ end
+
# Deletes a recording from a room.
def delete_recording(record_id)
bbb_server.delete_recordings(record_id)
diff --git a/app/controllers/recordings_controller.rb b/app/controllers/recordings_controller.rb
index 93912b46..f3e200ba 100644
--- a/app/controllers/recordings_controller.rb
+++ b/app/controllers/recordings_controller.rb
@@ -28,6 +28,12 @@ class RecordingsController < ApplicationController
"meta_#{META_LISTED}" => (params[:state] == "public"),
}
+ if params[:state] == "inaccessible"
+ unpublish_recording(params[:record_id])
+ else
+ publish_recording(params[:record_id])
+ end
+
res = update_recording(params[:record_id], meta)
# Redirects to the page that made the initial request
diff --git a/app/views/admins/components/_server_recording_row.html.erb b/app/views/admins/components/_server_recording_row.html.erb
index 5f82cfbf..6e2362f3 100644
--- a/app/views/admins/components/_server_recording_row.html.erb
+++ b/app/views/admins/components/_server_recording_row.html.erb
@@ -42,6 +42,8 @@
<% if recording[:metadata][:"gl-listed"] == "true" %>
<%= t("recording.visibility.public") %>
+ <% elsif recording[:state] == "unpublished" %>
+ <%= t("recording.visibility.inaccessible") %>
<% else %>
<%= t("recording.visibility.unlisted") %>
<% end %>
@@ -52,13 +54,18 @@
<%= button_to update_recording_path(meetingID: recording[:meetingID], record_id: recording[:recordID], state: "unlisted"), class: "dropdown-item", "data-disable": "" do %>
<%= t("recording.visibility.unlisted") %>
<% end %>
+ <%= button_to update_recording_path(meetingID: recording[:meetingID], record_id: recording[:recordID], state: "inaccessible"), class: "dropdown-item", "data-disable": "" do %>
+ <%= t("recording.visibility.inaccessible") %>
+ <% end %>
- <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %>
- <% sorted_formats.each do |p| %>
- <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %>
+ <% unless recording[:state] == "unpublished" %>
+ <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %>
+ <% sorted_formats.each do |p| %>
+ <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %>
+ <% end %>
<% end %>
diff --git a/app/views/shared/components/_recording_row.html.erb b/app/views/shared/components/_recording_row.html.erb
index 9efe062a..bd394c66 100644
--- a/app/views/shared/components/_recording_row.html.erb
+++ b/app/views/shared/components/_recording_row.html.erb
@@ -32,10 +32,12 @@
<% if recording_thumbnails? %>
- <% p = recording[:playbacks].find do |p| p.key?(:preview) end %>
- <% if p %>
- <% safe_recording_images(p[:preview][:images][:image]).each do |img| %>
- <%= image_tag(img[:content].strip, class: "thumbnail px-2") %>
+ <% if recording[:state] != "unpublished" %>
+ <% p = recording[:playbacks].find do |p| p.key?(:preview) end %>
+ <% if p %>
+ <% safe_recording_images(p[:preview][:images][:image]).each do |img| %>
+ <%= image_tag(img[:content].strip, class: "thumbnail px-2") %>
+ <% end %>
<% end %>
<% end %>
@@ -50,6 +52,8 @@
<% if recording[:metadata][:"gl-listed"] == "true" %>
<%= t("recording.visibility.public") %>
+ <% elsif recording[:state] == "unpublished" %>
+ <%= t("recording.visibility.inaccessible") %>
<% else %>
<%= t("recording.visibility.unlisted") %>
<% end %>
@@ -60,13 +64,18 @@
<%= button_to update_recording_path(meetingID: recording[:meetingID], record_id: recording[:recordID], state: "unlisted"), class: "dropdown-item", "data-disable": "" do %>
<%= t("recording.visibility.unlisted") %>
<% end %>
+ <%= button_to update_recording_path(meetingID: recording[:meetingID], record_id: recording[:recordID], state: "inaccessible"), class: "dropdown-item", "data-disable": "" do %>
+ <%= t("recording.visibility.inaccessible") %>
+ <% end %>
- <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %>
- <% sorted_formats.each do |p| %>
- <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %>
+ <% unless recording[:state] == "unpublished" %>
+ <% sorted_formats = recording[:playbacks].sort_by! { |p| p[:type] } %>
+ <% sorted_formats.each do |p| %>
+ <%= link_to t("recording.format.#{p[:type]}"), p[:url], class: "btn btn-sm btn-primary", target: "_blank" %>
+ <% end %>
<% end %>
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 4fa9b725..f305cb0e 100755
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -510,6 +510,7 @@ en:
visibility: Visibility
formats: Formats
visibility:
+ inaccessible: Inaccessible
public: Public
unlisted: Unlisted
format:
diff --git a/spec/concerns/bbb_server_spec.rb b/spec/concerns/bbb_server_spec.rb
index 6d3f3364..b6cb2375 100644
--- a/spec/concerns/bbb_server_spec.rb
+++ b/spec/concerns/bbb_server_spec.rb
@@ -82,6 +82,24 @@ describe BbbServer do
end
context "#recordings" do
+ it "publishes a recording" do
+ allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:publish_recordings).and_return(
+ returncode: true, published: true
+ )
+
+ expect(publish_recording(Faker::IDNumber.valid))
+ .to contain_exactly([:returncode, true], [:published, true])
+ end
+
+ it "unpublishes a recording" do
+ allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:publish_recordings).and_return(
+ returncode: true, published: false
+ )
+
+ expect(unpublish_recording(Faker::IDNumber.valid))
+ .to contain_exactly([:returncode, true], [:published, false])
+ end
+
it "deletes the recording" do
allow_any_instance_of(BigBlueButton::BigBlueButtonApi).to receive(:delete_recordings).and_return(
returncode: true, deleted: true