🎉 欢迎访问GreasyFork.Org 镜像站!本镜像站由公众号【爱吃馍】搭建,用于分享脚本。联系邮箱📮

Greasy fork 爱吃馍镜像

柒灵全能视频下载器

(目前支持)哔哩哔哩(bilibili)/优酷网(youku)/腾讯视频(qq)/爱奇艺(iqiyi)/中国大学慕课网(www.icourse163.org)视频批量下载, 加速下载, 随时随地想看就看. 支持微元素/花瓣网图片批量下载

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

🚀 安装遇到问题?关注公众号获取帮助

公众号二维码

扫码关注【爱吃馍】

回复【脚本】获取最新教程和防失联地址

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

🚀 安装遇到问题?关注公众号获取帮助

公众号二维码

扫码关注【爱吃馍】

回复【脚本】获取最新教程和防失联地址

// ==UserScript==
// @name         柒灵全能视频下载器
// @namespace    https://weibo.com/guoxuebiji/profile?is_all=1
// @version      2.6.9
// @description  (目前支持)哔哩哔哩(bilibili)/优酷网(youku)/腾讯视频(qq)/爱奇艺(iqiyi)/中国大学慕课网(www.icourse163.org)视频批量下载, 加速下载, 随时随地想看就看. 支持微元素/花瓣网图片批量下载
// @author       东风
// @date         2020-04-25
// @modified     2023-09-27
// @match        http*://*.bilibili.com/video/*
// @match        http*://*.bilibili.com/bangumi/play/*
// @match        http*://*.bilibili.com/*/favlist*
// @match        http*://v.youku.com/v_show/*
// @match        http*://m.youku.com/alipay_video/*
// @match        http*://v.qq.com/x/cover/*
// @match        http*://m.v.qq.com/x/cover/*
// @match        http*://v.qq.com/x/page/*
// @match        http*://m.v.qq.com/x/page/*
// @match        http*://m.v.qq.com/*
// @match        http*://www.iqiyi.com/v*
// @match        http*://m.iqiyi.com/*
// @match        http*://www.iqiyi.com/*
// @match        http*://m.iqiyi.com/kszt/*
// @match        http*://www.iqiyi.com/kszt/*
// @match        http*://www.element3ds.com/*
// @match        https://basic.smartedu.cn/syncClassroom*
// @match        https://weibo.com/*tabtype=album
// @match        http*://huaban.com/boards/*
// @match        http*://huaban.com/user/*
// @match        http*://mp.weixin.qq.com/*
// @match        https://www.icourse163.org/learn/*?tid=*
// @icon         http*://space.bilibili.com/favicon.ico
// @license      BSD 3-Clause License
// @grant        unsafeWindow
// @grant        GM_setClipboard
// @grant        GM_info
// @grant        GM_download
// @grant        GM_registerMenuCommand
// @grant        GM_xmlhttpRequest
// @grant        GM.xmlHttpRequest
// @grant        GM_openInTab
// @grant        GM.openInTab
// @grant        GM_getValue
// @grant        GM.getValue
// @grant        GM_setValue
// @grant        GM.setValue
// ==/UserScript==

