// ==UserScript==
// @name Skrypt umożliwiający pobieranie materiałów ze znanych serwisów VOD.
// @version 5.5.0
// @description Skrypt służący do pobierania materiałów ze znanych serwisów VOD.
// Działa poprawnie tylko z rozszerzeniem Tampermonkey.
// Cześć kodu pochodzi z:
// miniskrypt.blogspot.com,
// miniskrypt.hubaiitv.pl
// @author Przmus, zacny
// @namespace http://www.ipla.tv/
// @include https://vod.tvp.pl/video/*
// @include /^https://(bialystok|katowice|lodz|rzeszow|bydgoszcz|kielce|olsztyn|szczecin|gdansk|krakow|opole|warszawa|gorzow|lublin|poznan|wroclaw).tvp.pl/\d{6,}/
// @include https://cyfrowa.tvp.pl/video/*
// @include https://www.ipla.tv/wideo/*
// @include https://player.pl/*
// @include https://www.cda.pl/*
// @include https://vod.pl/*
// @include https://redir.atmcdn.pl/*
// @include https://*.redcdn.pl/file/o2/redefine/partner/*
// @include https://video.wp.pl/*
// @exclude http://www.tvp.pl/sess/*
// @exclude https://www.cda.pl/iframe/*
// @grant GM_getResourceText
// @grant GM_getResourceURL
// @grant GM_xmlhttpRequest
// @grant GM_download
// @grant GM_notification
// @connect tvp.pl
// @connect getmedia.redefine.pl
// @connect player-api.dreamlab.pl
// @run-at document-end
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @resource buttons_css https://raw.githubusercontent.com/zacny/voddownloader/master/dist/voddownloader-buttons.css
// @resource loader_css https://raw.githubusercontent.com/zacny/voddownloader/master/dist/voddownloader-loader.css
// @resource content_css https://raw.githubusercontent.com/zacny/voddownloader/master/dist/voddownloader-content.css
// @downloadURL none
// ==/UserScript==
(function vodDownloader($) {
'use strict';
function Exception(message, description) {
this.message = message;
this.description = description;
}
var CONFIG = (function(CONFIG) {
var settings = {
attempts: 10,
attempt_timeout: 1500,
id_error: 'Nie udało się odnaleźć idetyfikatora.',
api_error: 'Nie odnaleziono adresów do strumieni.',
call_error: 'Błąd pobierania informacji o materiale.',
drm_error: 'Materiał posiada DRM. Ten skrypt służy do pobierania darmowych, niezabezpieczonych materiałów.',
timeout_error: 'Zbyt długi czas odpowiedzi. Przypuszczalnie problem sieciowy.'
};
CONFIG.get = function(name) {
return settings[name];
};
return CONFIG;
}(CONFIG || {}));
var AsyncStep = (function(AsyncStep){
AsyncStep.setup = function(properties){
var step = {
urlTemplate: '',
beforeStep: function(input){return input},
afterStep: function (output) {return output},
resolveUrl: function (input) {
var url = this.urlTemplate;
if(typeof input === 'string'){
return url.replace(new RegExp('#videoId', 'g'), input);
}
else if(typeof input === 'object') {
$.each(input, function (key, value) {
url = url.replace(new RegExp('#'+key,'g'), value);
});
return url;
}
return '';
}
};
return $.extend(true, step, properties);
};
return AsyncStep;
}(AsyncStep || {}));
var Tool = (function(Tool) {
Tool.deleteParametersFromUrl = function(url){
return decodeURIComponent(url.replace(/\?.*/,''));
};
Tool.getUrlParameter = function(paramName, url){
var results = new RegExp('[\?&]' + paramName + '=([^]*)').exec(url);
if (results==null) {
return null;
}
return decodeURIComponent(results[1]) || 0;
};
Tool.numberModeSort = function(formats){
formats.sort(function (a, b) {
return b.bitrate - a.bitrate;
});
};
Tool.formatConsoleMessage = function(message, params){
console.log.apply(this, $.merge([message], params));
};
Tool.copyToClipboard = function(text) {
var $temp = $("");
$("body").append($temp);
$temp.val(text).select();
document.execCommand("copy");
$temp.remove();
};
Tool.downloadFile = function(fileUrl, title){
var extension = fileUrl.split('.').pop();
var title = (title !== undefined && title !== '' ) ? title : 'nieznany';
var name = title + '.' + extension;
var details = {
url: fileUrl,
name: name,
onerror: function(response){
downloadErrorCallback(response);
}
};
GM_download(details);
return name;
};
var downloadErrorCallback = function (response) {
};
return Tool;
}(Tool || {}));
var DomTamper = (function(DomTamper){
DomTamper.injectStyle = function(w, name){
var head = $(w.document.head);
if(!head.find('style[name="' + name + '"]').length){
var styleElement = $('