Files
lan-play/web/js/preferences.js
T
Ultradesu eb0d4fb1c5
Build and Publish / Build and Publish Docker Image (push) Successful in 10m8s
Init
2026-08-05 12:32:52 +01:00

64 lines
2.0 KiB
JavaScript

(function () {
const prefix = 'lan-play:release:v1:';
function folder(path) {
const index = path.lastIndexOf('/');
return index < 0 ? '' : path.slice(0, index);
}
function key(path) {
return `${prefix}${folder(path)}`;
}
function load(path) {
try { return JSON.parse(localStorage.getItem(key(path))) || {}; }
catch (_) { return {}; }
}
function store(path, value) {
try { localStorage.setItem(key(path), JSON.stringify(value)); } catch (_) {}
}
function label(track) {
const labels = track && track.labels || [];
const selected = labels.find((item) => item.text) || labels[0];
return selected && selected.text || track && track.label || '';
}
function descriptor(track, ordinal) {
if (!track) return { off: true };
return {
off: false,
lang: track.lang || track.language || '',
label: label(track),
roles: (track.roles || []).map((role) => role.value || role).filter(Boolean).sort(),
ordinal
};
}
function remember(path, type, track, ordinal) {
const profile = load(path);
profile[type] = descriptor(track, ordinal);
store(path, profile);
}
function find(path, type, tracks) {
const wanted = load(path)[type];
if (!wanted) return undefined;
if (wanted.off) return null;
const described = tracks.map((track, ordinal) => ({ track, ordinal, value: descriptor(track, ordinal) }));
let matches = described.filter((item) => wanted.lang && item.value.lang === wanted.lang);
if (wanted.label) {
const labeled = matches.filter((item) => item.value.label === wanted.label);
if (labeled.length) matches = labeled;
}
if (!matches.length && wanted.label) {
matches = described.filter((item) => item.value.label === wanted.label);
}
if (!matches.length && !wanted.lang && !wanted.label) matches = described;
return (matches.find((item) => item.ordinal === wanted.ordinal) || matches[0] || {}).track;
}
window.LanPlayPreferences = { folder, load, remember, find };
})();