4kysxz.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. /*
  2. * @File : 4kysxz.js.js
  3. * @Author : jade
  4. * @Date : 2024/1/24 16:47
  5. * @Email : jadehh@1ive.com
  6. * @Software : Samples
  7. * @Desc : 4k高清网 (已失效)
  8. */
  9. import {_} from '../lib/cat.js';
  10. import {VodDetail, VodShort} from "../lib/vod.js"
  11. import * as Utils from "../lib/utils.js";
  12. import {Spider} from "./spider.js";
  13. class YSXZSpider extends Spider {
  14. constructor() {
  15. super();
  16. this.siteUrl = "https://4kysxz.top"
  17. }
  18. getAppName() {
  19. return `4K高清网`
  20. }
  21. getName() {
  22. return `🚄┃4K高清网┃🚄`
  23. }
  24. getJSName() {
  25. return "4kysxz"
  26. }
  27. getType() {
  28. return 3
  29. }
  30. async init(cfg) {
  31. await super.init(cfg);
  32. }
  33. async parseVodShortListFromDoc($) {
  34. const cards = $('div.row.posts-wrapper >div > article > div.entry-media > div > a')
  35. return _.map(cards, (n) => {
  36. let id = n.attribs['href'];
  37. let name = $($(n).find('img')[0]).attr('alt').replaceAll('<strong>', '').replaceAll('</strong>', '').split(' ')[0];
  38. let pic = $($(n).find('img')[0]).attr('data-src');
  39. return {
  40. vod_id: id, vod_name: name, vod_pic: pic, vod_remarks: '',
  41. };
  42. });
  43. }
  44. async parseVodDetailFromDoc($) {
  45. let vodDetail = new VodDetail();
  46. let vodElement = $("[class=\"entry-content u-text-format u-clearfix\"]")
  47. let text = "";
  48. for (const vodEle of vodElement) {
  49. text = text + $(vodEle).text().replaceAll(":", ":") + "\n"
  50. }
  51. vodDetail.vod_name = $($("[class=\"article-title\"]")).text()
  52. vodDetail.vod_pic = $($("[class=\"entry-content u-text-format u-clearfix\"]")).find("img")[0].attribs["src"]
  53. vodDetail.vod_area = Utils.getStrByRegex(/上映地区(.*?)\n/, text).replaceAll(":", "")
  54. vodDetail.vod_director = Utils.getStrByRegex(/导演(.*?)\n/, text).replaceAll(":", "")
  55. vodDetail.vod_actor = Utils.getStrByRegex(/主演(.*?)\n/, text).replaceAll(":", "")
  56. vodDetail.vod_content = Utils.getStrByRegex(/剧情简介(.*?)\n/, text).replaceAll(":", "").replaceAll("·", "")
  57. let actors = _.map($('div.entry-content.u-text-format.u-clearfix > div:nth-child(10) > div > span > span'), (n) => {
  58. return $(n).text().split(' ')[0];
  59. });
  60. vodDetail.vod_actor = actors.join('/');
  61. let directors = _.map($('div.entry-content.u-text-format.u-clearfix > div:nth-child(6) > div > span'), (n) => {
  62. return $(n).text().split(' ')[0];
  63. });
  64. vodDetail.vod_director = directors.join('/');
  65. vodDetail.vod_name = $('div.site-content > section > div > header > h1').text().trim();
  66. let playUrlStr = '';
  67. let playFromStr = '';
  68. //高清直播
  69. const cards = $('div.entry-content.u-text-format.u-clearfix > custag > ul > li > a');
  70. if (cards.length > 0) {
  71. let playUrls = _.map(cards, (n) => {
  72. let playUrl = n.attribs['href'];
  73. if (playUrl.indexOf('url=') > 0) {
  74. playUrl = playUrl.split('url=')[1].split('&name')[0];
  75. }
  76. return $(n).text() + '$' + playUrl;
  77. });
  78. playUrlStr = playUrls.join('#');
  79. playFromStr = '高清直播';
  80. }
  81. if (!this.catOpenStatus) {
  82. //磁力链接
  83. const tbs = $('loginshow > table');
  84. let playFrom = '';
  85. let nameUrls = [];
  86. for (let i = 0; i < tbs.length; i++) {
  87. if (i % 2 == 0) {
  88. playFrom = $(tbs[i]).find('tbody > tr >td').text().replaceAll('WEB', '磁力');
  89. } else if (i % 2 == 1) {
  90. const tds = $(tbs[i]).find('tbody > tr >td');
  91. let nameUrl = '';
  92. for (let j = 0; j < tds.length; j++) {
  93. if (j % 2 == 0) {
  94. nameUrl = $(tds[j]).text().split('.')[0].split(' ')[0];
  95. } else if (j % 2 == 1) {
  96. nameUrl = nameUrl + '$' + $(tds[j]).text().split('【')[0];
  97. nameUrls.push(nameUrl);
  98. }
  99. }
  100. if (playFromStr.length > 0) {
  101. playFromStr += '$$$';
  102. playUrlStr += '$$$';
  103. }
  104. playFromStr += playFrom;
  105. playUrlStr += nameUrls.join('#');
  106. }
  107. }
  108. }
  109. vodDetail.vod_play_from = playFromStr
  110. vodDetail.vod_play_url = playUrlStr
  111. return vodDetail
  112. }
  113. async setClasses() {
  114. this.classes = []
  115. this.classes.push(this.getTypeDic("首页", "/#"))
  116. }
  117. async getFilter(typeElements) {
  118. let value_list = []
  119. value_list.push({
  120. "n": "全部", "v": "全部",
  121. })
  122. for (const typeElement of typeElements) {
  123. value_list.push({
  124. "n": typeElement.attribs["title"],
  125. "v": typeElement.attribs["href"].split("/").slice(-1)[0].split(".")[0],
  126. })
  127. }
  128. return [{"key": "1", "name": "类型", "value": value_list}]
  129. }
  130. async setFilterObj() {
  131. let $ = await this.getHtml()
  132. let navElements = $("[class=\"navbar-item menu-item-has-children\"]")
  133. let extent_list = []
  134. for (const navElement of navElements) {
  135. let type_name = $($(navElement).find("a")[0]).text()
  136. if (type_name.indexOf("影视") > -1) {
  137. let extend_dic = {"key": "1", "name": type_name, "value": []}
  138. let type_elements = $($(navElement).find("ul")).find("a")
  139. for (const type_element of type_elements) {
  140. extend_dic["value"].push({"n": $(type_element).text(), "v": type_element.attribs["href"]})
  141. }
  142. extent_list.push(extend_dic)
  143. }
  144. }
  145. this.filterObj["/#"] = extent_list
  146. }
  147. async setCategory(tid, pg, filter, extend) {
  148. let url;
  149. if (extend["1"] === undefined) {
  150. url = this.siteUrl + tid
  151. } else {
  152. if (extend["1"].indexOf("category") > -1) {
  153. url = this.siteUrl + extend["1"].split(".")[0] + "_" + pg + ".html"
  154. } else {
  155. url = this.siteUrl + extend["1"]
  156. }
  157. }
  158. let $ = await this.getHtml(url)
  159. this.vodList = await this.parseVodShortListFromDoc($)
  160. }
  161. async setHomeVod() {
  162. let $ = await this.getHtml()
  163. this.homeVodList = await this.parseVodShortListFromDoc($)
  164. }
  165. async setDetail(id) {
  166. const $ = await this.getHtml(id);
  167. this.vodDetail = await this.parseVodDetailFromDoc($)
  168. }
  169. async setSearch(wd, quick) {
  170. let $ = await this.getHtml(this.siteUrl + '/search.php?q=' + wd)
  171. this.vodList = await this.parseVodShortListFromDoc($)
  172. }
  173. }
  174. let spider = new YSXZSpider()
  175. async function init(cfg) {
  176. await spider.init(cfg)
  177. }
  178. async function home(filter) {
  179. return await spider.home(filter)
  180. }
  181. async function homeVod() {
  182. return await spider.homeVod()
  183. }
  184. async function category(tid, pg, filter, extend) {
  185. return await spider.category(tid, pg, filter, extend)
  186. }
  187. async function detail(id) {
  188. return await spider.detail(id)
  189. }
  190. async function play(flag, id, flags) {
  191. return await spider.play(flag, id, flags)
  192. }
  193. async function search(wd, quick) {
  194. return await spider.search(wd, quick)
  195. }
  196. async function proxy(segments, headers) {
  197. return await spider.proxy(segments, headers)
  198. }
  199. export function __jsEvalReturn() {
  200. return {
  201. init: init,
  202. home: home,
  203. homeVod: homeVod,
  204. category: category,
  205. detail: detail,
  206. play: play,
  207. search: search,
  208. proxy: proxy
  209. };
  210. }
  211. export {spider}