मेरे पास यह कोड है, यह एक बुकमार्कलेट है:

javascript:(function(e,a,g,h,f,c,b,d){if(!(f=e.jQuery)||g>f.fn.jquery||h(f)){c=a.createElement("script");c.type="text/javascript";c.src="cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js";c.onload=c.onreadystatechange=function(){if(!b&&(!(d=this.readyState)||d=="loaded"||d=="complete")){h((f=e.jQuery).noConflict(1),b=1);f(c).remove()}};a.documentElement.childNodes[0].appendChild(c)}})(window,document,"3.4.1",function($,L){var url1 = "download-video-youtube1.p.rapidapi.com/mp3/";var url2 = window.location.href.substring(32);var url3 = url1 + url2;var settings = { "url": url3 , "method": "GET", "headers": {"x-rapidapi-host": "download-video-youtube1.p.rapidapi.com","x-rapidapi-key": "[my apikey here]" } }; $.ajax(settings).done(function(response){ window.location.href = "https://" + response.vidInfo[0].dloadUrl;});});

यह फ़ायरफ़ॉक्स और क्रोम पर बहुत अच्छा काम करता है लेकिन आईओएस सफारी या आईओएस शॉर्टकट या एंड्रॉइड पर क्रोम के साथ काम करने का कोई तरीका नहीं है।

यह जाँचता है कि क्या jQuery का कोई विशिष्ट संस्करण है, यदि नहीं तो यह इसे DOM में जोड़ता है और वे एक एपीआई अनुरोध चलाते हैं और youtube के किसी भी वीडियो का Mp3 डाउनलोड लिंक लौटाते हैं।

यह मेरा तीसरा और आखिरी सवाल है क्योंकि मुझे अब तक कोई जवाब नहीं मिला है। मुझे पता है कि मैं इस बार भी नहीं जाऊँगा, कोई बात नहीं मैं इसे यहाँ एक डायरी के रूप में रखता हूँ।

अलविदा

1
Franco Polato 16 फरवरी 2020, 23:39

1 उत्तर

सुनिश्चित नहीं है कि समस्या क्या हो सकती है, कोड ठीक दिखता है (जैसा कि मैंने रिवर्स-इंजीनियर किया है)। यदि आपने बुकमार्कलेट बनाया है, तो कृपया पूर्ण स्रोत कोड शामिल करें।

  • हो सकता है कि आपको स्क्रिप्ट url में प्रोटोकॉल शामिल करने की आवश्यकता हो?
  • साथ ही, सुनिश्चित करें कि jQuery का संस्करण आपके सफारी/एंड्रॉइड ब्राउज़र के साथ संगत है।

नोट: यदि आप चाहें, तो आप jQuery को कूड़ेदान में फेंक सकते हैं और वादों का उपयोग कर सकते हैं। Fetch API पर एक नज़र डालें।

(function() {
  let script = document.createElement("script");
  script.type = "text/javascript";
  script.src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js";
  script.onload = script.onreadystatechange = function(e) {
    $.ajax({
      "url": "download-video-youtube1.p.rapidapi.com/mp3/" + window.location.href.substring(32),
      "method": "GET",
      "headers": {
        "x-rapidapi-host": "download-video-youtube1.p.rapidapi.com",
        "x-rapidapi-key": "[my apikey here]"
      }
    }).done(function(response) {
      window.location.href = "https://" + response.vidInfo[0].dloadUrl;
    });
  };
  document.documentElement.childNodes[0].appendChild(script);
})();

javascript-minifier.com का इस्तेमाल करके फिर से छोटा किया गया:

