// ==UserScript== // @name 115优化大师 // @author zxf10608 // @version 4.2 // @icon https://115.com/favicon.ico // @namespace https://greasyfork.org/zh-CN/scripts/408466 // @description 优化115网盘浏览体验:一键离线下载、调用Dplayer或Potplayer播放视频、文件快捷下载等。 // @require https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js // @require https://greasyfork.org/scripts/398240-gm-config-zh-cn/code/GM_config_zh-CN.js // @require https://greasyfork.org/scripts/412267-base64-v1-0/code/base64_v10.js // @require https://cdn.jsdelivr.net/npm/toastr@2.1.4/toastr.min.js // @resource toastrCss https://cdn.jsdelivr.net/npm/toastr@2.1.4/build/toastr.min.css // @require https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.js // @resource dplayerCss https://cdn.jsdelivr.net/npm/dplayer/dist/DPlayer.min.css // @require https://cdn.jsdelivr.net/npm/hls.js@0.14.16/dist/hls.min.js // @include * // @exclude https://*.115.com/bridge* // @exclude http*://*.baidu.com/* // @exclude http*://*.iqiyi.com/* // @exclude http*://*.qq.com/* // @exclude http*://v.youku.com/* // @exclude http*://*.bilibili.com/ // @exclude http*://*.pptv.com/* // @exclude http*://*.fun.tv/* // @exclude http*://*.sohu.com/* // @exclude http*://*.le.com/* // @exclude http*://*.tudou.com/* // @exclude http*://*.bilibili.com/* // @exclude http*://music.163.com/* // @exclude http*://github.com/* // @grant GM_setValue // @grant GM_getValue // @grant GM_addStyle // @grant GM_openInTab // @grant GM_setClipboard // @grant GM_getResourceText // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @connect 115.com // @grant unsafeWindow // @grant window.open // @grant window.close // @run-at document-start // @compatible chrome // @license GPL License // @downloadURL none // ==/UserScript== (function() { 'use strict'; var newVersion = 'v4.2'; if ( typeof GM_config == 'undefined') { alert('115优化大师:\n网络异常,相关库文件加载失败,脚本无法使用,请刷新网页重新加载!'); return; } else { console.log('115优化大师:相关库文件加载成功!'); }; function config(){ var windowCss = '#Cfg .config_var {margin-left: 10%;margin-right: 10%;} #Cfg input[type="checkbox"] {margin: 3px 3px 3px 0px;} #Cfg input[type="text"] {width: 53px;} #Cfg {background-color: lightblue;} #Cfg .reset_holder {float: left; position: relative; bottom: -1em;} #Cfg .saveclose_buttons {margin: .7em;} #Cfg .section_desc {font-size: 10pt;}'; GM_registerMenuCommand('设置', opencfg); function opencfg(){ GM_config.open(); }; GM_config.init( { id: 'Cfg', title: GM_config.create('a', { href: 'https://greasyfork.org/zh-CN/scripts/408466', target: '_blank', textContent: '115优化大师', title: '作者:zxf10608 版本:'+newVersion+' 点击访问主页' }), isTabs: true, skin: 'tab', css: windowCss, frameStyle: { height: '500px', width: '425px', zIndex:'2147483648', }, fields: { hide_qrcodeLogin: { section: ['登录管理', '自定义登录方式,显示登录时间'], label: '隐藏二维码登录', labelPos: 'right', type: 'checkbox', default: false, }, hide_officeLogin: { label: '隐藏115组织登录', labelPos: 'right', type: 'checkbox', default: false, }, show_Alidity: { label: '显示上次登录时间', labelPos: 'right', type: 'checkbox', default: false, }, offline_Down: { section: ['离线升级', '升级离线下载功能'], label: '启用一键离线下载', labelPos: 'right', type: 'checkbox', default: true, }, offline_result: { label: '任务添加后显示离线结果', labelPos: 'right', type: 'checkbox', default: true, }, open_List: { label: '离线后自动打开任务列表', labelPos: 'right', type: 'checkbox', default: false, }, open_search: { label: '离线成功后开启视频搜索', labelPos: 'right', type: 'checkbox', default: true, line: 'start', }, search_result: { label: '显示视频搜索结果', labelPos: 'right', type: 'checkbox', default: true, }, open_Popup: { label: '搜到视频自动播放', labelPos: 'right', type: 'checkbox', default: false, line: 'end', }, fuzzy_find: { label: '启用下载地址模糊匹配', labelPos: 'right', type: 'checkbox', default: false, }, diy_folder: { label: '自定义离线下载文件夹', labelPos: 'right', type: 'checkbox', default: false, line: 'start', }, save_folder: { label: '设置文件夹', labelPos: 'right', type: 'button', line: 'end', click: function(){ setFolder(); } }, reminder2: { label: '温馨提示', labelPos: 'right', type: 'button', click: function(){ alert('1、显示离线下载结果有10s延时,用于服务器响应时间。\n2、为避免通知弹窗过多,最多只显示3个视频搜索结果,更多请自行到115查看。\n3、“启用下载地址模糊匹配”后,能根据哈希值或纯文本模糊匹配磁力链接和迅雷专用链,如在磁力搜索引擎、资源网等有奇效,但在某些网页有一定几率误识别,请谨慎开启。'); } }, player: { section: ['播放优化', '调用第三方播放器,优化播放体验'], label: '默认播放器', labelPos: 'left', type: 'select', options: ['Dplayer', 'Potplayer', '官方HTML5'], default: 'Dplayer', }, play_Quality: { label: '默认播放清晰度', labelPos: 'left', type: 'select', 'options': ['最高', '次高', '最低'], default: '次高', }, skip_titles: { label: '跳过片头秒数', type: 'unsigned int', default: '0', }, skip_credits: { label: '跳过片尾秒数', type: 'unsigned int', default: '0', }, online_List: { label: '开启云端记忆播放', labelPos: 'right', type: 'checkbox', default: true, }, Tab_ing: { label: '播放器跟随页面变化', labelPos: 'right', type: 'checkbox', default: false, }, reminder3: { label: '温馨提示', labelPos: 'right', type: 'button', click: function(){ alert('1、除第一、第二项外,其他仅在启用Dplayer时有效。\n2、开启云端记忆播放,播放记录将自动上传至云端(115服务器),下次播放自动恢复上一次进度。\n3、播放界面右键可显示更多菜单,谨慎使用“删除”操作。\n4、播放器跟随页面变化,即页面后台则暂停,页面前台则播放,支持Dplayer和官方HTML5。\n5、关于播放器调用说明:\n 单击文件名:默认播放器;\n 双击除文件名外:官方HTML5;\n 单击“Dp播放”:Dplayer;\n 单击“Pot播放”:Potplayer;\n 非115页面:默认播放器。'); } }, hide_sidebar: { section: ['更多设置', '优化浏览体验'], label: '隐藏网盘侧边栏', labelPos: 'right', type: 'checkbox', default: false, }, show_Star: { label: '网盘顶部增加星标按钮', labelPos: 'right', type: 'checkbox', default: false, }, show_Task: { label: '网盘顶部增加链接任务按钮', labelPos: 'right', type: 'checkbox', default: true, }, show_Update: { label: '更新后弹出更新日志', labelPos: 'right', type: 'checkbox', default: false, }, file_Down: { label: '启用文件快捷下载', labelPos: 'right', type: 'checkbox', default: true, line: 'start', }, show_sha: { label: '下载后显示文件校验码', labelPos: 'right', type: 'checkbox', default: false, line: 'end', }, toastr: { label: '通知弹出位置', labelPos: 'left', type: 'select', 'options': ['左上', '右上', '中上','全铺'], default: '右上', }, }, events: { save: function(){ GM_config.close(); } }, }); }; config(); var G = GM_config; var localHref = window.location.href; var down_reg = /^(magnet|thunder|ftp|ed2k):/i; var sign_url = 'http://115.com/?ct=offline&ac=space'; var add_url = 'http://115.com/web/lixian/?ct=lixian&ac=add_task_url'; var lists_url = 'http://115.com/web/lixian/?ct=lixian&ac=task_lists'; function notice(){ GM_addStyle(GM_getResourceText('toastrCss')); if(G.get('toastr')=='全铺'|| localHref.indexOf('https://captchaapi.115.com') != -1) { GM_addStyle('.toast{font-size:15px!important;} .toast-title{font-size:16px!important;text-align:center}'); }else{ GM_addStyle('.toast{font-size:15px!important;width:350px!important;} .toast-title{font-size:16px!important;text-align:center}'); }; var place = {'左上':'toast-top-left','右上':'toast-top-right','中上':'toast-top-center'}[G.get('toastr')] || 'toast-top-full-width'; toastr.options = { "closeButton": true, "debug": false, "progressBar": true, "timeOut": 8000, "extendedTimeOut": 8000, "positionClass": place, "allowHtml": true, "newestOnTop" : false, }; }; notice(); function AjaxCall(href,callback) { GM_xmlhttpRequest({ method: "GET", url: href, onload: function(data,status) { if(data.readyState==4 && data.status==200){ var htmlTxt = data.responseText; callback(null,htmlTxt); }; }, onerror: function (error) { callback(error); }, ontimeout: function (error) { callback(error); }, }); }; function setFolder(){ var old_cid = GM_getValue('offlineFolder') || ''; var new_cid = prompt('请输入离线下载保存文件夹的cid值:\n ※ 获取cid值方法:打开需要保存到的网盘文件夹,复制地址栏中"cid="后面的一串数字,以"&"截止,如https://115.com/?cid=012345678912345678&...,cid值则为 012345678912345678。该项不填或填无效值则保存至默认文件夹(云下载)。※' ,old_cid); if (/^(\d{17,19}|0)$/.test(new_cid)){ GM_setValue('offlineFolder',new_cid); alert('设置成功,现cid值为:\n'+new_cid); }else if(new_cid==''){ GM_setValue('offlineFolder',''); alert('未输入cid值,保存至默认文件夹(云下载)。'); }else if(new_cid==null){ console.log('已点击取消'); }else{ alert('设置失败,cid值无效,请重新输入!\n(该值除根目录为 0 外,其他文件夹均为17至19位纯数字)'); setFolder(); }; }; function download(pid,sha){ var href = 'https://webapi.115.com/files/download?pickcode='+pid; AjaxCall(href,function(error,htmlTxt) { var json = JSON.parse(htmlTxt); if(json.state) { var link = json.file_url.replace(/\\/g,''); GM_openInTab(link); if (G.get('show_sha')){ setTimeout(function(){ prompt('文件下载中,校验码(SHA1)为:',sha); }, 1000); }; console.log('下载地址:\n'+link); console.log('校验码:\n'+sha); } else { toastr.warning(json.msg,'下载失败!'); }; }); }; function getHistory(pid){ return new Promise(function(resolve,reject){ var href = 'https://webapi.115.com/files/history?pick_code='+pid+'&fetch=one&category=1'; AjaxCall(href,function(error,htmlTxt){ var time = 0; if(error){ resolve(time); }; var json = JSON.parse(htmlTxt); if(json.state){ if(!json.data.watch_end){ time = json.data.time; }; }; resolve(time); }); }); }; function palyData(video,type){ if ((G.get('player') =='官方HTML5' && type == '115play') || type == 'dblclick'){ var link = 'https://115.com/?ct=play&pickcode='+video.pid+'&hls=1'; GM_openInTab(link,false); return; }; var herfLink = 'https://115.com/api/video/m3u8/'+video.pid+'.m3u8'; AjaxCall(herfLink,function(error,htmlTxt) { if (typeof htmlTxt == 'undefined') { transcoding(video.pid,video.sha); return; }; var dataList = htmlTxt.split('\n'); var m3u8 = []; var temp = '"YH"|原画|"BD"|4K|"UD"|蓝光|"HD"|超清|"SD"|高清|"3G"|标清'; var txt = temp.split('|'); for (var i=0; i<6; i++){ dataList.forEach(function (e,j,arr) { if (e.indexOf(txt[i*2])!= -1) { m3u8.push({name: txt[i*2+1], url: arr[j+1].replace(/\r/g,''), type:'hls'}); }; }); }; if (m3u8.length ==1 || G.get('play_Quality') =='最高'){ var num = 0; }else if(m3u8.length >1 && G.get('play_Quality') =='次高'){ var num = 1; }else{ var num = m3u8.length - 1; }; video['quality'] = num; if ((G.get('player') == 'Potplayer' && type == '115play') || type == 'Pot'){ window.location.href = 'potplayer://'+m3u8[num].url; return; }; GM_setValue('videoInfo',video); GM_setValue('m3u8List',m3u8); GM_openInTab('http://115.com/web/lixian/',false); }); }; function transcoding(pid,sha,fast){ var href = 'http://transcode.115.com/api/1.0/web/1.0/trans_code/check_transcode_job?sha1='+sha+'&priority=100'; console.log('转码进度地址:'+href); AjaxCall(href,function(error,htmlTxt){ var json = JSON.parse(htmlTxt); if(json.status == 1 || json.status == 3){ var num = json.count; var time = tranTime(json.time).replace(/分.*/,'分'); var txt = `等待转码排名:第${num}名,耗时:约${time},请稍后再试。`; }else if(json.status == 127){ var txt = '未获取到转码进度,请稍后再试。'; console.log('查询转码进度失败'); }; var h1 = `
转码进度详情`; var h2 = ''; if(fast==1){ var title ='加速转码成功!'; }else if(fast){ var title ='加速转码失败!'; var txt = fast; }else{ var title ='播放失败,视频未转码!'; h2 = `  加速转码`; }; toastr.warning(txt+h1+h2,title,{timeOut:10000}); }); }; function transcod_fast(pid,sha){ var push_url = 'https://115.com/?ct=play&ac=push'; var key = `op=vip_push&pickcode=${pid}&sha1=${sha}`; offline.getData(push_url,key).then(function(json){ if(json.state){ var fast= 1; transcoding(pid,sha,fast); console.log('加速转码成功!'); return; }else{ var fast= json.msg; transcoding(pid,sha,fast); console.log('加速转码失败!'); }; }); }; function change(number){ var size = ""; if(number < 1024 * 1024 * 1024){ size = (number/(1024 * 1024)).toFixed(2) + "MB"; }else{ size = (number/(1024 * 1024 * 1024)).toFixed(2) + "GB"; }; var sizeStr = size + ""; var index = sizeStr.indexOf("."); var dou = sizeStr.substr(index + 1 ,2) if(dou == "00"){ return sizeStr.substring(0, index) + sizeStr.substr(index + 3, 2) }; return size; }; function tranTime(num){ var showTime = ''; if (num > 3600) {showTime += ' '+parseInt(num/3600)+' 小时'; num = num%3600;} if (num > 60) {showTime += ' '+parseInt(num/60)+' 分'; num = num%60;} return showTime += ' '+parseInt(num)+' 秒'; }; function enterPiP(videoEl){ if(document.pictureInPictureEnabled && !videoEl.disablePictureInPicture) { if (!document.pictureInPictureElement) { videoEl.requestPictureInPicture(); }else{ document.exitPictureInPicture(); }; }else{ alert('浏览器不支持或已关闭画中画功能!'); }; }; function clickOne(el){ if (el.attr('clicked') == 1){ console.log('5s内不可点击该按钮'); return false; }else{ el.attr('clicked',1); el.css('opacity','0.2'); setTimeout(function(){ el.attr('clicked',0); el.css('opacity','0.7'); }, 5000); return true; }; }; function verify(){ var time = new Date().getTime(); var w=335; var h=500; var t = (window.screen.availHeight-h)/2; var l = (window.screen.availWidth-w)/2; var link = 'https://captchaapi.115.com/?ac=security_code&type=web&cb=Close911_'+time; var a = confirm('立即打开验证账号弹窗?\n(浏览器需允许弹出式窗口)'); if (a){ window.open(link,'请验证账号','height='+h+',width='+w+',top='+t+',left='+l+',toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,status=no'); }; }; function getRightUrl(url){ var newUrl = url; if(/^magnet/i.test(url)){ var hash=url.split('&')[0].substring(20) || url.substring(20); if(hash.length==32){ hash=base32To16(hash); }; newUrl='magnet:?xt=urn:btih:' + hash; }else if(/^thunder/i.test(url)){ var key = url.replace(/thunder:\/\//i,''); var temp = decode64(key); newUrl = temp.slice(2,-2); }else if(/^\/\//.test(url)){ newUrl=location.protocol + url; }else if(/^\/(?!\/)/.test(url)){ newUrl=location.protocol+'//'+location.host + url; }; return newUrl; }; function base32To16(str){ if(str.length % 8 !== 0 || /[0189]/.test(str)){ return str; }; str = str.toUpperCase(); var bin = "", newStr = "", i; for(i = 0;i < str.length;i++){ var charCode=str.charCodeAt(i); if(charCode<65)charCode-=24; else charCode-=65; charCode='0000'+charCode.toString(2); charCode=charCode.substr(charCode.length-5); bin+=charCode; }; for(i = 0;i < bin.length;i+=4){ newStr += parseInt(bin.substring(i,i+4),2).toString(16); }; return newStr; }; function getAttribute(e){ var data = [] ; $.each(e.attributes, function() { if(this.specified && this.value.length>30) { data.push(this.value); }; }); if($(e).text().length>25) data.push($(e).text()); return data; }; Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1, "d+": this.getDate(), "H+": this.getHours(), "m+": this.getMinutes(), "s+": this.getSeconds(), "q+": Math.floor((this.getMonth() + 3) / 3), "S": this.getMilliseconds() }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; }; $(document).ready(function(){ if(localHref.indexOf('https://115.com/') != -1) { if (typeof (unsafeWindow.USER_ID) != 'undefined') { GM_setValue('115ID', unsafeWindow.USER_ID); console.log('115账号已登录,账号ID获取成功!'); } else { if (G.get('hide_officeLogin')){ $('.ltab-office').hide(); }; if (G.get('hide_qrcodeLogin')){ $('.login-scene,.login-footer span:eq(0),.login-footer i:eq(0)').hide(); $('[lg_rel="login"]').show(); } else if ($('[lgb-nav="download"]').length > 0) { $('[lgb-nav="download"]').attr('lgb-nav','login'); }; console.log('115账号未登录,账号ID获取失败!'); }; var $topEl = $('#js_top_panel_box [menu="upload"]').addClass('btn-line'); if (G.get('show_Star')){ $topEl.after('星标'); }; if (G.get('show_Task')){ $topEl.after('链接任务'); }; $('body').append(` `); if (G.get('hide_sidebar')){ $('.sub-core').hide(); setTimeout(function(){ $('.main-core').css({'left':'16px','top':'16px'}); },50); }; if (G.get('file_Down')){ var herfd = 'li[rel="item"][file_type="1"]:not([down_button="1"])'; $('body').on('mouseenter',herfd,function(){ var $El = $(this).attr('down_button',1); $El.find('.file-opr a[menu="download_one"]').hide(); $El.find('.file-opr').prepend('快捷下载'); return false; }); }; var herfv = 'li[rel="item"][file_type="1"][file_mode="9"]:not([paly_button="1"])'; $('body').on('mouseenter',herfv,function(){ var $El = $(this).attr('paly_button',1); var cl = {'Dplayer':'Dp','Potplayer':'Pot','官方HTML5':'115play'}[G.get('player')]; $El.find('.name').addClass(cl).removeAttr('menu'); var txt0 = ['Pot','Dp']; var txt1 = ['使用Potplayer播放视频','使用Dplayer播放视频']; var txt2 = ['Pot播放','Dp播放']; for (var i=0; i<2; i++){ $El.find('.file-opr').prepend(''+txt2[i]+''); }; $El.not('.name').dblclick(function(){ var type = 'dblclick'; var pid1 = $El.attr('pick_code'); var video = {'pid':pid1}; palyData(video,type); return false; }); }); }; if(localHref.indexOf('https://captchaapi.115.com') != -1) { window.focus(); toastr.info('验证成功本页面将自动关闭.'); $('#js_ver_code_box').find('[rel="verify"]').click(function () { setTimeout(function(){ if($('[rel="error_box"]').attr('style').indexOf('none') != -1){ window.opener=null; window.open('','_self'); window.close(); }; }, 500); return false; }); }; if(localHref.indexOf(/115\.com\/\?ct=play|v\.anxia\.com/) != null) { $('.bar-side ul').prepend(`
  • 画中画
    开启画中画
  • `); }; var oldVer = GM_getValue('version') || ''; if (G.get('show_Update') && oldVer != newVersion){ var txt=`115优化大师 ${newVersion} 更新日志:\n更新日期:2020年11月7日 \n1、“离线升级”新增“自定义离线下载文件夹”,开启后,点击“设置文件夹”可指定离线下载数据保存到任意文件夹;\n2、Dplayer新增“开启云端记忆播放”选项,默认开启。播放记录自动上传至云端(115服务器),与官方播放器共用数据。原本地播放记录将自动上传,此后只在云端存储播放记录;\n3、优化删除操作,避免误删整个“云下载”(离线默认文件夹);\n4、“其他设置”新增“网盘顶部增加链接任务按钮”选项,默认开启;\n5、优化离线下载结果分析规则。`; setTimeout(function(){ alert(txt); },2000); GM_setValue('version',newVersion); }; }); if(localHref.indexOf('https://115.com/?cid=0&offset=0&mode=wangpan') != -1){ window.onload=function(){ if (G.get('show_Alidity') && typeof unsafeWindow.USER_ID != 'undefined'){ var login_info = 'http://passportapi.115.com/app/1.0/web/9.2/login_log/login_devices'; AjaxCall(login_info,function(error,htmlTxt) { var json = JSON.parse(htmlTxt); if(json.state==1) { var time = json.data.last.utime; var date = new Date(time * 1000); var loginTime = date.Format("yyyy年MM月dd日 HH:mm"); toastr.success('上次登录时间:'+loginTime,{timeOut:5000}); console.log('登录时间:\n'+loginTime); } else { var txt=json.error || '网络错误,未知时间!'; toastr.warning('上次登录时间:'+txt,{timeOut:5000}); }; }); }; }; }; if (localHref.match(/http:\/\/115\.com\/web\/lixian\/$/) != null ) { var m3u8 = GM_getValue('m3u8List'); var video = GM_getValue('videoInfo'); var titleTxt = video.name; var pickID = video.pid; var folderID = video.fid1; var videoID = video.fid2; var size = video.size; var sha = video.sha; var z = video.quality; var skipTime = G.get('skip_titles'); var skipTime2 = G.get('skip_credits'); $('pre').remove(); $('head').html(`${titleTxt} ${size}`); GM_addStyle(`html,body,div{margin:0;padding:0;border:0;outline:0;background:transparent}`); GM_addStyle(GM_getResourceText('dplayerCss')); $('body').append('
    '); function playVideo(m3u8) { var dp = new DPlayer({ container: $('#Dplayer')[0], screenshot: true, volume: 1, video: { quality: m3u8, defaultQuality: z, }, contextmenu: [ { text: '下载视频', click: function(t) { download(pickID,sha); } }, { text: '删除视频', click: function(t) { dp.pause(); var a = confirm('确认删除 '+titleTxt+' 视频文件?'); if (a){ offline.del(videoID) }; } }, { text: '查看文件夹', click: function(t) { GM_openInTab(`https://115.com/?cid=${folderID}&offset=0&mode=wangpan`,false); } }, { text: '删除文件夹', click: function(t) { var a = confirm('确认删除 '+titleTxt+' 视频所属文件夹?'); if (a){ offline.del(folderID); }; } }, { text: '设置星标', click: function(t) { var n=1; offline.setStar(videoID,n); } }, { text: '取消星标', click: function(t) { var n=0; offline.setStar(videoID,n); } }, { text: '重命名', click: function(t) { offline.newName(videoID,titleTxt); } }, ], }); unsafeWindow.dp = dp; $('#Dplayer').click(); $('.dplayer-menu').css('width','98px'); $('.dplayer-setting-loop,.dplayer-mobile-play,.dplayer-menu-item:gt(-3)').hide(); if(m3u8.length >1){ $('.dplayer-quality button').css('color','Lime'); }; $('.dplayer-quality').after(`
    `); dp.on('loadstart', function (){ dp.notice('视频加载中,请稍侯。', 1000); }); var a = 0; dp.on('loadeddata', function () { dp.notice('视频加载完成。', 1000); a++; if(a!=1) return; setTimeout(function(){ getHistory(pickID).then(function(onTime){ if (G.get('online_List') && onTime > skipTime){ dp.seek(onTime); dp.notice('已跳转到上次观看进度'+tranTime(onTime), 2500); }else if(skipTime>0){ dp.seek(skipTime); dp.notice('已跳过片头'+skipTime+'秒', 2500); }; if(m3u8.length >1){ setTimeout(function(){ dp.notice('本视频支持切换清晰度', 2500); }, 3000); }; if (document.hidden && G.get('Tab_ing')){ return; }; dp.play(); }); }, 1000); }); dp.on('timeupdate', function(){ if((dp.video.duration - dp.video.currentTime) <= (skipTime2 >0? skipTime2:30)){ var played=1; GM_setValue('played',1); dp.notice('已跳过片尾'+skipTime2+'秒', 2500); dp.pause(); a++ if(a%2==0){ setTimeout(function(){ alert('视频已播放结束!'); }, 500); }; }else{ var played=0; GM_setValue('played',0); }; }); function upTime(one){ var up = setInterval(function (){ var played=GM_getValue('played') || 0; var newTime=dp.video.currentTime.toFixed(0); var key = { 'op': 'update', 'pick_code': pickID, 'time': played? 0:newTime, 'definition': played, 'category': 1 }; var history_url='https://webapi.115.com/files/history'; offline.getData(history_url,$.param(key)).then(function(json){ json.state ? console.log('上传播放记录成功!'):console.log('上传播放记录失败,'+json.error); }); dp.on('pause', function(){ setTimeout(function(){ clearInterval(up); }, 3100); }); dp.on('error', function(){ setTimeout(function(){ clearInterval(up); }, 3100); }); if(one || played){ clearInterval(up); }; }, 3000); }; if (G.get('online_List')){ dp.on('playing', function(){ upTime(false); }); dp.on('seeked', function(){ upTime(true); }); }; var oldList = GM_getValue('palyList') || ''; if (oldList != ''){ setTimeout(function(){ for(let id in oldList){ var offTime=oldList[id].toFixed(0); var history_url='https://webapi.115.com/files/history'; var newTime=dp.video.currentTime.toFixed(0); var key = { 'op': 'update', 'pick_code': id, 'time': offTime, 'definition': 0, 'category': 1 }; offline.getData(history_url,$.param(key)).then(function(json){ json.state ? console.log(id+':上传播放记录成功!'):console.log(id+':上传播放记录失败,'+json.error); }); }; GM_setValue('palyList',''); }, 1000); }; dp.on('error', function(){ alert('视频加载失败!'); return }); dp.on('ended', function(){ alert('视频播放结束!'); }); }; playVideo(m3u8); }; var offline = function(){ return { getSign:function(key){ return new Promise(function(resolve, reject){ if (/^\w+=/.test(key)){ resolve(key); return; }; var UserID = GM_getValue('115ID') || ''; var cid = G.get('diy_folder')? GM_getValue('offlineFolder'):''; GM_xmlhttpRequest({ method: 'GET', url: sign_url, responseType: 'json', onload: function(result){ if (result.responseText.indexOf('html')!= -1) { toastr.error('请先登录115网盘账号!','离线任务添加失败。'); setTimeout(function(){ var a = confirm('立即打开115网盘登录页面?'); if (a){ GM_openInTab('https://115.com/?mode=login',false); }; }, 3000); return; }; var data = { uid: UserID, sign: result.response.sign, time: result.response.time, url: key, wp_path_id: cid }; resolve($.param(data)); }, onerror: function(error){ reject(error); }, }); }); }, getData:function (herf,key){ return offline.getSign(key).then(function(value){ return new Promise(function(resolve, reject){ GM_xmlhttpRequest({ method: 'POST', data: value, url: herf, responseType: 'json', headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Accept": "application/json, text/javascript, */*; q=0.01", Origin: "http://115.com", "X-Requested-With": "XMLHttpRequest" }, onload: function(result){ resolve(result.response); }, onerror: function(error){ reject(error); }, }); }); }); }, del:function(id){ if(id == 0){ alert('网盘根目录,不可删除!'); return ; }; var Link = 'http://115.com/?ct=lixian&ac=get_id'; AjaxCall(Link,function(error,htmlTxt){ var json = JSON.parse(htmlTxt); if(json.cid == id){ alert('云下载(离线保存默认文件夹),不可删除!'); return ; }; var del_url ='https://webapi.115.com/rb/delete'; var key = 'fid='+id; offline.getData(del_url,key).then(function(json){ if(json.state){ var a = confirm('删除成功,可从回收站还原。是否立即关闭本页面?'); if (a){ window.opener=null; window.open('','_self'); window.close(); }; } else { alert('删除失败:'+json.error); }; }); }); }, setStar:function (fid,n){ var txt = {'1':'设置','0':'取消'}[n]; var star_url ='https://webapi.115.com/files/star'; var key = `file_id=${fid}&star=${n}`; offline.getData(star_url,key).then(function(json){ json.state ? alert(txt+'星标成功!') : alert(txt+'星标失败:'+json.error); }); }, newName:function (fid,name){ var suffix = name.match(/\.\w{2,4}$/)[0]; var name2 = name.replace(suffix,''); var a = prompt('请输入新的文件名:\n(不包含后缀 '+suffix+')',name2); if (a!=null && a!=""){ var edit_url ='https://webapi.115.com/files/edit'; var key = `fid=${fid}&file_name=${a+suffix}`; offline.getData(edit_url,key).then(function(json){ console.log('重命名结果:'); console.log(json); if(json.state) { alert('重命名成功!现文件名为:\n'+json.file_name); } else { alert('重命名失败!原因:'+json.error); }; }); }; }, search:function (name,fid1,callback){ var title = new Array(); title[0] = name.replace(/(\.|-|_)?(f?hd|sd|720p|1080p|full|mp4|avi|mkv|wmv|rmvb|rm|flv|f4v)/gi,' '); title[1] = title[0].replace(/\/|&|-|\.|\?|=|:|#|_|@/g,' '); title[2] = '.'; var a = 0; function add2(){ if(a == 3){ console.log('该文件夹无视频文件。'); callback(false); return; }; var searchLink = 'https://webapi.115.com/files/search?cid='+fid1+'&search_value='+encodeURIComponent(title[a])+'&type=4'; AjaxCall(searchLink,function(error,htmlTxt){ if (typeof htmlTxt == 'undefined'){ a++; add2(); }else{ var json = JSON.parse(htmlTxt); if(a == 2 && json.folder.name == '云下载'){ callback(false); return; }; if(json.count > 0){ var num= json.count; for(var i=0; i打开任务列表`; if(document.hidden){ GM_setValue('noTimeOut',true); toastr.options.timeOut = 0; console.log('已切换到后台,暂停通知超时'); }else{ GM_setValue('noTimeOut',false); toastr.options.timeOut = 12000; }; var c = 1; var retry = false; var txt2 = '5秒后自动重试,请稍等。'; function add(retry,txt2){ if(c == 4){ console.log('离线结果查询异常。离线任务数量过多,请清空后再试。'); toastr.warning('离线任务数量过多,请清空后再试。', '离线结果查询异常!'); return; }; var key = ''; var lists_url2 = lists_url+'&page='+c; console.log('离线任务数据地址:'+lists_url2); offline.getData(lists_url2,key).then(function(json){ console.log('离线任务列表第'+c+'页:'); console.log(json); if(json.state){ for (var k=0; k= 99 && fid1 != 0){ var name = dataEl.name; if (show_result && !retry) { var txt = `文件(夹)名:${dataEl.name},大小:${change(dataEl.size)}。`; toastr.success(txt+a_list, '离线下载已完成',{timeOut:5000}); }; if (G.get('open_search')) { offline.search(name,fid1,function(search_result,video,j,num) { if (search_result) { if (G.get('search_result')) { var videoTxt = JSON.stringify(video); var txt = `文件名:${video.name},大小:${video.size},时长:${tranTime(video.time)}。`; var h1 = `
    播放`; var h2 = `  下载`; var h3 = `  删除`; var h4 = `  重命名`; var h5 = `  查看`; toastr.success(txt+h1+h2+h3+h4+h5,`发现第 ${j} 个视频(共 ${num} 个)`);//,{timeOut:12000} }; if (G.get('open_Popup') && j==1){ setTimeout(function(){ var type = '115play'; palyData(video,type); }, 500); }; }else{ if( dataEl.move == 2 || dataEl.move == 0 || dataEl.status == 0){ var txt = '离线数据取回网盘中。'; }else{ var txt = '未发现任何视频文件。'; }; var h1 = `
    打开文件列表`; toastr.warning(txt+txt2+h1, '视频搜索无结果!'); if (!retry){ setTimeout(function(){ retry = true; txt2=''; toastr.clear(); console.log('重试搜索结果:'); add(retry,txt2); }, 5000); }; }; }); }; }else if(show_result) { var txt = `文件(夹)名:${dataEl.name},下载进度为:${down_result}%。`; toastr.warning(txt+a_list, '离线下载中...'); console.log(`文件(夹)名:${dataEl.name},下载进度为:${down_result}%`); }; }else if(show_result) { var txt = '未知原因,请到115查看。'; toastr.error(txt+a_list,'离线下载失败!',{timeOut:8000}); return; }; break; }else if(k == (json.tasks.length-1)) { console.log('第'+c+'页查询失败,无匹配数据'); if(c == json.page_count) { console.log('离线链接对比异常,已搜索所有离线列表页面,无返回结果。'); toastr.warning('搜索参数错误。', '离线结果查询异常!',{timeOut:5000}); return; }; c++ add(); }; }; }else{ toastr.error('查询离线结果失败。','服务器错误!'); return; }; }); }; add(retry,txt2); }, addButton:function(){ $('[href]').each(function(){ var url = $(this).attr('href'); var reg1 =/\.(torrent|rar|zip|7z|mp4|rmvb|mkv|avi)$/i; var $El = $(this).parent().filter('li,td,th,:header').find('[Searched]'); if ( (!down_reg.test(url) && !reg1.test(url)) || $(this).is('[Searched]') || $El.length>1 || ($El.length=1 && url.indexOf($El.attr('Searched')) != -1)){ return; }; if (down_reg.test(url)){ $(this).attr('Searched',url.split(':')[0]); }else if(/torrent$/i.test(url)){ $(this).attr('Searched','torrent'); }else{ $(this).attr('Searched','other'); }; var link = getRightUrl(url); $(this).css('display','inline-block'); $(this).after(''); }); }, addLink:function(){ $('a:not(.zcopy)').each(function(){ var reg1 =/(\/|&|-|\.|\?|=|:|#|_|@)([a-f0-9]{40}|[A-Z2-7]{32})(?!\w)/i; var reg2 =/[a-z]{40}|[a-z]{32}/i; if ($(this).next().addBack().is('[Searched],[href*="google"],[href*="motelppp.com"],[href*="bvmqkla.de"]') || $(this).find('img').length>0 || $(this).parent().filter('li,td,th').find('[Searched]').length>0){ return; }; var url = getAttribute(this); if(url.length>0){ for(var i=0;i'); return; }; }; }; }); }, }; }(); $(document).ready(function(){ $(document).on('visibilitychange',function (e){ var isHidden = e.target.hidden; if (localHref.match(/115\.com\S*(lixian|play)|v\.anxia\.com/) != null && G.get('Tab_ing') && !document.pictureInPictureElement){ var video = $('#js-video')[0] || dp ; isHidden ? video.pause() : video.play(); return; }; var noTimeOut=GM_getValue('noTimeOut') || ''; if (isHidden){ }else if(noTimeOut){ GM_setValue('noTimeOut',''); setTimeout(function(){ toastr.clear(); }, 12000); }else{ }; }); $('body').on('click mouseenter mouseleave','.openPiP',function(e){ if(e.type == 'click'){ enterPiP($('video')[0]); }else if(e.type == 'mouseenter'){ $(this).css('opacity', 1); }else if(e.type == 'mouseleave'){ $(this).css('opacity', 0.7); }; return false; }); $('body').on('click','.transcode_show,.transcode_fast',function(){ var pid = $(this).data('pid'); if($(this).is('.transcode_show')){ var link = 'https://115.com/?ct=play&pickcode='+pid+'&hls=1'; GM_openInTab(link,false); }else{ var sha = $(this).data('sha'); transcod_fast(pid,sha); }; return false; }); $('body').on('click','.115play,.Dp,.Pot',function(){ if (!clickOne($(this))) return; var type = $(this).attr('class').replace(/name\s?/g,''); if ($(this).is('[data]')){ var video = JSON.parse($(this).attr('data')); }else{ var $El = $(this).parents('li'); var video = {}; video['name'] = $El.attr('title').replace(/\s*/g, ''); video['pid'] = $El.attr('pick_code'); video['fid1'] = $El.attr('cid'); video['fid2'] = $El.attr('file_id'); video['size'] = change($El.attr('file_size')); video['sha'] = $El.attr('sha1'); }; palyData(video,type); return false; }); $('body').on('click','.115down',function(){ if (!clickOne($(this))) return; if ($(this).is('[data]')){ var video = JSON.parse($(this).attr('data')); var pid = video.pid; var sha = video.sha; }else{ var $El = $(this).parents('li'); var pid = $El.attr('pick_code'); var sha = $El.attr('sha1'); }; download(pid,sha); return false; }); $('body').on('click','.115del,.115newName',function(){ if (!clickOne($(this))) return; var video = JSON.parse($(this).attr('data')); var title = video.name; var folderID = video.fid1; var videoID = video.fid2; if($(this).is('.115del')){ var a = confirm('确认删除 '+title+' 视频所属文件夹?'); if (a){ offline.del(folderID); }; }else{ offline.newName(videoID,title); }; return false; }); $('body').on('click','.openList:not([click="1"]),.openFolder:not([click="1"])',function(){ $(this).attr('click', '1'); if($(this).is('.openList')){ var txt='tab=offline'; }else{ var fID=$(this).attr('data'); var txt='cid='+fID+'&offset=0'; }; GM_openInTab('https://115.com/?'+txt+'&mode=wangpan',false); return false; }); $('body').on('contextmenu','.115offline',function(){ GM_setClipboard($(this).data('href')); toastr.success('下载地址复制成功!'); return false; }); $('body').on('click','.115offline',function(){ if (!clickOne($(this))) return; var link = $(this).data('href'); offline.getData(add_url,link).then(function(json){ console.log('离线任务添加结果:'); console.log(json); if(json.state){ if (G.get('offline_result')) { var txt = '10秒后显示离线结果。'; }else{ var txt = link if (G.get('open_List')){ setTimeout(function(){ GM_openInTab('https://115.com/?tab=offline&mode=wangpan',false); }, 2000); }; }; toastr.info(txt,'离线任务添加成功。',{timeOut:10000}); setTimeout(function(){ offline.check(link) }, 10000); } else if (json.errcode == 10008){ toastr.warning('任务已存在,无需重复添加。','离线任务添加无效!',{timeOut:5000}); if (G.get('open_List')){ setTimeout(function(){ GM_openInTab('https://115.com/?tab=offline&mode=wangpan',false); }, 2000); }; offline.check(link); } else if (json.errcode == 911){ toastr.warning('账号异常,请验证账号。','离线下载失败!',{timeOut:5000}); setTimeout(function(){ verify(); }, 1000); } else { toastr.warning(json.error_msg,'离线任务添加失败!',{timeOut:12000}); }; console.log('离线链接:'+link+' 添加结果:'+json.state+' 原因:' +json.error_msg); }, function(error) { toastr.error('服务器繁忙,请稍后再试。','离线任务添加异常!'); console.log(error); }); return false; }); if (G.get('offline_Down') && localHref.indexOf('115.com') == -1){ if (localHref.match(/[0-9]mag\.net|yhg\w+\.\w+\/search/) != null) { var time1 = setInterval(function(){ offline.addButton(); if($('.115offline').length==20){ clearInterval(time2); }; }, 500); setTimeout(function(){ clearInterval(time2); },3000); } else if(localHref.match(/pianku/) != null){ var time2 = setInterval(function(){ if (document.readyState == 'complete'){ if(localHref.match(/\/bt\//) != null){ var key =$('script:eq(-2)').text().match(/'.{13}'/)[0]; $('body').append(` `); }else{ $('body').append(''); }; offline.addButton(); setTimeout(function(){ clearInterval(time2);//清除定时[data-clipboard-text] },2000); }; }, 200); $('body').on('click','.torrent:not([Searched])',function(){ setTimeout(function(){ offline.addButton(); },50); }); } else { setTimeout(function(){ offline.addButton(); },200); if (G.get('fuzzy_find')){ setTimeout(function(){ offline.addLink(); },300); }; }; }; }); })();