Youtube MP3 download button → ytmp3 (auto-download) - (by SuchtiOnTour)

在「分享」旁新增下載按鈕,並透過 ytmp3.la 自動下載 MP3

// ==UserScript==
// @name            Youtube MP3 download button → ytmp3 (auto-download) - (by SuchtiOnTour)
// @name:de         Youtube MP3 download button → ytmp3 (Auto-Download) - (by SuchtiOnTour)
// @namespace       Violentmonkey Scripts
// @version         1.6.0
// @author          SuchtiOnTour
// @license         MIT
// @match           https://www.youtube.com/watch*
// @match           https://*.youtube.com/*
// @match           https://ytmp3.la/*
// @match           https://ytmp3.as/*
// @grant           GM_addStyle
// @run-at          document-idle
// @description     Adds a Download button next to the Share button and auto-downloads the MP3 via ytmp3.la
// @description:pt-BR Adiciona um botão Download ao lado de Compartilhar e baixa MP3 automaticamente pelo ytmp3.la
// @description:ar  يضيف زر تنزيل بجوار زر المشاركة ويُحمّل ملف MP3 تلقائياً عبر ytmp3.la
// @description:bg  Добавя бутон „Сваляне“ до бутона „Сподели“ и автоматично сваля MP3 чрез ytmp3.la
// @description:cs  Přidá tlačítko Stáhnout vedle tlačítka Sdílet a automaticky stáhne MP3 přes ytmp3.la
// @description:da  Tilføjer en Download-knap ved siden af Del og downloader automatisk MP3 via ytmp3.la
// @description:de  Fügt rechts neben „Teilen“ einen Download-Button ein und lädt die MP3 über ytmp3.la automatisch herunter
// @description:el  Προσθέτει κουμπί Λήψη δίπλα στο κουμπί Κοινοποίηση και κατεβάζει αυτόματα το MP3 μέσω ytmp3.la
// @description:eo  Aldonas elŝutan butonon apud la butono Kunhavigi kaj aŭtomate elŝutas MP3 per ytmp3.la
// @description:es  Añade un botón Descargar junto al botón Compartir y descarga automáticamente el MP3 vía ytmp3.la
// @description:fi  Lisää Lataa-painikkeen Jaa-painikkeen viereen ja lataa MP3-tiedoston automaattisesti ytmp3.la-palvelusta
// @description:fr  Ajoute un bouton Télécharger à côté de Partager et lance automatiquement le téléchargement MP3 via ytmp3.la
// @description:fr-CA Ajoute un bouton Télécharger à côté de Partager et télécharge automatiquement le MP3 via ytmp3.la
// @description:he  מוסיף כפתור הורדה ליד כפתור השיתוף ומוריד אוטומטית את ה-MP3 דרך ytmp3.la
// @description:hu  Letöltés gombot ad a Megosztás gomb mellé, és automatikusan letölti az MP3-at a ytmp3.la-n
// @description:id  Menambahkan tombol Download di samping tombol Bagikan dan otomatis mengunduh MP3 via ytmp3.la
// @description:it  Aggiunge un pulsante Download accanto al pulsante Condividi e scarica automaticamente l’MP3 tramite ytmp3.la
// @description:ja  共有ボタンの横にダウンロードボタンを追加し、ytmp3.laで自動的にMP3をダウンロードします
// @description:ko  공유 버튼 옆에 다운로드 버튼을 추가하고 ytmp3.la를 통해 MP3를 자동으로 다운로드합니다
// @description:nb  Legger til en Last ned-knapp ved siden av Del og laster automatisk ned MP3 via ytmp3.la
// @description:nl  Voegt een Download-knop naast Delen toe en downloadt automatisch de MP3 via ytmp3.la
// @description:pl  Dodaje przycisk Pobierz obok przycisku Udostępnij i automatycznie pobiera MP3 przez ytmp3.la
// @description:ro  Adaugă un buton Download lângă butonul Distribuie și descarcă automat MP3-ul prin ytmp3.la
// @description:ru  Добавляет кнопку «Скачать» рядом с кнопкой «Поделиться» и автоматически скачивает MP3 через ytmp3.la
// @description:sk  Pridá tlačidlo Stiahnuť vedľa tlačidla Zdieľať a automaticky stiahne MP3 cez ytmp3.la
// @description:sr  Додаје дугме Преузми поред дугмета Подели и аутоматски преузима MP3 преко ytmp3.la
// @description:sv  Lägger till en Hämta-knapp bredvid Dela och hämtar automatiskt MP3 via ytmp3.la
// @description:th  เพิ่มปุ่มดาวน์โหลดถัดจากปุ่ม แชร์ และดาวน์โหลด MP3 อัตโนมัติผ่าน ytmp3.la
// @description:tr  Paylaş düğmesinin yanına İndir düğmesi ekler ve MP3’ü ytmp3.la ile otomatik olarak indirir
// @description:uk  Додає кнопку «Завантажити» поруч із кнопкою «Поділитися» та автоматично завантажує MP3 через ytmp3.la
// @description:ug  «ھەمبەھىرلەش» توپچىقىنىڭ يېنىغا چۈشۈرۈش كۇنۇپكىسى قوشۇپ، ytmp3.la ئارقىلىق MP3 نى ئاپتوماتىك چۈشۈرىدۇ
// @description:vi  Thêm nút Tải xuống bên cạnh nút Chia sẻ và tự động tải MP3 qua ytmp3.la
// @description:zh-CN 在“分享”旁添加下载按钮,并通过 ytmp3.la 自动下载 MP3
// @description:zh-TW 在「分享」旁新增下載按鈕,並透過 ytmp3.la 自動下載 MP3
// ==/UserScript==



(() => {
/* ---------- YouTube: einfacher <a>-Button RECHTS von „Teilen“ ---------- */
if (location.host.includes('youtube.com')) {
  const API    = location.host.startsWith('ytmp3.') ? `https://${location.host}/#` : 'https://ytmp3.as/#';
  const BTN_ID = 'dwnldBtn';

  // Styling: gleiche Pill-Optik, mit Abstand zu Share & YouTube-Download
  try {
    GM_addStyle(`
      #${BTN_ID}{
        background:#0F0F0F;color:#FFF;border:1px solid rgba(255,255,255,.25);
        margin-left:8px; margin-right:8px; /* Abstand links & rechts */
        padding:0 16px;border-radius:18px;
        font:500 14px/normal Roboto,Noto,sans-serif;display:inline-flex;align-items:center;
        height:36px;text-decoration:none;white-space:nowrap;flex:0 0 auto;
        position:relative; z-index:1; pointer-events:auto; cursor:pointer;
      }
      #${BTN_ID}:hover{background:#3F3F3F;border-color:#3F3F3F}
    `);
  } catch {}

  const getVid  = () =>
    ((/v=([\w-]{11})|shorts\/([\w-]{11})/i.exec(location.href)||[]).slice(1).find(Boolean)) || '';
  const makeUrl = () => API + getVid() + '/mp3';

  // Aktionsleiste finden (YT testet mehrere Varianten)
  const findActions = () => {
    const sels = [
      'ytd-watch-metadata #actions-inner #top-level-buttons-computed',
      'ytd-watch-metadata #top-level-buttons-computed',
      'ytd-watch-metadata #actions-inner #actions',
      'ytd-watch-metadata #actions',
      '#actions-inner #top-level-buttons-computed',
      '#actions-inner #actions',
      '#top-level-buttons-computed',
      '#actions'
    ];
    for (const s of sels) {
      const el = document.querySelector(s);
      if (el) return el;
    }
    return null;
  };

  // „Teilen“ finden (Text, aria-label oder Share-Icon)
  const findShare = (actions) => {
    if (!actions) return null;
    const nodes = [...actions.querySelectorAll('ytd-button-renderer,button,a,yt-button-shape')];
    return nodes.find(n => {
      const t = (n.textContent || '').toLowerCase();
      const aria = (n.getAttribute?.('aria-label') || '').toLowerCase();
      const hasIcon = n.querySelector?.('yt-icon[icon="share"]');
      return /teilen|share/.test(t) || /teilen|share/.test(aria) || hasIcon;
    }) || null;
  };

  function placeOnce(){
    if (!location.pathname.startsWith('/watch')) return false;

    const actions = findActions();
    if (!actions) return false;

    const share = findShare(actions);
    if (!share) return false;

    // Duplikate wegräumen (nur 1 Button)
    const dups = [...document.querySelectorAll(`#${BTN_ID}`)];
    if (dups.length > 1) dups.slice(1).forEach(n=>n.remove());

    // Button holen/erstellen
    let a = document.getElementById(BTN_ID);
    if (!a) {
      a = document.createElement('a');
      a.id = BTN_ID;
      a.textContent = 'Download';
      a.target = '_blank';
      a.rel = 'noopener';
      // Fallback, falls irgend ein Overlay Klicks frisst
      a.addEventListener('click', (e)=>{
        const href = a.getAttribute('href');
        if (!href) { e.preventDefault(); window.open(makeUrl(), '_blank', 'noopener'); }
      }, true);
    }
    a.href = makeUrl();

    // Rechts von „Teilen“ einsetzen
    if (share.nextElementSibling !== a) {
      share.insertAdjacentElement('afterend', a);
    }
    return true;
  }

  // leichte Retry-Logik (max. ~5s), keinerlei schwere Observer
  function init(){
    let tries = 0;
    const tick = () => {
      const ok = placeOnce();
      tries++;
      if (!ok && tries < 20) setTimeout(tick, 250);
    };
    tick();
  }

  // initial + bei Navigation in der YouTube-SPA
  init();
  window.addEventListener('yt-navigate-finish', init);
  window.addEventListener('yt-page-data-updated', init);
}

/* ---------- ytmp3.*: Auto-Download auslösen ---------- */
if (location.host.startsWith('ytmp3.')) {
  const isDl = el=>{
    if(!el) return false;
    const t = (el.textContent || '').trim().toLowerCase();
    return t === 'download' || t.startsWith('download ');
  };
  const click = ()=>{
    const el = [...document.querySelectorAll('a,button')].find(isDl);
    if (el) { el.click(); console.log('[YTMP3] Download-Button geklickt'); }
    else    setTimeout(click, 400);
  };
  setTimeout(click, 200);
}
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址