Greasy Fork is available in English.

cda.pl, vimeo - lista wideo w folderze i wyszukiwarce

Pokazuje listę linków do filmów z wszystkich stron danego folderu (ale nie w podfolderach) lub wyniku wyszukiwania (bez folderów). Linki nie prowadzą bezpośrednio do filmu, lecz do jego strony.

// ==UserScript==
// @name         cda.pl, vimeo - lista wideo w folderze i wyszukiwarce
// @namespace    https://greasyfork.org/pl/scripts/396433
// @version      0.5.1
// @description  Pokazuje listę linków do filmów z wszystkich stron danego folderu (ale nie w podfolderach) lub wyniku wyszukiwania (bez folderów). Linki nie prowadzą bezpośrednio do filmu, lecz do jego strony.
// @author       Dove6
// @include      https://www.cda.pl/*/folder*
// @include      https://www.cda.pl/info/*?section=video
// @include      https://www.cda.pl/video/show/*
// @include      https://vimeo.com/search*
// @grant        none
// ==/UserScript==

/* jshint esversion: 6 */
/* jshint multistr: true */
(function() {
    'use strict';
    
    const dom_parser = new DOMParser();

    class LinksFetcher {
        callback(links) {
            console.log(links.join(' '));
        }
        isBusy() {
            throw new Error('This method is abstract');
        }
        parseFetchedPage(text_html) {
            return text_html;
        }
        fetchLinks(source_url = this.source_url, direction = null) {
            throw new Error('This method is abstract');
        }
        createButton(name) {
            let s = document.createElement('span');
            s.className = 'fetch-links-button';
            s.innerHTML = name;
            s.style.border = '2px solid green';
            s.style.borderRadius = '2px';
            s.style.padding = '5px';
            s.style.margin = '10px';
            s.style.fontWeight = 'bold';
            s.style.cursor = 'pointer';
            return s;
        }
    }

    class RecursiveLinksFetcher extends LinksFetcher {
        setReachedEnd(direction) {
            this.reached_end[direction] = true;
            if (this.reached_end.left && this.reached_end.right) {
                this.callback(this.links);
            }
        }
        isBusy() {
            return (!this.reached_end.left || !this.reached_end.right);
        }
        constructor(source_url, callback = null) {
            super();
            this.links = [];
            this.reached_end = {'left': true, 'right': true};
            this.source_url = source_url;
            if (callback !== null) {
                this.callback = callback;
            }
        }
        getLinksFromParsedPage(parsed_page) {
            throw new Error('This method is abstract');
        }
        getNextURLFromParsedPage(parsed_page) {
            throw new Error('This method is abstract');
        }
        getPreviousURLFromParsedPage(parsed_page) {
            throw new Error('This method is abstract');
        }
        fetchLinks(source_url = this.source_url, direction = null) {
            this.reached_end.left = false;
            this.reached_end.right = false;
            this.links = [];
            fetch(source_url).then(
                (result) => {
                    let fetched_page = result.text().then(
                        (result_text) => {
                            let parsed_page = this.parseFetchedPage(result_text);
                            this.links = this.links.concat(this.getLinksFromParsedPage(parsed_page));
                            let urls = {
                                'next': this.getNextURLFromParsedPage(parsed_page),
                                'previous': this.getPreviousURLFromParsedPage(parsed_page)
                            };
                            if (direction === 'right' || direction === null) {
                                if (urls.next !== undefined && urls.next !== null) {
                                    console.log('Next page: ' + urls.next);
                                    this.fetchLinks(urls.next, 'right');
                                } else {
                                    this.setReachedEnd('right');
                                }
                            }
                            if (direction === 'left' || direction === null) {
                                if (urls.previous !== undefined && urls.previous !== null) {
                                    console.log('Previous page: ' + urls.previous);
                                    this.fetchLinks(urls.previous, 'left');
                                } else {
                                    this.setReachedEnd('left');
                                }
                            }
                        }
                    );
                }
            );
        }
    }

    class IterativeLinksFetcher extends LinksFetcher {
        decrementCounter() {
            if (this.counter > 0) {
                this.counter--;
            }
            if (this.counter === 0) {
                this.callback(this.links);
            }
        }
        isBusy() {
            return (this.counter !== 0);
        }
        constructor(source_url, callback = null) {
            super();
            this.links = [];
            this.counter = 0;
            this.source_url = source_url;
            if (callback !== null) {
                this.callback = callback;
            }
        }
        getLinksFromParsedPage(parsed_page) {
            throw new Error('This method is abstract');
        }
        getSpecifiedPageNumberURL(source_url, page_number) {
            throw new Error('This method is abstract');
        }
        fetchLinks(source_url = this.source_url, direction = null) {
            let page_numbers = {
                min: Number(document.querySelector('.fetch-links-settings.minimum').value),
                max: Number(document.querySelector('.fetch-links-settings.maximum').value)
            };
            console.log(page_numbers);
            if (page_numbers.min <= page_numbers.max) {
                this.counter = page_numbers.max - page_numbers.min + 1;
                this.links = [];
                for (let page_number = page_numbers.min; page_number <= page_numbers.max; page_number++) {                
                    let page_url = this.getSpecifiedPageNumberURL(source_url, page_number);
                    console.log('Now fetching page: ' + page_url);
                    fetch(page_url).then(
                        (result) => {
                            let fetched_page = result.text().then(
                                (result_text) => {
                                    let parsed_page = this.parseFetchedPage(result_text);
                                    this.links = this.links.concat(this.getLinksFromParsedPage(parsed_page));
                                    this.decrementCounter();
                                }
                            );
                        }
                    );
                }
            }
        }
    }

    class CDASearchLinksFetcher extends IterativeLinksFetcher {
        parseFetchedPage(text_html) {
            return dom_parser.parseFromString(text_html, 'text/html');
        }
        getLinksFromParsedPage(parsed_page) {
            return Array.from(parsed_page.querySelectorAll('.text.text-video > .link-title-visit')).map(function(e) {
                return e.href;
            });
        }
        getSpecifiedPageNumberURL(source_url, page_number) {
            let result_url = new URL(source_url);
            let result_path = result_url.pathname;
            let last_slash = result_path.lastIndexOf('/');
            if ((/show/).test(result_path.slice(result_path.lastIndexOf('/', last_slash - 1)))) {
                result_path += '/p' + String(page_number);
            } else {
                result_path = result_path.slice(0, last_slash + 1) + 'p' + String(page_number);
            }
            result_url.pathname = result_path;
            return result_url.toString();
        }
        createButton(name = 'Pobierz linki') {
            let s = super.createButton(name);
            s.onclick = (function() {
                if (!this.isBusy()) {
                    if (document.querySelector('.fetch-links-result').innerHTML.length !== 0) {
                        document.querySelector('.fetch-links-result').innerHTML = '';
                        document.querySelector('.fetch-links-result').style.display = 'none';
                    }
                    this.fetchLinks();
                }
            }).bind(this);
            return s;
        }
    }

    class CDAFolderLinksFetcher extends IterativeLinksFetcher {
        parseFetchedPage(text_html) {
            return dom_parser.parseFromString(text_html, 'text/html');
        }
        getLinksFromParsedPage(parsed_page) {
            return Array.from(parsed_page.getElementsByClassName('link-title-visit')).map(function(e) {
                return e.href;
            });
        }
        getSpecifiedPageNumberURL(source_url, page_number) {
            let result_url = new URL(source_url);
            let result_path = result_url.pathname;
            let last_slash = result_path.lastIndexOf('/');
            if ((/vfilm/).test(result_path.slice(last_slash))) {
                result_path += '/' + String(page_number);
            } else {
                if ((/folder/).test(result_path.slice(result_path.lastIndexOf('/', last_slash - 1)))) {
                    result_path += '/' + String(page_number);
                } else {
                    result_path = result_path.slice(0, last_slash + 1) + String(page_number);
                }
            }
            result_url.pathname = result_path;
            return result_url.toString();
        }
        createButton(name = 'Pobierz linki') {
            let s = super.createButton(name);
            s.onclick = (function() {
                if (!this.isBusy()) {
                    if (document.querySelector('.fetch-links-result').innerHTML.length !== 0) {
                        document.querySelector('.fetch-links-result').innerHTML = '';
                        document.querySelector('.fetch-links-result').style.display = 'none';
                    }
                    this.fetchLinks();
                }
            }).bind(this);
            return s;
        }
    }

    class VimeoSearchLinksFetcher extends IterativeLinksFetcher {
        parseFetchedPage(text_html) {
            return JSON.parse(text_html.match(/var data \= (.+?);\n/)[1]);
        }
        getLinksFromParsedPage(parsed_page) {
            return parsed_page.filtered.data.map(function(e) {
                return e.clip.link;
            });
        }
        getSpecifiedPageNumberURL(source_url, page_number) {
            let result_url = new URL(source_url);
            let result_params = result_url.searchParams;
            result_params.set('page', page_number);
            result_url.search = result_params.toString();
            return result_url.toString();
        }
        createButton(name = 'Pobierz linki') {
            let s = super.createButton(name);
            s.style.color = '#456';
            s.style.backgroundColor = '#efe';
            s.onclick = (function() {
                if (!this.isBusy()) {
                    if (document.querySelector('.fetch-links-result').innerHTML.length !== 0) {
                        document.querySelector('.fetch-links-result').innerHTML = '';
                        document.querySelector('.fetch-links-result').style.display = 'none';
                    }
                    this.fetchLinks();
                }
            }).bind(this);
            return s;
        }
    }


    if ((/vimeo\.com\/search/).test(location.href)) { //Vimeo search
        if (document.getElementsByClassName('fetch-links-button').length === 0 && document.getElementsByClassName('iris_link-box').length > 0) {
            let parent_div = document.querySelector('.header_region');
            if (parent_div !== null) {
                let result_div = document.createElement('div');
                result_div.className = 'fetch-links-result';
                result_div.style.border = '2px solid gray';
                result_div.style.borderRadius = '5px';
                result_div.style.padding = '5px';
                result_div.style.margin = '10px';
                result_div.fontFamily = 'monospace';
                result_div.style.display = 'none';
                parent_div.appendChild(result_div);

                let input_div = document.createElement('div');
                parent_div.insertBefore(input_div, result_div);
                let links_getter = new VimeoSearchLinksFetcher(location.href, function(links) {
                    result_div.innerHTML = links.join(' ');
                    result_div.style.display = 'block';
                });
                input_div.appendChild(links_getter.createButton());
                let pagination_data = JSON.parse(document.documentElement.outerHTML.match(/var data \= (.+?);\n/)[1]).filtered.paging;
                let page_numbers = {
                    min: (new URLSearchParams(pagination_data.first)).get('page'),
                    max: (new URLSearchParams(pagination_data.last)).get('page')
                };
                let min_page = document.createElement('input');
                min_page.className = 'fetch-links-settings minimum';
                min_page.type = 'number';
                min_page.min = page_numbers.min;
                min_page.max = page_numbers.max;
                min_page.value = page_numbers.min;
                input_div.appendChild(min_page);
                let max_page = document.createElement('input');
                max_page.className = 'fetch-links-settings maximum';
                max_page.type = 'number';
                max_page.min = page_numbers.min;
                max_page.max = page_numbers.max;
                max_page.value = page_numbers.max;
                input_div.appendChild(max_page);
            }
        }
    } else if ((/cda\.pl\/.+\/folder/).test(location.href)) { //cda folder
        if (document.getElementsByClassName('fetch-links-button').length === 0 && document.getElementsByClassName('link-title-visit').length > 0) {
            let parent_div = document.querySelector('#folder-replace .panel-body');
            if (parent_div !== null) {
                let result_div = document.createElement('div');
                result_div.className = 'fetch-links-result';
                result_div.style.border = '2px solid gray';
                result_div.style.borderRadius = '5px';
                result_div.style.padding = '5px';
                result_div.style.margin = '10px';
                result_div.style.backgroundColor = 'black';
                result_div.fontFamily = 'monospace';
                result_div.style.display = 'none';
                parent_div.insertBefore(result_div, parent_div.children[1]);

                let input_div = document.createElement('div');
                parent_div.insertBefore(input_div, result_div);
                let links_getter = new CDAFolderLinksFetcher(location.href, function(links) {
                    result_div.innerHTML = links.join(' ');
                    result_div.style.display = 'block';
                });
                input_div.appendChild(links_getter.createButton());
                let pagination_data;
                if (location.href.indexOf('folder-glowny') === -1) {
                    pagination_data = document.querySelector('#navigation_foldery .active .item-file').innerHTML;
                } else {
                    pagination_data = document.querySelector('#navigation_foldery a[href*="glowny"] .item-file').innerHTML;
                }
                let page_numbers = {
                    min: 1,
                    max: Math.ceil(Number(pagination_data.match(/\d+/)[0]) / 36)
                };
                let input_style = document.createElement('style');
                input_style.innerHTML = '\
                    .fetch-links-settings {\
                        background-color: transparent;\
                        text-align: right;\
                        padding: 2px;\
                        font-weight: bold;\
                        border: 2px solid gray;\
                    }';
                input_div.appendChild(input_style);
                let min_page = document.createElement('input');
                min_page.className = 'fetch-links-settings minimum';
                min_page.type = 'number';
                min_page.min = page_numbers.min;
                min_page.max = page_numbers.max;
                min_page.value = page_numbers.min;
                input_div.appendChild(min_page);
                let max_page = document.createElement('input');
                max_page.className = 'fetch-links-settings maximum';
                max_page.type = 'number';
                max_page.min = page_numbers.min;
                max_page.max = page_numbers.max;
                max_page.value = page_numbers.max;
                input_div.appendChild(max_page);
            }
        }
    } else if ((/cda\.pl\/info\/.+/).test(location.href)) { //cda general search
        if (document.getElementsByClassName('fetch-links-button').length === 0 && document.querySelectorAll('.text-video > .link-title-visit').length > 0) {
            let sought_phrase = location.href.match(/cda\.pl\/info\/(.+)\?section\=video/)[1];
            if (sought_phrase === null || sought_phrase === undefined) {
                throw new Error('Error getting the sought phrase from link');
            }
            let video_search_link = 'https://www.cda.pl/video/show/' + sought_phrase;

            let parent_div = document.querySelector('.nogry.nogiwera.nodownload.video .bttn-grp-const-width-md');
            if (parent_div !== null) {
                let intermediate_div = document.createElement('div');
                intermediate_div.style.margin = '10px 0 2px 0';
                intermediate_div.style.textAlign = 'left';
                parent_div.insertBefore(intermediate_div, parent_div.children[1]);

                let result_div = document.createElement('div');
                result_div.className = 'fetch-links-result';
                result_div.style.border = '2px solid gray';
                result_div.style.borderRadius = '5px';
                result_div.style.padding = '5px';
                result_div.style.margin = '10px';
                result_div.style.backgroundColor = 'black';
                result_div.fontFamily = 'monospace';
                result_div.style.display = 'none';
                result_div.style.textAlign = 'left';
                parent_div.appendChild(result_div);

                let input_div = document.createElement('div');
                intermediate_div.appendChild(input_div);
                let links_getter = new CDASearchLinksFetcher(video_search_link, function(links) {
                    result_div.innerHTML = links.join(' ');
                    result_div.style.display = 'block';
                });
                input_div.appendChild(links_getter.createButton());
                let pagination_data = document.querySelector('#mVid > a').innerHTML;
                let page_numbers = {
                    min: 1,
                    max: Math.ceil(Number(pagination_data.match(/\d+/)[0]) / 24)
                };
                if (page_numbers.max > 55) {
                    page_numbers.max = 55;
                }
                let input_style = document.createElement('style');
                input_style.innerHTML = '\
                    .fetch-links-settings {\
                        background-color: transparent;\
                        text-align: right;\
                        padding: 2px;\
                        font-weight: bold;\
                        border: 2px solid gray;\
                    }';
                input_div.appendChild(input_style);
                let min_page = document.createElement('input');
                min_page.className = 'fetch-links-settings minimum';
                min_page.type = 'number';
                min_page.min = page_numbers.min;
                min_page.max = page_numbers.max;
                min_page.value = page_numbers.min;
                input_div.appendChild(min_page);
                let max_page = document.createElement('input');
                max_page.className = 'fetch-links-settings maximum';
                max_page.type = 'number';
                max_page.min = page_numbers.min;
                max_page.max = page_numbers.max;
                max_page.value = page_numbers.max;
                input_div.appendChild(max_page);
            }
        }
    } else if ((/cda\.pl\/video\/show/).test(location.href)) { //cda video search
        if (document.getElementsByClassName('fetch-links-button').length === 0 && document.querySelectorAll('.text-video > .link-title-visit').length > 0) {
            let parent_div = document.querySelector('.bttn-grp-const-width-md');
            if (parent_div !== null) {
                let intermediate_div = document.createElement('div');
                intermediate_div.style.margin = '10px 0 2px 0';
                intermediate_div.style.textAlign = 'left';
                parent_div.insertBefore(intermediate_div, parent_div.children[1]);

                let result_div = document.createElement('div');
                result_div.className = 'fetch-links-result';
                result_div.style.border = '2px solid gray';
                result_div.style.borderRadius = '5px';
                result_div.style.padding = '5px';
                result_div.style.margin = '10px';
                result_div.style.backgroundColor = 'black';
                result_div.fontFamily = 'monospace';
                result_div.style.display = 'none';
                result_div.style.textAlign = 'left';
                parent_div.appendChild(result_div);

                let input_div = document.createElement('div');
                intermediate_div.appendChild(input_div);
                let links_getter = new CDASearchLinksFetcher(location.href, function(links) {
                    result_div.innerHTML = links.join(' ');
                    result_div.style.display = 'block';
                });
                input_div.appendChild(links_getter.createButton());
                let pagination_data = document.querySelector('#gora > h2').innerHTML;
                let page_numbers = {
                    min: 1,
                    max: Math.ceil(Number(pagination_data.match(/\d+/)[0]) / 24)
                };
                if (page_numbers.max > 55) {
                    page_numbers.max = 55;
                }
                let input_style = document.createElement('style');
                input_style.innerHTML = '\
                    .fetch-links-settings {\
                        background-color: transparent;\
                        text-align: right;\
                        padding: 2px;\
                        font-weight: bold;\
                        border: 2px solid gray;\
                    }';
                input_div.appendChild(input_style);
                let min_page = document.createElement('input');
                min_page.className = 'fetch-links-settings minimum';
                min_page.type = 'number';
                min_page.min = page_numbers.min;
                min_page.max = page_numbers.max;
                min_page.value = page_numbers.min;
                input_div.appendChild(min_page);
                let max_page = document.createElement('input');
                max_page.className = 'fetch-links-settings maximum';
                max_page.type = 'number';
                max_page.min = page_numbers.min;
                max_page.max = page_numbers.max;
                max_page.value = page_numbers.max;
                input_div.appendChild(max_page);
            }
        }
    }

})();