// ==UserScript== // @name Skrypt umożliwiający pobieranie materiałów ze znanych serwisów VOD. // @namespace http://www.ipla.tv/ // @include https://vod.tvp.pl/video/* // @include https://cyfrowa.tvp.pl/video/* // @exclude http://www.tvp.pl/sess/* // @include http://www.tvp.pl/* // @match https://*.tvp.pl/* // @include https://www.ipla.tv/* // @include https://player.pl/* // @include https://www.cda.pl/* // @exclude https://www.cda.pl/iframe/* // @include https://vod.pl/filmy/* // @include https://vod.pl/programy-onetu/* // @include https://vod.pl/da-vinci/* // @include https://vod.pl/seriale/* // @include https://vod.pl/programy-tv/* // @include https://redir.atmcdn.pl/* // @include https://*.redcdn.pl/file/o2/redefine/partner/* // @include https://video.wp.pl/* // @version 5.2.3 // @description Skrypt umożliwiający pobieranie 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 // @grant GM_getResourceText // @grant GM_addStyle // @run-at document-end // @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js // @resource css https://raw.githubusercontent.com/zacny/voddownloader/master/voddownloader.css // @downloadURL none // ==/UserScript== (function vodDownloader() { 'use strict'; var $ = window.jQuery.noConflict(true); var cssText = GM_getResourceText('css'); GM_addStyle(cssText); var ATTEMPTS = 10; var ATTEMPT_TIMEOUT = 1500; var NO_ID_ERROR_MESSAGE = 'Nie udało się pobrać idetyfikatora.'; var CALL_ERROR_MESSAGE = 'Błąd pobierania informacji o materiale. Prawdopodobnie materiał jest zabezpieczony DRM. Ten skrypt służy tylko do pobierania darmowych, niezabezpieczonych materiałów. Prosimy nie zgłaszać problemów po wystąpieniu tego błędu.'; var Configurator = (function(Configurator){ Configurator.setup = function(properties){ var settings = { wrapper: { selector: '', get: function(){ return $(settings.wrapper.selector); }, exist: function(){ return $(settings.wrapper.selector).length > 0; } }, button: { id: 'direct-download', style: '', class: '', click: function(){ VideoGrabber.grabVideoData(settings, 0); } }, grabber: { urlTemplates: [], idParser: function(){return null}, formatParser: function(data){return {title: null, formats: new Array()}} } }; return $.extend(true, settings, properties); }; return Configurator; }(Configurator || {})); var ChangeVideoDetector = (function(ChangeVideoDetector){ var checkVideoChange = function(oldSrc, videoChangeCallback) { var src = window.location.href; if(src !== undefined && oldSrc !== src){ return Promise.resolve().then(videoChangeCallback); } else { return Promise.resolve().then(setTimeout(checkVideoChange, ATTEMPT_TIMEOUT, oldSrc, videoChangeCallback)); } }; ChangeVideoDetector.run = function(videoChangeCallback){ var src = window.location.href; checkVideoChange(src, videoChangeCallback); }; return ChangeVideoDetector; }(ChangeVideoDetector || {})); var WrapperDetector = (function(WrapperDetector){ var onWrapperExist = function(properties, videoChangeCallback){ if(properties.wrapper.exist()) { DomTamper.createButton(properties); } else { console.info("Nie mam nic do zrobienia"); } }; var checkWrapperExist = function(attempt, properties, videoChangeCallback){ //console.log('check: ' + properties.wrapper.exist() + ', [' + attempt + ']'); if (properties.wrapper.exist() || attempt == 0) { return Promise.resolve().then(onWrapperExist(properties, videoChangeCallback)); } else { attempt = (attempt > 0) ? attempt-1 : attempt; return Promise.resolve().then(setTimeout(checkWrapperExist, ATTEMPT_TIMEOUT, attempt, properties, videoChangeCallback)); } }; WrapperDetector.run = function(properties, videoChangeCallback) { checkWrapperExist(ATTEMPTS, properties, videoChangeCallback); if(typeof videoChangeCallback === "function"){ ChangeVideoDetector.run(videoChangeCallback); } }; return WrapperDetector; }(WrapperDetector || {})); var VideoGrabber = (function(VideoGrabber){ var getVideoData = function(url, w){ return $.ajax({ url: url, method: 'GET', dataType: 'json' }); }; VideoGrabber.grabVideoData = function(vod, templateIndex, w){ try { var idn = vod.grabber.idParser(); var templates = vod.grabber.urlTemplates; var url = templates[templateIndex].replace(/\$idn/g, idn); w = (w === undefined) ? window.open(): w; //console.log(url); getVideoData(url, w).then(function(data){ try { var formatData = vod.grabber.formatParser(data); DomTamper.createDocument(formatData, w); } catch(e){ DomTamper.handleError(e, w); } }, function(data){ if(templates[templateIndex+1] !== undefined) { VideoGrabber.grabVideoData(vod, templateIndex+1, w); } else { DomTamper.handleError(CALL_ERROR_MESSAGE, w); } }); } catch(e){ DomTamper.handleError(e, w); } }; return VideoGrabber; }(VideoGrabber || {})); var DomTamper = (function(DomTamper){ var cssFileContent = cssText; var injectStyle = function(w){ var style = $('