// ==UserScript== // @name PTH Torrent quickview // @version 0.6 // @description Add a hover that shows the album art and files for a torrent from the artist page // @author Chameleon // @include http*://redacted.ch/artist.php?id=* // @include http*://redacted.ch/torrents.php?id=* // @grant none // @namespace https://greasyfork.org/users/87476 // @downloadURL https://update.greasyfork.icu/scripts/25763/PTH%20Torrent%20quickview.user.js // @updateURL https://update.greasyfork.icu/scripts/25763/PTH%20Torrent%20quickview.meta.js // ==/UserScript== (function() { 'use strict'; var torrents = document.getElementsByClassName('torrent_row'); for(var i=0; i 1) torrentid = torrentid[1]; else torrentid=torrentLink.outerHTML.split("#torrent_")[1].split("'")[0]; t.addEventListener('mouseover', mouseOver.bind(undefined, t, torrentid, groupid), false); t.addEventListener('mouseout', mouseOut.bind(undefined, t, torrentid), false); } })(); function mouseOver(tr, torrentid, groupid, event) { if(event.shiftKey) return; var div=document.getElementById('quickview_'+torrentid); if(!div) { div=document.createElement('div'); document.body.appendChild(div); div.setAttribute('id', 'quickview_'+torrentid); var rect=tr.getBoundingClientRect(); var top=rect.top+window.scrollY-50; var width=500; var leftOffset=50; var left=rect.left+window.scrollX-width+leftOffset-20; if(left < leftOffset) left=leftOffset; div.setAttribute('style', 'position: absolute; top: '+top+'px; left: '+left+'px; width: '+(width-leftOffset)+'px; background: black; color: white; border-radius: 10px; padding: 10px; z-index: 1000;'); div.innerHTML = 'Loading data'; div.addEventListener('mouseout', mouseOut.bind(undefined, tr, torrentid), false); } var dataDiv=document.getElementById('quickviewData_'+groupid); if(!dataDiv) { loadData(groupid, torrentid, div); return; } showData(dataDiv); } function loadData(groupid, torrentid, messageDiv) { var dataDiv = document.getElementById('quickviewData_'+groupid); if(!dataDiv) { dataDiv = document.createElement('div'); dataDiv.setAttribute('id', 'quickviewData_'+groupid); dataDiv.setAttribute('style', 'display: none;'); document.body.appendChild(dataDiv); dataDiv.setAttribute('loading', 'true'); } if(window.location.href.indexOf('torrents.php') == -1) { var xhr = new XMLHttpRequest(); xhr.open('GET', '/torrents.php?id='+groupid); xhr.onreadystatechange = xhr_func.bind(undefined, messageDiv, xhr, gotGroup.bind(undefined, groupid, torrentid, dataDiv), loadData.bind(undefined, groupid, torrentid, messageDiv)); xhr.send(); } else { gotGroup(groupid, torrentid, dataDiv, document.body.innerHTML); } } function gotGroup(groupid, torrentid, dataDiv, response) { var div=document.implementation.createHTMLDocument(); div.body.innerHTML = response; var result={}; var h2=div.getElementsByTagName('h2')[0]; result.artist = h2.getElementsByTagName('a')[0].innerHTML; result.album = h2.getElementsByTagName('span')[0].innerHTML; result.year = parseInt(h2.textContent.split('[')[1]); var art = div.getElementById('cover_div_0'); if(art) result.albumArt = art.getElementsByTagName('img')[0].src; result.torrents = []; var details = div.getElementsByClassName('torrentdetails'); for(var i=0; i
'+data.artist+'
'+data.year; var torrents = document.createElement('div'); div.appendChild(torrents); for(var i=0; i= 350) { while(span.clientWidth >= 350) { span.innerHTML = span.innerHTML.slice(0, -4)+'...'; count++; if(count > 100) break; } } else { span.innerHTML = span.innerHTML.slice(0, -3); } var span = document.createElement('span'); d.appendChild(span); span.innerHTML = f.size; span.setAttribute('style', 'float: right;'); } } function mouseOut(tr, torrentid, event) { var div=document.getElementById('quickview_'+torrentid); if(event.relatedTarget == tr || isDescendant(div, event.relatedTarget) || event.relatedTarget == div) return; document.body.removeChild(div); } function xhr_func(messageDiv, xhr, func, repeatFunc) { if(xhr.readyState == 4) { if(xhr.status == 200) func(xhr.responseText); else { messageDiv.innerHTML = 'Error: '+xhr.status+'
retrying in 1 second'; window.setTimeout(repeatFunc, 1000); } } } function isDescendant(parent, child) { var node = child.parentNode; while(node != null) { if(node == parent) return true; node = node.parentNode; } return false; }