Code Monkey home page Code Monkey logo

bbb-playback's Introduction

bbb-playback

Clone this repository, install the dependencies and deploy

git clone https://github.com/bigbluebutton/bbb-playback.git
cd bbb-playback
npm install
./deploy.sh

You will be able to play your recordings using the following URL

https://<domain>/playback/presentation/2.3/<recordId>

URL query strings

  • frequency:

    • f=<value>: renders per second (e.g., 5)
  • layout:

    • l=content: focus on content
    • l=disabled: disabled interactive elements
    • l=media: focus on media
    • l=swapped: content/media swapped
  • style: custom style

    • s=<name>
  • time:

    • t=HhMmSs (e.g., 1h10m5s)
    • t=MmSs
    • t=Ss
  • path:

    • p=path/to/recordings
  • locale:

    • locale=locale-CODE (e.g., pt-BR)
  • log:

    • debug

Configuration

  • chat:

    • scroll: automatic scroll [true|false]
    • align: scroll align [top|middle|bottom]
  • controls:

    • about
    • fullscreen
    • search
    • section
    • swap
    • thumbnails
  • locale:

    • default: fallback [en]
  • player: primary media configuration

    • rps: renders per second
    • rates: speed rates
  • shortcuts: alt + shift

    • fullscreen: K
    • play/pause: Enter
    • section: L
    • seek:
      • backward: ArrowLeft
      • forward: ArrowRight
      • seconds: 15
    • skip:
      • next: ArrowUp
      • previous: ArrowDown
    • swap: M
  • styles: custom styles

    • default: default style
    • url: styles host
    • valid: valid style names
  • thumbnails:

    • scroll: automatic scroll [true|false]
    • align: scroll align [left|center|right]

Standalone recordings

bbb-playback can be used to create a self-contained recording - a single directory that contains all of the recording media files as well as the playback html and javascript code. To do this, use the following build command:

PUBLIC_URL=. REACT_APP_NO_ROUTER=1 npm run-script build

And then copy all of the files from the bbb-playback build directory and the files from /var/bigbluebutton/published/presentation/<recordid> together into a single directory.

External recordings

bbb-playback can play recordings hosted somewhere other than the default location. To do this, build the bbb-playback with the following options:

REACT_APP_MEDIA_ROOT_URL=/different/relative/path/to/presentation/files npm run-script build

You can also play medias from an external server. Note that you will need to have the Access-Control-Allow-Origin header returned on the medias for that to work.

REACT_APP_MEDIA_ROOT_URL=https://my-media-server.example.com npm run-script build

Playing old recordings

At /etc/bigbluebutton/nginx/presentation.nginx:

  • v2.0, v2.1 and v2.2
location /playback/presentation/2.0/playback.html {
  return 301 /playback/presentation/2.3/$arg_meetingId?$query_string;
}
  • [experimental] v0.9, v1.0 and v1.1
location /playback/presentation/0.9.0/playback.html {
  return 301 /playback/presentation/2.3/$arg_meetingId?$query_string;
}

Reload nginx service

sudo systemctl reload nginx

bbb-playback's People

Contributors

antobinary avatar cloutierlp avatar danielpetri1 avatar dependabot[bot] avatar fcecagno avatar frankemax avatar germanocaumo avatar ghazitriki avatar guileme avatar hiroshisuga avatar kepstin avatar louim avatar mbm1607 avatar mrkeksi avatar pedrobmarin avatar snyk-bot avatar sparse91 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bbb-playback's Issues

Audio media

Currently the player only handles video as the primary media.
Make sure it can sync everything up with an audio media.

Playback title with session name

Is your feature request related to a problem? Please describe.
Currently the title of playback is "[room name] - [date]". I feel weird that it does not contain the session (or lecture) title.

Describe the solution you'd like
I would like the title of playback be "[session title] - [room name] - [date]" when session title is available (i.e. when the room owner put the title after publishing).

Additional context
Please take a look at the PR I am going to post soon. Let me know if it makes any potential problem.

Add a time query

So the recording can be played from a specific moment: t={seconds}.

Whiteboard drawings not shown when drew->all cleared->drew

