Finished mediahandler placeholder, fixed most scheduler bugs with webrtc scheduling, started pushing iceServers w/ media object instead of clientmetadata.

This commit is contained in:
rainbow napkin 2026-07-11 03:54:23 -04:00
parent b68d55b7ef
commit 3517a1499a
7 changed files with 72 additions and 12 deletions

View file

@ -153,9 +153,6 @@ class channel{
//Store streamType
this.streamType = data.streamType;
//Store URLs to known Internet Connectivitey Establishment servers.
this.iceServer = data.iceServers;
}
/**

View file

@ -926,4 +926,60 @@ class hlsLiveStreamHandler extends hlsBase{
}
}
}
}
/**
* Wrapper handler for WebRTC Streams, calling back to webRTCHandler.js for heavy lifting
* @extends rawFileBase
*/
class WebRTCLivestreamHandler extends rawFileBase{
/**
/**
* Instantiates a new WebRTCMediaHandler
* @param {channel} client - Parent Client Management Object
* @param {player} player - Parent Canopy Player Object
* @param {Object} media - De-hydrated media object from server
*/
constructor(client, player, media){
//Call derived constructor
super(client, player, media, "webrtc");
/**
* Internet Connectivity Establishment configuration
*/
this.iceConfig = {iceServers: new Map(media.rawLink.combo).get('default')};
this.defineListeners();
}
defineListeners(){
//Run derived method
super.defineListeners();
//Disable right clicking
this.video.addEventListener('contextmenu', (e)=>{e.preventDefault()});
}
start(){
//call derived start function
super.start();
//Lock the player
this.setPlayerLock(true);
}
setVideoTitle(title){
//Add title as text content for security :P
this.player.title.innerText = `: ${utils.unescapeEntities(title)}`;
//Create glow span
const glowSpan = document.createElement('span');
//Fill glow span content
glowSpan.innerText = "🔴LIVE";
//Set glowspan class
glowSpan.classList.add('critical-danger-text');
//Inject glowspan into title in a way that allows it to be easily replaced
this.player.title.prepend(glowSpan);
}
}

View file

@ -188,7 +188,7 @@ class queuePanel extends panelObj{
*/
handleStart(data){
//If we're starting an HLS Livestream
if(data.media != null && data.media.type == 'livehls'){
if(data.media != null && (data.media.type == 'livehls' || data.media.type == 'webrtc' )){
//Hide the 'goLive' controls
this.goLiveDiv.style.display = 'none';
}
@ -282,7 +282,7 @@ class queuePanel extends panelObj{
client.socket.emit('getStreamType');
//If we're not livestreaming
if(client.player.mediaHandler.type != "livehls"){
if(client.player.mediaHandler.type != "livehls" && client.player.mediaHandler.type != "webrtc"){
//If the div is hidden
if(this.goLiveDiv.style.display == 'none'){
//Show the div
@ -1188,7 +1188,7 @@ class queuePanel extends panelObj{
const staleEntry = this.queueContainer.querySelector('.queue-entry.live');
//If we're not livestreaming
if(client.player.mediaHandler.type != "livehls"){
if(client.player.mediaHandler.type != "livehls" && client.player.mediaHandler.type != "webrtc"){
//If we have a stale entry
if(staleEntry != null){
//Remove stale entry since we're no longer streaming

View file

@ -188,6 +188,9 @@ class player{
}else if(data.media.type == "livehls"){
//Create a new HLS Livestream Handler for it
this.mediaHandler = new hlsLiveStreamHandler(this.client, this, data.media);
}else if(data.media.type == "webrtc"){
//Create a new HLS Livestream Handler for it
this.mediaHandler = new WebRTCLivestreamHandler(this.client, this, data.media);
}else if(data.media.type == 'dm'){
this.mediaHandler = new hlsDailymotionHandler(this.client, this, data.media);
//Otherwise, if we have a raw-file compatible source

View file

@ -412,7 +412,7 @@ class livestreamPreferences{
handleTypeUpdate(data){
//If the stream type is HLS
if(data.streamType == "livehls"){
if(data.streamType == "livehls" || data.streamType == "webrtc"){
//Ensure the hls button is checked
this.hlsButton.checked = true;
//Ensure the stream url input is enabled