// ==UserScript== // @name Skrypt umożliwiający pobieranie materiałów ze znanych serwisów VOD. // @version 6.3.1 // @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/ // @source https://github.com/zacny/voddownloader // @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/* // @include https://player.pl/* // @include https://*.cda.pl/* // @include https://vod.pl/* // @include https://redir.atmcdn.pl/* // @include https://*.redcdn.pl/file/o2/redefine/partner/* // @include https://video.wp.pl/* // @include https://ninateka.pl/* // @include https://www.arte.tv/*/videos/* // @include https://pulsembed.eu/* // @exclude http://www.tvp.pl/sess/* // @exclude https://www.cda.pl/iframe/* // @grant GM_getResourceText // @grant GM_xmlhttpRequest // @grant GM_download // @grant GM_setClipboard // @grant GM_info // @connect tvp.pl // @connect getmedia.redefine.pl // @connect player-api.dreamlab.pl // @connect api.arte.tv // @connect b2c.redefine.pl // @run-at document-end // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/platform/1.3.5/platform.min.js // @require https://gitcdn.xyz/cdn/zacny/voddownloader/4b17a120f521eaddf476d6e8fe3be152d506f244/lib/js/mdb-with-waves-patch.js // @resource buttons_css https://raw.githubusercontent.com/zacny/voddownloader/master/lib/css/voddownloader-buttons.css // @resource content_css https://raw.githubusercontent.com/zacny/voddownloader/master/lib/css/voddownloader-content.css // @downloadURL none // ==/UserScript== (function vodDownloader($, platform, Waves) { 'use strict'; var Exception = (function(error, templateParams) { this.error = error; this.templateParams = Array.isArray(templateParams) ? templateParams : [templateParams]; }); var Format = (function(data) { this.bitrate = null; this.format = null; $.extend(true, this, data); }); 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.formatConsoleMessage = function(message, params){ console.log.apply(this, $.merge([message], params)); }; Tool.downloadFile = function(fileUrl, title){ var extension = Tool.deleteParametersFromUrl(fileUrl.split('.').pop()); var movieTitle = (title !== undefined && title !== '' ) ? title : 'nieznany'; var name = movieTitle + '.' + extension; GM_download(fileUrl, name); }; Tool.template = function(templates, ...keys){ return (function(...values) { var dict = values[values.length - 1] || {}; var result = [templates[0]]; keys.forEach(function(key, i) { var value = Number.isInteger(key) ? values[key] : dict[key]; result.push(value, templates[i + 1]); }); return result.join(''); }); }; Tool.getRealUrl = function(){ var topUrl = window.sessionStorage.getItem(config.storage.topWindowLocation); return topUrl !== null ? topUrl : window.location.href; }; Tool.isTopWindow = function(){ return window.top === window.self; }; return Tool; }(Tool || {})); const config = { attempts: 10, attemptTimeout: 1500, storage: { doNotWarn: 'voddownloader.doNotwarnIfIncorrectPluginSettingsDetected', topWindowLocation: 'voddownloader.topWindowLocation' }, include: { fontawesome: { id: 'fontawesome', css: 'https://use.fontawesome.com/releases/v5.8.2/css/all.css' }, bootstrap: { id: 'bootstrap', css: 'https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.min.css' }, mdb: { id: 'mdb', css: 'https://cdnjs.cloudflare.com/ajax/libs/mdbootstrap/4.8.2/css/mdb.min.css', } }, error: { id: { caption: 'Nie udało się odnaleźć idetyfikatora.', template: Tool.template`Algorytm rozpoznawania identyfikatora wideo na stronie: ${0} \ zakończył się niepowodzeniem. Może to oznaczać błąd skryptu.`, }, tvnId: { caption: 'Nie udało się odnaleźć idetyfikatora.', template: Tool.template`Algorytm rozpoznawania identyfikatora wideo na stronie: ${0} \ zakończył się niepowodzeniem.\nJeżeli jest to główna strona programu oznacza to, \ że nie udało się odnaleźć identyfikatora ostatniego odcinka. Wejdź na stronę odcinka \ i spróbuj ponownie.\nMoże to również oznaczać błąd skryptu.`, }, call: { caption: 'Błąd pobierania informacji o materiale.', template: Tool.template`Wystąpił błąd w wykonaniu skryptu w kroku: ${0} na stronie: ${1} \ Zgłoś problem autorom skryptu.`, }, noSource: { caption: 'Nie udało się odnaleźć źródeł do materiału.', template: Tool.template`Materiał ze strony ${0} nie posiada zdefiniowanych źródeł, które mogłyby zostać \ wyświetlone. \nMoże to oznaczać, że nie jest on publicznie dostępny, dostępne źródła nie mogą zostać \ wyświetlone w przeglądarce bez dodatkowego oprogramowania lub jest umieszczony w płatnej strefie.`, type: 'info' }, timeout: { caption: 'Zbyt długi czas odpowiedzi.', template: Tool.template`Dla kroku: ${0} na stronie "${1}" nie dotarły \ informacje zwrotne.\nPrzypuszczalnie jest to problem sieciowy. Spróbuj ponownie za jakiś czas.` }, noParent: { caption: 'Brak zakładki ze stroną główną.', template: Tool.template`Została zamknięta zakładka ze stroną na której został uruchomiony skrypt. \ Ta zakładka nie może przez to działać poprawnie. Otwórz ponownie stronę główną: \n ${0} \n by przywrócić prawidłowe funkcjonowanie skryptu.` } } }; var Step = (function(properties){ var step = { urlTemplate: '', beforeStep: function(input){return input}, afterStep: function (output) {return output}, resolveUrl: function (input) { var url = this.urlTemplate; var urlParams = {}; $.each(input, function (key, value) { url = url.replace(new RegExp('#'+key,'g'), value); urlParams[key] = value; }); return { url: url, urlParams: urlParams }; }, isAsync: function(){ return step.urlTemplate; }, method: 'GET', methodParam: function(){return {}} }; return $.extend(true, step, properties); }); var Notification = (function(Notification) { var create = function(title, bodyContent, special) { var specialContentClasses = special ? ' special-color white-text' : ''; var content = $('