Guest User

Userscript для exhentai.org

a guest
Nov 29th, 2016
898
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name        ExH
  3. // @namespace   Rozenfag
  4. // @include     https://exhentai.org/s/*/*
  5. // @match       https://exhentai.org/s/*/*
  6. // @version     5
  7. // @author      Aleksandr Petrov
  8. // @run-at      document-end
  9. // @grant       none
  10. // ==/UserScript==
  11.  
  12. /*
  13.     Здравствуй мой дорогой любитель фапа =3
  14.     Для тебя (ну и конечно же для себя любимого), я накатал небольшой скрипт расширяющий функционал любимой
  15.     грустнопанды. Для его запуска тебе понадобится современный браузер и расширение для выполнения UserScript-ов.
  16.     Для Firefox это будет "Greasemonkey", для Opera  нужно "Tampermonkey" или "Violent monkey", а для Chrome
  17.     ищи "Trampermonkey".
  18.  
  19.     После установки нужного расширения, добавь в него этот скрипт и ты получишь следующие вкусности:
  20.     1) Возможность листать по пробелу. Очень удобно, особенно когда руки заняты, просто жмакнуть по большой конпке,
  21.     а не целиться)))
  22.     2) Предзагрузка изображений, что позволяет избежать "морганий" при перелистывании контента. Незаменимая вещь на
  23.     игровом арте, где зачастую фон не меняется, а меняются "эмоции" и появляются детали, вроде брызг спермы.
  24.     3) Слайдшоу режим, для полноценного освобождения рук)))))))))))))) Таймаут в секундах можете установить свой в
  25.     переменной TIMEOUT_SEC_SLIDE_SHOW чуть ниже.
  26.     4) Автоматическое масштабирование изображения с помощью трех режимов: уменьшение до пределов окна, уменьшение
  27.     или увеличение до пределов окна, и исходный размер.
  28.     5) Минимализм)) Только картинка и ты. Управление все через клавиши, т.к. как по мне это самое удобное. Кстати,
  29.     очень круто в полноэкранном режиме браузера фапать))
  30.  
  31.     [УПРАВЛЕНИЕ]
  32.     ПРОБЕЛ или СТРЕЛОЧКА ВПРАВО: Следующая картинка.
  33.     СТРЕРОЧКА ВЛЕВО: Предыдущая картинка.
  34.     СТРЕЛОЧКА ВВЕРХ: Вернуться в галерею.
  35.     СТРЕЛОЧКА ВНИЗ, F5: Обновить страницу, для получения настоящего URL, а не первого, т.н. "входного".
  36.     TAB: Запуск и остановка слайдшоу.
  37.     КЛИК ПО КАРТИНКЕ: Изменение режима масштабирования. Текущий можно посмотреть в значке вкладки.
  38.  */
  39.  
  40. var TIMEOUT_SEC_SLIDE_SHOW = 6; //По умолчанию картинка сменяется раз в 6 секунд.
  41.  
  42. window.addEventListener('load', function(){
  43.     //Всякие переменные и картинки в base64 формате.
  44.     var gallURL = document.getElementById("i5").getElementsByTagName("a")[0].href;
  45.     var currURL, nextURL, prevURL;
  46.     var block = false, blockIMG = false;
  47.     var timeoutURL, timeoutIMG;
  48.     var ScaleMode = 1;
  49.     var slideShow = false;
  50.     var loadImgW, loadImgH, showImgW, showImgH;
  51.     var timeout_LoadIMG = 14000; //Таймаут в мс, на загрузку изображения.
  52.     var favicons = [
  53.         'data:image/gif;base64,R0lGODlhEAAQAMIGAGYGEYCAgJmZmbOzs8zMzOXl5f///////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgAHACwAAAAAEAAQAAADNAi63HowSvmmhfXOrCPvx9eJGnk9jhMCYVEQxDAIQhCwqAvLtI3jutisdlutUgsjyINEJgAAIfkEBQoABwAsAwAKAAoAAwAAAw1IVKUzQijmoFyNvJgAACH5BAUKAAcALAMACgAKAAMAAAMLOENUxUoxB+N8RCUAIfkEBQoABwAsAwAKAAoAAwAAAw0oMkNUxSnmoFztRZIAACH5BAUKAAcALAMACgAKAAMAAAMNGCEyQ6QUxRyUtL1YEgAh+QQFCgAHACwDAAoACgADAAADDSgSoTOEKOagXE28mAAAIfkEBQoABwAsAwAKAAoAAwAAAws4IxLBSjEH43xCJQAh+QQBCgAHACwDAAoACgADAAADDUg0IxLBKeagXO1FkQAAOw==',
  54.         'data:image/gif;base64,R0lGODlhEAAQAIABAGYGEf///yH5BAEKAAEALAAAAAAQABAAAAIohI9pwe2+nmRxvmobzmFnb4FThFCHCQGoplKd23bt7L6yHd4cq/RGAQA7',
  55.         'data:image/gif;base64,R0lGODlhEAAQAIABAGYGEf///yH5BAEKAAEALAAAAAAQABAAAAIthI9pwe2+EDwhgtds3e96z1xZWIkjl5lYp65pR06cKn5be5f6qkmp5mIphoYCADs=',
  56.         'data:image/gif;base64,R0lGODlhEAAQAIABAGYGEf///yH5BAEKAAEALAAAAAAQABAAAAIghI9pwe2+nmRxvmobzmFnb4GTKJEXwEFoSq2sqSqyUQAAOw=='
  57.     ];
  58.     //Удаляем все ненужное со страницы
  59.     window.onpopstate = null;
  60.     window.onresize = null;
  61.     window.onload = null;
  62.     document.onkeydown = null;
  63.     document.body.innerHTML = "";
  64.     document.body.style.textAlign = 'center';
  65.     document.body.style.padding = '0px';
  66.  
  67.     //Создаем два пустых изображения. Первое сделаем скрытым от глаз, и будем в него грузить нужную картинку, а после загрузки, без всяких морганий,
  68.     //перекинем во второе, которое видимо. Кароче, в одном все грузится, во втором показывается.
  69.     var loadIMG = document.createElement("img");
  70.     var showIMG = document.createElement("img");
  71.     document.body.appendChild(loadIMG);
  72.     document.body.appendChild(showIMG);
  73.     loadIMG.style.width = '0px';
  74.     loadIMG.style.height = '0px';
  75.     showIMG.style.cursor = 'pointer';
  76.  
  77.     //Функция для показа анимации загрузки вместо стандартного значка грустнопанды во вкладке, чтоб было видно, что чет грузится.
  78.     function changeFavicon(mode){
  79.         var head = document.head || document.getElementsByTagName('head')[0];
  80.         var link = document.createElement('link');
  81.         link.id = 'dynamic-favicon';
  82.         link.rel = 'shortcut icon';
  83.         link.href = favicons[(mode<0?ScaleMode:mode)];
  84.         var oldLink = document.getElementById('dynamic-favicon');
  85.         if(oldLink) head.removeChild(oldLink);
  86.         head.appendChild(link);
  87.     }
  88.  
  89.     //Обрабатываем событие окончания загрузки нашей картинки в скрытом от глаз изображении.
  90.     loadIMG.addEventListener ('load', function(){
  91.         blockIMG = true;
  92.         clearTimeout(timeoutIMG); //Удаляем таймаут на загрузку пикчи, а то вылезет попап, что мы якобы еще её грузим.
  93.         showImgW = loadImgW;
  94.         showImgH = loadImgH;
  95.         ScaleImage();
  96.         showIMG.src = loadIMG.src;
  97.         changeFavicon(-1);
  98.         block = false;
  99.         blockIMG = false;
  100.     }, false);
  101.  
  102.     //Функция для изменения размеров картинки в зависимости от режима маштабирования.
  103.     function ScaleImage(){
  104.         var ratio = Math.min((window.innerWidth-2) / showImgW, (window.innerHeight-2) / showImgH);
  105.         if( ((ScaleMode == 1) && (ratio >= 1)) || (ScaleMode == 3) ) ratio = 1;
  106.         showIMG.style.width = parseInt(showImgW*ratio)+'px';
  107.         showIMG.style.height = parseInt(showImgH*ratio)+'px';
  108.     }
  109.  
  110.     //Обрабатываем клик по изображению. Это меняет режим масштабирования.
  111.     showIMG.addEventListener ('click', function(){
  112.         ScaleMode = (ScaleMode==3?1:ScaleMode+1);
  113.         if(blockIMG === false) ScaleImage();
  114.         if(block === false) changeFavicon(ScaleMode);
  115.     }, false);
  116.  
  117.     //Эта функция грузит нужную страницу в галерее и получает все данные о изображении на ней.
  118.     function getImage(url){
  119.         if(block === false){ //Если заблочено, значит что-то грузится и делать ничо не будем)
  120.             if(url === currURL){ //На случай окончания картинок в галерее. Просто выходим в ее корень, с превьюхами.
  121.                 slideShow=false;
  122.                 document.location = gallURL;
  123.             }else{ //Все ОК можно грузить страницу.
  124.                 block = true; //Блочим функцию на период ее асинхронного выполнения.
  125.                 changeFavicon(0); //Анимируем значок во вкладке.
  126.                 var xmlhttp = new XMLHttpRequest();
  127.                 xmlhttp.open('GET', url, true); //Формируем запрос на грустнопанду.
  128.  
  129.                 //Обрабатываем событие прихода ответа.
  130.                 xmlhttp.onreadystatechange=function(){
  131.                     if(xmlhttp.readyState != 4) return;
  132.  
  133.                     clearTimeout(timeoutURL); //Ответ пришел, можно удалять таймаут на него.
  134.  
  135.                     if(xmlhttp.status == 200){ //Ответ пришел какой мы и ждали)
  136.                         //Тут мы долго и скучно вытаскиваем из пришедшего html кода адреса для навигации, размер картинки и т.д.
  137.                         var tempDOM = new DOMParser().parseFromString(xmlhttp.responseText, "text/xml");
  138.                         nextURL=tempDOM.getElementById("next").href;
  139.                         prevURL=tempDOM.getElementById("prev").href;
  140.                         currURL=url;
  141.  
  142.                         var imageSize = tempDOM.getElementById("i2").childNodes[1].innerHTML.split(' :: ')[1].split(' x ');
  143.                         loadImgW = imageSize[0];
  144.                         loadImgH = imageSize[1];
  145.  
  146.                         //Начинаем грузить картинку в скрытое изображение по полученному адресу из ответа.
  147.                         loadIMG.src = tempDOM.getElementById("img").src;
  148.  
  149.                         //Таймаут на загрузку картинки, т.к. грустнопанда не отличается идеальной стабильностью.
  150.                         timeoutIMG = setTimeout( function(){
  151.                             alert('ОШИБКА: Загрузка изображения длилась более '+parseInt(timeout_LoadIMG/2000)+' сек. и была прервана.');
  152.                             changeFavicon(-1);
  153.                             block = false;
  154.                         }, 100+parseInt(timeout_LoadIMG/2));
  155.                     } else {//Все ужасно(((
  156.                         alert('ОШИБКА: При загрузке exhentai.org возникли неполадки. Подробнее: ' + xmlhttp.statusText);
  157.                     }
  158.                 };
  159.  
  160.                 xmlhttp.send(null); //Отправляем запрос на грутснопанду.
  161.  
  162.                 //Таймаут запроса, на случай подвисшего инета, глюков на грустнопанде и прочих сетевых неврозах.
  163.                 timeoutURL = setTimeout( function(){
  164.                     xmlhttp.abort();
  165.                     alert('ОШИБКА: Загрузка exhentai.org длилась более '+parseInt(timeout_LoadIMG/2000)+' сек. и была прервана.');
  166.                     changeFavicon(-1);
  167.                     block = false;
  168.                 }, 100+parseInt(timeout_LoadIMG/2));
  169.             }
  170.         }
  171.     }
  172.  
  173.     var timer;
  174.  
  175.     //Обрабатываем нажатие клавиш.
  176.     document.body.addEventListener ('keydown', function(event){
  177.         switch(event.keyCode){
  178.             case 9://TAB
  179.                 slideShow = (slideShow===false?true:false);
  180.                 if(slideShow===true){
  181.                     alert('СЛАЙДШОУ: Запущена смена изображений раз в '+TIMEOUT_SEC_SLIDE_SHOW+' сек.');
  182.                     timer = setInterval(function(){
  183.                         if(slideShow===false){
  184.                             clearInterval(timer);
  185.                         }else{
  186.                             getImage(nextURL);
  187.                         }
  188.                     }, TIMEOUT_SEC_SLIDE_SHOW*1000);
  189.                 }else{
  190.                     alert('СЛАЙДШОУ: Остановлено.');
  191.                 }
  192.                 break;
  193.             case 32://ПРОБЕЛ
  194.             case 39://СТРЕЛОЧКА ВПРАВО
  195.                 getImage(nextURL); //Следущее изображение.
  196.                 break;
  197.             case 37://СТРЕЛОЧКА ВЛЕВО
  198.                 getImage(prevURL); //Предыдущее изображение.
  199.                 break;
  200.             case 38://СТРЕЛОЧКА ВВЕРХ
  201.                 document.location = gallURL; //Возвращение в галерею с превьюшками.
  202.                 break;
  203.             case 40://СТРЕЛОЧКА ВНИЗ
  204.             case 116://F5
  205.                 event.preventDefault();
  206.                 document.location = currURL; //Рефрешнуть страницу. Полезно для получения правильной ссылки на страницу в адресной строке.
  207.                 break;
  208.         }
  209.     }, false);
  210.  
  211.     getImage(document.URL); //Загружаем картинку начальной страницы, ведь мы удалили все в теге <body> очистив от всего лишнего.
  212. }, false);
Advertisement
Add Comment
Please, Sign In to add comment