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
|
||||
},
|
||||
|
||||
currentLocale: function () {
|
||||
return this.$store.getters.getCurrentLocale
|
||||
},
|
||||
|
||||
defaultPlayback: function () {
|
||||
return this.$store.getters.getDefaultPlayback
|
||||
},
|
||||
|
@ -1100,6 +1104,47 @@ export default Vue.extend({
|
|||
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() {
|
||||
let captionList
|
||||
if (this.captionHybridList[0] instanceof Promise) {
|
||||
|
@ -1109,7 +1154,7 @@ export default Vue.extend({
|
|||
captionList = this.captionHybridList
|
||||
}
|
||||
|
||||
for (const caption of captionList) {
|
||||
for (const caption of this.sortCaptions(captionList)) {
|
||||
this.player.addRemoteTextTrack({
|
||||
kind: 'subtitles',
|
||||
src: caption.baseUrl || caption.url,
|
||||
|
|
Loading…
Reference in New Issue