diff --git a/src/controllers/playback/video/index.html b/src/controllers/playback/video/index.html
index 278b1d4d4a..14498039d9 100644
--- a/src/controllers/playback/video/index.html
+++ b/src/controllers/playback/video/index.html
@@ -21,7 +21,7 @@
diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js
index 277f2483f5..7aff936ee4 100644
--- a/src/controllers/playback/video/index.js
+++ b/src/controllers/playback/video/index.js
@@ -1574,13 +1574,14 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components
return '
' + datetime.getDisplayRunningTime(ticks) + '
';
};
- nowPlayingPositionSlider.getChapterNamesAndFractions = function () {
+ nowPlayingPositionSlider.getMarkerInfo = function () {
showOsd();
const markers = [];
const item = currentItem;
+ // use markers based on chapters
if (item && item.Chapters && item.Chapters.length) {
const runtimeDuration = item.RunTimeTicks;
@@ -1590,6 +1591,7 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components
const fraction = currentChapter.StartPositionTicks / runtimeDuration;
markers.push({
+ className: 'chapterMarker',
name: currentChapter.Name,
progress: fraction
});
diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js
index 812a846202..a20ce33b21 100644
--- a/src/elements/emby-slider/emby-slider.js
+++ b/src/elements/emby-slider/emby-slider.js
@@ -103,11 +103,11 @@ import '../emby-input/emby-input';
backgroundLower.style.width = fraction + '%';
}
- if (range.chapterMarkContainerElement) {
- if (!range.triedChapterMarksAdd) {
- addChapterMarks(range);
+ if (range.markerContainerElement) {
+ if (!range.triedAddingMarkers) {
+ addMarkers(range);
}
- updateChapterMarks(range, value);
+ updateMarkers(range, value);
}
});
}
@@ -137,62 +137,68 @@ import '../emby-input/emby-input';
});
}
- function setChapterMark(range, valueChapterMark, chapterMark, valueProgress) {
+ function setMarker(range, valueMarker, marker, valueProgress) {
requestAnimationFrame(function () {
const bubbleTrackRect = range.sliderBubbleTrack.getBoundingClientRect();
- const chapterMarkRect = chapterMark.getBoundingClientRect();
+ const markerRect = marker.getBoundingClientRect();
- if (!bubbleTrackRect.width || !chapterMarkRect.width) {
+ if (!bubbleTrackRect.width || !markerRect.width) {
// width is not set, most probably because the OSD is currently hidden
return;
}
- let chapterMarkPos = (bubbleTrackRect.width * valueChapterMark / 100) - chapterMarkRect.width / 2;
- chapterMarkPos = Math.min(Math.max(chapterMarkPos, - chapterMarkRect.width / 2), bubbleTrackRect.width - chapterMarkRect.width / 2);
+ let markerPos = (bubbleTrackRect.width * valueMarker / 100) - markerRect.width / 2;
+ markerPos = Math.min(Math.max(markerPos, - markerRect.width / 2), bubbleTrackRect.width - markerRect.width / 2);
- chapterMark.style.left = chapterMarkPos + 'px';
+ marker.style.left = markerPos + 'px';
- if (valueProgress >= valueChapterMark) {
- chapterMark.classList.remove('unwatched');
- chapterMark.classList.add('watched');
+ if (valueProgress >= valueMarker) {
+ marker.classList.remove('unwatched');
+ marker.classList.add('watched');
} else {
- chapterMark.classList.add('unwatched');
- chapterMark.classList.remove('watched');
+ marker.classList.add('unwatched');
+ marker.classList.remove('watched');
}
});
}
- function updateChapterMarks(range, currentValue) {
- if (range.chapterInfo && range.chapterInfo.length && range.chapterMarkElements && range.chapterMarkElements.length) {
- for (let i = 0, length = range.chapterMarkElements.length; i < length; i++) {
- if (range.chapterInfo.length > i) {
- setChapterMark(range, mapFractionToValue(range, range.chapterInfo[i].progress), range.chapterMarkElements[i], currentValue);
+ function updateMarkers(range, currentValue) {
+ if (range.markerInfo && range.markerInfo.length && range.markerElements && range.markerElements.length) {
+ for (let i = 0, length = range.markerElements.length; i < length; i++) {
+ if (range.markerInfo.length > i) {
+ setMarker(range, mapFractionToValue(range, range.markerInfo[i].progress), range.markerElements[i], currentValue);
}
}
}
}
- function addChapterMarks(range) {
- range.chapterInfo = [];
- if (range.getChapterNamesAndFractions) {
- range.chapterInfo = range.getChapterNamesAndFractions();
+ function addMarkers(range) {
+ range.markerInfo = [];
+ if (range.getMarkerInfo) {
+ range.markerInfo = range.getMarkerInfo();
}
- function htmlToInsert(chapterName) {
- let classChapterName = '';
- if (typeof chapterName === 'string' && chapterName.length) {
- // limit the class length in case the name contains half a novel
- classChapterName = `scm-${chapterName.substring(0, 100).toLowerCase().replace(' ', '-')}`;
+ function htmlToInsert(markerInfo) {
+ let markerTypeSpecificClasses = '';
+
+ if (markerInfo.className === 'chapterMarker') {
+ markerTypeSpecificClasses = markerInfo.className;
+
+ if (typeof markerInfo.name === 'string' && markerInfo.name.length) {
+ // limit the class length in case the name contains half a novel
+ markerTypeSpecificClasses = `${markerInfo.className} marker-${markerInfo.name.substring(0, 100).toLowerCase().replace(' ', '-')}`;
+ }
}
- return `
`;
+
+ return `
`;
}
- range.chapterInfo.forEach(chapter => {
- range.chapterMarkContainerElement.insertAdjacentHTML('beforeend', htmlToInsert(chapter.name || ''));
+ range.markerInfo.forEach(info => {
+ range.markerContainerElement.insertAdjacentHTML('beforeend', htmlToInsert(info));
});
- range.chapterMarkElements = range.chapterMarkContainerElement.querySelectorAll('.sliderChapterMark');
- range.triedChapterMarksAdd = true;
+ range.markerElements = range.markerContainerElement.querySelectorAll('.sliderMarker');
+ range.triedAddingMarkers = true;
}
EmbySliderPrototype.attachedCallback = function () {
@@ -254,10 +260,10 @@ import '../emby-input/emby-input';
let hasHideClassBubble = sliderBubble.classList.contains('hide');
- this.chapterMarkContainerElement = containerElement.querySelector('.sliderChapterMarkContainer');
- let hasHideClassChapterMarkContainer = false;
- if (this.chapterMarkContainerElement) {
- hasHideClassChapterMarkContainer = this.chapterMarkContainerElement.classList.contains('hide');
+ this.markerContainerElement = containerElement.querySelector('.sliderMarkerContainer');
+ let hasHideClassMarkerContainer = false;
+ if (this.markerContainerElement) {
+ hasHideClassMarkerContainer = this.markerContainerElement.classList.contains('hide');
}
dom.addEventListener(this, 'input', function () {
@@ -275,9 +281,9 @@ import '../emby-input/emby-input';
hasHideClassBubble = false;
}
- if (hasHideClassChapterMarkContainer) {
- this.chapterMarkContainerElement.classList.remove('hide');
- hasHideClassChapterMarkContainer = false;
+ if (hasHideClassMarkerContainer) {
+ this.markerContainerElement.classList.remove('hide');
+ hasHideClassMarkerContainer = false;
}
}, {
passive: true
@@ -293,8 +299,8 @@ import '../emby-input/emby-input';
sliderBubble.classList.add('hide');
hasHideClassBubble = true;
- this.chapterMarkContainerElement.classList.add('hide');
- hasHideClassChapterMarkContainer = true;
+ this.markerContainerElement.classList.add('hide');
+ hasHideClassMarkerContainer = true;
}, {
passive: true
});
@@ -311,9 +317,9 @@ import '../emby-input/emby-input';
hasHideClassBubble = false;
}
- if (hasHideClassChapterMarkContainer) {
- this.chapterMarkContainerElement.classList.remove('hide');
- hasHideClassChapterMarkContainer = false;
+ if (hasHideClassMarkerContainer) {
+ this.markerContainerElement.classList.remove('hide');
+ hasHideClassMarkerContainer = false;
}
}
}, {
@@ -325,8 +331,8 @@ import '../emby-input/emby-input';
sliderBubble.classList.add('hide');
hasHideClassBubble = true;
- this.chapterMarkContainerElement.classList.add('hide');
- hasHideClassChapterMarkContainer = true;
+ this.markerContainerElement.classList.add('hide');
+ hasHideClassMarkerContainer = true;
}, {
passive: true
});
diff --git a/src/elements/emby-slider/emby-slider.scss b/src/elements/emby-slider/emby-slider.scss
index 1cff4cb16b..4ff35dc789 100644
--- a/src/elements/emby-slider/emby-slider.scss
+++ b/src/elements/emby-slider/emby-slider.scss
@@ -246,27 +246,27 @@
margin-bottom: 0.25em;
}
-.sliderChapterMarkContainer {
+.sliderMarkerContainer {
position: absolute;
left: 0;
right: 0;
margin: 0 0.54em; /* half of slider thumb size */
}
-.sliderChapterMark {
+.sliderMarker {
position: absolute;
transform: translate3d(0, -100%, 0) rotate(90deg);
}
-.sliderChapterMark::before {
+.sliderMarker.chapterMarker::before {
font-family: 'Material Icons', sans-serif;
content: "\e892";
}
-.sliderChapterMark.unwatched {
+.sliderMarker.unwatched {
color: rgba(255, 255, 255, 0.3);
}
-.sliderChapterMark.watched {
+.sliderMarker.watched {
color: #00a4dc;
}