├── 115helper_icon_001.jpg ├── JavOldDriver.user.js ├── LICENSE └── README.md /115helper_icon_001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hobbyfang/javOldDriver/44de9055f9b294a1920620cbef7b37eb1866b833/115helper_icon_001.jpg -------------------------------------------------------------------------------- /JavOldDriver.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name JAV老司机 3 | // @namespace https://sleazyfork.org/zh-CN/users/25794 4 | // @version 3.8.9 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://lib.baomitu.com/jquery/2.2.4/jquery.min.js 11 | // @require https://lib.baomitu.com/lovefield/2.1.12/lovefield.min.js 12 | // @require https://lib.baomitu.com/limonte-sweetalert2/9.17.2/sweetalert2.all.min.js 13 | // @require https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js 14 | // @require https://cdn.jsdelivr.net/npm/lovefield@2.1.12/dist/lovefield.min.js 15 | // @require https://cdn.jsdelivr.net/npm/sweetalert2@9.17.2/dist/sweetalert2.all.min.js 16 | // @resource icon https://cdn.jsdelivr.net/gh/hobbyfang/javOldDriver@master/115helper_icon_001.jpg 17 | 18 | // javlib主要有码jav资源、排行榜、点评,最新地址在github.com/javlibcom 19 | // @include *://*javlibrary.com/* 20 | // @include *://*javlib.com/* 21 | // @include *://*o83h.com/* 22 | // @include *://*r86m.com/* 23 | 24 | // javbus有无码jav资源、论坛 25 | // @include *://*javbus.com/* 26 | // @include *://www.*bus*/* 27 | // @include *://www.*javsee*/* 28 | // @include *://www.*seejav*/* 29 | 30 | // onejav有FC2资源、排行榜 31 | // @include *://*onejav.com/* 32 | 33 | // avsox有无码jav资源,含FC2 tellme.pw/avsox 34 | // @include *://*avsox.*/* 35 | 36 | // jav321有素人资源、排行榜 37 | // @include *://*jav321.com/video/* 38 | 39 | // javdb有各资源排行榜,但部分需付费 javdb.com 40 | // @include *://*javdb*.com/* 41 | 42 | // @include *://*javstore.*/* 43 | // @include *://*avmoo.*/* 44 | // @include ://tellme.pw/avmoo 45 | // @include *://115.com/* 46 | // @include *://*.quark.cn/list* 47 | // @include *://www.*dmm*/* 48 | 49 | // @run-at document-idle 50 | // @grant GM_xmlhttpRequest 51 | // @grant GM_addStyle 52 | // @grant GM_getValue 53 | // @grant GM_setValue 54 | // @grant GM_deleteValue 55 | // @grant GM_notification 56 | // @grant GM_setClipboard 57 | // @grant GM_getResourceURL 58 | // @grant GM_registerMenuCommand 59 | // @grant GM_info 60 | // @grant GM_openInTab 61 | 62 | // @connect * 63 | // @copyright hobby 2016-12-18 64 | // @license GPL-3.0 65 | // @compatible chrome V52+ & Tampermonkey 66 | 67 | // 大陆用户推荐Chrome(V52+) + Tampermonkey(必须扩展) + Clash/V2ray(代理) + Proxy SwitchyOmega(扩展)的环境下配合使用。 68 | // 上车请使用chrome浏览器,其他浏览器的问题本人不支持发现和修复相关问题。 69 | 70 | // 注意:2.0在每个版本号更新后,javlibrary每个不同域名站点在登录javlibrary的情况下,都会分别首次运行此脚本。 71 | // 根据电脑性能及访问网速情况不同,正常能在1分钟以内(以5000个车牌量为例)缓存个人数据到本地浏览器中. 72 | // 此目的用于过滤个人已阅览过的内容提供快速判断,目前个人图书馆账号的想要、看过、拥有及最新浏览过的番号为已阅数据依据。 73 | // 目前在同步过程中如果浏览器当前页面不在javlibrary站点或者浏览器在后台,同步会被暂停或中止,需注意. 74 | // 如果不登录javlibrary或同版本号已经同步过,就不会运行同步,那么则无此影响. 75 | 76 | // 油猴脚本技术交流:https://t.me/+TgfN6vLVRew7aMWt 77 | 78 | // 已知问题:javlib加了Cloudflare防御,目前更新版本利用新网址列表功能已经复活8成以上,代价是2秒左右刷新一个列表的番号。目前只能这样了。 79 | // 如有更优方案,可留言反馈。另外blogjav站已经能访问了,但新番号基本无预览图了,就做一个备用预览大图源吧。 80 | 81 | // v3.8.9 优化预览图加载顺序,优化预览图加载问题。 82 | // v3.8.8 修复javlib加了Cloudflare防御导致列表功能失效问题。 83 | // v3.8.7 修复部分页面预览图失效的问题。javlib新增了FC2菜单跳转(onejav)。 84 | 85 | // v3.8.6 增加了115离线成功,3秒后刷新当前页面。修复了磁力列表下javdb查找问题。 86 | // v3.8.5 增加javdb影片详情页的115离线快捷键及115在线播放入口(by Stel000)。修复因新版chrome中DOMNodeInserted事件废弃导致无法离线下载问题。 87 | // v3.8.4 修复了javlib同步问题。修复了115网盘关联视频问题。 88 | // v3.8.3 修复javstore22年12月番号视频内容预览大图改版前后的图片获取及显示兼容问题。解决获取dmm评价数据受18岁询问限制。 89 | // v3.8.2 修复javstore番号页图片显示问题,修复javstore备用预览图失效的问题。 90 | // v3.8.1 javlib、javbus、javdb新增了VR菜单入口,javbus新增了FC2菜单跳转,javdb修改了FC2菜单内容(需登录)。修复了已知问题。 91 | // v3.8.0 增加各Jav站点番号浏览记录缓存。增加javbus、javdb列表阅览番号标色。增加夸克在线播放的关联入口,夸克在线播放页排版调整。 92 | // 优化dmm评分数据获取,多数番号突破dmm地区访问限制。代码调整优化。修复了已知问题。 93 | 94 | // v3.7.1 再优化blogjav预览图获取方式,优化预览图加载时间。修复了已知问题。 95 | // v3.7.0 增加javdb列表的JAV评分排序、屏蔽指定评分人数功能。优化blogjav预览图获取方式。 96 | 97 | // v3.6.0 原番号页面增加dmm、javdb评分展示及在线播放跳转、JAV跳转,增加javstore番号页改造,增加javdb瀑布流及列表增加JAV跳转和排版优化。 98 | // 原javlib番号页面自带预览图可点击查看,onejav列表简单优化,其他已知bug修复,部分代码优化。 99 | 100 | // v3.5.2 修复部分地区无法访问脚本依赖库问题,重新梳理匹配脚本域名作用地址。 101 | // v3.5.1 修复javdb站源的磁力搜索,增加jav磁链地址的修改入口。 102 | // v3.5.0 图书馆jav列表“按评分排序”升级为“按【VR】+评分排序”,VR标题增加背景颜色区分。 103 | // v3.4.0 针对JVR影片查找资源的需求,结合javlib站的进阶搜寻中多重搜寻来过滤VR资源,增加了javdb站做为jav磁链接下载来源。 104 | // 修复了预览图失效的问题。 105 | // v3.3.3 预览图备用站更换成javstore。 106 | // v3.3.0 新增图书馆浏览时根据115在线播放来同步图书馆的已拥有功能(建议登录,不然会弹窗提示)。 107 | // v3.2.0 新增javarchive站的预览图做备用,当blogjav预览图无法正常读取时使用。 108 | // 优化图书馆缓存个人数据的同步效率(60秒内可完成)。优化图书馆站点瀑布流列表排版。修复了部分115在线播放查找识别问题。 109 | // v3.1.7 增加脚本设置功能,支持磁链地址失效可自己更换。更新最新磁链地址。 110 | // v3.1.6 更换失效的磁链地址。另btdig,nayy,torrentkitty站点需科学上网,其中btdig还需手工验证非机器访问。 111 | // v3.1.5 增加过滤评分及排序时排除10分的番号,更换失效的磁链地址。 112 | // v3.1.0 优化javbus/avmoo/avsox瀑布流排版。 113 | // v3.0.0 增加115在线播放的关联入口。同时本代码重新梳理及优化。 114 | 115 | // v2.3.0 增加jav321网站内容排版的支持,增加查找已登录115网盘是否拥有当前番号显示。 116 | // v2.2.0 增加onejav网站内容排版的支持,热门Jav预览搜集更省时省力。更换两个磁链资源新地址。 117 | // v2.1.5 增加点击番号完成复制功能。 118 | // v2.1.3 增加btdigg磁链资源站点。修复了已知问题。 119 | // v2.1.1 增加jav站点瀑布流控制按钮功能。 120 | // v2.1.0 增加javbus站内磁链列表的复制、115离线的快捷键功能。 121 | 122 | // v2.0.7 增加一种情况Jav列表排序功能支持(仅javlib)。 123 | // v2.0.5 增加Jav列表“按评分排序”、“按时间排序”功能(仅javlib),及更新Jav站点域名。 124 | // v2.0.0 增加自动同步个人数据缓存到本地,jav列表能识别个人已阅览过的内容(需登录javlibray),针对javlibrary的高评价栏目,增加过滤"不看我阅览过"功能。 125 | 126 | // v1.2.0 针对javlibrary的高评价栏目,增加过滤“只看当前月份”、“只看近两月份”功能。另默认此栏目近两月份的内容增加背景颜色区分。 127 | // v1.2.0 更新了合成“挊”脚本的更多网站的支持,感谢作者thunderhit,同时修复原脚本部分网站功能失效问题。 128 | // v1.1.0 优化更新了JAV列表无限滚动自动加载的代码,增加JAV列表中显示"发行日期"和"评分"的排版,以及修复了已知问题。 129 | // v1.0.3 优化了高清预览大图的获取。 130 | // v1.0.2 优化了javlibrary排版,做了最低分辨率1280x800的排版适配调整,及修复了已知问题。 131 | // v1.0.0 支持javlibrary.com、javbus.com、avmo.pw、avso.pw等老司机站点,第一版发布。 132 | 133 | // ==/UserScript== 134 | /* jshint -W097 */ 135 | (function () { 136 | 'use strict'; 137 | const EMPTY_IMAGE_DATA = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAB4CAMAAABsOSjPAAAAn1BMVEUAAAD/lgD/x3f/zoj/nRH/3Kr/+e7/sD//68z/1Zj/qzP/skT/uVX/9eX/pCL/oh3/wGb/8d3/4LL/5Lv/2aL/tUv/kAD/0o//9uj/v2L/mQn//vv//Pf/rjf/+vL/1pn/2pT/mAX/kwD/+/X/9OH/4rb/qzD/qSX/mAH/6sn/6cL/26f/y4D/nxr/vV7/uU//wnH/7tb/1YX/wEL/nypWdfcGAAAAAXRSTlMAQObYZgAABOdJREFUeNrs2F1TgkAYhmGeRMRWLbDlS5BAUPysqf7/b6sYt600dQ8a3nW4T3Teo2uWHRYw2tquMOiU5mhDl64ADR36jdZhsVv0X7XoFn2iFt2iT9Si/wG93AxY73Q8fLAooW2GizI7MRm0j4tLCiJoBTPyN4sE2s6h0o4EmkMprySAXmaK6CcC6A0UG1nNowdQLFo2j2aQmTxMKpyrbB7dk5rd54VfLXAmlxI6NOqKrUZocygOG43QXEycSB90KCZTUx90Mvk6bvRBV+P95F6jPY1RUQ9SrW55uPOdqR3id3kUEUYDkZkdmu8da731KrLoI3mPxkfDV486Ovthrps800aPUrs7l2ZR6uV00XPrc2GZMMtWC7Lo26Aez7gwyyxGFJ0MxWHOhVlmlW7pugE1dL03hPpl/y/wA2KfxX6gk++62cSoixkShxba9fuywjgsfgKwHZNCHyuYfVtvjjqfOHqdSWHMsG8XU0Z3I6Av98ZXi5vOR5uNQxDtVoBQzzhk+f63Sw+9juQenjKiz9Pj/oNsnQ4qYeNpZ0H1JYBBsWzVPPoZim2L5tElFOsRuOXFc6iVEkAbXSiVTCigjRAKmTaNE/G9nfNtbRsGwnjudBKW5Gk2ZtCtsJcb7N2+/5ebHv1JXROEkkFxih6IkSr57ufrnaQ2Ia93UP/4c5pt3Ar16dvfE509XpT/Hb62FX593852YHp9+dLWz3MfTfc686cQbmpAD+iGBvSAbmhAD+iGBvSAbmhAD+iGBvSAbuhjoDdKErYPmDSBttISWRvzhJI899m1tDShFRW5B6AnomBqSzXn3fWWANPchDbMMxF74segq3khf/h3X3g3b+Ek02V3aUFX+2QuD2l9e6vFH35VimjaQaPTr7mVHtW+XB6TAXRO5uVgRP8fNPdCM81WyCsp0dOeiBaDGY4o28GgqB00C7l8s5RhHx8iUFK4BW0dkdMpoyY493E4TJ5ydFUgCoFUL/RMQkViriXKGKgIS26pN2ht4a1Az7WkpZg5FuIGs8XBlrocp2uC59LNsv3QlO/2uH9DgwEINws7kmSdWWqZAE7jQRSMlGGPJULzgnv0EVqn1W9B6WP2CqcuuaJkZioOSN8BHVZHHoZtZIELXEL8cQ7JQrIiVXgPfXGYBCOeJKWGOmYEoANHpUBbuPKANrUFCy6aVWkJNdIPzYBzIArx4hBPQJucDj72HYVdduThtMXQpsjF4SVX0RFaJ9LqJLl0FTqatQgDPNdlowNaXyPtk5EKyPl2kzyuggdBytj96pGjKiTLFdqRugFt3kFzju+a/Sm0MnTOvP5IAzVlAeotxF6YLlYigaDAHfh8gpw8rhU6Q0U5pIdGKekMvd2ABqCCWcYMC9S5ACAxVS38diEaR1kqBwoGcImvrAAbUC7J2ny/eVtAgw1yZUjfgjZCZXE3lOUL9BxdrVIdNKEnKuIYX1egLZy4sphMBq0ggAB13bprOCu1zwsWCqORHmiXM8hSn9HCZ/aspdC000Nx1npZGVXFKl0AwmwvVuU5a4lcXgOqlLqy8ARUZnUcgnjXMdcjiI4ty7q4W9kWHjXx2oDul+rdiU/yR4C28SV9B5SzQJtr0nfoLNDlIOFNz9zTQKfi031TzwN9hwb0gG5oQA/oDxR9iq80ehI9PfQT6amhh4Y+k/4BYXA+w/0JM4sAAAAASUVORK5CYII='; 138 | const JAVDB_ITEM_SELECTOR = '.movie-list.v.cols-4.vcols-8 .item, .movie-list.v.cols-4.vcols-5 .item, .movie-list.h.cols-4.vcols-8 .item, .movie-list.h.cols-4.vcols-5 .item'; 139 | const BTSOW_DOMAIN = 'btsow.motorcycles'; 140 | const JAVDB_DOMAIN = 'javdb368.com'; 141 | const TORRENTKITTY_DOMAIN = 'www.torrentkitty.one'; 142 | const MMTV_DOMAIN = '7mmtv.sx'; 143 | const JAVLIB_DOMAIN = 'r86m.com'; 144 | 145 | // 115用户ID 146 | let jav_userID = GM_getValue('jav_user_id', 0); 147 | // icon图标 148 | let icon = GM_getResourceURL('icon'); 149 | // 瀑布流状态:1:开启、0:关闭 150 | let waterfallScrollStatus = GM_getValue('scroll_status', 1); 151 | // 当前网页域名 152 | let domain = location.host; 153 | // 数据库 154 | let javDb; 155 | // 表 156 | let myMovie; 157 | 158 | /** 159 | * 对Date的扩展,将 Date 转化为指定格式的String 160 | * 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,/'; 161 | * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) 162 | * 例子:(new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423f 163 | * (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18 164 | * @param {string} fmt 日期格式 165 | * @returns {void | string} 格式化后的日期字符串 166 | */ 167 | Date.prototype.Format = function (fmt) { //author: meizz 168 | var o = { 169 | "M+": this.getMonth() + 1, //月份 170 | "d+": this.getDate(), //日 171 | "h+": this.getHours(), //小时 172 | "m+": this.getMinutes(), //分 173 | "s+": this.getSeconds(), //秒 174 | "q+": Math.floor((this.getMonth() + 3) / 3), //季度 175 | "S": this.getMilliseconds() //毫秒 176 | }; 177 | if (/(y+)/.test(fmt)) 178 | fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 179 | for (var k in o) 180 | if (new RegExp("(" + k + ")").test(fmt)) 181 | fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); 182 | return fmt; 183 | }; 184 | 185 | /** 186 | * 多线程异步队列 依赖 jQuery 1.8+ 187 | * @param {Number} n 正整数, 线程数量 188 | */ 189 | function Queue(n) { 190 | n = parseInt(n, 10); 191 | return new Queue.prototype.init((n && n > 0) ? n : 1) 192 | } 193 | 194 | Queue.prototype = { 195 | init: function (n) { 196 | this.threads = []; 197 | this.taskList = []; 198 | while (n--) { 199 | this.threads.push(new this.Thread) 200 | } 201 | }, 202 | /** 203 | * @param {Function} callback promise对象done时的回调函数,它的返回值必须是一个promise对象 204 | */ 205 | push: function (callback) { 206 | if (typeof callback !== 'function') return; 207 | var index = this.indexOfIdle(); 208 | if (index != -1) { 209 | this.threads[index].idle(callback); 210 | //try { console.log('Thread-' + (index+1) + ' accept the task!') } catch (e) {} 211 | } else { 212 | this.taskList.push(callback); 213 | for (var i = 0, l = this.threads.length; i < l; i++) { 214 | ((thread, self, id) => { 215 | thread.idle(() => { 216 | if (self.taskList.length > 0) { 217 | //try { console.log('Thread-' + (id+1) + ' accept the task!') } catch (e) {} 218 | let promise = self.taskList.shift()(); // 正确的返回值应该是一个promise对象 219 | return promise.promise ? promise : $.Deferred().resolve().promise(); 220 | } else { 221 | return $.Deferred().resolve().promise(); 222 | } 223 | }) 224 | })(this.threads[i], this, i); 225 | 226 | } 227 | } 228 | }, 229 | indexOfIdle: function () { 230 | var threads = this.threads, 231 | thread = null, 232 | index = -1; 233 | for (var i = 0, l = threads.length; i < l; i++) { 234 | thread = threads[i]; 235 | if (thread.promise.state() === 'resolved') { 236 | index = i; 237 | break; 238 | } 239 | } 240 | return index; 241 | }, 242 | Thread: function () { 243 | this.promise = $.Deferred().resolve().promise(); 244 | this.idle = (callback) => { 245 | this.promise = this.promise.then(callback) 246 | } 247 | } 248 | }; 249 | Queue.prototype.init.prototype = Queue.prototype; 250 | 251 | /** 252 | * 公用类 253 | */ 254 | class Common { 255 | static init() { 256 | // 是否新版本 257 | let isNewVersion = Common.compareVersions(GM_info.script.version, GM_getValue("javOldDriver_version", "0.0.1")); 258 | 259 | // 磁链访问地址初始化 260 | if (isNewVersion || GM_getValue('btsow_url', undefined) === undefined) { 261 | GM_setValue('btsow_url', BTSOW_DOMAIN); 262 | } 263 | if (isNewVersion || GM_getValue('btdig_url', undefined) === undefined) { 264 | GM_setValue('btdig_url', 'www.btdig.com'); 265 | } 266 | if (isNewVersion || GM_getValue('nyaa_url', undefined) === undefined) { 267 | GM_setValue('nyaa_url', 'sukebei.nyaa.si'); 268 | } 269 | if (isNewVersion || GM_getValue('torrentkitty_url', undefined) === undefined) { 270 | GM_setValue('torrentkitty_url', TORRENTKITTY_DOMAIN); 271 | } 272 | if (isNewVersion || GM_getValue('javdb_url', undefined) === undefined) { 273 | GM_setValue('javdb_url', JAVDB_DOMAIN); 274 | } 275 | if (isNewVersion || GM_getValue('javlib_url', undefined) === undefined) { 276 | GM_setValue('javlib_url', 'www.javlibrary.com'); 277 | } 278 | if (isNewVersion || GM_getValue('javbus_url', undefined) === undefined) { 279 | GM_setValue('javbus_url', 'www.javbus.com'); 280 | } 281 | if (isNewVersion || GM_getValue('avsox_url', undefined) === undefined) { 282 | GM_setValue('avsox_url', 'avsox.click'); 283 | } 284 | GM_setValue("javOldDriver_version", GM_info.script.version); 285 | 286 | GM_registerMenuCommand('设置', () => { Common.openSystemConfig() }); 287 | } 288 | 289 | static openSystemConfig() { 290 | let scroll_true = ''; 291 | if (GM_getValue('scroll_status', 1) !== 0) { 292 | GM_setValue('scroll_status', 1); 293 | scroll_true = "checked"; 294 | } 295 | 296 | let dom = `
"); 1246 | $(trEle).append(" | "); 1248 | $(trEle).attr("maglink", magnetUrl); 1249 | $(trEle).find(".nong-copy")[0].addEventListener('click', thirdparty.nong.magnet_table.handle_event, false); 1250 | $(trEle).find(".nong-offline-download")[0].addEventListener('click', thirdparty.nong.magnet_table.handle_event, false); 1251 | } 1252 | } 1253 | 1254 | /** 1255 | * 初始化同步保存数据方法 1256 | */ 1257 | static syncSaveData() { 1258 | GM_setValue("doNum", 0);//console.log("saveData"); 1259 | let pm1 = this.mergeJson("mv_wanted"); 1260 | let pm2 = this.mergeJson("mv_watched"); 1261 | let pm3 = this.mergeJson("mv_owned"); 1262 | 1263 | Promise.all([pm1, pm2, pm3]).then(() => { 1264 | console.log("mergeJson处理完毕"); 1265 | if (GM_getValue("doNum") === 3) { 1266 | let j1 = GM_getValue("mv_wanted_myBrowseJsonAll"); 1267 | let j2 = GM_getValue("mv_watched_myBrowseJsonAll"); 1268 | let j3 = GM_getValue("mv_owned_myBrowseJsonAll"); 1269 | //let myBrowseAll = j3.substring(0, j3.length - 1); 1270 | let myBrowseAll = j1 + j2 + j3.substring(0, j3.length - 1); 1271 | let myBrowseArray = JSON.parse("[" + myBrowseAll + "]"); 1272 | 1273 | //json数组去重 1274 | myBrowseArray = this.uniqueArray(myBrowseArray, "index_cd", (item, resultObj) => { 1275 | if (item["add_time"] < resultObj["add_time"]) { 1276 | resultObj["add_time"] = item["add_time"]; 1277 | } 1278 | }); 1279 | GM_setValue("myBrowseAllData", JSON.stringify(myBrowseArray)); 1280 | //应同步的总数 1281 | GM_setValue("myBrowseAllNum", myBrowseArray.length);//console.log(JSON.stringify(myBrowseArray)); 1282 | 1283 | let startTime = new Date();//console.log("startTime: " + startTime); 1284 | let b = GM_getValue(domain + "_stepTwo_V3", false); 1285 | if (!b) { 1286 | let jsonObj; 1287 | let row; 1288 | for (let i = 0; i < myBrowseArray.length; i++) { 1289 | jsonObj = myBrowseArray[i]; 1290 | row = myMovie.createRow({ 1291 | 'index_cd': jsonObj.index_cd, 1292 | 'code': jsonObj.code, 1293 | 'release_date': '', 1294 | 'duration': '', 1295 | 'director': '', 1296 | 'maker': '', 1297 | 'score': '', 1298 | 'actor': '', 1299 | 'cover_img_url': '', 1300 | 'thumbnail_url': '', 1301 | 'prev_img_url': '', 1302 | 'movie_name': '', 1303 | 'publisher': '', 1304 | 'add_time': jsonObj.add_time, 1305 | 'pick_code': '', 1306 | 'is_browse': true, 1307 | 'is_want': 2, 1308 | 'is_seen': 2, 1309 | 'is_have': 2, 1310 | 'is_sync': false 1311 | }); 1312 | javDb.insertOrReplace().into(myMovie).values([row]).exec(); 1313 | Common.addBrowseJavidCache(jsonObj.code); 1314 | } 1315 | // 如果保存影片数量大于等于需同步总数,则同步完成 1316 | if (GM_getValue(domain + "_saveMovieNum", 0) >= myBrowseArray.length) { 1317 | GM_setValue(domain + "_stepTwo_V3", true); 1318 | GM_setValue(domain + "_doDataSyncStepAll_V3", true); 1319 | } 1320 | console.log(domain + "_stepTwoTime:" + (new Date() - startTime)); 1321 | return Promise.resolve(); 1322 | } 1323 | } 1324 | }); 1325 | } 1326 | 1327 | static getMovie($doc) { 1328 | return { 1329 | index_cd: $('#video_title a', $doc).attr('href').split("v=")[1], 1330 | code: $('.header', $doc)[0].nextElementSibling.textContent, 1331 | release_date: $('#video_date .text', $doc).text(), 1332 | duration: $('#video_length .text', $doc).text(), 1333 | director: $('#video_director .text', $doc).text(), 1334 | maker: $('#video_maker .text', $doc).text(), 1335 | score: $('#video_review .text .score', $doc).text(), 1336 | actor: $('#video_cast .text', $doc).text(), 1337 | cover_img_url: $('#video_jacket_img', $doc).attr("src").replace("http://", "").replace("https://", ""), 1338 | thumbnail_url: $('#video_jacket_img', $doc).attr("src").replace("http://", "").replace("https://", "").replace("pl", "ps"), 1339 | prev_img_url: "", 1340 | movie_name: $('#video_title a', $doc).text(), 1341 | publisher: $('#video_label .text a', $doc).text(), 1342 | add_time: (new Date()).Format("yyyy-MM-dd hh:mm:ss"), 1343 | pick_code: '', 1344 | is_browse: true, 1345 | is_want: ($('#subscribed .smallbutton.hidden', $doc).length > 0) ? 1 : 0, 1346 | is_seen: ($('#watched .smallbutton.hidden', $doc).length > 0) ? 1 : 0, 1347 | is_have: ($('#owned .smallbutton.hidden', $doc).length > 0) ? 1 : 0, 1348 | is_sync: true 1349 | } 1350 | } 1351 | /** 1352 | * 同步movie信息到myMovie表中 1353 | * @param result 页面响应结果 1354 | */ 1355 | static syncMovie(result) { 1356 | let commonClass = Common;// 无此步骤Common作用域失效,暂时未知原因 1357 | let $doc = $(commonClass.parsetext(result.responseText)); 1358 | let movie = Jav.getMovie($doc); 1359 | let myBrowseJsonArray = JSON.parse(GM_getValue("myBrowseAllData", "[]")); 1360 | if (myBrowseJsonArray.length > 0) { 1361 | let jsonObj = myBrowseJsonArray.filter((p) => { 1362 | return p.index_cd == result.finalUrl.split("v=")[1]; 1363 | }); 1364 | if (jsonObj.length > 0) movie.add_time = jsonObj[0].add_time; 1365 | } 1366 | let row = myMovie.createRow(movie); 1367 | javDb.insertOrReplace().into(myMovie).values([row]).exec(); 1368 | } 1369 | 1370 | /** 1371 | * javlib记录已阅影片 1372 | */ 1373 | static javlibSaveData(AVID, pickcode, pm_mater) { 1374 | //console.log($(document)); 1375 | let movie = Jav.getMovie($(document)); 1376 | movie.pick_code = pickcode; 1377 | let newId = Common.getAvCode(AVID); 1378 | Common.addBrowseJavidCache(AVID); 1379 | if(AVID !== newId) Common.addBrowseJavidCache(newId); 1380 | pm_mater.then(() => { 1381 | //查找是否存在此番号数据 1382 | return javDb.select().from(myMovie).where(myMovie.index_cd.eq(movie.index_cd)).exec() 1383 | .then((results) => { 1384 | if (results.length > 0) movie.add_time = results[0].add_time; 1385 | let row = myMovie.createRow(movie); 1386 | javDb.insertOrReplace().into(myMovie).values([row]).exec(); 1387 | console.log(`${movie.code} 已经存入已阅影片`); 1388 | }); 1389 | }); 1390 | } 1391 | 1392 | /** 1393 | * 针对页面的番号信息增加功能及样式修改. javlib和javbus共同使用 1394 | * @returns {string} 番号 1395 | */ 1396 | static getAvidAndChgPage() { 1397 | let AVID = $('.header')[0].nextElementSibling.textContent; 1398 | // 实现点击番号复制到系统剪贴板 todo 181221v1 1399 | $('.header')[0].nextElementSibling.id = "avid"; 1400 | $('#avid').empty().attr("title", "点击复制番号").attr("avid", AVID); 1401 | let a_avid = document.createElement('a'); 1402 | $(a_avid).attr("href", "#").append(AVID); 1403 | $(a_avid).click(() => { 1404 | GM_setClipboard($('#avid').attr("avid")); 1405 | }); 1406 | $('#avid').append(a_avid); 1407 | $('#avid').after("(←点击复制)"); 1408 | $($('.header')[0]).attr("class", "header_hobby"); 1409 | return AVID; 1410 | } 1411 | 1412 | static waterfallButton() { 1413 | // 瀑布流ui按钮 1414 | let a3 = document.createElement('a'); 1415 | (waterfallScrollStatus > 0) ? $(a3).append('关闭瀑布流 ') : $(a3).append('开启瀑布流 '); 1416 | $(a3).css({ 1417 | "color": "blue", 1418 | "font": "bold 12px monospace" 1419 | }); 1420 | $(a3).attr("href", "#"); 1421 | $(a3).click(function () { 1422 | if ((/关闭/g).test($(this).html())) { 1423 | GM_setValue('scroll_status', 0); 1424 | } else { 1425 | GM_setValue('scroll_status', 1); 1426 | } 1427 | window.location.reload(); 1428 | }); 1429 | return a3; 1430 | } 1431 | 1432 | static javlibaryScript() { 1433 | let a3 = this.waterfallButton(); 1434 | if ((/(JAVLibrary)/g).test(document.title)) { 1435 | //数据库初始化 start01 1436 | var pm_mater = Common.getSchemaBuilder().connect({ 1437 | storeType: lf.schema.DataStoreType.INDEXED_DB 1438 | }).then((database) => { 1439 | javDb = database; 1440 | myMovie = javDb.getSchema().table('MyMovie'); 1441 | //javDb.delete().from(myMovie).exec();// 清空MyMovie表数据. 1442 | return javDb.select().from(myMovie).where(myMovie.is_browse.eq(true)).exec(); 1443 | }).then((results) => { 1444 | console.log("已经保存已阅影片数量:" + results.length); 1445 | GM_setValue(domain + "_saveMovieNum", results.length); 1446 | // results.forEach(function(row) { 1447 | // console.log(row['index_cd'],'|',row['code'],'|', row['add_time'],'|',row['movie_name']); 1448 | // }); 1449 | if (document.URL.indexOf("bestrated") > 0) { 1450 | $(".left select").after(" 只看近两月份"); 1451 | $(".left select").after(" 只看当前月份"); 1452 | $(".left select").after(" 不看我阅览过(上个月)"); 1453 | $(".left select").after(" 不看我阅览过(全部)"); 1454 | //todo 1455 | } else if (document.URL.indexOf("vl_newrelease") > 0 || document.URL.indexOf("vl_update") > 0 1456 | || document.URL.indexOf("vl_genre") > 0 || document.URL.indexOf("vl_mostwanted") > 0) { 1457 | $(".displaymode .right").prepend("只看9分以上 "); 1459 | $(".displaymode .right").prepend("只看8分以上 "); 1461 | $(".displaymode .right").prepend("只看7分以上 "); 1463 | } 1464 | 1465 | if ((/(bestrated|newrelease|newentries|vl_update|mostwanted|vl_star)/g).test(document.URL) || 1466 | (/(vl_genre|vl_searchbycombo|mv_owned|mv_watched|mv_wanted|mv_visited)/g).test(document.URL) || 1467 | (/(vl_label|vl_maker|vl_director|vl_searchbyid|userwanted|userowned)/g).test(document.URL)) { 1468 | 1469 | // 指定站点页面加入瀑布流控制按钮 1470 | $(".displaymode .right").prepend($(a3)); 1471 | 1472 | // 瀑布流脚本 1473 | thirdparty.waterfallScrollInit(); 1474 | 1475 | let a1 = document.createElement('a'); 1476 | 1477 | $(a1).append('按【VR】+评分排序 '); 1478 | $(a1).css({ 1479 | "color": "blue", 1480 | "font": "bold 12px monospace" 1481 | }); 1482 | $(a1).attr("href", "#"); 1483 | $(a1).click(() => { 1484 | let div_array = $("div.videos div.video"); 1485 | div_array.sort((a, b) => { 1486 | let a_score = parseFloat($(a).children("a").attr("score")); 1487 | let b_score = parseFloat($(b).children("a").attr("score")); 1488 | if (a_score > b_score) { 1489 | return -1; 1490 | } else if (a_score === b_score) { 1491 | return 0; 1492 | } else { 1493 | return 1; 1494 | } 1495 | }); 1496 | div_array.sort((a, b) => { 1497 | let a_val = $(a).children("a").attr("title").indexOf("【VR】") >= 0 ? 1 : 0; 1498 | let b_val = $(b).children("a").attr("title").indexOf("【VR】") >= 0 ? 1 : 0; 1499 | if (a_val > b_val) { 1500 | return -1; 1501 | } else if (a_val === b_val) { 1502 | return 0; 1503 | } else { 1504 | return 1; 1505 | } 1506 | }); 1507 | // 删除Dom列表数据关系,重新添加排序数据 1508 | div_array.detach().appendTo("#waterfall"); 1509 | }); 1510 | 1511 | let a2 = $(a1).clone(); 1512 | $(a2).html('按时间排序 '); 1513 | $(a2).click(() => { 1514 | let div_array = $("div.videos div.video"); 1515 | div_array.sort((a, b) => { 1516 | let a_time = new Date($(a).children("a").attr("release_date").replace(/-/g, "\/")).getTime(); 1517 | let b_time = new Date($(b).children("a").attr("release_date").replace(/-/g, "\/")).getTime(); 1518 | let a_score = parseFloat($(a).children("a").attr("score")); 1519 | let b_score = parseFloat($(b).children("a").attr("score")); 1520 | if (a_time > b_time) { 1521 | return -1; 1522 | } else if (a_time === b_time) { 1523 | return (a_score > b_score) ? -1 : 1; 1524 | } else { 1525 | return 1; 1526 | } 1527 | }); 1528 | 1529 | // 删除Dom列表数据关系,重新添加排序数据 1530 | div_array.detach().appendTo("#waterfall"); 1531 | }); 1532 | $(".displaymode .right").prepend($(a2)); 1533 | $(".displaymode .right").prepend($(a1)); 1534 | } 1535 | }); 1536 | //JavWebSql.DBinit(); 1537 | if ($('a[href="myaccount.php"]').length) { 1538 | // 已经登录 1539 | // 从未同步过,同步云数据到本地数据库 1540 | let isSync = GM_getValue(domain + "_doDataSyncStepAll_V3", false); 1541 | console.log(domain + " 是否同步过:" + isSync); 1542 | if (!isSync) { 1543 | pm_mater.then(() => { 1544 | return new Promise(resolve => { 1545 | var hasStepOne = GM_getValue(domain + "_stepOne_V3", false); 1546 | let stepOneStartTime = new Date(); 1547 | console.log(domain + " 同步是否完成第一步:" + hasStepOne); 1548 | if (!hasStepOne) { 1549 | // 立即下载数据 1550 | GM_setValue("mv_wanted_pageNum", 0); 1551 | GM_setValue("mv_watched_pageNum", 0); 1552 | GM_setValue("mv_owned_pageNum", 0); 1553 | 1554 | //start02 todo lovefieldDB 1555 | // 创建请求队列 //浏览器对同一域名进行请求的最大并发连接数:chrome为6 1556 | let queue = new Queue(7); 1557 | // 读取想要的影片 1558 | this.loadData("mv_wanted", queue); 1559 | // 读取看过的影片 1560 | this.loadData("mv_watched", queue); 1561 | // 读取拥有的影片 1562 | this.loadData("mv_owned", queue); 1563 | // 延迟1秒运行定时循环函数 1564 | setTimeout(() => { 1565 | // 定时循环函数,当队列执行完成时结束 1566 | var s4 = setInterval(() => { 1567 | //console.log("queue.taskList.length : " + queue.taskList.length); 1568 | if (queue.taskList.length == 0) { 1569 | let end_num = 0; 1570 | for (let i = 0, l = queue.threads.length; i < l; i++) { 1571 | if (queue.threads[i].promise.state() === 'resolved') { 1572 | end_num++; 1573 | } 1574 | } 1575 | if (end_num == queue.threads.length) { 1576 | GM_setValue(domain + "_stepOne_V3", true); // todo 需打开 1577 | console.log(domain + "_stepOneTime:" + (new Date() - stepOneStartTime)); 1578 | clearInterval(s4); 1579 | return resolve(); 1580 | } 1581 | } 1582 | }, 300); 1583 | }, 1000); 1584 | } else { 1585 | return resolve(); 1586 | } 1587 | }); 1588 | }).then(() => { 1589 | this.syncSaveData(); 1590 | }); 1591 | } 1592 | // 增加同步数据到本地的触发按钮 1593 | } 1594 | 1595 | // 新增VR发行、FC2发行菜单入口 1596 | $('.menul1 ul li:contains("新发行")').after(' |
DMM评价: | 1657 |${dmmData.score.replace("点", "分")}, ${dmmData.user_num}人评, ${dmmData.collect_num}收藏 | 1658 |
javdb评价: | 1673 |${score} | 1674 |
JAV跳转: | 1685 |1686 | JavBus 1687 | | 1688 |
115网盘已拥有此片
1724 | 1725 |115在线播放 ►
1726 |夸克网盘已有此片
1742 | 1743 |夸克在线播放 ►
1744 |1816 | 1817 | 1818 | DMM 评: 1819 | 1820 | ${dmmData.score.replace("点", "分")}, ${dmmData.user_num}人评, ${dmmData.collect_num}收藏 1821 |
1822 | `); 1823 | }); 1824 | } 1825 | 1826 | //加入javdb评分数据 1827 | Common.getJavDbData(AVID).then((javdbData) => { 1828 | let score = javdbData.score.trim().replace("由", "").replace("人評價", "人评"); 1829 | $p_zuobiao.after(` 1830 |1831 | javdb评: 1832 | ${score} 1833 |
1834 | `); 1835 | }); 1836 | 1837 | //查找115是否有此番号 1838 | Common.search115Data(AVID, (BOOLEAN_TYPE, playUrl, pc) => { 1839 | if (BOOLEAN_TYPE) { 1840 | let $imgObj = $('.bigImage'); 1841 | $imgObj.after(` 1842 |115网盘已拥有此片
1844 | 1845 |115在线播放 ►
1846 |夸克网盘已有此片
1859 | 1860 |夸克在线播放 ►
1861 |1869 | 在线预览: 1870 | missav 1871 | 7mmtv 1872 | supjav 1873 |
1874 | `); 1875 | // 加入javlib的跳转链接 1876 | $('.col-md-3.info').append(` 1877 |1878 | JAV跳转: 1879 | JavLib 1880 |
1881 | `); 1882 | // javstoreLink 1883 | let $a = $(`JavStore `); 1884 | $('#linkJump').append(Common.javstoreLinkMousedown($a, AVID)); 1885 | 1886 | // 修改javbus磁链列表头,增加两列 1887 | $('#magnet-table tbody tr').append('115在线播放 ►
1960 |115网盘已拥有此片
2111 | 2112 |115在线播放 ►
2113 |'); 2862 | $('#hobby').append(main.cur_tab); 2863 | } 2864 | }, 2865 | javstore: { 2866 | type: 0, 2867 | re: /.*javstore.*/, 2868 | vid: () => { 2869 | if (GM_getValue(document.URL, false)) { 2870 | let avid = GM_getValue(document.URL); 2871 | GM_deleteValue(document.URL); 2872 | $('.boxoleft .box_left_news.news_2n').attr("avid", avid); 2873 | return avid; 2874 | } else { 2875 | let $ele = $('.boxoleft .box_left_news.news_2n').attr("avid", $('.name').text().match(/[a-z|A-Z|0-9| _-]+/)[0].trim()); 2876 | return $ele.attr('avid'); 2877 | } 2878 | }, 2879 | proc: (main) => { 2880 | $('.boxoleft .box_left_news.news_2n').append(main.cur_tab); 2881 | } 2882 | }, 2883 | }, 2884 | resource_sites: { 2885 | [GM_getValue('javdb_url')]: (kw, callback) => { 2886 | let promise = Common.request("https://" + GM_getValue('search_index') + "/search?f=download&q=" + kw, "https://" + GM_getValue('search_index') + "/"); 2887 | promise.then((result) => { 2888 | let data = []; 2889 | return new Promise((resolve, reject) => { 2890 | thirdparty.nong.search_engines.full_url = result.finalUrl; 2891 | let doc = Common.parsetext(result.responseText); 2892 | let a = $(doc).find(`.box .video-title:contains('${kw.toUpperCase().replace("+", "-")}')`); 2893 | if (a) { 2894 | let url = a[0].parentElement.href.replace(location.origin, 'https://' + [GM_getValue('javdb_url')]); 2895 | if(url.indexOf("http") < 0) { 2896 | url = 'https://' + [GM_getValue('javdb_url')] + url; 2897 | } 2898 | resolve(url); 2899 | } 2900 | else { 2901 | reject(); 2902 | } 2903 | }).then(url => { 2904 | Common.request(url).then(result => { 2905 | thirdparty.nong.search_engines.full_url = result.finalUrl; 2906 | let doc = Common.parsetext(result.responseText); 2907 | let t = $(doc).find('#magnets-content .item'); 2908 | if (t) { 2909 | for (let elem of t) { 2910 | data.push({ 2911 | "title": elem.querySelector(".magnet-name span:nth-child(1)").textContent, 2912 | "maglink": elem.querySelector(".magnet-name a:nth-child(1)").href, 2913 | "size": elem.querySelector(".magnet-name .meta") ? elem.querySelector(".magnet-name .meta").textContent : "", 2914 | "src": result.finalUrl, 2915 | }); 2916 | } 2917 | } 2918 | else { 2919 | data.push({ 2920 | "title": "没有找到磁链接", 2921 | "maglink": "", 2922 | "size": "0", 2923 | "src": result.finalUrl, 2924 | }); 2925 | } 2926 | callback(result.finalUrl, data); 2927 | }) 2928 | }).catch(() => { 2929 | data.push({ 2930 | "title": "没有找到磁链接", 2931 | "maglink": "", 2932 | "size": "0", 2933 | "src": result.finalUrl, 2934 | }); 2935 | callback(result.finalUrl, data); 2936 | }); 2937 | }); 2938 | }, 2939 | [GM_getValue('btsow_url')]: (kw, callback) => { 2940 | let promise = Common.request("https://" + GM_getValue('search_index') + "/search/" + kw); 2941 | promise.then((result) => { 2942 | thirdparty.nong.search_engines.full_url = result.finalUrl; 2943 | var doc = Common.parsetext(result.responseText); 2944 | if (!doc) { 2945 | thirdparty.nong.search_engines.parse_error(GM_getValue('search_index')); 2946 | } 2947 | var data = []; 2948 | var t = doc.getElementsByClassName('data-list')[0]; 2949 | if (t) { 2950 | var a = t.getElementsByTagName('a'); 2951 | for (var i = 0; i < a.length; i++) { 2952 | if (!a[i].className.match('btn')) { 2953 | data.push({ 2954 | 'title': a[i].title, 2955 | 'maglink': 'magnet:?xt=urn:btih:' + a[i].outerHTML.replace(/.*hash\//, '').replace(/" .*\n.*\n.*\n.*/, ''), 2956 | 'size': a[i].nextElementSibling.textContent, 2957 | 'src': a[i].href, 2958 | }); 2959 | } 2960 | } 2961 | } 2962 | callback(result.finalUrl, data); 2963 | }); 2964 | }, 2965 | [GM_getValue('btdig_url')]: (kw, callback) => { 2966 | let promise = Common.request("https://" + GM_getValue('search_index') + "/search?q=" + kw); 2967 | promise.then((result) => { 2968 | thirdparty.nong.search_engines.full_url = result.finalUrl; 2969 | let doc = Common.parsetext(result.responseText); 2970 | let data = []; 2971 | let t = doc.querySelectorAll("div.one_result"); 2972 | if (t) { 2973 | for (let elem of t) { 2974 | data.push({ 2975 | "title": elem.querySelector(".torrent_name a").textContent, 2976 | "maglink": elem.querySelector(".fa.fa-magnet a").href, 2977 | "size": elem.querySelector(".torrent_size").textContent, 2978 | "src": elem.querySelector(".torrent_name a").href, 2979 | }); 2980 | } 2981 | } 2982 | else { 2983 | data.push({ 2984 | "title": "没有找到磁链接", 2985 | "maglink": "", 2986 | "size": "0", 2987 | "src": result.finalUrl, 2988 | }); 2989 | } 2990 | callback(result.finalUrl, data); 2991 | }); 2992 | }, 2993 | [GM_getValue('nyaa_url')]: (kw, callback) => { 2994 | let promise = Common.request("https://" + GM_getValue('search_index') + "/?f=0&c=0_0&q=" + kw); 2995 | promise.then((result) => { 2996 | thirdparty.nong.search_engines.full_url = result.finalUrl; 2997 | let doc = Common.parsetext(result.responseText); 2998 | if (!doc) { 2999 | thirdparty.nong.search_engines.parse_error(GM_getValue('search_index')); 3000 | } 3001 | let data = []; 3002 | let t = doc.querySelectorAll("tr.default,tr.success"); 3003 | if (t.length !== 0) { 3004 | for (let elem of t) { 3005 | data.push({ 3006 | "title": elem.querySelector("td:nth-child(2)>a:nth-child(1)").title, 3007 | "maglink": elem.querySelector("td:nth-child(3)>a:nth-last-child(1)").href, 3008 | //"torrent_url": "https://nyaa.si" + elem.querySelector("td:nth-child(3)>a:nth-child(1)").href, 3009 | "size": elem.querySelector("td:nth-child(4)").textContent, 3010 | "src": "https://" + [GM_getValue('nyaa_url')] 3011 | + elem.querySelector("td:nth-child(2)>a:nth-child(1)").getAttribute('href'), 3012 | }); 3013 | } 3014 | } 3015 | callback(result.finalUrl, data); 3016 | }); 3017 | }, 3018 | [GM_getValue('torrentkitty_url')]: (kw, callback) => { 3019 | let promise = Common.request("https://" + GM_getValue('search_index') + "/search/" + kw); 3020 | promise.then((result) => { 3021 | thirdparty.nong.search_engines.full_url = result.finalUrl; 3022 | let doc = Common.parsetext(result.responseText); 3023 | let data = []; 3024 | let t = $(doc).find("#archiveResult tr:gt(0)"); 3025 | if (t) { 3026 | for (let elem of t) { 3027 | if ((/(No result)/g).test(elem.querySelector(".name").textContent)) 3028 | break; 3029 | data.push({ 3030 | "title": elem.querySelector(".name").textContent, 3031 | "maglink": elem.querySelector(".action>a:nth-child(2)").href, 3032 | "size": elem.querySelector(".size").textContent, 3033 | "src": "https://" + [GM_getValue('torrentkitty_url')] + elem.querySelector(".action>a:nth-child(1)").getAttribute('href'), 3034 | }); 3035 | } 3036 | } 3037 | else { 3038 | data.push({ 3039 | "title": "没有找到磁链接", 3040 | "maglink": "", 3041 | "size": "0", 3042 | "src": result.finalUrl, 3043 | }); 3044 | } 3045 | callback(result.finalUrl, data); 3046 | }); 3047 | }, 3048 | }, 3049 | offline_sites: { 3050 | 115: { 3051 | name: '115离线', 3052 | url: 'http://115.com/?tab=offline&mode=wangpan', 3053 | enable: true, 3054 | }, 3055 | }, 3056 | // 挊 3057 | search_engines: { 3058 | switch_engine: (i) => { 3059 | // var index = GM_getValue("search_index",0); 3060 | GM_setValue('search_index', i); 3061 | return i; 3062 | }, 3063 | cur_engine: (kw, callback) => { 3064 | let ops = Object.keys(thirdparty.nong.resource_sites); 3065 | let z = thirdparty.nong.resource_sites[GM_getValue('search_index', ops[0])]; 3066 | if (!z) { 3067 | //alert("search engine not found"); 3068 | GM_setValue('search_index', Object.keys(thirdparty.nong.resource_sites)[0]); 3069 | z = thirdparty.nong.resource_sites[GM_getValue('search_index')]; 3070 | } 3071 | return z(kw, callback); 3072 | }, 3073 | parse_error: (a) => { 3074 | alert("调用搜索引擎错误,可能需要更新,请向作者反馈。i=" + a); 3075 | }, 3076 | full_url: '', 3077 | 3078 | }, 3079 | // 挊 3080 | magnet_table: { 3081 | template: { 3082 | create_head: () => { 3083 | var a = document.createElement('tr'); 3084 | a.className = 'jav-nong-row'; 3085 | a.id = 'jav-nong-head'; 3086 | var list = ['标题', '大小', '操作', '离线下载']; 3087 | for (var i = 0; i < list.length; i++) { 3088 | var b = thirdparty.nong.magnet_table.template.head.cloneNode(true); 3089 | if (i === 0) { 3090 | var select = document.createElement("select"); 3091 | var ops = Object.keys(thirdparty.nong.resource_sites); // todo 181225 3092 | var cur_index = GM_getValue("search_index", ops[0]); 3093 | for (var j = 0; j < ops.length; j++) { 3094 | var op = document.createElement("option"); 3095 | op.value = ops[j]; 3096 | op.textContent = ops[j]; 3097 | if (cur_index == ops[j]) { 3098 | op.setAttribute("selected", "selected"); 3099 | } 3100 | select.appendChild(op); 3101 | } 3102 | b.removeChild(b.firstChild); 3103 | b.appendChild(select); 3104 | let a3 = document.createElement('a'); 3105 | $(a3).append(' 修改 ') 3106 | $(a3).css({ 3107 | "color": "blue", 3108 | "font": "bold 12px monospace" 3109 | }); 3110 | $(a3).attr("href", "#"); 3111 | $(a3).click(() => { 3112 | Common.openSystemConfig(); 3113 | }); 3114 | b.append(a3); 3115 | a.appendChild(b); 3116 | continue; 3117 | } 3118 | b.firstChild.textContent = list[i]; 3119 | a.appendChild(b); 3120 | } 3121 | // var select_box = this.create_select_box(); 3122 | // a.firstChild.appendChild(select_box); 3123 | 3124 | return a; 3125 | }, 3126 | create_row: (data) => { 3127 | var a = document.createElement('tr'); 3128 | a.className = 'jav-nong-row'; 3129 | a.setAttribute('maglink', data.maglink); 3130 | // 暂时针对cnbtkitty.pw站点生效。 3131 | if (data.maglink.indexOf("#magnetlink") > -1) { 3132 | a.setAttribute('id', data.id); 3133 | let promise1 = Common.request(data.maglink + "?hobbyId=" + data.id);// 传递修改hobbyId,用于修改时定位。 3134 | promise1.then((result) => { 3135 | //定位磁链编码开始下标位置 3136 | let indexNum = result.responseText.indexOf('#website#infohash#'); 3137 | if (indexNum >= 0) { 3138 | let magnetlink = result.responseText.substring(indexNum + 18, indexNum + 58); 3139 | let hobbyId = result.finalUrl.substring(result.finalUrl.indexOf('?hobbyId=') + 9, result.finalUrl.length); 3140 | $("#" + hobbyId).attr("maglink", "magnet:?xt=urn:btih:" + magnetlink); 3141 | } 3142 | }); 3143 | } 3144 | 3145 | var b = document.createElement('td'); 3146 | var list = [ 3147 | thirdparty.nong.magnet_table.template.create_info(data.title, data.maglink), 3148 | thirdparty.nong.magnet_table.template.create_size(data.size, data.src), 3149 | thirdparty.nong.magnet_table.template.create_operation(data.maglink), 3150 | thirdparty.nong.magnet_table.template.create_offline() 3151 | ]; 3152 | for (var i = 0; i < list.length; i++) { 3153 | var c = b.cloneNode(true); 3154 | c.appendChild(list[i]); 3155 | a.appendChild(c); 3156 | } 3157 | return a; 3158 | }, 3159 | create_loading: () => { 3160 | var a = document.createElement('tr'); 3161 | a.className = 'jav-nong-row'; 3162 | var p = document.createElement('p'); 3163 | p.textContent = 'Loading'; 3164 | p.id = 'notice'; 3165 | a.appendChild(p); 3166 | return a; 3167 | }, 3168 | create_info: (title, maglink) => { 3169 | var a = thirdparty.nong.magnet_table.template.info.cloneNode(true); 3170 | a.firstChild.textContent = title.length < 20 ? title : title.substr(0, 20) + '...'; 3171 | a.firstChild.href = maglink; 3172 | a.title = title; 3173 | return a; 3174 | }, 3175 | create_size: (size, src) => { 3176 | var a = thirdparty.nong.magnet_table.template.size.cloneNode(true); 3177 | a.textContent = size; 3178 | a.href = src; 3179 | return a; 3180 | }, 3181 | create_operation: (maglink) => { 3182 | var a = thirdparty.nong.magnet_table.template.operation.cloneNode(true); 3183 | a.firstChild.href = maglink; 3184 | return a; 3185 | }, 3186 | create_offline: () => { //有用 hobby 3187 | var a = thirdparty.nong.magnet_table.template.offline(); 3188 | a.className = 'nong-offline'; 3189 | return a; 3190 | }, 3191 | create_select_box: () => { 3192 | var select_box = document.createElement('select'); 3193 | select_box.id = 'nong-search-select'; 3194 | select_box.setAttribute('title', '切换搜索结果'); 3195 | var search_name = GM_getValue('search', default_search_name); 3196 | for (var k in thirdparty.nong.search_engines) { 3197 | var o = document.createElement('option'); 3198 | if (k == search_name) { 3199 | o.setAttribute('selected', 'selected'); 3200 | } 3201 | o.setAttribute('value', k); 3202 | o.textContent = k; 3203 | select_box.appendChild(o); 3204 | } 3205 | return select_box; 3206 | }, 3207 | head: (() => { 3208 | var a = document.createElement('th'); 3209 | var b = document.createElement('a'); 3210 | a.appendChild(b); 3211 | return a; 3212 | })(), 3213 | info: (() => { 3214 | var a = document.createElement('div'); 3215 | var b = document.createElement('a'); 3216 | b.textContent = 'name'; 3217 | b.href = 'src'; 3218 | a.appendChild(b); 3219 | return a; 3220 | })(), 3221 | size: (() => { 3222 | var a = document.createElement('a'); 3223 | a.textContent = 'size'; 3224 | return a; 3225 | })(), 3226 | operation: (() => { 3227 | var a = document.createElement('div'); 3228 | var copy = document.createElement('a'); 3229 | copy.className = 'nong-copy'; 3230 | copy.textContent = '复制'; 3231 | a.appendChild(copy); 3232 | return a; 3233 | })(), 3234 | offline: () => { 3235 | var a = document.createElement('div'); 3236 | var b = document.createElement('a'); 3237 | b.className = 'nong-offline-download'; 3238 | b.target = '_blank'; 3239 | for (var k in thirdparty.nong.offline_sites) { 3240 | if (thirdparty.nong.offline_sites[k].enable) { 3241 | var c = b.cloneNode(true); 3242 | c.href = thirdparty.nong.offline_sites[k].url; 3243 | c.textContent = thirdparty.nong.offline_sites[k].name; 3244 | a.appendChild(c); 3245 | } 3246 | } 3247 | return a; 3248 | }, 3249 | }, 3250 | create_empty_table: () => { //有用 hobby 3251 | var a = document.createElement('table'); 3252 | a.id = 'nong-table-new'; 3253 | return a; 3254 | }, 3255 | updata_table: (src, data, type) => { 3256 | if (type == 'full') { 3257 | var tab = $('#nong-table-new')[0]; 3258 | tab.removeChild(tab.querySelector("#notice").parentElement); 3259 | for (var i = 0; i < data.length; i++) { 3260 | tab.appendChild(thirdparty.nong.magnet_table.template.create_row(data[i])); 3261 | } 3262 | } 3263 | thirdparty.nong.magnet_table.reg_event(); 3264 | }, 3265 | full: (src, data) => { 3266 | var tab = thirdparty.nong.magnet_table.create_empty_table(); 3267 | tab.appendChild(thirdparty.nong.magnet_table.template.create_head()); 3268 | var loading = thirdparty.nong.magnet_table.template.create_loading(); 3269 | tab.appendChild(loading); 3270 | return tab; 3271 | }, 3272 | handle_event: (event) => { 3273 | var maglink = event.target.parentElement.parentElement.getAttribute('maglink') 3274 | || event.target.parentElement.parentElement.parentElement.getAttribute('maglink')|| event.target.getAttribute("href"); 3275 | if ($(event.target).hasClass("nong-copy")) { 3276 | event.target.innerHTML = '成功'; 3277 | maglink = maglink.substr(0, 60); 3278 | GM_setClipboard(maglink); 3279 | setTimeout(() => { 3280 | event.target.innerHTML = '复制'; 3281 | }, 1000); 3282 | event.preventDefault(); //阻止跳转 3283 | } 3284 | else if ($(event.target).hasClass("nong-offline-download")) { 3285 | maglink = maglink.substr(0, 60); 3286 | GM_setValue('magnet', maglink); 3287 | //获取115 token接口 3288 | let promise = Common.request('http://115.com/?ct=offline&ac=space&_=' + new Date().getTime()); 3289 | promise.then((responseDetails) => { 3290 | if (responseDetails.responseText.indexOf('html') >= 0) { 3291 | //未登录处理 3292 | Common.notifiy("115还没有登录", 3293 | '请先登录115账户后,再离线下载!', 3294 | icon, 3295 | 'http://115.com/?mode=login' 3296 | ); 3297 | return false; 3298 | } 3299 | var sign115 = JSON.parse(responseDetails.response).sign; 3300 | var time115 = JSON.parse(responseDetails.response).time; 3301 | console.log("uid=" + jav_userID + " sign:" + sign115 + " time:" + time115); 3302 | console.log("rsp:" + responseDetails.response); 3303 | GM_xmlhttpRequest({ 3304 | method: 'POST', 3305 | url: 'http://115.com/web/lixian/?ct=lixian&ac=add_task_url', //添加115离线任务接口 3306 | headers: { 3307 | "Content-Type": "application/x-www-form-urlencoded" 3308 | }, 3309 | data: "url=" + encodeURIComponent(maglink) + "&uid=" + jav_userID + "&sign=" + sign115 3310 | + "&time=" + time115, 3311 | onload: (responseDetails) => { 3312 | var lxRs = JSON.parse(responseDetails.responseText); //离线结果 3313 | if (lxRs.state) { 3314 | //离线任务添加成功 3315 | Common.notifiy("115老司机自动开车", 3316 | '离线任务添加成功 , 3秒后刷新本页面', 3317 | icon, 3318 | 'http://115.com/?tab=offline&mode=wangpan' 3319 | ); 3320 | setTimeout(() => { 3321 | location.reload(); 3322 | }, 3000); 3323 | } 3324 | else { 3325 | //离线任务添加失败 3326 | if (lxRs.errcode == '911') { 3327 | lxRs.error_msg = '你的帐号使用异常,需要在线手工重新验证即可正常使用。'; 3328 | } 3329 | Common.notifiy("失败了", 3330 | '请重新打开115,' + lxRs.error_msg, 3331 | icon, 3332 | 'http://115.com/?tab=offline&mode=wangpan' 3333 | ); 3334 | } 3335 | console.log("sign:" + sign115 + " time:" + time115); 3336 | console.log("磁链:" + maglink + " 下载结果:" + lxRs.state + " 原因:" + lxRs.error_msg); 3337 | console.log("rsp:" + responseDetails.response); 3338 | } 3339 | }); 3340 | 3341 | }); 3342 | event.preventDefault(); //阻止跳转 3343 | } 3344 | }, 3345 | reg_event: () => { // target 处理 更精准 3346 | var list = [ 3347 | '.nong-copy', 3348 | '.nong-offline-download' 3349 | ]; 3350 | for (var i = 0; i < list.length; i++) { 3351 | var a = document.querySelectorAll(list[i]); 3352 | for (var u = 0; u < a.length; u++) { 3353 | a[u].addEventListener('click', thirdparty.nong.magnet_table.handle_event, false); 3354 | } 3355 | } 3356 | }, 3357 | }, 3358 | // 挊 3359 | searchMagnetRun: () => { 3360 | let main = thirdparty.nong.main; 3361 | let main_keys = Object.keys(main); 3362 | main.cur_tab = null; 3363 | main.cur_vid = ''; 3364 | for (var i = 0; i < main_keys.length; i++) { 3365 | var v = main[main_keys[i]]; 3366 | if (new RegExp(v.re).test(location.href)) { 3367 | if (v.type === 0) { 3368 | try { 3369 | main.cur_vid = v.vid(); 3370 | console.log('挊的番号:', main.cur_vid); 3371 | } 3372 | catch (e) { 3373 | main.cur_vid = ''; 3374 | } 3375 | if (main.cur_vid) { 3376 | GM_addStyle(` 3377 | #nong-table-new{margin:10px auto;color:#666 !important;font-size:13px;text-align:center;background-color: #F2F2F2;} 3378 | #nong-table-new th,#nong-table-new td{text-align: center;height:30px;background-color: #FFF;padding:0 5px 0;border: 1px solid #EFEFEF;} 3379 | .jav-nong-row{text-align: center;height:30px;background-color: #FFF;padding:0 5px 0;border: 1px solid #EFEFEF;} 3380 | .nong-copy{color:#08c !important;} 3381 | .nong-offline{text-align: center;} 3382 | #jav-nong-head a {margin-right: 5px;color: black;} 3383 | .nong-offline-download{color: rgb(0, 180, 30) !important; margin-right: 4px !important;} 3384 | .nong-offline-download:hover{color:red !important;} 3385 | `); 3386 | main.cur_tab = thirdparty.nong.magnet_table.full(); 3387 | v.proc(main); 3388 | 3389 | let t = $('#jav-nong-head')[0].firstChild; 3390 | t.firstChild.addEventListener('change', (e) => { 3391 | console.log("url: http://" + e.target.value); 3392 | GM_setValue('search_index', e.target.value); 3393 | let s = $('#nong-table-new')[0]; 3394 | s.parentElement.removeChild(s); 3395 | thirdparty.nong.searchMagnetRun(); 3396 | }); 3397 | 3398 | if (GM_getValue('search_index', null) === null) { 3399 | GM_setValue('search_index', Object.keys(thirdparty.nong.resource_sites)[0]); 3400 | } 3401 | thirdparty.nong.search_engines.cur_engine(main.cur_vid, (src, data) => { //callback 3402 | if (data.length === 0) { 3403 | let url = thirdparty.nong.search_engines.full_url; 3404 | $('#nong-table-new #notice').text('No search result! '); //todo 181224 3405 | $('#nong-table-new #notice').append( 3406 | ` Go`); //todo 190630 3407 | } 3408 | else { 3409 | thirdparty.nong.magnet_table.updata_table(src, data, 'full'); 3410 | /*display search url*/ 3411 | var y = $('#jav-nong-head th')[1].firstChild; 3412 | y.href = thirdparty.nong.search_engines.full_url; 3413 | } 3414 | }); 3415 | } 3416 | } 3417 | break; 3418 | } 3419 | } 3420 | }, 3421 | }, 3422 | }; 3423 | 3424 | function mainRun() { 3425 | Common.init(); 3426 | GM_addStyle(` 3427 | .tm-setting {display: flex;align-items: center;justify-content: space-between;padding-top: 20px;} 3428 | .tm-checkbox {width: 16px;height: 16px;} 3429 | .tm-text {width: 150px;height: 16px;} 3430 | `); 3431 | 3432 | Jav.javStoreScript(); 3433 | // 判断是否指定页面 3434 | if ((/(JAVLibrary|JavBus|AVMOO|AVSOX)/g).test(document.title) || $("footer:contains('JavBus')").length) { 3435 | Common.addAvImgCSS(); 3436 | GM_addStyle(` 3437 | .container {width: 100%;float: left;} 3438 | .col-md-3 {float: left;max-width: 260px;} 3439 | .col-md-9 {width: inherit;} 3440 | .hobby-a {color: red; font: bold 12px monospace;} /*javlib*/ 3441 | .footer {padding: 20px 0;background: #1d1a18;float: left;} /*javbus*/ 3442 | #nong-table-new {margin: initial !important;important;color: #666 !important;font-size: 13px;text-align: center;background-color: #F2F2F2;float: left;} 3443 | .header_hobby {font-weight: bold;text-align: right;width: 75px;} /*javbus*/ 3444 | `); 3445 | Jav.javlibaryScript(); 3446 | Jav.javBusScript(); 3447 | } 3448 | 3449 | Jav.oneJavScript(); 3450 | Jav.jav321Script(); 3451 | Jav.javDBScript(); 3452 | Jav.quarkScript(); 3453 | thirdparty.login115Run(); 3454 | } 3455 | mainRun(); 3456 | })(); -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. |