• 0 Posts
  • 6 Comments
Joined 2 years ago
cake
Cake day: July 3rd, 2023

help-circle


  • I wrote myself a Chrome add-on that adds a context menu entry to play or download links.

    background.js
    chrome.runtime.onInstalled.addListener(() => {
    		
        chrome.contextMenus.create({
            id: "processLink",
            title: "Download as...",
            contexts: ["link"]
        });
    
        chrome.contextMenus.create({
            id: "720p",
            parentId: "processLink",
            title: "720p",
            contexts: ["link"]
        });
    
        chrome.contextMenus.create({
            id: "music",
            parentId: "processLink",
            title: "MP3",
            contexts: ["link"]
        });
    
        chrome.contextMenus.create({
            id: "maxQual",
            parentId: "processLink",
            title: "Maximum quality video",
            contexts: ["link"]
        });
    	
        chrome.contextMenus.create({
            id: "separator1",
            parentId: "processLink",
            type: "separator",
            contexts: ["link"]
        });
    
        chrome.contextMenus.create({
            id: "piQual",
            parentId: "processLink",
            title: "30 fps for RPi",
            contexts: ["link"]
        });
    	
        chrome.contextMenus.create({
            id: "separator2",
            parentId: "processLink",
            type: "separator",
            contexts: ["link"]
        });
    	
        chrome.contextMenus.create({
            id: "streamLink",
            parentId: "processLink",
            title: "Stream to VLC...",
            contexts: ["link"]
        });
    });
    
    chrome.contextMenus.onClicked.addListener((info, tab) => {
        let linkUrl = info.linkUrl;
    
        if (info.menuItemId === "720p") {
            sendLinkToNativeApp(linkUrl, "video720");
        } else if (info.menuItemId === "music") {
            sendLinkToNativeApp(linkUrl, "music");
        } else if (info.menuItemId === "maxQual") {
            sendLinkToNativeApp(linkUrl, "videomp4");
        } else if (info.menuItemId === "piQual") {
            sendLinkToNativeApp(linkUrl, "video720p30");
        } else if (info.menuItemId === "streamLink") {
            sendLinkToNativeApp(linkUrl, "stream");
        }
    });
    
    function sendLinkToNativeApp(link, action) {
        console.log("Sending link to native app with action:", action, link);
        chrome.runtime.sendNativeMessage(
            'com.example.ytlink_processor',
            { link: link, action: action },
            function(response) {
                if (chrome.runtime.lastError) {
                    console.error("Error:", chrome.runtime.lastError.message);
                } else {
                    console.log("Received response from native app:", response.output);
                }
            }
        );
    }
    
    native_host.py (chatGPT wrote this because I can't Python)
    import sys
    import subprocess
    import json
    import struct
    
    def log_to_file(message):
        with open("log.txt", "a") as log_file:
            log_file.write(message + "\n")
    
    def get_message():
        raw_length = sys.stdin.read(4)
        if len(raw_length) == 0:
            sys.exit(0)
        message_length = struct.unpack('I', raw_length)[0]
        message = sys.stdin.read(message_length)
        return json.loads(message)
    
    def send_message(message_content):
        message = json.dumps(message_content)
        sys.stdout.write(struct.pack('I', len(message)))
        sys.stdout.write(message)
        sys.stdout.flush()
    
    def process_link(link, action):
        if action == "stream":
            cmd = 'yt-dlp --stream "{}" -o - | "D:/Programme/VLC/vlc.exe" -'.format(link)
        else:
            cmd = 'yt-dlp --{} "{}"'.format(action, link)
        result = subprocess.Popen('start cmd /c "{}"'.format(cmd), shell=True)
        return result.stdout + result.stderr
    
    if __name__ == "__main__":
        message = get_message()
        link = message.get("link")
        action = message.get("action")
        if link and action:
            output = process_link(link, action)
            send_message({"output": output})
    
    

    The actions are just aliases for different qualities (old pi, so 720p60 stutters at times), audio extraction, etc.