Allover30 Images & Videos

Access to full size content and download buttons

  1. // ==UserScript==
  2. // @name Allover30 Images & Videos
  3. // @namespace https://greasyfork.org/en/users/1384264-atman
  4. // @version 2025-01-11
  5. // @description Access to full size content and download buttons
  6. // @author atman
  7. // @match https://new.allover30.com/model-pages/*
  8. // @match https://new.allover30.com/Model_Directory*
  9. // @match https://tour.allover30.com/Model-Pages/*
  10. // @grant GM.xmlHttpRequest
  11. // @license GPL-3.0
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16.  
  17. const modelBox = document.querySelectorAll('.modelBox:not(.vid):not(.disabled)');
  18. const modelBoxes = document.querySelectorAll('.modelBox:not(.disabled)');
  19. const models = document.querySelectorAll('.allModels li');
  20.  
  21. const oldSite = document.querySelectorAll('img.border');
  22. let setNumber = null;
  23.  
  24. const checkUrls = async () => {
  25. if (modelBox.length > 0) {
  26. const imgSrc = modelBox[0].querySelector('img');
  27. const regex = /allover30.com\/(.)\/(\w+)\/(\d+)(?=\/cover)/;
  28. const match = imgSrc.src.match(regex);
  29. const [_, letter, model, set] = match;
  30. const numbers = [2, 5, 14, 39, 44, 45, 46, 48, 50, 51, 52]; // STUDIO/Photographer
  31. const urlPromises = numbers.map(async (number) => {
  32. const url = `https://members.allover30.com/media/${letter}/${model}/${set}/1536/${model}${number}${set}_1.jpg`;
  33. return new Promise((resolve) => {
  34. GM.xmlHttpRequest({
  35. method: 'HEAD',
  36. url: url,
  37. onload: (response) => {
  38. if (response.status === 200) {
  39. setNumber = number;
  40. console.log(`STUDIO/Photographer number: ${setNumber}`);
  41. }
  42. resolve(setNumber);
  43. },
  44. onerror: (error) => {
  45. console.error(`Error fetching URL: ${url}`, error);
  46. resolve(null);
  47. }
  48. });
  49. });
  50. });
  51.  
  52. await Promise.all(urlPromises);
  53. }
  54. };
  55.  
  56.  
  57. const updateLinks = () => {
  58. modelBoxes.forEach(box => {
  59. const img = box.querySelector('img');
  60. //console.log('Image Element:', img);
  61. const modelPLink = box.querySelector('.modelP a');
  62. const regex = /allover30.com\/(.)\/(\w+)\/(\d+)(?=\/cover)/;
  63. const match = img.src.match(regex);
  64. //console.log('Regex Match:', match);
  65.  
  66. if (match) {
  67. const [_, letter, model, set] = match;
  68. const imageUrl = `https://members.allover30.com/media/${letter}/${model}/${set}/4800/${model}${setNumber}${set}_1.jpg`;
  69. const downloadUrl = `https://members.allover30.com/media/${letter}/${model}/${set}/4800/${model}-${set}-4800.zip`;
  70. const vidHD = `https://members.allover30.com/media/${letter}/${model}/${set}/${model}-${set}-720.mp4`;
  71. const vidFHD = `https://members.allover30.com/media/${letter}/${model}/${set}/${model}-${set}-1080.mp4`;
  72. const vid4k = `https://members.allover30.com/media/${letter}/${model}/${set}/${model}-${set}-4k.mp4`;
  73.  
  74. const type = box.querySelector('.modelttl');
  75. if (type.textContent.includes('Photo')) {
  76. modelPLink.href = imageUrl;
  77. modelPLink.target = '_blank';
  78.  
  79. const downloadZIP = addButton(downloadUrl);
  80. const detailsList = box.querySelector('.modelPdtls');
  81. detailsList.appendChild(downloadZIP);
  82. }
  83. else {
  84. modelPLink.href = vidHD;
  85. modelPLink.target = '_blank';
  86.  
  87. // Create buttons
  88. const buttonHD = addButtonVid(vidHD, '720p');
  89. const buttonFHD = addButtonVid(vidFHD, '1080p');
  90. const button4k = addButtonVid(vid4k, '4K');
  91.  
  92. const detailsList = box.querySelector('.modelPdtls');
  93. detailsList.appendChild(buttonHD);
  94. detailsList.appendChild(buttonFHD);
  95. detailsList.appendChild(button4k);
  96. }
  97. }
  98. });
  99. };
  100.  
  101. const updateModelLinks = () => {
  102. models.forEach(model => {
  103. const imageElement = model.querySelector('li a');
  104. const nameElement = model.querySelector('.amTtl a');
  105. if (nameElement) {
  106. const modelName = nameElement.textContent.trim();
  107. const newHref = `https://www.google.com/search?q=${encodeURIComponent('site:*.allover30.com/model-pages ' + modelName)}`;
  108. nameElement.href = newHref;
  109. nameElement.target = '_blank';
  110. imageElement.href = newHref;
  111. imageElement.target = '_blank';
  112. }
  113. });
  114. };
  115.  
  116. const updateLinksOLD = () => {
  117. oldSite.forEach(img => {
  118. const url = img.src;
  119. const match = url.match(/index\/(\w{6})(\w{3})(\w{6})/);
  120. if (match) {
  121. const [_, model, studio, setNumber] = match;
  122. const letter = model.charAt(0);
  123. const resolution = (setNumber < 17500) ? 2400 : 4800;
  124. const imageUrl = `https://members.allover30.com/media/${letter}/${model}/${setNumber}/${resolution}/${model}${studio}${setNumber}001.jpg`;
  125. const zipUrl = `https://members.allover30.com/media/${letter}/${model}/${setNumber}/${model}${studio}_${setNumber}_${resolution}.zip`;
  126. const videoWMV = `https://members.allover30.com/media/${letter}/${model}/${setNumber}/wmv/${model}${studio}${setNumber}001.wmv`;
  127. const videoMPG = `https://members.allover30.com/media/${letter}/${model}/${setNumber}/mpg/${model}${studio}${setNumber}001.mpg`;
  128.  
  129. const previousTr = img.closest('tr').previousElementSibling;
  130. if (previousTr && previousTr.textContent.includes('PICTURES')) {
  131. // Make the image clickable
  132. const link = document.createElement('a');
  133. link.href = imageUrl;
  134. link.target = '_blank';
  135. link.appendChild(img.cloneNode());
  136.  
  137. img.parentNode.replaceChild(link, img);
  138.  
  139. const downloadZIP = addButton(zipUrl);
  140. link.parentNode.insertBefore(downloadZIP, link.nextSibling);
  141. }
  142. else if (previousTr && previousTr.textContent.includes('MOVIE')) {
  143. const link = document.createElement('a');
  144. link.href = videoWMV;
  145. link.target = '_blank';
  146. link.appendChild(img.cloneNode());
  147.  
  148. img.parentNode.replaceChild(link, img);
  149.  
  150. const downloadWMV = addButtonVid(videoWMV, 'WMW');
  151. const downloadMPG = addButtonVid(videoMPG, 'MPG');
  152. link.parentNode.insertBefore(downloadWMV, link.nextSibling);
  153. link.parentNode.insertBefore(downloadMPG, link.nextSibling);
  154. }
  155. }
  156. });
  157. };
  158.  
  159. function addButton(url) {
  160. const button = document.createElement('a');
  161. button.href = url;
  162. button.textContent = 'Download ZIP';
  163. button.style.cssText = `
  164. display: block;
  165. width:90%;
  166. margin: 5px;
  167. padding: 10px 6px;
  168. background: linear-gradient(90deg, #00d478, #297d58);
  169. color: #FFFFFF;
  170. text-decoration: none;
  171. border-radius: 5px;
  172. text-align: center;
  173. font-weight: bold;
  174. transition: background 0.5s linear;
  175. `;
  176. return button;
  177. }
  178.  
  179. function addButtonVid(url, label) {
  180. const button = document.createElement('a');
  181. button.href = url;
  182. button.textContent = label;
  183. button.style.cssText = `
  184. display: inline-block;
  185. max-width:30%;
  186. margin: 6px;
  187. padding: 10px 6px;
  188. background: linear-gradient(90deg, #00d478, #297d58);
  189. color: #FFFFFF;
  190. text-decoration: none;
  191. border-radius: 5px;
  192. text-align: center;
  193. font-weight: bold;
  194. transition: background 0.5s linear;
  195. `;
  196. return button;
  197. }
  198.  
  199. const main = async () => {
  200. if (modelBoxes.length > 0) {
  201. await checkUrls();
  202. if(setNumber){
  203. updateLinks();
  204. }
  205. }
  206. if (models.length > 0) {
  207. updateModelLinks();
  208. }
  209.  
  210. if (oldSite.length > 0) {
  211. updateLinksOLD();
  212. const links = document.querySelectorAll('a[href*="signup.php"]');
  213. links.forEach(link => {
  214. if (link.querySelector('img[src*="join.gif"]')) {
  215. link.remove(); // Remove only the specific link
  216. }
  217. });
  218. }
  219.  
  220. let pp = document.querySelector('.paypal');
  221. if(pp){
  222. pp.remove();
  223. }
  224. };
  225.  
  226. main();
  227. })();