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 = `
`;
$("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 = `
`,
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();