// ==UserScript== // @name Udemy下载助手(需配合Aria2使用) // @name:en Udemy Downloader // @namespace http://mofiter.com/ // @version 0.3 // @description 在 Udemy 上课程的课程内容页面添加下载按钮(可批量下载和单个视频下载),方便将视频下载到本地学习 // @description:en add button on udemy's course content to download videos // @author mofiter // @require https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js // @match *://www.udemy.com/*/learn/v4/content // @grant GM_getValue // @grant GM_setValue // @grant GM_xmlhttpRequest // @grant GM_openInTab // @downloadURL https://update.greasyfork.icu/scripts/371552/Udemy%E4%B8%8B%E8%BD%BD%E5%8A%A9%E6%89%8B%EF%BC%88%E9%9C%80%E9%85%8D%E5%90%88Aria2%E4%BD%BF%E7%94%A8%EF%BC%89.user.js // @updateURL https://update.greasyfork.icu/scripts/371552/Udemy%E4%B8%8B%E8%BD%BD%E5%8A%A9%E6%89%8B%EF%BC%88%E9%9C%80%E9%85%8D%E5%90%88Aria2%E4%BD%BF%E7%94%A8%EF%BC%89.meta.js // ==/UserScript== (function() { 'use strict'; var $ = $ || window.$; var log_count = 1; var hasOpenAriac2Tab = false; var video_quality = "720"; //视频清晰度 var aria2_url = "http://127.0.0.1:6800/jsonrpc"; //Aria2 地址 var course_save_path = '/Users/mofiter/Downloads/study163'; //课程保存路径 var mycourses_url = "https://www.udemy.com/api-2.0/users/me/subscribed-courses"; //已购所有课程的地址 var curricuclum_url = "https://www.udemy.com/api-2.0/courses/{0}/cached-subscriber-curriculum-items/?page_size=9999"; //当前课程的地址 var lesson_url = "https://www.udemy.com/api-2.0/assets/{0}?fields[asset]=@min,status,delayed_asset_message,time_estimation,stream_urls,captions,body&fields[caption]=@default,is_translation"; //一节课的地址 var cookies = document.cookie; var match_cookie = cookies.match(/access_token=(\w+?);/); var authorization = "Bearer " + match_cookie[1]; var mycourses_info; var current_course_url = location.pathname; var current_course_info = {'course_id':{},'course_name':{},'chapter_info':[]}; var isExpand = false; //下载助手是否展开 //自定义 log 函数 function mylog(param1,param2){ param1 = param1 ? param1 : ""; param2 = param2 ? param2 : ""; console.log("#" + log_count++ + "-UdemyDownloader-log:",param1,param2); } //javascript 字符串使用占位符轻松拼接 String.prototype.format = function() { if(arguments.length == 0) return this; var param = arguments[0]; var s = this; if(typeof(param) == 'object') { for(var key in param) {s = s.replace(new RegExp("\\{" + key + "\\}", "g"), param[key]);} return s; } else { for(var i = 0; i < arguments.length; i++) {s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]);} return s; } } setTimeout(function(){ getCourseInfo(); loadSetting(); addDownloadAssistant(); addDownloadButton(); mylog("Udemy 下载助手加载完成 ~"); },5000); //页面加载完成后延时5秒执行 //获取视频信息 function getCourseInfo(){ $.ajax({ url:mycourses_url, async:false, method:'GET', beforeSend:function(xhr){ xhr.setRequestHeader('authorization',authorization); }, success:function(response){ mycourses_info = response.results; } }); $.each(mycourses_info,function(index,element){ if (current_course_url.indexOf(element.url) > -1) { current_course_info.course_id = element.id; current_course_info.course_name = element.title.replace(/:|\?|\*|"|<|>|\|/g," "); return false; } }); curricuclum_url = curricuclum_url.format(current_course_info.course_id); $.ajax({ url:curricuclum_url, async:false, method:'GET', beforeSend:function(xhr){ xhr.setRequestHeader('authorization',authorization); }, success:function(response){ var list = response.results; list.push({'_class':'chapter','id':'useless','title':''}); var chapter = {'chapter_id':'','chapter_name':{},'lecture_info':[]}; var lecture_sn = 0; list.forEach(function(item,index){ if(item._class == 'chapter'){ if(chapter.chapter_id != ''){ var data = JSON.parse(JSON.stringify(chapter)); current_course_info.chapter_info.push(data); } if(item.id != 'useless'){ chapter.chapter_id = item.id; chapter.chapter_name = item.title.replace(/:|\?|\*|"|<|>|\|/g," "); chapter.lecture_info = []; } }else if(item._class == 'lecture'){ var lecture = {'lecture_sn':(++lecture_sn),'lecture_id':item.id,'lecture_name':item.title.replace(/:|\?|\*|"|<|>|\|/g," "),'lecture_asset':{'asset_id':item.asset.id,'asset_name':item.asset.title.replace(/:|\?|\*|"|<|>|\|/g," "),'asset_type':item.asset.asset_type}}; chapter.lecture_info.push(lecture); } }); mylog(current_course_info); } }); } //添加下载助手按钮 function addDownloadAssistant(){ var download_assistant = $('
'); var download_assistant_a = $('下载助手'); var assistant_content = $(''); var batch_download = $('批量下载'); var assistant_setting = $('设置'); assistant_content.append(batch_download).append(assistant_setting); download_assistant.append(download_assistant_a).append(assistant_content); $('.nav-tabs').append(download_assistant); download_assistant.click(function(event){ if(isExpand){ isExpand = false; }else{ isExpand = true; } assistant_content.toggle(); event.stopPropagation(); }); $(document).click(function(){ if(isExpand){ assistant_content.hide(); isExpand = false; } }); batch_download.click(function(){ loadSetting(); if(course_save_path==""){ alert("请到下载助手的设置里面填写文件保存位置"); }else if(aria2_url==""){ alert("请到下载助手的设置里面填写 Aria2 地址"); }else{ batchDownload(); } }); assistant_setting.click(function(){ showSetting(); }); } //加载个人设置 function loadSetting(){ video_quality = GM_getValue('video_quality', '720'); aria2_url = GM_getValue('aria2_url','http://127.0.0.1:6800/jsonrpc'); course_save_path = GM_getValue('course_save_path',''); } //打开设置 function showSetting(){ if(document.querySelector('#dl-setting') == null){ var container = document.createElement("div"); container.id = "dl-setting"; container.style = "position:fixed;z-index:999999;top:10%;right:2%;width:270px;background-color:#eee;padding:5px 10px;font-size:14px;border:1px solid;"; container.innerHTML = "