// ==UserScript== // @name Video.mediaset.it native video player and direct links // @name:it Mediaset Play - Link diretti e download video // @namespace http://andrealazzarotto.com // @description This script allows you to watch and download videos on Mediaset Play. // @description:it Ti permette di guardare e scaricare i video da Mediaset Play // @include http://www.video.mediaset.it/video/* // @include http://www.video.mediaset.it/player/* // @include https://*.mediasetplay.mediaset.it/* // @include http://www.mediaset.it/* // @version 7.0.2 // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js // @require https://unpkg.com/@ungap/from-entries@0.1.2/min.js // @grant GM_xmlhttpRequest // @grant GM.xmlHttpRequest // @connect mediaset.it // @connect video.mediaset.it // @connect cdnselector.xuniplay.fdnames.com // @connect execute-api.eu-west-1.amazonaws.com // @connect theplatform.eu // @connect akamaized.net // @connect mediaset.net // @license GPL version 3 or any later version; http://www.gnu.org/copyleft/gpl.html // @downloadURL none // ==/UserScript== /* Greasemonkey 4 wrapper */ if (typeof GM !== "undefined" && !!GM.xmlHttpRequest) { GM_xmlhttpRequest = GM.xmlHttpRequest; } function fetch(params) { return new Promise(function(resolve, reject) { params.onload = resolve; params.onerror = reject; GM_xmlhttpRequest(params); }); } var base_selector = "http://link.theplatform.eu/s/PR1GhC/media/guid/2702976343/[[GUID]]?mbr=true&formats=[[FORMATS]]&format=SMIL&assetTypes=HD,HBBTV,widevine,geoIT%7CgeoNo:HD,HBBTV,geoIT%7CgeoNo:HD,geoIT%7CgeoNo:SD,HBBTV,widevine,geoIT%7CgeoNo:SD,HBBTV,geoIT%7CgeoNo:SD,geoIT%7CgeoNo"; var loc = unsafeWindow.location; var isIframe = loc.href.indexOf("player/") > 0; var isPlay = loc.href.indexOf("mediasetplay.mediaset.it/video/") > 0; function boxStyle(selector, color, textcolor) { $(selector).css({ 'padding': '.5em', 'margin': '1em 4em', 'text-align': 'center', 'background-color': color, 'color': textcolor }); $(selector + ' a').css('color', textcolor); $(selector + ' pre').css({ 'white-space': 'pre-wrap', 'word-break': 'break-all', }); $(selector + ' *').css('font-size', '15px'); $(selector + ' small').css('font-size', '13px'); } function writeLive(stream) { $('#stream-url').remove(); $('
Flusso della diretta da aprire con VLC o streamlink
:
' + stream + '
');
boxStyle('#stream-url', 'rgba(255,255,255,0.5)', 'black');
// kill login timeout
unsafeWindow.userNotLogged = function() { return; };
setTimeout(function() {
$('.countdown').remove();
}, 1000);
}
function handleLive(pageURI) {
var baseURL = "https://api-ott-prod-fe.mediaset.net/PROD/play/alive/nownext/v1.0?channelId=";
if (pageURI.indexOf('/diretta/') < 0) {
return;
}
fetch({
method: 'GET',
url: baseURL + pageURI.split('/diretta/')[1].split('_c')[1],
headers: {
'Accept': 'application/json'
}
}).then(function(responseDetails) {
var r = responseDetails.responseText;
var data = $.parseJSON(r);
var instruction = data.response.tuningInstruction;
for (var i = 0; i < 5; i++) {
var row = instruction['urn:theplatform:tv:location:any'][i];
var public = row.publicUrls[0];
var streaming = row.streamingUrl;
if (row.format.indexOf('x-mpegURL') > 0) {
return fetch({
method: 'GET',
url: public,
headers: {
'Accept': 'application/atom+xml,application/xml,text/xml'
}
});
}
}
}).then(function(responseDetails) {
var src = responseDetails.finalUrl;
writeLive(src);
});
}
function getInformation(vlink) {
vlink.url = vlink.url.replace(/vod08\.msf\.cdn/, 'vod05.msf.cdn');
return fetch({
method: 'HEAD',
url: vlink.url
}).then((response) => {
if (response.status == 404) {
let result = Object.assign({}, vlink);
result.error = true;
result.size = 0;
return result;
}
let headers = fromEntries(response.responseHeaders.split("\n").map(element => element.trim().toLowerCase().split(":")));
let size = +headers['content-length'];
size = Math.round(size / 1024 / 1024);
let result = Object.assign({}, vlink);
result.error = false;
result.size = size;
return result;
});
}
var range = (start, stop, step) => {
var a = [start], b = start;
while (b < stop) {
a.push(b += step || 1);
}
return (b > stop) ? a.slice(0,-1) : a;
};
var leftPad = (str, padding, length) => {
str = `${str}`;
while (str.length < length) {
str = padding + str;
}
return str;
};
var scrapeQualities = async (url) => {
var start = url.match(/[^_]*_[^\/]*/);
if (!start) {
return [];
}
start = start[0];
var suffix = start.match(/_.*/)[0].slice(1);
var m3u8 = await Promise.all(['ss', 'sd', 'hd'].map(index => {
var quality_url = `${start}/hlsrc/${index}_no_mpl.m3u8`;
return getInformation({ na: `M3U8 (${index})`, url: quality_url, h: false });
}));
var numbers = range(0, 99);
var results = await Promise.all(numbers.map(index => {
var quality_url = `${start}/${suffix}-${leftPad(index)}_0.mp4`;
return getInformation({ na: '.MP4', url: quality_url, h: true });
}));
return m3u8.concat(results).filter(value => !value.error);
};
function getLinks(responseDetails) {
var r = responseDetails.responseText;
r = r.replace(/msf.ticdn.it/g, 'msf.cdn.mediaset.net');
r = r.replace(/netfarmunica/g, 'net/farmunica');
r = r.replace(/