jav_preview_new

添加jav官方预览影片 基于作者:BigDiao jav_preview作品Version 0.1.1 修改前版本地址 https://greasyfork.org/zh-CN/scripts/389271-jav-preview

  1. // ==UserScript==
  2. // @author xm superman
  3. // @name jav_preview_new
  4. // @version 0.0.6
  5. // @include http*://*javbus.com/*
  6. // @include *://www.*bus*/*
  7. // @include *://www.*dmm*/*
  8.  
  9. // @include http*://*javlibrary.com/*/?v=*
  10. // @include *://*/movie/*
  11. // @include *://*/cn*
  12. // @include *://*/tw*
  13. // @include *://*/ja*
  14. // @include *://*/en*
  15.  
  16. // @description 添加jav官方预览影片 基于作者:BigDiao jav_preview作品Version 0.1.1 修改前版本地址 https://greasyfork.org/zh-CN/scripts/389271-jav-preview
  17. // @grant GM_xmlhttpRequest
  18. // @namespace https://greasyfork.org/zh-CN/scripts/429188-jav-preview-new
  19. // ==/UserScript==
  20. // 根据网站域名判断视频插入位置
  21. const domain = document.domain
  22. var javbus_domains = ["www.javbus.com",
  23. "www.javbus.icu",
  24. "www.dmmsee.icu",
  25. "www.busjav.icu",
  26. ]
  27. var javlibrary_domains = ["www.javlibrary.com",
  28. "m34z.com",
  29. ]
  30.  
  31. var $position
  32. var $adtablePostiton
  33. var $imgTab
  34.  
  35. if (javbus_domains.indexOf(domain) != -1) {
  36. //$position = document.querySelector('#mag-submit-show')
  37. $position = document.querySelector('#sample-waterfall')
  38. $adtablePostiton = document.querySelector('#mag-submit-show')
  39. $imgTab = document.querySelector('.bigImage').href
  40. } else if (javlibrary_domains.indexOf(domain) != -1) {
  41. $position = document.querySelector('#video_favorite_edit')
  42. }
  43.  
  44. if (!$position&&!$adtablePostiton) return
  45.  
  46. // add meta
  47. function addmeta() {
  48. var oMeta = document.createElement('meta');
  49. oMeta.setAttribute("http-equiv", "Content-Security-Policy")
  50. oMeta.setAttribute("content", "upgrade-insecure-requests")
  51. document.getElementsByTagName('head')[0].appendChild(oMeta);
  52. }
  53.  
  54. // request with customer headers
  55. function request(url) {
  56. return new Promise(resolve => {
  57. GM_xmlhttpRequest({
  58. url,
  59. method: 'GET',
  60. headers: {
  61. "Cache-Control": "no-cache",
  62. "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Mobile Safari/537.36",
  63. },
  64. timeout: 30000,
  65. onload: response => { //console.log(url + " reqTime:" + (new Date() - time1));
  66. resolve(response);
  67. },
  68. onabort: (e) => {
  69. console.log(url + " abort");
  70. resolve("wrong");
  71. },
  72. onerror: (e) => {
  73. console.log(url + " error");
  74. console.log(e);
  75. resolve("wrong");
  76. },
  77. ontimeout: (e) => {
  78. console.log(url + " timeout");
  79. resolve("wrong");
  80. },
  81. });
  82. });
  83. }
  84.  
  85. // GM_xmlhttpRequest promise wrapper
  86. const gmFetch = url =>
  87. new Promise((resolve, reject) => {
  88. GM_xmlhttpRequest({
  89. url: url,
  90. method: 'GET',
  91. onload: resolve,
  92. onerror: reject
  93. })
  94. })
  95. const parseHTML = str => {
  96. const tmp = document.implementation.createHTMLDocument()
  97. tmp.body.innerHTML = str
  98. return tmp
  99. }
  100. const avid = document.title.replace(/([^-]+)-([^ ]+) .*/, '$1-$2')
  101. const preview = async () => {
  102. const srcs = src =>
  103. ['dmb', 'dm', 'sm']
  104. .map(i => src.replace(/_(dmb|dm|sm)_/, `_${i}_`))
  105. .map(i => `<source src=${i}></source>`)
  106. .join('')
  107.  
  108. const xrmoo = async () => {
  109. let tmpAvid = avid.replace('-',' ');
  110. const res = await gmFetch(
  111. `http://dmm.xrmoo.com/sindex.php?searchstr=${tmpAvid}`
  112. )
  113. try {
  114. const video_tag = parseHTML(res.responseText).querySelector('a.link.viewVideo')
  115. console.log(video_tag)
  116. const src = video_tag.getAttribute('data-link')
  117. //const video_tag = parseHTML(res.responseText).querySelector('div.card-footer').querySelector("a:nth-child(3)")
  118. //const src = video_tag.getAttribute('href')
  119. console.log('xrmoo', src)
  120. return src
  121. } catch (err) {
  122. console.log("获取xrmoo视频地址出现错误", err)
  123. const src = ""
  124. return src
  125. }
  126.  
  127. }
  128.  
  129. const r18 = async () => {
  130. const res = await gmFetch(
  131. `https://www.r18.com/common/search/order=match/searchword=${avid}`
  132. )
  133. try {
  134. const video_tag = parseHTML(res.responseText).querySelector('.js-view-sample')
  135. const src = ['low', 'med', 'high']
  136. .map(i => video_tag.getAttribute('data-video-' + i))
  137. .find(i => i)
  138. console.log('r18', src)
  139. return src
  140. } catch (err) {
  141. console.log("获取r18视频地址出现错误", err)
  142. const src = ""
  143. return src
  144. }
  145.  
  146. }
  147. const dmm = async () => {
  148. const res = await request(
  149. `https://www.dmm.co.jp/search/=/searchstr=${avid}`
  150. )
  151. if (res.finalUrl == "http://www.dmm.co.jp/top/-/error/area/") {
  152. const src = ""
  153. return src
  154. }
  155. try {
  156. const video_tag = parseHTML(res.responseText).querySelector('.play-btn')
  157. const src = video_tag.getAttribute('href')
  158. console.log('dmm', src)
  159. return src
  160. } catch (err) {
  161. console.log('获取dmm视频出现错误:', err)
  162. const src = ""
  163. return src
  164. }
  165. }
  166. // erovi.jp
  167. const GoogleUrl = `https://www.google.com/search?num=6&q=allintitle:${avid} site:https://erovi.jp&safe=images&pws=0&lr=lang_ja`
  168. const erovi = async () => {
  169. const res = await gmFetch(GoogleUrl)
  170. const doc = parseHTML(res.responseText)
  171. if (doc.querySelector('#topstuff > div')) {
  172. let src = ""
  173. return src
  174. }
  175. const url = [...doc.querySelectorAll('.g .r a')].map(i => i.href)
  176. const regex = /https:\/\/erovi\.jp\/item\/.*\.html/gm;
  177. let m;
  178. let eroviLinks = []
  179. // filter match urls
  180. for (let i in url) {
  181. while ((m = regex.exec(url[i])) !== null) {
  182. if (m.index === regex.lastIndex) {
  183. regex.lastIndex++;
  184. }
  185. m.forEach((match, groupIndex) => {
  186. // console.log(`Found match, group ${groupIndex}: ${match}`);
  187. eroviLinks.push(match)
  188. });
  189. }
  190. }
  191. // request for video
  192. if (eroviLinks.length != 0) {
  193. try {
  194. const res2 = await gmFetch(eroviLinks[0])
  195. const src = parseHTML(res2.responseText).querySelector('video').src
  196. console.log('erovi.jp', src)
  197. return src
  198. } catch (err) {
  199. console.log("获取erovi.jp视频地址出现错误", err)
  200. const src = ""
  201. return src
  202. }
  203. }
  204. }
  205. let src
  206. var getVideo = false
  207. if (getVideo == false) {
  208. let r18src = await r18()
  209. if (r18src != "") {
  210. console.log("r18预览视频获取成功")
  211. src = srcs(r18src)
  212. getVideo = true
  213. } else {
  214. console.log("r18预览视频获取失败,尝试使用erovi.jp源,请确保代理能够访问该网站")
  215. }
  216. }
  217. if (getVideo == false) {
  218. let dmmsrc = await dmm()
  219. if (dmmsrc != "") {
  220. console.log("dmm预览视频获取成功")
  221. src = srcs(dmmsrc)
  222. getVideo = true
  223. } else {
  224. console.log("dmm预览视频获取失败,请检查IP是否为日本并确保番号正确")
  225. }
  226. }
  227.  
  228. if (getVideo == false) {
  229. let xrmoosrc = await xrmoo()
  230. if (xrmoosrc != "") {
  231. console.log("从 xrmoo 获取预览视频获取成功")
  232. src = srcs(xrmoosrc)
  233. getVideo = true
  234. } else {
  235. console.log("从 xrmoo 获取预览视频获取失败,尝试使用r18源,请确保代理能够访问该网站")
  236. }
  237. }
  238. if (getVideo == false) {
  239. let erovisrc = await erovi()
  240. if (erovisrc != "") {
  241. console.log("erovi.jp预览视频获取成功")
  242. src = srcs(erovisrc)
  243. getVideo = true
  244. } else {
  245. console.log("erovi.jp预览视频获取失败,请检查IP是否可访问该网站并确保番号正确")
  246. console.log("尝试使用dmm源,请切换为日本IP")
  247. }
  248. }
  249. const html = src
  250. ? `<video id=jav_preview style='postiton:absolute;z-order:1;display:none;width:85%' controls preload=true defaultMuted=false>${src}</video>`
  251. : '<div id=jav_preview class=header style="text-align:center;padding-top:1rem;">preview not found</div>'
  252. //$position.insertAdjacentHTML('afterBegin', html)
  253. if (javbus_domains.indexOf(domain) != -1) {
  254. //let thtml = `<a class="sample-box" href="${$imgTab}"><div class="photo-frame">${html}</div></a>`;
  255. //let thtml = `<a class="sample-box openVideo" href="#jav_preview"><div class="photo-frame"><img src="${$imgTab}" title=""></div></a>`;
  256. //$position.insertAdjacentHTML('afterBegin', thtml);
  257. $adtablePostiton.insertAdjacentHTML('beforeBegin',html);
  258.  
  259. let tmpA = document.querySelector('.bigImage');
  260. tmpA.insertAdjacentHTML('beforeBegin',`<a id='playBtnA' href='#jav_preview'><button id='playBtn' sytle="" ></button></a>`);
  261. tmpA.classList.add('openVideo');
  262. tmpA.href="#jav_preview";
  263.  
  264. document.querySelector('#playBtn').setAttribute("style","position: relative;background: rgba(0, 0, 0, .0);border: none;outline: none;height: 2em;width: 2em;font-size: 2em;cursor: pointer;content: '';position: absolute;top: 45%;left: 48%;height: 0;border-style: solid; border-width: 1em 0 1em 2em; border-color: transparent transparent transparent #e52d27; transition: 0.218s ease;");
  265.  
  266. $('.openVideo').magnificPopup({
  267. type: 'inline',
  268. callbacks: {
  269. open: function() {
  270. $('html').css('margin-right', 0);
  271. // Play video on open:
  272. let video = document.querySelector('#jav_preview');
  273. video.style.display = 'inline';
  274. video.play();
  275. let mfpContent = document.querySelector('.mfp-content');
  276. mfpContent.style.textAlign='center';
  277. },
  278. close: function() {
  279. // Reset video on close:
  280. let video = document.querySelector('#jav_preview');
  281. video.style.display = 'inline';
  282. video.pause();
  283. }
  284. }
  285. });
  286.  
  287. $('#playBtnA').magnificPopup({
  288. type: 'inline',
  289. callbacks: {
  290. open: function() {
  291. $('html').css('margin-right', 0);
  292. // Play video on open:
  293. let video = document.querySelector('#jav_preview');
  294. video.style.display = 'inline';
  295. video.play();
  296. let mfpContent = document.querySelector('.mfp-content');
  297. mfpContent.style.textAlign='center';
  298. },
  299. close: function() {
  300. // Reset video on close:
  301. let video = document.querySelector('#jav_preview');
  302. video.style.display = 'inline';
  303. video.pause();
  304. }
  305. }
  306. });
  307. }else{
  308. $position.insertAdjacentHTML('afterEnd', html)
  309. }
  310. //$position.innerHTML=html
  311. }
  312. addmeta()
  313. preview()