mirror of https://github.com/OpenVidu/openvidu.git
openvidu-components: Integrated broadcast feature
parent
6aab00900e
commit
d4be677613
|
@ -1050,30 +1050,6 @@ describe('Testing ATTRIBUTE DIRECTIVES', () => {
|
|||
expect(await utils.isPresent('ov-streaming-activity')).to.be.false;
|
||||
});
|
||||
|
||||
it('should SHOW STARTING STREAMING status', async () => {
|
||||
await browser.get(`${url}`);
|
||||
|
||||
await utils.clickOn('#ovActivitiesPanel-checkbox');
|
||||
|
||||
await utils.clickOn('#streamingInfo-checkbox');
|
||||
|
||||
await utils.clickOn('#apply-btn');
|
||||
|
||||
await utils.checkToolbarIsPresent();
|
||||
|
||||
// Open more options menu
|
||||
await utils.clickOn('#activities-panel-btn');
|
||||
|
||||
await browser.sleep(500);
|
||||
|
||||
await utils.waitForElement('#custom-activities-panel');
|
||||
console.log('before');
|
||||
|
||||
const status = await utils.waitForElement('#streaming-status');
|
||||
|
||||
expect(await status.getAttribute('innerText')).equals('STARTED');
|
||||
});
|
||||
|
||||
it('should SHOW STREAMING ERROR', async () => {
|
||||
await browser.get(`${url}`);
|
||||
|
||||
|
@ -1099,7 +1075,6 @@ describe('Testing ATTRIBUTE DIRECTIVES', () => {
|
|||
await browser.sleep(500);
|
||||
const error = await utils.waitForElement('#streaming-error');
|
||||
expect(await error.getAttribute('innerText')).equals('TEST_ERROR');
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -1258,6 +1233,5 @@ describe('Testing EVENTS', () => {
|
|||
|
||||
await utils.waitForElement('#onActivitiesPanelButtonClicked');
|
||||
expect(await utils.isPresent('#onActivitiesPanelButtonClicked')).to.be.true;
|
||||
|
||||
});
|
||||
});
|
||||
|
|
|
@ -129,7 +129,6 @@ $(document).ready(() => {
|
|||
|
||||
webComponent.addEventListener('onToolbarStopStreamingClicked', async (event) => {
|
||||
appendElement('onToolbarStopStreamingClicked');
|
||||
webComponent.streamingActivityStreamingInfo = { status: 'stopped', id: '01' };
|
||||
});
|
||||
|
||||
webComponent.addEventListener('onActivitiesPanelStartRecordingClicked', async (event) => {
|
||||
|
@ -144,17 +143,15 @@ $(document).ready(() => {
|
|||
// });
|
||||
|
||||
webComponent.addEventListener('onActivitiesPanelDeleteRecordingClicked', (event) =>
|
||||
appendElement('onActivitiesPanelDeleteRecordingClicked')
|
||||
appendElement('onActivitiesPanelDeleteRecordingClicked');
|
||||
);
|
||||
|
||||
webComponent.addEventListener('onActivitiesPanelStartStreamingClicked', async (event) => {
|
||||
appendElement('onActivitiesPanelStartStreamingClicked');
|
||||
webComponent.streamingActivityStreamingInfo = { status: 'started', id: '01' };
|
||||
});
|
||||
|
||||
webComponent.addEventListener('onActivitiesPanelStopStreamingClicked', async (event) => {
|
||||
appendElement('onActivitiesPanelStopStreamingClicked');
|
||||
webComponent.streamingActivityStreamingInfo = { status: 'stopped', id: '01' };
|
||||
});
|
||||
|
||||
webComponent.addEventListener('onSessionCreated', (event) => {
|
||||
|
|
|
@ -830,50 +830,51 @@ describe('Testing videoconference EVENTS', () => {
|
|||
expect(await utils.isPresent('#onToolbarStartRecordingClicked')).to.be.true;
|
||||
});
|
||||
|
||||
it('should receive the onToolbarStopStreamingClicked event', async () => {
|
||||
await browser.get(`${url}&prejoin=false`);
|
||||
// TODO: it needs an OpenVidu PRO
|
||||
// it('should receive the onToolbarStopStreamingClicked event', async () => {
|
||||
// await browser.get(`${url}&prejoin=false`);
|
||||
|
||||
await utils.checkSessionIsPresent();
|
||||
await utils.checkToolbarIsPresent();
|
||||
// await utils.checkSessionIsPresent();
|
||||
// await utils.checkToolbarIsPresent();
|
||||
|
||||
// Open more options menu
|
||||
await utils.waitForElement('#more-options-btn');
|
||||
expect(await utils.isPresent('#more-options-btn')).to.be.true;
|
||||
await utils.clickOn('#more-options-btn');
|
||||
// // Open more options menu
|
||||
// await utils.waitForElement('#more-options-btn');
|
||||
// expect(await utils.isPresent('#more-options-btn')).to.be.true;
|
||||
// await utils.clickOn('#more-options-btn');
|
||||
|
||||
await browser.sleep(500);
|
||||
// await browser.sleep(500);
|
||||
|
||||
await utils.waitForElement('.mat-menu-content');
|
||||
// await utils.waitForElement('.mat-menu-content');
|
||||
|
||||
await utils.waitForElement('#streaming-btn');
|
||||
await utils.clickOn('#streaming-btn');
|
||||
// await utils.waitForElement('#streaming-btn');
|
||||
// await utils.clickOn('#streaming-btn');
|
||||
|
||||
await browser.sleep(500);
|
||||
// await browser.sleep(500);
|
||||
|
||||
await utils.waitForElement('.sidenav-menu');
|
||||
await utils.waitForElement('#activities-container');
|
||||
// await utils.waitForElement('.sidenav-menu');
|
||||
// await utils.waitForElement('#activities-container');
|
||||
|
||||
await utils.waitForElement('#streaming-url-input');
|
||||
const input = await utils.waitForElement('#rtmp-url-input');
|
||||
await input.sendKeys('RTMPurl');
|
||||
await utils.clickOn('#streaming-btn');
|
||||
// await utils.waitForElement('#streaming-url-input');
|
||||
// const input = await utils.waitForElement('#rtmp-url-input');
|
||||
// await input.sendKeys('RTMPurl');
|
||||
// await utils.clickOn('#streaming-btn');
|
||||
|
||||
// Open more options menu
|
||||
await utils.waitForElement('#more-options-btn');
|
||||
expect(await utils.isPresent('#more-options-btn')).to.be.true;
|
||||
await utils.clickOn('#more-options-btn');
|
||||
// // Open more options menu
|
||||
// await utils.waitForElement('#more-options-btn');
|
||||
// expect(await utils.isPresent('#more-options-btn')).to.be.true;
|
||||
// await utils.clickOn('#more-options-btn');
|
||||
|
||||
await browser.sleep(500);
|
||||
// await browser.sleep(500);
|
||||
|
||||
await utils.waitForElement('.mat-menu-content');
|
||||
// await utils.waitForElement('.mat-menu-content');
|
||||
|
||||
await utils.waitForElement('#streaming-btn');
|
||||
await utils.clickOn('#streaming-btn');
|
||||
// await utils.waitForElement('#streaming-btn');
|
||||
// await utils.clickOn('#streaming-btn');
|
||||
|
||||
// Checking if onToolbarStopStreamingClicked has been received
|
||||
await utils.waitForElement('#onToolbarStopStreamingClicked');
|
||||
expect(await utils.isPresent('#onToolbarStopStreamingClicked')).to.be.true;
|
||||
});
|
||||
// // Checking if onToolbarStopStreamingClicked has been received
|
||||
// await utils.waitForElement('#onToolbarStopStreamingClicked');
|
||||
// expect(await utils.isPresent('#onToolbarStopStreamingClicked')).to.be.true;
|
||||
// });
|
||||
|
||||
it('should receive the onActivitiesPanelStartRecordingClicked event', async () => {
|
||||
let element;
|
||||
|
@ -940,7 +941,7 @@ describe('Testing videoconference EVENTS', () => {
|
|||
expect(await utils.isPresent('#onActivitiesPanelDeleteRecordingClicked')).to.be.true;
|
||||
});
|
||||
|
||||
it('should receive the onActivitiesPanelStartStreaming and onActivitiesPanelStopStreamingClicked events', async () => {
|
||||
it('should receive the onActivitiesPanelStartStreaming event', async () => {
|
||||
await browser.get(`${url}&prejoin=false`);
|
||||
|
||||
await utils.checkSessionIsPresent();
|
||||
|
@ -972,16 +973,18 @@ describe('Testing videoconference EVENTS', () => {
|
|||
// Checking if onActivitiesPanelStartStreamingClicked has been received
|
||||
await utils.waitForElement('#onActivitiesPanelStartStreamingClicked');
|
||||
expect(await utils.isPresent('#onActivitiesPanelStartStreamingClicked')).to.be.true;
|
||||
expect(await utils.isPresent('#streaming-tag')).to.be.true;
|
||||
|
||||
await utils.clickOn('#stop-streaming-btn');
|
||||
|
||||
// Checking if onActivitiesPanelStopStreamingClicked has been received
|
||||
await utils.waitForElement('#onActivitiesPanelStopStreamingClicked');
|
||||
expect(await utils.isPresent('#onActivitiesPanelStopStreamingClicked')).to.be.true;
|
||||
expect(await utils.isPresent('#streaming-tag')).to.be.false;
|
||||
|
||||
|
||||
// TODO: it needs an OpenVidu PRO (onActivitiesPanelStopStreamingClicked event)
|
||||
|
||||
// expect(await utils.isPresent('#streaming-tag')).to.be.true;
|
||||
|
||||
// await utils.clickOn('#stop-streaming-btn');
|
||||
|
||||
// // Checking if onActivitiesPanelStopStreamingClicked has been received
|
||||
// await utils.waitForElement('#onActivitiesPanelStopStreamingClicked');
|
||||
// expect(await utils.isPresent('#onActivitiesPanelStopStreamingClicked')).to.be.true;
|
||||
// expect(await utils.isPresent('#streaming-tag')).to.be.false;
|
||||
});
|
||||
|
||||
it('should receive the onSessionCreated event', async () => {
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
|
||||
import { Subscription } from 'rxjs';
|
||||
import { Signal } from '../../../../models/signal.model';
|
||||
import { StreamingError, StreamingInfo, StreamingStatus } from '../../../../models/streaming.model';
|
||||
import { StreamingError, StreamingStatus } from '../../../../models/streaming.model';
|
||||
import { OpenViduAngularConfigService } from '../../../../services/config/openvidu-angular.config.service';
|
||||
import { OpenViduService } from '../../../../services/openvidu/openvidu.service';
|
||||
import { ParticipantService } from '../../../../services/participant/participant.service';
|
||||
|
@ -71,7 +70,6 @@ export class StreamingActivityComponent implements OnInit {
|
|||
*/
|
||||
isRtmpModuleAvailable: boolean = true;
|
||||
private streamingSub: Subscription;
|
||||
private streamingInfoSub: Subscription;
|
||||
private streamingErrorSub: Subscription;
|
||||
|
||||
/**
|
||||
|
@ -91,7 +89,6 @@ export class StreamingActivityComponent implements OnInit {
|
|||
ngOnInit(): void {
|
||||
this.isSessionCreator = this.participantService.amIModerator();
|
||||
this.subscribeToStreamingStatus();
|
||||
this.subscribeToStreamingInfo();
|
||||
this.subscribeToStreamingError();
|
||||
}
|
||||
|
||||
|
@ -100,7 +97,6 @@ export class StreamingActivityComponent implements OnInit {
|
|||
*/
|
||||
ngOnDestroy() {
|
||||
if (this.streamingSub) this.streamingSub.unsubscribe();
|
||||
if (this.streamingInfoSub) this.streamingInfoSub.unsubscribe();
|
||||
if (this.streamingErrorSub) this.streamingErrorSub.unsubscribe();
|
||||
}
|
||||
|
||||
|
@ -156,27 +152,11 @@ export class StreamingActivityComponent implements OnInit {
|
|||
if (!!ev) {
|
||||
this.streamingStatus = ev.status;
|
||||
this.cd.markForCheck();
|
||||
if (this.isSessionCreator) {
|
||||
//TODO: Remove it when RTMP Exported was included on OV and streaming ready event was fired.
|
||||
const signal =
|
||||
this.streamingStatus === StreamingStatus.STARTED ? Signal.STREAMING_STARTED : Signal.STREAMING_STOPPED;
|
||||
this.openviduService.sendSignal(signal);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
//TODO: Remove this directive when RTMP Exported was included on OV and streaming ready event was fired.
|
||||
private subscribeToStreamingInfo() {
|
||||
this.streamingInfoSub = this.libService.streamingInfoObs.subscribe((info: StreamingInfo | undefined) => {
|
||||
if (!!info) {
|
||||
this.streamingService.updateStatus(info.status);
|
||||
this.cd.markForCheck();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private subscribeToStreamingError() {
|
||||
this.streamingErrorSub = this.libService.streamingErrorObs.subscribe((error: StreamingError | undefined) => {
|
||||
if (!!error) {
|
||||
|
|
|
@ -170,12 +170,14 @@ export class SessionComponent implements OnInit, OnDestroy {
|
|||
|
||||
async ngOnInit() {
|
||||
if (!this.usedInPrejoinPage) {
|
||||
|
||||
if (!this.openviduService.getScreenToken()) {
|
||||
// Hide screenshare button if screen token does not exist
|
||||
this.libService.screenshareButton.next(false);
|
||||
}
|
||||
this.session = this.openviduService.getWebcamSession();
|
||||
this.sessionScreen = this.openviduService.getScreenSession();
|
||||
|
||||
this.subscribeToOpenViduException();
|
||||
this.subscribeToCaptionLanguage();
|
||||
this.subscribeToConnectionCreatedAndDestroyed();
|
||||
|
@ -197,8 +199,7 @@ export class SessionComponent implements OnInit, OnDestroy {
|
|||
this.subscribeToRecordingEvents();
|
||||
}
|
||||
|
||||
if (this.libService.isStreamingEnabled() && !this.participantService.amIModerator()) {
|
||||
//TODO: Remove it when RTMP Exported was included on OV and streaming ready event was fired.
|
||||
if (this.libService.isStreamingEnabled()) {
|
||||
this.subscribeToStreamingEvents();
|
||||
}
|
||||
}
|
||||
|
@ -447,13 +448,8 @@ export class SessionComponent implements OnInit, OnDestroy {
|
|||
}
|
||||
|
||||
private subscribeToStreamingEvents() {
|
||||
this.session.on(`signal:${Signal.STREAMING_STARTED}`, (event: any) => {
|
||||
this.streamingService.updateStatus(StreamingStatus.STARTED);
|
||||
});
|
||||
|
||||
this.session.on(`signal:${Signal.STREAMING_STOPPED}`, (event: any) => {
|
||||
this.streamingService.updateStatus(StreamingStatus.STOPPED);
|
||||
});
|
||||
this.session.on('broadcastStarted', () => this.streamingService.updateStatus(StreamingStatus.STARTED));
|
||||
this.session.on('broadcastStopped', () => this.streamingService.updateStatus(StreamingStatus.STOPPED));
|
||||
}
|
||||
|
||||
private startUpdateLayoutInterval() {
|
||||
|
|
|
@ -9,7 +9,7 @@ import {
|
|||
StreamDisplayParticipantNameDirective,
|
||||
StreamSettingsButtonDirective
|
||||
} from './stream.directive';
|
||||
import { StreamingActivityStreamingErrorDirective, StreamingActivityStreamingInfoDirective } from './streaming-activity.directive';
|
||||
import { StreamingActivityStreamingErrorDirective } from './streaming-activity.directive';
|
||||
import {
|
||||
ToolbarActivitiesPanelButtonDirective,
|
||||
ToolbarBackgroundEffectsButtonDirective,
|
||||
|
@ -69,7 +69,6 @@ import {
|
|||
RecordingActivityRecordingsListDirective,
|
||||
RecordingActivityRecordingErrorDirective,
|
||||
StreamingActivityStreamingErrorDirective,
|
||||
StreamingActivityStreamingInfoDirective,
|
||||
AdminRecordingsListDirective,
|
||||
AdminLoginDirective
|
||||
],
|
||||
|
@ -105,7 +104,6 @@ import {
|
|||
RecordingActivityRecordingsListDirective,
|
||||
RecordingActivityRecordingErrorDirective,
|
||||
StreamingActivityStreamingErrorDirective,
|
||||
StreamingActivityStreamingInfoDirective,
|
||||
AdminRecordingsListDirective,
|
||||
AdminLoginDirective
|
||||
]
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from '@angular/core';
|
||||
import { StreamingError, StreamingInfo, StreamingStatus } from '../../models/streaming.model';
|
||||
import { StreamingError } from '../../models/streaming.model';
|
||||
import { OpenViduAngularConfigService } from '../../services/config/openvidu-angular.config.service';
|
||||
|
||||
|
||||
/**
|
||||
* The **streamingError** directive allows to show any possible error with the streaming in the {@link StreamingActivityComponent}.
|
||||
*
|
||||
|
@ -54,63 +53,3 @@ export class StreamingActivityStreamingErrorDirective implements AfterViewInit,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: Remove this directive when RTMP Exported was included on OV and streaming ready event was fired.
|
||||
|
||||
/**
|
||||
* The **streamingInfo** directive allows show the live streaming info in {@link StreamingActivityComponent}.
|
||||
*
|
||||
* Default: `undefined`
|
||||
*
|
||||
* Type: {@link StreamingInfo}
|
||||
*
|
||||
* It can be used in the parent element {@link VideoconferenceComponent} specifying the name of the `streamingActivity` component:
|
||||
*
|
||||
* @example
|
||||
* <ov-videoconference [streamingActivityStreamingInfo]="info"></ov-videoconference>
|
||||
*
|
||||
* \
|
||||
* And it also can be used in the {@link StreamingActivityComponent}.
|
||||
* @example
|
||||
* <ov-streaming-activity [streamingInfo]="info"></ov-streaming-activity>
|
||||
*/
|
||||
@Directive({
|
||||
selector: 'ov-videoconference[streamingActivityStreamingInfo], ov-streaming-activity[streamingInfo]'
|
||||
})
|
||||
export class StreamingActivityStreamingInfoDirective implements AfterViewInit, OnDestroy {
|
||||
@Input() set streamingActivityStreamingInfo(value: StreamingInfo) {
|
||||
this.streamingValue = value;
|
||||
this.update(this.streamingValue);
|
||||
}
|
||||
@Input() set streamingInfo(value: StreamingInfo) {
|
||||
this.streamingValue = value;
|
||||
this.update(this.streamingValue);
|
||||
}
|
||||
|
||||
streamingValue: StreamingInfo | undefined = undefined;
|
||||
|
||||
constructor(public elementRef: ElementRef, private libService: OpenViduAngularConfigService) {}
|
||||
|
||||
ngAfterViewInit() {
|
||||
this.update(this.streamingValue);
|
||||
}
|
||||
ngOnDestroy(): void {
|
||||
this.clear();
|
||||
}
|
||||
clear() {
|
||||
this.streamingValue = undefined;
|
||||
this.update(undefined);
|
||||
}
|
||||
|
||||
update(value: StreamingInfo | undefined) {
|
||||
if (this.libService.streamingInfo.getValue() !== value) {
|
||||
if(value) {
|
||||
// Forced value to right enum
|
||||
const index = Object.values(StreamingStatus).indexOf(value.status.toLowerCase() as unknown as StreamingStatus);
|
||||
const key = Object.keys(StreamingStatus)[index];
|
||||
value.status = StreamingStatus[key];
|
||||
}
|
||||
this.libService.streamingInfo.next(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -105,14 +105,14 @@
|
|||
},
|
||||
"STREAMING": {
|
||||
"TITLE": "直播",
|
||||
"SUBTITLE": "将会议直播给观众",
|
||||
"CONTENT_SUBTITLE": "OpenVidu需要RTMP直播平台的URL。",
|
||||
"SUBTITLE": "向观众直播您的会议",
|
||||
"CONTENT_SUBTITLE": "OpenVidu需要直播平台的网址。",
|
||||
"START": "开始直播",
|
||||
"STOP": "结束直播",
|
||||
"URL": "输入您的RTMP URL",
|
||||
"URL": "插入您的直播网址",
|
||||
"CANCEL": "取消",
|
||||
"REQUIRED_URL": "RTMP url 是必需的",
|
||||
"NO_MODERATOR": "只有主持人才能开始流媒体"
|
||||
"REQUIRED_URL": "需要提供直播网址",
|
||||
"NO_MODERATOR": "只有MODERATOR才能开始直播"
|
||||
}
|
||||
},
|
||||
"ERRORS": {
|
||||
|
|
|
@ -105,14 +105,14 @@
|
|||
},
|
||||
"STREAMING": {
|
||||
"TITLE": "Streaming",
|
||||
"SUBTITLE": "Streamen Sie Ihr Meeting an Ihr Publikum",
|
||||
"CONTENT_SUBTITLE": "OpenVidu benötigt die RTMP-URL der Streaming-Plattform.",
|
||||
"SUBTITLE": "Streamen Sie Ihr Meeting für Ihr Publikum",
|
||||
"CONTENT_SUBTITLE": "OpenVidu benötigt die URL der Streaming-Plattform.",
|
||||
"START": "Streaming starten",
|
||||
"STOP": "Streaming beenden",
|
||||
"URL": "Geben Sie Ihre RTMP-URL ein",
|
||||
"CANCEL": "Absagen",
|
||||
"REQUIRED_URL": "RTMP url ist erforderlich",
|
||||
"NO_MODERATOR": "Nur der Moderator kann den Stream starten"
|
||||
"URL": "Geben Sie Ihre Streaming-URL ein",
|
||||
"CANCEL": "Abbrechen",
|
||||
"REQUIRED_URL": "Die Streaming-URL ist erforderlich",
|
||||
"NO_MODERATOR": "Nur der MODERATOR kann das Streaming starten"
|
||||
}
|
||||
},
|
||||
"ERRORS": {
|
||||
|
|
|
@ -107,12 +107,12 @@
|
|||
"STREAMING": {
|
||||
"TITLE": "Streaming",
|
||||
"SUBTITLE": "Stream your meeting to your audience",
|
||||
"CONTENT_SUBTITLE": "OpenVidu need the RTMP url of the streaming platform.",
|
||||
"CONTENT_SUBTITLE": "OpenVidu need the url of the streaming platform.",
|
||||
"START": "Start streaming",
|
||||
"STOP": "End streaming",
|
||||
"URL": "Insert your RTMP url",
|
||||
"URL": "Insert your streaming url",
|
||||
"CANCEL": "Cancel",
|
||||
"REQUIRED_URL": "The RTMP url is required",
|
||||
"REQUIRED_URL": "The streaming url is required",
|
||||
"NO_MODERATOR": "Only the MODERATOR can start the streaming"
|
||||
}
|
||||
},
|
||||
|
|
|
@ -106,10 +106,10 @@
|
|||
"STREAMING": {
|
||||
"TITLE": "Streaming",
|
||||
"SUBTITLE": "Comparte tu llamada con tu público",
|
||||
"CONTENT_SUBTITLE": "OpenVidu necesita la url RTMP de tu plataforma de streaming.",
|
||||
"CONTENT_SUBTITLE": "OpenVidu necesita la url de tu plataforma de streaming.",
|
||||
"START": "Empezar streaming",
|
||||
"STOP": "Finalizar streaming",
|
||||
"URL": "Inserta tu url RTMP",
|
||||
"URL": "Inserta tu url de streaming",
|
||||
"CANCEL": "Cancelar",
|
||||
"NO_MODERATOR": "Solo el MODERADOR puede iniciar el streaming"
|
||||
}
|
||||
|
|
|
@ -104,15 +104,15 @@
|
|||
"NO_MODERATOR": "Seul le MODERATEUR peut lancer l'enregistrement"
|
||||
},
|
||||
"STREAMING": {
|
||||
"TITLE": "Diffusion",
|
||||
"SUBTITLE": "Diffusez votre réunion à votre public",
|
||||
"CONTENT_SUBTITLE": "OpenVidu a besoin de l'URL RTMP de la plateforme de diffusion.",
|
||||
"START": "Démarrer la diffusion",
|
||||
"STOP": "Arrêter la diffusion",
|
||||
"URL": "Insérez votre URL RTMP",
|
||||
"TITLE": "Streaming",
|
||||
"SUBTITLE": "Diffusez votre réunion en direct à votre public",
|
||||
"CONTENT_SUBTITLE": "OpenVidu a besoin de l'URL de la plateforme de streaming.",
|
||||
"START": "Commencer le streaming",
|
||||
"STOP": "Arrêter le streaming",
|
||||
"URL": "Insérez votre URL de streaming",
|
||||
"CANCEL": "Annuler",
|
||||
"REQUIRED_URL": "L'URL RTMP est obligatoire",
|
||||
"NO_MODERATOR": "Seul le MODÉRATEUR peut démarrer le streaming"
|
||||
"REQUIRED_URL": "L'URL de streaming est requise",
|
||||
"NO_MODERATOR": "Seul le MODERATEUR peut démarrer le streaming"
|
||||
}
|
||||
},
|
||||
"ERRORS": {
|
||||
|
|
|
@ -105,14 +105,14 @@
|
|||
},
|
||||
"STREAMING": {
|
||||
"TITLE": "स्ट्रीमिंग",
|
||||
"SUBTITLE": "अपने मीटिंग को अपने दर्शकों को स्ट्रीम करें",
|
||||
"CONTENT_SUBTITLE": "OpenVidu को स्ट्रीमिंग प्लेटफॉर्म के RTMP url की आवश्यकता है।",
|
||||
"SUBTITLE": "अपने दर्शकों के लिए अपनी मीटिंग स्ट्रीम करें",
|
||||
"CONTENT_SUBTITLE": "OpenVidu को स्ट्रीमिंग प्लेटफ़ॉर्म का URL चाहिए।",
|
||||
"START": "स्ट्रीमिंग शुरू करें",
|
||||
"STOP": "स्ट्रीमिंग बंद करें",
|
||||
"URL": "अपना RTMP url दर्ज करें",
|
||||
"STOP": "स्ट्रीमिंग समाप्त करें",
|
||||
"URL": "अपना स्ट्रीमिंग URL इन्सर्ट करें",
|
||||
"CANCEL": "रद्द करें",
|
||||
"REQUIRED_URL": "RTMP url आवश्यक है",
|
||||
"NO_MODERATOR": "केवल मोडेरेटर स्ट्रीमिंग शुरू कर सकते हैं"
|
||||
"REQUIRED_URL": "स्ट्रीमिंग URL अनिवार्य है",
|
||||
"NO_MODERATOR": "केवल मॉडरेटर स्ट्रीमिंग शुरू कर सकते हैं"
|
||||
}
|
||||
},
|
||||
"ERRORS": {
|
||||
|
|
|
@ -105,14 +105,14 @@
|
|||
},
|
||||
"STREAMING": {
|
||||
"TITLE": "Streaming",
|
||||
"SUBTITLE": "Trasmetti in streaming la tua riunione al tuo pubblico",
|
||||
"CONTENT_SUBTITLE": "OpenVidu necessita dell'URL RTMP della piattaforma di streaming",
|
||||
"START": "Avvia lo streaming",
|
||||
"SUBTITLE": "Trasmetti la tua riunione al tuo pubblico",
|
||||
"CONTENT_SUBTITLE": "OpenVidu ha bisogno dell'URL della piattaforma di streaming.",
|
||||
"START": "Inizia lo streaming",
|
||||
"STOP": "Termina lo streaming",
|
||||
"URL": "Inserisci il tuo URL RTMP",
|
||||
"URL": "Inserisci il tuo URL di streaming",
|
||||
"CANCEL": "Annulla",
|
||||
"REQUIRED_URL": "RTMP url è obbligatorio",
|
||||
"NO_MODERATOR": "Solo il MODERATORE può iniziare la trasmissione"
|
||||
"REQUIRED_URL": "L'URL di streaming è obbligatorio",
|
||||
"NO_MODERATOR": "Solo il MODERATORE può avviare lo streaming"
|
||||
}
|
||||
},
|
||||
"ERRORS": {
|
||||
|
|
|
@ -105,15 +105,14 @@
|
|||
},
|
||||
"STREAMING": {
|
||||
"TITLE": "ストリーミング",
|
||||
"SUBTITLE": "会議を観客にストリーミング",
|
||||
"CONTENT_SUBTITLE": "OpenViduはストリーミングプラットフォームのRTMP URLが必要です。",
|
||||
"START": "ストリーミングを開始",
|
||||
"STOP": "ストリーミングを終了",
|
||||
"URL": "RTMP URLを入力してください",
|
||||
"SUBTITLE": "ミーティングを視聴者にストリーミングする",
|
||||
"CONTENT_SUBTITLE": "OpenViduはストリーミングプラットフォームのURLが必要です。",
|
||||
"START": "ストリーミングを開始する",
|
||||
"STOP": "ストリーミングを終了する",
|
||||
"URL": "ストリーミングURLを挿入してください",
|
||||
"CANCEL": "キャンセル",
|
||||
"REQUIRED_URL": "RTMP url は必須です",
|
||||
"NO_MODERATOR": "モデレーターのみがストリーミングを開始できます"
|
||||
|
||||
"REQUIRED_URL": "ストリーミングURLは必須です",
|
||||
"NO_MODERATOR": "MODERATORのみがストリーミングを開始できます"
|
||||
}
|
||||
},
|
||||
"ERRORS": {
|
||||
|
|
|
@ -104,15 +104,15 @@
|
|||
"NO_MODERATOR": "Alleen de MOEDERATOR kan de opname starten"
|
||||
},
|
||||
"STREAMING": {
|
||||
"TITLE": "Streamen",
|
||||
"SUBTITLE": "Stream je meeting naar je publiek",
|
||||
"CONTENT_SUBTITLE": "OpenVidu heeft de RTMP url van de streaming platform nodig.",
|
||||
"START": "Start streamen",
|
||||
"STOP": "Stop streamen",
|
||||
"URL": "Voer je RTMP url in",
|
||||
"TITLE": "Streaming",
|
||||
"SUBTITLE": "Stream uw vergadering naar uw publiek",
|
||||
"CONTENT_SUBTITLE": "OpenVidu heeft de url van het streamingplatform nodig.",
|
||||
"START": "Start met streamen",
|
||||
"STOP": "Stop met streamen",
|
||||
"URL": "Voeg uw stream-URL in",
|
||||
"CANCEL": "Annuleren",
|
||||
"REQUIRED_URL": "RTMP url is verplicht",
|
||||
"NO_MODERATOR": "Alleen de moderator kan de streaming starten"
|
||||
"REQUIRED_URL": "De stream-URL is vereist",
|
||||
"NO_MODERATOR": "Alleen de MODERATOR kan beginnen met streamen"
|
||||
}
|
||||
},
|
||||
"ERRORS": {
|
||||
|
|
|
@ -105,14 +105,14 @@
|
|||
},
|
||||
"STREAMING": {
|
||||
"TITLE": "Streaming",
|
||||
"SUBTITLE": "Transmita sua reunião para seu público",
|
||||
"CONTENT_SUBTITLE": "O OpenVidu precisa da url RTMP da plataforma de streaming.",
|
||||
"START": "Iniciar transmissão",
|
||||
"STOP": "Finalizar transmissão",
|
||||
"URL": "Insira seu url RTMP",
|
||||
"SUBTITLE": "Transmita sua reunião para sua audiência",
|
||||
"CONTENT_SUBTITLE": "O OpenVidu precisa do URL da plataforma de streaming.",
|
||||
"START": "Iniciar streaming",
|
||||
"STOP": "Finalizar streaming",
|
||||
"URL": "Insira seu URL de streaming",
|
||||
"CANCEL": "Cancelar",
|
||||
"REQUIRED_URL": "O URL RTMP é obrigatório",
|
||||
"NO_MODERATOR": "Somente o MODERADOR pode iniciar a transmissão"
|
||||
"REQUIRED_URL": "O URL de streaming é obrigatório",
|
||||
"NO_MODERATOR": "Apenas o MODERADOR pode iniciar o streaming"
|
||||
}
|
||||
},
|
||||
"ERRORS": {
|
||||
|
|
|
@ -3,9 +3,5 @@
|
|||
*/
|
||||
export enum Signal {
|
||||
NICKNAME_CHANGED = 'nicknameChanged',
|
||||
CHAT = 'chat',
|
||||
|
||||
//TODO: Remove them when RTMP Exported was included on OV and streaming ready event was fired.
|
||||
STREAMING_STARTED = "streamingStarted",
|
||||
STREAMING_STOPPED = "streamingStopped"
|
||||
}
|
||||
CHAT = 'chat'
|
||||
}
|
||||
|
|
|
@ -6,15 +6,8 @@ export enum StreamingStatus {
|
|||
FAILED = 'failed'
|
||||
}
|
||||
|
||||
|
||||
export interface StreamingInfo {
|
||||
id: string,
|
||||
status: StreamingStatus
|
||||
}
|
||||
|
||||
|
||||
export interface StreamingError {
|
||||
message: string,
|
||||
message: string;
|
||||
// If streaming service is available or not
|
||||
rtmpAvailable: boolean
|
||||
}
|
||||
rtmpAvailable: boolean;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ import { Inject, Injectable } from '@angular/core';
|
|||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
import { OpenViduAngularConfig, ParticipantFactoryFunction } from '../../config/openvidu-angular.config';
|
||||
import { RecordingInfo } from '../../models/recording.model';
|
||||
import { StreamingError, StreamingInfo } from '../../models/streaming.model';
|
||||
import { StreamingError } from '../../models/streaming.model';
|
||||
|
||||
// import { version } from '../../../../package.json';
|
||||
|
||||
|
@ -76,10 +76,7 @@ export class OpenViduAngularConfigService {
|
|||
recordingErrorObs: Observable<any>;
|
||||
streamingErrorObs: Observable<StreamingError | undefined>;
|
||||
streamingError = <BehaviorSubject<StreamingError | undefined>>new BehaviorSubject(undefined);
|
||||
streamingInfo = <BehaviorSubject<StreamingInfo | undefined>>new BehaviorSubject(undefined);
|
||||
|
||||
//TODO: Remove this directive when RTMP Exported was included on OV and streaming ready event was fired.
|
||||
streamingInfoObs: Observable<StreamingInfo | undefined>;
|
||||
// Admin
|
||||
adminRecordingsList: BehaviorSubject<RecordingInfo[]> = new BehaviorSubject(<RecordingInfo[]>[]);
|
||||
adminRecordingsListObs: Observable<RecordingInfo[]>;
|
||||
adminLoginError = <BehaviorSubject<any>>new BehaviorSubject(null);
|
||||
|
@ -121,7 +118,6 @@ export class OpenViduAngularConfigService {
|
|||
// Streaming activity
|
||||
this.streamingActivityObs = this.streamingActivity.asObservable();
|
||||
this.streamingErrorObs = this.streamingError.asObservable();
|
||||
this.streamingInfoObs = this.streamingInfo.asObservable();
|
||||
// Admin dashboard
|
||||
this.adminRecordingsListObs = this.adminRecordingsList.asObservable();
|
||||
this.adminLoginErrorObs = this.adminLoginError.asObservable();
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
[recordingActivityRecordingsList]="recordingList"
|
||||
[recordingActivityRecordingError]="recordingError"
|
||||
[streamingActivityStreamingError]="streamingError"
|
||||
[streamingActivityStreamingInfo]="streamingInfo"
|
||||
[toolbarSettingsButton]="true"
|
||||
(onJoinButtonClicked)="onJoinClicked()"
|
||||
(onToolbarLeaveButtonClicked)="onToolbarLeaveButtonClicked()"
|
||||
|
|
|
@ -17,7 +17,6 @@ export class CallComponent implements OnInit {
|
|||
recordingList: RecordingInfo[] = [];
|
||||
recordingError: any;
|
||||
streamingError: any;
|
||||
streamingInfo: any;
|
||||
|
||||
constructor(private restService: RestService) {}
|
||||
|
||||
|
@ -86,8 +85,8 @@ export class CallComponent implements OnInit {
|
|||
console.log('START STREAMING', rtmpUrl);
|
||||
try {
|
||||
this.streamingError = null;
|
||||
this.streamingInfo = await this.restService.startStreaming(rtmpUrl);
|
||||
console.log('Streaming response ', this.streamingInfo);
|
||||
const resp = await this.restService.startStreaming(rtmpUrl);
|
||||
console.log('Streaming response ', resp);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
this.streamingError = error.error;
|
||||
|
@ -98,8 +97,8 @@ export class CallComponent implements OnInit {
|
|||
console.log('STOP STREAMING');
|
||||
try {
|
||||
this.streamingError = null;
|
||||
this.streamingInfo = await this.restService.stopStreaming();
|
||||
console.log('Streaming response ', this.streamingInfo);
|
||||
const resp = await this.restService.stopStreaming();
|
||||
console.log('Streaming response ', resp);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
this.streamingError = error.message || error;
|
||||
|
|
|
@ -41,14 +41,14 @@ export class RestService {
|
|||
}
|
||||
}
|
||||
|
||||
async startStreaming(rtmpUrl: string) {
|
||||
async startStreaming(broadcastUrl: string) {
|
||||
try {
|
||||
const options = {
|
||||
headers: new HttpHeaders({
|
||||
'Content-Type': 'application/json'
|
||||
})
|
||||
};
|
||||
return lastValueFrom(this.http.post<any>(this.baseHref + 'streamings/start', { rtmpUrl}, options));
|
||||
return lastValueFrom(this.http.post<any>(this.baseHref + 'broadcasts/start', { broadcastUrl }, options));
|
||||
} catch (error) {
|
||||
if (error.status === 404) {
|
||||
throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' };
|
||||
|
@ -68,10 +68,9 @@ export class RestService {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
async stopStreaming() {
|
||||
try {
|
||||
return lastValueFrom(this.http.delete<any>(`${this.baseHref}streamings/stop`));
|
||||
return lastValueFrom(this.http.delete<any>(`${this.baseHref}broadcasts/stop`));
|
||||
} catch (error) {
|
||||
if (error.status === 404) {
|
||||
throw { status: error.status, message: 'Cannot connect with backend. ' + error.url + ' not found' };
|
||||
|
@ -98,9 +97,7 @@ export class RestService {
|
|||
|
||||
async logout(): Promise<void> {
|
||||
try {
|
||||
return lastValueFrom(
|
||||
this.http.post<any>(`${this.baseHref}auth/admin/logout`, {})
|
||||
);
|
||||
return lastValueFrom(this.http.post<any>(`${this.baseHref}auth/admin/logout`, {}));
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
if (error.status === 404) {
|
||||
|
@ -110,7 +107,6 @@ export class RestService {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
async deleteRecording(id: string): Promise<any[]> {
|
||||
try {
|
||||
return lastValueFrom(this.http.delete<any>(`${this.baseHref}recordings/delete/${id}`));
|
||||
|
@ -124,9 +120,7 @@ export class RestService {
|
|||
}
|
||||
|
||||
getRecordings(): Promise<any[]> {
|
||||
return lastValueFrom(
|
||||
this.http.get<any>(`${this.baseHref}recordings`)
|
||||
);
|
||||
return lastValueFrom(this.http.get<any>(`${this.baseHref}recordings`));
|
||||
}
|
||||
|
||||
getRecording(recordingId: string) {
|
||||
|
@ -147,7 +141,7 @@ export class RestService {
|
|||
getRecording2(recordingId: string) {
|
||||
try {
|
||||
return lastValueFrom(
|
||||
this.http.get(`${this.baseHref}recordings/${recordingId}`,{
|
||||
this.http.get(`${this.baseHref}recordings/${recordingId}`, {
|
||||
responseType: 'blob'
|
||||
})
|
||||
);
|
||||
|
|
|
@ -209,7 +209,7 @@
|
|||
id="custom-activities-panel"
|
||||
>
|
||||
<ov-recording-activity *ngIf="recordingActivity"></ov-recording-activity>
|
||||
<ov-streaming-activity *ngIf="streamingActivity" [streamingInfo]="streamingInfo" [streamingError]="streamingError"></ov-streaming-activity>
|
||||
<ov-streaming-activity *ngIf="streamingActivity" [streamingError]="streamingError"></ov-streaming-activity>
|
||||
</ov-activities-panel>
|
||||
</ng-template>
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|||
import { Component, OnInit } from '@angular/core';
|
||||
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { PanelService, StreamingError, StreamingInfo, StreamingStatus } from 'openvidu-angular';
|
||||
import { PanelService, StreamingError } from 'openvidu-angular';
|
||||
import { Subscription, throwError as observableThrowError } from 'rxjs';
|
||||
import { catchError } from 'rxjs/operators';
|
||||
|
||||
|
@ -31,7 +31,6 @@ enum StructuralDirectives {
|
|||
STREAM = 'ovStream'
|
||||
}
|
||||
|
||||
|
||||
export enum AttributeDirective {
|
||||
// MINIMAL = 'minimal',
|
||||
// PARTICIPANT_NAME = 'participantName',
|
||||
|
@ -53,8 +52,7 @@ export enum AttributeDirective {
|
|||
PARTICIPANT_ITEM_MUTE = 'muteButton',
|
||||
ACTIVITIES_PANEL_RECORDING_ACTIVITY = 'recordingActivity',
|
||||
ACTIVITIES_PANEL_STREAMING_ACTIVITY = 'streamingActivity',
|
||||
ACTIVITIES_PANEL_STREAMING_INFO = 'streamingInfo',
|
||||
ACTIVITIES_PANEL_STREAMING_ERROR = "streamingError"
|
||||
ACTIVITIES_PANEL_STREAMING_ERROR = 'streamingError'
|
||||
}
|
||||
|
||||
@Component({
|
||||
|
@ -126,7 +124,6 @@ export class TestingComponent implements OnInit {
|
|||
directives: [
|
||||
{ name: AttributeDirective.ACTIVITIES_PANEL_RECORDING_ACTIVITY, checked: true },
|
||||
{ name: AttributeDirective.ACTIVITIES_PANEL_STREAMING_ACTIVITY, checked: true },
|
||||
{ name: AttributeDirective.ACTIVITIES_PANEL_STREAMING_INFO, checked: false },
|
||||
{ name: AttributeDirective.ACTIVITIES_PANEL_STREAMING_ERROR, checked: false }
|
||||
]
|
||||
}
|
||||
|
@ -160,7 +157,6 @@ export class TestingComponent implements OnInit {
|
|||
participantItemMuteBtn = true;
|
||||
streamingActivity = true;
|
||||
streamingBtn = true;
|
||||
streamingInfo: StreamingInfo = undefined;
|
||||
|
||||
tokens: { webcam: any; screen: any };
|
||||
|
||||
|
@ -304,12 +300,8 @@ export class TestingComponent implements OnInit {
|
|||
this.streamingActivity = value;
|
||||
break;
|
||||
|
||||
case AttributeDirective.ACTIVITIES_PANEL_STREAMING_INFO:
|
||||
this.streamingInfo = { status: StreamingStatus.STARTED, id: '01' };
|
||||
break;
|
||||
|
||||
case AttributeDirective.ACTIVITIES_PANEL_STREAMING_ERROR:
|
||||
this.streamingError = {message: 'TEST_ERROR', rtmpAvailable: true};
|
||||
this.streamingError = { message: 'TEST_ERROR', rtmpAvailable: true };
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -385,7 +377,7 @@ export class TestingComponent implements OnInit {
|
|||
|
||||
createConnection(sessionId): Promise<string> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const body = {role: 'MODERATOR'};
|
||||
const body = { role: 'MODERATOR' };
|
||||
const options = {
|
||||
headers: new HttpHeaders({
|
||||
Authorization: 'Basic ' + btoa('OPENVIDUAPP:' + this.OPENVIDU_SERVER_SECRET),
|
||||
|
|
Loading…
Reference in New Issue