asianx.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /*
  2. * @Author: samples jadehh@live.com
  3. * @Date: 2023-12-14 11:03:04
  4. * @LastEditors: samples jadehh@live.com
  5. * @LastEditTime: 2023-12-14 11:03:04
  6. * @FilePath: js/asianx.js
  7. * @Description: asianx
  8. */
  9. import {Spider} from "./spider.js";
  10. import {Crypto, _, load} from "../lib/cat.js";
  11. import {VodDetail, VodShort} from "../lib/vod.js";
  12. import * as Utils from "../lib/utils.js";
  13. class AsianXSpider extends Spider {
  14. constructor() {
  15. super();
  16. this.siteUrl = "https://cn.asianx.tube/"
  17. }
  18. getName() {
  19. return "🔞┃海外宅┃🔞"
  20. }
  21. getAppName() {
  22. return "海外宅"
  23. }
  24. getJSName() {
  25. return "asianx"
  26. }
  27. getType() {
  28. return 3
  29. }
  30. async getFilter($) {
  31. let navElements = $($("[class=\"menu m-0 mb-2 mb-lg-0\"]")).find("a").slice(6)
  32. let extend_dic = {"key": "1", "name": "分类", "value": [{"n": "全部", "v": "全部"}]}
  33. for (const navElement of navElements) {
  34. let type_name = $($(navElement).find("span")).text()
  35. let type_id = navElement.attribs["href"]
  36. extend_dic["value"].push({"n": type_name, "v": type_id})
  37. }
  38. return [extend_dic]
  39. }
  40. async parseVodShortListFromDoc($,is_home=false) {
  41. let vod_list = []
  42. let vodShortElements;
  43. if (is_home){
  44. vodShortElements = $($("[class=\"gal-box\"]")).slice(12)
  45. }else{
  46. vodShortElements = $($("[class=\"gal-box\"]"))
  47. }
  48. for (const vodShortElement of vodShortElements) {
  49. let vodShort = new VodShort()
  50. let vodElements = $(vodShortElement).find("a")
  51. vodShort.vod_id = vodElements[0].attribs["href"]
  52. vodShort.vod_pic = $(vodElements[0]).find("img")[0].attribs["data-src"]
  53. vodShort.vod_name = vodElements[1].attribs["title"]
  54. vodShort.vod_remarks = $($(vodShortElement).find("[class=\"meta text-muted text-truncate\"]")).text()
  55. vod_list.push(vodShort)
  56. }
  57. return vod_list
  58. }
  59. async parseVodDetailFromDoc(html) {
  60. let vodDetail = new VodDetail();
  61. let content = Utils.getStrByRegex(/<script type="application\/ld\+json">(.*?)<\/script>/,html)
  62. let content_json = JSON.parse(content)
  63. let textList = content_json["name"].split(" ")
  64. vodDetail.vod_name = textList[0]
  65. vodDetail.vod_play_from = ["未加密线路","加密线路"].join("$$$")
  66. let playUrl1 = content_json["contentUrl"]
  67. let playUrl2 = content_json["embedUrl"]
  68. vodDetail.vod_play_url = [`${textList[0]}$${playUrl1}`,`${textList[0]}$${playUrl2}`].join("$$$")
  69. vodDetail.vod_remarks = content_json["uploadDate"]
  70. vodDetail.vod_content = content_json["description"]
  71. return vodDetail
  72. }
  73. async setClasses() {
  74. this.classes = []
  75. this.classes.push({"type_name": "首页", "type_id": "/"})
  76. let html = await this.fetch(this.siteUrl, null, this.getHeader())
  77. if (!_.isEmpty(html)) {
  78. let $ = load(html)
  79. let navElements = $($("[class=\"menu m-0 mb-2 mb-lg-0\"]")).find("a").slice(0, 5)
  80. for (const navElement of navElements) {
  81. let type_name = $($(navElement).find("span")).text()
  82. let type_id = navElement.attribs["href"]
  83. this.classes.push({"type_name": type_name, "type_id": type_id})
  84. }
  85. this.filterObj[this.classes[0].type_id] = await this.getFilter($)
  86. }
  87. }
  88. async setHomeVod() {
  89. let html = await this.fetch(this.siteUrl, null, this.getHeader())
  90. if (!_.isEmpty(html)) {
  91. let $ = load(html)
  92. this.homeVodList = await this.parseVodShortListFromDoc($,true)
  93. }
  94. }
  95. getExtend(pg,extend){
  96. if (extend["1"] !== undefined){
  97. if (extend["1"] === "全部"){
  98. return this.siteUrl
  99. }else{
  100. return this.siteUrl + extend["1"] + "/" + pg
  101. }
  102. }else{
  103. return this.siteUrl
  104. }
  105. }
  106. async setDetail(id) {
  107. let html = await this.fetch(id,null,this.getHeader())
  108. if (!_.isEmpty(html)){
  109. this.vodDetail = await this.parseVodDetailFromDoc(html)
  110. }
  111. }
  112. async setCategory(tid, pg, filter, extend) {
  113. let url;
  114. if (tid === "/") {
  115. url = this.getExtend(pg,extend)
  116. } else {
  117. url = this.siteUrl + tid + "/" + pg
  118. }
  119. let html = await this.fetch(url, null, this.getHeader())
  120. if (!_.isEmpty(html)) {
  121. let $ = load(html)
  122. this.vodList = await this.parseVodShortListFromDoc($,false)
  123. }
  124. }
  125. }
  126. let spider = new AsianXSpider()
  127. async function init(cfg) {
  128. await spider.init(cfg)
  129. }
  130. async function home(filter) {
  131. return await spider.home(filter)
  132. }
  133. async function homeVod() {
  134. return await spider.homeVod()
  135. }
  136. async function category(tid, pg, filter, extend) {
  137. return await spider.category(tid, pg, filter, extend)
  138. }
  139. async function detail(id) {
  140. return await spider.detail(id)
  141. }
  142. async function play(flag, id, flags) {
  143. return await spider.play(flag, id, flags)
  144. }
  145. async function search(wd, quick) {
  146. return await spider.search(wd, quick)
  147. }
  148. export function __jsEvalReturn() {
  149. return {
  150. init: init,
  151. home: home,
  152. homeVod: homeVod,
  153. category: category,
  154. detail: detail,
  155. play: play,
  156. search: search,
  157. };
  158. }
  159. export {spider}