/* * @File : jable.js * @Author : jade * @Date : 2024/3/4 9:44 * @Email : jadehh@1ive.com * @Software : Samples * @Desc : */ import {_, load} from '../lib/cat.js'; import {VodDetail, VodShort} from "../lib/vod.js" import * as Utils from "../lib/utils.js"; import {Spider} from "./spider.js"; class JableTVSpider extends Spider { constructor() { super(); this.siteUrl = "https://jable.tv" this.cookie = "" } async spiderInit(inReq = null) { if (inReq !== null) { this.jsBase = await js2Proxy(inReq, "img", this.getImgHeaders()); } else { this.jsBase = await js2Proxy(true, this.siteType, this.siteKey, 'img/', this.getImgHeaders()); } } getImgHeaders(){ return { "User-Agent": "PostmanRuntime/7.37.3", "Postman-Token": "c2602692-1a05-4bb0-93cd-270afad97e87", "Host": "assets-cdn.jable.tv", "Proxy": true } } async init(cfg) { await super.init(cfg); await this.spiderInit(null) } getAppName() { return "Jable" } getName() { return "🔞┃Jable┃🔞" } getJSName() { return "jable" } getType() { return 3 } getHeader() { // let header = super.getHeader() let header = {} header["User-Agent"] = "PostmanRuntime/7.36.3" header["Host"] = "jable.tv" header["Postman-Token"] = "33290483-3c8d-413f-a160-0d3aea9e6f95" return header } async getHtml(url = this.siteUrl, proxy = false, headers = this.getHeader()) { return super.getHtml(url, true, headers); } async setClasses() { let $ = await this.getHtml(this.siteUrl) let navElements = $("[class=\"title-box\"]") let defaultTypeIdElements = $("div.row") for (const navElement of $(defaultTypeIdElements[0]).find("a")) { let type_name = $(navElement).text() let type_id = navElement.attribs.href if (type_id.indexOf(this.siteUrl) > -1) { this.classes.push(this.getTypeDic(type_name, type_id)) } } navElements = navElements.slice(1, 9) defaultTypeIdElements = defaultTypeIdElements.slice(1, 9) for (let i = 0; i < navElements.length; i++) { let typeId = $(defaultTypeIdElements[i]).find("a")[0].attribs["href"] this.classes.push(this.getTypeDic("标签", typeId)); break } } async getSortFilter($) { let sortElements = $("[class=\"sorting-nav\"]").find("a") let extend_dic = {"name": "排序", "key": "sort", "value": []} for (const sortElement of sortElements) { let typeId = sortElement.attribs["data-parameters"].split("sort_by:")[1] let typeName = $(sortElement).text() extend_dic["value"].push({"n": typeName, "v": typeId}) } return extend_dic } async getFilter($, index, type_id, type_name) { let extend_list = [] if (index < 4) { let extend_dic = {"name": type_name, "key": "type", "value": []} let type_seletc_list = ["div.img-box > a", "[class=\"horizontal-img-box ml-3 mb-3\"] > a", "", "sort"] let type_id_select_list = ["div.absolute-center > h4", "div.detail"] let default$ = await this.getHtml(type_id) for (const element of default$(type_seletc_list[index])) { let typeId = element.attribs["href"] let typeName = $($(element).find(type_id_select_list[index])).text().replaceAll("\t", "").replaceAll("\n", '').replaceAll(" ", ""); extend_dic["value"].push({"n": typeName, "v": typeId}) } if (extend_dic.value.length > 0) { extend_list.push(extend_dic) //排序 let sortDetail$ = await this.getHtml(extend_dic["value"][0]["v"]) let sort_extend_dic = await this.getSortFilter(sortDetail$) if (sort_extend_dic.value.length > 0) { extend_list.push(sort_extend_dic) } } else { //排序 let sort_extend_dic = await this.getSortFilter(default$) if (sort_extend_dic.value.length > 0) { extend_list.push(sort_extend_dic) } } } else { let defaultTypeIdElements = $("div.row").slice(1, 9) let navElements = $("[class=\"title-box\"]").slice(1, 9) for (let i = 0; i < navElements.length; i++) { let extend_dic = {"name": $($(navElements[i]).find("h2")).text(), "key": "type", "value": []} for (const filterElement of $(defaultTypeIdElements[i]).find("a")) { let filter_type_id = filterElement.attribs.href if (filter_type_id.indexOf(this.siteUrl) > -1) { extend_dic["value"].push({"n": $(filterElement).text(), "v": filter_type_id}) } } extend_list.push(extend_dic) } let sortDetail$ = await this.getHtml(type_id) let sort_extend_dic = await this.getSortFilter(sortDetail$) if (sort_extend_dic.value.length > 0) { extend_list.push(sort_extend_dic) } } return extend_list } async setFilterObj() { let $ = await this.getHtml(this.siteUrl) let classes = this.classes.slice(1) for (let i = 0; i < classes.length; i++) { let type_name = classes[i].type_name let type_id = classes[i].type_id // if (type_id.indexOf("models") > 1) { // type_id = `https://jable.tv/models/?mode=async&function=get_block&block_id=list_models_models_list&sort_by=total_videos&_=${new Date().getTime()}` // } let extend_list = await this.getFilter($, i, type_id, type_name) if (extend_list.length > 1 && i < 4) { type_id = extend_list[0]["value"][0]["v"] this.classes[i + 1] = this.getTypeDic(type_name, type_id) } this.filterObj[type_id] = extend_list } } async parseVodShortListFromDoc($) { let vod_list = [] let vodElements = $("div.video-img-box") for (const element of vodElements) { let vodShort = new VodShort() let vod_pic = $(element).find("img").attr("data-src") if (vod_pic !== undefined) { vodShort.vod_pic = vod_pic // if (this.catOpenStatus) { // vodShort.vod_pic = this.jsBase + Utils.base64Encode(vod_pic) // } else { // vodShort.vod_pic = vod_pic // } let url = $(element).find("a").attr("href"); vodShort.vod_id = url.split("/")[4]; vodShort.vod_name = url.split("/")[4]; let remarks_list = $($(element).find("[class=\"sub-title\"]")).text().split("\n") if (remarks_list.length > 1) { vodShort.vod_remarks = remarks_list[1].replaceAll(" ", "").replaceAll("\t", "") } else { vodShort.vod_remarks = "精选" } if (!_.isEmpty(vodShort.vod_pic) && vodShort.vod_remarks !== "[限時優惠]只需1元即可無限下載") { vod_list.push(vodShort); } } } return vod_list } async parseVodDetailFromDoc($) { let vodDetail = new VodDetail(); let leftElement = $("[class=\"header-left\"]") vodDetail.vod_name = $($(leftElement).find("h4")).text(); let vod_pic = Utils.getStrByRegex(/