javascript:!function(){let e=document.createElement("script");e.type="text/javascript",e.src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js",e.onload=e.onreadystatechange=function(e){$.ajax({url:"download-video-youtube1.p.rapidapi.com/mp3/"+window.location.href.substring(32),method:"GET",headers:{"x-rapidapi-host":"download-video-youtube1.p.rapidapi.com","x-rapidapi-key":"[my apikey here]"}}).done(function(e){window.location.href="https://"+e.vidInfo[0].dloadUrl})},document.documentElement.childNodes[0].appendChild(e)}();

फ़ेच एपीआई का उपयोग करना

यह ~ 17% लंबा (मिनीफिकेशन के बाद) है, लेकिन jQuery पर निर्भर नहीं है। इसमें एक YouTube वीडियो आईडी निष्कर्षण फ़ंक्शन भी है, इसलिए यह अधिक मजबूत है।

नीचे दी गई स्क्रिप्ट एक UserScript है जिसका उपयोग Greasemonkey, Tampermonkey, या Violentmonkey के साथ किया जा सकता है।

// ==UserScript==
// @name         YouTube MP3
// @namespace    com.youtube.mp3
// @version      1.0.0
// @description  Parse the YouTube video ID and request the MP3 version.
// @author       Mr. Polywhirl
// @match        https://www.youtube.com/*
// @match        https://youtube.com/*
// @match        https://youtu.be/*
// @grant        GM_log
// ==/UserScript==
(function() {
  'use strict';
  // See: https://stackoverflow.com/a/8260383/1762224
  const ytUrlParser = (url) => {
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
    var match = url.match(regExp);
    return (match && match[7].length == 11) ? match[7] : false;
  }
  const videoId = ytUrlParser(window.location.href);
  if (videoId) {
    const reqUrl = 'download-video-youtube1.p.rapidapi.com/mp3/' + videoId;
    const reqHead = new Headers();
    reqHead.append('x-rapidapi-host', 'download-video-youtube1.p.rapidapi.com');
    reqHead.append('x-rapidapi-key', '[my apikey here]');
    const reqObj = new Request(reqUrl, {
      method: 'GET',
      headers: reqHead,
      mode: 'cors',
      cache: 'default',
    });
    fetch(reqObj)
      .then(function(response) {
        if (!response.ok) { throw Error(response.statusText); }
        return response;
      })
      .then(response => response.vidInfo[0].dloadUrl)
      .then(url => { window.location.href = "https://" + url })
      .catch(error => console.log(error));
  }
})();

छोटा किया हुआ:

javascript:!function(){"use strict";const e=(o=window.location.href,!(!(t=o.match(/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/))||11!=t[7].length)&&t[7]);var o,t;if(e){const o="download-video-youtube1.p.rapidapi.com/mp3/"+e,t=new Headers;t.append("x-rapidapi-host","download-video-youtube1.p.rapidapi.com"),t.append("x-rapidapi-key","[my apikey here]");const a=new Request(o,{method:"GET",headers:t,mode:"cors",cache:"default"});fetch(a).then(function(e){if(!e.ok)throw Error(e.statusText);return e}).then(e=>e.vidInfo[0].dloadUrl).then(e=>{window.location.href="https://"+e}).catch(e=>console.log(e))}}();
0
Mr. Polywhirl 18 फरवरी 2020, 02:52
आपका बहुत बहुत धन्यवाद! मैंने jQuery के न्यूनतम संस्करण का उपयोग करने की कोशिश की और अब यह काम करता है, लेकिन केवल आईओएस सफारी पर ... कोई विचार है कि एंड्रॉइड क्रोम में क्यों नहीं? मैंने jQuery संस्करण 1.8.0 का उपयोग किया है क्या यह संभव है कि क्रोम बहुत पुराना होने पर भी इसका समर्थन नहीं करता है? इसके अलावा स्क्रिप्ट यूआरएल में प्रोटोकॉल जोड़कर आपका क्या मतलब है? मैं भ्रूण विधि का उपयोग करने के आपके सुझाव को ध्यान में रखूंगा, मैं निश्चित रूप से इस मुश्किल चीज से निपटने के बाद इसे एक मौका दूंगा!
 – 
Franco Polato
18 फरवरी 2020, 02:07
लाने का एक उदाहरण जोड़ा गया। यह मूर्खतापूर्ण नहीं हो सकता है, लेकिन मेरे पास परीक्षण करने की कुंजी नहीं है।
 – 
Mr. Polywhirl
18 फरवरी 2020, 02:53
आपका बहुत बहुत धन्यवाद!! मैं वास्तव में आपकी प्रतिबद्धता की सराहना करता हूं! मैं इस विधि को समझने के लिए आपकी लिपि का अध्ययन करने जा रहा हूँ!
 – 
Franco Polato
18 फरवरी 2020, 15:51