fix: Breakout rooms show incorrect presentation filename (#20947)
* Pass arbitrary filename * Use shortname as presName in breakout room * Show selected filename in the room
This commit is contained in:
parent
1484f516d0
commit
6f08344a70
@ -20,9 +20,10 @@ object BreakoutModel {
|
|||||||
captureSlidesFilename: String,
|
captureSlidesFilename: String,
|
||||||
allPages: Boolean,
|
allPages: Boolean,
|
||||||
presId: String,
|
presId: String,
|
||||||
|
sourcePresentationFilename: String,
|
||||||
): BreakoutRoom2x = {
|
): BreakoutRoom2x = {
|
||||||
new BreakoutRoom2x(id, externalId, name, parentId, sequence, shortName, isDefaultName, freeJoin, voiceConf, assignedUsers, Vector(), Vector(), None, false,
|
new BreakoutRoom2x(id, externalId, name, parentId, sequence, shortName, isDefaultName, freeJoin, voiceConf, assignedUsers, Vector(), Vector(), None, false,
|
||||||
captureNotes, captureSlides, captureNotesFilename, captureSlidesFilename, allPages, presId)
|
captureNotes, captureSlides, captureNotesFilename, captureSlidesFilename, allPages, presId, sourcePresentationFilename)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ trait CreateBreakoutRoomsCmdMsgHdlr extends RightsManagementTrait {
|
|||||||
val breakout = BreakoutModel.create(parentId, internalId, externalId, room.name, room.sequence, room.shortName,
|
val breakout = BreakoutModel.create(parentId, internalId, externalId, room.name, room.sequence, room.shortName,
|
||||||
room.isDefaultName, room.freeJoin, voiceConf, room.users, msg.body.captureNotes,
|
room.isDefaultName, room.freeJoin, voiceConf, room.users, msg.body.captureNotes,
|
||||||
msg.body.captureSlides, room.captureNotesFilename, room.captureSlidesFilename,
|
msg.body.captureSlides, room.captureNotesFilename, room.captureSlidesFilename,
|
||||||
room.allPages, roomPresId)
|
room.allPages, roomPresId, room.sourcePresentationFilename)
|
||||||
|
|
||||||
rooms = rooms + (breakout.id -> breakout)
|
rooms = rooms + (breakout.id -> breakout)
|
||||||
}
|
}
|
||||||
@ -78,6 +78,7 @@ trait CreateBreakoutRoomsCmdMsgHdlr extends RightsManagementTrait {
|
|||||||
liveMeeting.props.password.viewerPass,
|
liveMeeting.props.password.viewerPass,
|
||||||
breakout.presId,
|
breakout.presId,
|
||||||
roomSlides,
|
roomSlides,
|
||||||
|
breakout.sourcePresentationFilename,
|
||||||
msg.body.record,
|
msg.body.record,
|
||||||
liveMeeting.props.breakoutProps.privateChatEnabled,
|
liveMeeting.props.breakoutProps.privateChatEnabled,
|
||||||
breakout.captureNotes,
|
breakout.captureNotes,
|
||||||
|
@ -1,26 +1,27 @@
|
|||||||
package org.bigbluebutton.core.domain
|
package org.bigbluebutton.core.domain
|
||||||
|
|
||||||
case class BreakoutRoom2x(
|
case class BreakoutRoom2x(
|
||||||
id: String,
|
id: String,
|
||||||
externalId: String,
|
externalId: String,
|
||||||
name: String,
|
name: String,
|
||||||
parentId: String,
|
parentId: String,
|
||||||
sequence: Int,
|
sequence: Int,
|
||||||
shortName: String,
|
shortName: String,
|
||||||
isDefaultName: Boolean,
|
isDefaultName: Boolean,
|
||||||
freeJoin: Boolean,
|
freeJoin: Boolean,
|
||||||
voiceConf: String,
|
voiceConf: String,
|
||||||
assignedUsers: Vector[String],
|
assignedUsers: Vector[String],
|
||||||
users: Vector[BreakoutUser],
|
users: Vector[BreakoutUser],
|
||||||
voiceUsers: Vector[BreakoutVoiceUser],
|
voiceUsers: Vector[BreakoutVoiceUser],
|
||||||
startedOn: Option[Long],
|
startedOn: Option[Long],
|
||||||
started: Boolean,
|
started: Boolean,
|
||||||
captureNotes: Boolean,
|
captureNotes: Boolean,
|
||||||
captureSlides: Boolean,
|
captureSlides: Boolean,
|
||||||
captureNotesFilename: String,
|
captureNotesFilename: String,
|
||||||
captureSlidesFilename: String,
|
captureSlidesFilename: String,
|
||||||
allPages: Boolean,
|
allPages: Boolean,
|
||||||
presId: String,
|
presId: String,
|
||||||
|
sourcePresentationFilename: String,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -57,6 +57,7 @@ case class BreakoutRoomDetail(
|
|||||||
viewerPassword: String,
|
viewerPassword: String,
|
||||||
sourcePresentationId: String,
|
sourcePresentationId: String,
|
||||||
sourcePresentationSlide: Int,
|
sourcePresentationSlide: Int,
|
||||||
|
sourcePresentationFilename: String,
|
||||||
record: Boolean,
|
record: Boolean,
|
||||||
privateChatEnabled: Boolean,
|
privateChatEnabled: Boolean,
|
||||||
captureNotes: Boolean,
|
captureNotes: Boolean,
|
||||||
@ -71,7 +72,7 @@ case class BreakoutRoomDetail(
|
|||||||
object CreateBreakoutRoomsCmdMsg { val NAME = "CreateBreakoutRoomsCmdMsg" }
|
object CreateBreakoutRoomsCmdMsg { val NAME = "CreateBreakoutRoomsCmdMsg" }
|
||||||
case class CreateBreakoutRoomsCmdMsg(header: BbbClientMsgHeader, body: CreateBreakoutRoomsCmdMsgBody) extends StandardMsg
|
case class CreateBreakoutRoomsCmdMsg(header: BbbClientMsgHeader, body: CreateBreakoutRoomsCmdMsgBody) extends StandardMsg
|
||||||
case class CreateBreakoutRoomsCmdMsgBody(meetingId: String, durationInMinutes: Int, record: Boolean, captureNotes: Boolean, captureSlides: Boolean, rooms: Vector[BreakoutRoomMsgBody], sendInviteToModerators: Boolean)
|
case class CreateBreakoutRoomsCmdMsgBody(meetingId: String, durationInMinutes: Int, record: Boolean, captureNotes: Boolean, captureSlides: Boolean, rooms: Vector[BreakoutRoomMsgBody], sendInviteToModerators: Boolean)
|
||||||
case class BreakoutRoomMsgBody(name: String, sequence: Int, shortName: String, captureNotesFilename: String, captureSlidesFilename: String, isDefaultName: Boolean, freeJoin: Boolean, users: Vector[String], allPages: Boolean, presId: String)
|
case class BreakoutRoomMsgBody(name: String, sequence: Int, shortName: String, captureNotesFilename: String, captureSlidesFilename: String, isDefaultName: Boolean, freeJoin: Boolean, users: Vector[String], allPages: Boolean, presId: String, sourcePresentationFilename: String)
|
||||||
|
|
||||||
// Sent by user to request ending all the breakout rooms
|
// Sent by user to request ending all the breakout rooms
|
||||||
object EndAllBreakoutRoomsMsg { val NAME = "EndAllBreakoutRoomsMsg" }
|
object EndAllBreakoutRoomsMsg { val NAME = "EndAllBreakoutRoomsMsg" }
|
||||||
|
@ -671,7 +671,9 @@ public class MeetingService implements MessageListener {
|
|||||||
|
|
||||||
presDownloadService.extractPresentationPage(message.parentMeetingId,
|
presDownloadService.extractPresentationPage(message.parentMeetingId,
|
||||||
message.sourcePresentationId,
|
message.sourcePresentationId,
|
||||||
message.sourcePresentationSlide, breakout.getInternalId());
|
message.sourcePresentationSlide,
|
||||||
|
breakout.getInternalId(),
|
||||||
|
message.sourcePresentationFilename);
|
||||||
} else {
|
} else {
|
||||||
Map<String, Object> logData = new HashMap<String, Object>();
|
Map<String, Object> logData = new HashMap<String, Object>();
|
||||||
logData.put("meetingId", message.meetingId);
|
logData.put("meetingId", message.meetingId);
|
||||||
|
@ -17,6 +17,7 @@ public class CreateBreakoutRoom implements IMessage {
|
|||||||
public final Integer durationInMinutes; // The duration of the breakout room
|
public final Integer durationInMinutes; // The duration of the breakout room
|
||||||
public final String sourcePresentationId;
|
public final String sourcePresentationId;
|
||||||
public final Integer sourcePresentationSlide;
|
public final Integer sourcePresentationSlide;
|
||||||
|
public final String sourcePresentationFilename;
|
||||||
public final Boolean record;
|
public final Boolean record;
|
||||||
public final Boolean privateChatEnabled;
|
public final Boolean privateChatEnabled;
|
||||||
public final Boolean captureNotes; // Upload shared notes to main room after breakout room end
|
public final Boolean captureNotes; // Upload shared notes to main room after breakout room end
|
||||||
@ -38,6 +39,7 @@ public class CreateBreakoutRoom implements IMessage {
|
|||||||
Integer duration,
|
Integer duration,
|
||||||
String sourcePresentationId,
|
String sourcePresentationId,
|
||||||
Integer sourcePresentationSlide,
|
Integer sourcePresentationSlide,
|
||||||
|
String sourcePresentationFilename,
|
||||||
Boolean record,
|
Boolean record,
|
||||||
Boolean privateChatEnabled,
|
Boolean privateChatEnabled,
|
||||||
Boolean captureNotes,
|
Boolean captureNotes,
|
||||||
@ -58,6 +60,7 @@ public class CreateBreakoutRoom implements IMessage {
|
|||||||
this.durationInMinutes = duration;
|
this.durationInMinutes = duration;
|
||||||
this.sourcePresentationId = sourcePresentationId;
|
this.sourcePresentationId = sourcePresentationId;
|
||||||
this.sourcePresentationSlide = sourcePresentationSlide;
|
this.sourcePresentationSlide = sourcePresentationSlide;
|
||||||
|
this.sourcePresentationFilename = sourcePresentationFilename;
|
||||||
this.record = record;
|
this.record = record;
|
||||||
this.privateChatEnabled = privateChatEnabled;
|
this.privateChatEnabled = privateChatEnabled;
|
||||||
this.captureNotes = captureNotes;
|
this.captureNotes = captureNotes;
|
||||||
|
@ -81,7 +81,8 @@ public class PresentationUrlDownloadService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void extractPresentationPage(final String sourceMeetingId, final String presentationId,
|
public void extractPresentationPage(final String sourceMeetingId, final String presentationId,
|
||||||
final Integer presentationSlide, final String destinationMeetingId) {
|
final Integer presentationSlide, final String destinationMeetingId,
|
||||||
|
final String sourcePresentationFilename) {
|
||||||
/**
|
/**
|
||||||
* We delay processing of the presentation to make sure that the meeting has already been created.
|
* We delay processing of the presentation to make sure that the meeting has already been created.
|
||||||
* Otherwise, the meeting won't get the conversion events.
|
* Otherwise, the meeting won't get the conversion events.
|
||||||
@ -89,18 +90,25 @@ public class PresentationUrlDownloadService {
|
|||||||
ScheduledFuture scheduledFuture =
|
ScheduledFuture scheduledFuture =
|
||||||
scheduledThreadPool.schedule(new Runnable() {
|
scheduledThreadPool.schedule(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
extractPage(sourceMeetingId, presentationId, presentationSlide, destinationMeetingId) ;
|
extractPage(sourceMeetingId, presentationId, presentationSlide, destinationMeetingId, sourcePresentationFilename) ;
|
||||||
}
|
}
|
||||||
}, 5, TimeUnit.SECONDS);
|
}, 5, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
// A negative presentationSlide indicates the entire presentation deck should be used.
|
|
||||||
private void extractPage(final String sourceMeetingId, final String presentationId,
|
private void extractPage(final String sourceMeetingId, final String presentationId,
|
||||||
final Integer presentationSlide, final String destinationMeetingId) {
|
final Integer presentationSlide, final String destinationMeetingId,
|
||||||
|
final String sourcePresentationFilename) {
|
||||||
|
|
||||||
Boolean uploadFailed = false;
|
Boolean uploadFailed = false;
|
||||||
ArrayList<String> uploadFailedReasons = new ArrayList<String>();
|
ArrayList<String> uploadFailedReasons = new ArrayList<String>();
|
||||||
|
|
||||||
|
// A negative presentationSlide indicates the entire presentation deck should be used.
|
||||||
|
Boolean extractWholePresentation = presentationSlide < 0;
|
||||||
|
String filenameWithoutExtension = FilenameUtils.removeExtension(sourcePresentationFilename);
|
||||||
|
|
||||||
|
// Append the slide number to the filename if a single slide is being extracted
|
||||||
|
String presentationSlideInFilename = extractWholePresentation ? "" : ("-" + presentationSlide.toString());
|
||||||
|
|
||||||
// Build the source meeting path
|
// Build the source meeting path
|
||||||
File sourceMeetingPath = new File(presentationDir + File.separatorChar
|
File sourceMeetingPath = new File(presentationDir + File.separatorChar
|
||||||
+ sourceMeetingId + File.separatorChar + sourceMeetingId
|
+ sourceMeetingId + File.separatorChar + sourceMeetingId
|
||||||
@ -137,7 +145,8 @@ public class PresentationUrlDownloadService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Build the target meeting path
|
// Build the target meeting path
|
||||||
String filenameExt = FilenameUtils.getExtension(sourcePresentationFile.getName());
|
String filename = sourcePresentationFile.getName();
|
||||||
|
String filenameExt = FilenameUtils.getExtension(filename);
|
||||||
String presId = Util.generatePresentationId(presentationId);
|
String presId = Util.generatePresentationId(presentationId);
|
||||||
String newFilename = Util.createNewFilename(presId, filenameExt);
|
String newFilename = Util.createNewFilename(presId, filenameExt);
|
||||||
|
|
||||||
@ -147,7 +156,7 @@ public class PresentationUrlDownloadService {
|
|||||||
+ newFilename;
|
+ newFilename;
|
||||||
File newPresentation = new File(newFilePath);
|
File newPresentation = new File(newFilePath);
|
||||||
|
|
||||||
if (sourcePresentationFile.getName().toLowerCase().endsWith("pdf") && presentationSlide >= 0) {
|
if (sourcePresentationFile.getName().toLowerCase().endsWith("pdf") && !extractWholePresentation) {
|
||||||
pageExtractor.extractPage(sourcePresentationFile, new File(
|
pageExtractor.extractPage(sourcePresentationFile, new File(
|
||||||
newFilePath), presentationSlide);
|
newFilePath), presentationSlide);
|
||||||
} else {
|
} else {
|
||||||
@ -163,7 +172,7 @@ public class PresentationUrlDownloadService {
|
|||||||
processUploadedFile("DEFAULT_PRESENTATION_POD",
|
processUploadedFile("DEFAULT_PRESENTATION_POD",
|
||||||
destinationMeetingId,
|
destinationMeetingId,
|
||||||
presId,
|
presId,
|
||||||
"default-" + presentationSlide.toString() + "." + filenameExt,
|
filenameWithoutExtension + presentationSlideInFilename + "." + filenameExt,
|
||||||
newPresentation,
|
newPresentation,
|
||||||
true,
|
true,
|
||||||
"breakout-authz-token",
|
"breakout-authz-token",
|
||||||
|
@ -11,7 +11,7 @@ sealed trait ApiMsg
|
|||||||
case class CreateBreakoutRoomMsg(meetingId: String, parentMeetingId: String,
|
case class CreateBreakoutRoomMsg(meetingId: String, parentMeetingId: String,
|
||||||
name: String, sequence: Integer, freeJoin: Boolean, dialNumber: String,
|
name: String, sequence: Integer, freeJoin: Boolean, dialNumber: String,
|
||||||
voiceConfId: String, viewerPassword: String, moderatorPassword: String, duration: Int,
|
voiceConfId: String, viewerPassword: String, moderatorPassword: String, duration: Int,
|
||||||
sourcePresentationId: String, sourcePresentationSlide: Int,
|
sourcePresentationId: String, sourcePresentationSlide: Int, sourcePresentationFilename: String,
|
||||||
record: Boolean, captureNotes: Boolean, captureSlides: Boolean, captureNotesFilename: String, captureSlidesFilename: String) extends ApiMsg
|
record: Boolean, captureNotes: Boolean, captureSlides: Boolean, captureNotesFilename: String, captureSlidesFilename: String) extends ApiMsg
|
||||||
|
|
||||||
case class AddUserSession(token: String, session: UserSession)
|
case class AddUserSession(token: String, session: UserSession)
|
||||||
|
@ -101,6 +101,7 @@ class OldMeetingMsgHdlrActor(val olgMsgGW: OldMessageReceivedGW)
|
|||||||
msg.body.room.durationInMinutes,
|
msg.body.room.durationInMinutes,
|
||||||
msg.body.room.sourcePresentationId,
|
msg.body.room.sourcePresentationId,
|
||||||
msg.body.room.sourcePresentationSlide,
|
msg.body.room.sourcePresentationSlide,
|
||||||
|
msg.body.room.sourcePresentationFilename,
|
||||||
msg.body.room.record,
|
msg.body.room.record,
|
||||||
msg.body.room.privateChatEnabled,
|
msg.body.room.privateChatEnabled,
|
||||||
msg.body.room.captureNotes,
|
msg.body.room.captureNotes,
|
||||||
|
@ -512,6 +512,9 @@ class BreakoutRoom extends PureComponent {
|
|||||||
sequence: seq,
|
sequence: seq,
|
||||||
allPages: !this.getRoomPresentation(seq).startsWith(CURRENT_SLIDE_PREFIX),
|
allPages: !this.getRoomPresentation(seq).startsWith(CURRENT_SLIDE_PREFIX),
|
||||||
presId: this.getRoomPresentation(seq).replace(CURRENT_SLIDE_PREFIX, ''),
|
presId: this.getRoomPresentation(seq).replace(CURRENT_SLIDE_PREFIX, ''),
|
||||||
|
sourcePresentationFilename: PresentationUploaderService.getPresentations()
|
||||||
|
.filter((pres) => pres.id == this.getRoomPresentation(seq).replace(CURRENT_SLIDE_PREFIX, ''))[0]
|
||||||
|
.filename || this.getRoomName(seq),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
createBreakoutRoom(rooms, durationTime, record, captureNotes, captureSlides, inviteMods);
|
createBreakoutRoom(rooms, durationTime, record, captureNotes, captureSlides, inviteMods);
|
||||||
|
Loading…
Reference in New Issue
Block a user