// ==UserScript==
// @name B站视频下载
// @namespace https://bbs.tampermonkey.net.cn/
// @version 0.1.2
// @description 视频下方添加下载按钮,点击下载后上方会出现下载进度条!注意:不保证所有视频都能下载!!!
// @author 张仨
// @noframes
// @match https://www.bilibili.com/video/*
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @grant GM_download
// @connect www.mxnzp.com
// @require https://cdn.jsdelivr.net/npm/ajax-zhangsan/ajax.min.js
// ==/UserScript==
let downloadButton = document.createElement('div')
let ops = document.querySelector('#arc_toolbar_report .ops');
ops.addEventListener("DOMNodeInserted", () => {
ops.parentElement.appendChild(downloadButton);
})
downloadButton.id = "downloadButton"
downloadButton.innerHTML = `
视频下载`
let progres = document.createElement('div')
document.body.appendChild(progres)
progres.id = 'my-box'
progres.innerHTML = `
`
function Download(url, name) {
let progress_box = document.querySelectorAll(".progress-box span")
GM_download({
url: url,
name: name + ".mp4",
saveAs: true,
onprogress: (pro) => {
let progress = document.querySelector(".progress")
let percentage = Math.round(pro.loaded / pro.totalSize * 10000) / 100.00 + "%"
progress.style.width = percentage
progress_box[1].innerHTML = percentage
progress_box[0].innerHTML = "下载中...请稍等!"
},
onload: () => {
progress_box[0].innerHTML = "下载完成,即将弹出'另存为'对话框"
setTimeout(() => {
progres.style.display = 'none'
downloadButton.style.display = 'inline-block'
}, 6000);
},
onerror: () => {
alert("下载错误,请稍后重试!")
}
})
}
downloadButton.addEventListener('click', () => {
let newAjax = new Ajax(location.href)
newAjax.then(res => {
if (res.list.length == 0) {
alert("获取数据失败,请稍后重试!")
} else {
progres.style.display = 'block'
downloadButton.style.display = 'none'
if (res.list.length > 1) {
let num = prompt("请输入需要下载的那一集")
if (num != null && num != "") {
num = Number(num) - 1
Download(res.list[num].url, res.list[num].title)
} else {
progres.style.display = 'none'
downloadButton.style.display = 'inline-block'
}
} else {
Download(res.list[0].url, res.title)
}
}
}).catch(err => {
alert(err)
})
})
GM_addStyle(`
#my-box{
position: fixed;
top: 0;
left: 0;
right: 0;
margin: auto;
width: 450px;
height: 100px;
z-index: 9999999;
border-radius: 10px;
background: rgba(243, 247, 247, 0.9);
animation: topDown 0.3s;
display: none;
}
@keyframes topDown {
from {
top: -200px;
opacity: 0
}
to {
top: 0;
opacity: 1
}
}
.progress-box {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
height: 20px;
width: 400px;
border-radius: 10px;
background-color: gainsboro;
}
.progress-box span {
color: #1b53ec;
}
.progress {
width: 0;
height: 100%;
border-radius: 10px;
background-color: #1b53ec;
transition: width .3s;
background-image: linear-gradient(90deg,
rgba(255, 255, 255, 0),
rgba(255, 255, 255, 1),
rgba(255, 255, 255, 0));
background-size: 40px 100%;
background-repeat: no-repeat;
background-position: left -40px top 0;
animation: shine 2s ease infinite;
}
@keyframes shine {
to {
background-position: right -40px top 0;
}
}
#downloadButton {
position: relative;
left: 30px;
width: 120px;
height: 25px;
display: inline-block;
fill: #757575;
color: #757575;
cursor: pointer;
z-index: 9999999;
}
#downloadButton svg {
vertical-align: middle;
line-height: initial;
}
#downloadButton:hover {
fill: #17a2d4;
color: #17a2d4;
}
`)