arte stream url/seperate mp4

get arte stream url with just one click (or none at all) or download seperate audio/video mp4

// ==UserScript==
// @name         arte stream url/seperate mp4
// @namespace    http://tampermonkey.net/
// @version      1.8.1
// @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/*
// @match        https://www.arte.tv/*/videos/*
// @license MIT
// @supportURL   https://greasyfork.org/en/scripts/533451-arte-stream-url-seperate-mp4
// ==/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 locdl     = "download";
  var locstream = "stream url";
  var locvideo  = "video";
  var locaudio  = "audio";
  var locsubs   = "subtitles";
  var locnodl   = "(download unvailable)";
  
  if (lang == "fr") {
  locsubs   = "sous-titres";
  locdl     = "téléchargement";
  locnodl   = "(téléchargement indisponible)";
  }
  if (lang == "de") {
  locdl     = "Download";
  locstream = "Stream URL";
  locvideo  = "Video";
  locaudio  = "Audio";
  locsubs   = "Untertitel";
  locnodl   = "(Download nicht verfügbar)";
  }

  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 = locstream;

    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 += '<option value="' + subcom[1] + '">' + subcom[0].replace("automatische","erforderlich").replace("Für","für").replace(" Untertitel","").replace("forcé","obligatoire") + '</option>';

        }

        for (var i = 0, l = videosarr.length; i < l; ++i) {

          videolinks += '<option value="' + videosarr[i] + '">' + videosarr[i].replace(".m3u8", "").replace(vregex, "") + 'p</option>';

        }
        
        for (var i = 0, l = audiosarr.length; i < l; ++i) {

          var audcom = audiosarr[i].split("#");
          audiolinks += '<option value="' + audcom[1] + '">' + audcom[0].replace(" (Original)","").replace(" (VO)","") + '</option>';

        }

        if (mp4avail == 1) {
          result = '<form name="jump" action=""><select style="background-color: black;color:white" class="ds-11ckmbs" name="dlmenu" onchange="opennewtab()">';
          result += '<option value="" selected="selected">' + locdl + '</option>';
          result += '<option></option>';
          result += '<option value="">h264/mp4 ' + locvideo + ':</option>';
          result += videolinks;
          result += '<option></option>';
          result += '<option value="">aac/mp4 ' + locaudio + ':</option>';
          result += audiolinks;
          if (subtisarr.length > 0) {
            result += '<option></option>';
            result += '<option value="">vtt/txt ' + locsubs + ':</option>';
            result += subtilinks;
          }
          result += '</select></form>';
          result = result.replaceAll(".m3u8", ".mp4").replaceAll("undefined", "");
        } else {
          result = locnodl;
        }


        $("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);
  
});