mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
update missing season creator
This commit is contained in:
parent
a981c0eb8b
commit
5fa9e9637b
22 changed files with 190 additions and 83 deletions
|
@ -186,7 +186,7 @@ class LevelController extends EventHandler {
|
|||
return;
|
||||
}
|
||||
|
||||
var details = data.details, hls = this.hls, levelId, level;
|
||||
let details = data.details, hls = this.hls, levelId, level, levelError = false;
|
||||
// try to recover not fatal errors
|
||||
switch(details) {
|
||||
case ErrorDetails.FRAG_LOAD_ERROR:
|
||||
|
@ -199,6 +199,7 @@ class LevelController extends EventHandler {
|
|||
case ErrorDetails.LEVEL_LOAD_ERROR:
|
||||
case ErrorDetails.LEVEL_LOAD_TIMEOUT:
|
||||
levelId = data.level;
|
||||
levelError = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -222,6 +223,10 @@ class LevelController extends EventHandler {
|
|||
hls.abrController.nextAutoLevel = 0;
|
||||
} else if(level && level.details && level.details.live) {
|
||||
logger.warn(`level controller,${details} on live stream, discard`);
|
||||
if (levelError) {
|
||||
// reset this._level so that another call to set level() will retrigger a frag load
|
||||
this._level = undefined;
|
||||
}
|
||||
// FRAG_LOAD_ERROR and FRAG_LOAD_TIMEOUT are handled by mediaController
|
||||
} else if (details !== ErrorDetails.FRAG_LOAD_ERROR && details !== ErrorDetails.FRAG_LOAD_TIMEOUT) {
|
||||
logger.error(`cannot recover ${details} error`);
|
||||
|
|
|
@ -128,14 +128,15 @@ class StreamController extends EventHandler {
|
|||
break;
|
||||
case State.STARTING:
|
||||
// determine load level
|
||||
this.startLevel = hls.startLevel;
|
||||
if (this.startLevel === -1) {
|
||||
let startLevel = hls.startLevel;
|
||||
if (startLevel === -1) {
|
||||
// -1 : guess start Level by doing a bitrate test by loading first fragment of lowest quality level
|
||||
this.startLevel = 0;
|
||||
startLevel = 0;
|
||||
this.fragBitrateTest = true;
|
||||
}
|
||||
// set new level to playlist loader : this will trigger start level load
|
||||
this.level = hls.nextLoadLevel = this.startLevel;
|
||||
// hls.nextLoadLevel remains until it is set to a new value or until a new frag is successfully loaded
|
||||
this.level = hls.nextLoadLevel = startLevel;
|
||||
this.state = State.WAITING_LEVEL;
|
||||
this.loadedmetadata = false;
|
||||
break;
|
||||
|
@ -157,13 +158,7 @@ class StreamController extends EventHandler {
|
|||
} else {
|
||||
pos = this.nextLoadPosition;
|
||||
}
|
||||
// determine next load level
|
||||
if (this.startFragRequested === false) {
|
||||
level = this.startLevel;
|
||||
} else {
|
||||
// we are not at playback start, get next load level from level Controller
|
||||
level = hls.nextLoadLevel;
|
||||
}
|
||||
level = hls.nextLoadLevel;
|
||||
var bufferInfo = BufferHelper.bufferInfo(this.media,pos,config.maxBufferHole),
|
||||
bufferLen = bufferInfo.len,
|
||||
bufferEnd = bufferInfo.end,
|
||||
|
@ -292,8 +287,14 @@ class StreamController extends EventHandler {
|
|||
} else {
|
||||
// have we reached end of VOD playlist ?
|
||||
if (!levelDetails.live) {
|
||||
// Finalize the media stream
|
||||
this.hls.trigger(Event.BUFFER_EOS);
|
||||
this.state = State.ENDED;
|
||||
// We might be loading the last fragment but actually the media
|
||||
// is currently processing a seek command and waiting for new data to resume at another point.
|
||||
// Going to ended state while media is seeking can spawn an infinite buffering broken state.
|
||||
if (!this.media.seeking) {
|
||||
this.state = State.ENDED;
|
||||
}
|
||||
}
|
||||
frag = null;
|
||||
}
|
||||
|
@ -747,10 +748,13 @@ class StreamController extends EventHandler {
|
|||
fragCurrent &&
|
||||
data.frag.level === fragCurrent.level &&
|
||||
data.frag.sn === fragCurrent.sn) {
|
||||
|
||||
logger.log(`Loaded ${fragCurrent.sn} of level ${fragCurrent.level}`);
|
||||
if (this.fragBitrateTest === true) {
|
||||
// switch back to IDLE state ... we just loaded a fragment to determine adequate start bitrate and initialize autoswitch algo
|
||||
this.state = State.IDLE;
|
||||
this.fragBitrateTest = false;
|
||||
this.startFragRequested = false;
|
||||
data.stats.tparsed = data.stats.tbuffered = performance.now();
|
||||
this.hls.trigger(Event.FRAG_BUFFERED, {stats: data.stats, frag: fragCurrent});
|
||||
} else {
|
||||
|
@ -1064,8 +1068,17 @@ _checkBuffer() {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
if (targetSeekPosition && media.currentTime !== targetSeekPosition) {
|
||||
logger.log(`adjust currentTime from ${media.currentTime} to ${targetSeekPosition}`);
|
||||
let currentTime = media.currentTime;
|
||||
if (targetSeekPosition && currentTime !== targetSeekPosition) {
|
||||
if(bufferInfo.len === 0) {
|
||||
let nextStart = bufferInfo.nextStart;
|
||||
if (nextStart !== undefined &&
|
||||
(nextStart - targetSeekPosition) < this.config.maxSeekHole) {
|
||||
targetSeekPosition = nextStart;
|
||||
logger.log(`target seek position not buffered, seek to next buffered ${targetSeekPosition}`);
|
||||
}
|
||||
}
|
||||
logger.log(`adjust currentTime from ${currentTime} to ${targetSeekPosition}`);
|
||||
media.currentTime = targetSeekPosition;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue