Hitomi - Search & UI Tweaks

Search Filters & UI Manipulations

ของเมื่อวันที่ 25-01-2019 ดู เวอร์ชันล่าสุด

  1. // ==UserScript==
  2. // @name Hitomi - Search & UI Tweaks
  3. // @namespace brazenvoid
  4. // @version 2.5.0
  5. // @author brazenvoid
  6. // @license GPL-3.0-only
  7. // @description Search Filters & UI Manipulations
  8. // @include https://hitomi.la/*
  9. // @run-at document-idle
  10. // ==/UserScript==
  11.  
  12. // Define languages to keep and tags to exclude here
  13.  
  14. let settings = {
  15. allowedGallleryTypes: [
  16. 'artist cg',
  17. 'doujinshi',
  18. 'game cg',
  19. 'manga',
  20. ],
  21. allowedLanguages: [
  22. "japanese",
  23. "english"
  24. ],
  25. excludedTags: [
  26. "female:loli",
  27. "sample",
  28. "male:yaoi"
  29. ],
  30. removeRelatedGalleries: false,
  31. }
  32.  
  33. // Translate gallery types to css selectors
  34.  
  35. let allowedGallerySelectors = [], allowedGalleryTypeSelector
  36.  
  37. for (let allowedGalleryType of settings.allowedGallleryTypes) {
  38. switch (allowedGalleryType) {
  39. case 'anime':
  40. allowedGalleryTypeSelector = 'anime'
  41. break
  42. case 'artist cg':
  43. allowedGalleryTypeSelector = 'acg'
  44. break
  45. case 'doujinshi':
  46. allowedGalleryTypeSelector = 'dj'
  47. break
  48. case 'game cg':
  49. allowedGalleryTypeSelector = 'cg'
  50. break
  51. case 'manga':
  52. allowedGalleryTypeSelector = 'manga'
  53. break
  54. default:
  55. continue;
  56. }
  57. allowedGallerySelectors.push(allowedGalleryTypeSelector)
  58. }
  59.  
  60. // Formatting filters
  61.  
  62. let formatFilters = function (filters, prefix, suffix) {
  63.  
  64. for (let index = 0; index < filters.length; index++) {
  65.  
  66. filters[index] = '[href="'+ prefix + encodeURIComponent(filters[index]) + suffix +'.html"]'
  67. }
  68. return filters.join(", ")
  69. }
  70.  
  71. let languageFiltersSelector = formatFilters(settings.allowedLanguages, "/index-", "-1")
  72. let tagFiltersSelector = formatFilters(settings.excludedTags, "/tag/", "-all-1")
  73.  
  74. // Filteration logic
  75.  
  76. let validateLanguage = function (gallery) {
  77. let validationCheck = true
  78. if (settings.allowedLanguages.length > 0) {
  79. let languageTD = gallery.querySelector('tr:nth-child(3) > td:nth-child(2)')
  80. if (languageTD.querySelector('a') !== null) {
  81. validationCheck = languageTD.querySelectorAll(languageFiltersSelector).length > 0
  82. }
  83. }
  84. return validationCheck
  85. }
  86.  
  87. let validateTags = function (gallery) {
  88. let validationCheck = true
  89. if (settings.excludedTags.length > 0) {
  90. validationCheck = gallery.querySelectorAll(tagFiltersSelector).length === 0
  91. }
  92. return validationCheck
  93. }
  94.  
  95. let validateType = function (gallery) {
  96. return allowedGallerySelectors.includes(gallery.className)
  97. }
  98.  
  99. let complianceCallback = function(target) {
  100. let galleries = target.querySelectorAll('.anime, .manga, .dj, .acg, .cg'), removeGallery = false, languageTD, validationCheck
  101. for (let gallery of galleries) {
  102.  
  103. validationCheck = validateType(gallery) && validateLanguage(gallery) && validateTags(gallery);
  104. if (!validationCheck) {
  105. gallery.remove()
  106. }
  107. }
  108. }
  109.  
  110. // Script Run
  111.  
  112. let galleriesList = document.querySelector('.gallery-content')
  113. let isGalleryPage = document.getElementById('dl-button') !== null;
  114.  
  115. if (isGalleryPage && settings.removeRelatedGalleries) {
  116.  
  117. galleriesList.remove();
  118.  
  119. } else {
  120.  
  121. let observerConfig = {
  122. attributes: false,
  123. childList: true,
  124. subtree: false
  125. }
  126. complianceCallback(galleriesList)
  127.  
  128. // Adding observer to check compliance of galleries
  129.  
  130. let observer = new MutationObserver(function(mutations, observer) {
  131. for(let mutation of mutations) {
  132. complianceCallback(mutation.target)
  133. }
  134. })
  135. observer.observe(galleriesList, observerConfig)
  136. }