Advertisement
Danny_Berova

YTTranscriptVers1

Oct 5th, 2019
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var captions = function getCaptions(period) {
  2.     return new Promise((resolve, reject) => {
  3.         var maxTime = 3000;
  4.         var addTime = 0;
  5.         var inputLanguage = 'russian';
  6.         var searchedLanguage = inputLanguage ? inputLanguage : 'english';
  7.         var options = '';
  8.  
  9.         var el = document.evaluate(".//*[@aria-label='More actions']", document, null, 9, null).singleNodeValue;
  10.  
  11.         try {
  12.  
  13.             var scroll = setInterval(function () {
  14.                 if (addTime >= maxTime) {
  15.                     clearInterval(scroll);
  16.                     resolve(el);
  17.                 }
  18.                 el = document.evaluate(".//*[@aria-label='More actions']", document, null, 9, null).singleNodeValue;
  19.  
  20.                 if (el) {
  21.                     addTime = 0;
  22.                     clearInterval(scroll);
  23.                     el.click()
  24.  
  25.                     var elOpenTranscript = document.evaluate(".//*[text()='Open transcript']", document, null, 9, null).singleNodeValue;
  26.                     if (elOpenTranscript) {
  27.  
  28.                         elOpenTranscript.click();
  29.                         console.log('Transcript available')
  30.  
  31.                         var elTranscriptDropDown = document.evaluate(".//ytd-transcript-footer-renderer//paper-button", document, null, 9, null).singleNodeValue;
  32.                        
  33.                         if (elTranscriptDropDown) {
  34.                             elTranscriptDropDown.click();
  35.                             var elTranscriptOptions = document.evaluate(".//div[@id='secondary']//paper-listbox[@id='menu']/a[//paper-item-body/div[text()]]", document, null, 7, null);
  36.                             console.log('snapshot length: ' + elTranscriptOptions.snapshotLength);
  37.  
  38.                             var languages = [];
  39.                             for (let i = 0; i < elTranscriptOptions.snapshotLength; i++) {
  40.                                 const element = elTranscriptOptions.snapshotItem(i);
  41.                                 var currLanguage = element.textContent.trim();
  42.                                 languages.push(currLanguage);
  43.  
  44.                             }
  45.                             console.log(languages)
  46.                             var filtered = languages.filter(l => l.toLowerCase().includes(searchedLanguage));
  47.  
  48.                             if (filtered.length === 0) {
  49.                                 filtered = languages.filter(l => l.toLowerCase().includes('english'));
  50.                                 console.log(filtered);
  51.                                 if (filtered.length > 0) {
  52.                                     options = {
  53.                                         language: 'default',
  54.                                         languages: elTranscriptOptions
  55.                                     }
  56.                                     console.log(`Searched language (${searchedLanguage}) captions not found. Default (English) available.`)
  57.                                     resolve(options)
  58.                                 } else {
  59.                                     resolve('No captions for searched or default language!')
  60.  
  61.                                 }
  62.                             } else {
  63.                                 options = {
  64.                                     language: 'input',
  65.                                     languages: elTranscriptOptions
  66.                                 }
  67.                                 resolve(options)
  68.                             }
  69.                             resolve(elTranscriptOptions)
  70.  
  71.                         } else {
  72.                             console.log('Transcript dropdown menu cannot be open')
  73.                         }
  74.  
  75.                         resolve(elOpenTranscript);
  76.  
  77.                     } else {
  78.                         clearInterval(scroll);
  79.                         console.log('Open Transcript not available')
  80.                         resolve('Transcript not available.');
  81.                     }
  82.                 } else {
  83.                     addTime += 1000;
  84.                     console.log('adding 1000 ms')
  85.                 }
  86.             }, period)
  87.         } catch (error) {
  88.             console.log(error)
  89.         }
  90.  
  91.     })
  92. }
  93.  
  94. function saveCaptions(captionsObj) {
  95.     var subs = '';
  96.     if (typeof captionsObj === "string") {
  97.         console.log('CAPTIONS NOT AVAILABLE')
  98.         return;
  99.     } else {
  100.         var inputLanguage = 'russian';
  101.         var searchedLanguage = inputLanguage ? inputLanguage : 'english';
  102.         const language = captionsObj.language;
  103.         var captions = captionsObj.languages;
  104.         subs = [];
  105.         console.log(captions.snapshotLength)
  106.  
  107.         if (captions.snapshotLength > 0) {
  108.             for (let i = 0; i < captions.snapshotLength; i++) {
  109.  
  110.                 const element = captions.snapshotItem(i);
  111.                 console.log(element)
  112.  
  113.                 var currLanguage = element.textContent.trim();
  114.                 console.log(currLanguage)
  115.  
  116.                 if ((currLanguage.toLowerCase().includes(searchedLanguage) && language === 'input') || (currLanguage.toLowerCase().includes('english') && language === 'default')) {
  117.                     element.click();
  118.                     setTimeout(() => {
  119.                         var elSubs = document.evaluate(".//div[@id='secondary']//div[@id='content']//div[contains(@class, 'cue-group')]/div", document, null, 7, null);
  120.  
  121.                         if (elSubs.snapshotLength > 0) {
  122.                             for (let j = 0; j < elSubs.snapshotLength; j++) {
  123.                                 const row = elSubs.snapshotItem(j);
  124.                                 subs.push(row.textContent.trim().replace(/\n/, ' '))
  125.                                 //console.log(row.textContent.trim());
  126.                             }
  127.                         }
  128.                         console.log(subs)
  129.  
  130.                     }, 500)
  131.                     break;
  132.  
  133.  
  134.                 } else {
  135.                     'No captions for searched language or English(default)!'
  136.                 }
  137.             }
  138.         } else {
  139.             console.log('Cannot find subs rows!')
  140.         }
  141.     }
  142.  
  143. }
  144.  
  145. captions(1000)
  146.     .then(res => saveCaptions(res))
  147.     .catch(er => console.log(er))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement