layout.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { scriptInfo, triesInterval, triesLimit } from "../constants";
  2. import { getFeatures } from "../config";
  3. import { addGlobalStyle, insertAfter, log, siteEvents } from "../utils";
  4. import type { FeatureConfig } from "../types";
  5. import { openMenu } from "./menu/menu_old";
  6. import "./layout.css";
  7. let features: FeatureConfig;
  8. export async function preInitLayout() {
  9. features = await getFeatures();
  10. }
  11. //#MARKER watermark
  12. /** Adds a watermark beneath the logo */
  13. export function addWatermark() {
  14. const watermark = document.createElement("span");
  15. watermark.id = "betterytm-watermark";
  16. watermark.className = "style-scope ytmusic-nav-bar";
  17. watermark.innerText = scriptInfo.name;
  18. watermark.title = "Open menu";
  19. watermark.addEventListener("click", () => openMenu());
  20. const logoElem = document.querySelector("#left-content") as HTMLElement;
  21. insertAfter(logoElem, watermark);
  22. log("Added watermark element:", watermark);
  23. }
  24. //#MARKER remove upgrade tab
  25. let removeUpgradeTries = 0;
  26. /** Removes the "Upgrade" / YT Music Premium tab from the title / nav bar */
  27. export function removeUpgradeTab() {
  28. const tabElem = document.querySelector(".ytmusic-nav-bar ytmusic-pivot-bar-item-renderer[tab-id=\"SPunlimited\"]");
  29. if(tabElem) {
  30. tabElem.remove();
  31. log(`Removed upgrade tab after ${removeUpgradeTries} tries`);
  32. }
  33. else if(removeUpgradeTries < triesLimit) {
  34. setTimeout(removeUpgradeTab, triesInterval); // TODO: improve this
  35. removeUpgradeTries++;
  36. }
  37. else
  38. console.error(`Couldn't find upgrade tab to remove after ${removeUpgradeTries} tries`);
  39. }
  40. //#MARKER volume slider
  41. /** Sets the volume slider to a set size */
  42. export function setVolSliderSize() {
  43. const { volumeSliderSize: size } = features;
  44. if(typeof size !== "number" || isNaN(Number(size)))
  45. return;
  46. const style = `\
  47. .volume-slider.ytmusic-player-bar, .expand-volume-slider.ytmusic-player-bar {
  48. width: ${size}px !important;
  49. }`;
  50. addGlobalStyle(style, "vol-slider");
  51. }
  52. /** Sets the `step` attribute of the volume slider */
  53. export function setVolSliderStep() {
  54. const sliderElem = document.querySelector("tp-yt-paper-slider#volume-slider") as HTMLInputElement;
  55. sliderElem.setAttribute("step", String(features.volumeSliderStep));
  56. }
  57. //#MARKER queue buttons
  58. export function initQueueButtons() {
  59. siteEvents.on("queueChanged", (evt) => {
  60. for(const queueItm of ((evt.data as HTMLElement).childNodes as NodeListOf<HTMLElement>)) {
  61. if(!queueItm.classList.contains("bytm-has-queue-btns"))
  62. addQueueButtons(queueItm);
  63. }
  64. });
  65. const queueItems = document.querySelectorAll("#contents.ytmusic-player-queue > ytmusic-player-queue-item");
  66. if(queueItems.length === 0)
  67. return;
  68. queueItems.forEach(itm => addQueueButtons(itm as HTMLElement));
  69. }
  70. function addQueueButtons(queueItem: HTMLElement) {
  71. const queueBtnsCont = document.createElement("div");
  72. queueBtnsCont.className = "bytm-queue-btn-container";
  73. queueBtnsCont.innerText = "ayo";
  74. const songInfo = queueItem.querySelector(".song-info")!;
  75. songInfo.appendChild(queueBtnsCont);
  76. queueItem.classList.add("bytm-has-queue-btns");
  77. }
  78. //#MARKER better clickable stuff
  79. export function addAnchorImprovements() {
  80. void 0;
  81. }