Кастомный загрузчик HLS
Наши аудиодорожки находятся в формате HLS master.m3u8. Отсортировать их на сервере невозможно. Не могли бы вы добавить возможность сортировки аудиодорожек по алфавиту, по языковому коду, а не по названию?
Можно написать свой загрузчик манифестов, который отсортирует аудиодорожки в нужном порядке. Написать его можно с помощью нейросетей по запросу "напиши кастомный загрузчик манифеста HLS с сортировкой аудидорожек по параметру language".
class CustomLoader extends Hls.DefaultConfig.loader {
load(context, config, callbacks) {
var onSuccess = callbacks.onSuccess;
callbacks.onSuccess = function (response, stats, ctx, details) {
if (context.type === 'manifest' && typeof response.data === 'string') {
response = { data: reorderAudioByLang(response.data), url: response.url };
}
onSuccess(response, stats, ctx, details);
};
super.load(context, config, callbacks);
}
}
function reorderAudioByLang(m3u8) {
var lines = m3u8.split(/\r?\n/);
var media = [], other = [];
for (var i=0;i<lines.length;i++) {
var L = lines[i];
if (/^#EXT-X-MEDIA:TYPE=AUDIO/.test(L)) media.push(L); else other.push(L);
}
media.sort(function(a,b){
function g(s){ var m = s.match(/LANGUAGE="([^"]*)"/i); return (m?m[1]:"").toLowerCase(); }
var la=g(a), lb=g(b); return la>lb?1:la<lb?-1:0;
});
var out=[], mi=0;
for (var i=0;i<lines.length;i++) {
if (/^#EXT-X-MEDIA:TYPE=AUDIO/.test(lines[i])) {
if (mi===0) for (var k=0;k<media.length;k++) out.push(media[k]);
mi++;
} else {
out.push(lines[i]);
}
}
return out.join("\n");
}
Класс CustomLoader должен быть объявлен до инициализации плеера. Добавьте его название в код подключение плеера параметром hlsconfig
let player = new Playerjs({id: "player", file:m3u8, hlsconfig:{loader: CustomLoader}}
Демонстрация