layout.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import { dbg, info, triesInterval, triesLimit } from "../constants";
  2. import { getFeatures } from "../config";
  3. import { addGlobalStyle, insertAfter, siteEvents } from "../utils";
  4. import type { FeatureConfig } from "../types";
  5. import { openMenu } from "./menu/menu_old";
  6. let features: FeatureConfig;
  7. export async function preInitLayout() {
  8. features = await getFeatures();
  9. }
  10. //#MARKER watermark
  11. /**
  12. * Adds a watermark beneath the logo
  13. */
  14. export function addWatermark() {
  15. const watermark = document.createElement("span");
  16. watermark.id = "betterytm-watermark";
  17. watermark.className = "style-scope ytmusic-nav-bar";
  18. watermark.innerText = info.name;
  19. watermark.title = "Open menu";
  20. watermark.addEventListener("click", () => openMenu());
  21. const style = `\
  22. #betterytm-watermark {
  23. font-size: 10px;
  24. display: inline-block;
  25. position: absolute;
  26. left: 45px;
  27. top: 46px;
  28. z-index: 10;
  29. color: white;
  30. text-decoration: none;
  31. cursor: pointer;
  32. }
  33. @media(max-width: 615px) {
  34. #betterytm-watermark {
  35. display: none;
  36. }
  37. }
  38. #betterytm-watermark:hover {
  39. text-decoration: underline;
  40. }`;
  41. addGlobalStyle(style, "watermark");
  42. const logoElem = document.querySelector("#left-content") as HTMLElement;
  43. insertAfter(logoElem, watermark);
  44. dbg && console.log("BetterYTM: Added watermark element:", watermark);
  45. }
  46. //#MARKER remove upgrade tab
  47. let removeUpgradeTries = 0;
  48. /** Removes the "Upgrade" / YT Music Premium tab from the title / nav bar */
  49. export function removeUpgradeTab() {
  50. const tabElem = document.querySelector(".ytmusic-nav-bar ytmusic-pivot-bar-item-renderer[tab-id=\"SPunlimited\"]");
  51. if(tabElem) {
  52. tabElem.remove();
  53. dbg && console.log(`BetterYTM: Removed upgrade tab after ${removeUpgradeTries} tries`);
  54. }
  55. else if(removeUpgradeTries < triesLimit) {
  56. setTimeout(removeUpgradeTab, triesInterval); // TODO: improve this
  57. removeUpgradeTries++;
  58. }
  59. else
  60. console.error(`BetterYTM: Couldn't find upgrade tab to remove after ${removeUpgradeTries} tries`);
  61. }
  62. //#MARKER volume slider
  63. /** Sets the volume slider to a set size */
  64. export function setVolSliderSize() {
  65. const { volumeSliderSize: size } = features;
  66. if(typeof size !== "number" || isNaN(Number(size)))
  67. return;
  68. const style = `\
  69. .volume-slider.ytmusic-player-bar, .expand-volume-slider.ytmusic-player-bar {
  70. width: ${size}px !important;
  71. }`;
  72. addGlobalStyle(style, "vol_slider_size");
  73. }
  74. /** Sets the `step` attribute of the volume slider */
  75. export function setVolSliderStep() {
  76. const sliderElem = document.querySelector("tp-yt-paper-slider#volume-slider") as HTMLInputElement;
  77. sliderElem.setAttribute("step", String(features.volumeSliderStep));
  78. }
  79. //#MARKER queue buttons
  80. export function initQueueButtons() {
  81. siteEvents.on("queueChanged", (evt) => {
  82. for(const queueItm of ((evt.data as HTMLElement).childNodes as NodeListOf<HTMLElement>)) {
  83. if(!queueItm.dataset["bytm-has-queue-btns"])
  84. addQueueButtons(queueItm);
  85. }
  86. });
  87. const queueBtnsStyle = `\
  88. .side-panel.modular ytmusic-player-queue-item .song-info.ytmusic-player-queue-item {
  89. position: relative;
  90. }
  91. .side-panel.modular ytmusic-player-queue-item .song-info .bytm-queue-btn-container {
  92. display: none;
  93. position: absolute;
  94. right: 0;
  95. }
  96. .side-panel.modular ytmusic-player-queue-item:hover .song-info .bytm-queue-btn-container {
  97. display: inline-block;
  98. }`;
  99. addGlobalStyle(queueBtnsStyle, "queue-btns");
  100. const queueItems = document.querySelectorAll("#contents.ytmusic-player-queue > ytmusic-player-queue-item");
  101. if(queueItems.length === 0)
  102. return;
  103. queueItems.forEach(itm => addQueueButtons(itm as HTMLElement));
  104. }
  105. function addQueueButtons(queueItem: HTMLElement) {
  106. console.log("Add queue btns:", queueItem);
  107. const queueBtnsCont = document.createElement("div");
  108. queueBtnsCont.className = "bytm-queue-btn-container";
  109. queueBtnsCont.innerText = "ayo";
  110. const songInfo = queueItem.querySelector(".song-info")!;
  111. songInfo.appendChild(queueBtnsCont);
  112. }