xb6v.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. /*
  2. * @File : xb6v.js
  3. * @Author : jade
  4. * @Date : 2023/12/26 10:13
  5. * @Email : jadehh@1ive.com
  6. * @Software : Samples
  7. * @Desc :
  8. */
  9. import * as Utils from "../lib/utils.js";
  10. import {_, load} from "../lib/cat.js";
  11. import {VodDetail, VodShort} from "../lib/vod.js";
  12. import {Spider} from "./spider.js";
  13. class Xb6vSpider extends Spider {
  14. constructor() {
  15. super();
  16. this.siteUrl = "https://www.xb6v.com";
  17. }
  18. getName() {
  19. return "🧲┃磁力新6V┃🧲"
  20. }
  21. getAppName() {
  22. return "磁力新6V"
  23. }
  24. getJSName() {
  25. return "xb6v"
  26. }
  27. getType() {
  28. return 3
  29. }
  30. async redirect(response) {
  31. await this.jadeLog.debug(`重定向回复值为:${response.content}`)
  32. let matcher = /<a HREF=(.*?)>/.exec(response.content)
  33. if (matcher.length > 1) {
  34. let new_url = this.siteUrl + "/e/search/" + matcher[1].replaceAll("\\", "").replaceAll("\"", "")
  35. await this.jadeLog.info(`重定向url为:${new_url}`)
  36. return await this.fetch(new_url, null, this.getHeader())
  37. }
  38. }
  39. getActorOrDirector(pattern, str) {
  40. return Utils.getStrByRegex(pattern, str)
  41. .replace(/<br>/g, "")
  42. .replace(/&nbsp;./g, "")
  43. .replace(/&amp;/g, "")
  44. .replace(/middot;/g, "・")
  45. .replace(/     /g, ",")
  46. .replace(/      /g, ",")
  47. .replace(/ /g, "");
  48. }
  49. getDescription(pattern, str) {
  50. return Utils.getStrByRegex(pattern, str)
  51. .replace(/<\/?[^>]+>/g, "")
  52. .replace(/\n/g, "")
  53. .replace(/&amp;/g, "")
  54. .replace(/middot;/g, "・")
  55. .replace(/ldquo;/g, "【")
  56. .replace(/rdquo;/g, "】")
  57. .replace(/ /g, "");
  58. }
  59. async parseVodShortListFromDoc($) {
  60. let items = $("#post_container .post_hover");
  61. let vod_list = []
  62. for (const item of items) {
  63. let element = $(item).find("[class=zoom]")[0];
  64. let vodShort = new VodShort()
  65. vodShort.vod_id = element.attribs["href"];
  66. vodShort.vod_name = element.attribs["title"].replaceAll(/<\\?[^>]+>/g, "");
  67. vodShort.vod_pic = $(element).find("img")[0].attribs["src"];
  68. vodShort.vod_remarks = $(item).find("[rel=\"category tag\"]").text().replaceAll("\n", "").replaceAll(" ", "");
  69. vod_list.push(vodShort)
  70. }
  71. return vod_list;
  72. }
  73. async parseVodDetailFromDoc($) {
  74. let sourceList = $("#post_content");
  75. let play_form_list = []
  76. let play_url_list = []
  77. if (!this.catOpenStatus) {
  78. let i = 0
  79. let circuitName = "磁力线路";
  80. for (const source of sourceList) {
  81. let aList = $(source).find("table a")
  82. let vodItems = []
  83. for (const a of aList) {
  84. let episodeUrl = a.attribs["href"]
  85. let episodeName = a.children[0].data
  86. if (!episodeUrl.toLowerCase().startsWith("magnet")) continue;
  87. vodItems.push(episodeName + "$" + episodeUrl);
  88. }
  89. if (vodItems.length > 0) {
  90. i++;
  91. play_form_list.push(circuitName + i)
  92. play_url_list.push(vodItems.join("#"))
  93. }
  94. }
  95. }
  96. let playSourceList = $($(".mainleft")).find("[class=\"widget box row\"]")
  97. for (const source of playSourceList) {
  98. let play_format = $(source).find("h3").text()
  99. let vodItems = []
  100. if (!_.isEmpty(play_format)) {
  101. let urlSourceList = $(source).find("a")
  102. for (const url_source of urlSourceList) {
  103. vodItems.push(url_source.attribs["title"] + "$" + url_source.attribs["href"])
  104. }
  105. play_form_list.push(play_format)
  106. play_url_list.push(vodItems.join("#"))
  107. }
  108. }
  109. let partHTML = $(".context").html();
  110. let vodDetail = new VodDetail();
  111. vodDetail.vod_name = $(".article_container > h1").text();
  112. vodDetail.vod_pic = $("#post_content img").attr("src");
  113. vodDetail.type_name = Utils.getStrByRegex(/◎类  别 (.*?)<br>/, partHTML);
  114. if (_.isEmpty(vodDetail.type_name)) vodDetail.type_name = $("[rel=\"category tag\"]").text();
  115. vodDetail.vod_year = Utils.getStrByRegex(/◎年  代 (.*?)<br>/, partHTML);
  116. if (_.isEmpty(vodDetail.vod_year)) vodDetail.vod_year = Utils.getStrByRegex(/首播:(.*?)<br>"/, partHTML);
  117. vodDetail.vod_area = Utils.getStrByRegex(/◎产  地 (.*?)<br>/, partHTML);
  118. if (_.isEmpty(vodDetail.vod_year)) vodDetail.vod_area = Utils.getStrByRegex(/地区:(.*?)<br>"/, partHTML);
  119. vodDetail.vod_remarks = Utils.getStrByRegex(/◎上映日期 (.*?)<br>/, partHTML);
  120. vodDetail.vod_actor = this.getActorOrDirector(/◎演  员 (.*?)<\/p>/, partHTML);
  121. if (_.isEmpty(vodDetail.vod_actor)) vodDetail.vod_actor = this.getActorOrDirector(/◎主  演 (.*?)<\/p>/, partHTML);
  122. if (_.isEmpty(vodDetail.vod_actor)) vodDetail.vod_actor = this.getActorOrDirector(/主演:(.*?)<br>/, partHTML);
  123. vodDetail.vod_director = this.getActorOrDirector(/◎导  演 (.*?)<br>/, partHTML);
  124. if (_.isEmpty(vodDetail.vod_director)) vodDetail.vod_director = this.getActorOrDirector(/导演:(.*?)<br>/, partHTML);
  125. vodDetail.vod_content = this.getDescription(/◎简  介(.*?)<hr>/gi, partHTML);
  126. if (_.isEmpty(vodDetail.vod_content)) vodDetail.vod_content = this.getDescription(/简介(.*?)<\/p>/gi, partHTML);
  127. if (_.isEmpty(vodDetail.vod_content)) vodDetail.vod_content = this.getDescription(/◎简  介(.*?)<br>/gi, partHTML);
  128. vodDetail.vod_play_from = play_form_list.join("$$$")
  129. vodDetail.vod_play_url = play_url_list.join("$$$")
  130. return vodDetail
  131. }
  132. async parseVodPlayFromDoc(flag, $) {
  133. let play_url = ""
  134. let html = $.html()
  135. switch (flag) {
  136. case "播放地址(无插件 极速播放)":
  137. case "播放地址三":
  138. play_url = $($(".video")).find("iframe")[0].attribs["src"] + "/index.m3u8"
  139. break
  140. case "播放地址(无需安装插件)":
  141. let matchers2 = /url: '(.*?)',/gs.exec(html)
  142. if (matchers2.length > 1) {
  143. play_url = matchers2[1]
  144. }
  145. break
  146. case "播放地址四":
  147. let matchers4 = /source: "(.*?)",/gs.exec(html)
  148. if (matchers4.length > 1) {
  149. play_url = matchers4[1]
  150. }
  151. break
  152. default:
  153. await this.jadeLog.warning(`暂不支持当前格式,当前格式为:${flag}`)
  154. break
  155. }
  156. return play_url
  157. }
  158. async setClasses() {
  159. let html = await this.fetch(this.siteUrl, null, this.getHeader());
  160. if (!_.isEmpty(html)) {
  161. let $ = load(html);
  162. let elements = $('#menus > li > a');
  163. for (let i = 0; i < elements.length; i++) {
  164. let element = elements[i]
  165. if (i < 2 || i === elements.length - 1) continue;
  166. let typeName = element.children[0].data;
  167. let typeId = element.attribs["href"];
  168. this.classes.push({"type_name": typeName, "type_id": typeId})
  169. if (typeName === "电视剧") {
  170. let values = [{"n": "不限", "v": ""}]
  171. for (const a of $(element.next).find("a")) {
  172. values.push({"n": a.children[0].data, "v": a.attribs["href"].replaceAll(typeId, "")})
  173. }
  174. this.filterObj[typeId] = [{
  175. "key": "cateId", "name": "类型", "value": values
  176. }]
  177. }
  178. }
  179. }
  180. }
  181. async setHomeVod() {
  182. let html = await this.fetch(this.siteUrl, null, this.getHeader());
  183. if (!_.isEmpty(html)) {
  184. let $ = load(html);
  185. this.homeVodList = await this.parseVodShortListFromDoc($)
  186. } else {
  187. await this.jadeLog.info("首页类别解析失败", true)
  188. }
  189. }
  190. async setCategory(tid, pg, filter, extend) {
  191. let cateId = extend["cateId"] ?? "";
  192. let cateUrl = this.siteUrl + tid + cateId;
  193. this.page = parseInt(pg)
  194. this.count = 0
  195. this.limit = 18;
  196. this.total = 0;
  197. if (this.page !== 1) {
  198. cateUrl += "index_" + pg + ".html";
  199. }
  200. let html = await this.fetch(cateUrl, null, this.getHeader());
  201. if (!_.isEmpty(html)) {
  202. let $ = load(html)
  203. let href_elements = $(".pagination > a")
  204. if (href_elements.length > 0) {
  205. let href = href_elements.slice(-1)[0].attribs["href"];
  206. let patternPageCount = /index_(.*?).html/
  207. let matches = patternPageCount.exec(href)
  208. this.count = parseInt(matches[1])
  209. let items = $("#post_container .post_hover");
  210. this.total = this.page === this.count ? (this.page - 1) * this.limit + items.length : this.count * this.limit;
  211. }
  212. this.vodList = await this.parseVodShortListFromDoc($)
  213. }
  214. }
  215. async setSearch(wd, quick) {
  216. let searchUrl = this.siteUrl + "/e/search/index.php";
  217. let params = {
  218. "show": "title", "tempid": "1", "tbname": "article", "mid": "1", "dopost": "search", "keyboard": wd,
  219. }
  220. let html = await this.post(searchUrl, params, this.getHeader())
  221. if (!_.isEmpty(html)) {
  222. let $ = load(html)
  223. this.vodList = await this.parseVodShortListFromDoc($)
  224. }
  225. }
  226. async setDetail(id) {
  227. let detailUrl = this.siteUrl + id;
  228. let html = await this.fetch(detailUrl, null, this.getHeader())
  229. if (!_.isEmpty(html)) {
  230. let $ = load(html);
  231. this.vodDetail = await this.parseVodDetailFromDoc($)
  232. }
  233. }
  234. async setPlay(flag, id, flags) {
  235. if (id.toLowerCase().startsWith("magnet")) {
  236. this.playUrl = id
  237. } else {
  238. let playUrl = this.siteUrl + id
  239. let html = await this.fetch(playUrl, null, this.getHeader())
  240. let $ = load(html)
  241. this.playUrl = await this.parseVodPlayFromDoc(flag, $)
  242. }
  243. }
  244. }
  245. let spider = new Xb6vSpider()
  246. async function init(cfg) {
  247. await spider.init(cfg)
  248. }
  249. async function home(filter) {
  250. return await spider.home(filter)
  251. }
  252. async function homeVod() {
  253. return await spider.homeVod()
  254. }
  255. async function category(tid, pg, filter, extend) {
  256. return await spider.category(tid, pg, filter, extend)
  257. }
  258. async function detail(id) {
  259. return await spider.detail(id)
  260. }
  261. async function play(flag, id, flags) {
  262. return await spider.play(flag, id, flags)
  263. }
  264. async function search(wd, quick) {
  265. return await spider.search(wd, quick)
  266. }
  267. export function __jsEvalReturn() {
  268. return {
  269. init: init, home: home, homeVod: homeVod, category: category, detail: detail, play: play, search: search,
  270. };
  271. }
  272. export {spider}