Skip to content

Instantly share code, notes, and snippets.

@Vojtik69
Last active January 3, 2024 08:17
Show Gist options
  • Save Vojtik69/54061dd7dc97fd2dcf8e98a85185711a to your computer and use it in GitHub Desktop.
Save Vojtik69/54061dd7dc97fd2dcf8e98a85185711a to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name MujRozhlas Download
// @version 1.4
// @description Ke stahování audií z mujrozhlas.cz
// @author
// @match https://www.mujrozhlas.cz/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=mujrozhlas.cz
// @updateURL https://gist.githubusercontent.com/Vojtik69/54061dd7dc97fd2dcf8e98a85185711a/raw/
// @downloadURL https://gist.githubusercontent.com/Vojtik69/54061dd7dc97fd2dcf8e98a85185711a/raw/
// @require https://code.jquery.com/jquery-3.6.0.min.js
// @grant GM_addElement
// ==/UserScript==
async function mainfunc() {
'use strict';
function RemoveInvalidChars(retezec)
{
return retezec.replace(/[/\\?%*:|"<>]/g, '-');
}
var dodatek = "<p><ul style=\"color:red\">";
var seznam = [];
async function pripravPrikaz() {
if (dl.siteEntityBundle == "episode") {
let audiolink = await fetch_link(dl.contentId);
const response = await fetch(`https://api.mujrozhlas.cz/episodes/${dl.contentId}`);
const episode = await response.json();
console.log(episode);
console.log("dl.contentId: " + dl.contentId);
console.log("Cover: "+String(episode.data.attributes.asset.url));
return await "ffmpeg -i " + episode.data.attributes.asset.url + " \"cover.jpg\" & ffmpeg -i " + audiolink + " \"" + RemoveInvalidChars(dl.siteEntityLabel).replace(/[„“‚‘"]/g, '') + ".mp4\"";
} else if (dl.siteEntityBundle == "serial") {
console.log(`https://api.mujrozhlas.cz/serials/${dl.contentId}/episodes`);
console.log(`https://api.mujrozhlas.cz/serials/${dl.contentId}`);
var prikaz = "ffmpeg ";
//var stred_prikazu = " -bsf:a aac_adtstoasc -vcodec copy -c copy -crf 50 ";
var stred_prikazu = " ";
var map_prikazu = "";
const response = await fetch(`https://api.mujrozhlas.cz/serials/${dl.contentId}/episodes`);
const json_data = await response.json();
console.log(json_data);
var i=0;
for (let episode of json_data.data){
try{
prikaz = prikaz + "-i " + await fetch_link(episode.id) + " ";
map_prikazu = map_prikazu + `-map_metadata ${i} -map ${i} "`+String(episode.attributes.part).padStart(2, '0')+"-"+RemoveInvalidChars(episode.attributes.shortTitle).replace(/[„“‚‘"]/g, '')+".mp4\" ";
i=i+1;
}
catch (error) {
dodatek = dodatek + "<li>Epizoda \""+String(episode.attributes.part).padStart(2, '0')+"-"+RemoveInvalidChars(episode.attributes.shortTitle).replace(/[„“‚‘"]/g, '')+"\" není dostupná</li>";
console.log("Epizoda \""+String(episode.attributes.part).padStart(2, '0')+"-"+RemoveInvalidChars(episode.attributes.shortTitle).replace(/[„“‚‘"]/g, '')+"\" není dostupná");
}
}
//jeste pridat ke stazeni cover image
try{
console.log("Cover: "+String(json_data.data[0].attributes.asset.url));
prikaz = prikaz + "-i " + String(json_data.data[0].attributes.asset.url) + " ";
map_prikazu = map_prikazu + `-map_metadata ${i} -map ${i} cover.jpg`;
i=i+1;
}
catch (error) {
dodatek = dodatek + "<li>Cover obrázek není dostupný</li>";
console.log("Cover obrázek není dostupný");
}
return await prikaz + stred_prikazu + map_prikazu;
}
}
async function fetch_link(uuid) {
try {
const response = await fetch(`https://api.mujrozhlas.cz/episodes/${uuid}`);
const json_data = await response.json();
let link = null;
for (let audio_link of json_data.data.attributes.audioLinks) {
if (audio_link.variant === 'hls') {
link = audio_link.url;
break;
} else if (audio_link.variant === 'mp3') {
link = audio_link.url;
break;
}
}
if (link !== null) {
console.log(link);
return link;
} else {
console.log('Nebyl nalezen odkaz na variantu HLS ani mp3.');
throw new Error('Odkaz nebyl nalezen');
}
} catch (error) {
console.error('Chyba při získávání JSONu:', error);
throw error;
}
}
var prikaz = await pripravPrikaz();
dodatek = dodatek+"</ul></p>";
// Vytvoření tlačítka
var button = document.createElement("button");
button.id = 'ffmpeg-button';
GM_addElement(button, 'img', {
src: 'https://icon-library.com/images/ffmpeg-icon/ffmpeg-icon-14.jpg',
width: '120px'
});
// Přidání stylu tlačítka
button.style.position = "absolute";
button.style.top = "10px";
button.style.right = "5px";
// Přidání klikacího event listeneru
button.addEventListener("click", async function() {
// Vytvoření překrývajícího se div elementu
var overlay = document.createElement("div");
overlay.style.position = "fixed";
overlay.style.top = "10%";
overlay.style.height = "85%";
overlay.style.left = "20%";
overlay.style.width = "60%";
overlay.style.padding = "20px";
overlay.style.backgroundColor = "#fff";
overlay.style.border = "2px solid #999";
overlay.style.boxShadow = "0 0 10px rgba(0, 0, 0, 0.5)";
overlay.style.zIndex = "9999";
overlay.style.overflowY = "scroll";
// Vytvoření textového elementu
var text = document.createElement("p");
text.innerHTML = "Následující příkaz zkopírován:<br>\n" + prikaz + dodatek;
text.style.fontSize = "18px";
text.style.lineHeight = "1.5";
text.style.marginBottom = "20px";
// Přidání textového elementu na překrývající se div element
overlay.appendChild(text);
// Přidání překrývajícího se div elementu na stránku
document.body.appendChild(overlay);
// Zkopírování textu do schránky při každém kliknutí na tlačítko pro otevření překrývajícího se okna
var copyToClipboard = function() {
var textToCopy = prikaz;
navigator.clipboard.writeText(textToCopy);
};
copyToClipboard();
button.addEventListener("click", copyToClipboard);
// Zavření překryvného okna při kliknutí mimo něj
window.addEventListener("click", function(event) {
if (event.target == overlay || event.target == text) {
overlay.remove();
//button.removeEventListener("click", copyToClipboard);
}
});
});
// Přidání tlačítka na stránku
document.body.appendChild(button);
};
// Nastavte ID elementu, který chcete sledovat
var targetId = 'nprogress';
// Vytvořte novou instanci MutationObserver
var observer = new MutationObserver(function(mutationsList, observer) {
for(var mutation of mutationsList) {
// Projděte seznam mutací
for (let i = 0; i < mutation.addedNodes.length; i++) {
// Pokud byl přidán nový prvek a jeho ID odpovídá cílovému ID, spusťte kód
if (mutation.addedNodes[i].id === targetId) {
console.log('Element byl přidán');
// Zde můžete spustit svůj userscript
//==nevyužito==
}
}
for (let i = 0; i < mutation.removedNodes.length; i++) {
// Pokud byl odebrán prvek a jeho ID odpovídá cílovému ID, spusťte kód
if (mutation.removedNodes[i].id === targetId) {
console.log('Element byl odebrán');
// Zde můžete spustit svůj userscript
mainfunc();
}
}
}
});
// Nastavte konfiguraci pro MutationObserver
var config = { childList: true, subtree: true };
// Spusťte MutationObserver a sledujte změny v dokumentu
observer.observe(document.body, config);
mainfunc();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment