Advertisement
AHOHNMYC

Archive.org comfort audiobook player

May 4th, 2019
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name           Archive.org comfort audiobook player
  3. // @name:ru        Archive.org удобные аудиокниги
  4. // @description    Adds some hotkeys and stop timer
  5. // @description:ru Добавляет горячие клавиши и таймер остановки
  6. // @namespace      archive.org
  7. // @version        0.0.2.3
  8. // @author         AHOHNMYC
  9. // @match          https://archive.org/embed/*
  10. // @match          https://archive.org/details/*
  11. // @grant          none
  12. // @noframes
  13. // ==/UserScript==
  14.  
  15. /* Добавляет кнопку для перехода в Embedded-mode, в который вживлены:
  16.  * * Пробел для Паузы/Прололжения
  17.  * * Поддержка медиа-кнопок (работают только когда вкладка активна)
  18.  * * Ползунок для остановки через определённое количество времени (например, для того чтобы засыпать под книгу :з)
  19.  */
  20.  
  21. const defaultStopValue = 60*30;
  22.  
  23. const lang = {
  24.     en: 'Stop after',
  25.     ru: 'Остановка через',
  26. };
  27.  
  28. const navLng = navigator.language.substr(0,2);
  29. const STOP_AFTER = lang[navLng] ? lang[navLng] : lang.en;
  30. delete lang;
  31. delete navLng;
  32.  
  33. if (/^\/embed/.test(location.pathname)) {
  34.     document.title = document.title.replace(' : Free Download, Borrow, and Streaming : Internet Archive','');
  35.  
  36.     initStopController();
  37.  
  38.     document.body.style.backgroundColor = 'black';
  39.     document.body.style.overflow = 'auto';
  40.     document.body.style.position = 'relative';
  41.     setTimeout(()=>{
  42.         document.querySelector('[aria-label="Cast media with AirPlay / Chromecast"]').style.display = 'none';
  43.         document.querySelector('[aria-label="More Formats from Internet Archive"]').style.display = 'none';
  44.  
  45.         document.getElementById`jw6`.style.position = 'fixed';
  46.         document.getElementById`jw6`.style.zIndex = 1;
  47.         const listStyle = document.getElementById`jw6__list`.style;
  48.         listStyle.height = '';
  49.         listStyle.top = '33px';
  50.         listStyle.position = 'relative';
  51.     }, 500);
  52. } else {
  53.     addEmbedButton();
  54. }
  55.  
  56. function addEmbedButton() {
  57.     const newButtonFrame = document.querySelector('.action-buttons').appendChild(document.createElement('div'));
  58.     newButtonFrame.classList.add('topinblock');
  59.     const newButton = newButtonFrame.appendChild(document.createElement('a'));
  60.     newButton.classList.add('button');
  61.     newButton.dataOriginalTitle = 'Embed';
  62.     newButton.textContent = 'Embed';
  63.     newButton.href = '/embed' + location.pathname.match(/^\/details(\/[^\/]+)/)[1] + '?playlist=true';
  64. }
  65.  
  66. function initStopController() {
  67.     document.addEventListener('keydown', e=>{
  68. //      if (k=='MediaPlayPause' || k==' ') document.querySelector('.jwplay button').click();
  69. //      if (k=='MediaTrackPrevious') document.querySelector('.jwprev button').click();
  70. //      if (k=='MediaTrackNext') document.querySelector('.jwnext button').click();
  71.         const k=e.key;
  72.         if (k=='MediaPlayPause' || k==' ') {
  73.             e.preventDefault();
  74.             const el = document.getElementsByTagName`video`[0];
  75.             el[el.paused ? 'play' : 'pause']();
  76.         }
  77.         if (k=='MediaTrackPrevious' || k=='MediaTrackNext') {
  78.             const currTrackNumber = document.querySelector('.playing .n').textContent -1;
  79.             const maxTrackNumber = document.getElementById`jw6__list`.childElementCount -1;
  80.             if (k=='MediaTrackPrevious') {
  81.                 if (currTrackNumber === 0) return;
  82.                 window.Play('jw6').playN(currTrackNumber -1);
  83.             }
  84.             if (k=='MediaTrackNext') {
  85.                 if (currTrackNumber === maxTrackNumber) return;
  86.                 window.Play('jw6').playN(currTrackNumber +1);
  87.             }
  88.         }
  89.     });
  90.     function addEl(el, newEl) { return el.appendChild(document.createElement(newEl)); }
  91.  
  92.     const mainEl = addEl(document.body, 'div');
  93.     const button = addEl(mainEl, 'button');
  94.     addEl(mainEl, 'br');
  95.     const timer = addEl(mainEl, 'input');
  96.  
  97.     const timerC = {
  98.         state: false,
  99.         start: ()=>{
  100.             this.interval = setInterval(()=>{
  101.                 timer.value--;
  102.                 timerC.updateTablo();
  103.                 if (timer.valueAsNumber) return;
  104. //              const el = document.querySelector('.jwplay');
  105. //              if ( el && el.classList.contains('jwtoggle') ) el.querySelector('button').click();
  106.                 document.getElementsByTagName`video`[0].pause();
  107.                 timerC.toggle();
  108.             }, 1000);
  109.         },
  110.         stop: ()=>{ clearInterval(this.interval); },
  111.         toggle: ()=>{
  112.             timerC[(timerC.state?'stop':'start')]();
  113.             timerC.state = !timerC.state;
  114.             timerC.updateTablo();
  115.         },
  116.         updateTablo: ()=>{
  117.             const m = Math.trunc(timer.value/60),
  118.                   s = timer.value%60;
  119.             button.textContent = (timerC.state? STOP_AFTER+' ':'') + (m<10?'0':'') + m + ':' + (s<10?'0':'') + s;
  120.         }
  121.     };
  122.  
  123.  
  124.     mainEl.style = 'position: fixed; top:0; left:0; z-index:1';
  125.  
  126.     timer.type = 'range';
  127.     timer.min = 0;
  128.     timer.max = 60*90;
  129.     timer.value = defaultStopValue;
  130.  
  131.     timer.style.width = '900px';
  132.     timer.style.display = 'none';
  133.     mainEl.addEventListener('mouseover', ()=>{timer.style.display = '';});
  134.     mainEl.addEventListener('mouseout', ()=>{timer.style.display = 'none';});
  135.  
  136.     ['change', 'mousemove'].forEach(trigger=>{ timer.addEventListener(trigger, timerC.updateTablo); });
  137.  
  138.     button.addEventListener('click', timerC.toggle);
  139.  
  140.     timerC.updateTablo();
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement