mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2026-01-10 08:40:18 +00:00
Compare commits
254 Commits
3897
...
android-sd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed766c6fe2 | ||
|
|
d883bae925 | ||
|
|
62d3d1f294 | ||
|
|
dbfed573ac | ||
|
|
640b9bfd52 | ||
|
|
dac6d9d63c | ||
|
|
0662da58b4 | ||
|
|
d7d4ea819f | ||
|
|
2c6cac6526 | ||
|
|
f53251f104 | ||
|
|
8e01f769d9 | ||
|
|
8c4656a3c8 | ||
|
|
a5a36aa1e1 | ||
|
|
6939939a0f | ||
|
|
c60671e008 | ||
|
|
8e4e1f139a | ||
|
|
b608051177 | ||
|
|
2dad7e920b | ||
|
|
be2d20e20e | ||
|
|
fd11c36bc3 | ||
|
|
60148b6439 | ||
|
|
62b4c97423 | ||
|
|
f08fa1e374 | ||
|
|
e5b563ba46 | ||
|
|
c41047344f | ||
|
|
6ae148403d | ||
|
|
b5676c3729 | ||
|
|
3ab6b97b8b | ||
|
|
5ea8e198c7 | ||
|
|
2ad6bfbc20 | ||
|
|
6ce27ef10d | ||
|
|
93ef8495ca | ||
|
|
94a15914d0 | ||
|
|
851976ebdf | ||
|
|
57bb2ead36 | ||
|
|
027c6ddad0 | ||
|
|
8648a5a998 | ||
|
|
c83b30558d | ||
|
|
057dfc8194 | ||
|
|
5eae0b58e9 | ||
|
|
1538107e93 | ||
|
|
cd1862a2d3 | ||
|
|
147a076f5d | ||
|
|
9bdaea4069 | ||
|
|
547d1547bb | ||
|
|
39853e048b | ||
|
|
8b454b5196 | ||
|
|
e2788e0fb2 | ||
|
|
b1d1599a1c | ||
|
|
cef98f457f | ||
|
|
6b0e8aab11 | ||
|
|
086889ed70 | ||
|
|
516e5af118 | ||
|
|
afe1b4b0f9 | ||
|
|
8790ad6013 | ||
|
|
8bbc04d4db | ||
|
|
4fda428be1 | ||
|
|
f972ebfe9e | ||
|
|
3dfcc8d80e | ||
|
|
33ebd241a9 | ||
|
|
cb6fbb0f03 | ||
|
|
0077ee29c5 | ||
|
|
551db30cc7 | ||
|
|
1bd930a3cb | ||
|
|
e0563a743f | ||
|
|
a4ab7ea95f | ||
|
|
b50d6e43d0 | ||
|
|
f9fcb46036 | ||
|
|
4824c8714a | ||
|
|
be56521267 | ||
|
|
b7eda8df7a | ||
|
|
d632b6e13e | ||
|
|
dff7d661ca | ||
|
|
edb8ecd542 | ||
|
|
b64112432d | ||
|
|
d8963bc903 | ||
|
|
5c39a2f6a6 | ||
|
|
a72928a9e7 | ||
|
|
e2ea26eb1f | ||
|
|
9962a2ea61 | ||
|
|
07e203ce8d | ||
|
|
638fdf0370 | ||
|
|
6ce1eaba24 | ||
|
|
4780e48be8 | ||
|
|
7776f0a98c | ||
|
|
2eede7e76b | ||
|
|
72a7bd0a68 | ||
|
|
9085cbf363 | ||
|
|
be80f26086 | ||
|
|
a876f78fd7 | ||
|
|
73d948d150 | ||
|
|
c5aa555816 | ||
|
|
7902223f09 | ||
|
|
ac117cd50d | ||
|
|
f2df5906f6 | ||
|
|
0fcecaf18f | ||
|
|
8cc4b73722 | ||
|
|
c08f5c7e18 | ||
|
|
2e0f3ae84f | ||
|
|
41bfb4c7ec | ||
|
|
4a12cdfac7 | ||
|
|
7b34fb89d1 | ||
|
|
4ec438d3f3 | ||
|
|
e79633b0ca | ||
|
|
49a9934c41 | ||
|
|
193d19ce21 | ||
|
|
fe83d87d2d | ||
|
|
b4a2327264 | ||
|
|
d9edf661dd | ||
|
|
e32f367b0c | ||
|
|
2b181673b5 | ||
|
|
87a058eaa4 | ||
|
|
eef0f5ed97 | ||
|
|
1751fc7635 | ||
|
|
4aa58f041f | ||
|
|
39d789a088 | ||
|
|
2654c77f2c | ||
|
|
7af88e5c4f | ||
|
|
ffdd4f2eed | ||
|
|
0b0a19ea5c | ||
|
|
b10aa422ca | ||
|
|
b706972acb | ||
|
|
5574221044 | ||
|
|
0f4369a9a9 | ||
|
|
0c2e13a453 | ||
|
|
2f817b6633 | ||
|
|
678ed605d7 | ||
|
|
84714ba3bd | ||
|
|
b8963629bf | ||
|
|
47cffeb00a | ||
|
|
b70633ef24 | ||
|
|
145596ac6a | ||
|
|
76607bbad8 | ||
|
|
36113fd54f | ||
|
|
f86ace17d8 | ||
|
|
0e16008085 | ||
|
|
f66a919e08 | ||
|
|
8115fb5e78 | ||
|
|
c9f26dc7ac | ||
|
|
7321f706bb | ||
|
|
9b5f135dae | ||
|
|
dbbdcb0b00 | ||
|
|
06ae1861ee | ||
|
|
e0afd8fadb | ||
|
|
953f838a2a | ||
|
|
bf5f1f0168 | ||
|
|
cdf977ff3f | ||
|
|
ee1dc9dd8e | ||
|
|
7bec68e492 | ||
|
|
97fff02c15 | ||
|
|
b372b2ccf2 | ||
|
|
d00ead932b | ||
|
|
bb2b1b58ec | ||
|
|
ceeea7314c | ||
|
|
9d6a93119b | ||
|
|
08be68cda4 | ||
|
|
3a2081ffed | ||
|
|
57d14d9517 | ||
|
|
c5e693f14a | ||
|
|
a9da047d3a | ||
|
|
171b065db1 | ||
|
|
9da0b7fee3 | ||
|
|
716c9eb46f | ||
|
|
a85c72d859 | ||
|
|
0ba567856e | ||
|
|
7f1eb83dbd | ||
|
|
6e4c1f64d8 | ||
|
|
82aa51770a | ||
|
|
990c77bd3d | ||
|
|
5bb23b2d17 | ||
|
|
9cc05ef838 | ||
|
|
a21e3a1946 | ||
|
|
c05ca1d9fc | ||
|
|
1b05d7269c | ||
|
|
c170970992 | ||
|
|
d19a659871 | ||
|
|
955b24be9d | ||
|
|
de6c7e0117 | ||
|
|
feb8fe9e34 | ||
|
|
aff6d4b36d | ||
|
|
45c60717d6 | ||
|
|
6596e27f69 | ||
|
|
8cba7e91d3 | ||
|
|
3a871cbed8 | ||
|
|
a46fd60788 | ||
|
|
86ebfe8dad | ||
|
|
97735ff548 | ||
|
|
9fdc18d1ec | ||
|
|
4a21882345 | ||
|
|
cb0cea4ebd | ||
|
|
b894daa9cf | ||
|
|
06641a7dd6 | ||
|
|
94f7b570d7 | ||
|
|
ca5605620a | ||
|
|
8d0202113a | ||
|
|
f2e59226c0 | ||
|
|
951086e499 | ||
|
|
d3a26f9b4e | ||
|
|
e1a4478a06 | ||
|
|
ed8009883b | ||
|
|
4fd5dc0ee0 | ||
|
|
1bbb937d9d | ||
|
|
c1fb276937 | ||
|
|
3867d5d62e | ||
|
|
08ab513d4e | ||
|
|
a2eca4f029 | ||
|
|
3121494d4b | ||
|
|
92e81c3dbf | ||
|
|
2761a6dbb3 | ||
|
|
faf24ca7ec | ||
|
|
c5ce44f09d | ||
|
|
6969114675 | ||
|
|
1aba57e6bb | ||
|
|
e9785c8b3d | ||
|
|
03215d8906 | ||
|
|
9a5b19babe | ||
|
|
e5d87e66bf | ||
|
|
e00036d44a | ||
|
|
d8059fd0ee | ||
|
|
6fc7456196 | ||
|
|
0bd96b9c0e | ||
|
|
f502e13edc | ||
|
|
08f55ccb94 | ||
|
|
17ca9722b7 | ||
|
|
8cc9b78e21 | ||
|
|
25b4843327 | ||
|
|
d13edd8f63 | ||
|
|
cdc14586de | ||
|
|
a7f8bf2d8f | ||
|
|
8cd881945a | ||
|
|
579d08e27e | ||
|
|
5148c81dd8 | ||
|
|
40bc844caa | ||
|
|
c990a64ba9 | ||
|
|
f5a0a1ef8c | ||
|
|
58018a086c | ||
|
|
b3a7f5f38b | ||
|
|
435d11793d | ||
|
|
9ec3faa6b3 | ||
|
|
959d61468e | ||
|
|
9f28048742 | ||
|
|
19c9a808cf | ||
|
|
7576f850e9 | ||
|
|
7970b38823 | ||
|
|
b40363be31 | ||
|
|
9a0b924f99 | ||
|
|
52def54cd9 | ||
|
|
8d3b59a0d0 | ||
|
|
b0e7471a83 | ||
|
|
4616065b1d | ||
|
|
14855f3255 | ||
|
|
c40a7f736e | ||
|
|
4e81a7abd3 | ||
|
|
5d8d0b9a01 |
10
.github/ISSUE_TEMPLATE/2-help.md
vendored
10
.github/ISSUE_TEMPLATE/2-help.md
vendored
@@ -1,10 +0,0 @@
|
||||
---
|
||||
name: Need help with Jitsi Meet?
|
||||
about: Please ask it in our community at https://community.jitsi.org
|
||||
|
||||
---
|
||||
|
||||
If you have a question about Jitsi Meet that is not a bug report or feature
|
||||
request, please post it in https://community.jitsi.org
|
||||
|
||||
Questions posted to this repository will be closed.
|
||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Need help with Jitsi Meet?
|
||||
url: https://community.jitsi.org
|
||||
about: Please ask it in our community.
|
||||
16
.github/workflows/ci.yml
vendored
Normal file
16
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
name: Simple CI
|
||||
|
||||
on: [pull_request]
|
||||
|
||||
jobs:
|
||||
run-ci:
|
||||
name: Build Frontend
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: '12.x'
|
||||
- run: npm install
|
||||
- run: npm run lint
|
||||
- run: make
|
||||
2
Makefile
2
Makefile
@@ -84,7 +84,7 @@ dev: deploy-init deploy-css deploy-rnnoise-binary deploy-lib-jitsi-meet deploy-l
|
||||
|
||||
source-package:
|
||||
mkdir -p source_package/jitsi-meet/css && \
|
||||
cp -r *.js *.html connection_optimization favicon.ico fonts images libs static sounds LICENSE lang source_package/jitsi-meet && \
|
||||
cp -r *.js *.html resources/*.txt connection_optimization favicon.ico fonts images libs static sounds LICENSE lang source_package/jitsi-meet && \
|
||||
cp css/all.css source_package/jitsi-meet/css && \
|
||||
(cd source_package ; tar cjf ../jitsi-meet.tar.bz2 jitsi-meet) && \
|
||||
rm -rf source_package
|
||||
|
||||
22
README.md
22
README.md
@@ -1,8 +1,8 @@
|
||||
# Jitsi Meet - Secure, Simple and Scalable Video Conferences
|
||||
|
||||
Jitsi Meet is an open-source (Apache) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, [secure](#security) and scalable video conferences. Jitsi Meet in action can be seen at [here at the session #482 of the VoIP Users Conference](http://youtu.be/7vFUVClsNh0).
|
||||
Jitsi Meet is an open-source (Apache) WebRTC JavaScript application that uses [Jitsi Videobridge](https://jitsi.org/videobridge) to provide high quality, [secure](https://jitsi.org/security) and scalable video conferences. Jitsi Meet in action can be seen at [here at the session #482 of the VoIP Users Conference](http://youtu.be/7vFUVClsNh0).
|
||||
|
||||
The Jitsi Meet client runs in your browser, without installing anything on your computer. You can try it out at https://meet.jit.si .
|
||||
The Jitsi Meet client runs in your browser, without installing anything else on your computer. You can try it out at https://meet.jit.si.
|
||||
|
||||
Jitsi Meet allows very efficient collaboration. Users can stream their desktop or only some windows. It also supports shared document editing with Etherpad.
|
||||
|
||||
@@ -61,25 +61,13 @@ Jitsi Meet provides a very flexible way of embedding in external applications by
|
||||
|
||||
## Security
|
||||
|
||||
WebRTC does not (yet) provide a way of conducting multi-party conversations with end-to-end encryption.
|
||||
Unless you consistently compare DTLS fingerprints with your peers vocally, the same goes for one-to-one calls.
|
||||
As a result, your stream is encrypted on the network but decrypted on the machine that hosts the bridge when using Jitsi Meet.
|
||||
The security section here was starting to feel a bit too succinct for the complexity of the topic, so we created a post that covers the topic much more broadly here: https://jitsi.org/security
|
||||
|
||||
The Jitsi Meet architecture allows you to deploy your own version, including
|
||||
all server components. In that case, your security guarantees will be roughly
|
||||
equivalent to a direct one-to-one WebRTC call. This is the uniqueness of
|
||||
Jitsi Meet in terms of security.
|
||||
|
||||
The [meet.jit.si](https://meet.jit.si) service is maintained by the Jitsi team
|
||||
at [8x8](https://8x8.com).
|
||||
The section on end-to-end encryption in that document is likely going to be one of the key points of interest: https://jitsi.org/security/#e2ee
|
||||
|
||||
## Security issues
|
||||
|
||||
We take security very seriously and develop all Jitsi projects to be secure and safe.
|
||||
|
||||
If you find (or simply suspect) a security issue in any of the Jitsi projects, please send us an email to security@jitsi.org.
|
||||
|
||||
**We encourage responsible disclosure for the sake of our users, so please reach out before posting in a public space.**
|
||||
For information on reporting security vulnerabilities in Jitsi Meet, see [SECURITY.md](./SECURITY.md).
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
---
|
||||
name: Security issues
|
||||
about: Please email security@jitsi.org
|
||||
# Security
|
||||
|
||||
---
|
||||
## Reporting security issuess
|
||||
|
||||
We take security very seriously and develop all Jitsi projects to be secure and safe.
|
||||
|
||||
If you find (or simply suspect) a security issue in any of the Jitsi projects, please send us an email to security@jitsi.org.
|
||||
|
||||
We encourage responsible disclosure for the sake of our users, so please reach out before posting in a public space.
|
||||
**We encourage responsible disclosure for the sake of our users, so please reach out before posting in a public space.**
|
||||
@@ -20,5 +20,5 @@
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
|
||||
appVersion=20.1.0
|
||||
sdkVersion=2.6.0
|
||||
appVersion=20.3.0
|
||||
sdkVersion=2.8.2
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
|
||||
@@ -40,6 +42,8 @@ class AmplitudeModule
|
||||
extends ReactContextBaseJavaModule {
|
||||
|
||||
public static final String NAME = "Amplitude";
|
||||
public static final String JITSI_PREFERENCES = "jitsi-preferences";
|
||||
public static final String AMPLITUDE_DEVICE_ID_KEY = "amplitudeDeviceId";
|
||||
|
||||
public AmplitudeModule(ReactApplicationContext reactContext) {
|
||||
super(reactContext);
|
||||
@@ -58,8 +62,8 @@ class AmplitudeModule
|
||||
Amplitude.getInstance(instanceName).initialize(getCurrentActivity(), apiKey);
|
||||
|
||||
// Set the device ID to something consistent.
|
||||
String android_id
|
||||
= Settings.Secure.getString(getReactApplicationContext().getContentResolver(), Settings.Secure.ANDROID_ID);
|
||||
SharedPreferences sharedPreferences = getReactApplicationContext().getSharedPreferences(JITSI_PREFERENCES, Context.MODE_PRIVATE);
|
||||
String android_id = sharedPreferences.getString(AMPLITUDE_DEVICE_ID_KEY, "");
|
||||
if (!TextUtils.isEmpty(android_id)) {
|
||||
Amplitude.getInstance(instanceName).setDeviceId(android_id);
|
||||
}
|
||||
|
||||
@@ -288,6 +288,7 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
}
|
||||
|
||||
private JitsiMeetConferenceOptions(Parcel in) {
|
||||
serverURL = (URL) in.readSerializable();
|
||||
room = in.readString();
|
||||
subject = in.readString();
|
||||
token = in.readString();
|
||||
@@ -376,6 +377,7 @@ public class JitsiMeetConferenceOptions implements Parcelable {
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
dest.writeSerializable(serverURL);
|
||||
dest.writeString(room);
|
||||
dest.writeString(subject);
|
||||
dest.writeString(token);
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package org.jitsi.meet.sdk;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Build;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
@@ -33,16 +32,11 @@ import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
import com.facebook.react.uimanager.ViewManager;
|
||||
import com.facebook.soloader.SoLoader;
|
||||
|
||||
import com.oney.WebRTCModule.EglUtils;
|
||||
import com.oney.WebRTCModule.RTCVideoViewManager;
|
||||
import com.oney.WebRTCModule.WebRTCModule;
|
||||
|
||||
import org.webrtc.DefaultVideoDecoderFactory;
|
||||
import org.webrtc.EglBase;
|
||||
import org.webrtc.SoftwareVideoDecoderFactory;
|
||||
import org.webrtc.SoftwareVideoEncoderFactory;
|
||||
import org.webrtc.VideoDecoderFactory;
|
||||
import org.webrtc.VideoEncoderFactory;
|
||||
import org.webrtc.audio.AudioDeviceModule;
|
||||
import org.webrtc.audio.JavaAudioDeviceModule;
|
||||
|
||||
@@ -91,22 +85,8 @@ class ReactInstanceManagerHolder {
|
||||
.createAudioDeviceModule();
|
||||
options.setAudioDeviceModule(adm);
|
||||
|
||||
VideoEncoderFactory videoEncoderFactory = new SoftwareVideoEncoderFactory();
|
||||
VideoDecoderFactory videoDecoderFactory = new SoftwareVideoDecoderFactory();
|
||||
|
||||
// Initialize EGL context required for HW acceleration. We are only going to use it for
|
||||
// decoding.
|
||||
// NOTE: We are explicitly skipping Samsung devices because we have observed a high crash
|
||||
// count on them.
|
||||
if (!Build.MANUFACTURER.toLowerCase().contains("samsung")) {
|
||||
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
|
||||
if (eglContext != null) {
|
||||
videoDecoderFactory = new DefaultVideoDecoderFactory(eglContext);
|
||||
}
|
||||
}
|
||||
|
||||
options.setVideoDecoderFactory(videoDecoderFactory);
|
||||
options.setVideoEncoderFactory(videoEncoderFactory);
|
||||
options.setVideoDecoderFactory(new SoftwareVideoDecoderFactory());
|
||||
options.setVideoEncoderFactory(new SoftwareVideoEncoderFactory());
|
||||
|
||||
nativeModules.add(new WebRTCModule(reactContext, options));
|
||||
|
||||
|
||||
159
conference.js
159
conference.js
@@ -2,6 +2,7 @@
|
||||
|
||||
import { openConnection } from './connection';
|
||||
|
||||
import { ENDPOINT_TEXT_MESSAGE_NAME } from './modules/API/constants';
|
||||
import AuthHandler from './modules/UI/authentication/AuthHandler';
|
||||
import Recorder from './modules/recorder/Recorder';
|
||||
|
||||
@@ -18,7 +19,6 @@ import {
|
||||
createDeviceChangedEvent,
|
||||
createStartSilentEvent,
|
||||
createScreenSharingEvent,
|
||||
createStreamSwitchDelayEvent,
|
||||
createTrackMutedEvent,
|
||||
sendAnalytics
|
||||
} from './react/features/analytics';
|
||||
@@ -112,6 +112,7 @@ import {
|
||||
import { getJitsiMeetGlobalNS } from './react/features/base/util';
|
||||
import { showDesktopPicker } from './react/features/desktop-picker';
|
||||
import { appendSuffix } from './react/features/display-name';
|
||||
import { setE2EEKey } from './react/features/e2ee';
|
||||
import {
|
||||
maybeOpenFeedbackDialog,
|
||||
submitFeedback
|
||||
@@ -119,6 +120,7 @@ import {
|
||||
import { mediaPermissionPromptVisibilityChanged } from './react/features/overlay';
|
||||
import { suspendDetected } from './react/features/power-monitor';
|
||||
import { setSharedVideoStatus } from './react/features/shared-video';
|
||||
import { AudioMixerEffect } from './react/features/stream-effects/audio-mixer/AudioMixerEffect';
|
||||
import { createPresenterEffect } from './react/features/stream-effects/presenter';
|
||||
import { endpointMessageReceived } from './react/features/subtitles';
|
||||
import { createRnnoiseProcessorPromise } from './react/features/rnnoise';
|
||||
@@ -643,6 +645,8 @@ export default {
|
||||
init(options) {
|
||||
this.roomName = options.roomName;
|
||||
|
||||
window.addEventListener('hashchange', this.onHashChange.bind(this), false);
|
||||
|
||||
return (
|
||||
|
||||
// Initialize the device list first. This way, when creating tracks
|
||||
@@ -658,10 +662,10 @@ export default {
|
||||
startAudioOnly: config.startAudioOnly,
|
||||
startScreenSharing: config.startScreenSharing,
|
||||
startWithAudioMuted: config.startWithAudioMuted
|
||||
|| config.startSilent
|
||||
|| isUserInteractionRequiredForUnmute(APP.store.getState()),
|
||||
|| config.startSilent
|
||||
|| isUserInteractionRequiredForUnmute(APP.store.getState()),
|
||||
startWithVideoMuted: config.startWithVideoMuted
|
||||
|| isUserInteractionRequiredForUnmute(APP.store.getState())
|
||||
|| isUserInteractionRequiredForUnmute(APP.store.getState())
|
||||
}))
|
||||
.then(([ tracks, con ]) => {
|
||||
tracks.forEach(track => {
|
||||
@@ -1175,6 +1179,34 @@ export default {
|
||||
}));
|
||||
},
|
||||
|
||||
/**
|
||||
* Handled location hash change events.
|
||||
*/
|
||||
onHashChange() {
|
||||
const items = {};
|
||||
const parts = window.location.hash.substr(1).split('&');
|
||||
|
||||
for (const part of parts) {
|
||||
const param = part.split('=');
|
||||
const key = param[0];
|
||||
|
||||
if (!key) {
|
||||
continue; // eslint-disable-line no-continue
|
||||
}
|
||||
|
||||
items[key] = param[1];
|
||||
}
|
||||
|
||||
if (typeof items.e2eekey !== undefined) {
|
||||
APP.store.dispatch(setE2EEKey(items.e2eekey));
|
||||
|
||||
// Clean URL in browser history.
|
||||
const cleanUrl = window.location.href.split('#')[0];
|
||||
|
||||
history.replaceState(history.state, document.title, cleanUrl);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Exposes a Command(s) API on this instance. It is necessitated by (1) the
|
||||
* desire to keep room private to this instance and (2) the need of other
|
||||
@@ -1286,6 +1318,13 @@ export default {
|
||||
options.confID = `${locationURL.host}${locationURL.pathname}`;
|
||||
options.createVADProcessor = createRnnoiseProcessorPromise;
|
||||
|
||||
// Disable CallStats, if requessted.
|
||||
if (options.disableThirdPartyRequests) {
|
||||
delete options.callStatsID;
|
||||
delete options.callStatsSecret;
|
||||
delete options.getWiFiStatsMethod;
|
||||
}
|
||||
|
||||
return options;
|
||||
},
|
||||
|
||||
@@ -1416,7 +1455,7 @@ export default {
|
||||
* in case it fails.
|
||||
* @private
|
||||
*/
|
||||
_turnScreenSharingOff(didHaveVideo) {
|
||||
async _turnScreenSharingOff(didHaveVideo) {
|
||||
this._untoggleScreenSharing = null;
|
||||
this.videoSwitchInProgress = true;
|
||||
const { receiver } = APP.remoteControl;
|
||||
@@ -1445,6 +1484,20 @@ export default {
|
||||
}
|
||||
});
|
||||
|
||||
// If system audio was also shared stop the AudioMixerEffect and dispose of the desktop audio track.
|
||||
if (this._mixerEffect) {
|
||||
await this.localAudio.setEffect(undefined);
|
||||
await this._desktopAudioStream.dispose();
|
||||
this._mixerEffect = undefined;
|
||||
this._desktopAudioStream = undefined;
|
||||
|
||||
// In case there was no local audio when screen sharing was started the fact that we set the audio stream to
|
||||
// null will take care of the desktop audio stream cleanup.
|
||||
} else if (this._desktopAudioStream) {
|
||||
await this.useAudioStream(null);
|
||||
this._desktopAudioStream = undefined;
|
||||
}
|
||||
|
||||
if (didHaveVideo) {
|
||||
promise = promise.then(() => createLocalTracksF({ devices: [ 'video' ] }))
|
||||
.then(([ stream ]) => this.useVideoStream(stream))
|
||||
@@ -1584,26 +1637,31 @@ export default {
|
||||
}
|
||||
});
|
||||
|
||||
return getDesktopStreamPromise.then(([ desktopStream ]) => {
|
||||
return getDesktopStreamPromise.then(desktopStreams => {
|
||||
// Stores the "untoggle" handler which remembers whether was
|
||||
// there any video before and whether was it muted.
|
||||
this._untoggleScreenSharing
|
||||
= this._turnScreenSharingOff.bind(this, didHaveVideo);
|
||||
desktopStream.on(
|
||||
JitsiTrackEvents.LOCAL_TRACK_STOPPED,
|
||||
() => {
|
||||
// If the stream was stopped during screen sharing
|
||||
// session then we should switch back to video.
|
||||
this.isSharingScreen
|
||||
&& this._untoggleScreenSharing
|
||||
&& this._untoggleScreenSharing();
|
||||
}
|
||||
);
|
||||
|
||||
const desktopVideoStream = desktopStreams.find(stream => stream.getType() === MEDIA_TYPE.VIDEO);
|
||||
|
||||
if (desktopVideoStream) {
|
||||
desktopVideoStream.on(
|
||||
JitsiTrackEvents.LOCAL_TRACK_STOPPED,
|
||||
() => {
|
||||
// If the stream was stopped during screen sharing
|
||||
// session then we should switch back to video.
|
||||
this.isSharingScreen
|
||||
&& this._untoggleScreenSharing
|
||||
&& this._untoggleScreenSharing();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
// close external installation dialog on success.
|
||||
externalInstallation && $.prompt.close();
|
||||
|
||||
return desktopStream;
|
||||
return desktopStreams;
|
||||
}, error => {
|
||||
DSExternalInstallationInProgress = false;
|
||||
|
||||
@@ -1754,7 +1812,29 @@ export default {
|
||||
this.videoSwitchInProgress = true;
|
||||
|
||||
return this._createDesktopTrack(options)
|
||||
.then(stream => this.useVideoStream(stream))
|
||||
.then(async streams => {
|
||||
const desktopVideoStream = streams.find(stream => stream.getType() === MEDIA_TYPE.VIDEO);
|
||||
|
||||
if (desktopVideoStream) {
|
||||
await this.useVideoStream(desktopVideoStream);
|
||||
}
|
||||
|
||||
this._desktopAudioStream = streams.find(stream => stream.getType() === MEDIA_TYPE.AUDIO);
|
||||
|
||||
if (this._desktopAudioStream) {
|
||||
// If there is a localAudio stream, mix in the desktop audio stream captured by the screen sharing
|
||||
// api.
|
||||
if (this.localAudio) {
|
||||
this._mixerEffect = new AudioMixerEffect(this._desktopAudioStream);
|
||||
|
||||
await this.localAudio.setEffect(this._mixerEffect);
|
||||
} else {
|
||||
// If no local stream is present ( i.e. no input audio devices) we use the screen share audio
|
||||
// stream as we would use a regular stream.
|
||||
await this.useAudioStream(this._desktopAudioStream);
|
||||
}
|
||||
}
|
||||
})
|
||||
.then(() => {
|
||||
this.videoSwitchInProgress = false;
|
||||
if (config.enableScreenshotCapture) {
|
||||
@@ -2041,7 +2121,22 @@ export default {
|
||||
|
||||
room.on(
|
||||
JitsiConferenceEvents.ENDPOINT_MESSAGE_RECEIVED,
|
||||
(...args) => APP.store.dispatch(endpointMessageReceived(...args)));
|
||||
(...args) => {
|
||||
APP.store.dispatch(endpointMessageReceived(...args));
|
||||
if (args && args.length >= 2) {
|
||||
const [ sender, eventData ] = args;
|
||||
|
||||
if (eventData.name === ENDPOINT_TEXT_MESSAGE_NAME) {
|
||||
APP.API.notifyEndpointTextMessageReceived({
|
||||
senderInfo: {
|
||||
jid: sender._jid,
|
||||
id: sender._id
|
||||
},
|
||||
eventData
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
room.on(
|
||||
JitsiConferenceEvents.LOCK_STATE_CHANGED,
|
||||
@@ -2167,18 +2262,6 @@ export default {
|
||||
});
|
||||
});
|
||||
|
||||
/* eslint-disable max-params */
|
||||
APP.UI.addListener(
|
||||
UIEvents.RESOLUTION_CHANGED,
|
||||
(id, oldResolution, newResolution, delay) => {
|
||||
sendAnalytics(createStreamSwitchDelayEvent(
|
||||
{
|
||||
'old_resolution': oldResolution,
|
||||
'new_resolution': newResolution,
|
||||
value: delay
|
||||
}));
|
||||
});
|
||||
|
||||
APP.UI.addListener(UIEvents.AUTH_CLICKED, () => {
|
||||
AuthHandler.authenticate(room);
|
||||
});
|
||||
@@ -2272,7 +2355,17 @@ export default {
|
||||
|
||||
return stream;
|
||||
})
|
||||
.then(stream => this.useAudioStream(stream))
|
||||
.then(async stream => {
|
||||
// In case screen sharing audio is also shared we mix it with new input stream. The old _mixerEffect
|
||||
// will be cleaned up when the existing track is replaced.
|
||||
if (this._mixerEffect) {
|
||||
this._mixerEffect = new AudioMixerEffect(this._desktopAudioStream);
|
||||
|
||||
await stream.setEffect(this._mixerEffect);
|
||||
}
|
||||
|
||||
return this.useAudioStream(stream);
|
||||
})
|
||||
.then(() => {
|
||||
logger.log(`switched local audio device: ${this.localAudio?.getDeviceId()}`);
|
||||
|
||||
@@ -2736,7 +2829,7 @@ export default {
|
||||
leaveRoomAndDisconnect() {
|
||||
APP.store.dispatch(conferenceWillLeave(room));
|
||||
|
||||
if (room.isJoined()) {
|
||||
if (room && room.isJoined()) {
|
||||
return room.leave().then(disconnect, disconnect);
|
||||
}
|
||||
|
||||
|
||||
62
config.js
62
config.js
@@ -44,9 +44,6 @@ var config = {
|
||||
//
|
||||
|
||||
testing: {
|
||||
// Enables experimental simulcast support on Firefox.
|
||||
enableFirefoxSimulcast: false,
|
||||
|
||||
// P2P test mode disables automatic switching to P2P when there are 2
|
||||
// participants in the conference.
|
||||
p2pTestMode: false
|
||||
@@ -110,12 +107,11 @@ var config = {
|
||||
|
||||
// w3c spec-compliant video constraints to use for video capture. Currently
|
||||
// used by browsers that return true from lib-jitsi-meet's
|
||||
// util#browser#usesNewGumFlow. The constraints are independency from
|
||||
// this config's resolution value. Defaults to requesting an ideal aspect
|
||||
// ratio of 16:9 with an ideal resolution of 720.
|
||||
// util#browser#usesNewGumFlow. The constraints are independent from
|
||||
// this config's resolution value. Defaults to requesting an ideal
|
||||
// resolution of 720p.
|
||||
// constraints: {
|
||||
// video: {
|
||||
// aspectRatio: 16 / 9,
|
||||
// height: {
|
||||
// ideal: 720,
|
||||
// max: 720,
|
||||
@@ -311,10 +307,10 @@ var config = {
|
||||
// callStatsSecret: '',
|
||||
|
||||
// enables sending participants display name to callstats
|
||||
// enableDisplayNameInStats: false
|
||||
// enableDisplayNameInStats: false,
|
||||
|
||||
// enables sending participants email if available to callstats and other analytics
|
||||
// enableEmailInStats: false
|
||||
// enableEmailInStats: false,
|
||||
|
||||
// Privacy
|
||||
//
|
||||
@@ -343,10 +339,8 @@ var config = {
|
||||
// The STUN servers that will be used in the peer to peer connections
|
||||
stunServers: [
|
||||
|
||||
// { urls: 'stun:jitsi-meet.example.com:443' },
|
||||
{ urls: 'stun:stun.l.google.com:19302' },
|
||||
{ urls: 'stun:stun1.l.google.com:19302' },
|
||||
{ urls: 'stun:stun2.l.google.com:19302' }
|
||||
// { urls: 'stun:jitsi-meet.example.com:4446' },
|
||||
{ urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' }
|
||||
],
|
||||
|
||||
// Sets the ICE transport policy for the p2p connection. At the time
|
||||
@@ -390,7 +384,10 @@ var config = {
|
||||
// shard: "shard1",
|
||||
// region: "europe",
|
||||
// userRegion: "asia"
|
||||
}
|
||||
},
|
||||
|
||||
// Decides whether the start/stop recording audio notifications should play on record.
|
||||
// disableRecordAudioNotification: false,
|
||||
|
||||
// Information for the chrome extension banner
|
||||
// chromeExtensionBanner: {
|
||||
@@ -404,7 +401,7 @@ var config = {
|
||||
// path: 'jitsi-logo-48x48.png'
|
||||
// }
|
||||
// ]
|
||||
// }
|
||||
// },
|
||||
|
||||
// Local Recording
|
||||
//
|
||||
@@ -422,7 +419,7 @@ var config = {
|
||||
// format: 'flac'
|
||||
//
|
||||
|
||||
// }
|
||||
// },
|
||||
|
||||
// Options related to end-to-end (participant to participant) ping.
|
||||
// e2eping: {
|
||||
@@ -434,22 +431,30 @@ var config = {
|
||||
// // with the measured RTT will be sent. Defaults to 60000, set
|
||||
// // to <= 0 to disable.
|
||||
// analyticsInterval: 60000,
|
||||
// }
|
||||
// },
|
||||
|
||||
// If set, will attempt to use the provided video input device label when
|
||||
// triggering a screenshare, instead of proceeding through the normal flow
|
||||
// for obtaining a desktop stream.
|
||||
// NOTE: This option is experimental and is currently intended for internal
|
||||
// use only.
|
||||
// _desktopSharingSourceDevice: 'sample-id-or-label'
|
||||
// _desktopSharingSourceDevice: 'sample-id-or-label',
|
||||
|
||||
// If true, any checks to handoff to another application will be prevented
|
||||
// and instead the app will continue to display in the current browser.
|
||||
// disableDeepLinking: false
|
||||
// disableDeepLinking: false,
|
||||
|
||||
// A property to disable the right click context menu for localVideo
|
||||
// the menu has option to flip the locally seen video for local presentations
|
||||
// disableLocalVideoFlip: false
|
||||
// disableLocalVideoFlip: false,
|
||||
|
||||
// Mainly privacy related settings
|
||||
|
||||
// Disables all invite functions from the app (share, invite, dial out...etc)
|
||||
// disableInviteFunctions: true,
|
||||
|
||||
// Disables storing the room name to the recents list
|
||||
// doNotStoreRoom: true,
|
||||
|
||||
// Deployment specific URLs.
|
||||
// deploymentUrls: {
|
||||
@@ -459,7 +464,16 @@ var config = {
|
||||
// // If specified a 'Download our apps' button will be displayed in the overflow menu with a link
|
||||
// // to the specified URL for an app download page.
|
||||
// downloadAppsUrl: 'https://docs.example.com/our-apps.html'
|
||||
// }
|
||||
// },
|
||||
|
||||
// Options related to the remote participant menu.
|
||||
// remoteVideoMenu: {
|
||||
// // If set to true the 'Kick out' button will be disabled.
|
||||
// disableKick: true
|
||||
// },
|
||||
|
||||
// If set to true all muting operations of remote participants will be disabled.
|
||||
// disableRemoteMute: true,
|
||||
|
||||
// List of undocumented settings used in jitsi-meet
|
||||
/**
|
||||
@@ -511,6 +525,12 @@ var config = {
|
||||
startBitrate
|
||||
*/
|
||||
|
||||
|
||||
// Allow all above example options to include a trailing comma and
|
||||
// prevent fear when commenting out the last value.
|
||||
makeJsonParserHappy: 'even if last key had a trailing comma'
|
||||
|
||||
// no configuration value should follow this line.
|
||||
};
|
||||
|
||||
/* eslint-enable no-unused-vars, no-var */
|
||||
|
||||
135
css/_audio-preview.css
Normal file
135
css/_audio-preview.css
Normal file
@@ -0,0 +1,135 @@
|
||||
.audio-preview {
|
||||
&-content {
|
||||
font-size: 15px;
|
||||
line-height: 24px;
|
||||
max-height: 456px;
|
||||
overflow: auto;
|
||||
width: 328px;
|
||||
}
|
||||
|
||||
&-header {
|
||||
color: #fff;
|
||||
display: flex;
|
||||
padding: 16px;
|
||||
|
||||
&-icon {
|
||||
color: #A4B8D1;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
&-text {
|
||||
font-weight: bold;
|
||||
margin-left: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
&-entry {
|
||||
align-items: center;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
padding: 12px 0;
|
||||
margin-left: 48px;
|
||||
|
||||
&--selected {
|
||||
background: rgba(28,32,37,0.5);
|
||||
cursor: initial;
|
||||
margin-left: 0;
|
||||
padding-left: 21px;
|
||||
}
|
||||
|
||||
&-text {
|
||||
color: #fff;
|
||||
font-size: 15px;
|
||||
display: inline-block;
|
||||
line-height: 24px;
|
||||
text-overflow: ellipsis;
|
||||
max-width: 213px;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
&-speaker {
|
||||
position: relative;
|
||||
|
||||
&:hover {
|
||||
.audio-preview-entry {
|
||||
background: rgba(255,255,255, 0.2);
|
||||
margin-left: 0;
|
||||
padding-left: 48px;
|
||||
|
||||
&--selected {
|
||||
padding-left: 21px;
|
||||
}
|
||||
}
|
||||
|
||||
.audio-preview-test-button {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.audio-preview-entry-text {
|
||||
max-width: 196px;
|
||||
}
|
||||
}
|
||||
|
||||
.audio-preview-entry-text {
|
||||
max-width: 256px;
|
||||
}
|
||||
}
|
||||
|
||||
&-microphone {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
|
||||
&-icon {
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
width: 14px;
|
||||
|
||||
& svg {
|
||||
fill: #1C2025;
|
||||
}
|
||||
|
||||
&--check {
|
||||
background: #31B76A;
|
||||
margin-right: 13px;
|
||||
}
|
||||
|
||||
&--exclamation {
|
||||
margin-left: 6px;
|
||||
& svg {
|
||||
fill: #E54B4B;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-test-button {
|
||||
display: none;
|
||||
background: #FFF;
|
||||
border: 1px solid #D1DBE8;
|
||||
border-radius: 3px;
|
||||
color: #1C2025;
|
||||
cursor: pointer;
|
||||
font-weight: 600;
|
||||
font-size: 15px;
|
||||
line-height: 24px;
|
||||
padding: 4px 16px;
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 8px;
|
||||
}
|
||||
|
||||
&-meter-mic {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
top: 18px;
|
||||
}
|
||||
|
||||
// Override @atlaskit/InlineDialog container which is made with styled components
|
||||
& > div > div:nth-child(2) > div > div {
|
||||
outline: none;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
@@ -20,18 +20,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
.avatar-foreign {
|
||||
align-items: center;
|
||||
bottom: 0;
|
||||
display: flex;
|
||||
font-size: 40pt;
|
||||
justify-content: center;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.avatar-svg {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
@@ -63,4 +51,4 @@
|
||||
@include avatarBadge;
|
||||
background-color: $presence-idle;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
30
css/_meter.css
Normal file
30
css/_meter.css
Normal file
@@ -0,0 +1,30 @@
|
||||
.jitsi-icon {
|
||||
&.metr {
|
||||
display: inline-block;
|
||||
|
||||
& > svg {
|
||||
fill: #4E5E6C;
|
||||
width: 38px;
|
||||
}
|
||||
}
|
||||
|
||||
&.metr--disabled {
|
||||
& > svg {
|
||||
fill: #4E5E6C;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.metr-l-0 {
|
||||
rect:first-child {
|
||||
fill: #31B76A;
|
||||
}
|
||||
}
|
||||
|
||||
@for $i from 1 through 7 {
|
||||
.metr-l-#{$i} {
|
||||
rect:nth-child(-n+#{$i+1}) {
|
||||
fill: #31B76A;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -71,6 +71,11 @@
|
||||
display: flex;
|
||||
margin-top: 5px;
|
||||
text-align: right;
|
||||
flex-direction: column;
|
||||
|
||||
.help-container {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
.live-stream-cta {
|
||||
|
||||
79
css/_settings-button.scss
Normal file
79
css/_settings-button.scss
Normal file
@@ -0,0 +1,79 @@
|
||||
.settings-button {
|
||||
&-container {
|
||||
position: relative;
|
||||
|
||||
.toolbox-icon {
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
background-color: #fff;
|
||||
border-radius: 50%;
|
||||
border: 1px solid #d1dbe8;
|
||||
justify-content: center;
|
||||
width: 38px;
|
||||
height: 38px;
|
||||
|
||||
&:hover {
|
||||
background-color: #daebfa;
|
||||
border: 1px solid #daebfa;
|
||||
}
|
||||
|
||||
&.toggled {
|
||||
background: #2a3a4b;
|
||||
border: 1px solid #5e6d7a;
|
||||
|
||||
svg {
|
||||
fill: #fff;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: #5e6d7a;
|
||||
}
|
||||
}
|
||||
|
||||
&.disabled, .disabled & {
|
||||
cursor: initial;
|
||||
color: #fff;
|
||||
background-color: #a4b8d1;
|
||||
}
|
||||
|
||||
svg {
|
||||
fill: #5e6d7a;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-small-icon {
|
||||
background: #FFF;
|
||||
border: 1px solid rgba(0, 0, 0, 0.2);
|
||||
border-radius: 50%;
|
||||
bottom: 0;
|
||||
box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.25);
|
||||
cursor: pointer;
|
||||
height: 16px;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
right: 4px;
|
||||
width: 16px;
|
||||
|
||||
&> svg {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
&--disabled {
|
||||
background-color: #a4b8d1;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
&--hovered {
|
||||
bottom: -1px;
|
||||
height: 20px;
|
||||
right: 2px;
|
||||
width: 20px;
|
||||
|
||||
&> svg {
|
||||
margin-top: 6px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
66
css/_video-preview.css
Normal file
66
css/_video-preview.css
Normal file
@@ -0,0 +1,66 @@
|
||||
.video-preview {
|
||||
background: none;
|
||||
max-height: 290px;
|
||||
overflow: auto;
|
||||
|
||||
&-entry {
|
||||
cursor: pointer;
|
||||
height: 135px;
|
||||
margin-bottom: 16px;
|
||||
position: relative;
|
||||
width: 240px;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
&--selected {
|
||||
border: 3px solid #31B76A;
|
||||
cursor: default;
|
||||
height: 129px;
|
||||
width: 234px;
|
||||
}
|
||||
}
|
||||
|
||||
&-video {
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-overlay {
|
||||
background: rgba(42, 58, 75, 0.6);
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
&-error {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
height: 100%;
|
||||
justify-content: center;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-label {
|
||||
color: #fff;
|
||||
font-size: 13px;
|
||||
line-height: 20px;
|
||||
overflow: hidden;
|
||||
padding: 8px;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
text-overflow: ellipsis;
|
||||
width: 220px;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
// Override @atlaskit/InlineDialog container which is made with styled components
|
||||
& > div > div:nth-child(2) > div > div {
|
||||
outline: none;
|
||||
padding: 16px;
|
||||
}
|
||||
}
|
||||
@@ -15,8 +15,9 @@
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100vh;
|
||||
height: calc(100vh - 200px);
|
||||
width: 100vw;
|
||||
margin: 100px 0px;
|
||||
}
|
||||
|
||||
.filmstrip__videos .videocontainer {
|
||||
@@ -77,9 +78,9 @@
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
height: 100vh;
|
||||
margin-top: auto;
|
||||
margin-bottom: auto;
|
||||
justify-content: center;
|
||||
padding: 100px 0;
|
||||
|
||||
.videocontainer {
|
||||
border: 0;
|
||||
|
||||
@@ -86,5 +86,9 @@ $flagsImagePath: "../images/";
|
||||
@import 'avatar';
|
||||
@import 'promotional-footer';
|
||||
@import 'chrome-extension-banner';
|
||||
@import 'settings-button';
|
||||
@import 'meter';
|
||||
@import 'audio-preview';
|
||||
@import 'video-preview';
|
||||
|
||||
/* Modules END */
|
||||
|
||||
@@ -164,6 +164,13 @@
|
||||
background: #B8C7E0;
|
||||
}
|
||||
|
||||
.circular-label.e2ee {
|
||||
align-items: center;
|
||||
background: #76CF9C;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.circular-label.file {
|
||||
background: #FF5630;
|
||||
}
|
||||
|
||||
2
debian/compat
vendored
2
debian/compat
vendored
@@ -1 +1 @@
|
||||
8
|
||||
12
|
||||
|
||||
12
debian/control
vendored
12
debian/control
vendored
@@ -16,8 +16,7 @@ Description: WebRTC JavaScript video conferences
|
||||
Videobridge to provide high quality, scalable video conferences.
|
||||
.
|
||||
It is a web interface to Jitsi Videobridge for audio and video
|
||||
forwarding and relaying, configured to work with jetty instance
|
||||
running embedded into Jitsi Videobridge
|
||||
forwarding and relaying.
|
||||
|
||||
Package: jitsi-meet-web-config
|
||||
Architecture: all
|
||||
@@ -27,9 +26,7 @@ Description: Configuration for web serving of Jitsi Meet
|
||||
Videobridge to provide high quality, scalable video conferences.
|
||||
.
|
||||
It is a web interface to Jitsi Videobridge for audio and video
|
||||
forwarding and relaying, configured to work with jetty instance
|
||||
running embedded into Jitsi Videobridge or using a webserver Nginx or
|
||||
Apache2.
|
||||
forwarding and relaying, using a webserver Nginx or Apache2.
|
||||
.
|
||||
This package contains configuration for Nginx to be used with
|
||||
Jitsi Meet.
|
||||
@@ -43,8 +40,7 @@ Description: Prosody configuration for Jitsi Meet
|
||||
Videobridge to provide high quality, scalable video conferences.
|
||||
.
|
||||
It is a web interface to Jitsi Videobridge for audio and video
|
||||
forwarding and relaying, configured to work with jetty instance
|
||||
running embedded into Jitsi Videobridge
|
||||
forwarding and relaying.
|
||||
.
|
||||
This package contains configuration for Prosody to be used with
|
||||
Jitsi Meet.
|
||||
@@ -56,5 +52,7 @@ Description: Prosody token authentication plugin for Jitsi Meet
|
||||
|
||||
Package: jitsi-meet-turnserver
|
||||
Architecture: all
|
||||
Breaks: apache2
|
||||
Pre-Depends: jitsi-meet-web-config
|
||||
Depends: ${misc:Depends}, nginx (>= 1.13.10) | nginx-full (>= 1.13.10) | nginx-extras (>= 1.13.10), jitsi-meet-prosody, coturn, dnsutils
|
||||
Description: Configures coturn to be used with Jitsi Meet
|
||||
|
||||
24
debian/jitsi-meet-prosody.postinst
vendored
24
debian/jitsi-meet-prosody.postinst
vendored
@@ -17,6 +17,9 @@ set -e
|
||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
function generateRandomPassword() {
|
||||
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 16
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
configure)
|
||||
@@ -51,7 +54,7 @@ case "$1" in
|
||||
db_get jicofo/jicofo-authpassword
|
||||
if [ -z "$RET" ] ; then
|
||||
# if password is missing generate it, and store it
|
||||
JICOFO_AUTH_PASSWORD=`head -c 8 /dev/urandom | tr '\0-\377' 'a-zA-Z0-9a-zA-Z0-9a-zA-Z0-9a-zA-Z0-9@@@@####'`
|
||||
JICOFO_AUTH_PASSWORD=`generateRandomPassword`
|
||||
db_set jicofo/jicofo-authpassword "$JICOFO_AUTH_PASSWORD"
|
||||
else
|
||||
JICOFO_AUTH_PASSWORD="$RET"
|
||||
@@ -60,7 +63,7 @@ case "$1" in
|
||||
db_get jicofo/jicofosecret
|
||||
if [ -z "$RET" ] ; then
|
||||
# if secret is missing generate it, and store it
|
||||
JICOFO_SECRET=`head -c 8 /dev/urandom | tr '\0-\377' 'a-zA-Z0-9a-zA-Z0-9a-zA-Z0-9a-zA-Z0-9@@@@####'`
|
||||
JICOFO_SECRET=`generateRandomPassword`
|
||||
db_set jicofo/jicofosecret "$JICOFO_SECRET"
|
||||
else
|
||||
JICOFO_SECRET="$RET"
|
||||
@@ -83,7 +86,7 @@ case "$1" in
|
||||
db_get jitsi-meet-prosody/turn-secret
|
||||
if [ -z "$RET" ] ; then
|
||||
# 8-chars random secret used for the turnserver
|
||||
TURN_SECRET=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1`
|
||||
TURN_SECRET=`generateRandomPassword`
|
||||
db_set jitsi-meet-prosody/turn-secret "$TURN_SECRET"
|
||||
else
|
||||
TURN_SECRET="$RET"
|
||||
@@ -134,9 +137,9 @@ case "$1" in
|
||||
# as we are migrating configs
|
||||
if [ -f $PROSODY_HOST_CONFIG ] && ! grep -q "internal.auth.$JVB_HOSTNAME" $PROSODY_HOST_CONFIG; then
|
||||
echo -e "\nComponent \"internal.auth.$JVB_HOSTNAME\" \"muc\"" >> $PROSODY_HOST_CONFIG
|
||||
echo -e " storage = \"null\"" >> $PROSODY_HOST_CONFIG
|
||||
echo -e " storage = \"memory\"" >> $PROSODY_HOST_CONFIG
|
||||
echo -e " modules_enabled = { \"ping\"; }" >> $PROSODY_HOST_CONFIG
|
||||
echo -e " admins = { \"focusUser@auth.jitmeet.example.com\", \"jvb@auth.jitmeet.example.com\" }" >> $PROSODY_HOST_CONFIG
|
||||
echo -e " admins = { \"$JICOFO_AUTH_USER@auth.$JVB_HOSTNAME\", \"jvb@auth.$JVB_HOSTNAME\" }" >> $PROSODY_HOST_CONFIG
|
||||
fi
|
||||
|
||||
if [ ! -f /var/lib/prosody/$JVB_HOSTNAME.crt ]; then
|
||||
@@ -148,14 +151,13 @@ case "$1" in
|
||||
ln -sf /var/lib/prosody/$JVB_HOSTNAME.crt /etc/prosody/certs/$JVB_HOSTNAME.crt
|
||||
fi
|
||||
|
||||
PR11_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-0.11' 2>/dev/null | awk '{print $3}' || true)"
|
||||
PRTRUNK_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-trunk' 2>/dev/null | awk '{print $3}' || true)"
|
||||
PR10_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-0.10' 2>/dev/null | awk '{print $3}' || true)"
|
||||
PR_VER_INSTALLED=$(dpkg-query -f='${Version}\n' --show prosody 2>/dev/null || true)
|
||||
if [ "$PR11_INSTALL_CHECK" = "installed" ] \
|
||||
|| [ "$PR11_INSTALL_CHECK" = "unpacked" ] \
|
||||
|| dpkg --compare-versions "$PR_VER_INSTALLED" gt "0.11" ; then
|
||||
if [ "$PRTRUNK_INSTALL_CHECK" = "installed" ] \
|
||||
|| [ "$PRTRUNK_INSTALL_CHECK" = "unpacked" ] ; then
|
||||
if [ -f $PROSODY_HOST_CONFIG ]; then
|
||||
sed -i 's/storage = \"null\"/storage = \"memory\"/g' $PROSODY_HOST_CONFIG
|
||||
sed -i 's/storage = \"memory\"/storage = \"null\"/g' $PROSODY_HOST_CONFIG
|
||||
|
||||
# trigger a restart
|
||||
PROSODY_CONFIG_PRESENT="false"
|
||||
@@ -168,7 +170,7 @@ case "$1" in
|
||||
# if the version is 0.10.X (>0.10 and <0.11)
|
||||
if [ -f $PROSODY_HOST_CONFIG ] \
|
||||
&& dpkg --compare-versions "$PR_VER_INSTALLED" lt "0.11" ; then
|
||||
sed -i 's/storage = \"null\"/storage = \"none\"/g' $PROSODY_HOST_CONFIG
|
||||
sed -i 's/storage = \"memory\"/storage = \"none\"/g' $PROSODY_HOST_CONFIG
|
||||
|
||||
# trigger a restart
|
||||
PROSODY_CONFIG_PRESENT="false"
|
||||
|
||||
10
debian/jitsi-meet-prosody.postrm
vendored
10
debian/jitsi-meet-prosody.postrm
vendored
@@ -36,13 +36,17 @@ case "$1" in
|
||||
rm -f /etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua
|
||||
rm -f /etc/prosody/conf.d/$JVB_HOSTNAME.cfg.lua
|
||||
|
||||
JICOFO_AUTH_DOMAIN="auth.$JVB_HOSTNAME"
|
||||
# clean up generated certificates
|
||||
rm -f /etc/prosody/certs/$JVB_HOSTNAME.crt
|
||||
rm -f /etc/prosody/certs/$JVB_HOSTNAME.key
|
||||
rm -f /etc/prosody/certs/auth.$JVB_HOSTNAME.crt
|
||||
rm -f /etc/prosody/certs/auth.$JVB_HOSTNAME.key
|
||||
rm -rf /var/lib/prosody/auth.$JVB_HOSTNAME.*
|
||||
rm -f /etc/prosody/certs/$JICOFO_AUTH_DOMAIN.crt
|
||||
rm -f /etc/prosody/certs/$JICOFO_AUTH_DOMAIN.key
|
||||
rm -rf /var/lib/prosody/$JICOFO_AUTH_DOMAIN.*
|
||||
rm -rf /var/lib/prosody/$JVB_HOSTNAME.*
|
||||
|
||||
# clean created users
|
||||
rm -rf /var/lib/prosody/`echo $JICOFO_AUTH_DOMAIN | sed -e "s/\./%2e/g"`
|
||||
fi
|
||||
|
||||
# Clear the debconf variable
|
||||
|
||||
13
debian/jitsi-meet-tokens.postinst
vendored
13
debian/jitsi-meet-tokens.postinst
vendored
@@ -69,12 +69,15 @@ case "$1" in
|
||||
echo "Failed to install basexx - try installing it manually"
|
||||
fi
|
||||
|
||||
PR11_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-0.11' 2>/dev/null | awk '{print $3}' || true)"
|
||||
PR10_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-0.10' 2>/dev/null | awk '{print $3}' || true)"
|
||||
PRTRUNK_INSTALL_CHECK="$(dpkg-query -f '${Status}' -W 'prosody-trunk' 2>/dev/null | awk '{print $3}' || true)"
|
||||
PR_VER_INSTALLED=$(dpkg-query -f='${Version}\n' --show prosody 2>/dev/null || true)
|
||||
if [ "$PR11_INSTALL_CHECK" = "installed" ] \
|
||||
|| [ "$PR11_INSTALL_CHECK" = "unpacked" ] \
|
||||
|| dpkg --compare-versions "$PR_VER_INSTALLED" gt "0.11" ; then
|
||||
sed -i 's/module:hook/module:hook_global/g' /usr/share/jitsi-meet/prosody-plugins/mod_auth_token.lua
|
||||
if [ "$PR10_INSTALL_CHECK" = "installed" ] \
|
||||
|| "$PR10_INSTALL_CHECK" = "unpacked" \
|
||||
|| "$PRTRUNK_INSTALL_CHECK" = "installed" \
|
||||
|| "$PRTRUNK_INSTALL_CHECK" = "unpacked" \
|
||||
|| dpkg --compare-versions "$PR_VER_INSTALLED" lt "0.11" ; then
|
||||
sed -i 's/module:hook_global(/module:hook(/g' /usr/share/jitsi-meet/prosody-plugins/mod_auth_token.lua
|
||||
fi
|
||||
|
||||
if [ -x "/etc/init.d/prosody" ]; then
|
||||
|
||||
5
debian/jitsi-meet-turnserver.install
vendored
5
debian/jitsi-meet-turnserver.install
vendored
@@ -1,2 +1,3 @@
|
||||
doc/debian/jitsi-meet-turn/turnserver.conf /usr/share/jitsi-meet-turnserver/
|
||||
doc/debian/jitsi-meet/jitsi-meet.conf /usr/share/jitsi-meet-turnserver/
|
||||
doc/debian/jitsi-meet-turn/turnserver.conf /usr/share/jitsi-meet-turnserver/
|
||||
doc/debian/jitsi-meet/jitsi-meet.conf /usr/share/jitsi-meet-turnserver/
|
||||
doc/debian/jitsi-meet-turn/coturn-certbot-deploy.sh /usr/share/jitsi-meet-turnserver/
|
||||
|
||||
1
debian/jitsi-meet-turnserver.links
vendored
1
debian/jitsi-meet-turnserver.links
vendored
@@ -1 +0,0 @@
|
||||
/usr/share/jitsi-meet-turnserver/jitsi-meet.conf /etc/nginx/modules-enabled/60-jitsi-meet.conf
|
||||
128
debian/jitsi-meet-turnserver.postinst
vendored
128
debian/jitsi-meet-turnserver.postinst
vendored
@@ -36,20 +36,60 @@ case "$1" in
|
||||
NGINX_CONFIG="/etc/nginx/sites-available/$JVB_HOSTNAME.conf"
|
||||
JITSI_MEET_CONFIG="/etc/jitsi/meet/$JVB_HOSTNAME-config.js"
|
||||
|
||||
NGINX_SITES_ENABLED="/etc/nginx/sites-enabled/"
|
||||
NGINX_CONFIG_ENABLED="${NGINX_SITES_ENABLED}${JVB_HOSTNAME}.conf"
|
||||
NGINX_MULTIPLEXING="true"
|
||||
for site in ${NGINX_SITES_ENABLED}*; do
|
||||
# if it is not a file continue
|
||||
[ -f "${site}" ] || continue
|
||||
# if it is our config skip
|
||||
[ "${site}" != "${NGINX_CONFIG_ENABLED}" ] || continue
|
||||
# check whether other enabled hosts has listen 443
|
||||
if cat ${site} | grep -v "^[[:space:]]*#" | grep listen | grep -q "^.*[[:space:]:]443[;[:space:]].*" ; then
|
||||
# nothing to do
|
||||
echo "------------------------------------------------"
|
||||
echo ""
|
||||
echo "turnserver is listening on tcp 4445 as other nginx sites use port 443"
|
||||
echo ""
|
||||
echo "------------------------------------------------"
|
||||
NGINX_MULTIPLEXING="false"
|
||||
fi
|
||||
done
|
||||
|
||||
# if there was a turn config backup it so we can configure
|
||||
# we cannot recognize at the moment is this a user config or default config when installing coturn
|
||||
if [[ -f $TURN_CONFIG ]] && ! grep -q "jitsi-meet coturn config" "$TURN_CONFIG" ; then
|
||||
mv $TURN_CONFIG $TURN_CONFIG.bak
|
||||
fi
|
||||
|
||||
# detect dpkg-reconfigure, just delete old links
|
||||
db_get jitsi-meet-turnserver/jvb-hostname
|
||||
JVB_HOSTNAME_OLD=$RET
|
||||
if [ -n "$RET" ] && [ ! "$JVB_HOSTNAME_OLD" = "$JVB_HOSTNAME" ] ; then
|
||||
rm -f $TURN_CONFIG
|
||||
if [[ -f $TURN_CONFIG ]] && grep -q "jitsi-meet coturn config" "$TURN_CONFIG" ; then
|
||||
rm -f $TURN_CONFIG
|
||||
fi
|
||||
fi
|
||||
|
||||
# this detect only old installations with no nginx
|
||||
db_get jitsi-meet/jvb-serve || true
|
||||
if [ ! -f $NGINX_CONFIG -o "$RET" = "true" ] ; then
|
||||
# nothing to do
|
||||
echo "------------------------------------------------"
|
||||
echo ""
|
||||
echo "turnserver not configured as no nginx found to multiplex traffic"
|
||||
echo "turnserver not configured"
|
||||
echo ""
|
||||
echo "------------------------------------------------"
|
||||
db_stop
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ -f $TURN_CONFIG ]] ; then
|
||||
echo "------------------------------------------------"
|
||||
echo ""
|
||||
echo "turnserver is already configured on this machine, skipping."
|
||||
echo ""
|
||||
echo "------------------------------------------------"
|
||||
db_stop
|
||||
exit 0
|
||||
fi
|
||||
@@ -65,45 +105,61 @@ case "$1" in
|
||||
fi
|
||||
TURN_SECRET="$RET"
|
||||
|
||||
if [[ -f $TURN_CONFIG ]] && ! grep -q "jitsi-meet coturn config" "$TURN_CONFIG" ; then
|
||||
PUBLIC_IP=$(dig +short myip.opendns.com @resolver1.opendns.com)
|
||||
cp /usr/share/jitsi-meet-turnserver/turnserver.conf $TURN_CONFIG
|
||||
sed -i "s/jitsi-meet.example.com/$JVB_HOSTNAME/g" $TURN_CONFIG
|
||||
sed -i "s/__turnSecret__/$TURN_SECRET/g" $TURN_CONFIG
|
||||
sed -i "s/__external_ip_address__/$JVB_HOSTNAME/g" $TURN_CONFIG
|
||||
# no turn config exists, lt's copy template and fill it in
|
||||
PUBLIC_IP=$(dig +short myip.opendns.com @resolver1.opendns.com) || true
|
||||
if [ -z "$PUBLIC_IP" ] ; then
|
||||
PUBLIC_IP="127.0.0.1"
|
||||
echo "------------------------------------------------"
|
||||
echo "Warning! Could not resolve your external ip address! Error:^"
|
||||
echo "Your turn server will not work till you edit your $TURN_CONFIG config file."
|
||||
echo "You need to set your external ip address in external-ip and restart coturn service."
|
||||
echo "------------------------------------------------"
|
||||
fi
|
||||
cp /usr/share/jitsi-meet-turnserver/turnserver.conf $TURN_CONFIG
|
||||
sed -i "s/jitsi-meet.example.com/$JVB_HOSTNAME/g" $TURN_CONFIG
|
||||
sed -i "s/__turnSecret__/$TURN_SECRET/g" $TURN_CONFIG
|
||||
sed -i "s/__external_ip_address__/$PUBLIC_IP/g" $TURN_CONFIG
|
||||
|
||||
# SSL for nginx
|
||||
db_get jitsi-meet/cert-choice
|
||||
CERT_CHOICE="$RET"
|
||||
# SSL for nginx
|
||||
db_get jitsi-meet/cert-choice
|
||||
CERT_CHOICE="$RET"
|
||||
|
||||
if [ "$CERT_CHOICE" = "I want to use my own certificate" ] ; then
|
||||
db_get jitsi-meet/cert-path-key
|
||||
CERT_KEY="$RET"
|
||||
db_get jitsi-meet/cert-path-crt
|
||||
CERT_CRT="$RET"
|
||||
if [ "$CERT_CHOICE" = "I want to use my own certificate" ] ; then
|
||||
db_get jitsi-meet/cert-path-key
|
||||
CERT_KEY="$RET"
|
||||
db_get jitsi-meet/cert-path-crt
|
||||
CERT_CRT="$RET"
|
||||
|
||||
# replace self-signed certificate paths with user provided ones
|
||||
CERT_KEY_ESC=$(echo $CERT_KEY | sed 's/\./\\\./g')
|
||||
CERT_KEY_ESC=$(echo $CERT_KEY_ESC | sed 's/\//\\\//g')
|
||||
sed -i "s/pkey=\/etc\/jitsi\/meet\/.*key/pkey=$CERT_KEY_ESC/g" $TURN_CONFIG
|
||||
CERT_CRT_ESC=$(echo $CERT_CRT | sed 's/\./\\\./g')
|
||||
CERT_CRT_ESC=$(echo $CERT_CRT_ESC | sed 's/\//\\\//g')
|
||||
sed -i "s/cert=\/etc\/jitsi\/meet\/.*crt/cert=$CERT_CRT_ESC/g" $TURN_CONFIG
|
||||
# replace self-signed certificate paths with user provided ones
|
||||
CERT_KEY_ESC=$(echo $CERT_KEY | sed 's/\./\\\./g')
|
||||
CERT_KEY_ESC=$(echo $CERT_KEY_ESC | sed 's/\//\\\//g')
|
||||
sed -i "s/pkey=\/etc\/jitsi\/meet\/.*key/pkey=$CERT_KEY_ESC/g" $TURN_CONFIG
|
||||
CERT_CRT_ESC=$(echo $CERT_CRT | sed 's/\./\\\./g')
|
||||
CERT_CRT_ESC=$(echo $CERT_CRT_ESC | sed 's/\//\\\//g')
|
||||
sed -i "s/cert=\/etc\/jitsi\/meet\/.*crt/cert=$CERT_CRT_ESC/g" $TURN_CONFIG
|
||||
fi
|
||||
|
||||
sed -i "s/#TURNSERVER_ENABLED/TURNSERVER_ENABLED/g" /etc/default/coturn
|
||||
invoke-rc.d coturn restart || true
|
||||
|
||||
NGINX_STREAM_CONFIG="/etc/nginx/modules-enabled/60-jitsi-meet.conf"
|
||||
if [ $NGINX_MULTIPLEXING = "true" ] && [ ! -f $NGINX_STREAM_CONFIG ] && [ -f $NGINX_CONFIG ] ; then
|
||||
ln -s /usr/share/jitsi-meet-turnserver/jitsi-meet.conf $NGINX_STREAM_CONFIG
|
||||
sed -i "s/listen 443 ssl/listen 4444 ssl http2/g" $NGINX_CONFIG
|
||||
sed -i "s/listen \[\:\:\]\:443 ssl/listen \[\:\:\]\:4444 ssl http2/g" $NGINX_CONFIG
|
||||
invoke-rc.d nginx reload || true
|
||||
else
|
||||
PROSODY_HOST_CONFIG="/etc/prosody/conf.avail/$JVB_HOSTNAME.cfg.lua"
|
||||
if [ -f $PROSODY_HOST_CONFIG ] ; then
|
||||
# If we are not multiplexing we need to change the port in prosody config
|
||||
sed -i 's/"443"/"4445"/g' $PROSODY_HOST_CONFIG
|
||||
invoke-rc.d prosody restart || true
|
||||
fi
|
||||
fi
|
||||
|
||||
sed -i "s/#TURNSERVER_ENABLED/TURNSERVER_ENABLED/g" /etc/default/coturn
|
||||
invoke-rc.d coturn restart || true
|
||||
|
||||
NGINX_STREAM_CONFIG="/etc/nginx/modules-enabled/60-jitsi-meet.conf"
|
||||
if [ -f $NGINX_STREAM_CONFIG ] && [ -f $NGINX_CONFIG ] ; then
|
||||
sed -i "s/listen 443 ssl/listen 4444 ssl http2/g" $NGINX_CONFIG
|
||||
invoke-rc.d nginx reload || true
|
||||
fi
|
||||
|
||||
# Enable turn server in config.js
|
||||
if [ -f $JITSI_MEET_CONFIG ] ; then
|
||||
sed -i "s/\/\/ useStunTurn: true/useStunTurn: true/g" $JITSI_MEET_CONFIG
|
||||
fi
|
||||
# Enable turn server in config.js
|
||||
if [ -f $JITSI_MEET_CONFIG ] ; then
|
||||
sed -i "s/\/\/ useStunTurn: true/useStunTurn: true/g" $JITSI_MEET_CONFIG
|
||||
fi
|
||||
|
||||
# and we're done with debconf
|
||||
|
||||
63
debian/jitsi-meet-turnserver.postrm
vendored
Normal file
63
debian/jitsi-meet-turnserver.postrm
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
#!/bin/sh
|
||||
# postrm script for jitsi-meet-turnserver
|
||||
#
|
||||
# see: dh_installdeb(1)
|
||||
|
||||
set -e
|
||||
|
||||
# summary of how this script can be called:
|
||||
# * <postrm> `remove'
|
||||
# * <postrm> `purge'
|
||||
# * <old-postrm> `upgrade' <new-version>
|
||||
# * <new-postrm> `failed-upgrade' <old-version>
|
||||
# * <new-postrm> `abort-install'
|
||||
# * <new-postrm> `abort-install' <old-version>
|
||||
# * <new-postrm> `abort-upgrade' <old-version>
|
||||
# * <disappearer's-postrm> `disappear' <overwriter>
|
||||
# <overwriter-version>
|
||||
# for details, see http://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
# Load debconf
|
||||
. /usr/share/debconf/confmodule
|
||||
|
||||
|
||||
case "$1" in
|
||||
remove)
|
||||
rm -rf /etc/nginx/modules-enabled/60-jitsi-meet.conf
|
||||
if [ -x "/etc/init.d/nginx" ]; then
|
||||
invoke-rc.d nginx reload || true
|
||||
fi
|
||||
if [ -x "/etc/init.d/apache2" ]; then
|
||||
invoke-rc.d apache2 reload || true
|
||||
fi
|
||||
;;
|
||||
purge)
|
||||
rm -rf /etc/nginx/modules-enabled/60-jitsi-meet.conf
|
||||
rm -rf /etc/turnserver.conf
|
||||
if [ -x "/etc/init.d/nginx" ]; then
|
||||
invoke-rc.d nginx reload || true
|
||||
fi
|
||||
if [ -x "/etc/init.d/apache2" ]; then
|
||||
invoke-rc.d apache2 reload || true
|
||||
fi
|
||||
# Clear the debconf variable
|
||||
db_purge
|
||||
;;
|
||||
upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "postrm called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb will replace this with shell code automatically
|
||||
# generated by other debhelper scripts.
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
db_stop
|
||||
|
||||
exit 0
|
||||
64
debian/jitsi-meet-web-config.postinst
vendored
64
debian/jitsi-meet-web-config.postinst
vendored
@@ -68,12 +68,11 @@ case "$1" in
|
||||
FORCE_APACHE="true"
|
||||
fi
|
||||
|
||||
UPLOADED_CERT_CHOICE="I want to use my own certificate"
|
||||
# if first time config ask for certs, or if we are reconfiguring
|
||||
if [ -z "$JVB_HOSTNAME_OLD" ] || [ "$RECONFIGURING" = "true" ] ; then
|
||||
# SSL for nginx
|
||||
db_get jitsi-meet/cert-choice
|
||||
CERT_CHOICE="$RET"
|
||||
UPLOADED_CERT_CHOICE="I want to use my own certificate"
|
||||
|
||||
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ] ; then
|
||||
db_set jitsi-meet/cert-path-key "/etc/ssl/$JVB_HOSTNAME.key"
|
||||
@@ -104,24 +103,57 @@ case "$1" in
|
||||
if [ ! -f $JITSI_MEET_CONFIG ] ; then
|
||||
cp /usr/share/jitsi-meet-web-config/config.js $JITSI_MEET_CONFIG
|
||||
# replaces needed config for multidomain as it works only with nginx
|
||||
sed -i "s/conference.jitsi-meet.example.com/conference.<\!--# echo var=\"subdomain\" default=\"\" -->jitsi-meet.example.com/g" $JITSI_MEET_CONFIG
|
||||
if [[ "$FORCE_NGINX" = "true" ]] ; then
|
||||
sed -i "s/conference.jitsi-meet.example.com/conference.<\!--# echo var=\"subdomain\" default=\"\" -->jitsi-meet.example.com/g" $JITSI_MEET_CONFIG
|
||||
fi
|
||||
sed -i "s/jitsi-meet.example.com/$JVB_HOSTNAME/g" $JITSI_MEET_CONFIG
|
||||
fi
|
||||
|
||||
# this is new install let's configure jvb to serve meet
|
||||
# no-nginx, no-apache installed on machine, this is new install or reconfiguring old one which have jvb_serve set
|
||||
# getting rid of jetty serving web
|
||||
if [[ "$JVB_SERVE" = "true" ]] ; then
|
||||
echo ""
|
||||
echo "------------------------------------------------"
|
||||
echo "You are using jetty to serve jitsi-meet, it is recommended to uninstall(purge) and use default installation that comes with nginx!"
|
||||
echo ""
|
||||
echo "When using the following command, any custom config will be LOST, please backup /etc/jitsi !!!"
|
||||
echo ""
|
||||
echo "You can purge your installation using the following command:"
|
||||
echo "apt-get purge jitsi-meet jitsi-meet-web-config jitsi-meet-prosody jitsi-meet-web jicofo jitsi-videobridge"
|
||||
echo "------------------------------------------------"
|
||||
echo ""
|
||||
elif [[ "$FORCE_NGINX" = "true" && ( -z "$JVB_HOSTNAME_OLD" || "$RECONFIGURING" = "true" ) ]] ; then
|
||||
JVB_CONFIG="/etc/jitsi/videobridge/sip-communicator.properties"
|
||||
|
||||
# we will write to the file if missing create it
|
||||
if [ -f $JVB_CONFIG ] ; then
|
||||
echo ""
|
||||
echo "------------------------------------------------"
|
||||
echo ""
|
||||
echo "You are using jetty to serve jitsi-meet, we are now upgrading you to use nginx!"
|
||||
echo ""
|
||||
echo "If you are using Let’s Encrypt certificates please re-run the script."
|
||||
echo ""
|
||||
echo "------------------------------------------------"
|
||||
echo ""
|
||||
|
||||
sed -i "s/org.jitsi.videobridge.rest.jetty/#org.jitsi.videobridge.rest.jetty/g" $JVB_CONFIG
|
||||
sed -i "s/org.jitsi.videobridge.TCP_HARVESTER_PORT/#org.jitsi.videobridge.TCP_HARVESTER_PORT/g" $JVB_CONFIG
|
||||
|
||||
if [ -d /run/systemd/system ]; then
|
||||
systemctl restart jitsi-videobridge2.service >/dev/null || true
|
||||
fi
|
||||
|
||||
# Removing this value will force nginx or apache to be locally configured
|
||||
JVB_HOSTNAME_OLD=""
|
||||
|
||||
db_get jitsi-meet/cert-choice
|
||||
CERT_CHOICE="$RET"
|
||||
# Fix certs on upgrade from jetty
|
||||
if [ "$CERT_CHOICE" = "$UPLOADED_CERT_CHOICE" ] ; then
|
||||
db_get jitsi-meet/cert-path-key
|
||||
CERT_KEY="$RET"
|
||||
db_get jitsi-meet/cert-path-crt
|
||||
CERT_CRT="$RET"
|
||||
else
|
||||
# create self-signed certs
|
||||
CERT_KEY="/etc/jitsi/meet/$JVB_HOSTNAME.key"
|
||||
CERT_CRT="/etc/jitsi/meet/$JVB_HOSTNAME.crt"
|
||||
fi
|
||||
fi
|
||||
|
||||
db_set jitsi-meet/jvb-serve "false"
|
||||
fi
|
||||
|
||||
if [[ "$FORCE_NGINX" = "true" && ( -z "$JVB_HOSTNAME_OLD" || "$RECONFIGURING" = "true" ) ]] ; then
|
||||
|
||||
# this is a reconfigure, lets just delete old links
|
||||
if [ "$RECONFIGURING" = "true" ] ; then
|
||||
|
||||
1
debian/jitsi-meet-web.install
vendored
1
debian/jitsi-meet-web.install
vendored
@@ -11,4 +11,5 @@ fonts /usr/share/jitsi-meet/
|
||||
images /usr/share/jitsi-meet/
|
||||
lang /usr/share/jitsi-meet/
|
||||
connection_optimization /usr/share/jitsi-meet/
|
||||
resources/robots.txt /usr/share/jitsi-meet/
|
||||
resources/*.sh /usr/share/jitsi-meet/scripts/
|
||||
|
||||
45
doc/README.md
Normal file
45
doc/README.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# Documentation
|
||||
|
||||
This document is the entrypoint to different guides, divided in three groups:
|
||||
|
||||
* User guide: these documents are designed to help users of the service, to better
|
||||
understand all the available features and how to use them.
|
||||
|
||||
* Developer guide: these documents are designed to help developers who want to either
|
||||
integrate the Jitsi Meet API / SDK in their products or want to improve Jitsi Meet
|
||||
itself by developing new features or fixing bugs.
|
||||
|
||||
* DevOps guide: these documents are designed for DevOps folks, system administrators
|
||||
or anyone who wishes to deploy and operate their own Jitsi Meet instance.
|
||||
|
||||
## User guide
|
||||
|
||||
Work in progress.
|
||||
|
||||
## Developer guide
|
||||
|
||||
### Web
|
||||
|
||||
* [iframe API](https://github.com/jitsi/jitsi-meet/blob/master/doc/api.md)
|
||||
* [Jitsi Meet development](https://github.com/jitsi/jitsi-meet/blob/master/doc/development.md)
|
||||
|
||||
### Mobile
|
||||
|
||||
* [Building the mobile apps](https://github.com/jitsi/jitsi-meet/blob/master/doc/mobile.md)
|
||||
* [SDK usage examples](https://github.com/jitsi/jitsi-meet-sdk-samples)
|
||||
* [Enabling Dropbox support](https://github.com/jitsi/jitsi-meet/blob/master/doc/mobile-dropbox.md)
|
||||
* [Enabling Google authentication](https://github.com/jitsi/jitsi-meet/blob/master/doc/mobile-google-auth.md)
|
||||
|
||||
## DevOps guide
|
||||
|
||||
* [Quick install](https://github.com/jitsi/jitsi-meet/blob/master/doc/quick-install.md)
|
||||
* [Docker install](https://github.com/jitsi/docker-jitsi-meet/blob/master/README.md)
|
||||
* [Google Calendar, MS Calendar, Dropbox integrations](https://github.com/jitsi/jitsi-meet/blob/master/doc/integrations.md)
|
||||
* [Video tutorials on deployment and scalability](https://jitsi.org/tutorials/)
|
||||
* [Configuring a video SIP gateway](https://github.com/jitsi/jitsi-meet/blob/master/doc/sipgw-config.md)
|
||||
* [Enabling speaker stats](https://github.com/jitsi/jitsi-meet/blob/master/doc/speakerstats-prosody.md)
|
||||
* [Enabling TURN](https://github.com/jitsi/jitsi-meet/blob/master/doc/turn.md)
|
||||
* [Networking FAQ](https://github.com/jitsi/jitsi-meet/blob/master/doc/faq.md)
|
||||
* [Cloud APIs](https://github.com/jitsi/jitsi-meet/blob/master/doc/cloud-api.md)
|
||||
* [Manual Installation](https://github.com/jitsi/jitsi-meet/blob/master/doc/manual-install.md)
|
||||
* [Scalable Installation](https://github.com/jitsi/jitsi-meet/blob/master/doc/scalable-installation.md)
|
||||
25
doc/api.md
25
doc/api.md
@@ -85,14 +85,15 @@ const options = {
|
||||
const api = new JitsiMeetExternalAPI(domain, options);
|
||||
```
|
||||
|
||||
You can set the userInfo(email) for the call:
|
||||
You can set the userInfo(email, display name) for the call:
|
||||
|
||||
```javascript
|
||||
var domain = "meet.jit.si";
|
||||
var options = {
|
||||
...
|
||||
userInfo: {
|
||||
email: 'email@jitsiexamplemail.com'
|
||||
email: 'email@jitsiexamplemail.com',
|
||||
displayName: 'John Doe'
|
||||
}
|
||||
}
|
||||
var api = new JitsiMeetExternalAPI(domain, options);
|
||||
@@ -270,6 +271,11 @@ api.executeCommand('email', 'example@example.com');
|
||||
api.executeCommand('avatarUrl', 'https://avatars0.githubusercontent.com/u/3671647');
|
||||
```
|
||||
|
||||
* **sendEndpointTextMessage** - Sends a text message to another participant through the datachannels.
|
||||
```javascript
|
||||
api.executeCommand('receiverParticipantId', 'text');
|
||||
```
|
||||
|
||||
You can also execute multiple commands using the `executeCommands` method:
|
||||
```javascript
|
||||
api.executeCommands(commands);
|
||||
@@ -323,6 +329,21 @@ changes. The listener will receive an object with the following structure:
|
||||
}
|
||||
```
|
||||
|
||||
* **endpointTextMessageReceived** - event notifications about a text message received through datachannels.
|
||||
The listener will receive an object with the following structure:
|
||||
```javascript
|
||||
{
|
||||
senderInfo: {
|
||||
jid: string, // the jid of the sender
|
||||
id: string // the participant id of the sender
|
||||
},
|
||||
eventData: {
|
||||
name: string // the name of the datachannel event: `endpoint-text-message`
|
||||
text: string // the received text from the sender
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
* **micError** - event notifications about Jitsi-Meet having failed to access the mic. The listener will receive an object with the following structure:
|
||||
```javascript
|
||||
{
|
||||
|
||||
@@ -6,8 +6,8 @@ muc_mapper_domain_base = "jitmeet.example.com";
|
||||
turncredentials_secret = "__turnSecret__";
|
||||
|
||||
turncredentials = {
|
||||
{ type = "stun", host = "jitmeet.example.com", port = "443" },
|
||||
{ type = "turn", host = "jitmeet.example.com", port = "443", transport = "udp" },
|
||||
{ type = "stun", host = "jitmeet.example.com", port = "4446" },
|
||||
{ type = "turn", host = "jitmeet.example.com", port = "4446", transport = "udp" },
|
||||
{ type = "turns", host = "jitmeet.example.com", port = "443", transport = "tcp" }
|
||||
};
|
||||
|
||||
@@ -43,21 +43,25 @@ VirtualHost "jitmeet.example.com"
|
||||
c2s_require_encryption = false
|
||||
|
||||
Component "conference.jitmeet.example.com" "muc"
|
||||
storage = "null"
|
||||
storage = "memory"
|
||||
modules_enabled = {
|
||||
"muc_meeting_id";
|
||||
"muc_domain_mapper";
|
||||
-- "token_verification";
|
||||
}
|
||||
admins = { "focusUser@auth.jitmeet.example.com" }
|
||||
muc_room_locking = false
|
||||
muc_room_default_public_jids = true
|
||||
|
||||
-- internal muc component
|
||||
Component "internal.auth.jitmeet.example.com" "muc"
|
||||
storage = "null"
|
||||
storage = "memory"
|
||||
modules_enabled = {
|
||||
"ping";
|
||||
}
|
||||
admins = { "focusUser@auth.jitmeet.example.com", "jvb@auth.jitmeet.example.com" }
|
||||
muc_room_locking = false
|
||||
muc_room_default_public_jids = true
|
||||
|
||||
VirtualHost "auth.jitmeet.example.com"
|
||||
authentication = "internal_plain"
|
||||
|
||||
45
doc/debian/jitsi-meet-turn/coturn-certbot-deploy.sh
Normal file
45
doc/debian/jitsi-meet-turn/coturn-certbot-deploy.sh
Normal file
@@ -0,0 +1,45 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
COTURN_CERT_DIR="/etc/coturn/certs"
|
||||
TURN_CONFIG="/etc/turnserver.conf"
|
||||
|
||||
# create a directory to store certs if it does not exists
|
||||
if [ ! -d "$COTURN_CERT_DIR" ]; then
|
||||
mkdir -p $COTURN_CERT_DIR
|
||||
chown -R turnserver:turnserver /etc/coturn/
|
||||
chmod -R 700 /etc/coturn/
|
||||
fi
|
||||
|
||||
# This is a template and when copied to /etc/letsencrypt/renewal-hooks/deploy/
|
||||
# during creating the Let's encrypt certs script
|
||||
# jitsi-meet.example.com will be replaced with the real domain of deployment
|
||||
for domain in $RENEWED_DOMAINS; do
|
||||
case $domain in
|
||||
jitsi-meet.example.com)
|
||||
# Make sure the certificate and private key files are
|
||||
# never world readable, even just for an instant while
|
||||
# we're copying them into daemon_cert_root.
|
||||
umask 077
|
||||
|
||||
cp "$RENEWED_LINEAGE/fullchain.pem" "$COTURN_CERT_DIR/$domain.fullchain.pem"
|
||||
cp "$RENEWED_LINEAGE/privkey.pem" "$COTURN_CERT_DIR/$domain.privkey.pem"
|
||||
|
||||
# Apply the proper file ownership and permissions for
|
||||
# the daemon to read its certificate and key.
|
||||
chown turnserver "$COTURN_CERT_DIR/$domain.fullchain.pem" \
|
||||
"$COTURN_CERT_DIR/$domain.privkey.pem"
|
||||
chmod 400 "$COTURN_CERT_DIR/$domain.fullchain.pem" \
|
||||
"$COTURN_CERT_DIR/$domain.privkey.pem"
|
||||
|
||||
if [ -f $TURN_CONFIG ] && grep -q "jitsi-meet coturn config" "$TURN_CONFIG" ; then
|
||||
echo "Configuring turnserver"
|
||||
sed -i "/^cert/c\cert=\/etc\/coturn\/certs\/${domain}.fullchain.pem" $TURN_CONFIG
|
||||
sed -i "/^pkey/c\pkey=\/etc\/coturn\/certs\/${domain}.privkey.pem" $TURN_CONFIG
|
||||
fi
|
||||
service coturn restart
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# jitsi-meet coturn config. Do not modify this line
|
||||
lt-cred-mech
|
||||
use-auth-secret
|
||||
keep-address-family
|
||||
static-auth-secret=__turnSecret__
|
||||
@@ -8,6 +7,8 @@ cert=/etc/jitsi/meet/jitsi-meet.example.com.crt
|
||||
pkey=/etc/jitsi/meet/jitsi-meet.example.com.key
|
||||
|
||||
no-tcp
|
||||
listening-port=443
|
||||
listening-port=4446
|
||||
tls-listening-port=4445
|
||||
external-ip=__external_ip_address__
|
||||
|
||||
syslog
|
||||
|
||||
@@ -11,14 +11,14 @@ stream {
|
||||
}
|
||||
# since 1.13.10
|
||||
map $ssl_preread_alpn_protocols $upstream {
|
||||
"h2" web;
|
||||
"http/1.1" web;
|
||||
"h2,http/1.1" web;
|
||||
~\bh2\b web;
|
||||
~\bhttp/1\. web;
|
||||
default turn;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443;
|
||||
listen [::]:443;
|
||||
|
||||
# since 1.11.5
|
||||
ssl_preread on;
|
||||
|
||||
@@ -2,6 +2,7 @@ server_names_hash_bucket_size 64;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name jitsi-meet.example.com;
|
||||
|
||||
location ^~ /.well-known/acme-challenge/ {
|
||||
@@ -17,6 +18,7 @@ server {
|
||||
}
|
||||
server {
|
||||
listen 443 ssl;
|
||||
listen [::]:443 ssl;
|
||||
server_name jitsi-meet.example.com;
|
||||
|
||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||||
@@ -37,6 +39,10 @@ server {
|
||||
index index.html index.htm;
|
||||
error_page 404 /static/404.html;
|
||||
|
||||
gzip on;
|
||||
gzip_types text/plain text/css application/javascript application/json;
|
||||
gzip_vary on;
|
||||
|
||||
location = /config.js {
|
||||
alias /etc/jitsi/meet/jitsi-meet.example.com-config.js;
|
||||
}
|
||||
|
||||
@@ -69,10 +69,14 @@ Use it at the CLI, type
|
||||
make dev
|
||||
```
|
||||
|
||||
By default the backend deployment used is `beta.meet.jit.si`. You can point the Jitsi-Meet app at a different backend by using a proxy server. To do this, set the WEBPACK_DEV_SERVER_PROXY_TARGET variable:
|
||||
By default the backend deployment used is `alpha.jitsi.net`. You can point the Jitsi-Meet app at a different backend by using a proxy server. To do this, set the WEBPACK_DEV_SERVER_PROXY_TARGET variable:
|
||||
```
|
||||
export WEBPACK_DEV_SERVER_PROXY_TARGET=https://your-example-server.com
|
||||
make dev
|
||||
```
|
||||
|
||||
The app should be running at https://localhost:8080/
|
||||
|
||||
#### Chrome Privacy Error
|
||||
|
||||
Newer versions of Chrome may block localhost under https and show `NET::ERR_CERT_INVALID` on the page. To solve this open [chrome://flags/#allow-insecure-localhost](chrome://flags/#allow-insecure-localhost) and select Enable, then press Relaunch or quit and restart Chrome.
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# Jitsi Conference Focus settings
|
||||
# sets the host name of the XMPP server
|
||||
JICOFO_HOST=localhost
|
||||
|
||||
# sets the XMPP domain (default: none)
|
||||
JICOFO_HOSTNAME=meet.example.com
|
||||
|
||||
# sets the secret used to authenticate as an XMPP component
|
||||
JICOFO_SECRET=$JICOFO_SECRET
|
||||
|
||||
# sets the port to use for the XMPP component connection
|
||||
JICOFO_PORT=5347
|
||||
|
||||
# sets the XMPP domain name to use for XMPP user logins
|
||||
JICOFO_AUTH_DOMAIN=auth.meet.example.com
|
||||
|
||||
# sets the username to use for XMPP user logins
|
||||
JICOFO_AUTH_USER=focus
|
||||
|
||||
# sets the password to use for XMPP user logins
|
||||
JICOFO_AUTH_PASSWORD=$JICOFO_PASSWORD
|
||||
|
||||
# extra options to pass to the jicofo daemon
|
||||
JICOFO_OPTS=""
|
||||
|
||||
# adds java system props that are passed to jicofo (default are for home and logging config file)
|
||||
JAVA_SYS_PROPS="-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION=/etc/jitsi -Dnet.java.sip.communicator.SC_HOME_DIR_NAME=jicofo -Dnet.java.sip.communicator.SC_LOG_DIR_LOCATION=/var/log/jitsi -Djava.util.logging.config.file=/etc/jitsi/jicofo/logging.properties"
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
org.jitsi.jicofo.BRIDGE_MUC=JvbBrewery@internal.auth.meet.example.com
|
||||
org.jitsi.jicofo.ALWAYS_TRUST_MODE_ENABLED=true
|
||||
|
||||
org.jitsi.jicofo.jibri.BREWERY=JibriBrewery@internal.auth.meet.example.com
|
||||
org.jitsi.jicofo.jibri.PENDING_TIMEOUT=90
|
||||
@@ -0,0 +1,88 @@
|
||||
plugin_paths = { "/usr/share/jitsi-meet/prosody-plugins/" }
|
||||
|
||||
-- domain mapper options, must at least have domain base set to use the mapper
|
||||
muc_mapper_domain_base = "meet.example.com";
|
||||
|
||||
turncredentials_secret = "turncredentials_secret_test";
|
||||
|
||||
turncredentials = {
|
||||
{ type = "stun", host = "meet.example.com", port = "443" },
|
||||
{ type = "turn", host = "meet.example.com", port = "443", transport = "udp" },
|
||||
{ type = "turns", host = "meet.example.com", port = "443", transport = "tcp" }
|
||||
};
|
||||
|
||||
cross_domain_bosh = false;
|
||||
consider_bosh_secure = true;
|
||||
|
||||
VirtualHost "meet.example.com"
|
||||
-- enabled = false -- Remove this line to enable this host
|
||||
authentication = "anonymous"
|
||||
-- Properties below are modified by jitsi-meet-tokens package config
|
||||
-- and authentication above is switched to "token"
|
||||
--app_id="example_app_id"
|
||||
--app_secret="example_app_secret"
|
||||
-- Assign this host a certificate for TLS, otherwise it would use the one
|
||||
-- set in the global section (if any).
|
||||
-- Note that old-style SSL on port 5223 only supports one certificate, and will always
|
||||
-- use the global one.
|
||||
ssl = {
|
||||
key = "/etc/prosody/certs/meet.example.com.key";
|
||||
certificate = "/etc/prosody/certs/meet.example.com.crt";
|
||||
}
|
||||
speakerstats_component = "speakerstats.meet.example.com"
|
||||
conference_duration_component = "conferenceduration.meet.example.com"
|
||||
-- we need bosh
|
||||
modules_enabled = {
|
||||
"bosh";
|
||||
"pubsub";
|
||||
"ping"; -- Enable mod_ping
|
||||
"speakerstats";
|
||||
"turncredentials";
|
||||
"conference_duration";
|
||||
}
|
||||
c2s_require_encryption = false
|
||||
|
||||
Component "conference.meet.example.com" "muc"
|
||||
storage = "memory"
|
||||
modules_enabled = {
|
||||
"muc_meeting_id";
|
||||
"muc_domain_mapper";
|
||||
-- "token_verification";
|
||||
}
|
||||
admins = { "focus@auth.meet.example.com" }
|
||||
muc_room_locking = false
|
||||
muc_room_default_public_jids = true
|
||||
|
||||
-- internal muc component
|
||||
-- Note: This is also used from jibris
|
||||
Component "internal.auth.meet.example.com" "muc"
|
||||
storage = "memory"
|
||||
modules_enabled = {
|
||||
"ping";
|
||||
}
|
||||
admins = { "focus@auth.meet.example.com", "jvb@auth.meet.example.com" }
|
||||
|
||||
VirtualHost "auth.meet.example.com"
|
||||
ssl = {
|
||||
key = "/etc/prosody/certs/auth.meet.example.com.key";
|
||||
certificate = "/etc/prosody/certs/auth.meet.example.com.crt";
|
||||
}
|
||||
authentication = "internal_plain"
|
||||
|
||||
Component "focus.meet.example.com"
|
||||
component_secret = "jicofo_secret_test"
|
||||
|
||||
Component "speakerstats.meet.example.com" "speakerstats_component"
|
||||
muc_component = "conference.meet.example.com"
|
||||
|
||||
|
||||
Component "conferenceduration.meet.example.com" "conference_duration_component"
|
||||
muc_component = "conference.meet.example.com"
|
||||
|
||||
-- for Jibri
|
||||
VirtualHost "recorder.meet.example.com"
|
||||
modules_enabled = {
|
||||
"ping";
|
||||
}
|
||||
authentication = "internal_plain"
|
||||
c2s_require_encryption = false
|
||||
@@ -0,0 +1,114 @@
|
||||
-- Prosody XMPP Server Configuration
|
||||
|
||||
---------- Server-wide settings ----------
|
||||
-- Settings in this section apply to the whole server and are the default settings
|
||||
-- for any virtual hosts
|
||||
|
||||
admins = { }
|
||||
|
||||
network_backend = "epoll"
|
||||
|
||||
-- This is the list of modules Prosody will load on startup.
|
||||
-- It looks for mod_modulename.lua in the plugins folder, so make sure that exists too.
|
||||
-- Documentation for bundled modules can be found at: https://prosody.im/doc/modules
|
||||
modules_enabled = {
|
||||
|
||||
-- Generally required
|
||||
"roster"; -- Allow users to have a roster. Recommended ;)
|
||||
"saslauth"; -- Authentication for clients and servers. Recommended if you want to log in.
|
||||
"tls"; -- Add support for secure TLS on c2s/s2s connections
|
||||
"dialback"; -- s2s dialback support
|
||||
"disco"; -- Service discovery
|
||||
|
||||
-- Not essential, but recommended
|
||||
"carbons"; -- Keep multiple clients in sync
|
||||
"pep"; -- Enables users to publish their avatar, mood, activity, playing music and more
|
||||
"private"; -- Private XML storage (for room bookmarks, etc.)
|
||||
"blocklist"; -- Allow users to block communications with other users
|
||||
"vcard4"; -- User profiles (stored in PEP)
|
||||
"vcard_legacy"; -- Conversion between legacy vCard and PEP Avatar, vcard
|
||||
|
||||
-- Nice to have
|
||||
"version"; -- Replies to server version requests
|
||||
"uptime"; -- Report how long server has been running
|
||||
"time"; -- Let others know the time here on this server
|
||||
"ping"; -- Replies to XMPP pings with pongs
|
||||
"register"; -- Allow users to register on this server using a client and change passwords
|
||||
--"mam"; -- Store messages in an archive and allow users to access it
|
||||
--"csi_simple"; -- Simple Mobile optimizations
|
||||
|
||||
-- Admin interfaces
|
||||
"admin_adhoc"; -- Allows administration via an XMPP client that supports ad-hoc commands
|
||||
--"admin_telnet"; -- Opens telnet console interface on localhost port 5582
|
||||
|
||||
-- HTTP modules
|
||||
--"bosh"; -- Enable BOSH clients, aka "Jabber over HTTP"
|
||||
--"websocket"; -- XMPP over WebSockets
|
||||
--"http_files"; -- Serve static files from a directory over HTTP
|
||||
|
||||
-- Other specific functionality
|
||||
--"limits"; -- Enable bandwidth limiting for XMPP connections
|
||||
--"groups"; -- Shared roster support
|
||||
--"server_contact_info"; -- Publish contact information for this service
|
||||
--"announce"; -- Send announcement to all online users
|
||||
--"welcome"; -- Welcome users who register accounts
|
||||
--"watchregistrations"; -- Alert admins of registrations
|
||||
--"motd"; -- Send a message to users when they log in
|
||||
--"legacyauth"; -- Legacy authentication. Only used by some old clients and bots.
|
||||
--"proxy65"; -- Enables a file transfer proxy service which clients behind NAT can use
|
||||
}
|
||||
|
||||
-- These modules are auto-loaded, but should you want
|
||||
-- to disable them then uncomment them here:
|
||||
modules_disabled = {
|
||||
-- "offline"; -- Store offline messages
|
||||
-- "c2s"; -- Handle client connections
|
||||
-- "s2s"; -- Handle server-to-server connections
|
||||
-- "posix"; -- POSIX functionality, sends server to background, enables syslog, etc.
|
||||
}
|
||||
|
||||
-- Disable account creation by default, for security
|
||||
-- For more information see https://prosody.im/doc/creating_accounts
|
||||
allow_registration = false
|
||||
|
||||
-- Force clients to use encrypted connections? This option will
|
||||
-- prevent clients from authenticating unless they are using encryption.
|
||||
|
||||
c2s_require_encryption = true
|
||||
|
||||
-- Force servers to use encrypted connections? This option will
|
||||
-- prevent servers from authenticating unless they are using encryption.
|
||||
|
||||
s2s_require_encryption = true
|
||||
|
||||
-- Force certificate authentication for server-to-server connections?
|
||||
|
||||
s2s_secure_auth = false
|
||||
|
||||
|
||||
-- Required for init scripts and prosodyctl
|
||||
pidfile = "/var/run/prosody/prosody.pid"
|
||||
|
||||
-- Select the authentication backend to use. The 'internal' providers
|
||||
-- use Prosody's configured data storage to store the authentication data.
|
||||
|
||||
authentication = "internal_hashed"
|
||||
|
||||
archive_expires_after = "1w" -- Remove archived messages after 1 week
|
||||
|
||||
-- Logging configuration
|
||||
-- For advanced logging see https://prosody.im/doc/logging
|
||||
log = {
|
||||
info = "/var/log/prosody/prosody.log"; -- Change 'info' to 'debug' for verbose logging
|
||||
error = "/var/log/prosody/prosody.err";
|
||||
-- "*syslog"; -- Uncomment this for logging to syslog
|
||||
-- "*console"; -- Log to the console, useful for debugging with daemonize=false
|
||||
}
|
||||
|
||||
|
||||
-- Location of directory to find certificates in (relative to main config file):
|
||||
certificates = "certs"
|
||||
|
||||
VirtualHost "localhost"
|
||||
|
||||
Include "conf.d/*.cfg.lua"
|
||||
@@ -0,0 +1,20 @@
|
||||
# Jitsi Videobridge settings
|
||||
|
||||
# sets the XMPP domain (default: none)
|
||||
JVB_HOSTNAME=meet.example.com
|
||||
|
||||
# sets the hostname of the XMPP server (default: domain if set, localhost otherwise)
|
||||
JVB_HOST=
|
||||
|
||||
# sets the port of the XMPP server (default: 5275)
|
||||
JVB_PORT=5347
|
||||
|
||||
# sets the shared secret used to authenticate to the XMPP server
|
||||
JVB_SECRET=$VP_SECRET
|
||||
|
||||
# extra options to pass to the JVB daemon
|
||||
JVB_OPTS="--apis=rest,"
|
||||
|
||||
|
||||
# adds java system props that are passed to jvb (default are for home and logging config file)
|
||||
JAVA_SYS_PROPS="-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION=/etc/jitsi -Dnet.java.sip.communicator.SC_HOME_DIR_NAME=videobridge -Dnet.java.sip.communicator.SC_LOG_DIR_LOCATION=/var/log/jitsi -Djava.util.logging.config.file=/etc/jitsi/videobridge/logging.properties"
|
||||
@@ -0,0 +1,19 @@
|
||||
org.ice4j.ice.harvest.DISABLE_AWS_HARVESTER=true
|
||||
org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES=meet-jit-si-turnrelay.jitsi.net:443
|
||||
|
||||
org.jitsi.jicofo.ALWAYS_TRUST_MODE_ENABLED=true
|
||||
|
||||
org.jitsi.videobridge.ENABLE_REST_SHUTDOWN=true
|
||||
|
||||
# Enable broadcasting stats/presence in a MUC
|
||||
org.jitsi.videobridge.ENABLE_STATISTICS=true
|
||||
org.jitsi.videobridge.STATISTICS_TRANSPORT=muc,colibri,rest
|
||||
org.jitsi.videobridge.STATISTICS_INTERVAL=5000
|
||||
|
||||
org.jitsi.videobridge.xmpp.user.shard-1.HOSTNAME=meet.example.com
|
||||
org.jitsi.videobridge.xmpp.user.shard-1.DOMAIN=auth.meet.example.com
|
||||
org.jitsi.videobridge.xmpp.user.shard-1.USERNAME=jvb
|
||||
org.jitsi.videobridge.xmpp.user.shard-1.PASSWORD=$VB_PASSWORD
|
||||
org.jitsi.videobridge.xmpp.user.shard-1.MUC_JIDS=JvbBrewery@internal.auth.meet.example.com
|
||||
org.jitsi.videobridge.xmpp.user.shard-1.MUC_NICKNAME=$NICKNAME_OF_VB
|
||||
org.jitsi.videobridge.xmpp.user.shard-1.DISABLE_CERTIFICATE_VERIFICATION=true
|
||||
@@ -8,6 +8,8 @@ change references to that to match your host, and generate some passwords for
|
||||
|
||||
There are also some complete [example config files](https://github.com/jitsi/jitsi-meet/tree/master/doc/example-config-files/) available, mentioned in each section.
|
||||
|
||||
There are additional configurations to be done for a [scalable installation](https://github.com/jitsi/jitsi-meet/tree/master/doc/scalable-installation.md)
|
||||
|
||||
## Network description
|
||||
|
||||
This is how the network looks:
|
||||
@@ -225,6 +227,8 @@ npm install
|
||||
make
|
||||
```
|
||||
|
||||
_NOTE: When installing on older distributions keep in mind that you need Node.js >= 10 and npm >= 6._
|
||||
|
||||
Edit host names in `/srv/jitsi-meet/config.js` (see also the example config file):
|
||||
```
|
||||
var config = {
|
||||
|
||||
@@ -7,8 +7,10 @@ Jitsi Meet can be built as a standalone app for Android or iOS. It uses the
|
||||
|
||||
First make sure the [React Native dependencies] are installed.
|
||||
|
||||
**NOTE**: This document assumes the app is being built on a macOS system.
|
||||
**NOTE**: Node 10.X and npm 6.X are recommended for building.
|
||||
**NOTE**: This document assumes the app is being built on a macOS system. GNU/Linux is also
|
||||
supported for building the Android app and Windows **is not supported at alll**.
|
||||
|
||||
**NOTE**: Node 12.X and npm 6.X are recommended for building.
|
||||
|
||||
|
||||
## iOS
|
||||
|
||||
@@ -1,73 +1,82 @@
|
||||
# Jitsi Meet quick install
|
||||
|
||||
This document describes the required steps for a quick Jitsi Meet installation on a Debian based GNU/Linux system. Debian 8 (Jessie) or later, and Ubuntu 14.04 or later are supported out-of-the-box.
|
||||
This guide helps you ___host your own Jitsi server___. If you want to have a video conference without setting up any infrastructure, use https://meet.jit.si instead.
|
||||
|
||||
Debian Wheezy and other older systems may require additional things to be done. Specifically for Wheezy, [libc needs to be updated](http://lists.jitsi.org/pipermail/users/2015-September/010064.html).
|
||||
This document describes the required steps for a quick Jitsi Meet installation on a Debian based GNU/Linux system. Debian 9 (Stretch) or later, and Ubuntu 18.04 (Bionic Beaver) or later are supported out-of-the-box.
|
||||
|
||||
Also note that a recent default Ubuntu installation has only the `main` repository enabled, and Jitsi Meet needs packages from `universe`. Check your `/etc/apt/sources.list` file, and if `universe` is not present refer to [Ubuntu's documentation](https://help.ubuntu.com/community/Repositories/Ubuntu) on how to enable it. (Usually it amounts to copying the `main` lines and changing to `universe`.)
|
||||
On Ubuntu systems, Jitsi requires dependencies from Ubuntu's `universe` package repository. To ensure this is enabled, run `apt-add-repository universe` at the command-line.
|
||||
|
||||
N.B.:
|
||||
|
||||
a.) All commands are supposed to be run by root. If you are logged in as a regular user with sudo rights, please prepend ___sudo___ to each of the commands.
|
||||
|
||||
b.) You only need to do this if you want to ___host your own Jitsi server___. If you just want to have a video conference with someone, use https://meet.jit.si instead.
|
||||
_Note_: Many of the installation steps require elevated privileges. If you are logged in using a regular user account, you may need to temporarily increase your permissions (for example, by using `sudo` for individual commands).
|
||||
|
||||
## Basic Jitsi Meet install
|
||||
|
||||
### Add the domain name to `/etc/hosts`
|
||||
### Set up the Fully Qualified Domain Name (FQDN) (optional)
|
||||
|
||||
Add the the domain used to host the Jitsi Meet instance in the `/etc/hosts` file :
|
||||
If the machine used to host the Jitsi Meet instance has a FQDN (for example `meet.example.org`) already set up in DNS, `/etc/hostname` must contain this FQDN; if this is not the case yet, [change the hostname](https://wiki.debian.org/HowTo/ChangeHostname).
|
||||
|
||||
127.0.0.1 meet.example.org
|
||||
Then add the same FQDN in the `/etc/hosts` file, associating it with the loopback address:
|
||||
|
||||
### Add the repository
|
||||
127.0.0.1 localhost meet.example.org
|
||||
|
||||
Finally on the same machine test that you can ping the FQDN with: `ping "$(hostname)"`-
|
||||
|
||||
### Add the Jitsi package repository
|
||||
```sh
|
||||
echo 'deb https://download.jitsi.org stable/' >> /etc/apt/sources.list.d/jitsi-stable.list
|
||||
wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | apt-key add -
|
||||
echo 'deb https://download.jitsi.org stable/' | sudo tee /etc/apt/sources.list.d/jitsi-stable.list
|
||||
wget -qO - https://download.jitsi.org/jitsi-key.gpg.key | sudo apt-key add -
|
||||
```
|
||||
### Open ports in your firewall
|
||||
|
||||
### Update the package lists
|
||||
Open the following ports in your firewall, to allow traffic to the machine running jitsi:
|
||||
|
||||
```sh
|
||||
apt-get update
|
||||
```
|
||||
- 80 TCP
|
||||
- 443 TCP
|
||||
- 10000 UDP
|
||||
|
||||
(If you get an error:
|
||||
E: The method driver /usr/lib/apt/methods/https could not be found.
|
||||
run:
|
||||
```sh
|
||||
apt-get install apt-transport-https
|
||||
```
|
||||
)
|
||||
|
||||
### Install Jitsi Meet
|
||||
|
||||
Note: Something to consider before installation is how you're planning to serve Jitsi Meet. The installer will check if Nginx or Apache is present (with this order) and configure a virtualhost within the web server it finds to serve Jitsi Meet. If none of the above is found it then configures itself to be served via jetty. So if for example you are planning on deploying Jitsi Meet with a web server, you have to make sure to install the server **before** installing jitsi-meet.
|
||||
_Note_: The installer will check if [Nginx](https://nginx.org/) or [Apache](https://httpd.apache.org/) is present (in that order) and configure a virtualhost within the web server it finds to serve Jitsi Meet. If none of the above is found it then defaults to Nginx.
|
||||
If you are already running Nginx on port 443 on the same machine turnserver configuration will be skipped as it will conflict with your current port 443.
|
||||
|
||||
```sh
|
||||
# Ensure support is available for apt repositories served via HTTPS
|
||||
apt-get install apt-transport-https
|
||||
|
||||
# Retrieve the latest package versions across all repositories
|
||||
apt-get update
|
||||
|
||||
# Perform jitsi-meet installation
|
||||
apt-get -y install jitsi-meet
|
||||
```
|
||||
|
||||
During the installation, you will be asked to enter the hostname of the Jitsi Meet instance. If you have a FQDN hostname for the instance already set up in DNS, enter it there. If you don't have a resolvable hostname, you can enter the IP address of the machine (if it is static or doesn't change).
|
||||
During the installation, you will be asked to enter the hostname of the Jitsi Meet instance. If you have a [FQDN](https://en.wikipedia.org/wiki/Fully_qualified_domain_name) for the instance already set up in DNS, enter it there. If you don't have a resolvable hostname, you can enter the IP address of the machine (if it is static or doesn't change).
|
||||
|
||||
This hostname (or IP address) will be used for virtualhost configuration inside the Jitsi Meet and also, you and your correspondents will be using it to access the web conferences.
|
||||
|
||||
### Generate a Let's Encrypt certificate
|
||||
### Generate a Let's Encrypt certificate (optional, recommended)
|
||||
|
||||
Simply run the following in your shell
|
||||
In order to have encrypted communications, you need a [TLS certificate](https://en.wikipedia.org/wiki/Transport_Layer_Security). The easiest way is to use [Let's Encrypt](https://letsencrypt.org/).
|
||||
|
||||
_Note_: Jitsi Meet mobile apps *require* a valid certificate signed by a trusted [Certificate Authority](https://en.wikipedia.org/wiki/Certificate_authority) (such as a Let's Encrypt certificate) and will not be able to connect to your server if you choose a self-signed certificate.
|
||||
|
||||
Simply run the following in your shell:
|
||||
|
||||
```sh
|
||||
/usr/share/jitsi-meet/scripts/install-letsencrypt-cert.sh
|
||||
```
|
||||
|
||||
Note that this script uses the [HTTP-01 challenge type](https://letsencrypt.org/docs/challenge-types/) and thus your instance needs to be accessible from the public internet. If you want to use a different challenge type, don't use this script and instead choose ___I want to use my own certificate___ during jitsi-meet installation.
|
||||
|
||||
#### Advanced configuration
|
||||
If installation is on a machine [behind NAT](https://github.com/jitsi/jitsi-meet/blob/master/doc/faq.md) further configuration of jitsi-videobridge is needed in order for it to be accessible.
|
||||
Provided that all required ports are routed (forwarded) to the machine that it runs on. By default these ports are (TCP/443 or TCP/4443 and UDP 10000).
|
||||
The following extra lines need to be added the file `/etc/jitsi/videobridge/sip-communicator.properties`:
|
||||
If the installation is on a machine [behind NAT](https://github.com/jitsi/jitsi-meet/blob/master/doc/faq.md) jitsi-videobridge should configure itself automatically on boot. If three way call does not work further configuration of jitsi-videobridge is needed in order for it to be accessible from outside.
|
||||
Provided that all required ports are routed (forwarded) to the machine that it runs on. By default these ports are (TCP/443 or TCP/4443 and UDP/10000).
|
||||
The following extra lines need to be added to the file `/etc/jitsi/videobridge/sip-communicator.properties`:
|
||||
```
|
||||
org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=<Local.IP.Address>
|
||||
org.ice4j.ice.harvest.NAT_HARVESTER_PUBLIC_ADDRESS=<Public.IP.Address>
|
||||
```
|
||||
And comment the existing `org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES`.
|
||||
See [the documentation of ice4j](https://github.com/jitsi/ice4j/blob/master/doc/configuration.md)
|
||||
for details.
|
||||
|
||||
@@ -82,18 +91,22 @@ To load the values and check them look [here](#systemd-details) for details.
|
||||
|
||||
By default, anyone who has access to your jitsi instance will be able to start a conference: if your server is open to the world, anyone can have a chat with anyone else. If you want to limit the ability to start a conference to registered users, set up a "secure domain". Follow the instructions at https://github.com/jitsi/jicofo#secure-domain.
|
||||
|
||||
### Open a conference
|
||||
### Confirm that your installation is working
|
||||
|
||||
Launch a web browser (Chrome, Chromium or latest Opera) and enter in the URL bar the hostname (or IP address) you used in the previous step.
|
||||
Launch a web browser (Chrome, Chromium or latest Opera) and enter the hostname or IP address from the previous step into the address bar.
|
||||
|
||||
Confirm that you trust the self-signed certificate of the newly installed Jitsi Meet.
|
||||
If you used a self-signed certificate (as opposed to using Let's Encrypt), your web browser will ask you to confirm that you trust the certificate.
|
||||
|
||||
Enjoy!
|
||||
You should see a web page prompting you to create a new meeting. Make sure that you can successfully create a meeting and that other participants are able to join the session.
|
||||
|
||||
If this all worked, then congratulations! You have an operational Jitsi conference service.
|
||||
|
||||
## Adding sip-gateway to Jitsi Meet
|
||||
|
||||
### Install Jigasi
|
||||
|
||||
Jigasi is a server-side application acting as a gateway to Jitsi Meet conferences. It allows regular [SIP](https://en.wikipedia.org/wiki/Session_Initiation_Protocol) clients to join meetings and provides transcription capabilities.
|
||||
|
||||
```sh
|
||||
apt-get -y install jigasi
|
||||
```
|
||||
@@ -115,7 +128,7 @@ Enjoy!
|
||||
## Uninstall
|
||||
|
||||
```sh
|
||||
apt-get purge jigasi jitsi-meet jitsi-meet-web-config jitsi-meet-prosody jitsi-meet-turnserver jitsi-meet-web jicofo jitsi-videobridge
|
||||
apt-get purge jigasi jitsi-meet jitsi-meet-web-config jitsi-meet-prosody jitsi-meet-turnserver jitsi-meet-web jicofo jitsi-videobridge2
|
||||
```
|
||||
|
||||
Sometimes the following packages will fail to uninstall properly:
|
||||
@@ -125,13 +138,25 @@ Sometimes the following packages will fail to uninstall properly:
|
||||
|
||||
When this happens, just run the uninstall command a second time and it should be ok.
|
||||
|
||||
The reason for failure is that sometimes, the uninstall script is faster than the process that stops the daemons. The second run of the uninstall command fixes this, as by then the jigasi or jvb daemons are already stopped.
|
||||
The reason for the failure is that sometimes the uninstall script is faster than the process that stops the daemons. The second run of the uninstall command fixes this, as by then the jigasi or jitsi-videobridge daemons are already stopped.
|
||||
|
||||
#### Systemd details
|
||||
To reload the systemd changes on a running system execute `systemctl daemon-reload` and `service jitsi-videobridge restart`.
|
||||
To check the tasks part execute `service jitsi-videobridge status` and you should see `Tasks: XX (limit: 65000)`.
|
||||
To reload the systemd changes on a running system execute `systemctl daemon-reload` and `service jitsi-videobridge2 restart`.
|
||||
To check the tasks part execute `service jitsi-videobridge2 status` and you should see `Tasks: XX (limit: 65000)`.
|
||||
To check the files and process part execute ```cat /proc/`cat /var/run/jitsi-videobridge/jitsi-videobridge.pid`/limits``` and you should see:
|
||||
```
|
||||
Max processes 65000 65000 processes
|
||||
Max open files 65000 65000 files
|
||||
```
|
||||
|
||||
## Debugging problems
|
||||
|
||||
If you run into problems, one thing to try is using a different web browser. Some versions of some browsers are known to have issues with Jitsi Meet. You can also visit https://test.webrtc.org to test your browser's [WebRTC](https://en.wikipedia.org/wiki/WebRTC) support.
|
||||
|
||||
Another place to look is the various log files:
|
||||
|
||||
```
|
||||
/var/log/jitsi/jvb.log
|
||||
/var/log/jitsi/jicofo.log
|
||||
/var/log/prosody/prosody.log
|
||||
```
|
||||
|
||||
166
doc/scalable-installation.md
Normal file
166
doc/scalable-installation.md
Normal file
@@ -0,0 +1,166 @@
|
||||
# Scalable Jitsi installation
|
||||
|
||||
A single server Jitsi installation is good for a limited size of concurrent conferences.
|
||||
The first limiting factor is the videobridge component, that handles the actual video and audio traffic.
|
||||
It is easy to scale the video bridges horizontally by adding as many as needed.
|
||||
In a cloud based environment, additionally the bridges can be scaled up or down as needed.
|
||||
|
||||
*NB*: The [Youtube Tutorial on Scaling](https://www.youtube.com/watch?v=LyGV4uW8km8) is outdated and describes an old configuration method.
|
||||
|
||||
*NB*: Building a scalable infrastructure is not a task for beginning Jitsi Administrators.
|
||||
The instructions assume that you have installed a single node version successfully, and that
|
||||
you are comfortable installing, configuring and debugging Linux software.
|
||||
This is not a step-by-step guide, but will show you, which packages to install and which
|
||||
configurations to change. Use the [manual install](https://github.com/jitsi/jitsi-meet/blob/master/doc/manual-install.md) for
|
||||
details on how to setup Jitsi on a single host.
|
||||
It is highly recommended to use configuration management tools like Ansible or Puppet to manage the
|
||||
installation and configuration.
|
||||
|
||||
## Architecture (Single Jitsi-Meet, multiple videobridges)
|
||||
|
||||
A first step is to split the functions of the central jitsi-meet instance (with nginx, prosody and jicofo) and
|
||||
videobridges.
|
||||
|
||||
A simplified diagram (with open network ports) of an installation with one Jitsi-Meet instance and three
|
||||
videobridges that are load balanced looks as follows. Each box is a server/VM.
|
||||
|
||||
```
|
||||
+ +
|
||||
| |
|
||||
| |
|
||||
v v
|
||||
80, 443 TCP 443 TCP, 10000 UDP
|
||||
+--------------+ +---------------------+
|
||||
| nginx | 5222, 5347 TCP | |
|
||||
| jitsi-meet |<-------------------+| jitsi-videobridge |
|
||||
| prosody | | | |
|
||||
| jicofo | | +---------------------+
|
||||
+--------------+ |
|
||||
| +---------------------+
|
||||
| | |
|
||||
+----------+| jitsi-videobridge |
|
||||
| | |
|
||||
| +---------------------+
|
||||
|
|
||||
| +---------------------+
|
||||
| | |
|
||||
+----------+| jitsi-videobridge |
|
||||
| |
|
||||
+---------------------+
|
||||
```
|
||||
|
||||
## Machine Sizing
|
||||
|
||||
The Jitsi-Meet server will generally not have that much load (unless you have many) conferences
|
||||
going at the same time. A 4 CPU, 8 GB machine will probably be fine.
|
||||
|
||||
The videobridges will have more load. 4 or 8 CPU with 8 GB RAM seems to be a good configuration.
|
||||
|
||||
|
||||
### Installation of Jitsi-Meet
|
||||
|
||||
Assuming that the installation will run under the following FQDN: `meet.example.com` and you have
|
||||
SSL cert and key in `/etc/ssl/meet.example.com.{crt,key}`
|
||||
|
||||
Set the following DebConf variables prior to installing the packages.
|
||||
(We are not installing the `jitsi-meet` package which would handle that for us)
|
||||
|
||||
Install the `debconf-utils` package
|
||||
|
||||
```
|
||||
$ cat << EOF | sudo debconf-set-selections
|
||||
jitsi-videobridge jitsi-videobridge/jvb-hostname string meet.example.com
|
||||
jitsi-meet jitsi-meet/jvb-serve boolean false
|
||||
jitsi-meet-prosody jitsi-videobridge/jvb-hostname string meet.example.com
|
||||
jitsi-meet-web-config jitsi-meet/cert-choice select I want to use my own certificate
|
||||
jitsi-meet-web-config jitsi-meet/cert-path-crt string /etc/ssl/meet.example.com.crt
|
||||
jitsi-meet-web-config jitsi-meet/cert-path-key string /etc/ssl/meet.example.com.key
|
||||
EOF
|
||||
```
|
||||
|
||||
On the jitsi-meet server, install the following packages:
|
||||
|
||||
* `nginx`
|
||||
* `prosody`
|
||||
* `jicofo`
|
||||
* `jitsi-meet-web`
|
||||
* `jitsi-meet-prosody`
|
||||
* `jitsi-meet-web-config`
|
||||
|
||||
### Installation of Videobridge(s)
|
||||
|
||||
For simplicities sake, set the same `debconf` variables as above and install
|
||||
|
||||
* `jitsi-videobridge2`
|
||||
|
||||
### Configuration of jitsi-meet
|
||||
|
||||
#### Firewall
|
||||
|
||||
Open the following ports:
|
||||
|
||||
Open to world:
|
||||
|
||||
* 80 TCP
|
||||
* 443 TCP
|
||||
|
||||
Open to the videobridges only
|
||||
|
||||
* 5222 TCP (for Prosody)
|
||||
* 5347 TCP (for Jicofo)
|
||||
|
||||
|
||||
#### NGINX
|
||||
|
||||
Create the `/etc/nginx/sites-available/meet.example.com.conf` as usual
|
||||
|
||||
#### Prosody
|
||||
|
||||
Follow the steps in the [manual install](https://github.com/jitsi/jitsi-meet/blob/master/doc/manual-install.md) for setup tasks
|
||||
|
||||
You will need to adapt the following files (see the files in `example-config-files/scalable`)
|
||||
|
||||
* `/etc/prosody/prosody.cfg.lua`
|
||||
* `/etc/prosody/conf.avail/meet.example.com.cfg.lua`
|
||||
|
||||
#### Jitsi-Meet
|
||||
|
||||
Adapt `/usr/share/jitsi-meet/config.js` and `/usr/share/jitsi-meet/interface-config.js` to your specific needs
|
||||
|
||||
#### Jicofo
|
||||
|
||||
You will need to adapt the following files (see the files in `example-config-files/scalable`)
|
||||
|
||||
* `/etc/jitsi/jicofo/config` (hostname, jicofo_secret, jicofo_password)
|
||||
* `/etc/jitsi/jicofo/sip-communicator.properties` (hostname)
|
||||
|
||||
### Configuration of the Videobridge
|
||||
|
||||
#### Firewall
|
||||
|
||||
Open the following ports:
|
||||
|
||||
Open to world:
|
||||
|
||||
* 443 TCP
|
||||
* 10000 UDP
|
||||
|
||||
#### jitsi-videobridge2
|
||||
|
||||
You will need to adapt the following files (see the files in `example-config-files/scalable`)
|
||||
|
||||
Each videobridge will have to have it's own, unique nickname
|
||||
|
||||
* `/etc/jitsi/videobridge/config` (hostname, password)
|
||||
* `/etc/jitsi/jicofo/sip-communicator.properties` (hostname of jitsi-meet, nickname of videobridge, vb_password)
|
||||
|
||||
With the latest stable (April 2020) videobridge, it is no longer necessary to set public and private IP
|
||||
adresses in the `sip-communicator.properties` as the bridge will figure out the correct configuration by itself.
|
||||
|
||||
## Testing
|
||||
|
||||
After restarting all services (`prosody`, `jicofo` and all the `jitsi-videobridge2`) you can see in
|
||||
`/var/log/prosody/prosody.log` and
|
||||
`/var/log/jitsi/jicofo.log` that the videobridges connect to Prososy and that Jicofo picks them up.
|
||||
|
||||
When a new conference starts, Jicofo picks a videobridge and schedules the conference on it.
|
||||
@@ -31,7 +31,7 @@ var interfaceConfig = {
|
||||
APP_NAME: 'Jitsi Meet',
|
||||
NATIVE_APP_NAME: 'Jitsi Meet',
|
||||
PROVIDER_NAME: 'Jitsi',
|
||||
LANG_DETECTION: false, // Allow i18n to detect the system language
|
||||
LANG_DETECTION: true, // Allow i18n to detect the system language
|
||||
INVITATION_POWERED_BY: true,
|
||||
|
||||
/**
|
||||
@@ -51,7 +51,8 @@ var interfaceConfig = {
|
||||
'fodeviceselection', 'hangup', 'profile', 'info', 'chat', 'recording',
|
||||
'livestreaming', 'etherpad', 'sharedvideo', 'settings', 'raisehand',
|
||||
'videoquality', 'filmstrip', 'invite', 'feedback', 'stats', 'shortcuts',
|
||||
'tileview', 'videobackgroundblur', 'download', 'help', 'mute-everyone'
|
||||
'tileview', 'videobackgroundblur', 'download', 'help', 'mute-everyone',
|
||||
'e2ee'
|
||||
],
|
||||
|
||||
SETTINGS_SECTIONS: [ 'devices', 'language', 'moderator', 'profile', 'calendar' ],
|
||||
@@ -128,7 +129,7 @@ var interfaceConfig = {
|
||||
* If indicated some of the error dialogs may point to the support URL for
|
||||
* help.
|
||||
*/
|
||||
SUPPORT_URL: 'https://github.com/jitsi/jitsi-meet/issues/new',
|
||||
SUPPORT_URL: 'https://community.jitsi.org/',
|
||||
|
||||
/**
|
||||
* Whether the connection indicator icon should hide itself based on
|
||||
@@ -206,12 +207,12 @@ var interfaceConfig = {
|
||||
* If this is set to false, the banner will not be rendered at all. If set to true, the check for extension(s)
|
||||
* being already installed is done before rendering.
|
||||
*/
|
||||
SHOW_CHROME_EXTENSION_BANNER: false
|
||||
SHOW_CHROME_EXTENSION_BANNER: false,
|
||||
|
||||
/**
|
||||
* When enabled, the kick participant button will not be presented for users without a JWT
|
||||
*/
|
||||
// HIDE_KICK_BUTTON_FOR_GUESTS: false
|
||||
// HIDE_KICK_BUTTON_FOR_GUESTS: false,
|
||||
|
||||
/**
|
||||
* How many columns the tile view can expand to. The respected range is
|
||||
@@ -252,6 +253,12 @@ var interfaceConfig = {
|
||||
MOBILE_DYNAMIC_LINK
|
||||
PHONE_NUMBER_REGEX
|
||||
*/
|
||||
|
||||
// Allow all above example options to include a trailing comma and
|
||||
// prevent fear when commenting out the last value.
|
||||
makeJsonParserHappy: 'even if last key had a trailing comma'
|
||||
|
||||
// no configuration value should follow this line.
|
||||
};
|
||||
|
||||
/* eslint-enable no-unused-vars, no-var, max-len */
|
||||
|
||||
@@ -5,10 +5,10 @@ require_relative '../node_modules/@react-native-community/cli-platform-ios/nativ
|
||||
target 'jitsi-meet' do
|
||||
project 'app/app.xcodeproj'
|
||||
|
||||
pod 'Crashlytics', '~> 3.12.0'
|
||||
pod 'Fabric', '~> 1.9.0'
|
||||
pod 'Firebase/Core', '~> 5.18.0'
|
||||
pod 'Firebase/DynamicLinks', '~> 5.18.0'
|
||||
pod 'Crashlytics', '~> 3.14.0'
|
||||
pod 'Fabric', '~> 1.10.2'
|
||||
pod 'Firebase/Core', '~> 6.16.0'
|
||||
pod 'Firebase/DynamicLinks', '~> 6.16.0'
|
||||
end
|
||||
|
||||
target 'JitsiMeet' do
|
||||
|
||||
171
ios/Podfile.lock
171
ios/Podfile.lock
@@ -11,10 +11,10 @@ PODS:
|
||||
- CocoaLumberjack (3.5.3):
|
||||
- CocoaLumberjack/Core (= 3.5.3)
|
||||
- CocoaLumberjack/Core (3.5.3)
|
||||
- Crashlytics (3.12.0):
|
||||
- Fabric (~> 1.9.0)
|
||||
- Crashlytics (3.14.0):
|
||||
- Fabric (~> 1.10.2)
|
||||
- DoubleConversion (1.1.6)
|
||||
- Fabric (1.9.0)
|
||||
- Fabric (1.10.2)
|
||||
- FBLazyVector (0.61.5-jitsi.1)
|
||||
- FBReactNativeSpec (0.61.5-jitsi.1):
|
||||
- Folly (= 2018.10.22.00)
|
||||
@@ -23,34 +23,48 @@ PODS:
|
||||
- React-Core (= 0.61.5-jitsi.1)
|
||||
- React-jsi (= 0.61.5-jitsi.1)
|
||||
- ReactCommon/turbomodule/core (= 0.61.5-jitsi.1)
|
||||
- Firebase/Core (5.18.0):
|
||||
- Firebase/Core (6.16.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseAnalytics (= 5.7.0)
|
||||
- Firebase/CoreOnly (5.18.0):
|
||||
- FirebaseCore (= 5.3.1)
|
||||
- Firebase/DynamicLinks (5.18.0):
|
||||
- FirebaseAnalytics (= 6.2.2)
|
||||
- Firebase/CoreOnly (6.16.0):
|
||||
- FirebaseCore (= 6.6.1)
|
||||
- Firebase/DynamicLinks (6.16.0):
|
||||
- Firebase/CoreOnly
|
||||
- FirebaseDynamicLinks (= 3.4.1)
|
||||
- FirebaseAnalytics (5.7.0):
|
||||
- FirebaseCore (~> 5.3)
|
||||
- FirebaseInstanceID (~> 3.6)
|
||||
- GoogleAppMeasurement (= 5.7.0)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 5.2)
|
||||
- GoogleUtilities/MethodSwizzler (~> 5.2)
|
||||
- GoogleUtilities/Network (~> 5.2)
|
||||
- "GoogleUtilities/NSData+zlib (~> 5.2)"
|
||||
- nanopb (~> 0.3)
|
||||
- FirebaseAnalyticsInterop (1.2.0)
|
||||
- FirebaseCore (5.3.1):
|
||||
- GoogleUtilities/Logger (~> 5.2)
|
||||
- FirebaseDynamicLinks (3.4.1):
|
||||
- FirebaseAnalytics (~> 5.1)
|
||||
- FirebaseAnalyticsInterop (~> 1.0)
|
||||
- FirebaseCore (~> 5.2)
|
||||
- FirebaseInstanceID (3.7.0):
|
||||
- FirebaseCore (~> 5.2)
|
||||
- GoogleUtilities/Environment (~> 5.2)
|
||||
- GoogleUtilities/UserDefaults (~> 5.2)
|
||||
- FirebaseDynamicLinks (~> 4.0.6)
|
||||
- FirebaseAnalytics (6.2.2):
|
||||
- FirebaseCore (~> 6.6)
|
||||
- FirebaseInstanceID (~> 4.3)
|
||||
- GoogleAppMeasurement (= 6.2.2)
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 6.0)
|
||||
- GoogleUtilities/MethodSwizzler (~> 6.0)
|
||||
- GoogleUtilities/Network (~> 6.0)
|
||||
- "GoogleUtilities/NSData+zlib (~> 6.0)"
|
||||
- nanopb (= 0.3.9011)
|
||||
- FirebaseAnalyticsInterop (1.5.0)
|
||||
- FirebaseCore (6.6.1):
|
||||
- FirebaseCoreDiagnostics (~> 1.2)
|
||||
- FirebaseCoreDiagnosticsInterop (~> 1.2)
|
||||
- GoogleUtilities/Environment (~> 6.5)
|
||||
- GoogleUtilities/Logger (~> 6.5)
|
||||
- FirebaseCoreDiagnostics (1.2.2):
|
||||
- FirebaseCoreDiagnosticsInterop (~> 1.2)
|
||||
- GoogleDataTransportCCTSupport (~> 2.0)
|
||||
- GoogleUtilities/Environment (~> 6.5)
|
||||
- GoogleUtilities/Logger (~> 6.5)
|
||||
- nanopb (~> 0.3.901)
|
||||
- FirebaseCoreDiagnosticsInterop (1.2.0)
|
||||
- FirebaseDynamicLinks (4.0.8):
|
||||
- FirebaseAnalyticsInterop (~> 1.3)
|
||||
- FirebaseCore (~> 6.2)
|
||||
- FirebaseInstallations (1.1.1):
|
||||
- FirebaseCore (~> 6.6)
|
||||
- GoogleUtilities/UserDefaults (~> 6.5)
|
||||
- PromisesObjC (~> 1.2)
|
||||
- FirebaseInstanceID (4.3.2):
|
||||
- FirebaseCore (~> 6.6)
|
||||
- FirebaseInstallations (~> 1.0)
|
||||
- GoogleUtilities/Environment (~> 6.5)
|
||||
- GoogleUtilities/UserDefaults (~> 6.5)
|
||||
- Folly (2018.10.22.00):
|
||||
- boost-for-react-native
|
||||
- DoubleConversion
|
||||
@@ -61,33 +75,37 @@ PODS:
|
||||
- DoubleConversion
|
||||
- glog
|
||||
- glog (0.3.5)
|
||||
- GoogleAppMeasurement (5.7.0):
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 5.2)
|
||||
- GoogleUtilities/MethodSwizzler (~> 5.2)
|
||||
- GoogleUtilities/Network (~> 5.2)
|
||||
- "GoogleUtilities/NSData+zlib (~> 5.2)"
|
||||
- nanopb (~> 0.3)
|
||||
- GoogleAppMeasurement (6.2.2):
|
||||
- GoogleUtilities/AppDelegateSwizzler (~> 6.0)
|
||||
- GoogleUtilities/MethodSwizzler (~> 6.0)
|
||||
- GoogleUtilities/Network (~> 6.0)
|
||||
- "GoogleUtilities/NSData+zlib (~> 6.0)"
|
||||
- nanopb (= 0.3.9011)
|
||||
- GoogleDataTransport (5.1.0)
|
||||
- GoogleDataTransportCCTSupport (2.0.1):
|
||||
- GoogleDataTransport (~> 5.1)
|
||||
- nanopb (~> 0.3.901)
|
||||
- GoogleSignIn (5.0.1):
|
||||
- AppAuth (~> 1.2)
|
||||
- GTMAppAuth (~> 1.0)
|
||||
- GTMSessionFetcher/Core (~> 1.1)
|
||||
- GoogleUtilities/AppDelegateSwizzler (5.4.1):
|
||||
- GoogleUtilities/AppDelegateSwizzler (6.5.2):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network
|
||||
- GoogleUtilities/Environment (5.4.1)
|
||||
- GoogleUtilities/Logger (5.4.1):
|
||||
- GoogleUtilities/Environment (6.5.2)
|
||||
- GoogleUtilities/Logger (6.5.2):
|
||||
- GoogleUtilities/Environment
|
||||
- GoogleUtilities/MethodSwizzler (5.4.1):
|
||||
- GoogleUtilities/MethodSwizzler (6.5.2):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/Network (5.4.1):
|
||||
- GoogleUtilities/Network (6.5.2):
|
||||
- GoogleUtilities/Logger
|
||||
- "GoogleUtilities/NSData+zlib"
|
||||
- GoogleUtilities/Reachability
|
||||
- "GoogleUtilities/NSData+zlib (5.4.1)"
|
||||
- GoogleUtilities/Reachability (5.4.1):
|
||||
- "GoogleUtilities/NSData+zlib (6.5.2)"
|
||||
- GoogleUtilities/Reachability (6.5.2):
|
||||
- GoogleUtilities/Logger
|
||||
- GoogleUtilities/UserDefaults (5.4.1):
|
||||
- GoogleUtilities/UserDefaults (6.5.2):
|
||||
- GoogleUtilities/Logger
|
||||
- GTMAppAuth (1.0.0):
|
||||
- AppAuth/Core (~> 1.0)
|
||||
@@ -97,12 +115,13 @@ PODS:
|
||||
- GTMSessionFetcher/Core (1.2.2)
|
||||
- GTMSessionFetcher/Full (1.2.2):
|
||||
- GTMSessionFetcher/Core (= 1.2.2)
|
||||
- nanopb (0.3.901):
|
||||
- nanopb/decode (= 0.3.901)
|
||||
- nanopb/encode (= 0.3.901)
|
||||
- nanopb/decode (0.3.901)
|
||||
- nanopb/encode (0.3.901)
|
||||
- nanopb (0.3.9011):
|
||||
- nanopb/decode (= 0.3.9011)
|
||||
- nanopb/encode (= 0.3.9011)
|
||||
- nanopb/decode (0.3.9011)
|
||||
- nanopb/encode (0.3.9011)
|
||||
- ObjectiveDropboxOfficial (3.9.4)
|
||||
- PromisesObjC (1.2.8)
|
||||
- RCTRequired (0.61.5-jitsi.1)
|
||||
- RCTTypeSafety (0.61.5-jitsi.1):
|
||||
- FBLazyVector (= 0.61.5-jitsi.1)
|
||||
@@ -352,13 +371,13 @@ DEPENDENCIES:
|
||||
- Amplitude-iOS (~> 4.0.4)
|
||||
- BVLinearGradient (from `../node_modules/react-native-linear-gradient`)
|
||||
- CocoaLumberjack (~> 3.5.3)
|
||||
- Crashlytics (~> 3.12.0)
|
||||
- Crashlytics (~> 3.14.0)
|
||||
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
||||
- Fabric (~> 1.9.0)
|
||||
- Fabric (~> 1.10.2)
|
||||
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector/`)
|
||||
- FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec/`)
|
||||
- Firebase/Core (~> 5.18.0)
|
||||
- Firebase/DynamicLinks (~> 5.18.0)
|
||||
- Firebase/Core (~> 6.16.0)
|
||||
- Firebase/DynamicLinks (~> 6.16.0)
|
||||
- Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`)
|
||||
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
||||
- ObjectiveDropboxOfficial (~> 3.9.4)
|
||||
@@ -401,23 +420,29 @@ SPEC REPOS:
|
||||
- Amplitude-iOS
|
||||
- boost-for-react-native
|
||||
- CocoaLumberjack
|
||||
- ObjectiveDropboxOfficial
|
||||
trunk:
|
||||
- AppAuth
|
||||
- Crashlytics
|
||||
- Fabric
|
||||
- Firebase
|
||||
- FirebaseAnalytics
|
||||
- FirebaseAnalyticsInterop
|
||||
- FirebaseCore
|
||||
- FirebaseCoreDiagnostics
|
||||
- FirebaseCoreDiagnosticsInterop
|
||||
- FirebaseDynamicLinks
|
||||
- FirebaseInstallations
|
||||
- FirebaseInstanceID
|
||||
- GoogleAppMeasurement
|
||||
- GoogleUtilities
|
||||
- nanopb
|
||||
- ObjectiveDropboxOfficial
|
||||
trunk:
|
||||
- AppAuth
|
||||
- GoogleDataTransport
|
||||
- GoogleDataTransportCCTSupport
|
||||
- GoogleSignIn
|
||||
- GoogleUtilities
|
||||
- GTMAppAuth
|
||||
- GTMSessionFetcher
|
||||
- nanopb
|
||||
- PromisesObjC
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
BVLinearGradient:
|
||||
@@ -501,26 +526,32 @@ SPEC CHECKSUMS:
|
||||
boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
|
||||
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
|
||||
CocoaLumberjack: 2f44e60eb91c176d471fdba43b9e3eae6a721947
|
||||
Crashlytics: 07fb167b1694128c1c9a5a5cc319b0e9c3ca0933
|
||||
Crashlytics: 540b7e5f5da5a042647227a5e3ac51d85eed06df
|
||||
DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
|
||||
Fabric: f988e33c97f08930a413e08123064d2e5f68d655
|
||||
Fabric: 706c8b8098fff96c33c0db69cbf81f9c551d0d74
|
||||
FBLazyVector: 4a5251159a3ed05dc11cc8b74cf937869935814b
|
||||
FBReactNativeSpec: 6fa602a20993212cc9877a81838578ffb0008bc9
|
||||
Firebase: 02f3281965c075426141a0ce1277e9de6649cab9
|
||||
FirebaseAnalytics: 23851fe602c872130a2c5c55040b302120346cc2
|
||||
FirebaseAnalyticsInterop: efbe45c8385ec626e29f9525e5ebd38520dfb6c1
|
||||
FirebaseCore: 52f851b30e11360f1e67cf04b1edfebf0a47a2d3
|
||||
FirebaseDynamicLinks: f209c3caccd82102caa0e91d393e3ccc593501fd
|
||||
FirebaseInstanceID: bd6fc5a258884e206fd5c474ebe4f5b00e21770e
|
||||
Firebase: 497158b816d0a86fc31babbd05546fcd7e6083ff
|
||||
FirebaseAnalytics: cf95d3aab897612783020fbd98401d5366f135ee
|
||||
FirebaseAnalyticsInterop: 3f86269c38ae41f47afeb43ebf32a001f58fcdae
|
||||
FirebaseCore: 85064903ed6c28e47fec9c7bd149d94ba1b6b6e7
|
||||
FirebaseCoreDiagnostics: e9b4cd8ba60dee0f2d13347332e4b7898cca5b61
|
||||
FirebaseCoreDiagnosticsInterop: 296e2c5f5314500a850ad0b83e9e7c10b011a850
|
||||
FirebaseDynamicLinks: 417dc6dbb6013233c77558290d73296f429656a6
|
||||
FirebaseInstallations: acb3216eb9784d3b1d2d2d635ff74fa892cc0c44
|
||||
FirebaseInstanceID: 7ee0d6777013bb952f377b41965bf132b6a075be
|
||||
Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51
|
||||
glog: 1f3da668190260b06b429bb211bfbee5cd790c28
|
||||
GoogleAppMeasurement: 6cf307834da065863f9faf4c0de0a936d81dd832
|
||||
GoogleAppMeasurement: d0560d915abf15e692e8538ba1d58442217b6aff
|
||||
GoogleDataTransport: b29a21d813e906014ca16c00897827e40e4a24ab
|
||||
GoogleDataTransportCCTSupport: 6f15a89b0ca35d6fa523e1f752ef818588885988
|
||||
GoogleSignIn: 3a51b9bb8e48b635fd7f4272cee06ca260345b86
|
||||
GoogleUtilities: 1e25823cbf46540b4284f6ef8e17b3a68ee12bbc
|
||||
GoogleUtilities: ad0f3b691c67909d03a3327cc205222ab8f42e0e
|
||||
GTMAppAuth: 4deac854479704f348309e7b66189e604cf5e01e
|
||||
GTMSessionFetcher: 61bb0f61a4cb560030f1222021178008a5727a23
|
||||
nanopb: 2901f78ea1b7b4015c860c2fdd1ea2fee1a18d48
|
||||
nanopb: 18003b5e52dab79db540fe93fe9579f399bd1ccd
|
||||
ObjectiveDropboxOfficial: a5afefc83f6467c42c45f2253f583f2ad1ffc701
|
||||
PromisesObjC: c119f3cd559f50b7ae681fa59dc1acd19173b7e6
|
||||
RCTRequired: f63dd90a89a60602acdd44c42e5d2645ca60ab79
|
||||
RCTTypeSafety: 24a3c6d55684046ed550b1d0ef083a9bf71c8bd4
|
||||
React: 71c5a51135f291c3b32c0b558e167b858ae50e84
|
||||
@@ -553,6 +584,6 @@ SPEC CHECKSUMS:
|
||||
RNWatch: 09738b339eceb66e4d80a2371633ca5fb380fa42
|
||||
Yoga: 7b4209fda2441f99d54dd6cf4c82b094409bb68f
|
||||
|
||||
PODFILE CHECKSUM: 0fdfa45ae809c9460c80be3e0d4bbb822fccc418
|
||||
PODFILE CHECKSUM: f615794fb9184757b00cd16e534824ba6ee2fc98
|
||||
|
||||
COCOAPODS: 1.8.4
|
||||
COCOAPODS: 1.9.1
|
||||
|
||||
@@ -19,7 +19,7 @@ There are 2 ways to integrate the SDK into your project:
|
||||
|
||||
Follow the instructions [here](https://github.com/jitsi/jitsi-meet-ios-sdk-releases/blob/master/README.md).
|
||||
|
||||
### Builduing it yourself
|
||||
### Building it yourself
|
||||
|
||||
1. Install all required [dependencies](https://github.com/jitsi/jitsi-meet/blob/master/doc/mobile.md).
|
||||
|
||||
|
||||
@@ -293,7 +293,7 @@
|
||||
B35383AD1DDA0083008F406A /* Adjust embedded framework architectures */,
|
||||
0BB7DA181EC9E695007AAE98 /* Adjust ATS */,
|
||||
DEF4813D224925A2002AD03A /* Copy Google Plist file */,
|
||||
DEC2069321CBBD6900072F03 /* Setup Fabric */,
|
||||
DEC2069321CBBD6900072F03 /* Setup Crashlytics */,
|
||||
DE11877A21EE09640078D059 /* Setup Google reverse URL handler */,
|
||||
DE4F6D6E22005C0400DE699E /* Setup Dropbox */,
|
||||
0BEA5C491F7B8F73000D0AB4 /* Embed Watch Content */,
|
||||
@@ -492,7 +492,7 @@
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "INFO_PLIST=\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"\nDROPBOX_KEY_FILE=\"$PROJECT_DIR/dropbox.key\"\n\nif [[ -f $DROPBOX_KEY_FILE ]]; then\n /usr/libexec/PlistBuddy -c \"Delete :LSApplicationQueriesSchemes\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes array\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes:0 string 'dbapi-2'\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :LSApplicationQueriesSchemes:1 string 'dbapi-8-emm'\" $INFO_PLIST\n\n DROPBOX_KEY=$(head -n 1 $DROPBOX_KEY_FILE)\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLName string dropbox\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLSchemes array\" $INFO_PLIST\n /usr/libexec/PlistBuddy -c \"Add :CFBundleURLTypes:2:CFBundleURLSchemes:0 string $DROPBOX_KEY\" $INFO_PLIST\nfi\n";
|
||||
};
|
||||
DEC2069321CBBD6900072F03 /* Setup Fabric */ = {
|
||||
DEC2069321CBBD6900072F03 /* Setup Crashlytics */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -501,14 +501,14 @@
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Setup Fabric";
|
||||
name = "Setup Crashlytics";
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "${PODS_ROOT}/Fabric/run\n";
|
||||
shellScript = "GOOGLE_PLIST=\"$PROJECT_DIR/GoogleService-Info.plist\"\n\nif [[ -f $GOOGLE_PLIST ]]; then\n if [ \"${CONFIGURATION}\" != \"Debug\" ]; then\n find \"${DWARF_DSYM_FOLDER_PATH}\" -name \"*.dSYM\" | xargs -I \\{\\} ${PODS_ROOT}/Fabric/upload-symbols -gsp $GOOGLE_PLIST -p ios \\{\\}\n fi\nfi\n";
|
||||
};
|
||||
DEF4813D224925A2002AD03A /* Copy Google Plist file */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>20.1.0</string>
|
||||
<string>20.3.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleURLTypes</key>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>20.1.0</string>
|
||||
<string>20.3.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>XPC!</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>20.1.0</string>
|
||||
<string>20.3.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>CLKComplicationPrincipalClass</key>
|
||||
|
||||
@@ -66,6 +66,9 @@ platform :ios do
|
||||
beta_app_feedback_email: ENV["JITSI_REVIEW_EMAIL"],
|
||||
beta_app_review_info: {
|
||||
contact_email: ENV["JITSI_REVIEW_EMAIL"],
|
||||
contact_first_name: ENV["JITSI_REVIEW_NAME"],
|
||||
contact_last_name: ENV["JITSI_REVIEW_SURNAME"],
|
||||
contact_phone: ENV["JITSI_REVIEW_PHONE"],
|
||||
demo_account_name: ENV["JITSI_DEMO_ACCOUNT"],
|
||||
demo_account_password: ENV["JITSI_DEMO_PASSWORD"],
|
||||
},
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>FMWK</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2.6.0</string>
|
||||
<string>2.8.1</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>$(CURRENT_PROJECT_VERSION)</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
|
||||
34
lang/languages-ar.json
Normal file
34
lang/languages-ar.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"en": "",
|
||||
"af": "",
|
||||
"bg": "",
|
||||
"ca": "",
|
||||
"cs": "",
|
||||
"da": "",
|
||||
"de": "",
|
||||
"el": "",
|
||||
"enGB": "",
|
||||
"eo": "",
|
||||
"es": "",
|
||||
"esUS": "",
|
||||
"et": "",
|
||||
"fi": "",
|
||||
"fr": "",
|
||||
"frCA": "",
|
||||
"hr": "",
|
||||
"hu": "",
|
||||
"hy": "",
|
||||
"it": "",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"nl": "",
|
||||
"oc": "",
|
||||
"pl": "",
|
||||
"ptBR": "",
|
||||
"ru": "",
|
||||
"sv": "",
|
||||
"tr": "",
|
||||
"vi": "",
|
||||
"zhCN": "",
|
||||
"zhTW": ""
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"en": "İngilis",
|
||||
"af": "",
|
||||
"az": "",
|
||||
"bg": "Bolqar",
|
||||
"cs": "",
|
||||
"de": "Alman",
|
||||
"el": "",
|
||||
"eo": "",
|
||||
"es": "İspan",
|
||||
"fr": "Fransız",
|
||||
"hy": "",
|
||||
"it": "",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"nb": "",
|
||||
"oc": "",
|
||||
"pl": "",
|
||||
"ptBR": "",
|
||||
"ru": "",
|
||||
"sk": "",
|
||||
"sl": "",
|
||||
"sv": "",
|
||||
"tr": "",
|
||||
"vi": "",
|
||||
"zhCN": ""
|
||||
}
|
||||
34
lang/languages-be.json
Normal file
34
lang/languages-be.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"en": "Англійская",
|
||||
"af": "Афрыкаанс",
|
||||
"bg": "Балгарская",
|
||||
"ca": "Каталанская",
|
||||
"cs": "Чэшская",
|
||||
"da": "Дацкая",
|
||||
"de": "Нямецкая",
|
||||
"el": "Грэцкая",
|
||||
"enGB": "Англійская (Вялікабрытанія)",
|
||||
"eo": "Эсперанта",
|
||||
"es": "Іспанская",
|
||||
"esUS": "Іспанская (Лацінская Амерыка)",
|
||||
"et": "Эстонская",
|
||||
"fi": "Фінская",
|
||||
"fr": "Французская",
|
||||
"frCA": "Французская (канадская)",
|
||||
"hr": "Харвацкая",
|
||||
"hu": "Венгерская",
|
||||
"hy": "Армянская",
|
||||
"it": "Італьянская",
|
||||
"ja": "Японская",
|
||||
"ko": "Карэйская",
|
||||
"nl": "Галандская",
|
||||
"oc": "Аксітанская",
|
||||
"pl": "Польская",
|
||||
"ptBR": "Партугальская (Бразілія)",
|
||||
"ru": "Расійская",
|
||||
"sv": "Шведская",
|
||||
"tr": "Турэцкая",
|
||||
"vi": "В'етнамская",
|
||||
"zhCN": "Кітайская (Кітай)",
|
||||
"zhTW": "Кітайская (Тайвань)"
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
"bg": "Búlgar",
|
||||
"ca": "Català",
|
||||
"cs": "Txec",
|
||||
"da": "Danès",
|
||||
"de": "Alemany",
|
||||
"el": "Grec",
|
||||
"enGB": "Anglès (Regne Unit)",
|
||||
@@ -12,9 +13,9 @@
|
||||
"esUS": "Espanyol (Amèrica llatina)",
|
||||
"fi": "Finès",
|
||||
"fr": "Francès",
|
||||
"frCA": "Francès (Canadenc)",
|
||||
"frCA": "Francès (Canadà)",
|
||||
"hr": "Croat",
|
||||
"hu": "",
|
||||
"hu": "Hongarès",
|
||||
"hy": "Armeni",
|
||||
"it": "Italià",
|
||||
"ja": "Japonès",
|
||||
@@ -28,5 +29,6 @@
|
||||
"tr": "Turc",
|
||||
"vi": "Vietnamita",
|
||||
"zhCN": "Xinès (Xina)",
|
||||
"zhTW": "Coreà"
|
||||
}
|
||||
"zhTW": "Xinès (Taiwan)",
|
||||
"et": "Estonià"
|
||||
}
|
||||
|
||||
33
lang/languages-da.json
Normal file
33
lang/languages-da.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"en": "Engelsk",
|
||||
"af": "Sydafrikansk",
|
||||
"bg": "Bulgarsk",
|
||||
"ca": "Katalansk",
|
||||
"cs": "Tjekkisk",
|
||||
"da": "Dansk",
|
||||
"de": "Tysk",
|
||||
"el": "Græsk",
|
||||
"enGB": "Engelsk (Storbritannien)",
|
||||
"eo": "Esperanto",
|
||||
"es": "Spansk",
|
||||
"esUS": "Spansk (Latin Amerika)",
|
||||
"fi": "Finsk",
|
||||
"fr": "Fransk",
|
||||
"frCA": "Fransk (Canada)",
|
||||
"hr": "Kroatisk",
|
||||
"hu": "Ungarsk",
|
||||
"hy": "Armensk",
|
||||
"it": "Italiensk",
|
||||
"ja": "Japansk",
|
||||
"ko": "Koreansk",
|
||||
"nl": "Hollandsk",
|
||||
"oc": "Occitansk",
|
||||
"pl": "Polsk",
|
||||
"ptBR": "Portugisisk (Brazilien)",
|
||||
"ru": "Russisk",
|
||||
"sv": "Svensk",
|
||||
"tr": "Tyrkisk",
|
||||
"vi": "Vietnamesisk",
|
||||
"zhCN": "Kinesisk (China)",
|
||||
"zhTW": "Kinesisk (Taiwan)"
|
||||
}
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"en": "Englisch",
|
||||
"af": "",
|
||||
"az": "",
|
||||
"af": "Afrikaans",
|
||||
"az": "Aserbaidschanisch",
|
||||
"bg": "Bulgarisch",
|
||||
"cs": "",
|
||||
"cs": "Tschechisch",
|
||||
"de": "Deutsch",
|
||||
"el": "",
|
||||
"el": "Griechisch",
|
||||
"eo": "Esperanto",
|
||||
"es": "Spanisch",
|
||||
"fr": "Französisch",
|
||||
"hy": "Armenisch",
|
||||
"it": "Italienisch",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"ja": "Japanisch",
|
||||
"ko": "Koreanisch",
|
||||
"nb": "Norwegisch (Bokmal)",
|
||||
"oc": "Okzitanisch",
|
||||
"pl": "Polnisch",
|
||||
@@ -22,6 +22,17 @@
|
||||
"sl": "Slowenisch",
|
||||
"sv": "Schwedisch",
|
||||
"tr": "Türkisch",
|
||||
"vi": "",
|
||||
"zhCN": "Chinesisch (China)"
|
||||
}
|
||||
"vi": "Vietnamesisch",
|
||||
"zhCN": "Chinesisch (China)",
|
||||
"zhTW": "Chinesisch (Taiwan)",
|
||||
"nl": "Niederländisch",
|
||||
"hu": "Ungarisch",
|
||||
"hr": "Kroatisch",
|
||||
"frCA": "Französisch (Kanada)",
|
||||
"fi": "Finnisch",
|
||||
"et": "Estnisch",
|
||||
"esUS": "Spanisch (Lateinamerika)",
|
||||
"enGB": "Englisch (Vereinigtes Königreich)",
|
||||
"da": "Dänisch",
|
||||
"ca": "Katalanisch"
|
||||
}
|
||||
|
||||
@@ -1,27 +1,38 @@
|
||||
{
|
||||
"en": "",
|
||||
"af": "",
|
||||
"en": "English",
|
||||
"af": "Afrikaans",
|
||||
"az": "",
|
||||
"bg": "",
|
||||
"cs": "",
|
||||
"de": "",
|
||||
"el": "",
|
||||
"eo": "",
|
||||
"es": "",
|
||||
"fr": "",
|
||||
"hy": "",
|
||||
"it": "",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"bg": "Bulgarian",
|
||||
"cs": "Czech",
|
||||
"de": "German",
|
||||
"el": "Greek",
|
||||
"eo": "Esperanto",
|
||||
"es": "Spanish",
|
||||
"fr": "French",
|
||||
"hy": "Armenian",
|
||||
"it": "Italian",
|
||||
"ja": "Japanese",
|
||||
"ko": "Korean",
|
||||
"nb": "",
|
||||
"oc": "",
|
||||
"pl": "",
|
||||
"ptBR": "",
|
||||
"ru": "",
|
||||
"oc": "Occitan",
|
||||
"pl": "Polish",
|
||||
"ptBR": "Portuguese (Brazil)",
|
||||
"ru": "Russian",
|
||||
"sk": "",
|
||||
"sl": "",
|
||||
"sv": "",
|
||||
"tr": "",
|
||||
"vi": "",
|
||||
"zhCN": ""
|
||||
}
|
||||
"sv": "Swedish",
|
||||
"tr": "Turkish",
|
||||
"vi": "Vietnamese",
|
||||
"zhCN": "Chinese (China)",
|
||||
"zhTW": "Chinese (Taiwan)",
|
||||
"nl": "Dutch",
|
||||
"hu": "Hungarian",
|
||||
"hr": "Croatian",
|
||||
"frCA": "French (Canadian)",
|
||||
"fi": "Finnish",
|
||||
"et": "Estonian",
|
||||
"esUS": "Spanish (Latin America)",
|
||||
"enGB": "English (United Kingdom)",
|
||||
"da": "Danish",
|
||||
"ca": "Catalan"
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"en": "Angla",
|
||||
"af": "",
|
||||
"az": "",
|
||||
"af": "Afrikansa",
|
||||
"az": "Azera",
|
||||
"bg": "Bulgara",
|
||||
"cs": "",
|
||||
"cs": "Ĉeĥa",
|
||||
"de": "Germana",
|
||||
"el": "",
|
||||
"el": "Hispana",
|
||||
"eo": "Esperanto",
|
||||
"es": "Hispana",
|
||||
"fr": "Franca",
|
||||
"hy": "Armena",
|
||||
"it": "Itala",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"ja": "Japana",
|
||||
"ko": "Korea",
|
||||
"nb": "Norvega (Bukmola)",
|
||||
"oc": "Okcitana",
|
||||
"pl": "Pola",
|
||||
@@ -22,6 +22,6 @@
|
||||
"sl": "Slovena",
|
||||
"sv": "Sveda",
|
||||
"tr": "Turka",
|
||||
"vi": "",
|
||||
"vi": "Vjetnama",
|
||||
"zhCN": "Ĉina (Ĉinuja)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"en": "Inglés",
|
||||
"af": "Africano",
|
||||
"af": "Afrikáans",
|
||||
"bg": "Búlgaro",
|
||||
"ca": "Catalán",
|
||||
"cs": "Checo",
|
||||
@@ -12,21 +12,25 @@
|
||||
"esUS": "Español (América Latina)",
|
||||
"fi": "Finlandés",
|
||||
"fr": "Francés",
|
||||
"frCA": "Franco (Canadiense)",
|
||||
"frCA": "Francés (Canadiense)",
|
||||
"he": "Hebreo",
|
||||
"hr": "Croata",
|
||||
"hu": "Húngaro",
|
||||
"hy": "Armenio",
|
||||
"it": "Italiano",
|
||||
"ja": "Jopones",
|
||||
"ja": "Japonés",
|
||||
"ko": "Coreano",
|
||||
"nl": "Holandés",
|
||||
"oc": "Occitano",
|
||||
"pl": "Polaco",
|
||||
"ptBR": "Portugués (Brasil)",
|
||||
"ru": "Ruso",
|
||||
"sk": "Eslovaco",
|
||||
"sv": "Sueco",
|
||||
"tr": "Turco",
|
||||
"vi": "Vietnamita",
|
||||
"zhCN": "Chino (China)",
|
||||
"zhTW": "Chino (Taiwan)\"msgstr \""
|
||||
}
|
||||
"zhTW": "Chino (Taiwán)",
|
||||
"et": "Estonio",
|
||||
"da": "Danés"
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
"fi": "Finlandés",
|
||||
"fr": "Francés",
|
||||
"frCA": "Francés (Canadiense)",
|
||||
"he": "Hebreo",
|
||||
"hr": "Croata",
|
||||
"hu": "Húngaro",
|
||||
"hy": "Armenio",
|
||||
@@ -24,9 +25,10 @@
|
||||
"pl": "Polaco",
|
||||
"ptBR": "Portugués (Brasil)",
|
||||
"ru": "Ruso",
|
||||
"sk": "Eslovaco",
|
||||
"sv": "Sueco",
|
||||
"tr": "Turco",
|
||||
"vi": "Vietnamita",
|
||||
"zhCN": "Chino (China)",
|
||||
"zhTW": "Chino (Taiwan)\"msgstr \""
|
||||
}
|
||||
"zhTW": "Chino (Taiwan)"
|
||||
}
|
||||
|
||||
33
lang/languages-et.json
Normal file
33
lang/languages-et.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"en": "Inglise keel",
|
||||
"af": "Afrikaani keel",
|
||||
"bg": "Bulgaaria keel",
|
||||
"ca": "Katalaani keel",
|
||||
"cs": "Tšehhi keel",
|
||||
"de": "Saksa keel",
|
||||
"el": "Kreeka keel",
|
||||
"enGB": "Inglise keel (Ühendkuningriik)",
|
||||
"eo": "Esperanto keel",
|
||||
"es": "Hispaania keel",
|
||||
"esUS": "Hispaania keel (Ladina-Ameerika)",
|
||||
"et": "Eesti keel",
|
||||
"fi": "Soome keel",
|
||||
"fr": "Prantsuse keel",
|
||||
"frCA": "Prantsuse keel (Kanada)",
|
||||
"hr": "Horvaadi keel",
|
||||
"hu": "Ungari keel",
|
||||
"hy": "Armeenia keel",
|
||||
"it": "Itaalia keel",
|
||||
"ja": "Jaapani keel",
|
||||
"ko": "Korea keel",
|
||||
"nl": "Hollandi keel",
|
||||
"oc": "Oksitaani keel",
|
||||
"pl": "Poola keel",
|
||||
"ptBR": "Portigali keel (Brasiilia)",
|
||||
"ru": "Vene keel",
|
||||
"sv": "Roosi keel",
|
||||
"tr": "Türgi keel",
|
||||
"vi": "Vietnami keel",
|
||||
"zhCN": "Hiina keel (Hiina)",
|
||||
"zhTW": "Hiina keel (Tai)"
|
||||
}
|
||||
34
lang/languages-eu.json
Normal file
34
lang/languages-eu.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"en": "Ingelesa",
|
||||
"af": "Afrikaans",
|
||||
"bg": "Bulgariera",
|
||||
"ca": "Katalana",
|
||||
"cs": "Txekiera",
|
||||
"da": "Daniera",
|
||||
"de": "Alemana",
|
||||
"el": "Greziera",
|
||||
"enGB": "Ingelesa (Erresuma Batua)",
|
||||
"eo": "Esperantoa",
|
||||
"es": "Gaztelania",
|
||||
"esUS": "Gaztelania (Latinamerika)",
|
||||
"et": "Estoniera",
|
||||
"fi": "Finlandiera",
|
||||
"fr": "Frantsesa",
|
||||
"frCA": "Frantsesa (Kanada)",
|
||||
"hr": "Kroaziera",
|
||||
"hu": "Hungariera",
|
||||
"hy": "Armeniera",
|
||||
"it": "Italiera",
|
||||
"ja": "Japoniera",
|
||||
"ko": "Koreera",
|
||||
"nl": "Nederlandera",
|
||||
"oc": "Okzitaniera",
|
||||
"pl": "Poloniera",
|
||||
"ptBR": "Portugesa (Brasil)",
|
||||
"ru": "Errusiera",
|
||||
"sv": "Suediera",
|
||||
"tr": "Turkiera",
|
||||
"vi": "Vietnamera",
|
||||
"zhCN": "Txinera (Txina)",
|
||||
"zhTW": "Txinera (Taiwan)"
|
||||
}
|
||||
@@ -1,27 +1,38 @@
|
||||
{
|
||||
"en": "",
|
||||
"af": "",
|
||||
"en": "englanti",
|
||||
"af": "afrikaans",
|
||||
"az": "",
|
||||
"bg": "",
|
||||
"cs": "",
|
||||
"de": "",
|
||||
"el": "",
|
||||
"eo": "",
|
||||
"es": "",
|
||||
"fr": "",
|
||||
"hy": "",
|
||||
"it": "",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"bg": "bulgaria",
|
||||
"cs": "tšekki",
|
||||
"de": "saksa",
|
||||
"el": "kreikka",
|
||||
"eo": "esperanto",
|
||||
"es": "espanja",
|
||||
"fr": "ranska",
|
||||
"hy": "armenia",
|
||||
"it": "italia",
|
||||
"ja": "japani",
|
||||
"ko": "korea",
|
||||
"nb": "",
|
||||
"oc": "",
|
||||
"pl": "",
|
||||
"ptBR": "",
|
||||
"ru": "",
|
||||
"oc": "oksitaani",
|
||||
"pl": "puola",
|
||||
"ptBR": "portugali (Brasilia)",
|
||||
"ru": "venäjä",
|
||||
"sk": "",
|
||||
"sl": "",
|
||||
"sv": "",
|
||||
"tr": "",
|
||||
"vi": "",
|
||||
"zhCN": ""
|
||||
}
|
||||
"sv": "ruotsi",
|
||||
"tr": "turkki",
|
||||
"vi": "vietnam",
|
||||
"zhCN": "kiina (Kiina)",
|
||||
"zhTW": "kiina (Taiwan)",
|
||||
"nl": "hollanti",
|
||||
"hu": "unkari",
|
||||
"hr": "kroaatti",
|
||||
"frCA": "ranska (Kanada)",
|
||||
"fi": "suomi",
|
||||
"et": "viro",
|
||||
"esUS": "espanja (Latinalainen Amerikka)",
|
||||
"enGB": "englanti (Yhdistynyt kuningaskunta)",
|
||||
"da": "tanska",
|
||||
"ca": "katalaani"
|
||||
}
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
"cs": "Tchèque",
|
||||
"de": "Allemand",
|
||||
"el": "Grec",
|
||||
"enGB": "Anglais (Royaume-Uni) ",
|
||||
"enGB": "Anglais (Royaume-Uni)",
|
||||
"eo": "Espéranto",
|
||||
"es": "Espagnol",
|
||||
"esUS": "Espagnol (Amérique latine)",
|
||||
"fi": "Finlandais",
|
||||
"fi": "Finnois",
|
||||
"fr": "Français",
|
||||
"frCA": "Français (Canadien)",
|
||||
"frCA": "Français (Canada)",
|
||||
"hr": "Croate",
|
||||
"hu": "Hongrois",
|
||||
"hy": "Arménien",
|
||||
@@ -24,9 +24,12 @@
|
||||
"pl": "Polonais",
|
||||
"ptBR": "Portugais (Brésil)",
|
||||
"ru": "Russe",
|
||||
"sk": "Slovaque",
|
||||
"sv": "Suédois",
|
||||
"tr": "Turc",
|
||||
"vi": "Vietnamien",
|
||||
"zhCN": "Chinois (Chine)",
|
||||
"zhTW": "Chinois (Taiwan)"
|
||||
}
|
||||
"zhTW": "Chinois (Taiwan)",
|
||||
"et": "Estonien",
|
||||
"da": "Danois"
|
||||
}
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
"cs": "Tchèque",
|
||||
"de": "Allemand",
|
||||
"el": "Grec",
|
||||
"enGB": "Anglais (Royaume-Uni) ",
|
||||
"enGB": "Anglais (Royaume-Uni)",
|
||||
"eo": "Espéranto",
|
||||
"es": "Espagnol",
|
||||
"esUS": "Espagnol (Amérique latine)",
|
||||
"fi": "Finlandais",
|
||||
"fi": "Finnois",
|
||||
"fr": "Français",
|
||||
"frCA": "Français (Canadien)",
|
||||
"hr": "Croate",
|
||||
@@ -24,9 +24,12 @@
|
||||
"pl": "Polonais",
|
||||
"ptBR": "Portugais (Brésil)",
|
||||
"ru": "Russe",
|
||||
"sk": "Slovaque",
|
||||
"sv": "Suédois",
|
||||
"tr": "Turc",
|
||||
"vi": "Vietnamien",
|
||||
"zhCN": "Chinois (Chine)",
|
||||
"zhTW": "Chinois (Taiwan)"
|
||||
}
|
||||
"zhTW": "Chinois (Taiwan)",
|
||||
"et": "Estonien",
|
||||
"da": "Danois"
|
||||
}
|
||||
|
||||
34
lang/languages-fy.json
Normal file
34
lang/languages-fy.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"en": "",
|
||||
"af": "",
|
||||
"bg": "",
|
||||
"ca": "",
|
||||
"cs": "",
|
||||
"da": "",
|
||||
"de": "",
|
||||
"el": "",
|
||||
"enGB": "",
|
||||
"eo": "",
|
||||
"es": "",
|
||||
"esUS": "",
|
||||
"et": "",
|
||||
"fi": "",
|
||||
"fr": "",
|
||||
"frCA": "",
|
||||
"hr": "",
|
||||
"hu": "",
|
||||
"hy": "",
|
||||
"it": "",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"nl": "",
|
||||
"oc": "",
|
||||
"pl": "",
|
||||
"ptBR": "",
|
||||
"ru": "",
|
||||
"sv": "",
|
||||
"tr": "",
|
||||
"vi": "",
|
||||
"zhCN": "",
|
||||
"zhTW": ""
|
||||
}
|
||||
@@ -28,5 +28,7 @@
|
||||
"tr": "Turco",
|
||||
"vi": "Vietnamita",
|
||||
"zhCN": "Chinés (China)",
|
||||
"zhTW": "Chinés (Taiwan)"
|
||||
}
|
||||
"zhTW": "Chinés (Taiwan)",
|
||||
"et": "Estoniano",
|
||||
"da": "Dinamarqués"
|
||||
}
|
||||
|
||||
@@ -24,9 +24,12 @@
|
||||
"pl": "Lengyel",
|
||||
"ptBR": "Portugál (Brazil)",
|
||||
"ru": "Orosz",
|
||||
"sk": "Szlovákul",
|
||||
"sv": "Svéd",
|
||||
"tr": "Török",
|
||||
"vi": "Vietnámi",
|
||||
"zhCN": "Kínai (Kína)",
|
||||
"zhTW": "Kínai (Tajvan)\"msgstr \""
|
||||
}
|
||||
"zhTW": "Kínai (Tajvan)",
|
||||
"et": "Észt",
|
||||
"da": "Dán"
|
||||
}
|
||||
|
||||
34
lang/languages-is.json
Normal file
34
lang/languages-is.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"en": "Enska",
|
||||
"af": "Afríkanska",
|
||||
"bg": "Búlgarska",
|
||||
"ca": "Katalónska",
|
||||
"cs": "Tékkneska",
|
||||
"da": "Danska",
|
||||
"de": "Þýska",
|
||||
"el": "Gríska",
|
||||
"enGB": "Enska (Bretland)",
|
||||
"eo": "Esperantó",
|
||||
"es": "Spænska",
|
||||
"esUS": "Spænska (spænskumælandi Ameríka)",
|
||||
"et": "Eistneska",
|
||||
"fi": "Finnska",
|
||||
"fr": "Franska",
|
||||
"frCA": "Franska (kanadísk)",
|
||||
"hr": "Króatíska",
|
||||
"hu": "Ungverska",
|
||||
"hy": "Armenska",
|
||||
"it": "Ítalska",
|
||||
"ja": "Japanska",
|
||||
"ko": "Kóreska",
|
||||
"nl": "Hollenska",
|
||||
"oc": "Occitanska",
|
||||
"pl": "Pólska",
|
||||
"ptBR": "Portúgalska (Brasilía)",
|
||||
"ru": "Rússneska",
|
||||
"sv": "Sænska",
|
||||
"tr": "Tyrkneska",
|
||||
"vi": "Víetnamska",
|
||||
"zhCN": "Kínverska (Kína)",
|
||||
"zhTW": "Kínverska (Taívan)"
|
||||
}
|
||||
@@ -23,5 +23,16 @@
|
||||
"sv": "Svedese",
|
||||
"tr": "Turco",
|
||||
"vi": "Vietnamita",
|
||||
"zhCN": "Cinese (Cina)"
|
||||
"zhCN": "Cinese (Cina)",
|
||||
"enGB": "Inglese (Regno Unito)",
|
||||
"da": "Danese",
|
||||
"ca": "Catalano",
|
||||
"zhTW": "",
|
||||
"nl": "",
|
||||
"hu": "",
|
||||
"hr": "",
|
||||
"frCA": "",
|
||||
"fi": "",
|
||||
"et": "",
|
||||
"esUS": ""
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"en": "Taglizit",
|
||||
"af": "",
|
||||
"az": "",
|
||||
"af": "Tafrikant",
|
||||
"az": "Tazirit",
|
||||
"bg": "Tabulgarit",
|
||||
"cs": "Taččikit",
|
||||
"de": "Talmanit",
|
||||
@@ -24,4 +24,4 @@
|
||||
"tr": "Taṭurkit",
|
||||
"vi": "Tavyitnamit",
|
||||
"zhCN": "Tavyitnamit"
|
||||
}
|
||||
}
|
||||
|
||||
35
lang/languages-lt.json
Normal file
35
lang/languages-lt.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"en": "Anglų",
|
||||
"af": "Afrikanų",
|
||||
"bg": "Bulgarų",
|
||||
"ca": "Katalanų",
|
||||
"cs": "Čekų",
|
||||
"da": "Danų",
|
||||
"de": "Vokiečių",
|
||||
"el": "Graikų",
|
||||
"enGB": "Anglų (Britų)",
|
||||
"eo": "Esperanto",
|
||||
"es": "Ispanų",
|
||||
"esUS": "Ispanų (Lotynų Amerika)",
|
||||
"et": "Estų",
|
||||
"fi": "Suomių",
|
||||
"fr": "Prancūzų",
|
||||
"frCA": "Prancūzų (Kanada)",
|
||||
"hr": "Kroatų",
|
||||
"hu": "Vengrų",
|
||||
"hy": "Armėnų",
|
||||
"it": "Italų",
|
||||
"ja": "Japonų",
|
||||
"lt": "Lietuvių",
|
||||
"ko": "Korėjiečių",
|
||||
"nl": "Olandų",
|
||||
"oc": "Oksitanų",
|
||||
"pl": "Lenkų",
|
||||
"ptBR": "Portugalų (Brazilija)",
|
||||
"ru": "Rusų",
|
||||
"sv": "Švedų",
|
||||
"tr": "Turkų",
|
||||
"vi": "Vietnamiečių",
|
||||
"zhCN": "Kinų (China)",
|
||||
"zhTW": "Kinų (Taivanas)"
|
||||
}
|
||||
35
lang/languages-mn.json
Normal file
35
lang/languages-mn.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"en": "English",
|
||||
"af": "Afrikaans",
|
||||
"bg": "Bulgarian",
|
||||
"ca": "Catalan",
|
||||
"cs": "Czech",
|
||||
"da": "Danish",
|
||||
"de": "German",
|
||||
"el": "Greek",
|
||||
"enGB": "English (United Kingdom)",
|
||||
"eo": "Esperanto",
|
||||
"es": "Spanish",
|
||||
"esUS": "Spanish (Latin America)",
|
||||
"et": "Estonian",
|
||||
"fi": "Finnish",
|
||||
"fr": "French",
|
||||
"frCA": "French (Canadian)",
|
||||
"hr": "Croatian",
|
||||
"hu": "Hungarian",
|
||||
"hy": "Armenian",
|
||||
"it": "Italian",
|
||||
"ja": "Japanese",
|
||||
"ko": "Korean",
|
||||
"nl": "Dutch",
|
||||
"oc": "Occitan",
|
||||
"pl": "Polish",
|
||||
"ptBR": "Portuguese (Brazil)",
|
||||
"ru": "Russian",
|
||||
"sv": "Swedish",
|
||||
"tr": "Turkish",
|
||||
"vi": "Vietnamese",
|
||||
"zhCN": "Chinese (China)",
|
||||
"zhTW": "Chinese (Taiwan)",
|
||||
"mn": "Монгол"
|
||||
}
|
||||
@@ -1,27 +1,31 @@
|
||||
{
|
||||
"en": "",
|
||||
"en": "Engelsk",
|
||||
"af": "",
|
||||
"az": "",
|
||||
"bg": "",
|
||||
"cs": "",
|
||||
"de": "",
|
||||
"el": "",
|
||||
"cs": "Tsjekkisk",
|
||||
"de": "Tysk",
|
||||
"el": "Gresk",
|
||||
"eo": "",
|
||||
"es": "",
|
||||
"fr": "",
|
||||
"es": "Spansk",
|
||||
"fr": "Fransk",
|
||||
"hy": "",
|
||||
"it": "",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"it": "Italiensk",
|
||||
"ja": "Japansk",
|
||||
"ko": "Koreansk",
|
||||
"nb": "",
|
||||
"oc": "",
|
||||
"pl": "",
|
||||
"pl": "Polsk",
|
||||
"ptBR": "",
|
||||
"ru": "",
|
||||
"ru": "Russisk",
|
||||
"sk": "",
|
||||
"sl": "",
|
||||
"sv": "",
|
||||
"tr": "",
|
||||
"vi": "",
|
||||
"zhCN": ""
|
||||
}
|
||||
"sv": "Svensk",
|
||||
"tr": "Tyrkisk",
|
||||
"vi": "Vietnamesisk",
|
||||
"zhCN": "",
|
||||
"da": "Dansk",
|
||||
"hu": "Ungarsk",
|
||||
"hr": "Kroatisk",
|
||||
"fi": "Finsk"
|
||||
}
|
||||
|
||||
@@ -1,27 +1,38 @@
|
||||
{
|
||||
"en": "",
|
||||
"af": "",
|
||||
"az": "",
|
||||
"bg": "",
|
||||
"cs": "",
|
||||
"de": "",
|
||||
"el": "",
|
||||
"eo": "",
|
||||
"es": "",
|
||||
"fr": "",
|
||||
"hy": "",
|
||||
"it": "",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"nb": "",
|
||||
"oc": "",
|
||||
"pl": "",
|
||||
"ptBR": "",
|
||||
"ru": "",
|
||||
"sk": "",
|
||||
"sl": "",
|
||||
"sv": "",
|
||||
"tr": "",
|
||||
"vi": "",
|
||||
"zhCN": ""
|
||||
}
|
||||
"en": "Engels",
|
||||
"af": "Afrikaans",
|
||||
"az": "Azerbeidzjaans",
|
||||
"bg": "Bulgaars",
|
||||
"ca": "Catalaans",
|
||||
"cs": "Tsjechisch",
|
||||
"da": "Deens",
|
||||
"de": "Duits",
|
||||
"enGB": "Engels (Verenigd Koninkrijk)",
|
||||
"et": "Estlands",
|
||||
"el": "Grieks",
|
||||
"eo": "Esperanto",
|
||||
"es": "Spaans",
|
||||
"esUS": "Spaans (Latijns Amerika)",
|
||||
"fi": "Fins",
|
||||
"fr": "Frans",
|
||||
"frCA": "Frans (Canadees)",
|
||||
"hr": "Kroatisch",
|
||||
"hu": "Hongaars",
|
||||
"hy": "Armeens",
|
||||
"it": "Italiaans",
|
||||
"ja": "Japans",
|
||||
"ko": "Koreaans",
|
||||
"nb": "Noors (Bokmal)",
|
||||
"nl": "Nederlands",
|
||||
"oc": "Occitaans",
|
||||
"pl": "Pools",
|
||||
"ptBR": "Portugees (Brazilië)",
|
||||
"ru": "Russisch",
|
||||
"sk": "Slowaaks",
|
||||
"sl": "Sloveens",
|
||||
"sv": "Zweeds",
|
||||
"tr": "Turks",
|
||||
"vi": "Vietnamees",
|
||||
"zhCN": "Chinees (China)",
|
||||
"zhTW": "Chinees (Taiwan)"
|
||||
}
|
||||
|
||||
@@ -28,5 +28,7 @@
|
||||
"tr": "Turc",
|
||||
"vi": "Vietnamian",
|
||||
"zhCN": "Chinés (China)",
|
||||
"zhTW": "Chinés (Taiwan)"
|
||||
}
|
||||
"zhTW": "Chinés (Taiwan)",
|
||||
"et": "Estonian",
|
||||
"da": "Danés"
|
||||
}
|
||||
|
||||
@@ -1,32 +1,33 @@
|
||||
{
|
||||
"en": "Angielski",
|
||||
"af": "Afrykanerski",
|
||||
"bg": "Bułgarski",
|
||||
"ca": "Kataloński",
|
||||
"cs": "Czeski",
|
||||
"de": "Niemiecki",
|
||||
"el": "Grecki",
|
||||
"enGB": "Angielski (Zjednoczone Królestwo)",
|
||||
"eo": "Esperanto",
|
||||
"es": "Hiszpański",
|
||||
"esUS": "Hiszpański (Ameryka Łacińska)",
|
||||
"fi": "Fiński",
|
||||
"fr": "Francuski",
|
||||
"frCA": "Francuski (kanadyjski)",
|
||||
"hr": "Chorwacki",
|
||||
"hu": "Węgierski",
|
||||
"hy": "Ormiański",
|
||||
"it": "Włoski",
|
||||
"ja": "Japoński",
|
||||
"ko": "Koreański",
|
||||
"nl": "Holenderski",
|
||||
"oc": "Oksytański",
|
||||
"pl": "Polski",
|
||||
"ptBR": "Portugalski (brazylijski)",
|
||||
"ru": "Rosyjski",
|
||||
"sv": "Szwedzki",
|
||||
"tr": "Turecki",
|
||||
"vi": "Wietnamski",
|
||||
"zhCN": "Chiński (Chiny)",
|
||||
"zhTW": "Chiński (Tajwan)\"msgstr \""
|
||||
"en": "angielski",
|
||||
"af": "afrykanerski",
|
||||
"bg": "bułgarski",
|
||||
"ca": "kataloński",
|
||||
"cs": "czeski",
|
||||
"de": "niemiecki",
|
||||
"el": "grecki",
|
||||
"enGB": "angielski (Zjednoczone Królestwo)",
|
||||
"eo": "esperanto",
|
||||
"es": "hiszpański",
|
||||
"esUS": "hiszpański (Ameryka Łacińska)",
|
||||
"fi": "fiński",
|
||||
"fr": "francuski",
|
||||
"frCA": "francuski (kanadyjski)",
|
||||
"hr": "chorwacki",
|
||||
"hu": "węgierski",
|
||||
"hy": "ormiański",
|
||||
"it": "włoski",
|
||||
"ja": "japoński",
|
||||
"ko": "koreański",
|
||||
"nl": "holenderski",
|
||||
"oc": "oksytański",
|
||||
"pl": "polski",
|
||||
"ptBR": "portugalski (brazylijski)",
|
||||
"ru": "rosyjski",
|
||||
"sk": "słowacki",
|
||||
"sv": "szwedzki",
|
||||
"tr": "turecki",
|
||||
"vi": "wietnamski",
|
||||
"zhCN": "chiński (Chiny)",
|
||||
"zhTW": "chiński (Tajwan)"
|
||||
}
|
||||
33
lang/languages-pt.json
Normal file
33
lang/languages-pt.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"en": "Inglês",
|
||||
"af": "Africâner",
|
||||
"bg": "Búlgaro",
|
||||
"ca": "Catalão",
|
||||
"cs": "Checo",
|
||||
"de": "Alemão",
|
||||
"el": "Grego",
|
||||
"enGB": "Inglês (Reino Unido)",
|
||||
"eo": "Esperanto",
|
||||
"es": "Espanhol",
|
||||
"esUS": "Espanhol (América Latina)",
|
||||
"fi": "Finlandês",
|
||||
"fr": "Francês",
|
||||
"frCA": "Francês (Canadá)",
|
||||
"hr": "Croata",
|
||||
"hu": "Húngaro",
|
||||
"hy": "Armênio",
|
||||
"it": "Italiano",
|
||||
"ja": "Japonês",
|
||||
"ko": "Coreano",
|
||||
"nl": "Holandês",
|
||||
"oc": "Occitano",
|
||||
"pl": "Polonês",
|
||||
"pt": "Português",
|
||||
"ptBR": "Português (Brasil)",
|
||||
"ru": "Russo",
|
||||
"sv": "Sueco",
|
||||
"tr": "Turco",
|
||||
"vi": "Vietnamita",
|
||||
"zhCN": "Chinês (China)",
|
||||
"zhTW": "Chinês (Taiwan)"
|
||||
}
|
||||
@@ -28,5 +28,5 @@
|
||||
"tr": "Turco",
|
||||
"vi": "Vietnamita",
|
||||
"zhCN": "Chinês (China)",
|
||||
"zhTW": "Chinês (Taiwan)\"msgstr \""
|
||||
"zhTW": "Chinês (Taiwan)"
|
||||
}
|
||||
@@ -28,5 +28,7 @@
|
||||
"tr": "Турецкий",
|
||||
"vi": "Вьетнамский",
|
||||
"zhCN": "Китайский (Китай)",
|
||||
"zhTW": "Китайский (Тайвань)"
|
||||
}
|
||||
"zhTW": "Китайский (Тайвань)",
|
||||
"et": "Эстонский",
|
||||
"da": "Датский"
|
||||
}
|
||||
|
||||
34
lang/languages-sc.json
Normal file
34
lang/languages-sc.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"en": "Inglesu",
|
||||
"af": "Afrikaans",
|
||||
"bg": "Bùlgaru",
|
||||
"ca": "Catalanu",
|
||||
"cs": "Tzecu",
|
||||
"da": "Danesu",
|
||||
"de": "Tedescu",
|
||||
"el": "Gregu",
|
||||
"enGB": "Inglesu (Rennu Unidu)",
|
||||
"eo": "Esperanto",
|
||||
"es": "Castillianu",
|
||||
"esUS": "Castillianu (Amèrica de su Sud)",
|
||||
"fi": "Finlandesu",
|
||||
"fr": "Frantzesu",
|
||||
"frCA": "Frantzesu (Canadesu)",
|
||||
"hr": "Croatu",
|
||||
"hu": "Ungheresu",
|
||||
"hy": "Armenu",
|
||||
"it": "Italianu",
|
||||
"ja": "Giaponesu",
|
||||
"ko": "Coreanu",
|
||||
"nl": "Olandesu",
|
||||
"oc": "Otzitanu",
|
||||
"pl": "Polacu",
|
||||
"ptBR": "Portughesu (Brasile)",
|
||||
"ru": "Russu",
|
||||
"sc": "Sardu",
|
||||
"sv": "Isvedesu",
|
||||
"tr": "Turcu",
|
||||
"vi": "Vietnamita",
|
||||
"zhCN": "Tzinesu (Tzina)",
|
||||
"zhTW": "Tzinesu (Taiwan)"
|
||||
}
|
||||
@@ -2,31 +2,34 @@
|
||||
"en": "Angličtina",
|
||||
"af": "",
|
||||
"bg": "Bulharština",
|
||||
"ca": "",
|
||||
"cs": "",
|
||||
"ca": "Katalánština",
|
||||
"cs": "Čeština",
|
||||
"da": "Dánština",
|
||||
"de": "Nemčina",
|
||||
"el": "",
|
||||
"enGB": "",
|
||||
"eo": "",
|
||||
"es": "",
|
||||
"esUS": "",
|
||||
"fi": "",
|
||||
"el": "Gréčtina",
|
||||
"enGB": "Angličtina (Spojené kráľovstvo)",
|
||||
"eo": "Esperanto",
|
||||
"es": "Španielčina",
|
||||
"esUS": "Angličtina (Spojené štáty americké)",
|
||||
"et": "Estónčina",
|
||||
"fi": "Fínčina",
|
||||
"fr": "Francúžtina",
|
||||
"frCA": "",
|
||||
"hr": "",
|
||||
"hu": "",
|
||||
"hy": "",
|
||||
"frCA": "Francúžtina (Kanada)",
|
||||
"hr": "Chorvátčina",
|
||||
"hu": "Maďarčina",
|
||||
"hy": "Arménčina",
|
||||
"it": "Taliančina",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"nl": "",
|
||||
"oc": "",
|
||||
"pl": "",
|
||||
"ptBR": "",
|
||||
"ru": "",
|
||||
"sv": "",
|
||||
"ja": "Japončina",
|
||||
"ko": "Kórejčina",
|
||||
"nl": "Holandčina",
|
||||
"oc": "Okcitánština",
|
||||
"pl": "Polština",
|
||||
"ptBR": "Portugalčina",
|
||||
"ru": "Ruština",
|
||||
"sk": "Slovenčina",
|
||||
"sv": "Švédčina",
|
||||
"tr": "Turečtina",
|
||||
"vi": "",
|
||||
"zhCN": "",
|
||||
"zhTW": ""
|
||||
"vi": "Vietnamčina",
|
||||
"zhCN": "Čínština (Čína)",
|
||||
"zhTW": "Čínština (Taiwan)"
|
||||
}
|
||||
34
lang/languages-sr.json
Normal file
34
lang/languages-sr.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"en": "",
|
||||
"af": "",
|
||||
"bg": "",
|
||||
"ca": "",
|
||||
"cs": "",
|
||||
"da": "",
|
||||
"de": "",
|
||||
"el": "",
|
||||
"enGB": "",
|
||||
"eo": "",
|
||||
"es": "",
|
||||
"esUS": "",
|
||||
"et": "",
|
||||
"fi": "",
|
||||
"fr": "",
|
||||
"frCA": "",
|
||||
"hr": "",
|
||||
"hu": "",
|
||||
"hy": "",
|
||||
"it": "",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"nl": "",
|
||||
"oc": "",
|
||||
"pl": "",
|
||||
"ptBR": "",
|
||||
"ru": "",
|
||||
"sv": "",
|
||||
"tr": "",
|
||||
"vi": "",
|
||||
"zhCN": "",
|
||||
"zhTW": ""
|
||||
}
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"en": "Engelska",
|
||||
"af": "",
|
||||
"af": "Afrikaans",
|
||||
"az": "",
|
||||
"bg": "Bulgariska",
|
||||
"cs": "",
|
||||
"cs": "Tjeckiska",
|
||||
"de": "Tyska",
|
||||
"el": "",
|
||||
"el": "Grekiska",
|
||||
"eo": "Esperanto",
|
||||
"es": "Spanska",
|
||||
"fr": "Franska",
|
||||
"hy": "Armeniska",
|
||||
"it": "Italienska",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"ja": "Japanska",
|
||||
"ko": "Koreanska",
|
||||
"nb": "Norska (Bokmål)",
|
||||
"oc": "Occitanska",
|
||||
"pl": "Polska",
|
||||
@@ -22,6 +22,17 @@
|
||||
"sl": "Slovenska",
|
||||
"sv": "Svenska",
|
||||
"tr": "Turkiska",
|
||||
"vi": "",
|
||||
"zhCN": "Kinesiska (Kina)"
|
||||
}
|
||||
"vi": "Vietnamesiska",
|
||||
"zhCN": "Kinesiska (Kina)",
|
||||
"zhTW": "Kinesiska (Taiwan)",
|
||||
"nl": "Nederländska",
|
||||
"hu": "Ungerska",
|
||||
"hr": "Kroatiska",
|
||||
"frCA": "Franska (Kanada)",
|
||||
"fi": "Finska",
|
||||
"et": "Estniska",
|
||||
"esUS": "Spanska (Latinamerika)",
|
||||
"enGB": "Engelska (Storbritannien)",
|
||||
"da": "Danska",
|
||||
"ca": "Katalanska"
|
||||
}
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
{
|
||||
"en": "İngilizce",
|
||||
"af": "",
|
||||
"af": "Afrikanca",
|
||||
"az": "",
|
||||
"bg": "Bulgarca",
|
||||
"cs": "",
|
||||
"cs": "Çekçe",
|
||||
"de": "Almanca",
|
||||
"el": "",
|
||||
"el": "Yunanca",
|
||||
"eo": "Esperanto",
|
||||
"es": "İspanyolca",
|
||||
"fr": "Fransızca",
|
||||
"hy": "Ermenice",
|
||||
"it": "İtalyanca",
|
||||
"ja": "",
|
||||
"ko": "",
|
||||
"ja": "Japonca",
|
||||
"ko": "Korece",
|
||||
"nb": "Norveççe Bokmal",
|
||||
"oc": "Oksitan dili",
|
||||
"pl": "Lehçe",
|
||||
@@ -22,6 +22,17 @@
|
||||
"sl": "Slovence",
|
||||
"sv": "Isveççe",
|
||||
"tr": "Türkçe",
|
||||
"vi": "",
|
||||
"zhCN": "Çince (Tayvan)"
|
||||
}
|
||||
"vi": "Vietnamca",
|
||||
"zhCN": "Çince (Çin)",
|
||||
"zhTW": "Çince (Tayvan)",
|
||||
"nl": "Flemenkçe",
|
||||
"hu": "Macarca",
|
||||
"hr": "Hırvatça",
|
||||
"frCA": "Fransızca (Kanada)",
|
||||
"fi": "Fince",
|
||||
"et": "Estonca",
|
||||
"esUS": "İspanyolca (Latin Amerika)",
|
||||
"enGB": "İngilizce (Birleşik Krallık)",
|
||||
"da": "Danca",
|
||||
"ca": "Katalanca"
|
||||
}
|
||||
|
||||
34
lang/languages-uk.json
Normal file
34
lang/languages-uk.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"en": "Англійська",
|
||||
"af": "Африкаанс",
|
||||
"bg": "Болгарська",
|
||||
"ca": "Каталонська",
|
||||
"cs": "Чеська",
|
||||
"da": "Данська",
|
||||
"de": "Німецька",
|
||||
"el": "Грецька",
|
||||
"enGB": "Англійська (Велика Британія)",
|
||||
"eo": "Есперанто",
|
||||
"es": "Іспанська",
|
||||
"esUS": "Іспанська (Латинська Америка)",
|
||||
"et": "Естонська",
|
||||
"fi": "Фінська",
|
||||
"fr": "Французька",
|
||||
"frCA": "Французька (Канада)",
|
||||
"hr": "Хорватська",
|
||||
"hu": "Угорська",
|
||||
"hy": "Вірменська",
|
||||
"it": "Італійська",
|
||||
"ja": "Японська",
|
||||
"ko": "Корейська",
|
||||
"nl": "Голландська",
|
||||
"oc": "Окситанська",
|
||||
"pl": "Польська",
|
||||
"ptBR": "Португальська (Бразилія)",
|
||||
"ru": "Російська",
|
||||
"sv": "Шведська",
|
||||
"tr": "Турецька",
|
||||
"vi": "В'єтнамська",
|
||||
"zhCN": "Китайська (Китай)",
|
||||
"zhTW": "Китайська (Тайвань)"
|
||||
}
|
||||
@@ -1,32 +1,34 @@
|
||||
{
|
||||
"en": "English",
|
||||
"af": "Afrikaans",
|
||||
"bg": "Bulgarian",
|
||||
"ca": "Catalan",
|
||||
"cs": "Czech",
|
||||
"de": "German",
|
||||
"el": "Greek",
|
||||
"enGB": "English (United Kingdom)",
|
||||
"eo": "Esperanto",
|
||||
"es": "Spanish",
|
||||
"esUS": "Spanish (Latin America)",
|
||||
"fi": "Finnish",
|
||||
"fr": "French",
|
||||
"frCA": "French (Canadian)",
|
||||
"hr": "Croatian",
|
||||
"hu": "Hungarian",
|
||||
"hy": "Armenian",
|
||||
"it": "Italian",
|
||||
"ja": "日本語",
|
||||
"en": "英語",
|
||||
"af": "南非荷蘭文",
|
||||
"bg": "保加利亞文",
|
||||
"ca": "卡達隆尼亞文",
|
||||
"cs": "捷克文",
|
||||
"de": "德文",
|
||||
"el": "希臘文",
|
||||
"enGB": "英文 (英國)",
|
||||
"eo": "世界語",
|
||||
"es": "西班牙文",
|
||||
"esUS": "西班牙文 (拉丁美洲)",
|
||||
"fi": "芬蘭文",
|
||||
"fr": "法文",
|
||||
"frCA": "法文 (加拿大)",
|
||||
"hr": "克羅埃西亞文",
|
||||
"hu": "匈牙利文",
|
||||
"hy": "亞美尼亞文",
|
||||
"it": "義大利文",
|
||||
"ja": "日語",
|
||||
"ko": "韓文",
|
||||
"nl": "Dutch",
|
||||
"oc": "Occitan",
|
||||
"pl": "Polish",
|
||||
"ptBR": "Portuguese (Brazil)",
|
||||
"ru": "Russian",
|
||||
"sv": "Swedish",
|
||||
"tr": "Turkish",
|
||||
"vi": "Vietnamese",
|
||||
"zhCN": "中文 简体 (中国)",
|
||||
"zhTW": "中文 正體 (台灣)\"msgstr \""
|
||||
}
|
||||
"nl": "荷蘭文",
|
||||
"oc": "奧西坦文",
|
||||
"pl": "波蘭文",
|
||||
"ptBR": "葡萄牙文 (巴西)",
|
||||
"ru": "俄文",
|
||||
"sv": "瑞典文",
|
||||
"tr": "土耳其文",
|
||||
"vi": "越南文",
|
||||
"zhCN": "中文 (中国,简体)",
|
||||
"zhTW": "中文 (台灣,正體)",
|
||||
"et": "愛沙尼亞文",
|
||||
"da": "丹麥文"
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user