Sleazy Fork is available in English.

Rule34Video 2160p y 1080p Filter (Optimized)

Filtra videos 2160p y 1080p en Rule34Video, ocultando los que no coinciden con la calidad seleccionada.

  1. // ==UserScript==
  2. // @name Rule34Video 2160p y 1080p Filter (Optimized)
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.2
  5. // @description Filtra videos 2160p y 1080p en Rule34Video, ocultando los que no coinciden con la calidad seleccionada.
  6. // @author Luis123456xp (Optimized by GPT)
  7. // @license MIT
  8. // @match https://rule34video.com/*
  9. // @grant GM_xmlhttpRequest
  10. // @grant GM_addStyle
  11. // @require https://code.jquery.com/jquery-3.6.0.min.js
  12. // @run-at document-end
  13. // @connect sleazyfork.org
  14. // ==/UserScript==
  15.  
  16. (async function($) {
  17. 'use strict';
  18.  
  19. const currentVersion = '2.2';
  20. const scriptUrl = 'https://sleazyfork.org/es/scripts/496806-rule34video-2160p-y-1080p-filter/code';
  21. const userLang = navigator.language || navigator.userLanguage;
  22. const isEnglish = userLang.startsWith('en');
  23. const MAX_CONCURRENT_REQUESTS = 20; // Aumentar concurrencia puede acelerar las cosas.
  24.  
  25. // Función para comparar versiones
  26. function compareVersions(v1, v2) {
  27. const v1parts = v1.split('.').map(Number);
  28. const v2parts = v2.split('.').map(Number);
  29. for (let i = 0; i < Math.max(v1parts.length, v2parts.length); i++) {
  30. if ((v1parts[i] || 0) > (v2parts[i] || 0)) return 1;
  31. if ((v1parts[i] || 0) < (v2parts[i] || 0)) return -1;
  32. }
  33. return 0;
  34. }
  35.  
  36. // Verificar si hay una nueva versión disponible
  37. GM_xmlhttpRequest({
  38. method: 'GET',
  39. url: scriptUrl,
  40. onload: function(response) {
  41. const match = response.responseText.match(/@version\s+(\d+\.\d+)/);
  42. if (match) {
  43. const latestVersion = match[1];
  44. if (compareVersions(latestVersion, currentVersion) > 0) {
  45. $('body').prepend(`
  46. <div id="updateNotification" style="position:fixed; top:0; left:0; width:100%; background-color:yellow; z-index:9999; text-align:center; padding:10px;">
  47. ${isEnglish ? 'A new version of the script is available. --Rule34Video 2160p y 1080p Filter--' : 'Hay una nueva versión disponible del script. --Rule34Video 2160p y 1080p Filter--'} <a href="${scriptUrl}" target="_blank">${isEnglish ? 'Click here to update' : 'Haz clic aquí para actualizar'}.</a>
  48. </div>
  49. `);
  50. }
  51. }
  52. }
  53. });
  54.  
  55. // Crear botones de filtrado
  56. const button2160p = $(`<button id="search2160pButton" style="position:fixed; top:10px; right:10px; z-index:9999;">${isEnglish ? 'Filter 2160p' : 'Filtrar 2160p'}</button>`);
  57. const button1080p = $(`<button id="search1080pButton" style="position:fixed; top:50px; right:10px; z-index:9999;">${isEnglish ? 'Filter 1080p' : 'Filtrar 1080p'}</button>`);
  58. $('body').append(button2160p, button1080p);
  59.  
  60. let currentQuality = '';
  61.  
  62. $('#search2160pButton').on('click', function() {
  63. currentQuality = '2160p';
  64. filterVideos(currentQuality);
  65. });
  66.  
  67. $('#search1080pButton').on('click', function() {
  68. currentQuality = '1080p';
  69. filterVideos(currentQuality);
  70. });
  71.  
  72. async function filterVideos(quality) {
  73. console.log(`${isEnglish ? 'Starting video filter with quality:' : 'Iniciando filtrado de videos con calidad:'} ${quality}`);
  74.  
  75. // Recopilar todos los enlaces y referencias a los elementos
  76. const videoElements = $('.item.thumb').has('a[href*="/video/"]');
  77. const videoData = videoElements.map(function() {
  78. const link = $(this).find('a[href*="/video/"]').attr('href');
  79. return {
  80. element: $(this),
  81. link: link
  82. };
  83. }).get();
  84.  
  85. console.log(`${isEnglish ? 'Total videos found:' : 'Total de videos encontrados:'} ${videoData.length}`);
  86.  
  87. // Mostrar mensaje de carga
  88. const loadingDiv = $(`
  89. <div id="loadingMessage" style="position:fixed; top:50%; left:50%;
  90. transform:translate(-50%, -50%); z-index:9999; background-color: yellow; padding: 10px; font-size: 20px;">
  91. ${isEnglish ? 'Filtering videos...' : 'Filtrando videos...'}
  92. </div>
  93. `);
  94. $('body').append(loadingDiv);
  95.  
  96. let matchCount = 0;
  97. let processedCount = 0;
  98.  
  99. // Función auxiliar para procesar un video
  100. async function processVideo(videoInfo) {
  101. const html = await fetchPageHTML(videoInfo.link);
  102. const hasQuality = html.includes(quality);
  103. if (!hasQuality) {
  104. videoInfo.element.hide();
  105. } else {
  106. matchCount++;
  107. }
  108. processedCount++;
  109. // Actualiza el mensaje de progreso
  110. $('#loadingMessage').text(`${isEnglish ? 'Filtering...' : 'Filtrando...'} ${processedCount}/${videoData.length}`);
  111. }
  112.  
  113. // Crear una cola para controlar la concurrencia
  114. const queue = [...videoData];
  115. const workers = [];
  116.  
  117. for (let i = 0; i < MAX_CONCURRENT_REQUESTS; i++) {
  118. workers.push((async () => {
  119. while (queue.length > 0) {
  120. const item = queue.shift();
  121. if (item) await processVideo(item);
  122. }
  123. })());
  124. }
  125.  
  126. await Promise.all(workers);
  127.  
  128. // Filtrado completado
  129. $('#loadingMessage').text(`${isEnglish ? 'Filtering complete. Videos matching' : 'Filtrado completado. Videos que coinciden con'} ${quality}: ${matchCount}`);
  130. setTimeout(() => { $('#loadingMessage').remove(); }, 3000);
  131. console.log(isEnglish ? 'Filtering complete.' : 'Filtrado completado.');
  132. }
  133.  
  134. // Función para obtener el HTML de una página
  135. function fetchPageHTML(url) {
  136. return new Promise((resolve, reject) => {
  137. GM_xmlhttpRequest({
  138. method: 'GET',
  139. url: url,
  140. onload: function(response) {
  141. if (response.status === 200) {
  142. resolve(response.responseText);
  143. } else {
  144. reject(new Error('Request failed: ' + response.status));
  145. }
  146. },
  147. onerror: reject
  148. });
  149. });
  150. }
  151.  
  152. })(window.jQuery);