Greasy Fork is available in English.
Add 3 Buttons to download Video,audio,loop when click button you can open it in new tab by click mouse button or right click selet open in new tab to preview.
// ==UserScript== // @name ⚙️Coub Downloading // @namespace Wizzergod // @version 1.0.3 // @description Add 3 Buttons to download Video,audio,loop when click button you can open it in new tab by click mouse button or right click selet open in new tab to preview. // @icon https://www.google.com/s2/favicons?sz=64&domain=coub.com // @author Wizzergod // @license MIT // @match *://*.coub.com/* // @match *://coub.com/* // @grant GM_download // ==/UserScript== (function () { 'use strict'; function addButton(container, text, url) { const button = document.createElement('a'); button.innerText = text; button.classList.add('coubdl-button'); button.href = url; button.addEventListener('click', function (event) { event.preventDefault(); downloadFile(url, getFileNameFromUrl(url)); }); container.appendChild(button); } function downloadFile(url, fileName) { GM_download( { url: url, name: fileName }); } function getFileNameFromUrl(url) { const matches = url.match(/\/([^\/?#]+)[^\/]*$/); return matches && matches[1]; } function addControls() { const coubContainers = document.querySelectorAll('.coub'); coubContainers.forEach(container => { const permalink = container.dataset.permalink; if (!permalink) { return; } const descriptionControls = container.querySelector('.coub__description'); if (!descriptionControls) { return; } const existingControls = container.querySelector('.coubdl-button-group'); if (existingControls) { return; } const controlsContainer = document.createElement("div"); controlsContainer.classList.add("coubdl-button-group"); const dataContainer = container.querySelector( '.data script[type="text/json"]' ); if (dataContainer) { const data = JSON.parse(dataContainer.textContent); if (data && data.file_versions && data.file_versions.html5) { const html5Data = data.file_versions.html5; if ( html5Data.video && html5Data.video.high && html5Data.video.high.url ) { const videoUrl = html5Data.video.high.url; addButton(controlsContainer, "⬇️ Video", videoUrl); } if ( html5Data.audio && html5Data.audio.high && html5Data.audio.high.url ) { const audioUrl = html5Data.audio.high.url; addButton(controlsContainer, "⬇️ Audio", audioUrl); } } if ( data && data.file_versions && data.file_versions.share && data.file_versions.share.default ) { const loopedUrl = data.file_versions.share.default; addButton(controlsContainer, "⬇️ Looped Video", loopedUrl); } } descriptionControls.prepend(controlsContainer); }); } function observeChanges() { const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { Array.from(mutation.addedNodes).forEach((node) => { if (node.nodeType === Node.ELEMENT_NODE) { addControls(); } }); }); }); observer.observe(document.body, { childList: true, subtree: true, }); } function init() { addControls(); observeChanges(); } // Add CSS styles const style = document.createElement('style'); style.textContent = ` .coubdl-button-group { display: flex; flex-direction: row; justify-content: center; gap: 10px; margin-top: 10px; width: 100%; position: relative; } .coubdl-button { padding: 4px 8px; color: #000; background: #fff0; line-height: 1; border-radius: 0px; text-decoration: none; border: none; display: inline-block; transition: background-color 0.3s ease; } .coubdl-button:hover, .coubdl-button:active, .coubdl-button:focus { color: #0332FF; } `; document.head.appendChild(style); init(); })();