javlibrary_preview

perview video and links

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
  1. // ==UserScript==
  2. // @name javlibrary_preview
  3. // @version 0.0.22
  4. // @include http*://*javlibrary.com/*/?v=*
  5. // @description perview video and links
  6. // @grant GM_xmlhttpRequest
  7. // @connect google.com
  8. // @connect r18.com
  9. // @connect prestige-av.com
  10. // @connect dmm.co.jp
  11. // @namespace https://greasyfork.org/users/164996a
  12. // ==/UserScript==
  13. // insert position, no need to wait
  14. const $position = document.querySelector('#video_favorite_edit')
  15. if (!$position) return
  16. // Promise.race but for success
  17. const race = (promises) => {
  18. const newPromises = promises.map(
  19. (p) => new Promise((resolve, reject) => p.then((v) => v && resolve(v), reject))
  20. )
  21. newPromises.push(Promise.all(promises).then(() => false))
  22. return Promise.race(newPromises)
  23. }
  24. // GM_xmlhttpRequest promise wrapper
  25. const gmFetch = (url, { method = 'GET', headers, anonymous } = {}) =>
  26. new Promise((onload, onerror) => {
  27. GM_xmlhttpRequest({ url, method, headers, anonymous, onload, onerror })
  28. })
  29. const parseHTML = (str) => {
  30. const tmp = document.implementation.createHTMLDocument()
  31. tmp.body.innerHTML = str
  32. return tmp
  33. }
  34. const avid = document.title.replace(/([^-]+)-([^ ]+) .*/, '$1-$2')
  35. const preview = async () => {
  36. const check = async (src) => (await gmFetch(src, { method: 'head' })).status === 200
  37. const srcs = (src) =>
  38. ['dmb', 'dm', 'sm'].map((i) => src.replace(/_(dmb|dm|sm)_/, `_${i}_`))
  39. const r18 = async () => {
  40. try {
  41. const res = await gmFetch(
  42. `https://www.r18.com/common/search/order=match/searchword=${avid}`
  43. )
  44. const video_tag = parseHTML(res.responseText).querySelector('.js-view-sample')
  45. const src = ['high', 'med', 'low']
  46. .map((i) => video_tag.getAttribute('data-video-' + i))
  47. .find((i) => i)
  48. for (let i of srcs(src)) {
  49. if (await check(i)) {
  50. console.log('r18', i)
  51. return i
  52. }
  53. }
  54. } catch (_) {}
  55. }
  56. const prestige = async () => {
  57. try {
  58. const res = await gmFetch(
  59. `https://www.prestige-av.com/goods/goods_list.php?q=${avid}&m=search&p=1&s=date`
  60. )
  61. const dom = parseHTML(res.responseText)
  62. const url = dom.querySelectorAll('#body_goods > ul > li > a')
  63. const name = [...url].map((i) =>
  64. new URL(i.href).searchParams.get('sku').toUpperCase()
  65. )
  66. for (let n of name) {
  67. n = 'https://www.prestige-av.com/sample_movie/' + n + '.mp4'
  68. if (await check(n)) {
  69. console.log('prestige', n)
  70. return n
  71. }
  72. }
  73. } catch (_) {}
  74. }
  75. const dmm = async () => {
  76. try {
  77. const res = await gmFetch(`https://www.dmm.co.jp/search/=/searchstr=${avid}`, {
  78. anonymous: true,
  79. headers: { 'User-Agent': 'Android' },
  80. })
  81. const dom = parseHTML(res.responseText)
  82. const src = dom.querySelector('a.play-btn').href
  83. for (let i of srcs(src)) {
  84. if (await check(i)) {
  85. console.log('dmm', i)
  86. return i
  87. }
  88. }
  89. } catch (_) {}
  90. }
  91. let src = await race([r18(), prestige(), dmm()])
  92. const html = src
  93. ? `<video id=jav_preview style='postiton:absolute;z-order:1' controls autoplay><source src=${src}></source></video>`
  94. : '<div id=jav_preview class=header style="text-align:center;padding-top:1rem;">preview not found</div>'
  95. $position.insertAdjacentHTML('afterend', html)
  96. }
  97. preview()
  98. // google
  99. const num = 6
  100. const baseUrl = `https://www.google.com/search?tbm=vid&num=${num}&safe=images&pws=0&lr=lang_en\
  101. &as_eq=youtube.com+javlibrary.com+pron.tv+dailymotion.com+facebook.com+google.com&q=`
  102. const fetchList = async () => {
  103. const res = await gmFetch(baseUrl + avid)
  104. const doc = parseHTML(res.responseText)
  105. const url = [...doc.querySelectorAll('.g .r a')].map((i) => i.href)
  106. url.forEach((src) => {
  107. requestAnimationFrame(() => {
  108. ;(document.getElementById('jav_preview') || $position).insertAdjacentHTML(
  109. 'afterend',
  110. `<div style='display:flex'>
  111. <a href='${src}' target='_blank' style='display:block;width:41em;text-overflow:ellipsis;overflow: hidden;white-space: nowrap'>${src}</a>
  112. </div>`
  113. )
  114. })
  115. })
  116. }
  117. // extra search button
  118. $position.insertAdjacentHTML(
  119. 'afterend',
  120. `<button id=jav_perview_extra class=smallbutton style=\
  121. 'padding:0.5em;display:block;margin-top:0.5em'>extra search from google</button>`
  122. )
  123. const b = document.querySelector('#jav_perview_extra')
  124. b.addEventListener('click', () => {
  125. b.style.display = 'none'
  126. fetchList()
  127. })