JAV老司机

JAV老司机神器,支持各Jav老司机站点。拥有高效浏览Jav的页面排版,JAV高清预览大图,JAV列表无限滚动自动加载,合成“挊”的自动获取JAV磁链接,一键自动115离线下载。。。。没时间解释了,快上车!

נכון ליום 20-03-2020. ראה הגרסה האחרונה.

  1. // ==UserScript==
  2. // @name JAV老司机
  3. // @namespace https://sleazyfork.org/zh-CN/users/25794
  4. // @version 3.1.4
  5. // @supportURL https://sleazyfork.org/zh-CN/scripts/25781/feedback
  6. // @source https://github.com/hobbyfang/javOldDriver
  7. // @description JAV老司机神器,支持各Jav老司机站点。拥有高效浏览Jav的页面排版,JAV高清预览大图,JAV列表无限滚动自动加载,合成“挊”的自动获取JAV磁链接,一键自动115离线下载。。。。没时间解释了,快上车!
  8. // @author Hobby
  9.  
  10. // @require https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js
  11. // @require https://cdn.jsdelivr.net/npm/lovefield@2.1.12/dist/lovefield.min.js
  12. // @resource icon http://geekdream.com/image/115helper_icon_001.jpg
  13.  
  14. // @include *://*javlibrary.com/*
  15. // @include *://*javlib.com/*
  16. // @include *://*javbus.com/*
  17. // @include *://tellme.pw/avsox
  18. // @include *://tellme.pw/avmoo
  19. // @include *://115.com/*
  20. // @include *://onejav.com/*
  21. // @include *://*jav321.com/video/*
  22.  
  23. // @include *://*/vl_update*
  24. // @include *://*/vl_newrelease*
  25. // @include *://*/vl_newentries*
  26. // @include *://*/vl_mostwanted*
  27. // @include *://*/vl_bestrated*
  28. // @include *://*/vl_genre*
  29. // @include *://*/vl_star*
  30. // @include *://*/?v=jav*
  31. // @include *://*/mv_owned*
  32. // @include *://*/mv_watched*
  33. // @include *://*/mv_wanted*
  34. // @include *://*/mv_visited*
  35.  
  36. // @include *://www.*bus*/*
  37. // @include *://www.*dmm*/*
  38.  
  39. // @include *://*/movie/*
  40. // @include *://*/cn*
  41. // @include *://*/tw*
  42. // @include *://*/ja*
  43. // @include *://*/en*
  44.  
  45. // @run-at document-idle
  46. // @grant GM_xmlhttpRequest
  47. // @grant GM_addStyle
  48. // @grant GM_getValue
  49. // @grant GM_setValue
  50. // @grant GM_notification
  51. // @grant GM_setClipboard
  52. // @grant GM_getResourceURL
  53.  
  54. // @connect *
  55. // @copyright hobby 2016-12-18
  56.  
  57. // 大陆用户推荐Chrome(V52+) + Tampermonkey(必须扩展) + V2ray/ShadowsocksR(代理) + Proxy SwitchyOmega(扩展)的环境下配合使用。
  58. // 上车请使用chrome浏览器,其他浏览器的问题本人不支持发现和修复相关问题。
  59.  
  60. // 注意:2.0在每个版本号更新后,javlibrary每个不同域名站点在登录javlibrary的情况下,都会分别首次运行此脚本,
  61. // 根据电脑性能及访问网速情况不同,需消耗约2分钟左右(以1000个车牌量计算)缓存个人数据到本地浏览器中.
  62. // 此目的用于过滤个人已阅览过的内容提供快速判断.目前在同步过程中如果浏览器当前页面不在javlibrary站点,同步会被暂停或中止,需注意.
  63. // 当然如果不登录javlibrary或同版本号已经同步过,则不会运行同步,并无此影响.
  64.  
  65. // v3.1.4 更换失效的磁链地址。
  66. // v3.1.3 更换失效的磁链地址。
  67. // v3.1.2 优化javbus/avmoo/avsox步兵瀑布流排版。
  68. // v3.1.1 更新了磁链站点。
  69. // v3.1.0 优化javbus/avmoo/avsox瀑布流排版。
  70. // v3.0.5 排版做了一些微调。
  71. // v3.0.4 屏蔽了失效的磁链站点。
  72. // v3.0.3 修复了已知问题。
  73. // v3.0.2 修复了已知问题。
  74. // v3.0.1 修复了已知问题。
  75. // v3.0.0 增加115在线播放的关联入口。同时本代码重新梳理及优化。
  76.  
  77. // v2.3.0 增加jav321网站内容排版的支持,增加查找已登录115网盘是否拥有当前番号显示。
  78. // v2.2.2 修复了已知问题。
  79. // v2.2.0 增加onejav网站内容排版的支持,热门Jav预览搜集更省时省力。更换两个磁链资源新地址。
  80. // v2.1.5 增加点击番号完成复制功能。
  81. // v2.1.3 增加btdigg磁链资源站点。修复了已知问题。
  82. // v2.1.1 增加jav站点瀑布流控制按钮功能。
  83. // v2.1.0 增加javbus站内磁链列表的复制、115离线的快捷键功能。
  84.  
  85. // v2.0.7 增加一种情况Jav列表排序功能支持(仅javlib)。
  86. // v2.0.5 增加Jav列表“按评分排序”、“按时间排序”功能(仅javlib),及更新Jav站点域名。
  87. // v2.0.0 增加自动同步个人数据缓存到本地,jav列表能识别个人已阅览过的内容(需登录javlibray),针对javlibrary的高评价栏目,增加过滤"不看我阅览过"功能。
  88.  
  89. // v1.2.0 针对javlibrary的高评价栏目,增加过滤“只看当前月份”、“只看近两月份”功能。另默认此栏目近两月份的内容增加背景颜色区分。
  90. // v1.2.0 更新了合成“挊”脚本的更多网站的支持,感谢作者thunderhit,同时修复原脚本部分网站功能失效问题。
  91. // v1.1.0 优化更新了JAV列表无限滚动自动加载的代码,增加JAV列表中显示"发行日期"和"评分"的排版,以及修复了已知问题。
  92. // v1.0.3 优化了高清预览大图的获取。
  93. // v1.0.2 优化了javlibrary排版,做了最低分辨率1280x800的排版适配调整,及修复了已知问题。
  94. // v1.0.0 支持javlibrary.com、javbus.com、avmo.pw、avso.pw等老司机站点,第一版发布。
  95.  
  96. // ==/UserScript==
  97. /* jshint -W097 */
  98. (function () {
  99. 'use strict';
  100. // 115用户ID
  101. let jav_userID = GM_getValue('jav_user_id', 0);
  102. // icon图标
  103. let icon = GM_getResourceURL('icon');
  104. // 瀑布流状态:1:开启、0:关闭
  105. let waterfallScrollStatus = GM_getValue('scroll_status', 1);
  106. // 当前网页域名
  107. let domain = location.host;
  108. // 数据库
  109. let javDb;
  110. // 表
  111. let myMovie;
  112.  
  113. /**
  114. * 对Date的扩展,将 Date 转化为指定格式的String
  115. * 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,/';
  116. * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
  117. * 例子:(new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423f
  118. * (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
  119. * @param fmt 日期格式
  120. * @returns {void | string} 格式化后的日期字符串
  121. */
  122. Date.prototype.Format = function (fmt) { //author: meizz
  123. var o = {
  124. "M+": this.getMonth() + 1, //月份
  125. "d+": this.getDate(), //日
  126. "h+": this.getHours(), //小时
  127. "m+": this.getMinutes(), //分
  128. "s+": this.getSeconds(), //秒
  129. "q+": Math.floor((this.getMonth() + 3) / 3), //季度
  130. "S": this.getMilliseconds() //毫秒
  131. };
  132. if (/(y+)/.test(fmt))
  133. fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  134. for (var k in o)
  135. if (new RegExp("(" + k + ")").test(fmt))
  136. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  137. return fmt;
  138. };
  139.  
  140. /**
  141. * 多线程异步队列 依赖 jQuery 1.8+
  142. * @n {Number} 正整数, 线程数量
  143. */
  144. function Queue (n) {
  145. n = parseInt(n, 10);
  146. return new Queue.prototype.init( (n && n > 0) ? n : 1 )
  147. }
  148.  
  149. Queue.prototype = {
  150. init: function (n) {
  151. this.threads = [];
  152. this.taskList = [];
  153. while (n--) {
  154. this.threads.push(new this.Thread)
  155. }
  156. },
  157. /**
  158. * @callback {Fucntion} promise对象done时的回调函数,它的返回值必须是一个promise对象
  159. */
  160. push: function (callback) {
  161. if (typeof callback !== 'function') return;
  162. var index = this.indexOfIdle();
  163. if (index != -1) {
  164. this.threads[index].idle(callback);
  165. //try { console.log('Thread-' + (index+1) + ' accept the task!') } catch (e) {}
  166. }
  167. else {
  168. this.taskList.push(callback);
  169. for (var i = 0, l = this.threads.length; i < l; i++) {
  170. (function(thread, self, id){
  171. thread.idle(function(){
  172. if (self.taskList.length > 0) {
  173. //try { console.log('Thread-' + (id+1) + ' accept the task!') } catch (e) {}
  174. let promise = self.taskList.shift()(); // 正确的返回值应该是一个promise对象
  175. return promise.promise ? promise : $.Deferred().resolve().promise();
  176. } else {
  177. return $.Deferred().resolve().promise();
  178. }
  179. })
  180. })(this.threads[i], this, i);
  181.  
  182. }
  183. }
  184. },
  185. indexOfIdle: function () {
  186. var threads = this.threads,
  187. thread = null,
  188. index = -1;
  189. for (var i = 0, l = threads.length; i < l; i++) {
  190. thread = threads[i];
  191. if (thread.promise.state() === 'resolved') {
  192. index = i;
  193. break;
  194. }
  195. }
  196. return index;
  197. },
  198. Thread: function () {
  199. this.promise = $.Deferred().resolve().promise();
  200. this.idle = function (callback) {
  201. this.promise = this.promise.then(callback)
  202. }
  203. }
  204. };
  205. Queue.prototype.init.prototype = Queue.prototype;
  206.  
  207. /**
  208. * 公用类
  209. * @Class
  210. */
  211. let Common = {
  212. /**
  213. * 设置cookie
  214. * @param cname 名字
  215. * @param cvalue 值
  216. */
  217. setCookie: function(cname, cvalue) {
  218. let d = new Date();
  219. d.setTime(d.getTime() + (30*24*60*60*1000));
  220. let expires = "expires="+ d.toUTCString();
  221. document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
  222. },
  223. /**
  224. * html文本转换为Document对象 https://jsperf.com/domparser-vs-createelement-innerhtml/3
  225. * @param {String} text
  226. * @returns {Document}
  227. */
  228. parsetext: function (text) {
  229. try {
  230. let doc = document.implementation.createHTMLDocument('');
  231. doc.documentElement.innerHTML = text;
  232. return doc;
  233. }
  234. catch (e) {
  235. alert('parse error');
  236. }
  237. },
  238.  
  239. /**
  240. * 判断日期是否最近X个月份的日期
  241. * @param {String} DateStr 日期
  242. * @param {Number} MonthNum 月数(X)
  243. * @returns {boolean}
  244. */
  245. isLastXMonth: function (DateStr, MonthNum) {
  246. let now = new Date(); //当前日期
  247. let compDate = new Date(DateStr);
  248. let m2 = now.getFullYear() * 12 + now.getMonth();
  249. let m1 = compDate.getFullYear() * 12 + compDate.getMonth();
  250. if ((m2 - m1) < MonthNum) {
  251. return true;
  252. }
  253. return false;
  254. },
  255.  
  256. /**
  257. * 方法: 通用chrome通知
  258. * @param title
  259. * @param body
  260. * @param icon
  261. * @param click_url
  262. */
  263. notifiy: function (title, body, icon, click_url) {
  264. var notificationDetails = {
  265. text: body,
  266. title: title,
  267. timeout: 3000,
  268. image: icon,
  269. onclick: function () {
  270. window.open(click_url);
  271. }
  272. };
  273. GM_notification(notificationDetails);
  274. },
  275. /**
  276. * 获取带-的番号
  277. * @param {String} avid 番号如:ABP888
  278. * @returns {String} 带-的番号
  279. */
  280. getAvCode:function (avid) {
  281. let letter = avid.match(/^[a-z|A-Z]+/gi);
  282. let num = avid.match(/\d+$/gi);
  283. return letter+"-"+num;
  284. },
  285. /**
  286. * 加入AV预览内容图
  287. * @param avid av唯一码
  288. * @param @function func 函数
  289. * @param {boolean} isZoom 是否放大,默认true
  290. */
  291. addAvImg: function (avid, func, isZoom) {
  292. //异步请求搜索blogjav.net的番号
  293. let promise1 = request('http://blogjav.net/?s=' + avid);//大图地址
  294. promise1.then((result) => {
  295. var doc = Common.parsetext(result.responseText);
  296. let a_array = $(doc).find(".more-link");
  297. let a = a_array[0];
  298. for (let i = 0; i < a_array.length; i++) {
  299. var fhd_idx = a_array[i].innerHTML.search(/FHD/);
  300. //debugger;
  301. if (fhd_idx > 0) {
  302. a = a_array[i];
  303. break;
  304. }
  305. }
  306. if (a) {
  307. //异步请求调用内页详情的访问地址
  308. GM_xmlhttpRequest({
  309. method: "GET",
  310. //大图地址
  311. url: a.href,
  312. headers: {
  313. referrer: "http://pixhost.to/" //绕过防盗图的关键
  314. },
  315. onload: function (XMLHttpRequest) {
  316. var bodyStr = XMLHttpRequest.responseText;
  317. var yixieBody = bodyStr.substring(bodyStr.search(/<span id="more-(\S*)"><\/span>/), bodyStr.search(/<div class="category/));
  318.  
  319. var img_start_idx = yixieBody.search(/"><img .*src="https*:\/\/(\S*)pixhost.*\/thumbs\//);
  320. //debugger;
  321. //如果找到内容大图
  322. if (img_start_idx > 0) {
  323. var new_img_src = yixieBody.substring(yixieBody.indexOf('src', img_start_idx) + 5, yixieBody.indexOf('alt') - 2);
  324. var targetImgUrl = new_img_src.replace('thumbs', 'images').replace('//t', '//img').replace(/[\?*\"*]/, '').replace('https', 'http');
  325.  
  326. //如果找到全高清大图优先显示全高清的
  327. console.log("图片地址:" + targetImgUrl);
  328. //创建img元素,加载目标图片地址
  329. //创建新img元素
  330. let className = "";
  331. if(isZoom != undefined && !isZoom){
  332. className = "min";
  333. }
  334. var $img = $('<img name="javRealImg" title="点击可放大缩小 (图片正常时)" class="' + className + '"></img>');
  335. $img.attr("src", targetImgUrl);
  336. $img.attr("style", "float: left;cursor: pointer;max-width: 100%;");
  337.  
  338. //将新img元素插入指定位置
  339. func($img);
  340. }
  341. },
  342. onerror: function (e) {
  343. console.log(e);
  344. }
  345. });//end GM_xmlhttpRequest
  346. }
  347. });
  348. },
  349.  
  350. /**
  351. * 查询115网盘是否拥有番号
  352. * @param javId 番号
  353. * @param callback 回调函数
  354. */
  355. search115Data: function (javId, callback) {
  356. //异步请求搜索115番号 //115查询
  357. let javId2 = javId.replace(/(-)/g, "");
  358. let promise1 = request(`https://webapi.115.com/files/search?search_value=${javId}%20${javId2}&format=json`);
  359. promise1.then((result) => {
  360. let resultJson = JSON.parse(result.responseText);
  361. if(resultJson.count > 0) {
  362. let pickcode = '';
  363. for (let i = 0; i < resultJson.data.length; i++) {
  364. let row = resultJson.data[i];
  365. if(row.vdi){//iv vdi ico
  366. pickcode = row.pc;
  367. callback(true,`http://120.78.32.31/play.html?pickcode=${pickcode}`);
  368. return;
  369. }
  370. }
  371. }
  372. callback(false,null);
  373. });
  374. },
  375. getSchemaBuilder: function() {
  376. // 构造jav库
  377. let ds = lf.schema.create('jav', 1);
  378. // 创建MyMovie表
  379. ds.createTable('MyMovie').
  380. //addColumn('id', lf.Type.INTEGER).
  381. //索引编码 如javlikqu54
  382. addColumn('index_cd',lf.Type.STRING).
  383. //识别编码 如CHN-141
  384. addColumn('code', lf.Type.STRING).
  385. //缩略图路径
  386. addColumn('thumbnail_url', lf.Type.STRING).
  387. //片名
  388. addColumn('movie_name', lf.Type.STRING).
  389. //演员
  390. addColumn('actor', lf.Type.STRING).
  391. //封面图路径
  392. addColumn('cover_img_url', lf.Type.STRING).
  393. //发布日期
  394. addColumn('release_date', lf.Type.STRING).
  395. //评分
  396. addColumn('score', lf.Type.INTEGER).
  397. //片长(分钟)
  398. addColumn('duration', lf.Type.INTEGER).
  399. //导演
  400. addColumn('director', lf.Type.STRING).
  401. //制作商
  402. addColumn('maker', lf.Type.STRING).
  403. //发行商
  404. addColumn('publisher', lf.Type.STRING).
  405. //加入时间
  406. addColumn('add_time', lf.Type.STRING).
  407. //是否已阅
  408. addColumn('is_browse', lf.Type.BOOLEAN).
  409. //是否想要
  410. addColumn('is_want', lf.Type.BOOLEAN).
  411. //是否看过
  412. addColumn('is_seen', lf.Type.BOOLEAN).
  413. //是否拥有
  414. addColumn('is_have', lf.Type.BOOLEAN).
  415. //定义主键
  416. addPrimaryKey(['index_cd']).
  417. //定义索引
  418. addIndex('idxaddtime', ['add_time'], false, lf.Order.DESC);
  419. return ds;
  420. },
  421. };
  422.  
  423. let main = { // todo
  424. //av信息查询类
  425. //avsox|avmoo
  426. jav: {
  427. type: 0,
  428. re: /.*movie.*/,
  429. vid: function () {
  430. return $('.header_hobby')[0].nextElementSibling.getAttribute("avid");
  431. },
  432. proc: function () {
  433. var divE = $("div[class='col-md-3 info']")[0];
  434. $(divE).after(main.cur_tab);
  435. }
  436. },
  437. javbus: {
  438. type: 0,
  439. re: /bus|dmm/,
  440. vid: function () {
  441. var a = $('.header_hobby')[0].nextElementSibling;
  442. return a ? a.getAttribute("avid") : '';
  443. },
  444. proc: function () {
  445. var divE = $("div[class='col-md-3 info']")[0];
  446. $(divE).after(main.cur_tab);
  447. }
  448. },
  449. javlibrary: {
  450. type: 0,
  451. re: /.*\?v=jav.*/,
  452. vid: function () {
  453. return $('#video_id')[0].getElementsByClassName('text')[0].getAttribute("avid");
  454. },
  455. proc: function () {
  456. //去十八岁警告
  457. Common.setCookie("over18", 18);
  458. $('.socialmedia').remove();
  459. GM_addStyle(`
  460. #video_info {text-align: left;font: 14px Arial;min-width: 230px;max-width: 250px;padding: 0px 0px 0px 0px;}
  461. #video_jacket_info {overflow: hidden;} //table-layout: fixed;
  462. #coverimg {vertical-align: top;overflow: hidden;max-width: 50%;}
  463. #javtext {vertical-align: top;width: 250px;}
  464. #video_info td.header {width: 75px;}
  465. #video_info td.icon {width: 0px;}
  466. #content {padding-top: 0px;}
  467. `);
  468.  
  469. var tdE = $("td[style='vertical-align: top;']")[0];
  470. tdE.id = "coverimg";
  471. $("td[style='vertical-align: top;']")[1].id = 'javtext';
  472. $('#leftmenu').remove();
  473. $('#rightcolumn').attr("style", "margin: 0px 0px 0px 0px;width: 100%;padding: initial;");
  474. $(tdE.parentElement).append('<td id="hobby" style="vertical-align: top;"></td>');
  475. $('#hobby').append(main.cur_tab);
  476. }
  477. },
  478. };
  479.  
  480. function request(url) {
  481. return new Promise(resolve => {
  482. //let time1 = new Date();
  483. GM_xmlhttpRequest({
  484. url,
  485. method: 'GET',
  486. headers: {
  487. "Cache-Control": "no-cache"
  488. },
  489. timeout: 30000,
  490. onload: response => { //console.log(url + " reqTime:" + (new Date() - time1));
  491. resolve(response);
  492. },
  493. onabort: (e) =>{
  494. console.log(url + " abort");
  495. resolve("wrong");
  496. },
  497. onerror: (e) =>{
  498. console.log(url + " error");
  499. console.log(e);
  500. resolve("wrong");
  501. },
  502. ontimeout: (e) =>{
  503. console.log(url + " timeout");
  504. resolve("wrong");
  505. },
  506. });
  507. });
  508. }
  509.  
  510. // 挊
  511. let main_keys = Object.keys(main); //下面的不要出现
  512. main.cur_tab = null;
  513. main.cur_vid = '';
  514.  
  515. // 瀑布流脚本使用类
  516. class Lock {
  517. constructor(d = false) {
  518. this.locked = d;
  519. }
  520. lock() {
  521. this.locked = true;
  522. }
  523. unlock() {
  524. this.locked = false;
  525. }
  526. }
  527.  
  528. // 第三方脚本调用
  529. var thirdparty = {
  530. // javbus详情页增加多类别联合查找功能
  531. busTypeSearch : () => {
  532. let se = () => {
  533. let curGenres = '', a = document.querySelectorAll('input[name="gr_sel"]:checked'), arr = [];
  534. a.forEach(e => {
  535. arr.push(e.value);
  536. });
  537. //console.log(arr.join('-'));
  538. arr = arr.join('-');
  539. if (arr[0]) {
  540. window.location.href = 'genre/' + arr;
  541. }
  542. };
  543. let CreateSearch = () => { //get <p>
  544. let p = document.querySelector('span.genre > a[href*="https://www.javbus.com/genre/"]');
  545. if (!p) return;
  546. p = p.parentNode.parentNode;
  547. p.querySelectorAll('a').forEach(e => {
  548. let i = document.createElement('input'), val = e.href.split('/');
  549. //https://www.javbus.com/genre/4 --> get > 4
  550. val = val[val.length - 1];
  551. i.setAttribute('type', 'checkbox');
  552. i.setAttribute('name', 'gr_sel');
  553. i.setAttribute('value', val);
  554. i.setAttribute('style', 'margin-right: 5px;');
  555. e.parentNode.insertBefore(i, e);
  556. });
  557. let a = document.createElement('a');
  558. a.setAttribute('style', 'cursor: pointer; display: block; color: blue;');
  559. a.textContent = '搜索';
  560. p.appendChild(a);
  561. a.addEventListener('click', se, false);
  562. };
  563. CreateSearch();
  564. },
  565. // 登录115执行脚本,自动离线下载准备步骤
  566. login115Run: function () {
  567. if (location.host.indexOf('115.com') >= 0) {
  568. jav_userID = GM_getValue('jav_user_id', 0); //115用户ID缓存
  569. //获取115ID
  570. if (jav_userID === 0) {
  571. if (location.host.indexOf('115.com') >= 0) {
  572. if (typeof (window.wrappedJSObject.user_id) != 'undefined') {
  573. jav_userID = window.wrappedJSObject.user_id;
  574. GM_setValue('jav_user_id', jav_userID);
  575. alert('115登陆成功!');
  576. return;
  577. }
  578. } else {
  579. //alert('请先登录115账户!');
  580. Common.notifiy("115还没有登录",
  581. '请先登录115账户后,再离线下载!',
  582. icon,
  583. 'http://115.com/?mode=login'
  584. );
  585. GM_setValue('jav_user_id', 0);
  586. }
  587. }
  588.  
  589. if (location.host.indexOf('115.com') >= 0) {
  590. console.log('jav老司机:115.com,尝试获取userid.');
  591. jav_userID = GM_getValue('jav_user_id', 0);
  592. //debugger;
  593. if (jav_userID !== 0) {
  594. console.log("jav老司机: 115账号:" + jav_userID + ",无需初始化.");
  595. return false;
  596. }
  597. jav_userID = $.cookie("OOFL");
  598. console.log("jav老司机: 115账号:" + jav_userID);
  599. if (!jav_userID) {
  600. console.log("jav老司机: 尚未登录115账号");
  601. return false;
  602. } else {
  603. console.log("jav老司机: 初始化成功");
  604. Common.notifiy('老司机自动开车', '登陆初始化成功,赶紧上车把!', icon, "");
  605. GM_setValue('jav_user_id', jav_userID);
  606. }
  607. return false;
  608. }
  609. }
  610. },
  611. // 瀑布流脚本
  612. waterfallScrollInit: function () {
  613. var w = new thirdparty.waterfall({});
  614. // javbus.com、avmo.pw、avso.pw
  615. var $pages = $('div#waterfall div.item');
  616. if ($pages.length) {
  617. $pages[0].parentElement.parentElement.id = "waterfall_h";
  618. // javbus.com
  619. if ($("footer:contains('JavBus')").length) {
  620. w = new thirdparty.waterfall({
  621. next: 'a#next',
  622. item: 'div#waterfall div.item',
  623. cont: '.masonry',
  624. pagi: '.pagination-lg',
  625. });
  626. }
  627. //avmo.pw、avso.pw
  628. if ((/(AVMOO|AVSOX)/g).test(document.title)) {
  629. w = new thirdparty.waterfall({
  630. next: 'a[name="nextpage"]',//nextpage
  631. item: 'div#waterfall div.item',
  632. cont: '#waterfall',
  633. pagi: '.pagination',
  634. });
  635. }
  636. }
  637. // javlibrary
  638. var $pages2 = $('div.videos div.video');
  639. if ($pages2.length) {
  640. GM_addStyle(`
  641. .videothumblist .videos .video {height: 265px;padding: 0px;margin: 4px;}
  642. `);
  643. $pages2[0].parentElement.id = "waterfall";
  644. w = new thirdparty.waterfall({
  645. next: 'a[class="page next"]',
  646. item: 'div.videos div.video',
  647. cont: '#waterfall',
  648. pagi: '.page_selector',
  649. });
  650. }
  651. // onejav
  652. var $pages3 = $('div.container div.card.mb-3');
  653. if ($pages3.length) {
  654. $pages3[0].parentElement.id = "waterfall";
  655. w = new thirdparty.waterfall({
  656. next: 'a.pagination-next.button.is-primary',
  657. item: 'div.container div.card.mb-3',
  658. cont: '#waterfall',
  659. pagi: '.pagination.is-centered',
  660. });
  661. }
  662.  
  663. w.setSecondCallback(function (cont, elems) {
  664. if (location.pathname.includes('/star/') && elems) {
  665. cont.append(elems.slice(1));
  666. } else {
  667. cont.append(elems);
  668. }
  669. });
  670.  
  671. w.setThirdCallback(function (elems) {
  672. // hobby mod script
  673. function filerMonth(indexCd_id, dateString) {
  674. //过滤最新X月份的影片
  675. if ($(indexCd_id).context.URL.indexOf("bestrated.php?delete") > 0) {
  676. if ($(indexCd_id).context.URL.indexOf("bestrated.php?deleteOneMonthAway") > 0 && !Common.isLastXMonth(dateString, 1)) {
  677. $(indexCd_id).remove();
  678. }
  679. else if ($(indexCd_id).context.URL.indexOf("bestrated.php?deleteTwoMonthAway") > 0 && !Common.isLastXMonth(dateString, 2)) {
  680. $(indexCd_id).remove();
  681. }
  682. }
  683. }
  684. function filerScore(indexCd_id, pingfengString) {
  685. //过滤X评分以下的影片 //if(vid == 'javlikq7qu')debugger;
  686. if ($(indexCd_id).context.URL.indexOf("?delete") > 0) {
  687. if ($(indexCd_id).context.URL.indexOf("delete7down") > 0 && Number(pingfengString.replace('(', '').replace(')', '')) <= 7) {
  688. $(indexCd_id).remove();
  689. }
  690. else if ($(indexCd_id).context.URL.indexOf("delete8down") > 0 && Number(pingfengString.replace('(', '').replace(')', '')) <= 8) {
  691. $(indexCd_id).remove();
  692. }
  693. else if ($(indexCd_id).context.URL.indexOf("delete9down") > 0 && Number(pingfengString.replace('(', '').replace(')', '')) <= 9) {
  694. $(indexCd_id).remove();
  695. }
  696. }
  697. }
  698. function setbgcolor(indexCd_id, dateString) {
  699. // 如果是最近两个月份的影片标上背景色
  700. if ($(indexCd_id).context.URL.indexOf("bestrated") > 0 && Common.isLastXMonth(dateString, 2)) {
  701. //$(indexCd_id).css("background-color", "blanchedalmond");
  702. $('div[class="hobby_add"]', $(indexCd_id)).css("background-color", "#ffffc9");
  703. //debugger;
  704. }
  705. }
  706.  
  707. function extCode(indexCd_id, dateString, pingfengString) {
  708. $(indexCd_id).children("a").append(`<div class='hobby_add'style='color: red;font-size: 14px;'>
  709. ${dateString}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${pingfengString}</div>`);
  710. $(indexCd_id).children("a").attr("release_date", dateString);
  711. let s = 0;
  712. let r = Math.random() / 100;
  713. if (pingfengString.replace(/[\\(\\)]/g, "") != '') {
  714. s = r + parseFloat(pingfengString.replace(/[\\(\\)]/g, ""));
  715. } else {
  716. s = 0 + r;
  717. }
  718. $(indexCd_id).children("a").attr("score", s);
  719. setbgcolor(indexCd_id, dateString);
  720. filerMonth(indexCd_id, dateString);
  721. filerScore(indexCd_id, pingfengString);
  722. }
  723.  
  724. if (document.title.search(/JAVLibrary/) > 0 && elems) {
  725. for (let i = 0; i < elems.length; i++) {
  726. let _vid = $(elems[i]).attr("id").replace('vid_', '');//vid_javlikd42y
  727. // 给列表中的影片添加鼠标点击事件
  728. $("a", $("#vid_" + _vid)).first().mousedown(function (event) {
  729. // 判断鼠标左键或中间才执行
  730. if (event.button < 2) {
  731. // 设置点击后填充新的背景色peachpuff
  732. $("#vid_" + _vid).css("background-color", "#ffe7d3");
  733. }
  734. });
  735. let indexCd_id;
  736. let dateString;
  737. let pingfengString;
  738. // 查找影片是否存在我浏览过的MyMovie表中
  739. let prom =javDb.select().from(myMovie).
  740. where(lf.op.and(myMovie.is_browse.eq(true),myMovie.index_cd.eq(_vid))).exec();
  741. prom.then( results =>{
  742. //let promise1 = Promise.resolve();
  743. //return new Promise(resolve => {
  744. if(results.length != 0 ){//存在
  745. indexCd_id = "#vid_" + results[0].index_cd;
  746. if ($(indexCd_id).context.URL.indexOf("bestrated.php?filterMyBrowse") > 0) {
  747. $(indexCd_id).remove();
  748. }
  749. else{
  750. $(indexCd_id).css("background-color", "#ffe7d3");//hotpink,khaki,indianred,peachpuff
  751. extCode(indexCd_id, results[0].release_date, results[0].score);
  752. }
  753. }
  754. else {//不存在
  755. let promise1 = request(location.origin + "/ja/?v=" + _vid);
  756. promise1.then((result) => {
  757. indexCd_id = "#vid_" + result.finalUrl.split("=")[1];//例如:http://www.j12lib.com/cn/?v=javlikd42a
  758. let doc = result.responseText;
  759. let movie_info = doc.substring(doc.search(/<table id="video_jacket_info">/),
  760. doc.search(/<div id="video_favorite_edit" class="">/));
  761. // 阻止构造Document对象时加载src内容
  762. movie_info = movie_info.replace("src", "hobbysrc");
  763. let $doc = $(Common.parsetext(movie_info));
  764. dateString = $('#video_date .text', $doc).text();
  765. pingfengString = $('#video_review .text .score', $doc).text();
  766. extCode(indexCd_id, dateString, pingfengString);
  767. });
  768. }
  769. });
  770. }
  771. }
  772. });
  773.  
  774. w.setFourthCallback(function (elems) { // todo 20190404
  775. if (document.title.search(/OneJAV/) > 0 && elems) {
  776. // 增加对应所有番号的Javlib的跳转链接,
  777. for (let index = 0; index < elems.length; index++) {
  778. let aEle = $(elems[index]).find("h5.title.is-4.is-spaced a")[0];
  779. let avid = $(aEle).text().replace(/[ ]/g,"").replace(/[\r\n]/g,"")//去掉空格//去掉回车换行
  780. //修改样式
  781. $(aEle.parentElement.parentElement).attr("style","flex-direction: column;");
  782. // Javlib的跳转链接
  783. $(aEle.parentElement).append("<a style='color:red;' href='http://www.javlibrary.com/cn/vl_searchbyid.php?keyword="
  784. + Common.getAvCode(avid) +"&"+avid+ "' target='_blank' title='点击到Javlib看看'>&nbsp;&nbsp;Javlib</a>");
  785. // 番号预览大图
  786. Common.addAvImg(Common.getAvCode(avid), function ($img) {
  787. //debugger;
  788. let divEle = $(elems[index]).find("div.column.is-5")[0];
  789. if (divEle) {
  790. $(divEle).append($img);
  791. $img.click(function () {
  792. //如果存在min就去除min,否则不存在则添加上min
  793. $(this).toggleClass('min');
  794. if ($(this).attr("class")) {
  795. this.parentElement.parentElement.scrollIntoView();
  796. }
  797. });
  798. }
  799. },false);
  800. }
  801. }
  802.  
  803. if(((/(JavBus|AVMOO|AVSOX)/g).test(document.title) || $("footer:contains('JavBus')").length) && elems) {
  804. if(!location.pathname.includes('/actresses')){//排除actresses页面
  805. for (let i = 0; i < elems.length; i++) {
  806. //$(elems[i]).css("height","385px");
  807. if($(elems[i]).find("div.avatar-box").length > 0) continue;
  808. let spanEle = $(elems[i]).find("div.photo-info span")[0];
  809. let t1 = $(spanEle).html().substr($(spanEle).html().indexOf("<br>") + 4);
  810. let t2 = $(spanEle).html().substr(0,$(spanEle).html().indexOf("<br>"));
  811. $(spanEle).html(t1 + "<br>" + t2);
  812. }
  813. }
  814. }
  815. });
  816.  
  817. if((/(JavBus|AVMOO|AVSOX)/g).test(document.title) || $("footer:contains('JavBus')").length) {
  818. // javbus.com、avmo.pw、avso.pw 样式
  819. GM_addStyle(`
  820. #waterfall_h {height: initial !important;width: initial !important;flex-direction: row;flex-wrap: wrap;margin: 5px 15px !important;}
  821. #waterfall_h .item {position: relative !important;top: initial !important;left: initial !important;float: left;}
  822. #waterfall_h .movie-box img {position: absolute; top: -200px; bottom: -200px; left: -200px; right: -200px; margin: auto;}
  823. #waterfall_h .movie-box .photo-frame {position: relative;} #waterfall_h .avatar-box .photo-info p {margin: 0 0 2px;}
  824. #waterfall_h .avatar-box .photo-info {line-height: 15px; padding: 6px;height: 220px;}
  825. #waterfall_h .avatar-box .photo-frame {margin: 10px;text-align: center;}
  826. #waterfall_h .avatar-box.text-center {height: 195px;}//actresses页面
  827. `);
  828.  
  829. if($('#waterfall').length == 0 && location.pathname.search(/search/) > 0
  830. && location.pathname.search(/uncensored/) < 1){
  831. window.location.href = $('li[role="presentation"]:eq(1) a').attr("href");
  832. }
  833.  
  834. if(location.pathname.includes('/uncensored') || (/(AVSOX)/g).test(document.title)){
  835. GM_addStyle(`#waterfall_h .movie-box {width: 354px;} #waterfall_h .movie-box .photo-info {height: 105px;}`);
  836. }
  837. else {
  838. GM_addStyle(`#waterfall_h .movie-box {width: 167px;} #waterfall_h .movie-box .photo-info {height: 145px;}`);
  839. }
  840. }
  841. },
  842. // 瀑布流脚本
  843. waterfall: (function () {
  844. function waterfall(selectorcfg = {}) {
  845. this.lock = new Lock();
  846. this.baseURI = this.getBaseURI();
  847. this.selector = {
  848. next: 'a.next',
  849. item: '',
  850. cont: '#waterfall', //container
  851. pagi: '.pagination',
  852. };
  853. Object.assign(this.selector, selectorcfg);
  854. this.pagegen = this.fetchSync(location.href);
  855. this.anchor = $(this.selector.pagi)[0];
  856. this._count = 0;
  857. this._1func = function (cont, elems) {
  858. cont.empty().append(elems);
  859. };
  860. this._2func = function (cont, elems) {
  861. cont.append(elems);
  862. };
  863. this._3func = function (elems) {
  864. };
  865. if ($(this.selector.item).length) {
  866. // 开启关闭瀑布流判断
  867. if(waterfallScrollStatus > 0) {
  868. document.addEventListener('scroll', this.scroll.bind(this));
  869. document.addEventListener('wheel', this.wheel.bind(this));
  870. }
  871. this.appendElems(this._1func);
  872. }
  873. }
  874.  
  875. waterfall.prototype.getBaseURI = function () {
  876. let _ = location;
  877. return `${_.protocol}//${_.hostname}${(_.port && `:${_.port}`)}`;
  878. };
  879. waterfall.prototype.getNextURL = function (href) {
  880. let a = document.createElement('a');
  881. a.href = href;
  882. return `${this.baseURI}${a.pathname}${a.search}`;
  883. };
  884. // 瀑布流脚本
  885. waterfall.prototype.fetchURL = function (url) {
  886. console.log(`fetchUrl = ${url}`);
  887. const fetchwithcookie = fetch(url, {credentials: 'same-origin'});
  888. return fetchwithcookie.then(response => response.text())
  889. .then(html => new DOMParser().parseFromString(html, 'text/html'))
  890. .then(doc => {
  891. let $doc = $(doc);
  892. let href = $doc.find(this.selector.next).attr('href');
  893. let nextURL = href ? this.getNextURL(href) : undefined;
  894. let elems = $doc.find(this.selector.item);
  895. return {
  896. nextURL,
  897. elems
  898. };
  899. });
  900. };
  901. // 瀑布流脚本
  902. waterfall.prototype.fetchSync = function* (urli) {
  903. let url = urli;
  904. do {
  905. yield new Promise((resolve, reject) => {
  906. if (this.lock.locked) {
  907. reject();
  908. }
  909. else {
  910. this.lock.lock();
  911. resolve();
  912. }
  913. }).then(() => {
  914. return this.fetchURL(url).then(info => {
  915. url = info.nextURL;
  916. return info.elems;
  917. })
  918. ;
  919. }).then(elems => {
  920. this.lock.unlock();
  921. return elems;
  922. }).catch((err) => {
  923. // Locked!
  924. }
  925. )
  926. ;
  927. } while (url);
  928. };
  929. // 瀑布流脚本
  930. waterfall.prototype.appendElems = function () {
  931. let nextpage = this.pagegen.next();
  932. if (!nextpage.done) {
  933. nextpage.value.then(elems => {
  934. const cb = (this._count === 0) ? this._1func : this._2func;
  935. cb($(this.selector.cont), elems);
  936. this._count += 1;
  937. // hobby mod script
  938. this._3func(elems);
  939. this._4func(elems);
  940. })
  941. ;
  942. }
  943. return nextpage.done;
  944. };
  945. // 瀑布流脚本
  946. waterfall.prototype.end = function () {
  947. document.removeEventListener('scroll', this.scroll.bind(this));
  948. document.removeEventListener('wheel', this.wheel.bind(this));
  949. let $end = $(`<h1>The End</h1>`);
  950. $(this.anchor).replaceWith($end);
  951. };
  952. waterfall.prototype.reachBottom = function (elem, limit) {
  953. return (elem.getBoundingClientRect().top - $(window).height()) < limit;
  954. };
  955. waterfall.prototype.scroll = function () {
  956. if (this.reachBottom(this.anchor, 500) && this.appendElems(this._2func)) {
  957. this.end();
  958. }
  959. };
  960. waterfall.prototype.wheel = function () {
  961. if (this.reachBottom(this.anchor, 1000) && this.appendElems(this._2func)) {
  962. this.end();
  963. }
  964. };
  965. waterfall.prototype.setFirstCallback = function (f) {
  966. this._1func = f;
  967. };
  968. waterfall.prototype.setSecondCallback = function (f) {
  969. this._2func = f;
  970. };
  971. waterfall.prototype.setThirdCallback = function (f) {
  972. this._3func = f;
  973. };
  974. waterfall.prototype.setFourthCallback = function (f) {
  975. this._4func = f;
  976. };
  977. return waterfall;
  978. })(),
  979. // 挊
  980. nong: {
  981. offline_sites: {
  982. 115: {
  983. name: '115离线',
  984. url: 'http://115.com/?tab=offline&mode=wangpan',
  985. enable: true,
  986. },
  987. },
  988. resource_sites:{
  989. "btsow.club": function (kw, cb) { //btsow
  990. let promise = request("https://" + GM_getValue('search_index') + "/search/" + kw);
  991. promise.then((result) => {
  992. thirdparty.nong.search_engines.full_url = result.finalUrl;
  993. var doc = Common.parsetext(result.responseText);
  994. if (!doc) {
  995. thirdparty.nong.search_engines.parse_error(GM_getValue('search_index'));
  996. }
  997. var data = [];
  998. var t = doc.getElementsByClassName('data-list')[0];
  999. if (t) {
  1000. var a = t.getElementsByTagName('a');
  1001. for (var i = 0; i < a.length; i++) {
  1002. if (!a[i].className.match('btn')) {
  1003. data.push({
  1004. 'title': a[i].title,
  1005. 'maglink': 'magnet:?xt=urn:btih:' + a[i].outerHTML.replace(/.*hash\//, '').replace(/" .*\n.*\n.*\n.*/, ''),
  1006. 'size': a[i].nextElementSibling.textContent,
  1007. 'src': a[i].href,
  1008. });
  1009. }
  1010. }
  1011. }
  1012. cb(result.finalUrl, data);
  1013. });
  1014. },
  1015. // "www.btlibrary.info": function (kw, cb) {
  1016. // GM_xmlhttpRequest({
  1017. // method: "POST",
  1018. // url: "https://"+ GM_getValue('search_index') +"/btlibrary/" + kw + "/1-2-2-1.html",
  1019. // data: "keyword=" + kw,
  1020. // headers: {
  1021. // "Content-Type": "application/x-www-form-urlencoded",
  1022. // withCredentials:true
  1023. // },
  1024. // onload: function (result) {
  1025. // thirdparty.nong.search_engines.full_url = result.finalUrl;
  1026. // let doc = Common.parsetext(result.responseText);
  1027. // let data = [];
  1028. // let t = doc.querySelectorAll(".item");
  1029. // if (t) {
  1030. // for (let elem of t) {
  1031. // data.push({
  1032. // "title": elem.querySelector("dt>a").textContent,
  1033. // "maglink": "magnet:?xt=urn:btih:" + elem.querySelector(".attr>span:nth-child(6)>a").href.match(/[0-9a-zA-Z]{40,}/g),
  1034. // "size": elem.querySelector(".attr>span:nth-child(2)>b").textContent,
  1035. // "src": elem.querySelector("dt>a").href,
  1036. // });
  1037. // }
  1038. // }
  1039. // cb(result.finalUrl, data);
  1040. // },
  1041. // onerror: function (e) {
  1042. // console.error(e);
  1043. // throw "search error";
  1044. // }
  1045. // });
  1046. // },
  1047. "www.btdig.com": function (kw, cb) {
  1048. let promise = request("https://" + GM_getValue('search_index') + "/search?q=" + kw);
  1049. promise.then((result) => {
  1050. thirdparty.nong.search_engines.full_url = result.finalUrl;
  1051. let doc = Common.parsetext(result.responseText);
  1052. let data = [];
  1053. let t = doc.querySelectorAll("div.one_result");
  1054. if (t) {
  1055. for (let elem of t) {
  1056. data.push({
  1057. "title": elem.querySelector(".torrent_name a").textContent,
  1058. "maglink": elem.querySelector(".fa.fa-magnet a").href,
  1059. "size": elem.querySelector(".torrent_size").textContent,
  1060. "src": elem.querySelector(".torrent_name a").href,
  1061. });
  1062. }
  1063. }
  1064. else {
  1065. data.push({
  1066. "title": "没有找到磁链接",
  1067. "maglink": "",
  1068. "size": "0",
  1069. "src": result.finalUrl,
  1070. });
  1071. }
  1072. cb(result.finalUrl, data);
  1073. });
  1074. },
  1075. "sukebei.nyaa.si": function (kw, cb) {
  1076. let promise = request("https://" + GM_getValue('search_index') + "/?f=0&c=0_0&q=" + kw);
  1077. promise.then((result) => {
  1078. thirdparty.nong.search_engines.full_url = result.finalUrl;
  1079. let doc = Common.parsetext(result.responseText);
  1080. if (!doc) {
  1081. thirdparty.nong.search_engines.parse_error(GM_getValue('search_index'));
  1082. }
  1083. let data = [];
  1084. let t = doc.querySelectorAll("tr.default,tr.success");
  1085. if (t.length !== 0) {
  1086. for (let elem of t) {
  1087. //debugger;
  1088. data.push({
  1089. "title": elem.querySelector("td:nth-child(2)>a:nth-child(1)").title,
  1090. "maglink": elem.querySelector("td:nth-child(3)>a:nth-last-child(1)").href,
  1091. //"torrent_url": "https://nyaa.si" + elem.querySelector("td:nth-child(3)>a:nth-child(1)").href,
  1092. "size": elem.querySelector("td:nth-child(4)").textContent,
  1093. "src": "https://sukebei.nyaa.si"
  1094. + elem.querySelector("td:nth-child(2)>a:nth-child(1)").getAttribute('href'),
  1095. });
  1096. }
  1097. }
  1098. cb(result.finalUrl, data);
  1099. });
  1100. },
  1101. // "btdb.to": function (kw, cb) {
  1102. // GM_xmlhttpRequest({
  1103. // method: 'GET',
  1104. // url: 'https://" + GM_getValue('search_index') + "/q/' + kw + '/',
  1105. // onload: function (result) {
  1106. // thirdparty.nong.search_engines.full_url = result.finalUrl;
  1107. // var doc = Common.parsetext(result.responseText);
  1108. // if (!doc) {
  1109. // thirdparty.nong.search_engines.parse_error(GM_getValue('search_index'));
  1110. // }
  1111. // var data = [];
  1112. // var elems = doc.getElementsByClassName('item-title');
  1113. // for (var i = 0; i < elems.length; i++) {
  1114. // data.push({
  1115. // 'title': elems[i].firstChild.title,
  1116. // 'maglink': elems[i].nextElementSibling.firstElementChild.href,
  1117. // 'size': elems[i].nextElementSibling.children[1].textContent,
  1118. // 'src': 'https://btdb.to' + elems[i].firstChild.getAttribute('href'),
  1119. // });
  1120. // }
  1121. //
  1122. // cb(result.finalUrl, data);
  1123. // },
  1124. // onerror: function (e) {
  1125. // console.log(e);
  1126. // }
  1127. // });
  1128. // },
  1129. // "btkittyba.ws": function (kw, cb) {
  1130. // GM_xmlhttpRequest({
  1131. // method: "POST",
  1132. // url: "http://"+ GM_getValue('search_index') +"/", //地址不对则无法搜索
  1133. // data: "keyword=" + kw + "&hidden=true",
  1134. // headers: {
  1135. // "Content-Type": "application/x-www-form-urlencoded",
  1136. // withCredentials:true,
  1137. // Origin: "http://"+ GM_getValue('search_index')
  1138. // },
  1139. // onload: function (result) {
  1140. // let hostString = GM_getValue('search_index');
  1141. // thirdparty.nong.search_engines.full_url = result.finalUrl;
  1142. // let doc = Common.parsetext(result.responseText);
  1143. // let data = [];
  1144. // let t = doc.getElementsByClassName("list-con");
  1145. // if (t) {
  1146. // for (let elem of t) {
  1147. // data.push({
  1148. // "title": elem.querySelector("dt a").textContent,
  1149. // "maglink": elem.querySelector(".option span:nth-child(2) a").href.replace(location.host,hostString),//.match(/[0-9a-zA-Z]{40,}/g)
  1150. // //elem.querySelector("dd a").href todo 111
  1151. // "size": elem.querySelector(".option span:nth-child(4) b").textContent,
  1152. // "src": elem.querySelector("dt a").href.replace(location.host,hostString),
  1153. // "id": elem.querySelector("dt a").href.replace("https","").replace("http","").replace("://"+ location.host +"/t/","").replace(".html",""),
  1154. // });
  1155. // }
  1156. // }
  1157. // cb(result.finalUrl, data); // todo 181224
  1158. // },
  1159. // onerror: function (e) {
  1160. // console.error(e);
  1161. // throw "search error";
  1162. // }
  1163. // });
  1164. // },
  1165. //btdiggs.cc
  1166. // "btdiggcn.xyz": function (kw, cb) {
  1167. // GM_xmlhttpRequest({
  1168. // method: "POST",
  1169. // url: "http://"+ GM_getValue('search_index') +"/", //地址不对则无法搜索
  1170. // data: "keyword=" + kw + "&hidden=true",
  1171. // headers: {
  1172. // "Content-Type": "application/x-www-form-urlencoded",
  1173. // withCredentials:true
  1174. // },
  1175. // onload: function (result) {
  1176. // let hostString = "btdiggcn.xyz";
  1177. // thirdparty.nong.search_engines.full_url = result.finalUrl;
  1178. // let doc = Common.parsetext(result.responseText);
  1179. // let data = [];
  1180. // let t = doc.querySelectorAll(".list dl");
  1181. // if (t) {
  1182. // for (let elem of t) {
  1183. // data.push({
  1184. // "title": elem.querySelector("dt a").textContent,
  1185. // "maglink": elem.querySelector(".attr span:nth-child(6) a").href.replace(location.host,hostString),//.match(/[0-9a-zA-Z]{40,}/g)
  1186. // //elem.querySelector("dd a").href todo 111
  1187. // "size": elem.querySelector(".attr span:nth-child(2) b").textContent,
  1188. // "src": elem.querySelector("dt a").href.replace(location.host,hostString),
  1189. // "id": elem.querySelector("dt a").href.replace("https","").replace("http","").replace("://"+ location.host +"/","").replace(".html",""),
  1190. // });
  1191. // }
  1192. // }
  1193. //
  1194. // cb(result.finalUrl, data);
  1195. // },
  1196. // onerror: function (e) {
  1197. // console.error(e);
  1198. // throw "search error";
  1199. // }
  1200. // });
  1201. // },
  1202. "www.torrentkitty.tv": function (kw, cb) {
  1203. let promise = request("https://" + GM_getValue('search_index') + "/search/" + kw);
  1204. promise.then((result) => {
  1205. thirdparty.nong.search_engines.full_url = result.finalUrl;
  1206. let doc = Common.parsetext(result.responseText);
  1207. let data = [];
  1208. let t = doc.querySelectorAll("#archiveResult tr");
  1209. if (t) {
  1210. t = Array.slice(t, 1, t.length);
  1211. for (let elem of t) {
  1212. if((/(No result)/g).test(elem.querySelector(".name").textContent))
  1213. break;
  1214. data.push({
  1215. "title": elem.querySelector(".name").textContent,
  1216. "maglink": elem.querySelector(".action>a:nth-child(2)").href,
  1217. "size": elem.querySelector(".size").textContent,
  1218. "src": "https://www.torrentkitty.tv" + elem.querySelector(".action>a:nth-child(1)").getAttribute('href'),
  1219. });
  1220. }
  1221. }
  1222. else {
  1223. data.push({
  1224. "title": "没有找到磁链接",
  1225. "maglink": "",
  1226. "size": "0",
  1227. "src": result.finalUrl,
  1228. });
  1229. }
  1230. cb(result.finalUrl, data);
  1231. });
  1232. },
  1233.  
  1234. },
  1235. // 挊
  1236. search_engines: {
  1237. switch_engine: function (i) {
  1238. // var index = GM_getValue("search_index",0);
  1239. GM_setValue('search_index', i);
  1240. return i;
  1241. },
  1242. cur_engine: function (kw, cb) {
  1243. let ops = Object.keys(thirdparty.nong.resource_sites);
  1244. let z = thirdparty.nong.resource_sites[GM_getValue('search_index', ops[0])];
  1245. if (!z) {
  1246. //alert("search engine not found");
  1247. GM_setValue('search_index', Object.keys(thirdparty.nong.resource_sites)[0]);
  1248. z = thirdparty.nong.resource_sites[GM_getValue('search_index')];
  1249. }
  1250. return z(kw, cb);
  1251. },
  1252. parse_error: function (a) {
  1253. alert("调用搜索引擎错误,可能需要更新,请向作者反馈。i=" + a);
  1254. },
  1255. full_url: '',
  1256.  
  1257. },
  1258. // 挊
  1259. magnet_table: {
  1260. template: {
  1261. create_head: function () {
  1262. var a = document.createElement('tr');
  1263. a.className = 'jav-nong-row';
  1264. a.id = 'jav-nong-head';
  1265. var list = ['标题','大小','操作','离线下载'];
  1266. for (var i = 0; i < list.length; i++) {
  1267. var b = this.head.cloneNode(true);
  1268. if (i === 0) {
  1269. var select = document.createElement("select");
  1270. var ops = Object.keys(thirdparty.nong.resource_sites); // todo 181225
  1271. var cur_index = GM_getValue("search_index", ops[0]);
  1272. for (var j = 0; j < ops.length; j++) {
  1273. var op = document.createElement("option");
  1274. op.value = ops[j];
  1275. op.textContent = ops[j];
  1276. if (cur_index == ops[j]) {
  1277. op.setAttribute("selected", "selected");
  1278. }
  1279. select.appendChild(op);
  1280. }
  1281. b.removeChild(b.firstChild);
  1282. b.appendChild(select);
  1283. a.appendChild(b);
  1284. continue;
  1285. }
  1286. b.firstChild.textContent = list[i];
  1287. a.appendChild(b);
  1288. }
  1289. // var select_box = this.create_select_box();
  1290. // a.firstChild.appendChild(select_box);
  1291.  
  1292. return a;
  1293. },
  1294. create_row: function (data) {
  1295. var a = document.createElement('tr');
  1296. a.className = 'jav-nong-row';
  1297. a.setAttribute('maglink', data.maglink);
  1298. //debugger;
  1299. // 暂时针对cnbtkitty.pw站点生效。
  1300. if(data.maglink.indexOf("#magnetlink")>-1){
  1301. a.setAttribute('id', data.id);
  1302. let promise1 = request(data.maglink + "?hobbyId=" + data.id);// 传递修改hobbyId,用于修改时定位。
  1303. promise1.then((result) => {
  1304. //定位磁链编码开始下标位置
  1305. let indexNum = result.responseText.indexOf('#website#infohash#');
  1306. if (indexNum >= 0) {
  1307. let magnetlink = result.responseText.substring(indexNum + 18, indexNum + 58);
  1308. let hobbyId = result.finalUrl.substring(result.finalUrl.indexOf('?hobbyId=') + 9, result.finalUrl.length);
  1309. $("#" + hobbyId).attr("maglink", "magnet:?xt=urn:btih:" + magnetlink);
  1310. }
  1311. });
  1312. }
  1313.  
  1314. var b = document.createElement('td');
  1315. var list = [
  1316. this.create_info(data.title, data.maglink),
  1317. this.create_size(data.size, data.src),
  1318. this.create_operation(data.maglink),
  1319. this.create_offline()
  1320. ];
  1321. for (var i = 0; i < list.length; i++) {
  1322. var c = b.cloneNode(true);
  1323. c.appendChild(list[i]);
  1324. a.appendChild(c);
  1325. }
  1326. return a;
  1327. },
  1328. create_loading: function () {
  1329. var a = document.createElement('tr');
  1330. a.className = 'jav-nong-row';
  1331. var p = document.createElement('p');
  1332. p.textContent = 'Loading';
  1333. p.id = 'notice';
  1334. a.appendChild(p);
  1335. return a;
  1336. },
  1337. create_info: function (title, maglink) {
  1338. var a = this.info.cloneNode(true);
  1339. a.firstChild.textContent = title.length < 20 ? title : title.substr(0, 20) + '...';
  1340. a.firstChild.href = maglink;
  1341. a.title = title;
  1342. return a;
  1343. },
  1344. create_size: function (size, src) {
  1345. var a = this.size.cloneNode(true);
  1346. a.textContent = size;
  1347. a.href = src;
  1348. return a;
  1349. },
  1350. create_operation: function (maglink) {
  1351. var a = this.operation.cloneNode(true);
  1352. a.firstChild.href = maglink;
  1353. return a;
  1354. },
  1355. create_offline: function () { //有用 hobby
  1356. var a = this.offline();
  1357. a.className = 'nong-offline';
  1358. return a;
  1359. },
  1360. create_select_box: function () {
  1361. var select_box = document.createElement('select');
  1362. select_box.id = 'nong-search-select';
  1363. select_box.setAttribute('title', '切换搜索结果');
  1364. var search_name = GM_getValue('search', default_search_name);
  1365. for (var k in thirdparty.nong.search_engines) {
  1366. var o = document.createElement('option');
  1367. if (k == search_name) {
  1368. o.setAttribute('selected', 'selected');
  1369. }
  1370. o.setAttribute('value', k);
  1371. o.textContent = k;
  1372. select_box.appendChild(o);
  1373. }
  1374. return select_box;
  1375. },
  1376. head: (function () {
  1377. var a = document.createElement('th');
  1378. var b = document.createElement('a');
  1379. a.appendChild(b);
  1380. return a;
  1381. })(),
  1382. info: (function () {
  1383. var a = document.createElement('div');
  1384. var b = document.createElement('a');
  1385. b.textContent = 'name';
  1386. b.href = 'src';
  1387. a.appendChild(b);
  1388. return a;
  1389. })(),
  1390. size: function () {
  1391. var a = document.createElement('a');
  1392. a.textContent = 'size';
  1393. return a;
  1394. }(),
  1395. operation: (function () {
  1396. var a = document.createElement('div');
  1397. var copy = document.createElement('a');
  1398. copy.className = 'nong-copy';
  1399. copy.textContent = '复制';
  1400. a.appendChild(copy);
  1401. return a;
  1402. })(),
  1403. offline: function () {
  1404. var a = document.createElement('div');
  1405. var b = document.createElement('a');
  1406. b.className = 'nong-offline-download';
  1407. b.target = '_blank';
  1408. //debugger;
  1409. for (var k in thirdparty.nong.offline_sites) {
  1410. if (thirdparty.nong.offline_sites[k].enable) {
  1411. var c = b.cloneNode(true);
  1412. c.href = thirdparty.nong.offline_sites[k].url;
  1413. c.textContent = thirdparty.nong.offline_sites[k].name;
  1414. a.appendChild(c);
  1415. }
  1416. }
  1417. return a;
  1418. },
  1419. },
  1420. create_empty_table: function () { //有用 hobby
  1421. var a = document.createElement('table');
  1422. a.id = 'nong-table-new';
  1423. return a;
  1424. },
  1425. updata_table: function (src, data, type) {
  1426. if (type == 'full') {
  1427. var tab = $('#nong-table-new')[0];
  1428. tab.removeChild(tab.querySelector("#notice").parentElement);
  1429. for (var i = 0; i < data.length; i++) {
  1430. tab.appendChild(thirdparty.nong.magnet_table.template.create_row(data[i]));
  1431. }
  1432. }
  1433. this.reg_event();
  1434. },
  1435. full: function (src, data) {
  1436. var tab = this.create_empty_table();
  1437. tab.appendChild(thirdparty.nong.magnet_table.template.create_head());
  1438. // for (var i = 0; i < data.length; i++) {
  1439. // tab.appendChild(thirdparty.nong.magnet_table.template.create_row(data[i]))
  1440. // }
  1441. var loading = thirdparty.nong.magnet_table.template.create_loading();
  1442. tab.appendChild(loading);
  1443. return tab;
  1444. },
  1445. handle_event: function (event) {
  1446. var maglink = event.target.parentElement.parentElement.getAttribute('maglink')
  1447. || event.target.parentElement.parentElement.parentElement.getAttribute('maglink');
  1448. if (event.target.className == 'nong-copy') {
  1449. event.target.innerHTML = '成功';
  1450. maglink = maglink.substr(0,60);
  1451. GM_setClipboard(maglink);
  1452. setTimeout(function () {
  1453. event.target.innerHTML = '复制';
  1454. }, 1000);
  1455. event.preventDefault(); //阻止跳转
  1456. }
  1457. else if (event.target.className == 'nong-offline-download') {
  1458. maglink = maglink.substr(0,60);
  1459. GM_setValue('magnet', maglink);
  1460. //获取115 token接口
  1461. let promise = request('http://115.com/?ct=offline&ac=space&_='+ new Date().getTime());
  1462. promise.then((responseDetails) => {
  1463. if (responseDetails.responseText.indexOf('html') >= 0) {
  1464. //未登录处理
  1465. Common.notifiy("115还没有登录",
  1466. '请先登录115账户后,再离线下载!',
  1467. icon,
  1468. 'http://115.com/?mode=login'
  1469. );
  1470. return false;
  1471. }
  1472. var sign115 = JSON.parse(responseDetails.response).sign;
  1473. var time115 = JSON.parse(responseDetails.response).time;
  1474. console.log("uid=" + jav_userID + " sign:" + sign115 + " time:" + time115);
  1475. console.log("rsp:" + responseDetails.response);
  1476. GM_xmlhttpRequest({
  1477. method: 'POST',
  1478. url: 'http://115.com/web/lixian/?ct=lixian&ac=add_task_url', //添加115离线任务接口
  1479. headers: {
  1480. "Content-Type": "application/x-www-form-urlencoded"
  1481. },
  1482. data: "url=" + encodeURIComponent(maglink) + "&uid=" + jav_userID + "&sign=" + sign115
  1483. + "&time=" + time115,
  1484. onload: function (responseDetails) {
  1485. var lxRs = JSON.parse(responseDetails.responseText); //离线结果
  1486. if (lxRs.state) {
  1487. //离线任务添加成功
  1488. Common.notifiy("115老司机自动开车",
  1489. '离线任务添加成功',
  1490. icon,
  1491. 'http://115.com/?tab=offline&mode=wangpan'
  1492. );
  1493. }
  1494. else {
  1495. //离线任务添加失败
  1496. if (lxRs.errcode == '911') {
  1497. lxRs.error_msg = '你的帐号使用异常,需要在线手工重新验证即可正常使用。';
  1498. }
  1499. Common.notifiy("失败了",
  1500. '请重新打开115,' + lxRs.error_msg,
  1501. icon,
  1502. 'http://115.com/?tab=offline&mode=wangpan'
  1503. );
  1504. }
  1505. console.log("sign:" + sign115 + " time:" + time115);
  1506. console.log("磁链:" + maglink + " 下载结果:" + lxRs.state + " 原因:" + lxRs.error_msg);
  1507. console.log("rsp:" + responseDetails.response);
  1508. }
  1509. });
  1510.  
  1511. });
  1512. event.preventDefault(); //阻止跳转
  1513. }
  1514. },
  1515. reg_event: function () { // target 处理 更精准
  1516. var list = [
  1517. '.nong-copy',
  1518. '.nong-offline-download'
  1519. ];
  1520. for (var i = 0; i < list.length; i++) {
  1521. var a = document.querySelectorAll(list[i]);
  1522. for (var u = 0; u < a.length; u++) {
  1523. a[u].addEventListener('click', this.handle_event, false);
  1524. }
  1525. }
  1526. },
  1527. },
  1528. // 挊
  1529. searchMagnetRun: function () {
  1530. for (var i = 0; i < main_keys.length; i++) {
  1531. var v = main[main_keys[i]];
  1532.  
  1533. // //for javlibrary
  1534. // if ($("#adultwarningprompt")[0] !== null) {
  1535. // //$("#adultwarningprompt input")[0].click();
  1536. // }
  1537. if (v.re.test(location.href)) {
  1538. if (v.type === 0) {
  1539. try {
  1540. main.cur_vid = v.vid();
  1541. }
  1542. catch (e) {
  1543. main.cur_vid = '';
  1544. }
  1545. if (main.cur_vid) {
  1546. GM_addStyle(`
  1547. #nong-table-new{margin:10px auto;color:#666 !important;font-size:13px;text-align:center;background-color: #F2F2F2;}
  1548. #nong-table-new th,#nong-table-new td{text-align: center;height:30px;background-color: #FFF;padding:0 1em 0;border: 1px solid #EFEFEF;}
  1549. .jav-nong-row{text-align: center;height:30px;background-color: #FFF;padding:0 1em 0;border: 1px solid #EFEFEF;}
  1550. .nong-copy{color:#08c !important;}
  1551. .nong-offline{text-align: center;}
  1552. #jav-nong-head a {margin-right: 5px;}
  1553. .nong-offline-download{color: rgb(0, 180, 30) !important; margin-right: 4px !important;}
  1554. .nong-offline-download:hover{color:red !important;}
  1555. `);
  1556. main.cur_tab = thirdparty.nong.magnet_table.full();
  1557. console.log('h1026 挊的番号:', main.cur_vid);
  1558. v.proc();
  1559.  
  1560. // console.log(main.cur_tab)
  1561. let t = $('#jav-nong-head')[0].firstChild;
  1562. t.firstChild.addEventListener('change', function (e) {
  1563. //debugger;
  1564. console.log("url: http://" + e.target.value);
  1565. GM_setValue('search_index', e.target.value);
  1566. let s = $('#nong-table-new')[0];
  1567. s.parentElement.removeChild(s);
  1568. thirdparty.nong.searchMagnetRun();
  1569. });
  1570.  
  1571. if (GM_getValue('search_index', null) === null) {
  1572. GM_setValue('search_index', Object.keys(thirdparty.nong.resource_sites)[0]);
  1573. }
  1574. thirdparty.nong.search_engines.cur_engine(main.cur_vid, function (src, data) {
  1575. if (data.length === 0) {
  1576. let url = thirdparty.nong.search_engines.full_url;
  1577. $('#nong-table-new #notice').text('No search result! '); //todo 181224
  1578. $('#nong-table-new #notice').append(
  1579. `<a href="${url}" target="_blank" style="color: red;">&nbsp;Go</a>`); //todo 190630
  1580. }
  1581. else {
  1582. thirdparty.nong.magnet_table.updata_table(src, data, 'full');
  1583. /*display search url*/
  1584. var y = $('#jav-nong-head th')[1].firstChild;
  1585. y.href = thirdparty.nong.search_engines.full_url;
  1586. }
  1587. });
  1588. }
  1589. }
  1590. break;
  1591. }
  1592. }
  1593. },
  1594. },
  1595. };
  1596.  
  1597. /**
  1598. * 加载数据 todo 改进
  1599. * @param pageName 访问网页名
  1600. */
  1601. function loadData(pageName , queue) {
  1602. Common.toString();// 无此步骤Common作用域失效,暂时未知原因
  1603. let todo = async ()=>{ // todo 190628
  1604. await loadPageNumData(pageName, 1);
  1605. for (let i = 2; i < GM_getValue(pageName + "_pageNum") + 1; i++) {
  1606. queue.push(()=>{
  1607. let defer = $.Deferred();
  1608. loadPageNumData(pageName, i).then(() => {
  1609. defer.resolve();
  1610. });
  1611. return defer.promise();
  1612. });
  1613. }
  1614. };
  1615. return todo();
  1616. }
  1617.  
  1618. function loadPageNumData(pageName, PageNum) {
  1619. let url = location.origin + "/cn/" + pageName + ".php?&sort=added&page=" + PageNum;// console.log("打开链接url:" + url);
  1620. let commonClass = Common;// 无此步骤Common作用域失效,暂时未知原因
  1621. let promise1 = request(url);
  1622. promise1.then((result) => {
  1623. return new Promise(resolve => {
  1624. if($.type(result) !== "function" && result === "wrong"){
  1625. return resolve();
  1626. }
  1627. let doc = result.responseText;
  1628. //设置初始化总页数
  1629. if(PageNum == 1){
  1630. let docArr = doc.split("的影片: ");
  1631. let totalNum = parseInt(docArr[1].substring(0, docArr[1].search(/<\/div/)));
  1632. GM_setValue(pageName + "_pageNum", parseInt((totalNum + 19) / 20));
  1633. }
  1634. let tableText = doc.substring(doc.search(/<table class="videotextlist">/), doc.search(/<table style="width: 95%; margin: 10px auto;">/));
  1635. //<table class="videotextlist"> //<table style="width: 95%; margin: 10px auto;">
  1636. let $movList = $(commonClass.parsetext(tableText)).find("tr");
  1637. let indexArrStr = "0";
  1638. let timeArrStr = "0";
  1639. let myBrowseJson = "";
  1640. for (let i = 1; i < $movList.length; i++) {
  1641. let movie = $movList.get(i);
  1642. let $aEle = $($(movie).children("td.title").find("a").get(0));
  1643. // 索引编码
  1644. let index_cd = $aEle.attr("href").split("=")[1];
  1645. // 创建时间
  1646. let add_time = $($(movie).children("td").get(2)).text();
  1647. indexArrStr = indexArrStr + index_cd + ',';
  1648. timeArrStr = timeArrStr + add_time + "|";
  1649. myBrowseJson = myBrowseJson + '{"index_cd":"' + index_cd + '","add_time":"' + add_time + '"},';
  1650. }
  1651.  
  1652. // 保存当前页的json格式数据
  1653. GM_setValue(pageName + "_myBrowseJson" + result.finalUrl.split("page=")[1], myBrowseJson);
  1654. console.log("处理完url:" + location.origin + "/ja/" + pageName + ".php?&sort=added&page=" + PageNum);
  1655. resolve();
  1656. });
  1657. });
  1658. return promise1;
  1659. }
  1660. /**
  1661. * 合并json数据
  1662. * @param pageName 访问网页名
  1663. */
  1664. function mergeJson(pageName) {
  1665. // 读取访问指定网页的页数量
  1666. var p = GM_getValue(pageName + "_pageNum");
  1667. if (p > 0) {
  1668. GM_setValue(pageName + "_myBrowseJsonAll", "");
  1669. // 循环合并Json,以同步方式保存.
  1670. let loopMerge = async () => {
  1671. for (let i = 1; i < p; i++) {
  1672. let tempJson = GM_getValue(pageName + "_myBrowseJson" + i);
  1673. if (tempJson && tempJson !== "") {
  1674. await new Promise(resolve => {
  1675. GM_setValue(pageName + "_myBrowseJsonAll", GM_getValue(pageName + "_myBrowseJsonAll") + tempJson);
  1676. resolve();
  1677. })
  1678. }
  1679. }
  1680. };
  1681. return loopMerge().then(()=>{
  1682. console.log("doNum:" + (GM_getValue("doNum") + 1) + " --" +pageName);
  1683. GM_setValue("doNum", GM_getValue("doNum") + 1);
  1684. });
  1685. }
  1686. }
  1687. /**
  1688. * JSON数组去重
  1689. * @param: [array] json Array
  1690. * @param: [string] 唯一的key名,根据此键名进行去重
  1691. */
  1692. function uniqueArray(array, key, func) {
  1693. var result = [array[0]];
  1694. for (var i = 1; i < array.length; i++) {
  1695. var item = array[i];
  1696. var repeat = false;
  1697. for (var j = 0; j < result.length; j++) {
  1698. if (item[key] == result[j][key]) {
  1699. func(item, result[j]);
  1700. repeat = true;
  1701. break;
  1702. }
  1703. }
  1704. if (!repeat) {
  1705. result.push(item);
  1706. }
  1707. }
  1708. return result;
  1709. }
  1710.  
  1711. /**
  1712. * 添加movie信息到myMovie表中
  1713. * @param index_cd 索引编码(网页)
  1714. */
  1715. function addMovie(index_cd) {
  1716. let url = location.origin + "/ja/?v=" + index_cd;
  1717. let commonClass = Common;// 无此步骤Common作用域失效,暂时未知原因
  1718. let promise1 = request(url);
  1719. promise1.then((result) => {
  1720. if($.type(result) !== "function" && result === "wrong"){
  1721. return Promise.resolve();
  1722. }
  1723. let doc = result.responseText;
  1724. let movie_name = doc.substring(doc.search(/<title>/) + 7, doc.search(/ - JAVLibrary<\/title>/));
  1725. let movie_info = doc.substring(doc.search(/<table id="video_jacket_info">/), doc.search(/<div class="socialmedia">/));
  1726. movie_info = movie_info.replace("src", "hobbysrc");
  1727. let $doc = $(commonClass.parsetext(movie_info));
  1728. let movie = {};
  1729. //console.log($doc); // todo
  1730. movie.index_cd = result.finalUrl.split("v=")[1];
  1731. movie.code = $('.header', $doc)[0].nextElementSibling.textContent;
  1732. movie.release_date = $('#video_date .text', $doc).text();
  1733. movie.duration = $('#video_length .text', $doc).text();
  1734. movie.director = $('#video_director .text', $doc).text();
  1735. movie.maker = $('#video_maker .text', $doc).text();
  1736. movie.score = $('#video_review .text .score', $doc).text();
  1737. movie.actor = $('#video_cast .text', $doc).text();
  1738. movie.cover_img_url = $('#video_jacket_img', $doc).attr("hobbysrc").replace("//", "");
  1739. movie.thumbnail_url = movie.cover_img_url.replace("pl", "ps");
  1740. movie.movie_name = movie_name;
  1741. movie.publisher = $('#video_label .text a', $doc).text();
  1742. movie.add_time = (new Date()).Format("yyyy-MM-dd hh:mm:ss");
  1743. movie.is_browse = true;
  1744. movie.is_want = ($('#subscribed .smallbutton.hidden', $doc).length > 0) ? true : false;
  1745. movie.is_seen = ($('#watched .smallbutton.hidden', $doc).length > 0) ? true : false;
  1746. movie.is_have = ($('#owned .smallbutton.hidden', $doc).length > 0) ? true : false;
  1747.  
  1748. let myBrowseJsonArray = JSON.parse(GM_getValue("myBrowseAllData"));
  1749. let jsonObj = myBrowseJsonArray.filter((p) => {
  1750. return p.index_cd == result.finalUrl.split("v=")[1];
  1751. });
  1752. movie.add_time = jsonObj[0].add_time;
  1753. let row = myMovie.createRow(movie);
  1754. javDb.insertOrReplace().into(myMovie).values([row]).exec();
  1755. return Promise.resolve();
  1756. }).catch((e)=>{
  1757. console.log(e);//debugger;
  1758. });
  1759. return promise1;
  1760. }
  1761.  
  1762. /**
  1763. * javbus详情页磁链列表增加复制、115离线快捷键功能函数
  1764. */
  1765. function javbusUs() {
  1766. $('#magnet-table tbody tr td[colspan="4"]').attr("colspan","5");
  1767. let tr_array = $('#magnet-table tr[height="35px"]');
  1768. for (var i = 0; i < tr_array.length; i++) {
  1769. let trEle = tr_array[i];
  1770. //debugger;
  1771. let magnetUrl = $(trEle).find("td a")[0].href;
  1772. $(trEle).append("<td style='text-align:center;'><div><a class='nong-copy' href='" + magnetUrl + "'>复制</a></div></td>");
  1773. $(trEle).append("<td><div class='nong-offline'><a class='nong-offline-download' target='_blank' "
  1774. + "href='http://115.com/?tab=offline&amp;mode=wangpan'>115离线</a></div></td>");
  1775. $(trEle).attr("maglink", magnetUrl);
  1776. $(trEle).find(".nong-copy")[0].addEventListener('click', thirdparty.nong.magnet_table.handle_event, false);
  1777. $(trEle).find(".nong-offline-download")[0].addEventListener('click', thirdparty.nong.magnet_table.handle_event, false);
  1778. //.addEventListener('click', this.handle_event, false);
  1779. }
  1780. }
  1781.  
  1782. function saveData() {
  1783. GM_setValue("doNum", 0);//console.log("saveData");
  1784. let pm1 = mergeJson("mv_wanted");
  1785. let pm2 = mergeJson("mv_watched");
  1786. let pm3 = mergeJson("mv_owned");
  1787.  
  1788. Promise.all([pm1,pm2,pm3]).then(()=>{
  1789. console.log("mergeJson处理完毕");
  1790. if (GM_getValue("doNum") === 3) {
  1791. let j1 = GM_getValue("mv_wanted_myBrowseJsonAll");
  1792. let j2 = GM_getValue("mv_watched_myBrowseJsonAll");
  1793. let j3 = GM_getValue("mv_owned_myBrowseJsonAll");
  1794. //let myBrowseAll = j3.substring(0, j3.length - 1);
  1795. let myBrowseAll = j1 + j2 + j3.substring(0, j3.length - 1);
  1796. let myBrowseArray = JSON.parse("[" + myBrowseAll + "]");
  1797.  
  1798. myBrowseArray = uniqueArray(myBrowseArray, "index_cd", function (item, resultObj) {
  1799. if (item["add_time"] < resultObj["add_time"]) {
  1800. resultObj["add_time"] = item["add_time"];
  1801. }
  1802. });
  1803. GM_setValue("myBrowseAllData", JSON.stringify(myBrowseArray));
  1804. GM_setValue("myBrowseAllNum", myBrowseArray.length);//console.log(JSON.stringify(myBrowseArray));
  1805.  
  1806. let startTime = new Date();//console.log("startTime: " + startTime);
  1807. let b = GM_getValue(domain + "_stepTwo_V2", false);
  1808. if (!b) {
  1809. GM_setValue(domain + "_addMovieNum", 0);
  1810. // 创建请求队列 //浏览器对同一域名进行请求的最大并发连接数:chrome为6
  1811. let queue2 = new Queue(7);
  1812. // 循环数组,将请求数据数组全部添加到并发处理队列中,然后并发执行指定数量的多线程.
  1813. for (let i = 0; i < myBrowseArray.length; i++) {
  1814. let jsonObj = myBrowseArray[i];
  1815. queue2.push(function(){
  1816. let defer = $.Deferred();
  1817. javDb.select().from(myMovie).where(myMovie.index_cd.eq(jsonObj.index_cd)).exec()
  1818. .then((results)=>{
  1819. let log = ()=>{
  1820. console.log(domain + "_addmovieNum:" + (GM_getValue(domain + "_addMovieNum") + 1));
  1821. GM_setValue(domain + "_addMovieNum", (GM_getValue(domain + "_addMovieNum") + 1));
  1822. };
  1823. if (results.length == 0){
  1824. return addMovie(jsonObj.index_cd).then(()=>{
  1825. log();
  1826. defer.resolve();
  1827. return Promise.resolve();
  1828. });
  1829. }
  1830. else {
  1831. log();
  1832. defer.resolve();
  1833. return Promise.resolve();
  1834. }
  1835. });
  1836. return defer.promise();
  1837. });
  1838. }
  1839. var s4 = setInterval(function () {
  1840. if(GM_getValue(domain + "_addMovieNum",0) == myBrowseArray.length){
  1841. console.log(domain + "_stepTwoTime:" + (new Date() - startTime));
  1842. //alert(domain + "_stepTwoTime:" + (new Date() - startTime));
  1843. //GM_setValue(domain + "_stepTwo_V2", true); // todo 需使用
  1844. GM_setValue(domain + "_doDataSyncStepAll_V2", true); // todo 需使用
  1845. clearInterval(s4);
  1846. }
  1847. }, 500);
  1848. }
  1849. }
  1850. });
  1851. }
  1852. /**
  1853. * 针对页面的番号信息增加功能及样式修改. javlib和javbus共同使用
  1854. * @returns {string} 番号
  1855. */
  1856. function getAvidAndChgPage() {
  1857. let AVID = $('.header')[0].nextElementSibling.textContent;
  1858. // 实现点击番号复制到系统剪贴板 todo 181221v1
  1859. $('.header')[0].nextElementSibling.id = "avid";
  1860. $('#avid').empty().attr("title", "点击复制番号").attr("avid", AVID);
  1861. let a_avid = document.createElement('a');
  1862. $(a_avid).attr("href", "#").append(AVID);
  1863. $(a_avid).click(function () {
  1864. GM_setClipboard($('#avid').attr("avid"));
  1865. });
  1866. $('#avid').append(a_avid);
  1867. $('#avid').after("<span style='color:red;'>(←点击复制)</span>");
  1868. $($('.header')[0]).attr("class", "header_hobby");
  1869. return AVID;
  1870. }
  1871.  
  1872. function waterfallButton() {
  1873. // 瀑布流ui按钮
  1874. let a3 = document.createElement('a');
  1875. (waterfallScrollStatus > 0) ? $(a3).append('关闭瀑布流&nbsp;&nbsp;') : $(a3).append('开启瀑布流&nbsp;&nbsp;');
  1876. $(a3).css({
  1877. "color": "blue",
  1878. "font": "bold 12px monospace"
  1879. });
  1880. $(a3).attr("href", "#");
  1881. $(a3).click(function () {
  1882. if ((/关闭/g).test($(this).html())) {
  1883. //$(this).html('&nbsp;&nbsp;开启瀑布流');
  1884. GM_setValue('scroll_status', 0);
  1885. } else {
  1886. //$(this).html('&nbsp;&nbsp;关闭瀑布流');
  1887. GM_setValue('scroll_status', 1);
  1888. }
  1889. window.location.reload();
  1890. });
  1891. return a3;
  1892. }
  1893.  
  1894. function javlibaryScript() {
  1895. let a3 = waterfallButton();
  1896. if ((/(JAVLibrary)/g).test(document.title)) {
  1897. //数据库初始化 start01
  1898. var pm_mater = Common.getSchemaBuilder().connect({
  1899. storeType: lf.schema.DataStoreType.INDEXED_DB
  1900. }).then(function (database) {
  1901. javDb = database;
  1902. myMovie = javDb.getSchema().table('MyMovie');
  1903. //javDb.delete().from(myMovie).exec();// 清空MyMovie表数据.
  1904. return javDb.select().from(myMovie).where(myMovie.is_browse.eq(true)).exec();
  1905. }).then(function (results) {
  1906. console.log("已经保存已阅影片数量:" + results.length);
  1907. // results.forEach(function(row) {
  1908. // console.log(row['index_cd'],'|',row['code'],'|', row['add_time'],'|',row['movie_name']);
  1909. // });
  1910. if (document.URL.indexOf("bestrated") > 0) {
  1911. $(".left select").after("<a href='/cn/vl_bestrated.php?deleteTwoMonthAway' class='hobby-a'>&nbsp;&nbsp;只看近两月份</a>");
  1912. $(".left select").after("<a href='/cn/vl_bestrated.php?deleteOneMonthAway' class='hobby-a'>&nbsp;&nbsp;只看当前月份</a>");
  1913. $(".left select").after("<a href='/cn/vl_bestrated.php?filterMyBrowse' class='hobby-a'>&nbsp;&nbsp;不看我阅览过(上个月)</a>");
  1914. $(".left select").after("<a href='/cn/vl_bestrated.php?filterMyBrowse&mode=2' class='hobby-a'>&nbsp;&nbsp;不看我阅览过(全部)</a>");
  1915. //todo
  1916. } else if (document.URL.indexOf("vl_newrelease") > 0 || document.URL.indexOf("vl_update") > 0
  1917. || document.URL.indexOf("vl_genre") > 0 || document.URL.indexOf("vl_mostwanted") > 0) {
  1918. $(".displaymode .right").prepend("<a href='" + document.location.origin + document.location.pathname
  1919. + "?delete9down" + document.location.search.replace('?', '&') + "' class='hobby-a'>只看9分以上&nbsp;&nbsp;</a>");
  1920. $(".displaymode .right").prepend("<a href='" + document.location.origin + document.location.pathname
  1921. + "?delete8down" + document.location.search.replace('?', '&') + "' class='hobby-a'>只看8分以上&nbsp;&nbsp;</a>");
  1922. $(".displaymode .right").prepend("<a href='" + document.location.origin + document.location.pathname
  1923. + "?delete7down" + document.location.search.replace('?', '&') + "' class='hobby-a'>只看7分以上&nbsp;&nbsp;</a>");
  1924. }
  1925.  
  1926. if ((/(bestrated|newrelease|newentries|vl_update|mostwanted|vl_star)/g).test(document.URL) ||
  1927. (/(vl_genre|vl_searchbycombo|mv_owned|mv_watched|mv_wanted|mv_visited)/g).test(document.URL)||
  1928. (/(vl_label|vl_maker|vl_director|vl_searchbyid|userwanted|userowned)/g).test(document.URL)) {
  1929.  
  1930. // 指定站点页面加入瀑布流控制按钮
  1931. $(".displaymode .right").prepend($(a3));
  1932.  
  1933. // 瀑布流脚本
  1934. thirdparty.waterfallScrollInit();
  1935.  
  1936. let a1 = document.createElement('a');
  1937.  
  1938. $(a1).append('按评分排序&nbsp;&nbsp;');
  1939. $(a1).css({
  1940. "color": "blue",
  1941. "font": "bold 12px monospace"
  1942. });
  1943. $(a1).attr("href", "#");
  1944. $(a1).click(function () {
  1945. let div_array = $("div.videos div.video");
  1946. div_array.sort(function (a, b) {
  1947. //debugger;
  1948. let a_score = parseFloat($(a).children("a").attr("score"));
  1949. let b_score = parseFloat($(b).children("a").attr("score"));
  1950. if (a_score > b_score) {
  1951. return -1;
  1952. } else if (a_score === b_score) {
  1953. return 0;
  1954. } else {
  1955. return 1;
  1956. }
  1957. });
  1958. // 删除Dom列表数据关系,重新添加排序数据
  1959. div_array.detach().appendTo("#waterfall");
  1960. });
  1961.  
  1962. let a2 = $(a1).clone();
  1963. $(a2).html('按时间排序&nbsp;&nbsp;');
  1964. $(a2).click(function () {
  1965. let div_array = $("div.videos div.video");
  1966. div_array.sort(function (a, b) {
  1967. let a_time = new Date($(a).children("a").attr("release_date").replace(/-/g, "\/")).getTime();
  1968. let b_time = new Date($(b).children("a").attr("release_date").replace(/-/g, "\/")).getTime();
  1969. let a_score = parseFloat($(a).children("a").attr("score"));
  1970. let b_score = parseFloat($(b).children("a").attr("score"));
  1971. if (a_time > b_time) {
  1972. return -1;
  1973. } else if (a_time === b_time) {
  1974. return (a_score > b_score) ? -1 : 1;
  1975. } else {
  1976. return 1;
  1977. }
  1978. });
  1979.  
  1980. // 删除Dom列表数据关系,重新添加排序数据
  1981. div_array.detach().appendTo("#waterfall");
  1982. });
  1983. $(".displaymode .right").prepend($(a2));
  1984. $(".displaymode .right").prepend($(a1));
  1985. }
  1986. });
  1987. //JavWebSql.DBinit();
  1988. if ($('a[href="myaccount.php"]').length) {
  1989. // 已经登录
  1990. // 从未同步过,同步云数据到本地数据库
  1991. let isSync = GM_getValue(domain + "_doDataSyncStepAll_V2", false);
  1992. console.log(domain + " 是否同步过:" + isSync);
  1993. if (!isSync) {
  1994. pm_mater.then(() => {
  1995. return new Promise(resolve => {
  1996. var hasStepOne = GM_getValue(domain + "_stepOne_V2", false);
  1997. let stepOneStartTime = new Date();
  1998. console.log(domain + " 同步是否完成第一步:" + hasStepOne);
  1999. if (!hasStepOne) {
  2000. // 立即下载数据
  2001. GM_setValue("mv_wanted_pageNum", 0);
  2002. GM_setValue("mv_watched_pageNum", 0);
  2003. GM_setValue("mv_owned_pageNum", 0);
  2004.  
  2005. //start02 todo lovefieldDB
  2006. // 创建请求队列 //浏览器对同一域名进行请求的最大并发连接数:chrome为6
  2007. let queue = new Queue(7);
  2008. // 读取想要的影片
  2009. loadData("mv_wanted", queue);
  2010. // 读取看过的影片
  2011. loadData("mv_watched", queue);
  2012. // 读取拥有的影片
  2013. loadData("mv_owned", queue);
  2014. // 延迟1秒运行定时循环函数
  2015. setTimeout(() => {
  2016. // 定时循环函数,当队列执行完成时结束
  2017. var s4 = setInterval(function () {
  2018. //console.log("queue.taskList.length : " + queue.taskList.length);
  2019. if (queue.taskList.length == 0) {
  2020. let end_num = 0;
  2021. for (let i = 0, l = queue.threads.length; i < l; i++) {
  2022. if (queue.threads[i].promise.state() === 'resolved') {
  2023. end_num++;
  2024. }
  2025. }
  2026. if (end_num == queue.threads.length) {
  2027. GM_setValue(domain + "_stepOne_V2", true); // todo 需打开
  2028. console.log(domain + "_stepOneTime:" + (new Date() - stepOneStartTime));
  2029. //alert(location.host + "_stepOneTime:" + (new Date() - stepOneStartTime));
  2030. clearInterval(s4);
  2031. resolve();
  2032. }
  2033. }
  2034. }, 300);
  2035. }, 1000);
  2036. } else {
  2037. resolve();
  2038. }
  2039. });
  2040. }).then(() => {
  2041. saveData();
  2042. }
  2043. );
  2044. }
  2045. // 增加同步数据到本地的触发按钮
  2046. }
  2047.  
  2048. //获取番号影片详情页的番号 例如:http://www.javlibrary.com/cn/?v=javli7j724
  2049. if ($('.header').length && $('meta[name="keywords"]').length) {
  2050. let AVID = getAvidAndChgPage();
  2051. $('#video_title h3').html($('#video_title a').html());
  2052. window.onload = function () {
  2053. $('iframe').remove();
  2054.  
  2055. };
  2056.  
  2057. // 只支持javlibray处理已阅影片
  2058. let movie = {};
  2059. movie.index_cd = location.search.split("=")[1];
  2060. movie.code = AVID;
  2061. movie.release_date = $('#video_date .text').text();
  2062. movie.duration = $('#video_length .text').text();
  2063. movie.director = $('#video_director .text').text();
  2064. movie.maker = $('#video_maker .text').text();
  2065. movie.score = $('#video_review .text .score').text();
  2066. movie.actor = $('#video_cast .text').text();
  2067. movie.cover_img_url = $('#video_jacket_img').attr("src").replace("//", "");
  2068. movie.thumbnail_url = movie.cover_img_url.replace("pl", "ps");
  2069. movie.movie_name = $('#video_title a').text();
  2070. movie.publisher = $('#video_label .text a').text();
  2071. movie.add_time = (new Date()).Format("yyyy-MM-dd hh:mm:ss");
  2072. movie.is_browse = true;
  2073. movie.is_want = ($('#subscribed .smallbutton.hidden').length > 0) ? true : false;
  2074. movie.is_seen = ($('#watched .smallbutton.hidden').length > 0) ? true : false;
  2075. movie.is_have = ($('#owned .smallbutton.hidden').length > 0) ? true : false;
  2076. pm_mater.then(() => {
  2077. //查找是否存在此番号数据
  2078. return javDb.select().from(myMovie).where(myMovie.index_cd.eq(movie.index_cd)).exec()
  2079. .then((results) => {
  2080. if (results.length > 0) {
  2081. movie.add_time = results[0].add_time;
  2082. }
  2083. let row = myMovie.createRow(movie);
  2084. javDb.insertOrReplace().into(myMovie).values([row]).exec();
  2085. });
  2086. });
  2087.  
  2088. //查找115是否有此番号
  2089. Common.search115Data(AVID, function (BOOLEAN_TYPE, playUrl) {
  2090. if (BOOLEAN_TYPE) {
  2091. let $imgObj = $('#video_jacket_img');
  2092. $imgObj.after(`
  2093. <div style="position: absolute;width: 100%;height: 12%;background: rgba(0,0,0,0.5);top: 88%;left: 0;">
  2094. <p style="color: white;font-size: 46px;margin: 0 0 0px;display: inline-block;text-align: left;">115网盘已拥有此片</p>
  2095. <a target="_blank" href="${playUrl}">
  2096. <p style="color: white;font-size: 46px;margin: 0 0 0px;display: inline-block;text-align: right;width: 50%;">115在线播放 ►</p></a>
  2097. </div>
  2098. `);
  2099. }
  2100. console.log("番号输出:" + AVID);
  2101. Common.addAvImg(AVID, function ($img) {
  2102. // http://www.javlibrary.com/cn/?v=javlilzo4e
  2103. let divEle = $("div[id='video_title']")[0]; // todo 190604
  2104. if (divEle) {
  2105. $(divEle).after(
  2106. '<div style="width: 100%;height: 100%;display: inline-block;margin: 0px 0px 0px 0px;">' +
  2107. '<div id="hobby_div_left" style="float: left;min-width: 60%;"></div>' +
  2108. '<div id="hobby_div_right" style="float: left;min-width: 66px;"></div>' +
  2109. '</div>'
  2110. );
  2111. $('#hobby_div_left').append($('#video_jacket_info'));
  2112. $('#hobby_div_left').append($('#video_favorite_edit'));
  2113. $('#hobby_div_right').append($img);
  2114. $img.click(function () {
  2115. $(this).toggleClass('min');
  2116. if ($(this).attr("class")) {
  2117. this.parentElement.parentElement.scrollIntoView();
  2118. }
  2119. });
  2120. }
  2121. }, !BOOLEAN_TYPE);
  2122. });
  2123.  
  2124. // 挊
  2125. thirdparty.nong.searchMagnetRun();
  2126. }//番号影片详情页处理end
  2127. }
  2128. }
  2129.  
  2130. function javBusScript() {
  2131. let a3 = waterfallButton();
  2132. if ((/(JavBus|AVMOO|AVSOX)/g).test(document.title) || $("footer:contains('JavBus')").length) {
  2133. // 指定站点页面加入瀑布流控制按钮
  2134. let li_elem = document.createElement('li');
  2135. $(li_elem).append($(a3));
  2136. // JavBus
  2137. $(".visible-md-block").closest(".dropdown").after($(li_elem));
  2138. // AVMOO|AVSOX
  2139. $(".active").closest(".navbar-nav").append($(li_elem));
  2140.  
  2141. // 瀑布流脚本
  2142. thirdparty.waterfallScrollInit();
  2143.  
  2144. //获取番号影片详情页的番号 例如:https://www.javbus.com/AVVR-323
  2145. if ($('.header').length && $('meta[name="keywords"]').length) {
  2146. let AVID = getAvidAndChgPage();
  2147.  
  2148. //查找115是否有此番号
  2149. Common.search115Data(AVID, function (BOOLEAN_TYPE, playUrl) {
  2150. if (BOOLEAN_TYPE) {
  2151. let $imgObj = $('.bigImage');
  2152. $imgObj.after(`
  2153. <div style="position: absolute;width: 100%;height: 12%;background: rgba(0,0,0,0.5);top: 88%;left: 0;">
  2154. <p style="color: white;font-size: 46px;margin: 0 0 0px;display: inline-block;text-align: left;">115网盘已拥有此片</p>
  2155. <a target="_blank" href="${playUrl}">
  2156. <p style="color: white;font-size: 46px;margin: 0 0 0px;display: inline-block;text-align: right;width: 50%;">115在线播放 ►</p></a>
  2157. </div>
  2158. `);
  2159. }
  2160. console.log("番号输出:" + AVID);
  2161. Common.addAvImg(AVID, function ($img) {
  2162. //https://www.javbus.com/CHN-141
  2163. let divEle = $("div[class='col-md-3 info']")[0];
  2164. $(divEle).attr("id", "video_info");
  2165. if (divEle) {
  2166. $(divEle.parentElement).append($img);
  2167. $img.click(function () {
  2168. $(this).toggleClass('min');
  2169. if ($(this).attr("class")) {
  2170. this.parentElement.parentElement.scrollIntoView();
  2171. }
  2172. });
  2173. }
  2174. }, false);//javbus 默认不放大
  2175. });
  2176.  
  2177. thirdparty.busTypeSearch();
  2178. // 加入javlibry的跳转链接
  2179. $('.col-md-3.info').append(`<a href="http://www.javlibrary.com/cn/vl_searchbyid.php?keyword=${AVID}" style="color: rgb(204, 0, 0);">JavLibrary&nbsp;</a>`);
  2180. // 修改javbus磁链列表头,增加两列
  2181. $('#magnet-table tbody tr').append('<td style="text-align:center;white-space:nowrap">操作</td><td style="text-align:center;white-space:nowrap">离线下载</td>');
  2182. // 先执行一次,针对已经提前加载出磁链列表结果时有效
  2183. javbusUs();
  2184. // 针对为提前加载出磁链列表结果,通过dom元素是否改变事件来判断是否执行功能。
  2185. $('#magnet-table').on("DOMNodeInserted", function () {
  2186. // 触发后关闭监听事件
  2187. $('#magnet-table').off();
  2188. javbusUs();
  2189. });
  2190.  
  2191. // 挊
  2192. thirdparty.nong.searchMagnetRun();
  2193. }
  2194. }
  2195. }
  2196.  
  2197. function oneJavScript() {
  2198. if ((/(OneJAV)/g).test(document.title)) { //todo 190404
  2199. GM_addStyle(`
  2200. .min {width:66px;min-height: 233px;height:auto;cursor: pointer;} /*Common.addAvImg使用*/
  2201. .column.is-5 {width: auto;max-width: 82%;}
  2202. .column {flex-basis: inherit;flex-grow: inherit;}
  2203. .container {max-width: 100%;width: 100%;}
  2204. .image {width: 800px;}
  2205. .has-text-grey-dark {max-width: 1000px;}
  2206. `);
  2207. // 插入自己创建的div
  2208. $('div.container nav.pagination.is-centered').before("<div id='card' ></div>");
  2209. // 将所有番号内容移到新建的div里
  2210. $('div#card').append($('div.container div.card.mb-3'));
  2211. // 瀑布流脚本
  2212. thirdparty.waterfallScrollInit();
  2213. }
  2214. }
  2215.  
  2216. function jav321Script() {
  2217. if ((/(jav321)*\/video\/*/g).test(document.URL)) { //todo 190531
  2218. GM_addStyle(`
  2219. .min {width:66px;min-height: 233px;height:auto;cursor: pointer;} /*Common.addAvImg使用*/
  2220. .col-md-3 {width: 20%;padding-left: 18px; padding-right: 2px;}
  2221. .col-xs-12,.col-md-12 {padding-left: 2px; padding-right: 0px;}
  2222. .col-md-7 {width: 79%;padding-left: 2px;padding-right: 0px;}
  2223. .col-md-9 {width: max-content;}
  2224. .col-md-offset-1 {margin-left: auto;}
  2225. .hobby {display: inline-block;float: left;}
  2226. .hobby_mov {width: 75%;}
  2227. .hobby_p {color: white;font-size: 40px;margin: 0 0 0px;display: inline-block;text-align: right;width: 100%;}
  2228. `);
  2229. $(".col-md-7.col-md-offset-1.col-xs-12 .row .col-md-3 .img-responsive:eq(0)").offsetParent().attr("class", "hobby");
  2230. $("#video_overlay_sample").offsetParent().attr("class", "hobby_mov");
  2231. // 调整div位置
  2232. $('div.col-md-7.col-md-offset-1.col-xs-12').before($('div.col-xs-12.col-md-12')[0].parentElement);
  2233.  
  2234. let meta = $('small')[0];
  2235. let arr = meta.textContent.split(" ");
  2236. let javID = arr[0];
  2237.  
  2238. //查找115是否有此番号
  2239. Common.search115Data(javID, function (BOOLEAN_TYPE, playUrl) {
  2240. if (BOOLEAN_TYPE) {
  2241. let $imgObj = $('div.col-xs-12.col-md-12 img.img-responsive');
  2242. $imgObj.after(`
  2243. <div style="position: absolute;width: 100%;height: 22%;background: rgba(0,0,0,0.5);top: 78%;left: 0;">
  2244. <a target="_blank" href="${playUrl}"><p class="hobby_p">115在线播放 ►</p></a>
  2245. </div>
  2246. `);
  2247. }
  2248.  
  2249. //插入预览图
  2250. Common.addAvImg(javID, function ($img) {
  2251. //https://www.jav321.com/video/300mium-391
  2252. var divEle = $("div.col-md-9")[0];
  2253. //$(divEle).attr("id", "video_info");
  2254. if (divEle) {
  2255. $(divEle).after($img);
  2256. $img.click(function () {
  2257. $(this).toggleClass('min');
  2258. if ($(this).attr("class")) {
  2259. this.parentElement.parentElement.scrollIntoView();
  2260. }
  2261. });
  2262. }
  2263. }, !BOOLEAN_TYPE);
  2264. });
  2265.  
  2266. // 修改jav321磁链列表头,增加两列
  2267. $('table.table.table-striped tbody tr:eq(0)').append('<th>操作</th><th>离线下载</th>');
  2268.  
  2269. //详情页磁链列表增加复制、115离线快捷键功能函数
  2270. let tr_array = $('table.table.table-striped tbody tr:gt(0)');
  2271. for (var i = 0; i < tr_array.length; i++) {
  2272. let trEle = tr_array[i];
  2273. //debugger;
  2274. let magnetUrl = $(trEle).find("td a")[0].href;
  2275. $(trEle).append(`
  2276. <td style='text-align:center;'><div><a class='nong-copy' href='${magnetUrl}'>复制</a></div></td>
  2277. <td><div class='nong-offline'>
  2278. <a class='nong-offline-download' target='_blank' href='http://115.com/?tab=offline&amp;mode=wangpan'>115离线</a>
  2279. </div></td>
  2280. `);
  2281. $(trEle).attr("maglink", magnetUrl);
  2282. $(trEle).find(".nong-copy")[0].addEventListener('click', thirdparty.nong.magnet_table.handle_event, false);
  2283. $(trEle).find(".nong-offline-download")[0].addEventListener('click', thirdparty.nong.magnet_table.handle_event, false);
  2284. //.addEventListener('click', this.handle_event, false);
  2285. }
  2286. }
  2287. }
  2288.  
  2289. function mainRun() {
  2290. if ((/(JAVLibrary|JavBus|AVMOO|AVSOX)/g).test(document.title) || $("footer:contains('JavBus')").length){
  2291. GM_addStyle(`
  2292. .min {width:66px;min-height: 233px;height:auto;cursor: pointer;} /*Common.addAvImg使用*/
  2293. .container {width: 100%;float: left;}
  2294. .col-md-3 {float: left;max-width: 260px;}
  2295. .col-md-9 {width: inherit;}
  2296. .hobby-a {color: red; font: bold 12px monospace;} /*javlib*/
  2297. .footer {padding: 20px 0;background: #1d1a18;float: left;} /*javbus*/
  2298. #nong-table-new {margin: initial !important;important;color: #666 !important;font-size: 13px;text-align: center;background-color: #F2F2F2;float: left;}
  2299. .header_hobby {font-weight: bold;text-align: right;width: 75px;} /*javbus*/
  2300. `);
  2301.  
  2302. //获取所有番号影片链接的a元素
  2303. var a_array = $("div[class='item'] a");
  2304. for (var index = 0; index < a_array.length; index++) {
  2305. var aEle = a_array[index];
  2306. $(aEle).attr("target", "_blank");
  2307. }
  2308.  
  2309. javlibaryScript();
  2310. javBusScript();
  2311. }
  2312.  
  2313. oneJavScript();
  2314. jav321Script();
  2315. thirdparty.login115Run();
  2316. }
  2317. mainRun();
  2318. })();