Skip to content

Instantly share code, notes, and snippets.

@jemsgit
Last active December 31, 2022 08:51
Show Gist options
  • Save jemsgit/f004feb892f53748a7ec6e63a05c490c to your computer and use it in GitHub Desktop.
Save jemsgit/f004feb892f53748a7ec6e63a05c490c to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name eductiveGrub
// @description Grub educative course
// @author Jem Jem
// @license MIT
// @version 1.0
// @include https://www.educative.io/courses/*
// @include https://www.educative.io/module/*
// ==/UserScript==
(async function (window, undefined) { // [2] нормализуем window
function getContentLinks() {
const links = document.querySelectorAll(".h-full a.cursor-pointer[href^='/courses']:not(.heading-five):not(.break-words), .h-full a.cursor-pointer[href^='/module']:not(.heading-five):not(.break-words)");
let result = [];
for(let i = 0; i < links.length; i++) {
let link = links[i].getAttribute('href');
result.push(`https://www.educative.io${link}`);
}
return result;
}
function sleep(seconds) {
return new Promise((res, rej) => {
setTimeout(res, seconds * 1000);
})
}
function saveFile(data) {
const fileName = document.title;
let blob = new Blob([data],{ type: "text/html;charset=utf-8" });
let a = document.createElement("a");
let url = window.URL.createObjectURL(blob);
a.style = "display: none";
a.href = url;
a.download = fileName;
document.body.appendChild(a);
a.click();
}
function saveDelimetrFile(data) {
const fileName = 'Next Module.txt';
let blob = new Blob([data],{ type: "text/plain;charset=utf-8" });
let a = document.createElement("a");
let url = window.URL.createObjectURL(blob);
a.style = "display: none";
a.href = url;
a.download = fileName;
document.body.appendChild(a);
a.click();
}
function saveMediaFile(link, name) {
let a = document.createElement("a");
a.style = "display: none";
a.href = link;
a.download = name;
document.body.appendChild(a);
a.click();
}
function saveMedia(document) {
let objects = document.querySelectorAll('object');
let links = {};
for(let i = 0; i < objects.length; i++) {
let link = objects[i].getAttribute('data');
let fullLink = link.includes('https://www.educative.io') ? link : `https://www.educative.io${link}`;
let linkText = link.replace(/[\/\?]/g, '_');
links[link] = linkText + '.svg';
saveMediaFile(fullLink, link)
}
let imgs = document.querySelectorAll('.major-second img');
links = {};
for(let i = 0; i < imgs.length; i++) {
let link = imgs[i].getAttribute('src');
let fullLink = link.includes('https://www.educative.io') ? link : `https://www.educative.io${link}`;
let linkText = link.replace(/[\/\?]/g, '_');
links[link] = linkText + '.svg';
saveMediaFile(fullLink, link)
}
return links;
}
async function grub() {
await sleep(10);
let links = localStorage.getItem('links');
let hasFinished = localStorage.getItem('saved');
if(hasFinished === 'true') {
return;
}
if(!links) {
links = getContentLinks();
} else {
links = JSON.parse(links);
}
const nextLink = links[0];
await sleep(10);
let html = document.querySelector('html').innerHTML.replace(/(\\x3C\/)/g, '<');
localStorage.setItem('links', JSON.stringify(links.slice(1)));
let mediaLinks = saveMedia(document);
Object.keys(mediaLinks).forEach((key) => html = html.replace(key, mediaLinks[key]));
saveFile(html);
if(!nextLink) {
localStorage.setItem('links', '');
let nextModule = checkModuleToGrub();
if(!nextModule) {
localStorage.setItem('saved', true);
localStorage.setItem('modules-saved', true);
return;
} else {
saveDelimetrFile('123')
window.location = nextModule;
return;
}
}
window.location = nextLink;
}
function checkModuleToGrub() {
let modules = localStorage.getItem('modules-links');
if(!modules) {
return;
}
if(modules){
modules = JSON.parse(modules);
}
let nextModule = modules[0];
modules = modules.slice(1);
localStorage.setItem('modules-links', !modules.length ? '' : JSON.stringify(modules));
return nextModule;
}
await grub();
})(window);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment