/* * @File : mxanime.js * @Author : jade * @Date : 2024/3/30 14:13 * @Email : jadehh@1ive.com * @Software : Samples * @Desc : MX动漫 */ import {Spider} from "./spider.js"; import {VodDetail, VodShort} from "../lib/vod.js"; import {_, load} from "../lib/cat.js"; import * as Utils from "../lib/utils.js"; class MxAnimeSpider extends Spider { constructor() { super(); this.siteUrl = "https://www.mxdm6.com/" } getName() { return "🍒┃MX动漫┃🍒" } getAppName() { return "MX动漫" } getJSName() { return "mxanime" } getType() { return 3 } async setClasses() { let $ = await this.getHtml() let navElements = $($("[class=\"nav-menu-items\"]")[0]).find("[class=\"nav-menu-item \"]") for (const navElement of navElements) { let element = $(navElement).find("a")[0] let type_name = element.attribs.title let type_id = element.attribs.href if (type_name !== "萌图") { this.classes.push(this.getTypeDic(type_name, Utils.getStrByRegex(/type\/(.*?).html/, type_id))) } } } async getFilter($) { let elements = $("[class=\"library-box scroll-box\"]") let extend_list = [] for (let i = 0; i < elements.length; i++) { let extend_dic = {"key": (i + 1).toString(), "name": "", "value": []} if (i < elements.length - 1) { extend_dic["name"] = $($(elements[i]).find("a")[0]).text() extend_dic["value"].push({"n": "全部", "v": "0"}) for (const ele of $(elements[i]).find("a").slice(1)) { extend_dic["value"].push({"n": $(ele).text(), "v": $(ele).text()}) } extend_list.push(extend_dic) } else { extend_dic["name"] = $($(elements[i]).find("a")[0]).text() extend_dic["value"] = [{"n": "全部", "v": "0"}, { "n": $($(elements[i]).find("a")[1]).text(), "v": "hits" }, {"n": $($(elements[i]).find("a")[2]).text(), "v": "score"}] extend_list.push(extend_dic) } } return extend_list } async setFilterObj() { for (const type_dic of this.classes) { let type_id = type_dic["type_id"] if (type_id !== "最近更新") { let $ = await this.getHtml(this.siteUrl + `/type/${type_id}.html`) this.filterObj[type_id] = await this.getFilter($) } } } parseVodShortFromElement($, vodElement) { let vodShort = new VodShort() let element = $($(vodElement).find("[class=\"module-item-titlebox\"]")).find("a")[0] vodShort.vod_id = element.attribs.href vodShort.vod_name = element.attribs.title vodShort.vod_pic = $($(vodElement).find("[class=\"module-item-pic\"]")).find("img")[0].attribs["data-src"] vodShort.vod_remarks = $($(vodElement).find("[class=\"module-item-text\"]")).text() return vodShort } async parseVodShortListFromDoc($) { let vod_list = [] let vodElements = $("[class=\"module-list module-lines-list mxone-box\"]").find("[class=\"module-item\"]") for (const vodElement of vodElements) { let vodShort = await this.parseVodShortFromElement($, vodElement) vod_list.push(vodShort) } return vod_list } async parseVodShortListFromDocByCategory($) { let vod_list = [] let vodElements = $("[class=\"module-item\"]") for (const vodElement of vodElements) { let vodShort = await this.parseVodShortFromElement($, vodElement) vod_list.push(vodShort) } return vod_list } async parseVodShortListFromDocBySearch($) { let vod_list = [] let vodElements = $("[class=\"module-search-item\"]") for (const vodElement of vodElements) { let vodShort = new VodShort() let element = $(vodElement).find("[class=\"video-serial\"]")[0] vodShort.vod_id = element.attribs.href vodShort.vod_name = element.attribs.title vodShort.vod_pic = $($(vodElement).find("[class=\"module-item-pic\"]")).find("img")[0].attribs["data-src"] let remarkElements = $($(vodElement).find("[class=\"video-info-item video-info-actor\"]").slice(-1)[0]).find("a") let remark_list = [] for (const remarkElement of remarkElements){ let remark = remarkElement.children[0].data remark_list.push(remark) } vodShort.vod_remarks = remark_list.join("*") vod_list.push(vodShort) } return vod_list } async parseVodDetailFromDoc($) { let vodDetail = new VodDetail() let vodElement = $("[class=\"video-info\"]") vodDetail.vod_pic = $("[class=\"module-item-pic\"]").find("img")[0].attribs["data-src"] vodDetail.vod_name = $($(vodElement).find("[class=\"page-title\"]")).text() let classElements = $(vodElement).find("[class=\"video-info-items\"]") for (const classElement of classElements){ let text = $(classElement).text().replaceAll("\n","").replaceAll("\t","").replaceAll(" ","") + "end" if (text.indexOf("年份") > -1){ vodDetail.vod_year = Utils.getStrByRegex(/年份:(.*?)end/,text).replaceAll("/","") } if(text.indexOf("备注") > -1){ let x = Utils.getStrByRegex(/备注:(.*?)end/,text) vodDetail.vod_remarks = Utils.getStrByRegex(/备注:\/(.*?)end/,text) } if (text.indexOf("标签") > -1){ vodDetail.type_name = Utils.getStrByRegex(/标签:(.*?)end/,text) } if (text.indexOf("剧情") > -1){ vodDetail.vod_content = Utils.getStrByRegex(/剧情:(.*?)end/,text) } } let playFormatElemets = $("[class=\"module-tab-item tab-item\"]") let playUrlElements = $("[class=\"scroll-content\"]") let vod_play_from_list = [] let vod_play_list = [] for (let i = 0; i < playFormatElemets.length; i++) { let playFormatElement = playFormatElemets[i] vod_play_from_list.push(playFormatElement.attribs["data-dropdown-value"]) let vodItems = [] for (const playUrlElement of $(playUrlElements[i]).find("a")) { let episodeName = $(playUrlElement).text() let episodeUrl = playUrlElement.attribs.href vodItems.push(episodeName + "$" + episodeUrl) } vod_play_list.push(vodItems.join("#")) } vodDetail.vod_play_from = vod_play_from_list.join("$$$") vodDetail.vod_play_url = vod_play_list.join("$$$") return vodDetail } async setHomeVod() { let $ = await this.getHtml() this.homeVodList = await this.parseVodShortListFromDoc($) } getExtendValue(extent, key) { if (extent[key] === undefined) { return "" } else { if (extent[key] === "0") { return "" } else { return extent[key] } } } async setCategory(tid, pg, filter, extend) { await this.jadeLog.debug(`extend:${JSON.stringify(extend)}`) let type = this.getExtendValue(extend, "1") let time = this.getExtendValue(extend, "2") let word = this.getExtendValue(extend, "3") let sort = this.getExtendValue(extend, "4") let urlParams = [tid.toString(), "", sort, type, "", word, "", "", pg.toString(), "", "", time] let url = this.siteUrl + "/show/" + urlParams.join("-") + ".html" let $ = await this.getHtml(url) this.vodList = await this.parseVodShortListFromDocByCategory($) } async setDetail(id) { let $ = await this.getHtml(this.siteUrl + id) this.vodDetail = await this.parseVodDetailFromDoc($) } async setSearch(wd, quick) { let url = this.siteUrl + `/search/${wd}-------------.html` let $ = await this.getHtml(url) this.vodList = await this.parseVodShortListFromDocBySearch($) } async setPlay(flag, id, flags) { let $ = await this.getHtml(this.siteUrl + id) let playerConfig = JSON.parse(Utils.getStrByRegex(/var player_aaaa=(.*?)<\/script>/,$.html())) const m3mu8_url = "https://danmu.yhdmjx.com/m3u8.php?url=" + playerConfig["url"] const m3u8_res = await (await this.fetch(m3mu8_url,null,this.getHeader())); const m3u8_result = m3u8_res.match(/"url": getVideoInfo\("(.*?)"\),/)[1]; const bt_token = m3u8_res.match(/