Last active
June 18, 2020 08:31
-
-
Save zhangnew/c89d0a06bd3ddb5ed6fef487b2cc3b2e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name 北师大云盘下载器 | |
// @namespace https://zhangnew.com/ | |
// @version 0.2 | |
// @description 解除下载限制,通过调用预览接口,清晰度稍有下降。(点击下载之后稍等一会儿,会在下载完成之后弹出保存) | |
// @author zhangnew | |
// @homepage https://zhangnew.com/ | |
// @downloadURL https://gist.github.com/zhangnew/c89d0a06bd3ddb5ed6fef487b2cc3b2e/raw/pan_bnu_download.user.js | |
// @updateURL https://gist.github.com/zhangnew/c89d0a06bd3ddb5ed6fef487b2cc3b2e/raw/pan_bnu_download.user.js | |
// @match https://pan.bnu.edu.cn/link/view/* | |
// @grant GM_xmlhttpRequest | |
// @grant GM_addStyle | |
// @grant GM_getResourceText | |
// @grant GM_download | |
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js | |
// @require https://cdn.jsdelivr.net/npm/[email protected]/toastr.min.js | |
// @resource toastr_css https://cdn.jsdelivr.net/npm/[email protected]/build/toastr.min.css | |
// ==/UserScript== | |
GM_addStyle(GM_getResourceText('toastr_css')); | |
toastr.options.timeOut = 5000; | |
(function() { | |
'use strict'; | |
const uuid = window.location.pathname.split("/")[3]; | |
function getMetaData(path){ | |
// 获取所有视频信息 | |
let meta_url = "https://pan.bnu.edu.cn/v2/delivery/metadata/" + uuid + '/' + path; | |
let $list = $('.display-name'); | |
let response = GM_xmlhttpRequest({ | |
method: "GET", | |
url: meta_url, | |
onload: function(response) { | |
let meta = JSON.parse(response.responseText); | |
console.log('当前目录:' + meta.path); | |
var cnt_dir = 0; | |
var cnt_mp4 = 0; | |
$list.each(function(e){ | |
let item_title = this.text; | |
var is_dir = false; | |
meta.content.forEach(item => { | |
let p = item.path.split('/'); | |
// 取路径中的最后一个 | |
if(p[p.length-1] === item_title){ | |
is_dir = item.is_dir;p[p.length-1] | |
} | |
}); | |
if(is_dir){ | |
cnt_dir += 1; | |
} else if (item_title.endsWith('mp4')){ | |
cnt_mp4 += 1; | |
} | |
}); | |
toastr.success('发现' + $list.length + '条数据,' + cnt_dir + '个目录,' + cnt_mp4 + '条视频', getTitle()); | |
let $ico_d = $('.cmd-download'); | |
$ico_d.show(); | |
$ico_d.toggleClass('cmd-download cmd-download-unbind'); // 取消原来的下载功能 | |
let $btn_d = $('.i-download'); | |
$btn_d.click(function(event) { | |
// 视频标题 | |
var item_title = event.target.parentNode.parentNode.parentElement.getElementsByClassName('display-name')[0].text | |
meta.content.forEach(item => { | |
let p = item.path.split('/'); | |
if(p[p.length-1] === item_title){ | |
if(item.is_dir){ | |
toastr.error('禁止下载目录:' + item_title); | |
return | |
}; | |
console.log("click " + item.path); | |
GM_download(item.preview_url, item_title); | |
toastr.success('开始下载,请稍候~', item_title); | |
} | |
}); | |
}); | |
} | |
}); | |
}; | |
function getTitle(){ | |
return document.getElementById('listHeader').getElementsByClassName('fold-name')[0].textContent | |
}; | |
function isTopDir(){ | |
let dom_title = document.getElementById('listHeader').getElementsByClassName('fold-name')[0]; | |
return dom_title.textContent === dom_title.title; | |
}; | |
function addMonitor(){ | |
// 选择需要观察变动的节点: 文件列表 | |
let targetNode = document.getElementById('listBody').getElementsByClassName('list-wraper')[0]; | |
// 观察器的配置(需要观察什么变动) | |
let config = { attributes: true, childList: true, subtree: false, characterData: true }; | |
// 当观察到变动时执行的回调函数 | |
let callback = function(mutations) { | |
// 这里只需要获取第一个变化,否则会重复 | |
if (mutations[0].type == 'childList') { | |
let text = getTitle(); | |
//console.log('切换目录:' + text); | |
if(isTopDir()){ | |
getMetaData(''); | |
}else{ | |
getMetaData(text); | |
} | |
} | |
}; | |
// 创建一个观察器实例并传入回调函数 | |
let observer = new MutationObserver(callback); | |
// 以上述配置开始观察目标节点 | |
observer.observe(targetNode, config); | |
}; | |
setTimeout( function loading() { | |
let $list = $('.display-name'); | |
if ($list.length > 0){ | |
console.log("origin pan data loaded."); | |
if($('.cmd-download').is(':visible')){ | |
return; | |
} | |
addMonitor(); | |
getMetaData(''); | |
} else { | |
// wait a moment and check again | |
console.log('wait for data.'); | |
setTimeout( loading , 500); | |
} | |
} , 500); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment