Fix settings no longer redirect.
This commit is contained in:
parent
a39a10636b
commit
10a76f8d45
@ -1,11 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<div id="SRFPlayConfigPage" data-role="page" class="page type-interior pluginConfigurationPage" data-require="emby-input,emby-button,emby-select,emby-checkbox">
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>SRF Play</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="SRFPlayConfigPage" data-role="page" class="page type-interior pluginConfigurationPage" data-require="emby-input,emby-button,emby-select,emby-checkbox">
|
|
||||||
<div data-role="content">
|
<div data-role="content">
|
||||||
<div class="content-primary">
|
<div class="content-primary">
|
||||||
<form id="SRFPlayConfigForm">
|
<form id="SRFPlayConfigForm">
|
||||||
@ -398,5 +391,3 @@
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
|
|||||||
@ -1,66 +1,59 @@
|
|||||||
<!DOCTYPE html>
|
<div id="SRFPlayRecordingsPage" data-role="page" class="page type-interior pluginConfigurationPage"
|
||||||
<html lang="en">
|
data-require="emby-button,emby-input">
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>SRF Sport Recordings</title>
|
|
||||||
<style>
|
<style>
|
||||||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
#SRFPlayRecordingsPage .srfrec-wrap { padding: 0 1em; }
|
||||||
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #1a1a2e; color: #e0e0e0; padding: 20px; }
|
#SRFPlayRecordingsPage table { width: 100%; border-collapse: collapse; margin: 10px 0 20px; }
|
||||||
h1 { color: #fff; margin-bottom: 8px; font-size: 1.8em; }
|
#SRFPlayRecordingsPage th { text-align: left; padding: 10px 8px; border-bottom: 2px solid #444; color: #aaa; font-size: 0.85em; text-transform: uppercase; }
|
||||||
h2 { color: #ccc; margin: 24px 0 12px; font-size: 1.3em; border-bottom: 1px solid #333; padding-bottom: 6px; }
|
#SRFPlayRecordingsPage td { padding: 10px 8px; border-bottom: 1px solid #2a2a3e; }
|
||||||
.subtitle { color: #999; margin-bottom: 20px; font-size: 0.9em; }
|
#SRFPlayRecordingsPage tr:hover { background: rgba(255,255,255,0.04); }
|
||||||
table { width: 100%; border-collapse: collapse; margin: 10px 0 20px; }
|
#SRFPlayRecordingsPage .btn { padding: 6px 16px; border: none; border-radius: 4px; cursor: pointer; font-size: 0.85em; color: #fff; transition: opacity 0.2s; }
|
||||||
th { text-align: left; padding: 10px 8px; border-bottom: 2px solid #444; color: #aaa; font-size: 0.85em; text-transform: uppercase; }
|
#SRFPlayRecordingsPage .btn:hover { opacity: 0.85; }
|
||||||
td { padding: 10px 8px; border-bottom: 1px solid #2a2a3e; }
|
#SRFPlayRecordingsPage .btn-record { background: #4CAF50; }
|
||||||
tr:hover { background: #2a2a3e; }
|
#SRFPlayRecordingsPage .btn-stop { background: #FF9800; }
|
||||||
.btn { padding: 6px 16px; border: none; border-radius: 4px; cursor: pointer; font-size: 0.85em; color: #fff; transition: opacity 0.2s; }
|
#SRFPlayRecordingsPage .btn-cancel { background: #9E9E9E; }
|
||||||
.btn:hover { opacity: 0.85; }
|
#SRFPlayRecordingsPage .btn-delete { background: #f44336; }
|
||||||
.btn-record { background: #4CAF50; }
|
#SRFPlayRecordingsPage .btn-refresh { background: #2196F3; margin-bottom: 16px; }
|
||||||
.btn-stop { background: #FF9800; }
|
#SRFPlayRecordingsPage .status { padding: 3px 8px; border-radius: 3px; font-size: 0.8em; font-weight: 600; color: #fff; }
|
||||||
.btn-cancel { background: #9E9E9E; }
|
#SRFPlayRecordingsPage .status-scheduled { background: #1565C0; }
|
||||||
.btn-delete { background: #f44336; }
|
#SRFPlayRecordingsPage .status-waiting { background: #E65100; }
|
||||||
.btn-refresh { background: #2196F3; margin-bottom: 16px; }
|
#SRFPlayRecordingsPage .status-recording { background: #2E7D32; }
|
||||||
.status { padding: 3px 8px; border-radius: 3px; font-size: 0.8em; font-weight: 600; }
|
#SRFPlayRecordingsPage .status-failed { background: #C62828; }
|
||||||
.status-scheduled { background: #1565C0; }
|
#SRFPlayRecordingsPage .srfrec-msg { padding: 12px; color: #999; font-style: italic; }
|
||||||
.status-waiting { background: #E65100; }
|
#SRFPlayRecordingsPage .srfrec-error { color: #f44; }
|
||||||
.status-recording { background: #2E7D32; }
|
#SRFPlayRecordingsPage .login-form { max-width: 400px; margin: 40px auto; }
|
||||||
.status-failed { background: #C62828; }
|
#SRFPlayRecordingsPage .login-form input { width: 100%; padding: 10px; margin: 8px 0; background: #2a2a3e; border: 1px solid #444; color: #fff; border-radius: 4px; font-size: 1em; }
|
||||||
.msg { padding: 12px; color: #999; font-style: italic; }
|
#SRFPlayRecordingsPage .login-form .btn { width: 100%; padding: 12px; font-size: 1em; margin-top: 12px; }
|
||||||
.error { color: #f44; }
|
|
||||||
.login-form { max-width: 400px; margin: 60px auto; }
|
|
||||||
.login-form input { width: 100%; padding: 10px; margin: 8px 0; background: #2a2a3e; border: 1px solid #444; color: #fff; border-radius: 4px; font-size: 1em; }
|
|
||||||
.login-form .btn { width: 100%; padding: 12px; font-size: 1em; margin-top: 12px; }
|
|
||||||
@media (max-width: 600px) { body { padding: 10px; } td, th { padding: 6px 4px; font-size: 0.85em; } }
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
<div data-role="content">
|
||||||
<body>
|
<div class="content-primary srfrec-wrap">
|
||||||
<div id="loginSection" style="display:none;">
|
<div id="srfrecLoginSection" style="display:none;">
|
||||||
<div class="login-form">
|
<div class="login-form">
|
||||||
<h1>SRF Sport Recordings</h1>
|
<h1>SRF Sport Recordings</h1>
|
||||||
<p class="subtitle">Sign in to your Jellyfin server</p>
|
<p class="fieldDescription">Sign in to your Jellyfin server</p>
|
||||||
<input type="text" id="loginServer" placeholder="Server URL (e.g. http://192.168.1.50:8096)" />
|
<input type="text" id="srfrecLoginServer" placeholder="Server URL (e.g. http://192.168.1.50:8096)" />
|
||||||
<input type="text" id="loginUser" placeholder="Username" />
|
<input type="text" id="srfrecLoginUser" placeholder="Username" />
|
||||||
<input type="password" id="loginPass" placeholder="Password" />
|
<input type="password" id="srfrecLoginPass" placeholder="Password" />
|
||||||
<button class="btn btn-record" onclick="SRFRec.login()">Sign In</button>
|
<button type="button" class="btn btn-record" onclick="SRFRec.login()">Sign In</button>
|
||||||
<p id="loginError" class="error" style="margin-top:10px;"></p>
|
<p id="srfrecLoginError" class="srfrec-error" style="margin-top:10px;"></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="mainSection" style="display:none;">
|
<div id="srfrecMainSection" style="display:none;">
|
||||||
<h1>SRF Sport Recordings</h1>
|
<h1>SRF Sport Recordings</h1>
|
||||||
<p class="subtitle">Browse upcoming sport livestreams and schedule recordings. <span id="userInfo"></span></p>
|
<p class="fieldDescription">Browse upcoming sport livestreams and schedule recordings. <span id="srfrecUserInfo"></span></p>
|
||||||
|
|
||||||
<h2>Upcoming Sport Livestreams</h2>
|
<h2>Upcoming Sport Livestreams</h2>
|
||||||
<button class="btn btn-refresh" onclick="SRFRec.loadSchedule()">Refresh Schedule</button>
|
<button type="button" class="btn btn-refresh" onclick="SRFRec.loadSchedule()">Refresh Schedule</button>
|
||||||
<div id="scheduleContainer"><p class="msg">Loading schedule...</p></div>
|
<div id="srfrecScheduleContainer"><p class="srfrec-msg">Loading schedule...</p></div>
|
||||||
|
|
||||||
<h2>Scheduled & Active Recordings</h2>
|
<h2>Scheduled & Active Recordings</h2>
|
||||||
<div id="activeRecordingsContainer"><p class="msg">Loading...</p></div>
|
<div id="srfrecActiveRecordingsContainer"><p class="srfrec-msg">Loading...</p></div>
|
||||||
|
|
||||||
<h2>Completed Recordings</h2>
|
<h2>Completed Recordings</h2>
|
||||||
<button class="btn btn-refresh" onclick="SRFRec.loadRecordings()">Refresh</button>
|
<button type="button" class="btn btn-refresh" onclick="SRFRec.loadRecordings()">Refresh</button>
|
||||||
<div id="completedRecordingsContainer"><p class="msg">Loading...</p></div>
|
<div id="srfrecCompletedRecordingsContainer"><p class="srfrec-msg">Loading...</p></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -91,9 +84,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Show login form
|
// Show login form
|
||||||
var serverInput = document.getElementById('loginServer');
|
var serverInput = document.getElementById('srfrecLoginServer');
|
||||||
serverInput.value = window.location.origin;
|
serverInput.value = window.location.origin;
|
||||||
document.getElementById('loginSection').style.display = 'block';
|
document.getElementById('srfrecLoginSection').style.display = 'block';
|
||||||
},
|
},
|
||||||
|
|
||||||
verifySession: function(session) {
|
verifySession: function(session) {
|
||||||
@ -102,24 +95,24 @@
|
|||||||
headers: { 'X-Emby-Token': this.token }
|
headers: { 'X-Emby-Token': this.token }
|
||||||
}).then(function(r) {
|
}).then(function(r) {
|
||||||
if (r.ok) {
|
if (r.ok) {
|
||||||
document.getElementById('userInfo').textContent = '(Server: ' + self.serverUrl + ')';
|
document.getElementById('srfrecUserInfo').textContent = '(Server: ' + self.serverUrl + ')';
|
||||||
self.showMain();
|
self.showMain();
|
||||||
} else {
|
} else {
|
||||||
localStorage.removeItem('srfRecSession');
|
localStorage.removeItem('srfRecSession');
|
||||||
document.getElementById('loginSection').style.display = 'block';
|
document.getElementById('srfrecLoginSection').style.display = 'block';
|
||||||
}
|
}
|
||||||
}).catch(function() {
|
}).catch(function() {
|
||||||
localStorage.removeItem('srfRecSession');
|
localStorage.removeItem('srfRecSession');
|
||||||
document.getElementById('loginSection').style.display = 'block';
|
document.getElementById('srfrecLoginSection').style.display = 'block';
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
login: function() {
|
login: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
var server = document.getElementById('loginServer').value.replace(/\/+$/, '');
|
var server = document.getElementById('srfrecLoginServer').value.replace(/\/+$/, '');
|
||||||
var user = document.getElementById('loginUser').value;
|
var user = document.getElementById('srfrecLoginUser').value;
|
||||||
var pass = document.getElementById('loginPass').value;
|
var pass = document.getElementById('srfrecLoginPass').value;
|
||||||
var errorEl = document.getElementById('loginError');
|
var errorEl = document.getElementById('srfrecLoginError');
|
||||||
errorEl.textContent = '';
|
errorEl.textContent = '';
|
||||||
|
|
||||||
fetch(server + '/Users/AuthenticateByName', {
|
fetch(server + '/Users/AuthenticateByName', {
|
||||||
@ -142,7 +135,7 @@
|
|||||||
token: data.AccessToken,
|
token: data.AccessToken,
|
||||||
userName: data.User.Name
|
userName: data.User.Name
|
||||||
}));
|
}));
|
||||||
document.getElementById('userInfo').textContent = '(Signed in as ' + data.User.Name + ')';
|
document.getElementById('srfrecUserInfo').textContent = '(Signed in as ' + data.User.Name + ')';
|
||||||
self.showMain();
|
self.showMain();
|
||||||
})
|
})
|
||||||
.catch(function(err) {
|
.catch(function(err) {
|
||||||
@ -151,8 +144,8 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
showMain: function() {
|
showMain: function() {
|
||||||
document.getElementById('loginSection').style.display = 'none';
|
document.getElementById('srfrecLoginSection').style.display = 'none';
|
||||||
document.getElementById('mainSection').style.display = 'block';
|
document.getElementById('srfrecMainSection').style.display = 'block';
|
||||||
this.loadSchedule();
|
this.loadSchedule();
|
||||||
this.loadRecordings();
|
this.loadRecordings();
|
||||||
},
|
},
|
||||||
@ -175,14 +168,14 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
loadSchedule: function() {
|
loadSchedule: function() {
|
||||||
var container = document.getElementById('scheduleContainer');
|
var container = document.getElementById('srfrecScheduleContainer');
|
||||||
container.innerHTML = '<p class="msg">Loading schedule...</p>';
|
container.innerHTML = '<p class="srfrec-msg">Loading schedule...</p>';
|
||||||
|
|
||||||
fetch(this.serverUrl + '/Plugins/SRFPlay/Recording/Schedule', { headers: this.getHeaders() })
|
fetch(this.serverUrl + '/Plugins/SRFPlay/Recording/Schedule', { headers: this.getHeaders() })
|
||||||
.then(function(r) { return r.json(); })
|
.then(function(r) { return r.json(); })
|
||||||
.then(function(programs) {
|
.then(function(programs) {
|
||||||
if (!programs || programs.length === 0) {
|
if (!programs || programs.length === 0) {
|
||||||
container.innerHTML = '<p class="msg">No upcoming sport livestreams found.</p>';
|
container.innerHTML = '<p class="srfrec-msg">No upcoming sport livestreams found.</p>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,7 +187,7 @@
|
|||||||
html += '<td>' + (p.title || 'Unknown') + '</td>';
|
html += '<td>' + (p.title || 'Unknown') + '</td>';
|
||||||
html += '<td>' + SRFRec.formatDate(p.validFrom || p.date) + '</td>';
|
html += '<td>' + SRFRec.formatDate(p.validFrom || p.date) + '</td>';
|
||||||
html += '<td>' + SRFRec.formatDate(p.validTo) + '</td>';
|
html += '<td>' + SRFRec.formatDate(p.validTo) + '</td>';
|
||||||
html += '<td><button class="btn btn-record" onclick="SRFRec.scheduleRecording(\'' + encodeURIComponent(p.urn) + '\')">Record</button></td>';
|
html += '<td><button type="button" class="btn btn-record" onclick="SRFRec.scheduleRecording(\'' + encodeURIComponent(p.urn) + '\')">Record</button></td>';
|
||||||
html += '</tr>';
|
html += '</tr>';
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -202,7 +195,7 @@
|
|||||||
container.innerHTML = html;
|
container.innerHTML = html;
|
||||||
})
|
})
|
||||||
.catch(function(err) {
|
.catch(function(err) {
|
||||||
container.innerHTML = '<p class="error">Error loading schedule: ' + err.message + '</p>';
|
container.innerHTML = '<p class="srfrec-error">Error loading schedule: ' + err.message + '</p>';
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -229,8 +222,8 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
loadActiveRecordings: function() {
|
loadActiveRecordings: function() {
|
||||||
var container = document.getElementById('activeRecordingsContainer');
|
var container = document.getElementById('srfrecActiveRecordingsContainer');
|
||||||
container.innerHTML = '<p class="msg">Loading...</p>';
|
container.innerHTML = '<p class="srfrec-msg">Loading...</p>';
|
||||||
|
|
||||||
fetch(this.serverUrl + '/Plugins/SRFPlay/Recording/All', { headers: this.getHeaders() })
|
fetch(this.serverUrl + '/Plugins/SRFPlay/Recording/All', { headers: this.getHeaders() })
|
||||||
.then(function(r) { return r.json(); })
|
.then(function(r) { return r.json(); })
|
||||||
@ -241,7 +234,7 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (active.length === 0) {
|
if (active.length === 0) {
|
||||||
container.innerHTML = '<p class="msg">No scheduled or active recordings.</p>';
|
container.innerHTML = '<p class="srfrec-msg">No scheduled or active recordings.</p>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,9 +258,9 @@
|
|||||||
html += '<td>' + SRFRec.formatDate(r.validFrom) + '</td>';
|
html += '<td>' + SRFRec.formatDate(r.validFrom) + '</td>';
|
||||||
html += '<td>';
|
html += '<td>';
|
||||||
if (r.state === 2 || r.state === 'Recording') {
|
if (r.state === 2 || r.state === 'Recording') {
|
||||||
html += '<button class="btn btn-stop" onclick="SRFRec.stopRecording(\'' + r.id + '\')">Stop</button>';
|
html += '<button type="button" class="btn btn-stop" onclick="SRFRec.stopRecording(\'' + r.id + '\')">Stop</button>';
|
||||||
} else {
|
} else {
|
||||||
html += '<button class="btn btn-cancel" onclick="SRFRec.cancelRecording(\'' + r.id + '\')">Cancel</button>';
|
html += '<button type="button" class="btn btn-cancel" onclick="SRFRec.cancelRecording(\'' + r.id + '\')">Cancel</button>';
|
||||||
}
|
}
|
||||||
html += '</td></tr>';
|
html += '</td></tr>';
|
||||||
});
|
});
|
||||||
@ -276,19 +269,19 @@
|
|||||||
container.innerHTML = html;
|
container.innerHTML = html;
|
||||||
})
|
})
|
||||||
.catch(function(err) {
|
.catch(function(err) {
|
||||||
container.innerHTML = '<p class="error">Error: ' + err.message + '</p>';
|
container.innerHTML = '<p class="srfrec-error">Error: ' + err.message + '</p>';
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
loadCompletedRecordings: function() {
|
loadCompletedRecordings: function() {
|
||||||
var container = document.getElementById('completedRecordingsContainer');
|
var container = document.getElementById('srfrecCompletedRecordingsContainer');
|
||||||
container.innerHTML = '<p class="msg">Loading...</p>';
|
container.innerHTML = '<p class="srfrec-msg">Loading...</p>';
|
||||||
|
|
||||||
fetch(this.serverUrl + '/Plugins/SRFPlay/Recording/Completed', { headers: this.getHeaders() })
|
fetch(this.serverUrl + '/Plugins/SRFPlay/Recording/Completed', { headers: this.getHeaders() })
|
||||||
.then(function(r) { return r.json(); })
|
.then(function(r) { return r.json(); })
|
||||||
.then(function(recordings) {
|
.then(function(recordings) {
|
||||||
if (!recordings || recordings.length === 0) {
|
if (!recordings || recordings.length === 0) {
|
||||||
container.innerHTML = '<p class="msg">No completed recordings.</p>';
|
container.innerHTML = '<p class="srfrec-msg">No completed recordings.</p>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -300,7 +293,7 @@
|
|||||||
html += '<td>' + (r.title || 'Unknown') + '</td>';
|
html += '<td>' + (r.title || 'Unknown') + '</td>';
|
||||||
html += '<td>' + SRFRec.formatDate(r.recordingStartedAt) + '</td>';
|
html += '<td>' + SRFRec.formatDate(r.recordingStartedAt) + '</td>';
|
||||||
html += '<td>' + SRFRec.formatSize(r.fileSizeBytes) + '</td>';
|
html += '<td>' + SRFRec.formatSize(r.fileSizeBytes) + '</td>';
|
||||||
html += '<td><button class="btn btn-delete" onclick="SRFRec.deleteRecording(\'' + r.id + '\')">Delete</button></td>';
|
html += '<td><button type="button" class="btn btn-delete" onclick="SRFRec.deleteRecording(\'' + r.id + '\')">Delete</button></td>';
|
||||||
html += '</tr>';
|
html += '</tr>';
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -308,7 +301,7 @@
|
|||||||
container.innerHTML = html;
|
container.innerHTML = html;
|
||||||
})
|
})
|
||||||
.catch(function(err) {
|
.catch(function(err) {
|
||||||
container.innerHTML = '<p class="error">Error: ' + err.message + '</p>';
|
container.innerHTML = '<p class="srfrec-error">Error: ' + err.message + '</p>';
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -338,7 +331,16 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
var page = document.querySelector('#SRFPlayRecordingsPage');
|
||||||
|
if (page && typeof page.addEventListener === 'function' && typeof ApiClient !== 'undefined') {
|
||||||
|
// Inside the Jellyfin dashboard: defer to the page lifecycle so we
|
||||||
|
// never run during the config page's view and never hijack routing.
|
||||||
|
page.addEventListener('pageshow', function() { SRFRec.init(); });
|
||||||
|
} else {
|
||||||
|
// Standalone (e.g. TV/browser): initialise immediately.
|
||||||
SRFRec.init();
|
SRFRec.init();
|
||||||
|
}
|
||||||
|
})();
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</div>
|
||||||
</html>
|
|
||||||
|
|||||||
@ -62,9 +62,15 @@ public class MediaSourceFactory : IMediaSourceFactory
|
|||||||
return Task.FromResult<MediaSourceInfo?>(null);
|
return Task.FromResult<MediaSourceInfo?>(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Detect if this is a live stream
|
// A scheduled livestream is only treated as live when the broadcast window is open.
|
||||||
var isLiveStream = chapter.Type == "SCHEDULED_LIVESTREAM" ||
|
// Past replays (ValidTo in the past) and upcoming events (ValidFrom in the future)
|
||||||
|
// are treated as VOD to avoid IsInfiniteStream/IgnoreDts flags and FFmpeg -re mode.
|
||||||
|
var isScheduledLivestream = chapter.Type == "SCHEDULED_LIVESTREAM" ||
|
||||||
urn.Contains("livestream", StringComparison.OrdinalIgnoreCase);
|
urn.Contains("livestream", StringComparison.OrdinalIgnoreCase);
|
||||||
|
var now = DateTime.UtcNow;
|
||||||
|
var isLiveStream = isScheduledLivestream &&
|
||||||
|
(chapter.ValidFrom == null || chapter.ValidFrom.Value.ToUniversalTime() <= now) &&
|
||||||
|
(chapter.ValidTo == null || chapter.ValidTo.Value.ToUniversalTime() > now);
|
||||||
|
|
||||||
// Register stream with UNAUTHENTICATED URL - proxy will authenticate on-demand
|
// Register stream with UNAUTHENTICATED URL - proxy will authenticate on-demand
|
||||||
// This avoids wasting 30-second tokens during category browsing
|
// This avoids wasting 30-second tokens during category browsing
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user