No soy muy bueno programando, pero estoy seguro que si esto que comparto a continuacion lo ven los developers de la plataforma saben que bloquear para que deje de funcionar esa aplicacion que nos descarga los cursos... Snippet 1: checkLogin(); // $('.ui.login .form').submit((e)=>{ // e.preventDefault(); // var email = $(e.target).find('input[name="email"]').val(); // var password = $(e.target).find('input[name="password"]').val(); // var isBusiness = $(e.target).find('input[name="business"]').is(":checked"); // if(isBusiness){ // subDomain = $(e.target).find('input[name="subdomain"]').val() || subDomain; // } // if(!email || !password){ // prompt.alert(translate("Type Username/Password")); // return; // } // $.ajax({ // type: 'POST', // url:'https://www.udemy.com/api-2.0/auth/udemy-auth/login/?fields[user]=access_token', // data: {email:email,password:password}, // headers: {"Authorization": "Basic YWQxMmVjYTljYmUxN2FmYWM2MjU5ZmU1ZDk4NDcxYTY6YTdjNjMwNjQ2MzA4ODI0YjIzMDFmZGI2MGVjZmQ4YTA5NDdlODJkNQ=="}, // beforeSend: function(){ // $(".ui.login .dimmer").addClass('active'); // }, // success: function(data, status, xhr){ // if(data.access_token){ // $('.ui.login').slideUp('fast'); // $('.ui.dashboard').fadeIn('fast').css('display','flex'); // settings.set('access_token',data.access_token); // headers = {"Authorization": `Bearer ${data.access_token}`}; // $.ajax({ // type: 'GET', // url: `https://${subDomain}.udemy.com/api-2.0/users/me/subscribed-courses?page_size=50`, // beforeSend: function(){ // $(".ui.dashboard .courses.dimmer").addClass('active'); // }, // headers: headers, // success: function(response){ // handleResponse(response); // } // }); // } // }, // error:function(response){ // if(response.status==400){ // prompt.alert(translate('Incorrect Username/Password')); // }else{ // prompt.alert(translate('Connection Failed')); // } // } // }); // }); Snippet 2: $('.ui.dashboard .content').on('click','.download.button, .download-error', function(e){ e.stopImmediatePropagation(); var $course = $(this).parents('.course'); var courseid = $course.attr('course-id'); $course.find('.download-error').hide(); $course.find('.download-status').show(); var settingsCached = settings.getAll(); var skipAttachments = settingsCached.download.skipAttachments; var skipSubtitles = settingsCached.download.skipSubtitles; $.ajax({ type: 'GET', url: `https://${subDomain}.udemy.com/api-2.0/courses/${courseid}/cached-subscriber-curriculum-items?page_size=100000`, beforeSend: function(){ $(".ui.dashboard .course.dimmer").addClass('active'); }, headers: headers, success: function(response) { $(".ui.dashboard .course.dimmer").removeClass('active'); $course.find('.download.button').addClass('disabled'); $course.css('padding-bottom','25px'); $course.find('.ui.progress').show(); var coursedata = []; coursedata['chapters'] = []; coursedata['name'] = $course.find('.coursename').text(); var chapterindex = -1; var lectureindex = -1; var remaining = response.count; coursedata['totallectures'] = 0; var availableSubs = []; if(response.results[0]._class=="lecture"){ chapterindex++; lectureindex = 0; coursedata['chapters'][chapterindex] = []; coursedata['chapters'][chapterindex]['name'] = 'Chapter 1'; coursedata['chapters'][chapterindex]['lectures'] = []; remaining--; } $.each(response.results, function(i,v){ if(v._class=="chapter"){ chapterindex++; lectureindex = 0; coursedata['chapters'][chapterindex] = []; coursedata['chapters'][chapterindex]['name'] = v.title; coursedata['chapters'][chapterindex]['lectures'] = []; remaining--; }else if(v._class=="lecture"&& (v.asset.asset_type=="Video"||v.asset.asset_type=="Article"||v.asset.asset_type=="File"||v.asset.asset_type=="E-Book")){ if(v.asset.asset_type!="Video"&&skipAttachments){ remaining--; if(!remaining){ if(Object.keys(availableSubs).length){ askforSubtile(availableSubs,initDownload,$course,coursedata); }else{ initDownload($course,coursedata); } } return; } function getLecture(lecturename,chapterindex,lectureindex){ $.ajax({ type: 'GET', url: `https://${subDomain}.udemy.com/api-2.0/users/me/subscribed-courses/${courseid}/lectures/${v.id}?fields[asset]=stream_urls,download_urls,captions,title,filename,data,body&fields[lecture]=asset,supplementary_assets`, headers: headers, success: function(response) { if(v.asset.asset_type=="Article"){ if(response.asset.data){ var src=response.asset.data.body; }else{ var src=response.asset.body; } var videoQuality = v.asset.asset_type; var type = 'Article'; }else if((v.asset.asset_type=="File"||v.asset.asset_type=="E-Book")){ var src=response.asset.download_urls[v.asset.asset_type][0].file; var videoQuality = v.asset.asset_type; var type = 'File'; }else{ var type = 'Video'; var lecture = response.asset.stream_urls; var qualities = []; var qualitySrcMap = {}; lecture.Video.forEach(function(val){ if(val.label=="Auto") return; qualities.push(val.label); qualitySrcMap[val.label] = val.file; }); var lowest = Math.min(...qualities); var highest = Math.max(...qualities); var videoQuality = settingsCached.download.videoQuality; if(!videoQuality || videoQuality=="Auto"){ var src=lecture.Video[0].file; videoQuality = lecture.Video[0].label; }else{ switch(videoQuality){ case 'Highest': var src=qualitySrcMap[highest]; videoQuality = highest; break; case 'Lowest': var src=qualitySrcMap[lowest]; videoQuality = lowest; break; default: videoQuality = videoQuality.slice(0, -1); if(qualitySrcMap[videoQuality]){ var src=qualitySrcMap[videoQuality]; }else{ var src=lecture.Video[0].file; videoQuality = lecture.Video[0].label; } } } } coursedata['chapters'][chapterindex]['lectures'][lectureindex] = {src:src,name:lecturename,quality:videoQuality,type:type}; if(!skipSubtitles&&response.asset.captions.length){ coursedata['chapters'][chapterindex]['lectures'][lectureindex].caption = []; response.asset.captions.forEach(function(caption){ caption.video_label in availableSubs ? availableSubs[caption.video_label] = availableSubs[caption.video_label]+1 : availableSubs[caption.video_label] = 1; coursedata['chapters'][chapterindex]['lectures'][lectureindex].caption[caption.video_label] = caption.url; }); } if(response.supplementary_assets.length&&!skipAttachments){ coursedata['chapters'][chapterindex]['lectures'][lectureindex]['supplementary_assets'] = []; var supplementary_assets_remaining = response.supplementary_assets.length; $.each(response.supplementary_assets, function(a,b){ $.ajax({ type: 'GET', url: `https://${subDomain}.udemy.com/api-2.0/users/me/subscribed-courses/${courseid}/lectures/${v.id}/supplementary-assets/${b.id}?fields[asset]=download_urls,external_url,asset_type`, headers: headers, success: function(response) { if(response.download_urls){ coursedata['chapters'][chapterindex]['lectures'][lectureindex]['supplementary_assets'].push({src:response.download_urls[response.asset_type][0].file,name:b.title,quality:'Attachment',type:'File'}); }else{ coursedata['chapters'][chapterindex]['lectures'][lectureindex]['supplementary_assets'].push({src:`<script type="text/javascript">window.location = "${response.external_url}";</script>`,name:b.title,quality:'Attachment',type:'Url'}); } supplementary_assets_remaining--; if(!supplementary_assets_remaining){ remaining--; coursedata['totallectures']+=1; if(!remaining){ if(Object.keys(availableSubs).length){ askforSubtile(availableSubs,initDownload,$course,coursedata); }else{ initDownload($course,coursedata); } } } } }); }); }else{ remaining--; coursedata['totallectures']+=1; if(!remaining){ if(Object.keys(availableSubs).length){ askforSubtile(availableSubs,initDownload,$course,coursedata); }else{ initDownload($course,coursedata); } } } } }); } getLecture(v.title,chapterindex,lectureindex); lectureindex++; }else if(!skipAttachments){ coursedata['chapters'][chapterindex]['lectures'][lectureindex] = {src:`<script type="text/javascript">window.location = "https://${subDomain}.udemy.com${$course.attr('course-url')}t/${v._class}/${v.id}";</script>`,name:v.title,quality:'Attachment',type:'Url'}; remaining--; coursedata['totallectures']+=1; if(!remaining){ if(Object.keys(availableSubs).length){ askforSubtile(availableSubs,initDownload,$course,coursedata); }else{ initDownload($course,coursedata); } } lectureindex++; }else{ remaining--; if(!remaining){ if(Object.keys(availableSubs).length){ askforSubtile(availableSubs,initDownload,$course,coursedata); }else{ initDownload($course,coursedata); } } } }); }, error: function(error){ $(".ui.dashboard .course.dimmer").removeClass('active'); if(error.status==403){ prompt.alert(translate("You do not have permission to access this course")); } } }); }); Saludos
... View more