NexusPHPSync

Bring torrents from one NexusPHP instance to another

  1. // ==UserScript==
  2. // @name NexusPHPSync
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.2
  5. // @description Bring torrents from one NexusPHP instance to another
  6. // @author joey
  7. // @include http*://lemonhd.org/details_doc.php*
  8. // @include http*://lemonhd.org/details_movie.php*
  9. // @include http*://lemonhd.org/details_tv.php*
  10. // @include http*://lemonhd.org/details_animate.php*
  11. // @include http*://chdbits.co/details.php*
  12. // @include http*://www.haidan.video/details.php*
  13. // @include http*://pt.keepfrds.com/details.php*
  14. // @include http*://www.beitai.pt/details.php*
  15. // @include http*://hdsky.me/details.php*
  16. // @include http*://pt.hd4fans.org/details.php*
  17. // @include http*://pthome.net/details.php*
  18. // @include http*://springsunday.net/details.php*
  19. // @include http*://pterclub.com/details.php*
  20. // @include http*://pt.m-team.cc/details.php*
  21. // @include http*://tjupt.org/details.php*
  22.  
  23. // @include http*://www.hd.ai/Torrents.upload*
  24. // @include http*://chdbits.co/upload.php*
  25. // @include http*://www.haidan.video/upload.php*
  26. // @include http*://pthome.net/upload.php*
  27. // @include http*://pterclub.com/upload.php*
  28. // @include http*://pt.m-team.cc/upload.php*
  29. // @include http*://springsunday.net/upload.new.php*
  30. // @grant none
  31. // ==/UserScript==
  32. const SiteName = {
  33. CHD: "chdbits.co",
  34. TTG: "totheglory.im",
  35. HAIDAN: "www.haidan.video",
  36. FRDS: "pt.keepfrds.com",
  37. BEITAI: "www.beitai.pt",
  38. HDSKY: "hdsky.me",
  39. HD4FUN: "pt.hd4fans.org",
  40. OURBITS: "ourbits.club",
  41. PTHOME: "pthome.net",
  42. SSD: "springsunday.net",
  43. PTERCLUB: "pterclub.com",
  44. MTEAM: "pt.m-team.cc",
  45. TJUPT: "tjupt.org",
  46. LEMONHD: "lemonhd.org",
  47. HDAI: "www.hd.ai"
  48. }
  49.  
  50. const SupportForwardedSite = [
  51. SiteName.CHD, SiteName.FRDS, SiteName.BEITAI, SiteName.HDSKY, SiteName.HD4FUN, SiteName.OURBITS, SiteName.PTHOME, SiteName.SSD, SiteName.PTERCLUB, SiteName.MTEAM, SiteName.TJUPT, SiteName.LEMONHD,
  52. ]
  53. const SupportUploadSite = [
  54. SiteName.CHD, SiteName.HAIDAN, SiteName.PTHOME, SiteName.SSD, SiteName.PTERCLUB, SiteName.MTEAM, SiteName.HDAI,
  55. ]
  56.  
  57. const Type = { Movie: "movie", TVSeries: "series", TVShow: "show", Doc: "doc", Anim: "anim", Other: "other" }
  58. const Source = { Remux: "remux", Encode: "encode", Bluray: "bluray", UHDBluray: "uhdbluray", WebDL: "webdl", HDTV: "hdtv", DVD: "dvd" }
  59. const Codec = { H264: "h.264", H265: "h.265", MPEG2: "mpeg-2", MPEG4: "mpeg-4", VC1: "vc1" }
  60. const AudioCodec = { DTS: "dts", AC3: "ac3", AAC: "aac", LPCM: "lpcm", DTSHDMA: "dts-hdma", TrueHD: "true-hd", Other: "other" }
  61. const Standard = { SD: '540p', FHD: '1080p', UHD: '4k', I1080: '1080', P720: '720p' }
  62.  
  63. function get_upload_page(site_name) {
  64. switch (site_name) {
  65. case SiteName.SSD:
  66. return "upload.new.php"
  67. case SiteName.HDAI:
  68. return "Torrents.upload"
  69. default:
  70. return "upload.php"
  71. }
  72. }
  73.  
  74.  
  75. class Torrent {
  76. constructor(title, sub_title, type, descr, source, codec, audio_codec, standard, team, douban_url, imdb_url, nfo, src_site, preview_img) {
  77. this.title = title;
  78. this.sub_title = sub_title;
  79. this.type = type;
  80. this.descr = descr;
  81. this.source = source;
  82. this.codec = codec;
  83. this.audio_codec = audio_codec;
  84. this.standard = standard;
  85. this.team = team;
  86. this.douban_url = douban_url;
  87. this.imdb_url = imdb_url;
  88. this.nfo = nfo;
  89. this.src_site = src_site;
  90. this.preview_img = preview_img;
  91. }
  92. }
  93.  
  94. class NexusPHPSite {
  95. constructor(site_name) {
  96. this.site_name = site_name;
  97. this.path = decodeURI(location.href);
  98. }
  99. get_site_name() {
  100. return this.site_name;
  101. }
  102.  
  103. is_detail_page() {
  104. return this.path.match(/http(s*):\/\/.*\/details*/i);
  105. }
  106.  
  107. process_detail_page() {
  108. var title = this.parse_title();
  109. var sub_title = this.parse_sub_title();
  110. try {
  111. var descr = this.parse_descr();
  112. } catch (err) {
  113.  
  114. }
  115. var type = this.parse_type();
  116. var source = this.parse_source();
  117. var codec = this.parse_codec();
  118. var audiocodec = this.parse_audio_codec();
  119. var standard = this.parse_standard();
  120. var team = this.parse_team();
  121. var douban_url = this.parse_douban_url();
  122. var imdb_url = this.parse_imdb_url();
  123. var nfo = this.parse_nfo();
  124. var src_site = this.site_name;
  125. var preview_img = this.parse_preview_img();
  126. var torrent = new Torrent(title, sub_title, type, descr, source, codec, audiocodec, standard, team, douban_url, imdb_url, nfo, src_site, preview_img);
  127. return torrent
  128. }
  129.  
  130. parse_preview_img() {
  131. var descr = this.parse_descr();
  132. var imgs = descr.match(/\[img\](\S*)\[\/img\]/gi);
  133. if (imgs.length <= 1) {
  134. return
  135. }
  136. var value = "";
  137. for (var i = 1; i < imgs.length; i++) {
  138. value += imgs[i] + '\n';
  139. }
  140. return value
  141. }
  142. parse_imdb_url() {
  143. var elem = document.getElementById('kimdb')
  144. if (elem) {
  145. return elem.children[0].href;
  146. } else {
  147. var elem = Array.from(document.getElementById('kdescr').children).find((e) => { return e.href && e.href.indexOf("imdb") != -1 })
  148. if (elem) {
  149. return elem.href
  150. }
  151. }
  152. }
  153. parse_team() {
  154. var title = this.parse_title();
  155. var team_suffix = title.split('-')[title.split('-').length - 1].split(' ')[0];
  156. return team_suffix
  157. }
  158. _parse_descr_elem() {
  159. return document.getElementById("kdescr");
  160. }
  161. _parse_title_elem() {
  162. return document.getElementById("top")
  163. }
  164. parse_nfo() {
  165. var elems = document.getElementById('kdescr').getElementsByTagName('fieldset')
  166. var f = null;
  167. for (var i = 0; i < elems.length; i++) {
  168. var e = Array.from(elems[i].childNodes).find((e) => { return e.textContent && e.textContent.toUpperCase().indexOf("VIDEO") != -1 })
  169. if (e) {
  170. f = e.parentElement;
  171. break
  172. }
  173. }
  174. if (f) {
  175. return walkDOM(f).split('[quote]')[1].split('[/quote]')[0]
  176. }
  177. }
  178. parse_title() {
  179. var title = ""
  180. var elems = this._parse_title_elem().childNodes
  181. for (var i = 0; i < elems.length; i++) {
  182. if (elems[i].nodeName != "#text") {
  183. break
  184. }
  185. title += elems[i].textContent
  186. }
  187. return title.trim();
  188. }
  189. process_upload_page(data) {
  190. this.fill_type(data);
  191. this.fill_title(data)
  192. this.fill_sub_title(data);
  193. this.fill_source(data);
  194. this.fill_codec(data);
  195. this.fill_audio_codec(data);
  196. this.fill_standard(data);
  197. this.fill_descr(data);
  198. this.fill_annoymous(data);
  199. this.fill_douban_url(data);
  200. this.fill_imdb_url(data);
  201. this.fill_nfo(data);
  202. this.fill_team(data);
  203. this.fill_preview_img(data);
  204. }
  205. fill_team(torrent) {
  206. }
  207. fill_preview_img(torrent) {
  208. }
  209. fill_nfo(torrent) {
  210. }
  211. fill_title(torrent) {
  212. var data = torrent.title;
  213. var elems = document.getElementsByTagName('input')
  214. var title = Array.from(elems).find((e) => { return e.id == this._get_title_fill_tag() && e.type == 'text' })
  215. title.value = data
  216. }
  217. fill_douban_url(torrent) {
  218.  
  219. }
  220. fill_imdb_url(torrent) {
  221. var data = torrent.imdb_url;
  222. if (!data) {
  223. return
  224. }
  225. var elems = document.getElementsByTagName('input')
  226. var durl = Array.from(elems).find((e) => { return e.name == 'url' && e.type == 'text' })
  227. durl.value = data
  228. }
  229.  
  230. fill_sub_title(torrent) {
  231. var data = torrent.sub_title;
  232. var elems = document.getElementsByTagName('input')
  233. var sub_title = Array.from(elems).find((e) => { return e.name == this._get_sub_title_fill_tag() && e.type == 'text' })
  234. sub_title.value = data
  235. }
  236. fill_type(torrent) {
  237. var data = torrent.type;
  238. var type = document.getElementById(this._get_type_fill_tag())
  239. var sel = Array.from(type.options).find((e) => { return this._get_type_meta()[e.text] == data })
  240. sel.selected = true
  241. }
  242. fill_source(torrent) {
  243. var data = torrent.source;
  244. var elems = document.getElementsByTagName('select')
  245. var source_elem = Array.from(elems).find((e) => { return e.name == this._get_source_fill_tag() })
  246. var sel = Array.from(source_elem.options).find((e) => { return this._get_source_meta()[e.text] == data })
  247. sel.selected = true
  248. }
  249. fill_codec(torrent) {
  250. var data = torrent.codec;
  251. var elems = document.getElementsByTagName('select')
  252. var source_elem = Array.from(elems).find((e) => { return e.name == this._get_codec_fill_tag() })
  253. var sel = Array.from(source_elem.options).find((e) => { return this._get_codec_meta()[e.text] == data })
  254. sel.selected = true
  255. }
  256. fill_audio_codec(torrent) {
  257. var data = torrent.audio_codec
  258. var elems = document.getElementsByTagName('select')
  259. var source_elem = Array.from(elems).find((e) => { return e.name == this._get_audio_codec_fill_tag() })
  260. var sel = Array.from(source_elem.options).find((e) => { return this._get_audio_codec_meta()[e.text] == data })
  261. sel.selected = true
  262. }
  263. fill_standard(torrent) {
  264. var data = torrent.standard
  265. var elems = document.getElementsByTagName('select')
  266. var source_elem = Array.from(elems).find((e) => { return e.name == this._get_standard_fill_tag() })
  267. var sel = Array.from(source_elem.options).find((e) => { return this._get_standard_meta()[e.text] == data })
  268. sel.selected = true
  269.  
  270. }
  271. fill_descr(torrent) {
  272. var data = torrent.descr
  273. data = "[quote]转载自" + torrent.src_site + ",感谢原发布者![/quote]\n" + data;
  274. var descr = document.getElementById(this._get_descr_fill_tag())
  275. descr.value = data;
  276. }
  277. fill_annoymous() {
  278. var elems = document.getElementsByTagName('input')
  279. var annoymous = Array.from(elems).find((e) => { return e.name == this._get_annoymous_fill_tag() })
  280. annoymous.checked = true;
  281. }
  282.  
  283. parse_descr() {
  284. return walkDOM(this._parse_descr_elem().cloneNode(true));
  285. }
  286. _get_detail_tag() {
  287. return "outer";
  288. }
  289. parse_sub_title() {
  290. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  291. var subtitle_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf(this._get_subtitle_tag()) != -1 })
  292. return subtitle_elem.parentNode.lastChild.textContent;
  293. }
  294. parse_type() {
  295. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  296. var basic_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf(this._get_basic_info_tag()) != -1 }).nextSibling
  297. var type_elem = Array.from(basic_elem.children).find((e) => { return e.innerHTML.indexOf(this._get_type_tag()) != -1 })
  298. if (type_elem) {
  299. var type = type_elem.nextSibling.textContent.trim();
  300. return this._get_type_meta()[type]
  301. }
  302. }
  303. parse_douban_url() {
  304. var elem = Array.from(document.getElementById('kdescr').children).find((e) => { return e.href && e.href.indexOf("douban") != -1 })
  305. if (elem) {
  306. return elem.href;
  307. }
  308. }
  309.  
  310. parse_source() {
  311. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  312. var basic_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf(this._get_basic_info_tag()) != -1 }).nextSibling
  313. var source_elem = Array.from(basic_elem.children).find((e) => { return e.innerHTML.indexOf(this._get_source_tag()) != -1 })
  314. if (source_elem) {
  315. var source = source_elem.nextSibling.textContent.trim();
  316. return this._get_source_meta()[source]
  317. }
  318. }
  319. parse_codec() {
  320. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  321. var basic_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf(this._get_basic_info_tag()) != -1 }).nextSibling
  322. var codec_elem = Array.from(basic_elem.children).find((e) => { return e.innerHTML.indexOf(this._get_codec_tag()) != -1 })
  323. if (codec_elem) {
  324. var codec = codec_elem.nextSibling.textContent.trim();
  325. return this._get_codec_meta()[codec]
  326. }
  327. }
  328. parse_audio_codec() {
  329. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  330. var basic_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf(this._get_basic_info_tag()) != -1 }).nextSibling
  331. var audio_codec_elem = Array.from(basic_elem.children).find((e) => { return e.innerHTML.indexOf(this._get_audio_codec_tag()) != -1 })
  332. if (audio_codec_elem) {
  333. var audiocodec = audio_codec_elem.nextSibling.textContent.trim();
  334. return this._get_audio_codec_meta()[audiocodec]
  335. }
  336. }
  337. parse_standard() {
  338. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  339. var basic_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf(this._get_basic_info_tag()) != -1 }).nextSibling
  340. var standard_elem = Array.from(basic_elem.children).find((e) => { return e.innerHTML.indexOf(this._get_standard_tag()) != -1 })
  341. if (standard_elem) {
  342. var standard = standard_elem.nextSibling.textContent.trim();
  343. return this._get_standard_meta()[standard]
  344. }
  345. }
  346.  
  347. _get_insert_pos() {
  348. return document.getElementById('outer').getElementsByTagName('table')[0];
  349. }
  350. insert_detail_page(src_data) {
  351. console.log(src_data);
  352. var data = encodeURIComponent(JSON.stringify(src_data));
  353. var detail_elem = this._get_insert_pos();
  354. var row = detail_elem.insertRow(0);
  355. var c1 = row.insertCell(0);
  356. var c2 = row.insertCell(1);
  357. c1.innerHTML = "转载";
  358. c1.valign = "top";
  359. c1.align = "right";
  360. c2.innerHTML = "";
  361. c2.valign = "top"
  362. c2.align = "left"
  363. for (var name in SupportUploadSite) {
  364. var content = document.createElement("a");
  365. c2.appendChild(content);
  366. content.target = "_blank"
  367. content.innerHTML = findKey(SiteName, SupportUploadSite[name]);
  368. content.href = "https://" + SupportUploadSite[name] + "/" + get_upload_page(SupportUploadSite[name]) + "#" + data;
  369. content.style.cssText = "cursor: pointer; border-collapse: collapse;font-size: 9pt;color: #fff;text-align: center;float: center;margin: 2px;padding: 2px;height: 17px;background: #06c;";
  370. }
  371. return c1, c2;
  372. }
  373.  
  374. _get_type_tag() {
  375. return "类型";
  376. }
  377. _get_subtitle_tag() {
  378. return '副标题';
  379. }
  380. _get_basic_info_tag() {
  381. return "基本信息"
  382. }
  383. _get_source_tag() {
  384. return "媒介"
  385. }
  386. _get_codec_tag() {
  387. return "编码"
  388. }
  389. _get_standard_tag() {
  390. return "分辨率"
  391. }
  392. _get_audio_codec_tag() {
  393. return "音频编码"
  394. }
  395. _get_team_tag() {
  396. return "制作组"
  397. }
  398.  
  399. _get_type_meta() {
  400. return { "纪录片": Type.Doc, "综艺": Type.TVShow, "动漫": Type.Anim, "电视剧": Type.TVSeries, "TV-Pack": Type.TVSeries, "TV-Show": Type.TVShow, "TV-Episode": Type.TVSeries, "Movies": Type.Movie, "TV Series": Type.TVSeries, "电影": Type.Movie, "Animations": Type.Anim, "TV Shows": Type.TVShow, "Documentaries": Type.Doc }
  401. }
  402. _get_source_meta() {
  403. return { "UltraHD(4K)": Source.UHDBluray, "DVD(原盘)": Source.DVD, "Blu-ray(原盘)": Source.Bluray, "UHD Blu-ray/DIY": Source.UHDBluray, "Blu-ray/DIY": Source.Bluray, "WEB-DL": Source.WebDL, "HDTV": Source.HDTV, "Remux": Source.Remux, "HD DVD": Source.DVD, "Encode": Source.Encode, "Blu-ray": Source.Bluray, "UHD Blu-ray": Source.UHDBluray }
  404. }
  405. _get_codec_meta() {
  406. return { "H.264/AVC": Codec.H264, "H.265/HEVC": Codec.H265, "H.265(HEVC)": Codec.H265, "H.264(AVC)": Codec.H264, "HEVC": Codec.H265, "MPEG-4": Codec.MPEG4, "MPEG-2": Codec.MPEG2, "VC-1": Codec.VC1, "H.264": Codec.H264, "H.264/AVC": Codec.H264, "H.265": Codec.H265, "HEVC 10bit": Codec.H265, "HEVC HDR10": Codec.H265 }
  407. }
  408. _get_audio_codec_meta() {
  409. return { "AC-3": AudioCodec.AC3, "DD/AC3": AudioCodec.AC3, "DTS-HD MA": AudioCodec.DTSHDMA, "Atmos": AudioCodec.TrueHD, "DTS": AudioCodec.DTS, "AAC": AudioCodec.AAC, "LPCM": AudioCodec.LPCM, "DTS-HD": AudioCodec.DTSHDMA, "DTS-HDMA": AudioCodec.DTSHDMA, "True-HD": AudioCodec.TrueHD, "Other": AudioCodec.Other }
  410. }
  411. _get_standard_meta() {
  412. return { "SD": Standard.SD, "1080i": Standard.I1080, "720p": Standard.P720, "2K/1080p": Standard.FHD, "1080p": Standard.FHD, "4K/2160p": Standard.UHD, "2160p/4K": Standard.UHD, "4K": Standard.UHD, "2160p(4k)": Standard.UHD, "2160p": Standard.UHD, }
  413. }
  414. _get_title_fill_tag() {
  415. return "name"
  416. }
  417. _get_sub_title_fill_tag() {
  418. return "small_descr"
  419. }
  420. _get_type_fill_tag() {
  421. return "browsecat"
  422. }
  423. _get_source_fill_tag() {
  424. return "medium_sel"
  425. }
  426. _get_codec_fill_tag() {
  427. return "codec_sel"
  428. }
  429. _get_audio_codec_fill_tag() {
  430. return "audiocodec_sel"
  431. }
  432. _get_standard_fill_tag() {
  433. return "standard_sel"
  434. }
  435. _get_descr_fill_tag() {
  436. return "descr"
  437. }
  438. _get_annoymous_fill_tag() {
  439. return "uplver"
  440. }
  441. }
  442.  
  443. class TTGSite extends NexusPHPSite {
  444. is_detail_page() {
  445. return this.path.match(/http(s*):\/\/totheglory.im\/t\/.*/i);
  446. }
  447. _parse_title_elem() {
  448. return document.getElementsByTagName("h1")[0]
  449. }
  450. _parse_descr_elem() {
  451. return document.getElementById("kt_d");
  452. }
  453. _get_type_meta() {
  454. return { "UHD原盘": Type.Movie, "高清日剧": Type.TVSeries }
  455. }
  456. }
  457.  
  458. class HDSKySite extends NexusPHPSite {
  459. _get_type_meta() {
  460. var ret = { "TV Shows/综艺": Type.TVShow, "TV Series/剧集(合集)": Type.TVSeries, "TV Series/剧集(分集)": Type.TVSeries, "Documentaries/纪录片": Type.Doc, "Movies/电影": Type.Movie, "iPad/iPad影视": Type.Movie, "Animations/动漫": Type.Anim }
  461. return { ...super._get_type_meta(), ...ret }
  462. }
  463.  
  464. _get_source_meta() {
  465. var ret = { "UHD Blu-ray/DIY": Source.UHDBluray, "Blu-ray/DIY": Source.Bluray }
  466. return { ...super._get_source_meta(), ...ret }
  467. }
  468. _get_codec_meta() {
  469. var ret = { 'H.264/AVC': Codec.H264, "x265": Codec.H265, "x264": Codec.H264, "HEVC": Codec.H265 }
  470. return { ...super._get_codec_meta(), ...ret }
  471. }
  472. _get_audio_codec_meta() {
  473. var ret = { "DTS-HDMA:X 7.1": AudioCodec.DTSHDMA, "TrueHD Atmos": AudioCodec.TrueHD }
  474. return { ...super._get_audio_codec_meta(), ...ret }
  475. }
  476. }
  477.  
  478. class CHDSite extends NexusPHPSite {
  479. _get_detail_tag() {
  480. return "details";
  481. }
  482. _get_insert_pos() {
  483. return document.getElementsByClassName(this._get_detail_tag())[0];
  484. }
  485. _get_descr_fill_tag() {
  486. return "bbcode"
  487. }
  488. }
  489.  
  490. class PterClubSite extends NexusPHPSite {
  491. _get_type_meta() {
  492. return { "电影 (Movie)": Type.Movie, "电视剧 (TV Play)": Type.TVSeries, "动漫 (Anime)": Type.Anim, "综艺 (TV Show)": Type.TVShow, "纪录片 (Documentary)": Type.Doc }
  493. }
  494. _get_insert_pos() {
  495. return document.getElementById('outer').getElementsByTagName('table')[5];
  496. }
  497. _get_source_tag() {
  498. return "质量"
  499. }
  500. }
  501.  
  502. class LemonHDSite extends NexusPHPSite {
  503. _get_type_meta() {
  504. return { "Movies UHD-4K": Type.Movie, "Movies 2160p": Type.Movie, "Movies 2160p REMUX": Type.Movie, "Movies Blu-ray": Type.Movie, "Movies 1080p": Type.Movie, "Movies 1080p REMUX": Type.Movie, "Movies 3D": Type.Movie, "Movies 720p": Type.Movie, "Movies WEB-DL": Type.Movie, "Movies HDTV": Type.Movie, "Movies iPad": Type.Movie, "Movies DVD": Type.Movie, "TV Series(电视剧)": Type.TVSeries, "TV Shows(综艺)": Type.TVShow, "Documentaries(纪录片)": Type.Doc, "Animations(动画片)": Type.Anim }
  505. }
  506. _get_basic_info_tag() {
  507. return "详细信息"
  508. }
  509. parse_source() {
  510. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  511. var basic_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf(this._get_basic_info_tag()) != -1 }).nextSibling
  512. return this._get_source_meta()[basic_elem.childNodes[0].textContent.split(" ")[1]]
  513. }
  514. parse_type() {
  515. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  516. var basic_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf('基本信息') != -1 }).nextSibling
  517. var type_elem = Array.from(basic_elem.children).find((e) => { return e.innerHTML.indexOf(this._get_type_tag()) != -1 })
  518. if (type_elem) {
  519. var type = type_elem.nextSibling.textContent.trim();
  520. return this._get_type_meta()[type]
  521. }
  522. }
  523. }
  524.  
  525. class HaiDanSite extends NexusPHPSite {
  526. _get_type_meta() {
  527. return { "TV Series(电视剧)": Type.TVSeries, "Documentaries(纪录片)": Type.Doc, "Movies(电影)": Type.Movie, "Animations(动画片)": Type.Anim, "TV Shows(综艺)": Type.TVShow }
  528. }
  529. _get_codec_meta() {
  530. var ret = { "H.264/AVC/X264": Codec.H264, "H.265/HEVC/X265": Codec.H265, "MPEG-4/XviD/DivX": Codec.MPEG4, }
  531. return { ...super._get_codec_meta(), ...ret }
  532. }
  533. process_upload_page(data) {
  534. super.process_upload_page(data);
  535. return data
  536. }
  537. fill_team(torrent) {
  538. var data = torrent.team;
  539. document.getElementById('team_suffix').value = data
  540. }
  541. fill_douban_url(torrent) {
  542. var data = torrent.douban_url
  543. if (!data) {
  544. return
  545. }
  546. var elems = document.getElementsByTagName('input')
  547. var durl = Array.from(elems).find((e) => { return e.name == 'durl' && e.type == 'text' })
  548. durl.value = data
  549. }
  550. fill_nfo(torrent) {
  551. var data = torrent.nfo
  552. if (!data) {
  553. return
  554. }
  555. var elems = document.getElementsByTagName('textarea')
  556. var title = Array.from(elems).find((e) => { return e.name == 'nfo-string' })
  557. title.value = data
  558. }
  559. fill_descr(torrent) {
  560. var descr = document.getElementById(this._get_descr_fill_tag())
  561. descr.value = "转载自" + torrent.src_site + ",感谢原发布者!"
  562. }
  563. fill_preview_img(torrent) {
  564. var data = torrent.preview_img;
  565. var elems = document.getElementsByTagName('textarea')
  566. var preview = Array.from(elems).find((e) => { return e.name == 'preview-pics' })
  567. preview.value = data;
  568. }
  569. }
  570.  
  571.  
  572. class FRDSSite extends NexusPHPSite {
  573. parse_title() {
  574. return super.parse_sub_title();
  575. }
  576. parse_sub_title() {
  577. return super.parse_title();
  578. }
  579. parse_source() {
  580. return Source.Encode
  581. }
  582. parse_audio_codec() {
  583. return AudioCodec.Other
  584. }
  585.  
  586. _get_type_meta() {
  587. var ret = { '电影(合集)': Type.Movie, '纪录片(合集)': Type.Doc, '动漫(合集)': Type.Anim, '剧集(合集)': Type.TVSeries, '综艺(合集)': Type.TVShow }
  588. return { ...ret, ...super._get_type_meta() }
  589. }
  590. parse_douban_url() {
  591. return document.getElementsByClassName('imdbwp__link')[0].href;
  592. }
  593. parse_imdb_url() {
  594. return document.getElementsByClassName('imdbwp__link')[1].href;
  595. }
  596. _get_team_tag() {
  597. return "制作组"
  598. }
  599. parse_team() {
  600. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  601. var basic_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf(this._get_basic_info_tag()) != -1 }).nextSibling
  602. var team_elem = Array.from(basic_elem.children).find((e) => { return e.innerHTML.indexOf(this._get_team_tag()) != -1 })
  603. if (team_elem) {
  604. var team = team_elem.nextSibling.textContent.trim();
  605. return team
  606. }
  607. return "";
  608. }
  609. parse_nfo() {
  610. var nfo = document.getElementById('knfo')
  611. if (nfo) {
  612. return nfo.children[0].innerHTML;
  613. }
  614. }
  615. _get_codec_meta() {
  616. var ret = super._get_codec_meta()
  617. ret["HEVC Dolby Vision"] = Codec.H265
  618. ret["HEVC HDR10+"] = Codec.H265
  619. ret["HEVC HDR10"] = Codec.H265
  620. ret["HEVC 10bit"] = Codec.H265
  621. return ret;
  622. }
  623. }
  624.  
  625. class OurBitsSite extends NexusPHPSite {
  626. _get_insert_pos() {
  627. return document.getElementById('outer').getElementsByTagName('table')[1];
  628. }
  629. }
  630.  
  631. class TJUPTSite extends NexusPHPSite {
  632. parse_imdb_url() {
  633. var elem = Array.from(document.getElementById('kdescr').children).find((e) => { return e.href && e.href.indexOf("imdb") != -1 })
  634. if (elem) {
  635. return elem.href
  636. }
  637. }
  638. parse_title() {
  639. var elems = this._parse_title_elem().textContent.match(/\[(.*?)\]/gi);
  640. return elems[2].split('[')[1].split(']')[0]
  641. }
  642.  
  643. parse_sub_title() {
  644. var elems = this._parse_title_elem().textContent.match(/\[(.*?)\]/gi)
  645. return elems[1].split('[')[1].split(']')[0]
  646. }
  647. }
  648.  
  649. class HDaiSite extends NexusPHPSite {
  650. fill_type(torrent) {
  651. var data = torrent.type;
  652. var type = document.getElementsByTagName('select')[0]
  653. var sel = Array.from(type.options).find((e) => { return this._get_type_meta()[e.text] == data })
  654. sel.selected = true
  655. }
  656. _get_type_meta() {
  657. return { "电影Movies": Type.Movie, "电视剧TV Series": Type.TVSeries, "综艺TV Shows": Type.TVShow, "纪录片Documentaries": Type.Doc, "动漫Animations": Type.Anim}
  658. }
  659. }
  660.  
  661. class MTeamSite extends NexusPHPSite {
  662. _get_type_tag() {
  663. return "類別";
  664. }
  665. _get_subtitle_tag() {
  666. return '副標題';
  667. }
  668. _get_basic_info_tag() {
  669. return "基本資訊"
  670. }
  671. _get_codec_tag() {
  672. return "編碼"
  673. }
  674. _get_standard_tag() {
  675. return "解析度"
  676. }
  677. _get_team_tag() {
  678. return "製作組"
  679. }
  680. _get_type_meta() {
  681. return { "Movie(電影)": Type.Movie, "TV Series(影劇/綜藝)": Type.TVSeries, "紀錄教育": Type.Doc }
  682. }
  683. parse_type() {
  684. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  685. var basic_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf(this._get_basic_info_tag()) != -1 }).nextSibling
  686. var type_elem = Array.from(basic_elem.children).find((e) => { return e.innerHTML.indexOf(this._get_type_tag()) != -1 })
  687. if (type_elem) {
  688. var mix_type = type_elem.nextSibling.textContent.trim().split('/');
  689. return this._get_type_meta()[mix_type.slice(0, mix_type.length - 1).join('/')]
  690. }
  691. }
  692. parse_source() {
  693. var detail_elem = document.getElementsByClassName(this._get_detail_tag())[0].getElementsByTagName('td');
  694. var basic_elem = Array.from(detail_elem).find((e) => { return e.innerHTML.indexOf(this._get_basic_info_tag()) != -1 }).nextSibling
  695. var source_elem = Array.from(basic_elem.children).find((e) => { return e.innerHTML.indexOf(this._get_source_tag()) != -1 })
  696. if (source_elem) {
  697. var mix_source = source_elem.nextSibling.textContent.trim().split('/');
  698. return this._get_source_meta()[mix_source[mix_source.length - 1]]
  699. }
  700. }
  701. fill_type() {
  702.  
  703. }
  704. fill_source() {
  705.  
  706. }
  707. }
  708.  
  709. class SSDSite extends NexusPHPSite {
  710. parse_douban_url() {
  711. return document.getElementsByClassName('doubanlink')[1].href
  712. }
  713.  
  714. parse_imdb_url() {
  715. return document.getElementsByClassName('doubanlink')[0].href
  716. }
  717. parse_nfo() {
  718. var elem = document.getElementsByClassName('mediainfo-raw')[0].children[1]
  719. return walkDOM(elem);
  720. }
  721. _get_type_meta() {
  722. return { "TV Series(电视剧)": Type.TVSeries, "Documentaries(纪录片)": Type.Doc, "Movies(电影)": Type.Movie, "Animations(动画)": Type.Anim, "TV Shows(综艺)": Type.TVShow }
  723. }
  724. _get_source_tag() {
  725. return "格式"
  726. }
  727. parse_preview_img() {
  728. var ret = ""
  729. var elems = document.getElementsByClassName('screenshot');
  730. for (var i = 0; i < elems.length; i++) {
  731. ret += elems[i].children[0].src + '\n'
  732. }
  733. return ret
  734. }
  735. _parse_descr_elem() {
  736. return document.getElementsByClassName("extra-text")[0];
  737. }
  738.  
  739. fill_nfo(torrent) {
  740. document.getElementById('Media_BDInfo').value = torrent.nfo
  741. }
  742. fill_preview_img(torrent) {
  743. document.getElementById('url_vimages').value = torrent.preview_img
  744. }
  745.  
  746. }
  747.  
  748.  
  749. function get_site() {
  750. var site_name = findKey(SiteName, document.domain);
  751. if (!site_name) {
  752. return null
  753. }
  754. switch (SiteName[site_name]) {
  755. case SiteName.TTG:
  756. return new TTGSite(site_name);
  757. case SiteName.HAIDAN:
  758. return new HaiDanSite(site_name);
  759. case SiteName.FRDS:
  760. return new FRDSSite(site_name);
  761. case SiteName.CHD:
  762. return new CHDSite(site_name);
  763. case SiteName.HDSKY:
  764. return new HDSKySite(site_name)
  765. case SiteName.OURBITS:
  766. return new OurBitsSite(site_name);
  767. case SiteName.SSD:
  768. return new SSDSite(site_name);
  769. case SiteName.PTERCLUB:
  770. return new PterClubSite(site_name);
  771. case SiteName.MTEAM:
  772. return new MTeamSite(site_name);
  773. case SiteName.LEMONHD:
  774. return new LemonHDSite(site_name);
  775. case SiteName.TJUPT:
  776. return new TJUPTSite(site_name);
  777. case SiteName.HDAI:
  778. return new HDaiSite(site_name)
  779. default:
  780. return new NexusPHPSite(site_name);
  781. }
  782. }
  783.  
  784. // convert html to bbcode
  785. function walkDOM(n) {
  786. var str_seed_descr = "";
  787. do {
  788. if (n.nodeName == 'FONT') {
  789. if (n.size != '') {
  790. n.innerHTML = '[size=' + n.size + ']' + n.innerHTML + '[/size]'
  791. }
  792. if (n.face != '') {
  793. n.innerHTML = '[font=' + n.face + ']' + n.innerHTML + '[/font]'
  794. }
  795. }
  796. if (n.nodeName == 'SPAN') {
  797. if (n.style.color != '') {
  798. n.innerHTML = '[color=' + n.style.color + ']' + n.innerHTML + '[/color]'
  799. }
  800. }
  801. if (n.nodeName == 'A') {
  802. n.innerHTML = '[URL=' + n.href + ']' + n.innerHTML + '[/URL]'
  803. }
  804. if (n.nodeName == 'FIELDSET') {
  805. n.innerHTML = '[quote]' + n.innerHTML + '[/quote]'
  806. }
  807. if (n.nodeName == 'DIV' && n.innerHTML == '代码') {
  808. n.innerHTML = ''
  809. n.nextSibling.innerHTML = '[code]' + n.nextSibling.innerHTML + '[/code]'
  810. }
  811. if (n.nodeName == 'LEGEND') {
  812. n.innerHTML = ''
  813. }
  814. if (n.nodeName == 'FIELDSET' && n.textContent.match(/(温馨提示|郑重声明|您的保种)/g)) {
  815.  
  816. } else {
  817. if (n.hasChildNodes()) {
  818. str_seed_descr += walkDOM(n.firstChild);
  819. } else {
  820. if (n.nodeType == 1) {
  821. if (n.nodeName == 'IMG') {
  822. str_seed_descr = str_seed_descr + '[IMG]' + n.src + '[/IMG]'
  823. }
  824. } else {
  825. if (n.nodeType == 3) {
  826. str_seed_descr = str_seed_descr + n.textContent
  827. }
  828. }
  829. }
  830. }
  831.  
  832. } while (n = n.nextSibling)
  833. return str_seed_descr;
  834. }
  835.  
  836.  
  837. function findKey(obj, value, compare = (a, b) => a === b) {
  838. return Object.keys(obj).find(k => compare(obj[k], value))
  839. }
  840.  
  841.  
  842. /*** script begin ***/
  843. t = get_site();
  844. if (!t) {
  845. return;
  846. }
  847. if (t.is_detail_page()) {
  848. if (SupportForwardedSite.includes(SiteName[t.site_name])) {
  849. var data = t.process_detail_page();
  850. t.insert_detail_page(data);
  851. }
  852. } else {
  853. var data = JSON.parse(decodeURIComponent(window.location.href.split("#")[1])); t
  854. console.log(data);
  855. t.process_upload_page(data);
  856. }
  857. /*** script end ***/
  858.  

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址