class Home { static start() { this.itemQuery = { ImageTypes: "Backdrop", EnableImageTypes: "Logo,Backdrop", IncludeItemTypes: "Movie,Series", SortBy: "ProductionYear, PremiereDate, SortName", Recursive: true, ImageTypeLimit: 1, Limit: 10, Fields: "ProductionYear", SortOrder: "Descending", EnableUserData: false, EnableTotalRecordCount: false }; this.coverOptions = { type: "Backdrop", maxWidth: 3000 }; this.logoOptions = { type: "Logo", maxWidth: 3000 }; if (window.location.href.indexOf("home") != -1) { const load = `

MISTY MEDIA

`; $("body").append(load); } CommonUtils.selectWait(".section0 .card", async () => { await this.initBanner(); this.initEvent(); }); } static injectCode(code) { let hash = md5(code); return new Promise((resolve, reject) => { const channel = new BroadcastChannel(hash); channel.addEventListener("message", (event) => resolve(event.data)); const script = ` `; $(document.head || document.documentElement).append(script); }); } static injectCall(func, arg) { const script = ` // const client = (await window.require(["ApiClient"]))[0]; const client = await new Promise((resolve, reject) => { setInterval(() => { if (window.ApiClient != undefined) resolve(window.ApiClient); }, 16); }); return await client.${func}(${arg}) `; return this.injectCode(script); } static getItems(query) { return this.injectCall("getItems", "client.getCurrentUserId(), " + JSON.stringify(query)); } static getItem(itemId) { return this.injectCall("getItem", `client.getCurrentUserId(), "${itemId}"`); } static getImageUrl(itemId, options) { return this.injectCall("getImageUrl", itemId + ", " + JSON.stringify(options)); } /* 插入Banner */ static async initBanner() { const banner = `
`; $(".homeSectionsContainer").prepend(banner); $(".section0").detach().appendTo(".misty-banner-library"); // 插入数据 const data = await this.getItems(this.itemQuery); console.log(data); data.Items.forEach(async (item) => { const detail = await this.getItem(item.Id), itemHtml = `
Backdrop

${detail.Name}

${detail.Overview}

`, logoHtml = ` `; if (detail.ImageTags && detail.ImageTags.Logo) { $(".misty-banner-logos").append(logoHtml); } $(".misty-banner-body").append(itemHtml); console.log(item.Id, detail); }); let complete = 0; let loading = setInterval(async () => { // 判断图片加载完毕 $(".misty-banner-cover:not(.complete)").each((i, dom) => { if (dom.complete) { dom.classList.add("complete"); complete++; } }); if (complete == $(".misty-banner-item").length && $(".misty-banner-item").length != 0) { clearInterval(loading); $(".misty-loading").fadeOut(500); await CommonUtils.sleep(150); // 置入场动画 let delay = 80; // 动媒体库画间隔 let id = $(".misty-banner-item").eq(0).addClass("active").attr("id"); // 初次信息动画 $(`.misty-banner-logo[id=${id}]`).addClass("active"); await CommonUtils.sleep(200); // 间隔动画 $(".section0 > div").addClass("misty-banner-library-overflow"); // 关闭overflow 防止媒体库动画溢出 $(".misty-banner .card").each((i, dom) => setTimeout(() => $(dom).addClass("misty-banner-library-show"), i * delay)); // 媒体库动画 await CommonUtils.sleep(delay * 8 + 1000); // 等待媒体库动画完毕 $(".section0 > div").removeClass("misty-banner-library-overflow"); // 开启overflow 防止无法滚动 // 滚屏逻辑 var index = 0; setInterval(async () => { // 背景切换 index += index + 1 == $(".misty-banner-item").length ? -index : 1; $(".misty-banner-body").css("left", -(index * 100).toString() + "%"); // 信息切换 $(".misty-banner-item.active").removeClass("active"); let id = $(".misty-banner-item").eq(index).addClass("active").attr("id"); // LOGO切换 $(".misty-banner-logo.active").removeClass("active"); $(`.misty-banner-logo[id=${id}]`).addClass("active"); }, 8000); } }, 16); } /* 初始事件 */ static initEvent() { // 通过注入方式, 方可调用appRouter函数, 以解决Content-Script window对象不同步问题 const script = ` // 挂载appRouter if (!window.appRouter) window.appRouter = (await window.require(["appRouter"]))[0]; // 获取带有 is 属性为 emby-itemscontainer 的元素 const element = document.querySelector('.section0 div[is="emby-itemscontainer"]'); // 创建新元素,并将旧元素的所有子节点添加到其中 const newElement = document.createElement("div"); while (element.firstChild) { newElement.appendChild(element.firstChild); } // 移除 is 属性以隔离原事件 newElement.removeAttribute("is"); // 复制原始元素的 class 属性到新元素中 Array.from(element.classList).forEach(cls => { newElement.classList.add(cls); }); // 将新元素插入到原始元素的位置上 element.parentNode.insertBefore(newElement, element); // 重新挂载媒体库事件 const librarys = document.querySelectorAll(".view:not(.hide) .section0 .card"); librarys.forEach(library => { library.addEventListener("click", () => { const dataId = library.getAttribute("data-id"); appRouter.showItem(dataId) }); }); `; this.injectCode(script); } } // 运行 Home.start();