/*Canopy - The next generation of stoner streaming software Copyright (C) 2024-2025 Rainbownapkin and the TTN Community This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .*/ //This is little more than a interface class class mediaHandler{ constructor(client, player, media, type){ //Get parents this.client = client; this.player = player; //Set handler type this.type = type //Denotes wether a seek call was made by the syncing function this.selfAct = false; //Set last received timestamp to 0 this.lastTimestamp = 0; //Set volume this.volume = 1; //Ingest media object from server this.startMedia(media); } startMedia(media){ //If we properly ingested the media if(this.ingestMedia(media)){ //Build the video player this.buildPlayer(); //Call the start function this.start(); } } buildPlayer(){ //Reset player lock this.lock = false; } destroyPlayer(){ //Null out video property this.video = null; } ingestMedia(media){ //Set now playing this.nowPlaying = media; //return true to signify success return true; } start(){ } sync(timestamp = this.lastTimestamp){ } reload(){ //Get current timestamp const timestamp = this.video.currentTime; //Throw self act flag to make sure we don't un-sync the player this.selfAct = true; } end(){ //Null out current media this.nowPlaying = null; //Throw self act to prevent unlock on video end this.selfAct = true; //Destroy the player this.destroyPlayer(); } play(){ } pause(){ } setPlayerLock(lock){ //set lock property this.lock = lock; } getRatio(){ } getTimestamp(){ } setVideoTitle(title){ this.player.title.textContent = `Currently Playing: ${title}`; } onMetadataLoad(event){ //Resize aspect (if locked), since the video doesn't properly report it's resolution until it's been loaded this.client.chatBox.resizeAspect(); } onPause(event){ //If the video was paused out-side of code if(!this.selfAct){ this.player.unlockSync(); } this.selfAct = false; } onVolumeChange(event){ } onSeek(event){ //If the video was seeked out-side of code if(!this.selfAct){ this.player.unlockSync(); } //reset self act flag this.selfAct = false; } } //Basic building blocks for anything that touches a