(function () {
	'use strict';
	//==========utils=====================================================================
	//加载css文件
	function addCSS(href) {
		var link = document.createElement('link');
		link.type = 'text/css';
		link.rel = 'stylesheet';
		link.href = href;
		document.getElementsByTagName("head")[0].appendChild(link);
	}
	//加载js文件
	function addJS(src, cb, onerror ) {
		var script = document.createElement("script");
		script.type = "text/javascript";
		script.src = src;
		console.log("addJS",script)
		document.getElementsByTagName('head')[0].appendChild(script);
		script.onload = typeof cb === "function" ? cb : function () {};
		script.onerror = typeof onerror === "function" ? onerror : function () {};
	}

	// 加载css字符串
	function GMaddStyleString(css) {
		var myStyle = document.createElement('style');
		myStyle.textContent = css;
		var doc = document.head || document.documentElement;
		doc.appendChild(myStyle);
	}

	function AddHtml(html) {
		document.body.insertAdjacentHTML('afterEnd', html);
	}


	
	// 改用ZUI //https://www.openzui.com/

// 百度 CDN
//     <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
// 新浪 CDN
//     <script src="https://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js"></script>
// 又拍云 CDN
//     <script src="https://upcdn.b0.upaiyun.com/libs/jquery/jquery-2.0.2.min.js"></script>

	addJS("https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js", function () {

		console.log("-------------------load jq-------------------")
		window.$ = $.noConflict();
		addJS("https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.5/jszip.min.js")
		addJS("https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js")
		// addCSS("https://cdn.bootcdn.net/ajax/libs/zui/1.9.2/css/zui.min.css");
		// addJS("https://cdn.bootcdn.net/ajax/libs/zui/1.9.2/js/zui.min.js", function () {
		addCSS("https://lib.baomitu.com/zui/1.9.2/css/zui.min.css");
		addJS("https://lib.baomitu.com/zui/1.9.2/js/zui.min.js", function () {        

		console.log("-------------------load bootcdn zui.min.js-------------------")

		})
	});




	function GetFileName(url) {
		var Business=url.split("/");
		return Business[Business.length-1];
	}

	// String.prototype.TextFilter=function(){
	//     var pattern=new RegExp("[`~%!@#^=''?~!@#¥……&——‘”“'?*()(),,。.、]"); //[]内输入你要过滤的字符
	//     var rs="";
	//     for(var i=0;i<this.length;i++){
	//         rs+=this.substr(i,1).replace(pattern,'');
	//     }
	//     return rs;
	// }

	// 把空格和斜杠转换成下划线
	function Trim(str, limit)
	{
		// str = str.TextFilter()
		console.log(str)
		var result = str.replace(/\s+/g,"_");
		result = result.replace(/\//g,"-");
		result = result.replace(/\\/g,"_");
		result = result.replace(/&/g,"-");
		result = result.replace(/"/g,"");
		result = result.replace(/:/g,"_");
		result = result.replace(/%/g,"_");
		result = result.replace(/\|/g,"_");
		if (limit) {
			result=result.substring(0,limit); 
		}
		console.log(result)
		return result;
	}

	// 去掉标题后缀
	function FormatTitle(str)
	{
		var title = Trim(document.title)
		var n = title.lastIndexOf(str);
		if (n >= 0) {
			title = title.substring(0,n);
		}
		return title;
	}   

	function ShowTips(str) {
		new $.zui.Messager(str, {
			type: 'success', // 定义颜色主题
			time:2000
		}).show();
	}
	function ShowDialog(str) {
		// (new $.zui.ModalTrigger({custom: str})).show();
		// console.log("ShowDialog"+str)
		alert(str)
	}

	//字符串是否包含子串
	function isContains(str, substr) {
		//str是否包含substr
		return str.indexOf(substr) >= 0;
	}

	// 把网页获取的对象转换成数组
	function objToArray(x) {
		var list = [];
		console.log(x)
		for (var i = 0; i < x.length; i++) {
			list[i] = x[i];
		}
		return list
	}

	// 补零
	function PrefixZero(num, n) {
		return (Array(n).join(0) + num).slice(-n);
	}

	// 文件加前缀
	function AddPreFilename(fileName, index, max) {
		var len = (max+"").length
		return "P"+PrefixZero(index,len)+"."+fileName
	}    

	function ShowSelect(senddata) {
		window.g_senddata = senddata
		console.log("ShowSelect", JSON.stringify(senddata))
		var select_window = $("#select_window")
		console.log(select_window)

		console.log("解决插件冲突", $(".cssobj-jiangxiaobai"))
		var ocss = $(".cssobj-jiangxiaobai").removeClass(".cssobj-jiangxiaobai")
		for (var i = 0; i < ocss.length; i++) {
			ocss[i].innerHTML = ""
		}

		if (!select_window[0]) {
			var html = 
			`
			<div class="modal fade" id="select_window" style="z-index:10000">
			  <div class="modal-dialog modal-lg">
				<div class="modal-content">
				  <div class="modal-header">
					<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">关闭</span></button>
					<h4 class="modal-title">请选择要下载的视频</h4>
				  </div>
				  <div class="modal-body">
						<form id='select_form' class="layui-form" action="" lay-filter="example">
						</form>
				  </div>
				  <div class="modal-footer center">

					<div class="select" style="width:100px;display:inline-block;display:none">
						<select class="form-control">
						  <option value="">清晰度</option>
						  <option value="80">1080p</option>
						  <option value="64">720p</option>
						  <option value="32">480p</option>
						  <option value="16">360p</option>
						</select>
					</div>

					<div class="switch" style="width:100px;display:inline-block">
						<input type="checkbox" id='checkbox_index'>
						<label>添加序号</label>
					</div>

					<button type="button" class="btn btn-primary" id="btn_download_all">下载选中</button>
					<button type="button" class="btn btn-primary" id="btn_select_all">取消/全选</button>
					<button type="button" class="btn btn-primary" id="btn_download_self">仅下载本视频</button>
					<button type="button" class="btn btn-default" data-dismiss="modal" >关闭</button>
				  </div>
				</div>
			  </div>
			</div>
			`
			AddHtml(html)//style="display:none"    
			// select_form = $("#select_form") 

			// $(function() {
			//     $("#checkbox_index").click(function(){
			//         // var obj = $("#checkbox_index")
			//         // if(obj.checked){
			//         //     console.log("selected");
			//         // }else{
			//         //     console.log("unselected");
			//         // }
			//         $("#select_window").hide()
			//         Download(senddata)
			//     });
			// }); 

			$(function() {
				$("#btn_download_self").click(function(){
					RealDownload(DownloadSelfInfo())
				});
			}); 

			$(function() {
				$("#btn_download_all").click(function(){
					var list = $("[id='listItem']:checkbox")
					var checkbox = $("#checkbox_index")[0]
					console.log("checkbox_index",checkbox.checked)
					var res = []
					for (var i = 0; i < list.length; i++) {
						if (list[i].checked) {

							if (checkbox.checked) {
								window.g_senddata[i].fileName = AddPreFilename(window.g_senddata[i].fileName, i+1, list.length)
							}
							res.push(window.g_senddata[i])
						}
					}
					console.log(res)
					RealDownload(res)
				});
			}); 

			 $(function() {
				$("#btn_select_all").click(function(){
					var list = $("[id='listItem']:checkbox")
					var flag = true
					if (list[0] && list[0].checked) {
						flag = false
					}
					console.log("flag" , flag)
					console.log(list)
					for (var i = 0; i < list.length; i++) {
						list[i].checked = flag
					}
				});
			});

		}
		else{
			if ($("#select_window").is(":visible")) {
				$("#select_window").hide()
				// alert("存在")
				return
			}
		}
		var select_form = $("#select_form")

		//弹出表格
		var s_content = `
			<form class="layui-form" action="" lay-filter="example">
			  <div class="layui-form-item" pane="">
				<label class="layui-form-label">视频列表</label>`

		for (var i = 0; i < senddata.length; i++) {
			if (senddata[i]) {
				senddata[i].id = i+1
				var checkboxid = "select_checkbox_id"+i
				s_content = s_content + `<div class="checkbox-primary"><input type="checkbox" checked="checked" id="listItem"><label for="`+checkboxid+`">`+ senddata[i].fileName +`</label></div>`
			}

		}

		s_content = s_content + `</div></form>`
		console.log(s_content)
		select_form[0].innerHTML = s_content

		console.log($('#select_window'))
		$('#select_window').modal({
			scrollInside : true,
			moveable : "inside",
			show     : true
		})
	}

	function Download(urls) 
	{ 
		ShowSelect(urls)
	};

	function WebGet(url, success, headers) {
		jQuery.ajax({
			url: url,
			async: false,
			success: success,
			headers: headers,
			omplete: function (data) {
				if (data.status === 200) {
				}
				else {
					ShowTips("系统错误:暂时无法连接服务器")
				}
			}
		});
	}
	function WebPost(url, data, success) {
		console.log("WebPost", url, data)
		$.ajaxSettings.async = false; //设置为同步
		$.post(url, data, success)
		$.ajaxSettings.async = true;
	}

	//获取指定名称的cookie的值
	function getcookie(objname){
		var arrstr = document.cookie.split("; ");
		for(var i = 0;i < arrstr.length;i ++){
			var temp = arrstr[i].split("=");
			if(temp[0] == objname) return unescape(temp[1]);
		}
	}

	//获取get参数
	function GetRequest() {
	    var url = location.search; //获取url中"?"符后的字串
	    var theRequest = new Object();
	    if (url.indexOf("?") != -1) {
	        var str = url.substr(1);
	        console.log("--------------", url, str)
	        var strs = str.split("&");
	        for(var i = 0; i < strs.length; i ++) {
	            theRequest[strs[i].split("=")[0]]=decodeURI(strs[i].split("=")[1]);
	        }
	    }
	    return theRequest;
	} 


	//==========以下是与下载器通讯=====================================================================
	var host = '127.0.0.1'
	,port = '5678';
	
	function wsmessage(evt) 
	{ 
		console.log(evt);
		var received_msg = evt.data;
		console.log("收到服务器的信息", received_msg);
		// ws.send(JSON.stringify(["https://www.bilibili.com/video/BV19E411D78Q?p=6","https://www.bilibili.com/video/BV19E411D78Q?p=3"]));
		// console.log(JSON.parse(received_msg));
		// 发送成功{id: 2333333, jsonrpc: "2.0", result: "a6ff40d33524229a"}
		// 开始下载{jsonrpc: "2.0", method: "aria2.onDownloadStart", params: [[gid: "a6ff40d33524229a"]]}
		// 下载完成{jsonrpc: "2.0", method: "aria2.onDownloadComplete", params: [[gid: "a6ff40d33524229a"]]}
		// 下载出错{jsonrpc: "2.0", method: "aria2.onDownloadError", params: [[gid: "a6ff40d33524229a"]]}

		ShowTips("任务发送成功");
	};
		
	function wsclose() 
	{ 
		console.log("连接关闭");
		// layui.use('layer', function(){
		//   var layer = layui.layer;
		//     layer.msg("连接关闭", {
		//         icon: 1
		//     });
		// }); 
	};

	function RealDownload(url, out, dir)
	{
		console.log("RealDownload",url)
		console.log(JSON.stringify(url))
		// var json = MakeSendData(url, out, dir)
		var ws = new WebSocket("ws://" + host + ":" + port + "/jsonrpc");

		function wsopen()
		{
			console.log("连接下载服务器");
			// var json = MakeSendData("http://aria2c.com/usage.html", "test.html", "./dow")
			// ws.send(JSON.stringify(["https://www.bilibili.com/video/BV19E411D78Q?p=5","https://www.bilibili.com/video/BV19E411D78Q?p=3"]));
			ws.send(JSON.stringify(url));

			setTimeout(function() {
				ws.close()
			}, 10000)
			
		};

		setTimeout(function() {
			if (ws.readyState===1) {
				//连接成功什么事情都不用处理
			}else{
				ShowTips("连接下载器失败,请确认开启下载器");
			}
		}, 1000)

		ws.onopen =  wsopen;
		ws.onmessage = wsmessage;
		ws.onclose =  wsclose;
	};

	function CreateWs(cb) {
		var ws = new WebSocket("ws://" + host + ":" + port + "/jsonrpc");
		function wsopen()
		{
			console.log("连接下载服务器");
			if (cb) {cb()}
			// var json = MakeSendData("http://aria2c.com/usage.html", "test.html", "./dow")
			// ws.send(JSON.stringify(["https://www.bilibili.com/video/BV19E411D78Q?p=5","https://www.bilibili.com/video/BV19E411D78Q?p=3"]));
			// ws.send(JSON.stringify(url));
		};

		setTimeout(function() {
			if (ws.readyState===1) {
				//连接成功什么事情都不用处理
			}else{
				ShowTips("连接下载器失败,请确认开启下载器");
			}
		}, 1000)

		ws.onopen =  wsopen;
		ws.onmessage = wsmessage;
		ws.onclose =  wsclose;

		return ws
	}

	function SendMsg(ws, data, isclose) {
		console.log("SendMsg readyState",ws.readyState)
		if (ws.readyState != 1) {
			ws = CreateWs(function() {
				SendMsg(ws, data, isclose)
			})
			return
		}
		ws.send(JSON.stringify(data));
		if (isclose) {
			setTimeout(function() {
				ws.close()
			}, 1000)
		}
	}

	var g_ws = CreateWs()


	//===============================================================================

	// 拷贝我的收藏视频网址
	function CopyFavlistUrls() {

		var title = "我的收藏"

		var x = document.getElementsByClassName("fav-video-list clearfix content")[0].children;
		console.log(title)

		var list = [];
		console.log(x)
		for (var i = 0; i < x.length; i++) {
			console.log(i,x[i].attributes["class"].nodeValue)

			if (x[i].attributes["class"].nodeValue != "small-item disabled") { //失效
				//list[i] = x[i];
				list.push(x[i])
			}
		}

		console.log(list)
		// zoomfile
		if (list) {

			// GM_setClipboard( list.map(function (pin) {
			//     return "https:" + pin.children[0].attributes["href"].nodeValue + "\r\n";
			// }).join(""));

			return list.map(function (pin) {
				var item = {"url": "https:" + pin.children[1].attributes["href"].nodeValue};
				item.folder = "我的收藏"
				item.islist = false;
				item.fileName=Trim(pin.children[1].title)
				return item;
			})
		}else
		{
			ShowTips("找不到视频");
		}
	}

	// 拷贝播放列表视频网址
	function CopyVedioUrls() {
		var title = Trim(document.querySelector('meta[property="og:title"]').getAttribute('content'));//FormatTitle("_哔哩哔哩(゜-゜)つロ干杯~-bilibili")

		var list_box = document.getElementsByClassName("list-box")
		if (list_box.length == 0) {


			var list_box = document.getElementsByClassName("video-sections-content-list") // sections
			if (list_box.length > 0) {//需要读页面信息
				console.log("------list_box.length---------")
				CopySeasonUrls()
				return
			}else{
				return DownloadSelfInfo()
			}
		}

		var x = document.getElementsByClassName("list-box")[0].children;
		console.log(title)

		var list = [];
		console.log(x)
		for (var i = 0; i < x.length; i++) {
			list[i] = x[i];
		}

		console.log(list)
		if (list) {
			return list.map(function (pin,index) {
				var item = {"url": "https://www.bilibili.com" + pin.children[0].attributes["href"].nodeValue}
				item.folder = Trim(title, 30)
				item.fileName = Trim(pin.children[0].title)
				item.islist = false;
				return item;
			})
		}else
		{
			ShowTips("找不到视频");
		}
	}
	// 拷贝番剧播放列表视频网址
	function CopyBangumiUrls() {
		jQuery.ajax({
			url: window.location.href,
			async: false,
			success: function (res) {
				// console.log(res);
				var info = res

				var n = info.lastIndexOf("<script>window.__INITIAL_STATE__");
				if (n >= 0) {
					info = info.substring(n+"<script>window.__INITIAL_STATE__=".length);
					var n2 = info.indexOf(";(function(){var s;(s=document.currentScript||document.scripts[document.scripts.length-1]).parentNode.removeChild(s);}());</script>");
					// console.log("1111",n, n2,info)
					info = info.substring(0,n2);
				}
				var bili_state = JSON.parse(info)
				if (bili_state) {

					console.log(bili_state)
					var epList = bili_state.epList 
					var title = bili_state.mediaInfo.title
					var ssType = bili_state.ssType 
					// console.log(bili_state.epList)
					// console.log("epList =", epList, "mediaInfo = ", mediaInfo)
					// for (var i = 0; i < epList.length; i++) {
					//     console.log(i, epList[i])
					// }

					// if (ssType==1) { //番剧

						var urls = epList.map(function (ep) {
							var item = {
								"url": "https://www.bilibili.com/bangumi/play/ep"+ ep.id, 
								"titleFormat":Trim(ep.titleFormat), 
								"longTitle":Trim(ep.longTitle),
								"fileName":Trim(ep.titleFormat+"_"+ep.longTitle)
							}
							if (ep.longTitle == "") {
								item.fileName = Trim(ep.titleFormat)
							}
							item.folder = Trim(title, 30)
							item.islist = false;
							return item;
						})
						Download(urls)
					// }else
					// {// 电影
					//     DownloadSelf(title, false)
					// }
				}else
				{
					var title = document.querySelector('meta[property="og:title"]').getAttribute('content');
					DownloadSelf(title, true)
				}
			},
			omplete: function (data) {
				if (data.status === 200) {
				}
				else {
					ShowTips("系统错误:暂时无法连接服务器")
					var title = document.querySelector('meta[property="og:title"]').getAttribute('content');
					DownloadSelf(title, true)
				}
			}
		});
	}

	// vedio 中的season
	function CopySeasonUrls() {
		jQuery.ajax({
			url: window.location.href,
			async: false,
			success: function (res) {
				// console.log(res);
				var info = res

				var n = info.lastIndexOf("<script>window.__INITIAL_STATE__");
				if (n >= 0) {
					info = info.substring(n+"<script>window.__INITIAL_STATE__=".length);
					var n2 = info.indexOf(";(function(){var s;(s=document.currentScript||document.scripts[document.scripts.length-1]).parentNode.removeChild(s);}());</script>");
					// console.log("1111",n, n2,info)
					info = info.substring(0,n2);
				}
				var bili_state = JSON.parse(info)
				if (bili_state) {

					console.log(bili_state)
					var sectionsInfo = bili_state.sectionsInfo 
					var title = sectionsInfo.title
					var sections = bili_state.sections

					var urls = [];
					console.log(sections, "-----sections---")
					for (var i = 0; i < sections.length; i++) {
						var episodes = sections[i].episodes
						for (var j = 0; j < episodes.length; j++) {
							var ep = episodes[j]
							console.log(i, ep)

							var item = {
								"url": "https://www.bilibili.com/video/"+ ep.bvid, 
								"fileName":Trim(ep.title)
							}
							item.folder = Trim(title, 30)
							item.islist = false;
							urls.push(item)
						}
					}

					console.log(urls)
					Download(urls)

				}else
				{
					var title = document.querySelector('meta[property="og:title"]').getAttribute('content');
					DownloadSelf(title, true)
				}
			},
			omplete: function (data) {
				if (data.status === 200) {
				}
				else {
					ShowTips("系统错误:暂时无法连接服务器")
					var title = document.querySelector('meta[property="og:title"]').getAttribute('content');
					DownloadSelf(title, true)
				}
			}
		});
	}

	function DownloadSelf(title, islist, youtube) {
		Download(DownloadSelfInfo(title, islist, youtube))
	}

	function DownloadSelfInfo(title, islist, youtube) {
		var item = {"url": window.location.href.replace(/&/g, '%26')}
		// item.folder = Trim(title); // 不能有空格,有时候下载失败是因为有空格

		if (!title) {
			title = Trim(document.title)
		}
		if (!islist) {
			islist = false
		}
		item.fileName = Trim(title)
		item.islist = islist;
		var host = getEffectiveHost()
		if (host == "youku" || host=="eduyun") {
			item.youtube = true
		}
		return [item]
	}


	// 解析bilibili网站
	function ParseBilibiliUrl() {
		var arrUrl = window.location.pathname.split('/');
		console.log("arrUrl = ", arrUrl);
		if(!arrUrl[1]) return;
		if (arrUrl[1] == "video") 
			return CopyVedioUrls();
		else if (arrUrl[1] == "bangumi") 
			return CopyBangumiUrls();
		else if (arrUrl[2] == "favlist") 
			return CopyFavlistUrls();
		else
		{
			return DownloadSelfInfo()
		}
	}

	// 解析优酷网站
	function ParseYoukuUrl() {
		var arrUrl = window.location.pathname.split('/');
		console.log("arrUrl = ", arrUrl);

		if(!arrUrl[1]) return;
		if (arrUrl[1] == "v_show") 
		{
			var title = Trim(document.querySelector('meta[name="irAlbumName"]').getAttribute('content')); 
			var l = document.getElementsByClassName("anthology-content")
			if (l.length == 2) {
				var x = document.getElementsByClassName("anthology-content")[0].children;
				var list = objToArray(x)
				if (list) {
					return list.map(function (pin) {
						var item = {"url": pin.children[0].attributes["href"].nodeValue}
						item.saveFileName = Trim(pin.title) //优酷下载的名称没有第几集, 所以需要重命名
						item.fileName = Trim(item.saveFileName)
						item.folder = Trim(title, 30)
						item.islist = false;
						item.youtube = true
						return item;
					})
				}
			}        
		}

		return DownloadSelfInfo(null, false, true)
	}

	// 解析腾讯视频网站
	function ParseQQUrl() {
		var arrUrl = window.location.pathname.split('/');
		console.log("arrUrl = ", arrUrl);

		if(!arrUrl[1]) return;
		if (arrUrl[1] == "x") 
		{
			var player_title = document.getElementsByClassName("player_title")
			if (player_title.length==0) {
				
			}else{
				var x 
				var title = Trim(document.getElementsByClassName("player_title")[0].children[0].text); //player_title
				var items = document.getElementsByClassName("figure_list _hot_wrapper")
				var item_detail_half = document.getElementsByClassName("item_detail_half")
				var mod_episode = document.getElementsByClassName("mod_episode")

				if (items.length>0) {
					x = items[0].children; 
					var list = objToArray(x)
					// console.log(list)
					if (list) {
						return list.map(function (pin) {
							// console.log(pin)
							var item = {"url": "https://v.qq.com" + pin.children[0].attributes["href"].nodeValue}
							item.fileName = Trim(pin.attributes["data-title"].nodeValue) 
							item.folder = Trim(title,30)
							item.islist = false;
							return item;
						})
					}
				}

				if(item_detail_half.length>0){
					x = document.getElementsByClassName("item_detail_half")
					var list = objToArray(x)
					// console.log(list)
					if (list) {
						return list.map(function (pin) {
							console.log(pin)
							var item = {"url": "https://v.qq.com" + pin.children[0].attributes["href"].nodeValue}
							item.fileName = Trim(pin.children[0].attributes["title"].nodeValue) 
							item.folder = Trim(title,30)
							item.islist = false;
							return item;
						})
					}
				}
				if (mod_episode.length>0) {
					x = mod_episode[0].children; 
					var list = objToArray(x)
					// console.log(list)
					if (list) {
						return list.map(function (pin) {
							// console.log(pin)
							if (pin.children[0].attributes["href"]) {
								var item = {"url": "https://v.qq.com" + pin.children[0].attributes["href"].nodeValue}
								item.fileName = "第"+Trim(pin.innerText) +"集"
								item.folder = Trim(title,30)
								item.islist = false;
								return item;
							}
						})
					}
				}
// innerText
			}        
		}

		return DownloadSelfInfo()
	}

	// 解析爱奇艺网站
	function ParseIqiyiUrl() {
		var title = Trim(document.querySelector('meta[name="irAlbumName"]').getAttribute('content')); 
		var x = document.getElementsByClassName("select-title"); //专辑
		var list = objToArray(x)

		if (list.length > 0) {
			return list.map(function (pin) {
				var item = {"url": "https:" + pin.children[1].attributes["href"].nodeValue}
				item.saveFileName = Trim(pin.children[0].innerText+"_"+pin.children[1].text) 
				item.fileName = Trim(item.saveFileName)
				item.folder = Trim(title,30)
				item.islist = false;
				return item;
			})
		}else
		{
			return DownloadSelfInfo()
		}            
	}

	function GetEduyunCaseObj(caseCode) {
		// var obj2 = eval(xueduanJson);
		var caseobj = eval(caseJson);
		var caseobjlen = caseobj.clist.length;
		for(var a =0 ;a<caseobjlen;a++){
			var caseobjcode = caseobj.clist[a].caseCode;

			if(caseobjcode == caseCode){
				return caseobj.clist[a]
			}
		}
	}

	function GetEduyunM3u8(config) {
		console.log(config)
		var video_extend = config.video_extend;
		console.log(video_extend)
		var bestid = 0;
		var bestquality = 1;
		for (var i = 0; i < video_extend.files.length; i++) {
			var item = video_extend.files[i];
			if (item.height >= bestquality) {
				bestquality = item.height;
				bestid = i;
			}
		}
		return video_extend.urls[bestid].urls[0]
	}

	// 解析国家中小学网络云课堂网站
	function ParseEduyunUrl() {
		var urlParm = GetRequest();
		console.log(urlParm);

		var url = "https://s-file-2.ykt.cbern.com.cn/zxx/ndrv2/national_lesson/resources/details/" + urlParm.activityId +".json"

		// // 视频信息
		// var url = "https://s-file-1.ykt.cbern.com.cn/zxx/s_course/v1/x_class_hour_activity/" + urlParm.activityId +".json"
		// WebGet(url, function(res) { 
		// 	console.log(res)
		// 	WebGet("https://s-file-1.ykt.cbern.com.cn/zxx/s_course/v1/x_class_hour_activity/" + urlParm.activityId +"/resources.json", 
		// 		function(res2) { 
		// 			console.log(res2)
		// 			for (var i = 0; i < res2.length; i++) {
		// 				var it = res2[i];
		// 				if (it.resource_type == "video") {
		// 					console.log("----", it)

		// 					var urls = []
		// 					var item = {"url":GetEduyunM3u8(it)}
		// 					item.saveFileName = Trim(res.name) 
		// 					item.fileName = Trim(item.saveFileName)
		// 					item.folder = Trim(res.activity_set_name)
		// 					item.islist = false;
		// 					item.m3u8 = true
		// 					urls.push(item)
		// 					console.log(urls)
		// 					Download(urls)
		// 				}
		// 			}
		// 	})//WebGet 2
		// })//WebGet 1



		WebGet("https://r1-ndr-private.ykt.cbern.com.cn/edu_product/65/video/17b0594b547a11eb96b8fa20200c3759/158bfc80999d1a8a01c504fce1012e6b.1920.1080.false/158bfc80999d1a8a01c504fce1012e6b.1920.1080.m3u8", 
			function(res){
				console.log("-----private----",res)
			}, {
				"x-nd-auth": 'MAC id="7F938B205F876FC3A30551F3A4931383757DAFBA42F543C27D4FAAD9900F58A908688DD0730726915939914BD846259C990406ECD76F1590",nonce="1689319206522:3JWAHCSX",mac="bRyywGyMJ7nn9HZE1piMfV6KL11l0X5wOJ+exMyXEDY="'
			})
	}

	// 解析微元素
	function ParseElement3ds() {
		var json = {};
		var title = document.title
		var n = title.lastIndexOf("-微元素");
		if (n >= 0) {
			title = title.substring(0,n);
			var n2 = title.lastIndexOf("-");
			if (n2 >= 0) {
				title = title.substring(0,n2);
			}
		}
		// title = "#title:" + title + "\n"

		var x = document.getElementsByClassName("zoom");
		console.log(title)

		var list = objToArray(x)
		console.log(list)

		if (list) {
			var res= list.map(function (pin) {
				var url = pin.attributes["zoomfile"].nodeValue
				var n = url.lastIndexOf("?");
				if (n >= 0) {
					url = url.substring(0,n);
				}
				var item = {"url": url}
				item.saveFileName = Trim(GetFileName(url)) 
				item.fileName = Trim(item.saveFileName)
				item.folder = Trim(title,30)
				item.islist = false;
				item.image = true
				return item;
			})

			RealDownload(res) // 图片直接下载就是了, 不提供选择
			ShowDialog("获取到"+res.length+"张图片,已经发送到下载器")
		}else
		{
			ShowTips("找不到图片")
		}
	}



	function packageImages(list, index){
		// $('#status').text('处理中。。。。。');
		
		var imgsSrc = [];
		var imgBase64 = [];
		var imageSuffix = [];//图片后缀
		var zip = new JSZip();
	    // zip.file("readme.txt", "案件详情资料\n");
	    var img = zip.folder("images");
	    
		for(var i=0;i<list.length;i++){
			var src = list[i];
			var suffix = src.substring(src.lastIndexOf("."));
			imageSuffix.push(suffix);
			
			 getBase64(list[i])
	            .then(function(base64){
	            	imgBase64.push(base64.substring(22));
	            },function(err){
	                console.log(err);//打印异常信息
	            }); 
	           
		}
		function tt(){
			setTimeout(function(){
				if(list.length == imgBase64.length){
					for(var i=0;i<list.length;i++){
						img.file(i+imageSuffix[i], imgBase64[i], {base64: true});
					}
					zip.generateAsync({type:"blob"}).then(function(content) {
				        saveAs(content, "images"+index+".zip");
				    });
				    $('#status').text('处理完成。。。。。');
				    
				}else{
					$('#status').text('已完成:'+imgBase64.length+'/'+list.length);
					tt();
				}
			},100);
			
		}
		tt();
		
	}
 	function packageImages2(list, index){
		// $('#status').text('处理中。。。。。');
		
		var imgsSrc = [];
		var imgBase64 = [];
		var imageSuffix = [];//图片后缀
		var zip = new JSZip();
	    // zip.file("readme.txt", "案件详情资料\n");
	    var img = zip.folder("images");
	    
		for(var i=0;i<list.length;i++){
			var src = list[i];
			var suffix = src.substring(src.lastIndexOf("."));
			imageSuffix.push(suffix);
			
			 getBase64(list[i])
	            .then(function(base64){
	            	imgBase64.push(base64.substring(22));
	            },function(err){
	                console.log(err);//打印异常信息
	            }); 
	           
		}
		function tt(){
			setTimeout(function(){
				if(list.length == imgBase64.length){
					for(var i=0;i<list.length;i++){
						img.file(i+".jpeg", imgBase64[i], {base64: true});
					}
					zip.generateAsync({type:"blob"}).then(function(content) {
				        saveAs(content, "images"+index+".zip");
				    });
				    $('#status').text('处理完成。。。。。');
				    
				}else{
					$('#status').text('已完成:'+imgBase64.length+'/'+list.length);
					tt();
				}
			},100);
			
		}
		tt();
		
	}
    //传入图片路径,返回base64
    function getBase64(img){
        function getBase64Image(img,width,height) {
          var canvas = document.createElement("canvas");
          canvas.width = width ? width : img.width;
          canvas.height = height ? height : img.height;
 
          var ctx = canvas.getContext("2d");
          ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
          var dataURL = canvas.toDataURL();
          return dataURL;
        }
        var image = new Image();
        image.crossOrigin = 'Anonymous';
        image.src = img;
        var deferred=$.Deferred();
        if(img){
          image.onload =function (){
            deferred.resolve(getBase64Image(image));
          }
          return deferred.promise();
        }
      }



	// 解析微博相册
	function ParseWeiboPhoto() {
		console.log("--------------------")
		// // $GLOBAL_INFO.owner_uid //拥有者id
		// // $GLOBAL_DETAIL.page_album_id //相册id
		// // $GLOBAL_DETAIL.album_info.count.photos //图片数量
		// var count = $GLOBAL_DETAIL.album_info.count.photos
		// var page = Math.floor(count/30+1)
		// var owner_data = $GLOBAL_INFO.owner_data
		// var totalcount = 0

		// function download(i){
		// 	setTimeout(function() {
		// 		var t = new Date().getTime()
		// 		var url = "https://photo.weibo.com/photos/get_all?uid="+$GLOBAL_INFO.owner_uid+"&album_id="+$GLOBAL_DETAIL.page_album_id+"&count=30&page="+i+"&type=3&__rnd="+t
		// 		console.log(url)
		// 		WebGet(url, function(res) {
		// 			console.log(res)
		// 			if (res.code == 0) {
		// 				var list = res.data.photo_list
		// 				var arr= list.map(function (pin) {
		// 					// var node = pin.children[0].href
		// 					var url = "https://wx3.sinaimg.cn/large/" + pin.pic_name
		// 					var item = {"url": url}
		// 					item.saveFileName = pin.pic_name
		// 					item.fileName = Trim(item.saveFileName)
		// 					item.folder = Trim(owner_data.name+"-"+$GLOBAL_DETAIL.album_info.caption,30)
		// 					item.islist = false;
		// 					item.image = true
		// 					return item;
		// 				})
		// 				// console.log(arr)
		// 				totalcount = totalcount + arr.length
		// 				// console.log("----------------------------------------------", i, totalcount, arr.length)
		// 				// RealDownload(arr) // 图片直接下载就是了, 不提供选择
		// 				SendMsg(g_ws, arr)
		// 				if (i+1 == page) {
		// 					ShowDialog("获取到"+totalcount+"张图片,已经发送到下载器")
		// 				}
		// 			}//if (res.code == 0)
		// 		})//WebGet
		// 	}, 1000*i)//setTimeout            
		// }

		// for (var i = 0; i < page; i++) {
		// 	//https://photo.weibo.com/photos/get_all?uid=5538396801&album_id=3814561462485240&count=30&page=2&type=3&__rnd=1621934381145
		// 	// https://photo.weibo.com/photos/get_all?uid=5538396801&album_id=3814561462485240&count=30&page=11&type=3&__rnd=1621998700612
		// 	download(i+1)
		// }

		

		var x = document.getElementsByClassName("woo-picture-square");

		var list = [];
		console.log(x)
		for (var i = 0; i < x.length; i++) {
			// console.log(i,x[i].attributes["class"].nodeValue)

			if (x[i].children[0].attributes["src"].nodeValue) {
				// console.log(i, x[i].children[0].attributes["src"].nodeValue)
				// https://wx1.sinaimg.cn/orj360/005E6opCgy1h7ivrosiucj33402c0kjm.jpg
				// https://wx3.sinaimg.cn/mw2000/005E6opCgy1gf963ss9i1j30qo0g275o.jpg
				// https://wx1.sinaimg.cn/webp720/005E6opCgy1h7ivrosiucj33402c0kjm.jpg
				var url = x[i].children[0].attributes["src"].nodeValue
				url = url.replace(/orj360/g,"mw2000");
				list.push(url)
			}
		}

		console.log("list",list)
		// zoomfile
		if (list) {

			GM_setClipboard("["+ list.map(function (url) {
			    return "\""+url+"\"";
			}).join(",\n")+"]");

			var pnum = parseInt(list.length/50 + 1) 
			
			for (var i = 0; i < pnum; i++) {
				var plist = []
				for (var j = 0; j < 50; j++) {
					var index = i*50+j

					if (index<list.length) {
						plist.push(list[index])
					}
				}
				packageImages(plist, i);
			}

			

			// return list.map(function (url) {
			// 	var arrUrl = url.split('/');
			// 	var item = {"url": url};
			// 	item.folder = "我的收藏"
			// 	item.islist = false;
			// 	item.fileName=arrUrl[arrUrl.length-1]
			// 	return item;
			// })
		}else
		{
			ShowTips("相册空空");
		}
	}

	// 微信
	function ParseWeixinPhoto() {
		console.log("--------ParseWeixinPhoto------------")
		var x = document.getElementsByClassName("rich_pages wxw-img js_insertlocalimg");

		var list = [];
		console.log(x)
		for (var i = 0; i < x.length; i++) {
			console.log(i,x[i].attributes["src"].nodeValue)

			var url = x[i].attributes["data-src"].nodeValue
			list.push(url)
		}

		console.log("list",list)
		// zoomfile
		if (list) {
			var i= 0;
			var res=  list.map(function (pin) {
				i++;
				var item = {"url": pin}
				item.fileName = i+".jpeg"
				item.saveFileName = i+".jpeg"
				item.folder = Trim(document.title,30)
				item.islist = false;
				item.image = true				
				return item;
			})
			RealDownload(res) // 图片直接下载就是了, 不提供选择
		}else
		{
			ShowTips("相册空空");
		}
	}
	// 解析花瓣
	function ParseHuabanPhoto() {
		var arrUrl = window.location.pathname.split('/');
		console.log("arrUrl = ", arrUrl);
		if(!arrUrl[1]) return;
		if (arrUrl[1] == "boards") 
			return ParseHuabanBoards(arrUrl[2]);
		else if (arrUrl[1] == "user") 
			return ParseHuabanUser(arrUrl[2]);
	}

	function cbGetBoardsFirst(res, board_id) {
		console.log(res, res.hasOwnProperty('board'));
		var limit = 100
		var board_data = res.board,
			title=board_data.title,
			//画板图片总数
			pin_number = board_data.pin_count,
			board_pins = res.pins,
			user_id = board_data.user.urlname,
			username = board_data.user.username,
			//尝试向上取整,计算加载完画板图片需要的最大次数
			retry = board_pins.length < pin_number ? Math.ceil(pin_number / limit) : 0
				
		console.log('Current board <' + board_id + '> pins number is ' + pin_number +
				', first pins number is ' +board_pins.length +', retry is ' + retry )
		var bf = setInterval(function () {
			if (retry > 0) {
				//说明没有加载完画板图片,需要ajax请求

				//get ajax pin data
				var last_pin = board_pins[board_pins.length - 1].pin_id
				var board_next_url = "https://api.huaban.com/boards/" + board_id + "/pins?max="+last_pin+"&limit="+limit

				WebGet(board_next_url, function (res) {
					console.log(res);
					var board_next_data = res
					board_pins = board_pins.concat(
						board_next_data.pins
					)
					console.debug( 'ajax load board with pin_id ' + last_pin + ', get pins number is ' +
							board_next_data.pins.length + ', merged')
					if (
						board_next_data.pins.length ===
						0
					) {
						retry = 0
						return false
					}
					last_pin = board_next_data.pins[board_next_data.pins.length - 1].pin_id
				})
				retry--
			} else {
				console.log( '画板' + board_id + '共抓取' + board_pins.length + '个pin')
				var pins = board_pins.map(function (pin) {
					var suffix = !pin.file.type
						? 'png'
						: pin.file.type.split('/')[1]
					return {
						url:
							window.location.protocol +
							'//hbimg.huabanimg.com/' +
							pin.file.key,
						pic_name: pin.pin_id + '.' + suffix
					}
				})
				clearInterval(bf)
				cbGetBoardsData(board_id, pins, title, username)
			}
		}, 200)
	}

	function cbGetBoardsData(board_id, pins, title, username) {
		console.log("获取到的数据",board_id, pins, title, username)

		var list = pins
		var arr= list.map(function (pin) {
			var item = {"url": pin.url}
			item.saveFileName = pin.pic_name
			item.fileName = item.saveFileName
			item.folder = username+"/"+title
			item.islist = false;
			item.image = true
			return item;
		})
		// console.log(arr)
		// console.log("----------------------------------------------", i, totalcount, arr.length)
		// RealDownload(arr) // 图片直接下载就是了, 不提供选择
		SendMsg(g_ws, arr)
		ShowDialog("获取画板["+title+"]图片"+arr.length+"张图片")
	}

	// 解析花瓣画板
	function ParseHuabanBoards(board_id) {

		console.group('花瓣网下载-当前画板:' + board_id)
		var limit = 100,
		url = "https://api.huaban.com/boards/" + board_id + "/pins?limit=" + limit
		// loadingLayer = layer.load(0, {
		// 	time: 5000
		// })
		//get first pin data
		WebGet(url,function (res) {
			cbGetBoardsFirst(res, board_id)
		})

		console.groupEnd()

	}
	// 解析花瓣个人页面
	function ParseHuabanUser(user_id) {
		// https://api.huaban.com/xntnsowysb/boards?limit=30&order_by_updated=0
		// https://api.huaban.com/xntnsowysb/boards?max=70779717&limit=30&order_by_updated=0
		console.log("获取用户画板列表", user_id)
		var url = "https://api.huaban.com/"+ user_id +"/boards?limit=30&order_by_updated=0"
		WebGet(url, function(res){
			console.log(res)
			var user_data = res.user,
				board_number = user_data.board_count,
				board_ids = res.boards,
				limit=30,
				retry = board_ids.length < board_number
						? Math.ceil(board_number / limit)
						: 0
			console.debug(
				'Current user <' +
					user_id +
					'> boards number is ' +
					board_number +
					', first boards number is ' +
					board_ids.length +
					', retry is' +
					retry
			)
			var uf = setInterval(function () {
				if (retry > 0) {
					var last_board = board_ids[board_ids.length - 1].board_id
					//get ajax board data
					var user_next_url = "https://api.huaban.com/"+user_id+"/boards?max="+last_board+"&limit="+limit+"&order_by_updated=0"

					WebGet(user_next_url, function (res) {
						console.log(res);
						var user_next_data = res.boards
						board_ids = board_ids.concat(
							user_next_data
						)
						console.debug(
							'ajax load user with board_id ' +
								last_board +
								', get boards number is ' +
								user_next_data.length +
								', merged'
						)
						if (user_next_data.length === 0) {
							retry = 0
							return false
						}
						last_board =
							user_next_data[
								user_next_data.length - 1
							].board_id
					})
					retry--
				} else {
					console.log(
						'用户' +
							user_id +
							'共抓取' +
							board_ids.length +
							'个board'
					)
					var boards = board_ids.map(function (
						board
					) {
						return board.board_id
					})
					clearInterval(uf)
					cbGetUserData(boards)
				}
			}, 200)
		})
	}
	
	function cbGetUserData(boards) {
		console.log("获取到的数据",boards)
		var length = boards.length
		var index = 0
		var uf = setInterval(function () {
			ParseHuabanBoards(boards[index])
			++index;
			if (index>=length) {
				clearInterval(uf)
			}
			
		}, 200)
	}


	// 中国大学慕课网
	function ParseMooc() {
		console.log("----------ParseMooc--------------")
		Function.prototype.constructor = function(){} // 使用调试
		var urlParm = GetRequest();
		console.log(urlParm);
		console.log(getcookie("NTESSTUDYSI"), urlParm.tid)

		// 1.获取列表
		var url = "https://www.icourse163.org/web/j/courseBean.getLastLearnedMocTermDto.rpc?csrfKey="+getcookie("NTESSTUDYSI");
		var list = [];
		
		WebPost(url, {"termId":urlParm.tid}, function(res){
			console.log("----------WebPost--------------")
			console.log(res)
			if (res.code == 0) {
				var courseName = res.result.mocTermDto.courseName
				var chapters = res.result.mocTermDto.chapters
				console.log(res.result.mocTermDto.chapters)
				for (var i = 0; i < chapters.length; i++) {
					var item = chapters[i]
					var chapter_name = item.name
					var lessons = item.lessons // 数组

					if (!lessons) {continue;}
					for (var j = 0; j < lessons.length; j++) {
						var units = lessons[j].units //数组
						var name = lessons[j].name 

						for (var k = 0; k < units.length; k++) {
							var lesson = units[k]
							var file_name = lesson.name 
							//var chapterId = lesson.chapterId
							var contentId = lesson.contentId
							var id = lesson.id
							var contentType = lesson.contentType// 1视频 3pdf 6老师课堂交流区
							if (contentType==1) {
								list.push({"id":id, "contentId":contentId, "contentType":contentType, 
									"bizType":contentType, 
									"name":chapter_name+"_"+file_name, "folder":chapter_name})
							}
							// GetMoocResourceInfo(id, contentId, contentType, contentType)
						}
					}
					
				}
			}
			console.log("list = ", list)
			var urls=[]
			for (var i = 0; i < list.length; i++) {
				GetMoocResourceInfo(list[i])
			}
			console.log("list = ", list)
		})
		
		var title = Trim(document.title)
		var res= list.map(function (pin) {
			var item = {"url": pin.url}
			item.saveFileName = Trim(pin.name) 
			item.fileName = item.saveFileName
			item.folder = Trim(title,30)
			item.islist = false;
			//item.video = true;
			if (isContains(pin.url, ".m3u8")) {
				item.m3u8 = true;
			}
			
			return item;
		})
		return res
// https://www.icourse163.org/web/j/resourceRpcBean.getResourceToken.rpc?csrfKey=7c1bc0e4212b467e972e7be9f8b5d34f
// post
// bizId: 550645
// bizType: 1
// contentType: 1

	}

	function GetMoocResourceInfo(data) {
		var bizId       = data.id
		var contentId   = data.contentId
		var bizType     = data.bizType
		var contentType = data.contentType
		var folder      = data.folder
		var url = "https://www.icourse163.org/web/j/resourceRpcBean.getResourceToken.rpc?csrfKey="+getcookie("NTESSTUDYSI");
		if(contentType != 1) return;
		// 获取token
		WebPost(url, {"bizId":bizId,"bizType":bizType,"contentType":contentType }, function(res){
			console.log("----------GetMoocResourceInfo--------------")
			console.log(res)
			// var list = [];
			if (res.code == 0) {
				// 真正获取信息
				var signature = res.result.videoSignDto.signature;
				var name = res.result.videoSignDto.name;
				var url2 = "https://vod.study.163.com/eds/api/v1/vod/video?videoId="+contentId+"&signature="+signature+"&clientType=1"
				WebGet(url2, function(res2) {
					console.log("----------GetMoocResourceInfo2--------------", url2)
					console.log(res2)
					var videos = res2.result.videos
					var resource_url = videos[0].videoUrl;
					var size = 0;
					// 找到品种最佳的视频下载
					for (var i = 0; i < videos.length; i++) {
						var item = videos[i]
						if (item.size > size) {
							size = item.size;
							resource_url = item.videoUrl;
						}
					}

					console.log("resource_url = ", resource_url)
					data.url = resource_url
				})
			}
			// console.log("list = ", list)
		})
	}


	//获取可使用域名
	function getEffectiveHost() {
		var host = window.location.host;
		if (!host) {
			host = document.domain;
		}
		if (!host) {
			host = "bilibili.com";
		}
		if (isContains(host, "bilibili")) {
			host = "bilibili";
		} else if (isContains(host, "youku")) {
			host = "youku";
		} else if (isContains(host, "iqiyi")) {
			host = "iqiyi";
		} else if (isContains(host, "weixin.qq.com")) {
			host = "weixin";
		} else if (isContains(host, "qq.com")) {
			host = "qq";
		} else if (isContains(host, "element3ds")) {
			host = "element3ds";
		} else if (isContains(host, "basic.smartedu.cn")) {
			host = "eduyun";
		} else if (isContains(host, "weibo.com")) {
			host = "photo_weibo";
		} else if (isContains(host, "huaban")) {
			host = "huaban";
		} else if (isContains(host, "icourse163")) {
			host = "icourse163"; 
		}
		else {
			host = "bilibili";
		}
		return host;
	}

	function ParseUrl() {   
		// console.log("----------------------222222",$.fn.jquery)
		var host = getEffectiveHost()
		console.log("host = ",host)
		if (host == "bilibili") {
			return ParseBilibiliUrl()
		} else if (host == "youku") {
			return ParseYoukuUrl()
		} else if (host == "iqiyi") {
			return ParseIqiyiUrl()
		} else if (host == "qq") {
			return ParseQQUrl()
		} else if (host == "element3ds") {
			return ParseElement3ds()
		} else if (host == "eduyun") {
			return ParseEduyunUrl()
		} else if (host == "photo_weibo") {
			return ParseWeiboPhoto()
		} else if (host == "huaban") {
			return ParseHuabanPhoto()
		} else if (host == "weixin") {
			return ParseWeixinPhoto()
		} else if (host == "icourse163") {
			return ParseMooc()
		}
		else {
			return DownloadSelfInfo()
		}
	}

	var isInit = 0;
	function DoInit() {

		// isInit ++;
		// if (isInit != 2 ) {return}
		// console.log("----------------DoInit-------------")
		var btn = document.getElementsByClassName("btnDownload")
		if (btn.length > 0) {
			return
		}

		GMaddStyleString(`#download_movie_box {cursor:pointer; position:fixed; top:` + 60 + `px; left:` + 0 + `px; width:0px; background-color:#2E9AFE; z-index:2147483647; font-size:20px; text-align:left;}
			#download_movie_box .item_text {width:28px; padding:4px 0px; text-align:center;}
			#download_movie_box .item_text img {width:35px; height:35px; display:inline-block; vertical-align:middle;}
			`);

		// var $ = $ || window.$;
		var ImgBase64Data = "data:image/png;base64,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"

		var html = 
		`<div id='download_movie_box' class="btnDownload">
			<div class='item_text'>
				<img src='`+ ImgBase64Data +`' title='下载视频' id="downloadVideos"/>
			</div>
		</div>`;

		document.body.insertAdjacentHTML('afterEnd', html);

		document.getElementById("downloadVideos").onclick = function () {
			var urls = ParseUrl();
			console.log("urls = ",urls)
			if (urls) {
				Download(urls)
			}
		};
	}
	/*
		主入口,分出不同模块:用户、画板,监听并刷新URL
	*/
	window.onload =function() {
		DoInit()
	}

	// GM_setValue("mytset","mytset---------------------------")
	// console.log(GM_getValue("mytset"))
})();