Greasy Fork

Letterboxd Titles

Force titles to be displayed above movie posters (on some pages only)

// ==UserScript==
// @name         Letterboxd Titles
// @namespace    https://letterboxd.com/
// @version      1.0
// @description  Force titles to be displayed above movie posters (on some pages only)
// @author       n00bCod3r
// @match        https://letterboxd.com/*
// @grant        none
// ==/UserScript==


'use strict';
window.addEventListener('load', () => {
  if (document.querySelector('ul.poster-list')) {
    addTitles();
    document.addEventListener('scroll', () => {
      console.log('scrolled');
      addTitles()
    }, false);
  }
}, false);

function addTitles() {

  const maxTitleLength = 25;
  let movieInfo = "";
  //force elements to be vertically aligned at the end
  document.querySelector('ul.poster-list').style.alignItems = "flex-end";

  document.querySelectorAll('li>div[class*="film-poster-"]')
    .forEach(elem => {
      //prevent the script to break on scrolling
      if (elem.dataset.filmName != undefined) {
        //mark tweaked posters for when user will scroll
        if (!elem.className.includes('tweaked')) {
          elem.className += ' tweaked';

          const movieTitle = elem.dataset.filmName;
          const relaseYear = elem.dataset.filmReleaseYear;
          movieInfo = movieTitle.length > maxTitleLength ? `${movieTitle.substring(0, maxTitleLength - 7)}... (${relaseYear})` : `${movieTitle} (${relaseYear})`

          const divNode = document.createElement("div");
          //set styles
          const css = divNode.style;
          css.width = `${elem.offsetWidth}px`;
          css.textAlign = "center";
          css.overflowWrap = "break-word"; //prevent long words to break layout
          //set content
          divNode.textContent = movieInfo; 
          //insert div above the poster image
          elem.parentNode.insertBefore(divNode, elem);
        }
      }
    })
}
s