First step: make the player handle both transcode and native audio streams

This commit is contained in:
emeric
2020-04-19 14:59:39 +02:00
parent 1fe87fec4c
commit 7d8ec6ff1e
3 changed files with 48 additions and 25 deletions
+2 -1
View File
@@ -3,7 +3,8 @@
<!--FORMS message blocks--> <!--FORMS message blocks-->
<message id="Lms.MediaPlayer.template"> <message id="Lms.MediaPlayer.template">
<audio id="lms-mp-audio"></audio> <audio id="lms-mp-audio">
</audio>
<div class="container"> <div class="container">
<div class="Lms-player-seek-container"> <div class="Lms-player-seek-container">
<input id="lms-mp-seek" class="Lms-player-seek-common Lms-player-seek" type="range" min="0" max="100" step="1" value="0"/> <input id="lms-mp-seek" class="Lms-player-seek-common Lms-player-seek" type="range" min="0" max="100" step="1" value="0"/>
+40 -10
View File
@@ -14,8 +14,8 @@ LMS.mediaplayer = function () {
var _elems = {}; var _elems = {};
var _offset = 0; var _offset = 0;
var _duration = 0; var _duration = 0;
var _audioSrc; var _audioNativeSrc;
var _mode = Mode.File; var _audioTranscodedSrc;
var _updateControls = function() { var _updateControls = function() {
if (_elems.audio.paused) { if (_elems.audio.paused) {
@@ -115,8 +115,8 @@ LMS.mediaplayer = function () {
_elems.playpause.addEventListener("click", function() { _elems.playpause.addEventListener("click", function() {
if (_elems.audio.paused) { if (_elems.audio.paused) {
if (_elems.audio.hasAttribute("src")) if (_elems.audio.firstChild)
_elems.audio.play(); _playTrack();
} }
else else
_elems.audio.pause(); _elems.audio.pause();
@@ -129,15 +129,17 @@ LMS.mediaplayer = function () {
_requestNextTrack(); _requestNextTrack();
}); });
_elems.seek.addEventListener("change", function() { _elems.seek.addEventListener("change", function() {
if (!_elems.audio.hasAttribute("src")) let mode = _getAudioMode();
if (!mode)
return; return;
let selectedOffset = parseInt(_elems.seek.value, 10); let selectedOffset = parseInt(_elems.seek.value, 10);
switch (_mode) { switch (mode) {
case Mode.Transcode: case Mode.Transcode:
_offset = selectedOffset; _offset = selectedOffset;
_elems.audio.src = _audioSrc + "&offset=" + _offset; _removeAudioSources();
_addAudioSourceIfSet(_audioTranscodeSrc + "&offset=" + _offset);
_elems.audio.load(); _elems.audio.load();
_elems.audio.currentTime = 0; _elems.audio.currentTime = 0;
_playTrack(); _playTrack();
@@ -189,14 +191,42 @@ LMS.mediaplayer = function () {
} }
var _removeAudioSources = function() {
while ( _elems.audio.lastElementChild) {
_elems.audio.removeChild( _elems.audio.lastElementChild);
}
}
var _addAudioSourceIfSet = function(audioSrc) {
let source = document.createElement('source');
source.src = audioSrc;
_elems.audio.appendChild(source);
}
var _getAudioMode = function() {
if (_elems.audio.currentSrc) {
if (_elems.audio.currentSrc.includes("format"))
return Mode.Transcode;
else
return Mode.File;
}
else
return undefined;
}
var loadTrack = function(params, autoplay) { var loadTrack = function(params, autoplay) {
_offset = 0; _offset = 0;
_duration = params.duration; _duration = params.duration;
_audioSrc = params.resource; _audioNativeSrc = params.native_resource;
_mode = params.mode; _audioTranscodeSrc = params.transcode_resource;
_elems.seek.max = _duration; _elems.seek.max = _duration;
_elems.audio.src = _audioSrc;
_removeAudioSources();
// ! order is important
_addAudioSourceIfSet(_audioNativeSrc);
_addAudioSourceIfSet(_audioTranscodeSrc);
_elems.audio.load();
_elems.curtime.innerHTML = _durationToString(_offset); _elems.curtime.innerHTML = _durationToString(_offset);
_elems.duration.innerHTML = _durationToString(_duration); _elems.duration.innerHTML = _durationToString(_duration);
+6 -14
View File
@@ -62,26 +62,18 @@ MediaPlayer::loadTrack(Database::IdType trackId, bool play)
const auto track {Database::Track::getById(LmsApp->getDbSession(), trackId)}; const auto track {Database::Track::getById(LmsApp->getDbSession(), trackId)};
const std::string imgResourceMimeType {LmsApp->getImageResource()->getMimeType()}; const std::string imgResourceMimeType {LmsApp->getImageResource()->getMimeType()};
std::string resource; std::string nativeResource;
bool transcode; const std::string transcodeResource {LmsApp->getAudioTranscodeResource()->getUrlForUser(trackId, LmsApp->getUser())};
if (LmsApp->getUser()->getAudioTranscodeEnable()) // if (!LmsApp->getUser()->getAudioTranscodeEnable())
{ nativeResource = LmsApp->getAudioFileResource()->getUrl(trackId);
resource = LmsApp->getAudioTranscodeResource()->getUrlForUser(trackId, LmsApp->getUser());
transcode = true;
}
else
{
resource = LmsApp->getAudioFileResource()->getUrl(trackId);
transcode = false;
}
const auto artists {track->getArtists()}; const auto artists {track->getArtists()};
std::ostringstream oss; std::ostringstream oss;
oss oss
<< "var params = {" << "var params = {"
<< " mode: " << (transcode ? "Mode.Transcode" : "Mode.File") << "," << " native_resource: \"" << nativeResource << "\","
<< " resource: \"" << resource << "\"," << " transcode_resource: \"" << transcodeResource << "\","
<< " duration: " << std::chrono::duration_cast<std::chrono::seconds>(track->getDuration()).count() << "," << " duration: " << std::chrono::duration_cast<std::chrono::seconds>(track->getDuration()).count() << ","
<< " title: \"" << StringUtils::jsEscape(track->getName()) << "\"," << " title: \"" << StringUtils::jsEscape(track->getName()) << "\","
<< " artist: \"" << (!artists.empty() ? StringUtils::jsEscape(artists.front()->getName()) : "") << "\"," << " artist: \"" << (!artists.empty() ? StringUtils::jsEscape(artists.front()->getName()) : "") << "\","