This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
(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 };
|
||||
})();
|
||||
Reference in New Issue
Block a user