FreeTube Button

Add an option to open YouTube videos in FreeTube

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         FreeTube Button
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Add an option to open YouTube videos in FreeTube
// @author       devilrajat
// @match        *://www.youtube.com/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // Function to create and add the FreeTube button
    function addFreeTubeButton(videoLink) {
        // Check if the FreeTube button is already added
        if (videoLink.nextElementSibling && videoLink.nextElementSibling.classList.contains('freetube-button')) {
            return;
        }

        // Create the FreeTube button
        let freeTubeButton = document.createElement('a');
        freeTubeButton.href = 'freetube://' + videoLink.href;
        freeTubeButton.textContent = 'Open in FreeTube';
        freeTubeButton.style.marginLeft = '10px';
        freeTubeButton.style.color = '#ff0000';
        freeTubeButton.classList.add('freetube-button');

        // Insert the button after the video link
        videoLink.parentNode.insertBefore(freeTubeButton, videoLink.nextSibling);
    }

    // Add event listeners to all video links on the home page
    function addListeners() {
        let videoLinks = document.querySelectorAll('a#video-title, a#thumbnail, a[href^="/watch"]');
        videoLinks.forEach(link => {
            addFreeTubeButton(link);
        });
    }

    // Initial run and re-run when new content is loaded dynamically
    new MutationObserver(addListeners).observe(document.body, { childList: true, subtree: true });

    // Initial call to addListeners
    addListeners();
})();