diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js
index decb77b3e3..030b6d7fcf 100644
--- a/src/components/itemHelper.js
+++ b/src/components/itemHelper.js
@@ -331,6 +331,17 @@ export function supportsMediaSourceSelection (item) {
return true;
}
+export function sortTracks (trackA, trackB) {
+ let cmp = trackA.IsExternal - trackB.IsExternal;
+ if (cmp != 0) return cmp;
+ cmp = trackB.IsForced - trackA.IsForced;
+ if (cmp != 0) return cmp;
+ cmp = trackB.IsDefault - trackA.IsDefault;
+ if (cmp != 0) return cmp;
+
+ return trackA.Index - trackB.Index;
+}
+
export default {
getDisplayName: getDisplayName,
supportsAddingToCollection: supportsAddingToCollection,
@@ -346,5 +357,6 @@ export default {
canRate: canRate,
canConvert: canConvert,
canRefreshMetadata: canRefreshMetadata,
- supportsMediaSourceSelection: supportsMediaSourceSelection
+ supportsMediaSourceSelection: supportsMediaSourceSelection,
+ sortTracks: sortTracks
};
diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js
index 5272e51dfc..c51c018739 100644
--- a/src/controllers/itemDetails/index.js
+++ b/src/controllers/itemDetails/index.js
@@ -188,7 +188,7 @@ function renderTrackSelections(page, instance, item, forceReload) {
});
resolutionNames.sort((a, b) => parseInt(b.Name, 10) - parseInt(a.Name, 10));
- sourceNames.sort(function(a, b) {
+ sourceNames.sort((a, b) => {
const nameA = a.Name.toUpperCase();
const nameB = b.Name.toUpperCase();
if (nameA < nameB) {
@@ -274,6 +274,7 @@ function renderAudioSelections(page, mediaSources) {
const tracks = mediaSource.MediaStreams.filter(function (m) {
return m.Type === 'Audio';
});
+ tracks.sort((a, b) => itemHelper.sortTracks(a, b));
const select = page.querySelector('.selectAudio');
select.setLabel(globalize.translate('Audio'));
const selectedId = mediaSource.DefaultAudioStreamIndex;
@@ -303,31 +304,26 @@ function renderSubtitleSelections(page, mediaSources) {
const tracks = mediaSource.MediaStreams.filter(function (m) {
return m.Type === 'Subtitle';
});
+ tracks.sort((a, b) => itemHelper.sortTracks(a, b));
const select = page.querySelector('.selectSubtitles');
select.setLabel(globalize.translate('Subtitles'));
const selectedId = mediaSource.DefaultSubtitleStreamIndex == null ? -1 : mediaSource.DefaultSubtitleStreamIndex;
- const videoTracks = mediaSource.MediaStreams.filter(function (m) {
- return m.Type === 'Video';
- });
+ let selected = selectedId === -1 ? ' selected' : '';
+ select.innerHTML = '' + tracks.map(function (v) {
+ selected = v.Index === selectedId ? ' selected' : '';
+ return '';
+ }).join('');
- // This only makes sense on Video items
- if (videoTracks.length) {
- let selected = selectedId === -1 ? ' selected' : '';
- select.innerHTML = '' + tracks.map(function (v) {
- selected = v.Index === selectedId ? ' selected' : '';
- return '';
- }).join('');
-
- if (tracks.length > 0) {
- select.removeAttribute('disabled');
- } else {
- select.setAttribute('disabled', 'disabled');
- }
+ if (tracks.length > 0) {
+ select.removeAttribute('disabled');
+ } else {
+ select.setAttribute('disabled', 'disabled');
+ }
+ if (tracks.length) {
page.querySelector('.selectSubtitlesContainer').classList.remove('hide');
} else {
- select.innerHTML = '';
page.querySelector('.selectSubtitlesContainer').classList.add('hide');
}
}