Greasy Fork

Greasy Fork is available in English.

arte stream url/seperate mp4

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

当前为 2025-10-19 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         arte stream url/seperate mp4
// @namespace    http://tampermonkey.net/
// @version      2.0
// @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/*
// @match        https://www.arte.tv/*/live*
// @license MIT
// @supportURL   http://greasyfork.icu/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 liveid = "";
    var archid = "";
    var liveorarchive = "";

    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 + "'");
          }
        }
      }
    }

    function parsescripts(nextfid) {

      var nix = self.__next_f[nextfid].toString();

      if (liveorarchive == "live") {

        var mynewregex = new RegExp("m3u8.*", "gi");
        url = nix.match("https://artesimulcast\.akamaized\.net.*m3u8")[0];
        url = url.replace(mynewregex, "m3u8")

        if (lang == "de") {
          url = url.replace("artelive_fr", "artelive_de")
        } else {
          url = url.replace("artelive_de", "artelive_fr")
        }

      } else {

        var myregex = /Generate\/.*?\/\//;
        var match = nix.match(myregex);
        var mynewregex = new RegExp("\/.*", "gi")
        filmid = match[0].replace("Generate/", "").replace(mynewregex, "");
        url = "https://manifest-arte.akamaized.net/api/manifest/v1/Generate/" + filmid + "/" + lang + "/XQ+KS+CHEV1/" + id + ".m3u8";

      }

      return url;

    }

    // go...
    for (var i = 0, l = self.__next_f.length; i < l; ++i) {

      if (/m3u8/.test(self.__next_f[i].toString())) {
        if (/artelive/.test(self.__next_f[i].toString())) {

          liveid = i;
          liveorarchive = "live";
          parsescripts(i);

        } else if (/Generate/.test(self.__next_f[i].toString())) {

          archid = i;
          liveorarchive = "archive";

          var thestring = self.__next_f[archid].toString().slice(0, -1).slice(22, -1);
          if (/Generate\//.test(thestring)) {
            var schemaObj = JSON.parse(thestring);
            filmid = "notnull";
            url = schemaObj.apiPlayerConfig.attributes.streams[0].url;

          } else {

            parsescripts(i);

          }

        }

      }

    }

    // for XHR later on
    var download_url = "";
    if ((url != "") && (url != null) && (url != "null")) {
      download_url = url;
    } else {
      download_url = "https://api.arte.tv/api/player/v2/config/" + lang + "/" + id;
    }

    var xhr = new XMLHttpRequest();

    if (loadonload != 0) {
      if ((filmid != null) && (filmid != "null") && (filmid != "") && (filmid != "undefined") && (filmid != undefined) && (filmid != NaN)) {
        showurl();
      }
    }

    var filmtitle = $qs('meta[property="og:title"]').content;
    [" | ARTE Concert", " | ARTE", "- Regarder le documentaire complet", " - Die ganze Doku", " - 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("_-_", "-");

    $tn("body")[0].onclick = function() {
      setTimeout('document.getElementsByTagName("body")[0].click()', 1000);

      var para = document.createElement("a");
      para.setAttribute('id', 'arteuserjs');
      para.setAttribute('style', 'color: red; font-weight: 800; padding-left: 5px');
      para.setAttribute('class', 'ds-64fl0u');

      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);

      if (!($("arteuserjs"))) {
        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);
        }
      }

      if (liveorarchive == "archive") {

        var anothernode = document.createElement("span");
        anothernode.setAttribute('id', 'placeholder');
        anothernode.setAttribute('class', 'ds-11ckmbs');
        anothernode.setAttribute('style', 'padding-left: 10px');
        anothernode.innerText = "";

        para.appendChild(anothernode);

        var getJSON = function(url, callback) {

          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) {

          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 videoformats = /(A|B|C|F)_v/;
            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 (videoformats.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;

          }


        });

        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);
      }

      $("streamurl").onclick = function() {
        showurl();
      }

      $tn("body")[0].onclick = function() {}

    };

    setTimeout('document.getElementsByTagName("body")[0].click()', 2500);

  });