您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
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.5.5 // @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 // ==/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 $ = 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, thisisthefilmid = ""; 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; thisisthefilmid = "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: thisisthefilmid = match[0].replace("Generate/", "").replace(mynewregex, ""); url = "https://manifest-arte.akamaized.net/api/manifest/v1/Generate/" + thisisthefilmid + "/" + 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; if ((loadonload != 0) && (thisisthefilmid != null) && (thisisthefilmid != "null") && (thisisthefilmid != "") && (thisisthefilmid != "undefined") && (thisisthefilmid != undefined) && (thisisthefilmid != 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 (OK for ffmpeg command or cancel)", url); if (test !== null) { prompt("ffmpeg command (OK for ffmpeg AUDIO-ONLY command or cancel)", '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 or cancel)", '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 ((thisisthefilmid != null) && (thisisthefilmid != "null") && (thisisthefilmid != "") && (thisisthefilmid != "undefined") && (thisisthefilmid != undefined) && (thisisthefilmid != 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 { var mp4avail = 1; var videosarr = new Array(); var audiosarr = new Array(); var vid = 0; var aud = 0; var result, videolinks, audiolinks = ""; var vidurlclean = new RegExp(".*_v", "gi"); var audurlclean = new RegExp(".*_aud_", "gi"); var lines = data.split(/[\r\n]/); for (var i in lines) { var line = lines[i]; if (/A_v/.test(line) && (!(/h265/.test(line))) && (!(/iframe/.test(line)))) { if (/aka_me_session/.test(line)) { mp4avail = 0; } videosarr[vid] = line; vid++; } if (/A_aud/.test(line) && (!(/h265/.test(line))) && (!(/iframe/.test(line)))) { audiosarr[aud] = line.match(/URI=(["'])(.*?)\1/)[2]; aud++; } } videosarr = videosarr.sort(); videosarr.push(videosarr.shift()); videosarr = videosarr.reverse(); for (var i = 0, l = videosarr.length; i < l; ++i) { videolinks += '<option value="' + videosarr[i] + '">' + videosarr[i].replace(".m3u8", "").replace(vidurlclean, "") + 'p</option>'; } for (var i = 0, l = audiosarr.length; i < l; ++i) { var auddisplay = audiosarr[i].replace(".m3u8", "").replace(audurlclean, ""); if (/-ALL/.test(audiosarr[i])) { auddisplay += " (Deutsch)"; } else if (/-FRA/.test(audiosarr[i])) { auddisplay += " (Francais)"; } else if (/-ITA/.test(audiosarr[i])) { auddisplay += " (Italiano)"; } else if (/-ANG/.test(audiosarr[i])) { auddisplay += " (English)"; } else if (/-ESP/.test(audiosarr[i])) { auddisplay += " (Espanol)"; } else if (/-POL/.test(audiosarr[i])) { auddisplay += " (Polski)"; } else if (/-MUS/.test(audiosarr[i])) { auddisplay += " (music only)"; } audiolinks += '<option value="' + audiosarr[i] + '">' + auddisplay + '</option>'; } if (mp4avail == 1) { result = '<form name="jump" action=""><select style="background-color: black;color:white" class="ds-11ckmbs" name="dlmenu" onchange="location=document.jump.dlmenu.options[document.jump.dlmenu.selectedIndex].value;">'; result += '<option value="#" selected="selected">mp4 download</option>'; result += '<option value="#">(seperate files)</option>'; result += '<option value="#"> </option>'; result += '<option value="#">video resolution:</option>'; result += videolinks; result += '<option value="#"> </option>'; result += '<option value="#">audio languages:</option>'; result += audiolinks; result += '</select></form>'; result = result.replaceAll(".m3u8", ".mp4").replaceAll("undefined", ""); } else { result = "mp4 not available"; } $("placeholder").innerHTML = result; $("streamurl").onclick = function() { showURL(); } $tn("body")[0].onclick = function() {} } }); }; setTimeout('document.getElementsByTagName("body")[0].click()', 3500);