E-H Visited

Marks visited galleries.

Mint 2019.03.20.. Lásd a legutóbbi verzió

  1. // ==UserScript==
  2. // @name E-H Visited
  3. // @description Marks visited galleries.
  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\/.*/
  8. // @require https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js
  9. // @grant GM_setValue
  10. // @grant GM_getValue
  11. // @icon https://i.imgur.com/pMMVGRx.png
  12. // @version 2.1
  13. // ==/UserScript==
  14. //fork of https://sleazyfork.org/en/scripts/22270-exvisited
  15. //updated to work with March 2019 layout update
  16.  
  17. if (typeof (Storage) == "undefined") {
  18. alert("E-H Visited:\nYour browser does not support localStorage :(");
  19. }
  20.  
  21. var storageName = "ehVisited";
  22. var url = document.URL;
  23. var sto = localStorage.getItem(storageName) ? localStorage.getItem(storageName) : '{"data":{}}';
  24. var vis = JSON.parse(sto);
  25. var spl = url.split("/");
  26. var d1 = spl[3]
  27. var d2 = spl[4];
  28. var d3 = spl[5];
  29. var css = GM_getValue("css") ? GM_getValue("css") : "background:rgba(2, 129, 255, .2) !important;";
  30.  
  31.  
  32. vis["data"] = !vis["data"] ? Array() : vis["data"];
  33.  
  34. // Helper stuff
  35. if (!Date.now) {
  36. Date.now = function () {
  37. return new Date().getTime();
  38. };
  39. }
  40.  
  41. Number.prototype.pad0 = function (length) {
  42. var result = this.toString();
  43. while (result.length < length) result = "0" + result;
  44. return result;
  45. }
  46.  
  47. Object.size = function (obj) {
  48. var size = 0,
  49. key;
  50. for (key in obj) {
  51. if (obj.hasOwnProperty(key)) size++;
  52. }
  53. return size;
  54. };
  55.  
  56. function ExStore() {
  57. var c = d2 + "." + d3;
  58. vis["data"][c] = Date.now();
  59. localStorage.setItem(storageName, JSON.stringify(vis));
  60. }
  61.  
  62. function timeDifference(current, previous) {
  63.  
  64. var msPerMinute = 60 * 1000;
  65. var msPerHour = msPerMinute * 60;
  66. var msPerDay = msPerHour * 24;
  67. var msPerMonth = msPerDay * 30;
  68. var msPerYear = msPerDay * 365;
  69.  
  70. var elapsed = current - previous;
  71.  
  72. if (elapsed < msPerMinute) {
  73. return Math.round(elapsed / 1000) + " seconds ago";
  74. } else if (elapsed < msPerHour) {
  75. return Math.round(elapsed / msPerMinute) + " minutes ago";
  76. } else if (elapsed < msPerDay) {
  77. return Math.round(elapsed / msPerHour) + " hours ago";
  78. } else if (elapsed < msPerMonth) {
  79. return Math.round(elapsed / msPerDay) + " days ago";
  80. } else if (elapsed < msPerYear) {
  81. return Math.round(elapsed / msPerMonth) + " months ago";
  82. } else {
  83. return Math.round(elapsed / msPerYear) + " years ago";
  84. }
  85. }
  86.  
  87. function ExHide() {
  88.  
  89. var list = $("table.itg>tbody>tr");
  90. var thumb = $(".itg .gl1t");
  91. var gid;
  92. var d;
  93. var galleryId;
  94.  
  95. // list views
  96. if (list.length > 0) {
  97. if ($('.gl1e').length) { //extended
  98. for (i = 0; i < list.length; i++) {
  99. gid = $(list[i]).find(".glname a").attr("href").split("/");
  100. galleryId = gid[4] + "." + gid[5];
  101. if (vis["data"][galleryId] != undefined) {
  102. d = new Date(vis["data"][galleryId]);
  103. $(list[i]).addClass("eh-visited");
  104. $(list[i]).find('.gl3e').append("<div class='eh-visited-time'>" + timeDifference(Date.now(), vis["data"][galleryId]) + "<br>(" + d.getHours().pad0(2) + ":" + d.getMinutes().pad0(2) + " " + d.getDate() + "/" + (d.getMonth() + 1) + ")</div>")
  105. }
  106. }
  107. } else if ($('.gl1c').length) {
  108. $('table.itg tbody>tr:first-child').append('<th>Visited</th>');
  109. for (i = 1; i < list.length; i++) {
  110. gid = $(list[i]).find(".glname a").attr("href").split("/");
  111. galleryId = gid[4] + "." + gid[5];
  112. if (vis["data"][galleryId] != undefined) {
  113. d = new Date(vis["data"][galleryId]);
  114. $(list[i]).addClass("eh-visited");
  115. $(list[i]).append('<td class="eh-visited-cell"><span class="eh-visited-icon-compact" title="'+timeDifference(Date.now(), vis["data"][galleryId]) + "\n" + d.getHours().pad0(2) + ":" + d.getMinutes().pad0(2) + " " + d.getDate() + "/" + (d.getMonth() + 1)+'">&#128065Yes</span></td>');
  116. } else {
  117. $(list[i]).append('<td></td>');
  118. }
  119. }
  120. } else {
  121. for (i = 1; i < list.length; i++) {
  122. gid = $(list[i]).find(".glname a").attr("href").split("/");
  123. galleryId = gid[4] + "." + gid[5];
  124. if (vis["data"][galleryId] != undefined) {
  125. d = new Date(vis["data"][galleryId]);
  126. $(list[i]).addClass("eh-visited");
  127. $(list[i]).find('.gl2m').append('<span class="eh-visited-icon-minimal" title="'+timeDifference(Date.now(), vis["data"][galleryId]) + "\n" + d.getHours().pad0(2) + ":" + d.getMinutes().pad0(2) + " " + d.getDate() + "/" + (d.getMonth() + 1)+'">&#128065</span>')
  128. }
  129. }
  130. }
  131. }
  132. // thumbnail view
  133. if (thumb.length > 0) {
  134. for (var i = 0; i < thumb.length; i++) {
  135. gid = $(thumb[i]).find(".glname a").attr("href").split("/");
  136. var c = gid[4] + "." + gid[5];
  137. if (vis["data"][c] != undefined) {
  138. d = new Date(vis["data"][c]);
  139. $(thumb[i]).addClass("eh-visited");
  140. $(thumb[i]).children('.gl5t').after("<div class='eh-visited-time'>" + timeDifference(Date.now(), vis["data"][c]) + " (" + d.getHours().pad0(2) + ":" + d.getMinutes().pad0(2) + " " + d.getDate() + "/" + (d.getMonth() + 1) + ")</div>")
  141. }
  142. }
  143. }
  144. }
  145.  
  146. $(function () {
  147. $("<style>.gl2m{width:144px;}.gl2m>div:nth-child(3){left:unset;right:4px;top:7px;}.eh-visited-icon-minimal{width:1em;line-height:1;font-size:15px;top:7px;right:23px;position:absolute;}.eh-visited-icon-compact{border-bottom:1px currentColor dotted;}.eh-visited-time{text-align:center;margin-bottom:3px;}.eh-visited{" + css + "}" + "modal button:hover{cursor:pointer;}modal button{all:unset;position:absolute;top:-1.5em;padding:.25em;line-height:1;color:#fff;text-shadow:0 0 6px #000,0 0 2px #000;}modal textarea:enabled:focus,modal textarea:enabled:hover{background:unset;}modal textarea{all:initial;font:inherit;word-break:break-word;overflow:auto;height:100%;width:100%;}modal{display:flex;align-items:center;justify-content:center;position:fixed;z-index:999;padding:.5em;box-sizing:border-box;width:600px;height:300px;left:50%;top:50%;line-height:1.3;font-size:18px;font-weight:400;font-family:sans-serif;border-radius:0.5em;opacity:0;color:transparent;transform:translate(-50%,0);background:rgba(255,255,255,0);box-shadow:0 0 0 rgba(0,0,0,0)}.animated{animation:slideUp 800ms cubic-bezier(0.645, 0.045, 0.355, 1) both, dropShadow 800ms cubic-bezier(0.55, 0.055, 0.675, 0.19) both, textColor 400ms cubic-bezier(0.645, 0.045, 0.355, 1) 400ms both}@keyframes slideUp{100%{transform:translate(-50%,-150px);opacity:1;background:rgba(255,255,255,1)}}@keyframes dropShadow{100%{box-shadow:0 3px 5px rgba(0, 0, 0, 0.1), 0 0 2px rgba(0, 0, 0, 0.1), 0 5px 15px rgba(0, 0, 0, 0.2)}}@keyframes textColor{100%{color:#000}}</style>").appendTo("head");
  148. if (d1 == "g") {
  149. ExStore();
  150. }
  151. if (d1.substr(0, 1) == "?" || d1.substr(0, 1) == "#" || d1.substr(0, 1) == "f" || d1.substr(0, 1) == "t" || !d1) {
  152. var len = Object.size(vis["data"]);
  153. $("#toppane").append("<div style='text-align:center'>Galleries visited: " + len + " (<a href='javascript:;' id='ExImport'>Import</a> / <a href='javascript:;' id='ExExport'>Export</a> / <a href='javascript:;' id='ExCss'>CSS</a>)</div>");
  154.  
  155. $("#ExExport").click(function () {
  156. var e = "";
  157. for (var d in vis["data"]) {
  158. e += d + ":" + vis["data"][d] + ";";
  159. }
  160. if ($('modal').length) {
  161. $('modal').remove();
  162. }
  163. $('body').append("<modal class='animated'><textarea>" + e + "</textarea><button type='button'>Close</button></modal>");
  164. });
  165.  
  166. $('body').on('click', 'modal button', function () {
  167. $('modal').remove();
  168. });
  169.  
  170. $("#ExImport").click(function () {
  171. var c = prompt("E-H Visited:\nPaste visited gallery data.");
  172. if (c) {
  173. var d = JSON.parse('{"data":{}}');
  174. var sp = c.split(";");
  175. for (var k in sp) {
  176. var s = sp[k].split(":");
  177. d["data"][s[0]] = parseInt(s[1]);
  178. }
  179.  
  180. alert("Imported " + Object.size(d["data"]) + " entries.");
  181. localStorage.setItem(storageName, JSON.stringify(d))
  182. location.reload();
  183.  
  184. }
  185. });
  186.  
  187. $("#ExCss").click(function () {
  188. var c = prompt("E-H Visited:\nCustom visited gallery CSS.", css);
  189. if (c) {
  190. GM_setValue("css", c);
  191. location.reload();
  192. }
  193. });
  194.  
  195. ExHide();
  196. }
  197. });