Mouse over the runtime to show it in hours and minutes
// ==UserScript==
// @name Letterboxd runtime in hours and minutes
// @version 1.0.2
// @author salad: https://greasyfork.org/en/users/241444-salad
// @match https://letterboxd.com/film/*
// @description Mouse over the runtime to show it in hours and minutes
// @namespace https://greasyfork.org/users/241444
// @license GPL-3.0-only
// ==/UserScript==
(function() {
// clone the node: removes tracking event handlers from the IMDB/TMDB buttons
let timeEl = document.querySelector('p.text-footer');
// remove tracking from buttons
timeEl.querySelectorAll('.track-event').forEach(buttonNode => {
buttonNode.classList.remove('track-event');
delete buttonNode.dataset.trackAction;
});
const cloned = timeEl.cloneNode(true);
timeEl.replaceWith(cloned);
timeEl = cloned;
const timeElHtml = timeEl.innerHTML;
const [minutesText, minutes] = /(\d+).+mins/.exec(timeElHtml);
let hours = Math.floor(minutes / 60);
let remainingMinutes = minutes % 60;
let formatted;
if (hours === 0) {
formatted = `${remainingMinutes} min`;
} else if (remainingMinutes === 0) {
formatted = `${hours} hr`;
} else {
formatted = `${hours} hr ${remainingMinutes} min`;
}
timeEl.addEventListener('mouseover', () => {
timeEl.innerHTML = timeElHtml.replace(minutesText, formatted);
});
timeEl.addEventListener('mouseout', () => {
setTimeout(() => {
timeEl.innerHTML = timeElHtml;
}, 500);
});
})();