feat: Optimize caption sort order (#1661)
* choose best caption * add comments * fix linter issue
This commit is contained in:
parent
439521893f
commit
94756458b1
|
@ -140,6 +140,10 @@ export default Vue.extend({
|
||||||
return this.$store.getters.getUsingElectron
|
return this.$store.getters.getUsingElectron
|
||||||
},
|
},
|
||||||
|
|
||||||
|
currentLocale: function () {
|
||||||
|
return this.$store.getters.getCurrentLocale
|
||||||
|
},
|
||||||
|
|
||||||
defaultPlayback: function () {
|
defaultPlayback: function () {
|
||||||
return this.$store.getters.getDefaultPlayback
|
return this.$store.getters.getDefaultPlayback
|
||||||
},
|
},
|
||||||
|
@ -1100,6 +1104,47 @@ export default Vue.extend({
|
||||||
this.determineDefaultQualityDash()
|
this.determineDefaultQualityDash()
|
||||||
},
|
},
|
||||||
|
|
||||||
|
sortCaptions: function (captionList) {
|
||||||
|
return captionList.sort((captionA, captionB) => {
|
||||||
|
const aCode = captionA.languageCode.split('-') // ex. [en,US]
|
||||||
|
const bCode = captionB.languageCode.split('-')
|
||||||
|
const aName = (captionA.label || captionA.name.simpleText) // ex: english (auto-generated)
|
||||||
|
const bName = (captionB.label || captionB.name.simpleText)
|
||||||
|
const userLocale = this.currentLocale.split(/-|_/) // ex. [en,US]
|
||||||
|
if (aCode[0] === userLocale[0]) { // caption a has same language as user's locale
|
||||||
|
if (bCode[0] === userLocale[0]) { // caption b has same language as user's locale
|
||||||
|
if (bName.search('auto') !== -1) {
|
||||||
|
// prefer caption a: b is auto-generated captions
|
||||||
|
return -1
|
||||||
|
} else if (aName.search('auto') !== -1) {
|
||||||
|
// prefer caption b: a is auto-generated captions
|
||||||
|
return 1
|
||||||
|
} else if (aCode[1] === userLocale[1]) {
|
||||||
|
// prefer caption a: caption a has same county code as user's locale
|
||||||
|
return -1
|
||||||
|
} else if (bCode[1] === userLocale[1]) {
|
||||||
|
// prefer caption b: caption b has same county code as user's locale
|
||||||
|
return 1
|
||||||
|
} else if (aCode[1] === undefined) {
|
||||||
|
// prefer caption a: no country code is better than wrong country code
|
||||||
|
return -1
|
||||||
|
} else if (bCode[1] === undefined) {
|
||||||
|
// prefer caption b: no country code is better than wrong country code
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// prefer caption a: b does not match user's language
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
} else if (bCode[0] === userLocale[0]) {
|
||||||
|
// prefer caption b: a does not match user's language
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
// sort alphabetically
|
||||||
|
return aName.localeCompare(bName)
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
transformAndInsertCaptions: async function() {
|
transformAndInsertCaptions: async function() {
|
||||||
let captionList
|
let captionList
|
||||||
if (this.captionHybridList[0] instanceof Promise) {
|
if (this.captionHybridList[0] instanceof Promise) {
|
||||||
|
@ -1109,7 +1154,7 @@ export default Vue.extend({
|
||||||
captionList = this.captionHybridList
|
captionList = this.captionHybridList
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const caption of captionList) {
|
for (const caption of this.sortCaptions(captionList)) {
|
||||||
this.player.addRemoteTextTrack({
|
this.player.addRemoteTextTrack({
|
||||||
kind: 'subtitles',
|
kind: 'subtitles',
|
||||||
src: caption.baseUrl || caption.url,
|
src: caption.baseUrl || caption.url,
|
||||||
|
|
Loading…
Reference in New Issue