E-H Better Gallery Hiding

Undoable hiding based on tags, title keywords, and uploader name. Edit script to configure options.

  1. // ==UserScript==
  2. // @name E-H Better Gallery Hiding
  3. // @description Undoable hiding based on tags, title keywords, and uploader name. Edit script to configure options.
  4. // @author Hen-Tie
  5. // @homepage https://hen-tie.tumblr.com/
  6. // @namespace https://greasyfork.org/en/users/8336
  7. // @include /^https?:\/\/(e-|ex)hentai\.org\/(watched.*|\?page=.*|\?f_.*|tag\/.*|uploader\/.*)?$/
  8. // @grant none
  9. // @require https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js
  10. // @icon https://i.imgur.com/pMMVGRx.png
  11. // @version 4.0
  12. // ==/UserScript==
  13.  
  14. /*───────────────────┐
  15. │ CONFIGURATION │
  16. ├────────────────────┼──────────────────────────┬─────────────────────────────────┐
  17. │ uploader hiding │ title hiding │ tag hiding │
  18. ├────────────────────┼──────────────────────────┼─────────────────────────────────┤
  19. │ edit "var blocked" │ edit "var hidePixiv" │ add tag to exhentai.org/mytags │
  20. │ case insensitive │ edit "var hideOngoing" │ set colour to #FF0000 and keep |
  21. │ format: │ edit "var hidePortfolio" │ "hidden" unchecked. result: |
  22. │ ['user1','user2'] │ format: │ script can soft-hide and toggle |
  23. │ │ true/false │ hiding (except in minimal view) |
  24. └────────────────────┴──────────────────────────┴────────────────────────────────*/
  25. var softHiding = false; //dim "hidden" galleries without removing from page
  26. var blocked = []; //list of blocked uploaders
  27. var hidePixiv = false; //pixiv art dumps
  28. var hideOngoing = false; //ongoing or wip galleries
  29. var hidePortfolio = false; //other artist dumps
  30. var hideMisc = false; //ai generated/textless/sample galleries
  31. /*───────────────────────────────────────────────────────────────────────────────*/
  32.  
  33. //track removed galleries by type
  34. var removed, fRemoved, uRemoved, oRemoved, pRemoved, aRemoved, mRemoved;
  35. removed = fRemoved = uRemoved = oRemoved = pRemoved = aRemoved = mRemoved = 0;
  36.  
  37. //all view modes
  38. $('table.itg>tbody>tr, .gl1t').each(function() {
  39. var uploader = $(this).find('.glhide div a, .gl3e div a').text().toLowerCase();
  40. var galTitle = $(this).find('.glink, .gl4t.glname').text();
  41.  
  42. $.each(blocked, function(index,value) {
  43. blocked[index] = value.toLowerCase();
  44. });
  45.  
  46. //tag flagged
  47. //gallery with flagged tag in colour #FF0000 is to be blocked
  48. if ($(this).find('.gt[style$=",#FF0000) !important"]').length > 0) {
  49. hidden($(this));
  50. removed++, fRemoved++;
  51. }
  52. //ongoing gallery
  53. else if(/[([]wip[)\]]|\[incomplete\]|on[- ]?going|en progreso|[\(\[](work )?in[ -]progress.*[\)\]]/i.test(galTitle) && hideOngoing) {
  54. hidden($(this));
  55. removed++, oRemoved++;
  56. }
  57. //pixiv gallery
  58. else if(/pixiv|fanbox/i.test(galTitle) && hidePixiv) {
  59. hidden($(this));
  60. removed++, pRemoved++;
  61. }
  62. //artist gallery
  63. else if(/^artist \w+$|site ?rip|fantia|patreon|hentaifoundry|hentai foundry|hentai-foundry|artist archives|twitter|artist galleries|artist ?[:—–-]|[\(\[]artist[\)\]]/i.test(galTitle) && hidePortfolio) {
  64. hidden($(this));
  65. removed++, aRemoved++;
  66. }
  67. else if (/\[(ai generated|textless|sample)\]/i.test(galTitle) && hideMisc) {
  68. hidden($(this));
  69. removed++, mRemoved++;
  70. }
  71. //uploader blocked - unavailable in thumbnail mode
  72. else if ($.inArray(uploader, blocked) !== -1) {
  73. hidden($(this));
  74. removed++, uRemoved++;
  75. }
  76. });
  77.  
  78. //display removed count with mouseover data
  79. var ctrlAnchor = $('.searchnav');
  80. if (removed > 0) {
  81. var removedInfo = 'Flagged:'+fRemoved+' Uploader:'+uRemoved+' Ongoing:'+oRemoved+' Pixiv:'+pRemoved+' Artist:'+aRemoved+' Misc:'+mRemoved;
  82. if (softHiding) {
  83. ctrlAnchor.before('<div class="eh-bgh-controls">(<em class="eh-bgh-hiddenCount" title="'+removedInfo+'">Soft-Hiding '+removed+'</em> / <a class="eh-bgh-toggle" href="javascript:;" title="Temporarily disable E-H Better Gallery Hiding">Disable</a>)</div>');
  84. } else {
  85. ctrlAnchor.before('<div class="eh-bgh-controls">(<em class="eh-bgh-hiddenCount" title="'+removedInfo+'">Hiding '+removed+'</em> / <a class="eh-bgh-toggle" href="javascript:;" title="Temporarily disable E-H Better Gallery Hiding">Disable</a>)</div>');
  86. }
  87. }
  88.  
  89. function hidden(elem) {
  90. if (softHiding) {
  91. elem.addClass('eh-bgh-hidden');
  92. } else {
  93. elem.addClass('eh-bgh-hidden').hide();
  94. }
  95. }
  96.  
  97. //temporarily disable hiding
  98. $('.eh-bgh-toggle').click(function() {
  99. var toggle = $('.eh-bgh-toggle');
  100.  
  101. toggle.toggleClass('eh-bgh-showing');
  102. $('.eh-bgh-hidden').toggle();
  103.  
  104. if (toggle.hasClass('eh-bgh-showing')) {
  105. toggle.text('Enable');
  106. } else {
  107. toggle.text('Disable');
  108. }
  109. });
  110.  
  111. //add custom css
  112. $('head').append(`<style data-jqstyle="ehBGH">
  113. .eh-bgh-controls {display:block; text-align:center; padding:3px 1px;}
  114. .eh-bgh-hidden {opacity: .2; transition:200ms ease-out;}
  115. .eh-bgh-hidden:hover {opacity: 1;}
  116. .eh-bgh-hiddenCount {border-bottom: 1px dotted currentColor;}
  117. </style>`);