Commit Graph

359 Commits

Author SHA1 Message Date
raduanastase8x8
d2e52d2c2a ref(Theme): Changes typography values to rem (#16021)
Replaces hard-coded pixel values with relative rem units across UI components to improve typography responsiveness and maintainability.

Co-authored-by: Hristo Terezov <hristo@jitsi.org>
2025-08-06 19:07:27 -05:00
Andrei Gavrilescu
3438438219 feat(recording): enable consent dialog on spot (#16179)
* enable consent dialog on spot

* lint fix

* move spot consent behind config flag

* revert copilot magic
2025-07-04 11:45:01 +03:00
Andrei Gavrilescu
a4c20469cd feat(API): expose recording consent to external api (#16141)
* expose recording consent to api

* Update react/features/recording/actions.web.tsx

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-17 14:44:00 +03:00
Mihaela Dumitru
ecf9bee7d0 fix(recordings) create missing local tracks when unmuting after consent (#16119)
* fix(recordings) create missing local tracks when unmuting after consent

* fix(conference) Avoid creating duplicate tracks on unmute

* squash: Ignore TS linter error

---------

Co-authored-by: Jaya Allamsetty <jaya.allamsetty@8x8.com>
2025-06-09 16:44:24 -04:00
Saúl Ibarra Corretgé
be9e1136de fix(ts) apply import linting rules to TS files too 2025-06-04 22:04:36 +02:00
Дамян Минков
fa9aab953d feat(transcribing): Adds config to skip inviting jigasi on transcribing. (#16095)
* feat(transcribing): Adds config to skip inviting jigasi on transcribing.

* squash: Changes config value name.
2025-05-29 21:35:46 -05:00
Saúl Ibarra Corretgé
589baab2ae fix(local-recording) defend against out of order events
We have observed some failed recordings which are lacking the EBML
header. The only way in which that seems plausible is if the
dataavailable event is received while processing the stop event. This is
allegedly not possible, but it's the only plausible explanation, so
let's defend against that.

Extend the timeslice back to 5s too.
2025-05-28 10:43:33 -05:00
Saúl Ibarra Corretgé
734ab449a6 fix(local-recordings) back to WebM format, fix duration
After a lot of back and forth, WebM seems to be the only option we
really have. In terms of containers and codecs, here is the rundown:

- WebM, any codec: the resulting file is not seekable
- MKV, any codec: the resulting file is not seekable
- MP4, vp9 + opus: video artifacts and audio clipping, file is seekable
- MP4, av1 + AAC: all good, but not supported on Linux :-/

MP4 looked very promising but there is no combination that leads to
something that works reliably everywhere, oh well. In addition, MP4
files can be opened with QuickTime on macOS, but not with the codec
combination we'd use, so that is somewhat a disadvantage.

So, we are back to where we started: WebM with VP8 and opus. But we need
to fix the duration in a potentially long file... the trick is to _only_
fix the duration. We can do that by inserting the right segment in the
metadata section. Something we cannot do without reading the whole file
is create cue points, but players like VLC seem to work well without
them.
2025-05-19 11:33:46 -05:00
Saúl Ibarra Corretgé
4735911b6c fix(spot) make Spot TV detection more resilient
Setting the UA string in Electron doesn't propagate the change to the
iframe where the meeting is loaded (🤦).

Thus make it more resilient by trying different things:

- A freshly introduced "iAmSpot" config option, similar to Jibri
- The app ID is present in the UA string, so we can test for that
- As a last-ditch effort, check if the display name is the default
  "Meeting Room"
2025-05-16 13:17:26 +02:00
Saúl Ibarra Corretgé
8bab15d13a fix(recording) fix matching initiator
LJM will use either a JitsiParticipant object or a string for the
recording session initiator, handle both cases when checking if it's
ourselves.
2025-05-15 13:50:56 +02:00
Saúl Ibarra Corretgé
561271d926 fix(local-recordings) use the Matroska container with VP8 as a codec
In the 1st incarnation of local recordings we used to use VP8 as the
video encoder. Upon switching to MP4 that combiantion is not supported
for some reason, so I used VP9 instead.

Some anecdotal evidence suggests VP9 is behqaving more erratically, with
rendering errors and fixes.

Turns out Chrome also supports the Matroska container! And VP8 inside it
at that! The bonus we get from using it is that QuickTime on macOS won't
try to open it, thus avoiding some confusion with MP4 files, which it
recognizes, but cannot open due to the video codec.
2025-05-08 15:41:26 +02:00
Saúl Ibarra Corretgé
e21da045ad fix(local-recordings) use constant bitrate for audio 2025-05-08 15:41:26 +02:00
Saúl Ibarra Corretgé
598d3764dd fix(local-recordings) make sure we have a gDM audio stream 2025-05-06 14:42:29 +02:00
Saúl Ibarra Corretgé
cff91756d0 fix(local-recordings) tweak audio constraints for local recordings 2025-05-06 14:42:29 +02:00
Saúl Ibarra Corretgé
5c0c3c2e0d feat(recording) refactor consent dialog (#15985)
* feat(recording) refactor consent dialog

Offer 2 choices and add a configurable "learn more" link.

* hide dialog and display link conditionally

* native changes

---------

Co-authored-by: Mihaela Dumitru <mihdmt@gmail.com>
2025-05-06 15:02:39 +03:00
Saúl Ibarra Corretgé
082c4c325d feat(recording) add ability to skip consent in-meeting
When turned on, the consent dialog won't be displayed for the users who
are already in the meeting, it will only be displayed to those who join
after the recording was started.
2025-04-30 15:58:58 +02:00
Saúl Ibarra Corretgé
4878874a68 fix(local-recordings) fix data loss when MediaRecorder is stopped
Flush the file after the 'stop' event is emitted, which happens _after_
the last 'dataavailable' has been emitted, and thus when the
MediaRecorder is really done.

In addition, lower the time slice as added precaution against crashes.
2025-04-30 15:57:18 +02:00
Saúl Ibarra Corretgé
178e87d408 fix(local-recordings) more resilient way to get local audio
It's OK if we don't have any local audio track, we'll add it to the
mixer later.

The original bug / limitation that prompted the previous code no longer
applies since we always have a MediaStream (with audio tracks) which
we are recording.
2025-04-30 15:57:18 +02:00
Saúl Ibarra Corretgé
4fcab33afb feat(local-recordings) refactor how audio is captured
Capture the tab audio, which will include all participants and sound
effects, YouTube videos, anything playing in the tab.

This requires the `suppressLocalAudioPlayback` constraint since
otherwise the shared tab won't keep playing audio.

Local audio still needs to be injected seprarately, since it's not
played back to the local user.
2025-04-30 15:57:18 +02:00
Saúl Ibarra Corretgé
99669dc869 fix(local-recordings) style, for readability 2025-04-30 15:57:18 +02:00
Saúl Ibarra Corretgé
bf34c9ab19 fix(local-recording) require setCaptureHandleConfig 2025-04-30 15:57:18 +02:00
Saúl Ibarra Corretgé
f6f4ebf185 fix(recording) prevent multiple consent requests
A given recording should only trigger a single consent request.

The mechanism to notify about recording status updates may fire multiple
times since it's tied to XMPP presence and may send updates such as when
the live stream view URL is set.

Rather than trying to handle all possible corner cases to make sure we
only show the consent dialog once, keep track of the recording session
IDs for which we _have_ asked for consent and skip the dialog in case we
have done it already.
2025-04-30 15:30:51 +02:00
Saúl Ibarra Corretgé
607073c669 feat(local-recordings) remove recording time limit
Use the `showSaveFilePicker` File System Access API to pre-select the
file for download and stream the contents there. The browser uses a
temporary file as the buffer, thus not requiring us to buffer the
contents in memory.

Also change the container to MP4, since we have no way to fix the
seeking problem since we don't have the file in memory. Good news is
that it's supported since Chrome 126 and we can feature detect it!

Finally, add a helper `isSupprted` method which feature-detects
everything we need to make this work.

Ref: https://developer.mozilla.org/en-US/docs/Web/API/Window/showSaveFilePicker
Ref: https://groups.google.com/a/chromium.org/g/blink-dev/c/p1OMVj1FrMI/m/6FdLk7rZAQAJ
2025-04-23 13:52:02 -04:00
Hristo Terezov
348573b254 feat: Implement a closed caption history panel. 2025-04-21 08:56:31 -05:00
Saúl Ibarra Corretgé
7cf8902fdd fix(recording) skip consent dialog on Spot TV 2025-04-17 21:33:05 +02:00
Mihaela Dumitru
cf7c39d3e5 fix(recording) disable option to dismiss consent dialog (#15876) 2025-04-02 15:54:27 +03:00
damencho
92df4bfbbb feat: Backend reports default permissions.
When any of the backend is used 'anonymous', 'jitsi-anonymous', 'internal_hashed', 'internal_plain', 'cyrus' and a participant becomes a moderator, because of external module or because set from jicofo we send to client with the self-presence about becoming moderator a default set of permissions which can be controlled via prosody config.
If using 'token' authentication the above applies only if there is a token and the token does not contain context.features.
2025-03-31 11:49:13 -05:00
Saúl Ibarra Corretgé
1e8cc9d085 feat(inIframe/isEmbedded) add ability to detect generic embedding
On web we detect if we run on an iframe, and on mobile we detect if the
app is one of ours.
2025-03-26 23:39:16 +01:00
Mihaela Dumitru
6654feacee fix(recordings) skip consent for jibri participant (#15825) 2025-03-21 13:40:30 +02:00
damencho
ea0f9e7934 feat: Adds ts rule noImplicitOverride and fix errors. 2025-03-12 11:40:07 -05:00
Saúl Ibarra Corretgé
9843aca00a fix(rn,recording) fix closing the consent dialog (#15699)
* fix(rn,recording) fix closing the consent dialog

* fix(recording) avoid using private properties
2025-03-05 11:27:14 +02:00
Mihaela Dumitru
ebdd9755ba feat(recordings) add consent dialog (#15673) 2025-03-04 10:30:12 +02:00
Mihaela Dumitru
9186a74ae3 fix(recordings) increase duration for recording prompt notification (#15632) 2025-02-19 19:44:24 +02:00
Mihaela Dumitru
3514b22191 fix(recordings) dismiss notification when recording in progress (#15588) 2025-02-11 17:06:23 +02:00
Mihaela Dumitru
a6d333c07a fix(recordings) improve label to clearly reflect current status (#15570) 2025-02-10 15:39:00 +02:00
damencho
0387cdc888 feat(notifications): Make all error notifications sticky.
There are many cases where the error disappears and users easily miss the information.
2025-02-10 06:17:50 -06:00
Saúl Ibarra Corretgé
13f1cb13c5 fix(ts) drop bogus method anotations 2025-02-03 20:51:15 +01:00
Saúl Ibarra Corretgé
1edf88e744 fix(lint) tame linter 2025-01-10 20:09:11 +01:00
luzpaz
30595584a3 chore(typos) fix various typos
Found via `codespell -q 3 -S "*.svg,./lang" -L anser,bu,dialin,goup,miliseconds,nd,vew`
2024-12-20 07:58:31 +01:00
Mihaela Dumitru
68b16d7bc8 fix(config) hide ui label for the recording start notification and send event (#15385) 2024-12-12 11:31:38 +02:00
Mihaela Dumitru
4d7c051dd0 feat(config) add option to show recording link (#15336) 2024-11-27 09:32:38 +02:00
Дамян Минков
50e9413aad feat(recording): Shows notification when you try to start recording too quick. (#15311)
* feat(recording): Shows notification when you try to start recording too quick.

* squash: separate values ip and room.

* chore(deps) lib-jitsi-meet@latest

https://github.com/jitsi/lib-jitsi-meet/compare/v1886.0.0+bc446e99...v1887.0.0+9652999d

* squash: text adjust
2024-11-15 15:08:26 -06:00
damencho
d6a42fbe43 fix(jwt): Fixes when feature is missing from features.
By default, that feature is disabled.
2024-10-03 14:04:14 -05:00
damencho
e04db24d15 fix(jwt): Use isJwtFeatureEnabled the same way in all places.
Fixes an issue where we were showing cc button for visitors that does not have features in the token.
2024-10-03 14:04:14 -05:00
Дамян Минков
b3742a3438 fix(transcriptions,recording): Allows non moderators with features to dial, record or transcribe. (#15074)
* fix(transcriptions): Uses dial command to invite transcriber.

* fix(transcriptions,recording): Allows non moderators with features to dial, record or transcribe.

* sqaush: Make sure filtering works when only is a moderator.

It works now and without a token and no features, but being moderator.

* squash: Rename constant.

* squash: Checks features first before defaulting to moderator when filtering metadata service.

* squash: Checks features first before defaulting to moderator in UI.

* squash: Fixes lint and one other check.

* squash: Moves more logic to is_feature_allowed.

* squash: Drops unnecessary check.

* squash: Uses constant coming from ljm.

* squash: Toggles back captions button on error.

* squash: Fix comment.

* squash: Reverting back isLiveStreamingButtonVisible.

* squash: Fix imports.
2024-09-13 11:06:29 -05:00
Saúl Ibarra Corretgé
b35200648c feat(deps) replace lodash with lodash-es
The latter supports tree-shaking and we don't need to embed the whole
500KB of lodash.
2024-08-12 10:34:44 +02:00
Hristo Terezov
2514617417 fix: Make all middleware functions sync.
Some middleware functions are declared as async. This wraps next(action) in Promise which will delay the execution of actions and also dispatch will return the its result always as a Promise.
2024-07-25 07:17:16 -05:00
Mihaela Dumitru
f9f5cf87b9 fix(recording) start transcription from notification when configured (#14879) 2024-06-28 16:04:37 +03:00
Saúl Ibarra Corretgé
0be3e2b103 feat(external_api) include transcription state in recordingStatusChanged 2024-06-24 17:34:19 +02:00
Saúl Ibarra Corretgé
ae138c1a15 feat(recording) add isLiveStreamingRunning helper 2024-06-24 17:34:19 +02:00