javlibrary_preview

preview from r18.com and pron.tv

Versión del día 20/04/2018. Echa un vistazo a la versión más reciente.

  1. // ==UserScript==
  2. // @name javlibrary_preview
  3. // @version 0.0.6
  4. // @include http*://*javlibrary.com/*/?v=*
  5. // @description preview from r18.com and pron.tv
  6. // @grant GM_xmlhttpRequest
  7. // @grant GM_download
  8. // @namespace https://greasyfork.org/users/164996a
  9. // ==/UserScript==
  10. // r18.com
  11. // insert position, no need to wait
  12. const $position = document.querySelector('#video_favorite_edit')
  13. const $social = $position.nextElementSibling
  14. if (!$position) return
  15. // GM_xmlhttpRequest promise wrapper
  16. const gmFetch = url => new Promise((resolve, reject) => {
  17. GM_xmlhttpRequest({ url: url, method: 'GET', onload: resolve, onerror: reject })
  18. })
  19.  
  20. const parseHTML = str => {
  21. const tmp = document.implementation.createHTMLDocument()
  22. tmp.body.innerHTML = str
  23. return tmp
  24. }
  25.  
  26. const avid = document.title.split(' ')[0]
  27.  
  28. const addToDoc = video_url => {
  29. const text = video_url
  30. ? `<video id='jav_r18' style='postiton:absolute;z-order:1' src=${video_url} controls autoplay></video>`
  31. : '<div class="header" style="text-align:center;padding-top:1rem;">preview not found</div>'
  32. $position.insertAdjacentHTML('afterend', text)
  33. }
  34.  
  35. const r18 = async () => {
  36. const res = await gmFetch(`http://www.r18.com/common/search/searchword=${avid}`)
  37. let video_url = ''
  38. try {
  39. const video_tag = parseHTML(res.responseText).querySelector('.js-view-sample')
  40. video_url = ['high', 'med', 'low'].map(i => video_tag.getAttribute('data-video-' + i)).find(i => i)
  41. } catch (err) { } finally {
  42. addToDoc(video_url)
  43. }
  44. }
  45. r18()
  46.  
  47. // porn.tv
  48. const Decrypt = () => {
  49. const base64_decode = atob
  50. const ord = r => (r + '').codePointAt(0)
  51. const hta = r => r.toString().match(/.{1,2}/g).reduce((a, c) => a + String.fromCharCode(parseInt(c, 16)), '')
  52. const strrev = r => [...r].reverse().join('')
  53. const strswpcs = r => [...r].map(i => i.match(/^[A-Za-z]$/) ? i === i.toLowerCase() ? i.toUpperCase() : i.toLowerCase() : i).join('')
  54. const decrypt = (r, t) => {
  55. let e = '', o = r.substring(0, 3)
  56. r = r.substring(3)
  57. '3' + aaa + 'f' == o ? (r = strrev(base64_decode(r))) : 'f' + bbb + '0' == o ? (r = hta(strrev(r))) : '6' + ccc + '3' == o ? (r = base64_decode(strrev(r))) : '5' + ddd + 'a' == o && (r = base64_decode(strswpcs(r)))
  58. for (let s = 0; s < r.length; s++) {
  59. let n = r.substr(s, 1), a = t.substr(s % t.length - 1, 1)
  60. n = Math.floor(ord(n) - ord(a))
  61. e += n = String.fromCharCode(n)
  62. }
  63. return e
  64. }
  65. let aaa, bbb, ccc, ddd, decryptStr
  66. return t => {
  67. ;[aaa, bbb, ccc, ddd] = ['aaa', 'bbb', 'ccc', 'ddd'].map(i => t.match(new RegExp(`${i}.*=.*(\\d+)`))[1])
  68. decryptStr = t.match(/document\.write\(decrypt\('(.*?)'.*?'(.*)'\)/)
  69. return decrypt(decryptStr[1].replace(/\\/g, ''), decryptStr[2])
  70. }
  71. }
  72.  
  73. const baseUrl = 'http://pron.tv'
  74. const fetchList = async () => {
  75. const d = Decrypt(), parser = new DOMParser()
  76. const res = await gmFetch(baseUrl + '/stream/' + avid)
  77. const doc = parseHTML(res.responseText)
  78. const url = [...doc.querySelectorAll('div.title > a')].map(i => baseUrl + i.pathname).slice(0,10)
  79. const inf = [...doc.querySelectorAll('.hoster')].map(i => i.childNodes[2].nodeValue.trim())
  80. const urlSet=new Set()
  81. url.forEach(async (i, index) => {
  82. try {
  83. const res = await gmFetch(i)
  84. // get video code and decrypt
  85. const html = d(res.responseText)
  86. // get iframe src
  87. const src = parser.parseFromString(html, "text/html").querySelector('iframe').getAttribute('src')
  88. if (urlSet.has(src)) return
  89. urlSet.add(src)
  90. // add to list
  91. requestAnimationFrame(() => {
  92. $social.insertAdjacentHTML('beforebegin', `
  93. <div style='display:flex'>
  94. <a href='${src}' target='_blank' style='display:block;width:30em;text-overflow:ellipsis;overflow: hidden;white-space: nowrap'>${src}</a>
  95. <span style='white-space: nowrap;'>${inf[index]}</span></div>`)
  96. })
  97. } catch (e) { }
  98. })
  99. }
  100. fetchList()