Skip to content

Instantly share code, notes, and snippets.

@zhangnew
Last active June 18, 2020 08:31
Show Gist options
  • Save zhangnew/c89d0a06bd3ddb5ed6fef487b2cc3b2e to your computer and use it in GitHub Desktop.
Save zhangnew/c89d0a06bd3ddb5ed6fef487b2cc3b2e to your computer and use it in GitHub Desktop.
// ==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/jquery@3.5.1/dist/jquery.min.js
// @require https://cdn.jsdelivr.net/npm/toastr@2.1.4/toastr.min.js
// @resource toastr_css https://cdn.jsdelivr.net/npm/toastr@2.1.4/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