Describe the bug
The whiteboard drawing are not shown, when users drew things, everybody removed it (so nothing shown), and then they started to draw again in one presentation slide.

Additional context
I looked into the problem and found out that in getCurrentDataInterval function, the program defines the range of canvas data by checking if the drawing is active or not. It surveys the data from the beginning, and stops when the first inactive drawing is spotted out after the first active drawing is recognised. Thus, when the users (or room owner) clears up the drawing once, and then restart to draw, the latter drawings would not be played back.
I have implemented a solution and now watching if it works as I intended. I will post it as PR later.

External Videos

Hi,

we are using your code to playback BBB recordings. We prefer it to default playback. I would like to ask you if you think that external videos can be considered in you develop. I know that you can't record it but I would like to ask you that if we create new events in event.xml file asociated to external videos (for example the video URL, and if the moderator start/stop the video), you think that you could reproduce them. I mean that instead of record external videos, that your bbb-playback reproduce external videos in similar way that in a meeting is done.

Thank you very much.
Regards

Button focus

Extend buttons to implement both round and square shapes

Search result

When viewing webcams on mobile and searching, we should swap the display back to the presentation to show the results.

First design iteration

  • Update background colour to background-color: rgb(243, 246, 249);

  • With updating the background colour to use the lighter grey, we’ll need to update the text and stand alone icon colours to use color: rgb(78, 90, 102);

  • Update slides button to use the full blue button colour;

  • Update the “-” icon to be a left chevron “<” to close the left panel and a right chevron “>” to open the left panel;

  • Center the “play button” to be in middle of the browser;

  • Add “Public Chat” heading to the chat container and remove the chat icon;

  • Hide the search button until the experience is more robust - we believe the current implementation may drive an increase in support tickets;

  • Move the swap button to the left hand side in replace of the search button;

Improve localization

We have en and pt right now and this could easily grow a couple more languages.

Dynamic layout

Would be nice to better occupy the space of the player by not showing elements that were not used in the meeting.
An important thing to do here is inform the user why the elements are not being shown.

Add meeting details

There are some extra details that could be informed to the user. Maybe this can be placed at the same area chat is.

iOS doesn't start at correct time defined in t URL parameter

When playing records in iOS (Chrome or Safari) and specifying the URL parameter t=0h30m10s the recording starts at 0s and not at 30m10s as specified.

To reproduce open a recording with time specified, for example:

Smartphone:

  • Device: iPad
  • OS: iOS 14.2
  • Browser chrome, safari

Change locale

Currently the player uses the default browser language to set the locale.
Would be nice to be able to have more options. Maybe inside the player or with an URL parameter.

Polls don't render on recording processed with 2.3 processing scripts

In recordings processed with newer versions of the presentation processing script, polls don't render in bbb-playback.

The reason is related to the code at

if (g.rect && g.image) {
shape.type = 'poll';
const rect = getAttr(g.rect.shift());
const image = getAttr(g.image.shift());
shape.data = Object.assign({ rect }, { image });

An old recording (2.2) has polls that look like this:

    <g xmlns="http://www.w3.org/2000/svg" id="image1-draw1" class="shape" timestamp="10.8" undo="-1" shape="image1-poll1" style="visibility:hidden">
      <rect x="1058.0" y="782.12" width="540.0" height="115.88" fill="white" stroke="black" stroke-width="4"/>
      <image height="544.0" width="119.88" x="1600" y="780.12" transform="rotate(90, 1600, 780.12)" xlink:href="presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1601651923237/poll_result1.svg" xmlns:xlink="http://www.w3.org/1999/xlink"/>
    </g>

but newer recordings (2.3) instead have polls that look like this:

    <g xmlns="http://www.w3.org/2000/svg" id="image1-draw1" class="shape" timestamp="11.3" undo="-1" shape="image1-poll1" style="visibility:hidden">
      <image width="544.0" height="179.82" x="1056.0" y="720.18" xlink:href="presentation/d2d9a672040fbde2a47a10bf6c37b6a4b5ae187f-1601640367716/poll_result1.svg" xmlns:xlink="http://www.w3.org/1999/xlink"/>
    </g>

The newer scripts render the poll using a helper tool that generates an opaque image with the correct rotation, so the extra <rect> and the transform on the <image> are no longer needed. But since the pattern doesn't match in the code, the bbb-playback format ignores the poll.

To be honest, why does bbb-playback need to know what type a shape is? Shouldn't it just be displaying them as-is? It would be a lot easier to handle new shapes if they only had to be added to the processing script and then they'd show up in the playback automatically.

Slide too small in landscape smartphone

Describe the bug
The slide is almost invisible when place the Android smartphone in the landscape position.

To Reproduce
Start the 2.3 playback in Android smartphone, then rotate the phone 90 degree.

Expected behavior
The slide should be displayed much larger by default, although the user can expand the screen later by pinching in.

Screenshots
Screenshot_20200620-102734のコピー

Desktop (please complete the following information):
Desktop is fine.

Smartphone (please complete the following information):

  • Device: Huawei P10lite
  • OS: Android
  • Browser Chrome, Firefox

Additional context
iPhone not tested.

RTL horizontal auto scroll

Thumbnails aren't getting the correct horizontal scroll when page direction is switched. I believe this will affect RTL locales

Chrome: Video desync when not viewing playback tab

Describe the bug
If you switch to another tab while playback is playing, when you open playback tab again the video is behind audio.

To Reproduce
Steps to reproduce the behavior:

  1. Go to a playback with audio and video
  2. Click play
  3. Open another tab in browser, wait a little
  4. Go back to playback tab

Expected behavior
The audio and video should stay in sync.

Desktop (please complete the following information):

  • OS: Windows 10
  • Browser: Chrome
  • Version 84

Additional context
In firefox the video gets "stuck" for a while but resumes to play in sync

Video-less playback

Is your feature request related to a problem? Please describe.
Students with narrow band may want to watch the record without the presenter's video, but only with his/her voice.

Describe the solution you'd like
What about having a "video-less playback button", which can toggle the presenter's video. Audio must not be off anyway.

Additional context

  1. I am not sure if the video-less playback can reduce the bandwidth efficiently.
  2. We may want BBB, when publishing, to prepare another webm file in which a video track is removed, using ffmpeg. Then the playback component chooses the file depending on the state of "video-less playback button".
  3. In the HTML5 client this function has already been implemented by changing the setting (in the data saving panel). Wouldn't it be better to do the same in the playback?

Skip playback by arrow button

Is your feature request related to a problem? Please describe.
With the playback 2.0 using popcorn.js, the user can skip the playback by one second back and forward pushing the keyboard arrow button. Keep pushing the arrow button leads to the fast forwarding the playback. The new playback 2.3 does not seem to have implemented this function.

Describe the solution you'd like
I would love to have the same function. The students often want to go back or forward by relatively short time (like 5 seconds), to listen back what the teachers say or skip the stupid troubles in the teacher's side.

Alternative
Having buttons like [-5s] [5s] in the controler.

Additional context
Congratulations @pedrobmarin for the nice playback interface. I really like it!

Tooltips

Would be nice to have a little description on what buttons do.

Include keyboard shortcuts

The player could have global shortcuts to some of the button actions:

  • presentation/video swap;
  • side panel hide/show;
  • video skip;
  • go to next/previous slide;
  • got to next/previous chat message.

Maximize the slide in smartphone

Is your feature request related to a problem? Please describe.
This is not really a problem, but I feel a bit frustrated with the small sized slide shown in the smartphone screen.

Describe the solution you'd like
Currently the slide panel and chat panel are equally distributed in size. Usually students want to see the slide more than the chat (at least teachers want them to do so;-). Wouldn't it be better to maximize the slide panel and squeeze the chat panel (which can be scrolled anyway) in the rest of the screen?

Describe alternatives you've considered
An easy trick is for instance
to modify line 28 of src/components/index.scss as
grid-template-rows: $navigation-bar-height 3fr 2fr $action-bar-height
名称未設定 2のコピー
名称未設定 1のコピー

Mouse cursor over media

Update mouse cursor to point when hovering over the video when it’s in the swapped stay to indicate to the user that the video can be pressed.

Emojis

Add emoji reactions to the playback.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.