// ==UserScript==
// @name 视频嗅探
// @namespace http://tampermonkey.net/
// @version 0.5
// @description 自动嗅探页面上的视频资源,将链接展示出来,并提供复制和下载方法(除部分流媒体不能下载,需要专用的下载器)。
// @author geigei717
// @license MIT
// @match https://*/*
// @match http://*/*
// @icon https://img-blog.csdnimg.cn/20181221195058594.gif
// @require https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js
// @noframes
// @grant unsafeWindow
// @grant GM_addElement
// @grant GM_download
// @grant GM_setClipboard
// @grant GM_xmlhttpRequest
// @connect *
// @downloadURL none
// ==/UserScript==
(function() {
var n=1 //默认关闭 1关闭,0开启
let URLs = [];
unsafeWindow.GM_D = [];
var mn = -1
$("body").append("
" +
"
   视频链接:部分m3u8等流媒体无法下载,需要专用下载器
" +
"
" +
"
" +
"
")
.append("")
$(".MyUrls").append(" 0、
")
$("#MyUpDown").click(function () {
$("#MyUrls").slideToggle("slow", function () {
if (mn=="1"||mn==1){
$("#MyUpDown span").text('+')
}else {
$("#MyUpDown span").text('–')
$("#redPoint").css("display","none")
}
mn = -mn;
});
})
$("body>[id!=MyUpDown][id!=MyUrls]").click(function () {
if($("#MyUrls").css("display")!="none"){
$("#MyUpDown").click()
}
})
functionAll("")
function functionAll(u){
//跳转链接
$(".GoUrl"+u).click(function (){
var url = $(this).prevAll("p").attr("title")
var link = document.createElement('a');
link.href = url;
link.target="_blank";
link.click();
link.remove();
})
//复制链接
$(".CopyUrl"+u).click(function (){
var url = $(this).prevAll("p").attr("title")
GM_setClipboard(url);
$(this).text("已复制")
})
//下载链接
$(".SaveUrl"+u).click(function (){
//$(obj).attr("disabled","disabled")
var that = $(this)
var url = $(that).prevAll(".downUrl"+u).val()
if(url==undefined||url.trim()==''){
url = $(that).prevAll(".downUrl"+u).attr('title')
if(url==undefined||url.trim()==''){return;}
}
var name = $(that).prevAll(".downName"+u).val()
if(name==undefined||name.trim()==""){
name = $('title').text()
if(name==undefined||name.trim()==""){
name = url.split("/").pop().split("?")[0]
if(name==undefined||name.trim()==""){
name = "video.mp4"
}
}
}
if(! /\.[\w]+$/.test(name)){ name = name + ".mp4"}
//console.log(name,url)
$(that).css("display","none").next('.StopSaveUrl'+u).css("display","inline-block")
GM_xmlhttpRequest({
method: "HEAD",
fetch: true,
url: url,
onerror: function(x) {
$(that).text("错误").css("display","inline-block").next(".StopSaveUrl"+u).css("display","none").text("0%");
},
onload: function(response) {
if( response.status /100 >=4){
$(that).text("错误").css("display","inline-block").next(".StopSaveUrl"+u).css("display","none").text("0%");
return;
}
var Length =response.responseHeaders.match(/content-length:\s*[\d]+\s*content-type/im)[0].match(/\d+/)[0]
Length = parseInt(Length);
var RangeSize = parseInt((Length/5).toFixed(0))
var request = [];
var blob = [];
var loadSize = [];
var xhrs = 0
for(var i=0,z=0;i=Length) {range_end = Length}
//console.log(range_start,range_end)
eval('function onprogress'+z+' (event){'+
'loadSize['+z+'] = event.loaded;'+
'var x =0;'+
'loadSize.forEach(function(item){'+
' x = x + item'+
'});'+
'var loaded = parseInt(x / Length * 100);'+
'if(loaded==100){'+
' $(that).text("下载").css("display","inline-block").next(".StopSaveUrl'+u+'").css("display","none");'+
'}else{'+
' $(that).next(".StopSaveUrl'+u+'").text(loaded+"%"); '+
//' console.log(loaded+"%")'+
'}'+
'}'+
'request['+z+'] = GM_xmlhttpRequest({'+
'method: "GET",'+
'url: url,'+
'fetch: false,'+
'responseType: "arraybuffer",'+
'headers: { "Range":"bytes="+range_start+"-"+range_end},'+
'onprogress: onprogress'+ z +','+
'onload: function(response) {'+
' blob[' + z + '] = new Blob([response.response]);' +
//' console.log(blob);' +
' var x=0;' +
' loadSize.forEach(function(item){' +
' x = x + item' +
' });' +
' if (x == Length) {' +
' var link = document.createElement("a");' +
' link.href = window.URL.createObjectURL(new Blob(blob));' +
' link.download = name;' +
' link.click();' +
' link.remove();' +
' $(that).text("下载").css("display","inline-block").next(".StopSaveUrl'+u+'").css("display","none").text("0%");'+
' }' +
'},'+
'onabort: function(){'+
//'$(that).text("继续").css("display","inline-block").next(".StopSaveUrl1").css("display","none").text("0%");'+
'console.log("error!");'+
'},'+
'onerror: function(x) {'+
'$(that).text("错误").css("display","inline-block").next(".StopSaveUrl'+u+'").css("display","none").text("0%");'+
'console.log("error!");'+
'request['+z+'].forEach(function(item){'+
'item.abort()'+
'})'+
'},'+
'});')
}
//console.log(request)
var num =GM_D.push(request)
$(that).next('.StopSaveUrl'+u).data('num',num-1)
}
});
})
//停止
$(".StopSaveUrl"+u).click(function (){
var num = $(this).data("num")
GM_D[num].forEach(function(item){
item.abort()
})
$(this).css("display","none").text("0%").prev(".SaveUrl"+u).text("继续").css("display","inline-block");
})
}
function getNetworkRequsts(){
return performance.getEntriesByType("resource").filter((entry) => {
return entry.initiatorType === "xmlhttprequest"||entry.initiatorType === "video";
});
}
var observer = new PerformanceObserver(perf_observer);
observer.observe({entryTypes: ["resource"]})
function perf_observer(list,observer){
var z,m,length=$('.isUrl').length;
var scripts =getNetworkRequsts()
scripts.forEach(function (x,i) {
if (x.initiatorType === "xmlhttprequest") {
z = x.name.trim()
if(/m3u8/.test(x.name) && !/\.ts/.test(x.name)){
if(! URLs.includes(z) ){
m = URLs.push(z)-1
//console.log('type: m3u8 , url: ' + x.name)
$(".urlnone").remove()
$(".MyUrls").append("")
functionAll(m)
}
}else if(/\.mp4$/.test(z.split('?')[0])){
if(! URLs.includes(z) ){
m =URLs.push(z)-1
//console.log('type: m3u8 , url: ' + x.name)
$(".urlnone").remove()
$(".MyUrls").append("")
functionAll(m)
}
}
}
if (x.initiatorType === "video" && !/\.jpg/.test(x.name)) {
z = x.name.trim()
if(! URLs.includes(z) ){
m =URLs.push(z)-1
//console.log('type: video , url: ' + x.name)
$(".urlnone").remove()
$(".MyUrls").append("")
functionAll(m)
}
}
})
$("video").each(function () {
if(!/^blob:/.test(this.currentSrc)){
z = this.currentSrc.trim()
if(! URLs.includes(z)&& this.currentSrc!=""){
m =URLs.push(z)-1
//console.log('type: video , url: ' + this.currentSrc)
$(".urlnone").remove()
$(".MyUrls").append("")
functionAll(m)
}
}
$(this).find("source").each(function () {
if($(this).attr('src')!=''&&$(this).attr('src')!=undefined){
if(!/^(http:|https:)/.test($(this).attr('src'))){
z = location.href.split("://")[0] +':'+ $(this).attr('src').trim()
}else{
z = $(this).attr('src').trim()
}
if(! URLs.includes(z) && z != ""){
m =URLs.push(z)-1
//console.log('type: src , url: ' + z)
$(".urlnone").remove()
$(".MyUrls").append("")
functionAll(m)
}
}
})
})
if($('.isUrl').length > length){
if($("#MyUrls").css("display")=="none"){
$("#redPoint").css("display","block")
if(n==0){
$("#MyUpDown").click()
n = 1
}
}
}
}
})();