Many YT privacy frontends are down it seems. YouTube is cracking down on these servers fast. Both Invidious and Piped services are not working now.

So how are you watching videos now? Just plain youtube[dot]com with unblock and VPN?

  • corvus@lemmy.ml
    link
    fedilink
    arrow-up
    1
    ·
    edit-2
    5 days ago

    Another thing that I do is make an alias: alias pvid=“yt-dlp $(xsel -b) -o - | mpv -”. Install xsel first, xsel -b pastes what’s in the clipboard. So you only have to copy the URL and execute pvid, no need to paste. Or even better make an app that executes that command and put it in the taskbar. You only have to click it after copying.

    • Karyoplasma
      link
      fedilink
      arrow-up
      2
      ·
      edit-2
      4 days ago

      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.