import "./meta"; import FileSaver from "file-saver"; import { waitForSheetLoaded } from "./utils"; import { downloadPDF } from "./pdf"; import { getFileUrl } from "./file"; import { BtnList, BtnAction, BtnListMode } from "./btn"; import { ScoreInfoInPage, SheetInfoInPage } from "./scoreinfo"; import i18nextInit, { i18next } from "./i18n/index"; import { isGmAvailable, _GM } from "./gm"; (async () => { await i18nextInit; })(); if (isGmAvailable("registerMenuCommand")) { // add buttons to the userscript manager menu _GM.registerMenuCommand( "** " + i18next.t("version", { version: _GM.info.script.version }) + " **", () => _GM.openInTab( "https://github.com/LibreScore/dl-librescore/releases", { active: true, } ) ); _GM.registerMenuCommand("** " + i18next.t("source_code") + " **", () => _GM.openInTab(_GM.info.script.homepage, { active: true }) ); _GM.registerMenuCommand("** Discord **", () => _GM.openInTab("https://discord.gg/DKu7cUZ4XQ", { active: true }) ); } const { saveAs } = FileSaver; const main = (): void => { let isOfficial = window.UGAPP.store.page.data.score.is_official ?? !!( document.querySelector( "meta[property='musescore:author'][content='Official Scores']" ) || document.querySelector( "meta[property='musescore:author'][content='Official Author']" ) || document.querySelector( "meta[property='musescore:author'][content='Hal Leonard']" ) || document.querySelector( "meta[property='musescore:author'][content='Faber']" ) || document.querySelector( "meta[property='musescore:author'][content='Made By Muse']" ) || document.querySelector( "meta[property='musescore:author'][content='ArrangeMe']" ) ); let isMobile = (window.UGAPP.config.is_mobile || window.UGAPP.config.is_tablet) ?? (!document.querySelector('button[title="Toggle Fullscreen"]') ? !Array.from([ ...document.querySelector("#jmuse-layout")!.querySelectorAll("div"), ]).some((div) => div.querySelectorAll("button").length === 3) : false); let isPDFOnly = false; if (isOfficial) { isPDFOnly = window.UGAPP.store.page.data.score.is_pdf ?? !document.querySelector("#playerControls"); } new Promise(() => { let noSub = (!window.UGAPP.store.user.isPro || !window.UGAPP.store.user.isProPlus) ?? Array.from([ ...document.querySelectorAll(isMobile ? "#official-score-banner" : "#jmuse-scroller-component" + " div"), ]).some((el: HTMLDivElement) => el.innerText.startsWith("End of preview") ); const scoreinfo = new ScoreInfoInPage(document); const btnList = new BtnList(); let indvPartBtn: HTMLButtonElement | null = null; const fallback = () => { // btns fallback to load from MSCZ file (`Individual Parts`) return indvPartBtn?.click(); }; if (noSub && isOfficial) { btnList.add({ name: i18next.t("download", { fileType: "PDF" }) + "\n(" + i18next.t("official_button") + ")", action: BtnAction.openUrl("https://musescore.com/upgrade"), tooltip: i18next.t("official_tooltip"), }); } else { btnList.add({ name: i18next.t("download", { fileType: "PDF", }), action: BtnAction.process( async (_, setText): Promise => { return downloadPDF( scoreinfo, new SheetInfoInPage(document), saveAs, setText ); }, fallback, 3 * 60 * 1000 /* 3min */ ), }); } if (!isPDFOnly) { btnList.add({ name: i18next.t("download", { fileType: "MIDI" }), action: BtnAction.download( () => getFileUrl(scoreinfo.id, "midi"), scoreinfo.fileName, fallback, 30 * 1000 /* 30s */ ), }); btnList.add({ name: i18next.t("download", { fileType: "MP3" }), action: BtnAction.download( () => getFileUrl(scoreinfo.id, "mp3"), scoreinfo.fileName, fallback, 30 * 1000 /* 30s */ ), }); } // eslint-disable-next-line @typescript-eslint/no-floating-promises btnList.commit(BtnListMode.InPage); }); }; // eslint-disable-next-line @typescript-eslint/no-floating-promises waitForSheetLoaded().then(main);