Added basic option to specify alternative IA CDN servers within the settings panel.
This commit is contained in:
parent
08d2bf8bc9
commit
e9c474eaf0
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -1,5 +1,5 @@
|
||||||
node_modules/
|
node_modules/
|
||||||
log/
|
log/crash/*
|
||||||
package-lock.json
|
package-lock.json
|
||||||
config.json
|
config.json
|
||||||
state.json
|
state.json
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. %>
|
||||||
<link rel="stylesheet" type="text/css" href="/css/panel/settings.css">
|
<link rel="stylesheet" type="text/css" href="/css/panel/settings.css">
|
||||||
<div id="settings-panel">
|
<div id="settings-panel">
|
||||||
<h2>Client Settings</h2>
|
<h2>Client Settings</h2>
|
||||||
|
<h4>Player Settings</h4>
|
||||||
<span id="settings-panel-youtube-source" class="settings-panel-setting">
|
<span id="settings-panel-youtube-source" class="settings-panel-setting">
|
||||||
<p>Youtube Player Type:</p>
|
<p>Youtube Player Type:</p>
|
||||||
<select>
|
<select>
|
||||||
|
|
@ -23,5 +24,9 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. %>
|
||||||
<option value="embed">Official Embed</option>
|
<option value="embed">Official Embed</option>
|
||||||
</select>
|
</select>
|
||||||
</span>
|
</span>
|
||||||
|
<span id="settings-panel-ia-server" class="settings-panel-setting">
|
||||||
|
<p>Internet Archive CDN Server:</p>
|
||||||
|
<input placeholder="Source Default">
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -17,6 +17,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.*/
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 1em;
|
gap: 1em;
|
||||||
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
#settings-panel h2{
|
#settings-panel h2{
|
||||||
|
|
@ -24,10 +25,22 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.*/
|
||||||
margin: 1em 0 0;
|
margin: 1em 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#settings-panel h4{
|
||||||
|
text-align: center;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.settings-panel-setting{
|
.settings-panel-setting{
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
text-wrap: nowrap;
|
text-wrap: nowrap;
|
||||||
height: 1em;
|
height: 1em;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
max-width: 30em;
|
||||||
|
width: 100%
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel-setting :is(input, select){
|
||||||
|
width: 1px;
|
||||||
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
@ -166,6 +166,9 @@ class channel{
|
||||||
* @param {*} value - Value to set setting to
|
* @param {*} value - Value to set setting to
|
||||||
*/
|
*/
|
||||||
processConfig(key, value){
|
processConfig(key, value){
|
||||||
|
//Unfortunately we can't scope constants to switch-cases so this is the best we got if we wanna re-use the name
|
||||||
|
let nowPlaying;
|
||||||
|
|
||||||
//Switch/case by config key
|
//Switch/case by config key
|
||||||
switch(key){
|
switch(key){
|
||||||
case 'ytPlayerType':
|
case 'ytPlayerType':
|
||||||
|
|
@ -205,18 +208,35 @@ class channel{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//Get current video
|
//Get current video
|
||||||
const nowPlaying = this.player.mediaHandler.nowPlaying;
|
nowPlaying = this.player.mediaHandler.nowPlaying;
|
||||||
|
|
||||||
//If we're playing a youtube video
|
//If we're playing a youtube video
|
||||||
if(nowPlaying != null && nowPlaying.type == 'yt'){
|
if(nowPlaying != null && nowPlaying.type == 'yt'){
|
||||||
//Restart the video
|
//Restart the video
|
||||||
this.player.start({media: nowPlaying});
|
this.player.hardReload();
|
||||||
}
|
}
|
||||||
|
|
||||||
//Stop while we're ahead
|
//Stop while we're ahead
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
case 'IACDN':
|
||||||
|
//If the player or mediaHandler isn't loaded
|
||||||
|
if(this.player == null || this.player.mediaHandler == null){
|
||||||
|
//We're fuggin done here
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Get current video
|
||||||
|
nowPlaying = this.player.mediaHandler.nowPlaying;
|
||||||
|
|
||||||
|
//If we're playing a video from Internet Archive
|
||||||
|
if(nowPlaying != null && nowPlaying.type == 'ia'){
|
||||||
|
//Hard reload the media, forcing media handler re-creation
|
||||||
|
this.player.hardReload();
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -224,7 +244,8 @@ class channel{
|
||||||
* Default channel config
|
* Default channel config
|
||||||
*/
|
*/
|
||||||
static defaultConfig = new Map([
|
static defaultConfig = new Map([
|
||||||
["ytPlayerType","raw"]
|
["ytPlayerType","raw"],
|
||||||
|
["IACDN",""]
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,16 @@ class settingsPanel extends panelObj{
|
||||||
}
|
}
|
||||||
|
|
||||||
docSwitch(){
|
docSwitch(){
|
||||||
|
/**
|
||||||
|
* Youtube Source Selector
|
||||||
|
*/
|
||||||
this.youtubeSource = this.panelDocument.querySelector("#settings-panel-youtube-source select");
|
this.youtubeSource = this.panelDocument.querySelector("#settings-panel-youtube-source select");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internet Archive CDN Server Input
|
||||||
|
*/
|
||||||
|
this.IACDNInput = this.panelDocument.querySelector("#settings-panel-ia-server input");
|
||||||
|
|
||||||
this.renderSettings();
|
this.renderSettings();
|
||||||
this.setupInput();
|
this.setupInput();
|
||||||
}
|
}
|
||||||
|
|
@ -43,6 +51,7 @@ class settingsPanel extends panelObj{
|
||||||
*/
|
*/
|
||||||
setupInput(){
|
setupInput(){
|
||||||
this.youtubeSource.addEventListener('change', this.updateYoutubeSource.bind(this));
|
this.youtubeSource.addEventListener('change', this.updateYoutubeSource.bind(this));
|
||||||
|
this.IACDNInput.addEventListener('keydown', this.updateIACDN.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -50,6 +59,7 @@ class settingsPanel extends panelObj{
|
||||||
*/
|
*/
|
||||||
renderSettings(){
|
renderSettings(){
|
||||||
this.youtubeSource.value = localStorage.getItem("ytPlayerType");
|
this.youtubeSource.value = localStorage.getItem("ytPlayerType");
|
||||||
|
this.IACDNInput.value = localStorage.getItem("IACDN");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -59,4 +69,15 @@ class settingsPanel extends panelObj{
|
||||||
localStorage.setItem("ytPlayerType", this.youtubeSource.value);
|
localStorage.setItem("ytPlayerType", this.youtubeSource.value);
|
||||||
client.processConfig("ytPlayerType", this.youtubeSource.value);
|
client.processConfig("ytPlayerType", this.youtubeSource.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler for Internet Archive CDN Server input
|
||||||
|
* @param {Event} event - Event handed down by event listener
|
||||||
|
*/
|
||||||
|
updateIACDN(event){
|
||||||
|
if(event.key == "Enter"){
|
||||||
|
localStorage.setItem("IACDN", this.IACDNInput.value);
|
||||||
|
client.processConfig("IACDN", this.IACDNInput.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -192,6 +192,18 @@ class player{
|
||||||
this.mediaHandler = new hlsDailymotionHandler(this.client, this, data.media);
|
this.mediaHandler = new hlsDailymotionHandler(this.client, this, data.media);
|
||||||
//Otherwise, if we have a raw-file compatible source
|
//Otherwise, if we have a raw-file compatible source
|
||||||
}else if(data.media.type == 'ia' || data.media.type == 'raw' || data.media.type == 'yt' || data.media.type == 'dm'){
|
}else if(data.media.type == 'ia' || data.media.type == 'raw' || data.media.type == 'yt' || data.media.type == 'dm'){
|
||||||
|
//If we're running a source from IA
|
||||||
|
if(data.media.type == 'ia'){
|
||||||
|
//Replace specified CDN with generic URL, in-case of hard reload
|
||||||
|
data.media.rawLink = data.media.rawLink.replace(/^https(.*)archive\.org(.*)items/g, "https://archive.org/download")
|
||||||
|
|
||||||
|
//If we have an IA source and a custom IA CDN Server set
|
||||||
|
if(data.media.type == 'ia' && localStorage.getItem("IACDN") != ""){
|
||||||
|
//Generate and set new link
|
||||||
|
data.media.rawLink = data.media.rawLink.replace("https://archive.org/download", `https://${localStorage.getItem("IACDN")}.archive.org/0/items`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Create a new raw file handler for it
|
//Create a new raw file handler for it
|
||||||
this.mediaHandler = new rawFileHandler(client, this, data.media);
|
this.mediaHandler = new rawFileHandler(client, this, data.media);
|
||||||
//Sync to time stamp
|
//Sync to time stamp
|
||||||
|
|
@ -244,6 +256,27 @@ class player{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroys and Re-Creates media handler
|
||||||
|
*/
|
||||||
|
hardReload(){
|
||||||
|
if(this.mediaHandler != null){
|
||||||
|
//Re-create data we'd get from server
|
||||||
|
const data = {
|
||||||
|
media: this.mediaHandler.nowPlaying,
|
||||||
|
timestamp: this.mediaHandler.getTimestamp()
|
||||||
|
}
|
||||||
|
|
||||||
|
//End current media handler
|
||||||
|
this.end();
|
||||||
|
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
|
//Restart from last media handlers
|
||||||
|
this.start(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles End-Media Commands from the Server
|
* Handles End-Media Commands from the Server
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue