dotfiles/.config/mpv/scripts/mpv_chapters.js

174 lines
4.4 KiB
JavaScript
Raw Normal View History

2023-12-25 11:21:57 +01:00
"use strict";
//display chapter on osd and easily switch between chapters by click on title of chapter
mp.register_event("file-loaded", init);
mp.observe_property("chapter", "number", onChapterChange);
mp.observe_property("chapter-list/count", "number", init);
var options = {
font_size: 16,
font_color: "00FFFF",
border_size: 1.0,
border_color: "000000",
font_color_currentChapter: "C27F1B",
};
var playinfo = {
chapters: [], //array
chaptercount: "", // int
assinterface: [], //array(deprecated, use single assdraw instead)
currentChapter: "", //int
loaded:false,
};
var toggle_switch = false;
var assdraw = mp.create_osd_overlay("ass-events");
var autohidedelay = mp.get_property_number("cursor-autohide");
//function
function init() {
playinfo.chapters = getChapters();
playinfo.chaptercount = playinfo.chapters.length;
if(playinfo.chaptercount == 0){
return;
}
while (playinfo.chaptercount * options.font_size > 1000 / 1.5) {
options.font_size = options.font_size - 1;
}
drawChapterList();
mp.msg.info("initiated");
playinfo.loaded = true;
}
function getChapters() {
var chapterCount = mp.get_property("chapter-list/count");
if (chapterCount === 0) {
return ["null"];
} else {
var chaptersArray = [];
for (var index = 0; index < chapterCount; index++) {
var chapterTitle = mp.get_property_native(
"chapter-list/" + index + "/title"
);
if (chapterTitle != undefined) {
chaptersArray.push(chapterTitle);
}
}
return chaptersArray;
}
}
function drawChapterList() {
var resY = 0;
var resX = 0;
var assdrawdata = "";
function setPos(str, _X, _Y) {
str = str + "{\\pos(" + _X + ", " + _Y + ")}";
return str;
}
function setborderSize(str) {
str = str + "{\\bord" + options.border_size + "}";
return str;
}
function setborderColor(str) {
str = str + "{\\3c&H" + options.border_color + "&}";
return str;
}
function setFontColor(str, index) {
var _color;
if (playinfo.currentChapter == index) {
_color = options.font_color_currentChapter;
} else {
_color = options.font_color;
}
str = str + "{\\c&H" + _color + "&}";
return str;
}
function setFont(str) {
str = str + "{\\fs" + options.font_size + "}";
return str;
}
function setEndofmodifiers(str) {
str = str + "{\\p0}";
return str;
}
function setEndofLine(str) {
str = str + "\n";
return str;
}
playinfo.chapters.forEach(function (element, index) {
assdrawdata = setPos(assdrawdata, resX, resY);
assdrawdata = setborderSize(assdrawdata);
assdrawdata = setborderColor(assdrawdata);
assdrawdata = setFontColor(assdrawdata, index);
assdrawdata = setFont(assdrawdata);
assdrawdata = setEndofmodifiers(assdrawdata);
assdrawdata = assdrawdata + element;
assdrawdata = setEndofLine(assdrawdata);
resY += options.font_size;
});
assdraw.data = assdrawdata
}
function toggleOverlay() {
if(!playinfo.loaded){
return;
}
if (!toggle_switch) {
drawChapterList();
assdraw.update();
mp.set_property("cursor-autohide", "no");
toggle_switch = !toggle_switch;
} else {
assdraw.remove();
mp.set_property("cursor-autohide", autohidedelay);
toggle_switch = !toggle_switch;
}
}
function onChapterChange() {
playinfo.currentChapter = mp.get_property_native("chapter");
if (playinfo.currentChapter != undefined) {
drawChapterList();
}
if ((playinfo.currentChapter != undefined) & toggle_switch) {
assdraw.update();
}
}
function pos2chapter(x, y, overallscale) {
var vectical = y / (options.font_size * overallscale);
if(vectical > playinfo.chaptercount){
return null;
}
var intVectical = Math.floor(vectical);
var lengthofTitleClicked = playinfo.chapters[intVectical].length;
var lengthofTitleClicked_px =
(lengthofTitleClicked * options.font_size) / overallscale;
if (x < lengthofTitleClicked_px) {
return intVectical;
} else {
return null;
}
}
function getOverallScale() {
return mp.get_osd_size().height / 720;
}
function onMBTN_LEFT() {
//get mouse position
if(!playinfo.loaded){
return;
}
if (toggle_switch) {
var overallscale = getOverallScale();
var pos = mp.get_mouse_pos();
var chapterClicked = pos2chapter(pos.x, pos.y, overallscale);
if (chapterClicked != null) {
mp.set_property_native("chapter", chapterClicked);
}
}
}
mp.add_key_binding("TAB", "tab", function () {
toggleOverlay();
});
mp.add_key_binding("MBTN_LEFT", "mbtn_left", function () {
onMBTN_LEFT();
});