// ==UserScript== // @name arte stream url/seperate mp4 // @namespace http://tampermonkey.net/ // @version 1.8 // @description get arte stream url with just one click (or none at all) or download seperate audio/video mp4 // @author mihau // @match https://www.arte.tv/de/videos/* // @match https://www.arte.tv/fr/videos/* // @license MIT // @supportURL https://greasyfork.org/en/scripts/533451-arte-stream-url-seperate-mp4 // @downloadURL none // ==/UserScript== // if you want to get the url in the very moment the page loads, change this from 0 to 1: var loadonload = 0; // please do not edit below this line window.addEventListener('load', function() { $ = function(_) {return document.getElementById(_)} $tn = function(_) {return document.getElementsByTagName(_)} $cn = function(_) {return document.getElementsByClassName(_)} $qa = function(_) {return document.querySelectorAll(_)} $qs = function(_) {return document.querySelector(_)} var url, filmid = ""; var loc = window.location.pathname.split('/'); var lang = loc[1]; var id = loc[3]; var name = loc[4]; var thestring = self.__next_f[self.__next_f.length - 1].toString().slice(0, -1).slice(22, -1); if (/Generate\//.test(thestring)) { var schemaObj = JSON.parse(thestring); url = schemaObj.apiPlayerConfig.attributes.streams[0].url; filmid = "worky!"; } else { var jsoncontainer = 0; for (var i = 0, l = $tn("script").length; i < l; ++i) { if ($tn("script")[i].innerText.indexOf("Generate/") != -1) { jsoncontainer = i; break; } } var nix = $tn("script")[jsoncontainer].innerText; var myregex = /Generate\/.*?\/\//; var match = nix.match(myregex); var mynewregex = new RegExp("\/.*", "gi") // very, very dirty regex, but hey - it works, and there's no XHR necessary: filmid = match[0].replace("Generate/", "").replace(mynewregex, ""); url = "https://manifest-arte.akamaized.net/api/manifest/v1/Generate/" + filmid + "/" + lang + "/XQ+KS+CHEV1/" + id + ".m3u8"; } // just in case, for XHR later on var api_base = " https://api.arte.tv/api/player/v2/config/" + lang + "/"; var download_url = api_base + id; var xhr = new XMLHttpRequest(); if ((loadonload != 0) && (filmid != null) && (filmid != "null") && (filmid != "") && (filmid != "undefined") && (filmid != undefined) && (filmid != NaN)) { showURL(); } var filmtitle = $qs('meta[property="og:title"]').content; [" | ARTE Concert", " | ARTE", " - Komplette Sendung", " - Programm in voller Länge", " - Film in voller Länge", " - Regarder le film complet", " - Regarder l’émission complète"].forEach((item) => { filmtitle = filmtitle.replace(item, "") }); filmtitle = filmtitle.replace(/ /g, "_").replace(/[^a-z0-9 \.,_-]/gim, "").replace("_-_", "-"); function showURL() { var test = prompt("stream url (click 'OK' for ffmpeg command)", url); if (test !== null) { prompt("ffmpeg command ('OK' for ffmpeg AUDIO-ONLY command)", 'ffmpeg -referer "' + location.href + '" -user_agent "' + window.navigator.userAgent + '" -i "' + url + '" -c copy -bsf:a aac_adtstoasc "' + filmtitle + '.mp4"'); if (test !== null) { prompt("ffmpeg AUDIO-ONLY command ('OK' for yt-dlp command)", 'ffmpeg -referer "' + location.href + '" -user_agent "' + window.navigator.userAgent + '" -i "' + url + '" -vn -c:a copy "' + filmtitle + '-audio.m4a"'); if (test !== null) { prompt("yt-dlp command", "yt-dlp '" + url + "'"); } } } } $tn("body")[0].onclick = function() { setTimeout('document.getElementsByTagName("body")[0].click()', 1000); var para = document.createElement("a"); para.setAttribute('id', 'dwnl'); para.setAttribute('style', 'color: red; font-weight: 800; padding-left: 5px'); para.setAttribute('class', 'ds-64fl0u'); var anothernode = document.createElement("span"); anothernode.setAttribute('id', 'placeholder'); anothernode.setAttribute('class', 'ds-11ckmbs'); anothernode.setAttribute('style', 'padding-left: 10px'); anothernode.innerText = ""; var node = document.createElement("span"); node.setAttribute('id', 'streamurl'); node.setAttribute('class', 'ds-11ckmbs'); node.setAttribute('style', 'padding-left: 10px; color: #FA481C'); node.innerText = "stream url"; para.appendChild(node); para.appendChild(anothernode); if (!($("dwnl"))) { if ($cn('ds-1r0jukn')[0]) { $cn('ds-1r0jukn')[0].insertBefore(para, null); } else if ($cn('ds-1rm5mah')[0]) { $cn('ds-1rm5mah')[0].insertBefore(para, null); } } var getJSON = function(url, callback) { // var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'json'; xhr.onload = function() { var status = xhr.status; if (status == 200) { callback(null, xhr.response); } else { callback(status); } }; xhr.send(); }; var getM3U = function(url, callback) { // var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'text'; xhr.onload = function() { var status = xhr.status; if (status == 200) { callback(null, xhr.response); } else { callback(status); } }; xhr.send(); }; if ((filmid != null) && (filmid != "null") && (filmid != "") && (filmid != "undefined") && (filmid != undefined) && (filmid != NaN)) { $("streamurl").onclick = function() { showURL(); } } else { getJSON(download_url, function(err, data) { if (err != null) { console.error(err); } else { url = data.data.attributes.streams[0].url; } }); } getM3U(url, function(err, data) { if (err != null) { console.error(err); } else { getM3U = function() {}; var mp4avail = 1; var videosarr = new Array(); var audiosarr = new Array(); var subtisarr = new Array(); var vid = 0; var aud = 0; var sub = 0; var result, videolinks, audiolinks, subtilinks = ""; var vregex = new RegExp(".*_v", "gi"); var uregex = /URI=(["'])(.*?)\1/; var nregex = /NAME=(["'])(.*?)\1/; var lines = data.split(/[\r\n]/); for (var i in lines) { var line = lines[i]; if ((!(/h265/.test(line))) && (!(/iframe/.test(line)))) { if (/(A|B|C)_v/.test(line)) { if (/aka_me_session/.test(line)) { mp4avail = 0; } videosarr[vid] = line; vid++; } if (/TYPE=AUDIO/.test(line)) { var audiofile = line.match(uregex)[2]; var audiolabel = line.match(nregex)[2]; audiosarr[aud] = audiolabel + "#" + audiofile; aud++; } if (/TYPE=SUBTITLES/.test(line)) { var subfile = line.match(uregex)[2]; var sublabel = line.match(nregex)[2]; subtisarr[sub] = sublabel + "#" + subfile.replace("m3u8","vtt"); sub++; } } } videosarr = videosarr.sort(); videosarr.push(videosarr.shift()); videosarr = videosarr.reverse(); audiosarr = audiosarr.sort(); subtisarr = subtisarr.sort(); for (var i = 0, l = subtisarr.length; i < l; ++i) { var subcom = subtisarr[i].split("#"); subtilinks += ''; } for (var i = 0, l = videosarr.length; i < l; ++i) { videolinks += ''; } for (var i = 0, l = audiosarr.length; i < l; ++i) { var audcom = audiosarr[i].split("#"); audiolinks += ''; } if (mp4avail == 1) { result = '
'; result = result.replaceAll(".m3u8", ".mp4").replaceAll("undefined", ""); } else { result = "(download unvailable)"; } $("placeholder").innerHTML = result; $("streamurl").onclick = function() { showURL(); } } }); var script = document.createElement("script"); script.innerHTML = ` function opennewtab() { var optionvalue = document.jump.dlmenu.options[document.jump.dlmenu.selectedIndex].value; if ((document.jump.dlmenu.selectedIndex > 0) && (optionvalue != "") && (optionvalue != "#")) { window.open(optionvalue, "artedltab"); } } `; document.body.appendChild(script); $tn("body")[0].onclick = function() {} }; setTimeout('document.getElementsByTagName("body")[0].click()', 2500); });