Hitomi - Language & Tag Filtering

Filters search results by languages and tags

Från och med 2019-01-19. Se den senaste versionen.

  1. // ==UserScript==
  2. // @name Hitomi - Language & Tag Filtering
  3. // @namespace brazenvoid
  4. // @version 2.4.1
  5. // @author brazenvoid
  6. // @license GPL-3.0-only
  7. // @description Filters search results by languages and tags
  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. 'anime',
  17. 'artist cg',
  18. 'doujinshi',
  19. 'game cg',
  20. 'manga',
  21. ],
  22. allowedLanguages: [
  23. "japanese",
  24. "english"
  25. ],
  26. excludedTags: [
  27. "female:loli",
  28. "sample",
  29. "male:yaoi"
  30. ]
  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. console.log(allowedGallerySelectors)
  60.  
  61. // Formatting filters
  62.  
  63. let formatFilters = function (filters, prefix, suffix) {
  64.  
  65. for (let index = 0; index < filters.length; index++) {
  66.  
  67. filters[index] = '[href="'+ prefix + encodeURIComponent(filters[index]) + suffix +'.html"]'
  68. }
  69. return filters.join(", ")
  70. }
  71.  
  72. let languageFiltersSelector = formatFilters(settings.allowedLanguages, "/index-", "-1")
  73. let tagFiltersSelector = formatFilters(settings.excludedTags, "/tag/", "-all-1")
  74.  
  75. // Filteration logic
  76.  
  77. let validateLanguage = function (gallery) {
  78. let validationCheck = true
  79. if (settings.allowedLanguages.length > 0) {
  80. let languageTD = gallery.querySelector('tr:nth-child(3) > td:nth-child(2)')
  81. if (languageTD.querySelector('a') !== null) {
  82. validationCheck = languageTD.querySelectorAll(languageFiltersSelector).length > 0
  83. }
  84. }
  85. return validationCheck
  86. }
  87.  
  88. let validateTags = function (gallery) {
  89. let validationCheck = true
  90. if (settings.excludedTags.length > 0) {
  91. validationCheck = gallery.querySelectorAll(tagFiltersSelector).length === 0
  92. }
  93. return validationCheck
  94. }
  95.  
  96. let validateType = function (gallery) {
  97. return allowedGallerySelectors.includes(gallery.className)
  98. }
  99.  
  100. let complianceCallback = function(target) {
  101. let galleries = target.querySelectorAll('.anime, .manga, .dj, .acg, .cg'), removeGallery = false, languageTD, validationCheck
  102. for (let gallery of galleries) {
  103.  
  104. validationCheck = validateType(gallery) && validateLanguage(gallery) && validateTags(gallery);
  105. if (!validationCheck) {
  106. gallery.remove()
  107. }
  108. }
  109. }
  110.  
  111. // Setting up configuration and galleries list node
  112.  
  113. let galleriesList = document.querySelector('.gallery-content')
  114. let observerConfig = {
  115. attributes: false,
  116. childList: true,
  117. subtree: false
  118. }
  119.  
  120. // Checking compliance in case of gallery page
  121.  
  122. complianceCallback(galleriesList)
  123.  
  124. // Adding observer to check compliance of galleries on search pages
  125.  
  126. let observer = new MutationObserver(function(mutations, observer) {
  127. for(let mutation of mutations) {
  128. complianceCallback(mutation.target)
  129. }
  130. })
  131. observer.observe(galleriesList, observerConfig)