🏠 Home 

PTH Preview Tracks

Embed youtube clips for the tracks of a torrent group


Install this script?
// ==UserScript==
// @name         PTH Preview Tracks
// @version      3.0
// @description  Embed youtube clips for the tracks of a torrent group
// @author       Chameleon
// @include      http*://redacted.ch/torrents.php?*id=*
// @include      http*://redacted.ch/index.php
// @include      http*://redacted.ch/*threadid=1837*
// @grant        GM_xmlhttpRequest
// @connect      youtube.com
// @namespace https://greasyfork.org/users/87476
// ==/UserScript==
(function() {
'use strict';
if(!document.hidden)
run();
else
document.addEventListener('visibilitychange', visibilityChanged);
}());
var scriptLoaded=false;
function visibilityChanged()
{
if(!document.hidden && !scriptLoaded)
{
run();
scriptLoaded=true;
}
}
function run()
{
//console.log(document.hidden);
var settings=getSettings();
if(settings.useYoutubeAPI)
{
// include youtube's elephant of an API
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// stop including
}
var wH=window.location.href;
if(wH.indexOf('index.php') != -1 && settings.useYoutubeAPI && settings.masterPlayer)
{
loadPlayer();
}
else if(wH.indexOf('torrents.php') != -1)
loadTorrent();
else if(wH.indexOf('threadid=1837') != -1)
showSettings();
}
function showSettings()
{
var div=document.getElementById('ChameleonSettings');
if(!div)
{
var before = document.getElementsByClassName('forum_post')[0];
div = document.createElement('div');
div.setAttribute('id', 'ChameleonSettings');
before.parentNode.insertBefore(div, before);
div.setAttribute('style', 'width: 100%; text-align: center; padding-bottom: 10px;');
div.setAttribute('class', 'box');
}
div.innerHTML = '<h2>Preview Tracks Settings</h2><br />';
var settings = getSettings();
var a=document.createElement('a');
a.href='javascript:void(0);';
a.innerHTML = 'Master player on /index.php: '+(settings.masterPlayer ? 'On':'Off');
a.addEventListener('click', changeSettings.bind(undefined, a, div), false);
div.appendChild(a);
div.appendChild(document.createElement('br'));
var a=document.createElement('a');
a.href='javascript:void(0);';
a.innerHTML = 'Youtube API: '+(settings.useYoutubeAPI ? 'On':'Off');
a.addEventListener('click', changeSettings.bind(undefined, a, div), false);
div.appendChild(a);
div.appendChild(document.createElement('br'));
var a=document.createElement('a');
a.href='javascript:void(0);';
a.innerHTML = 'Minimize Track Preview: '+(settings.hideTrackPreview ? 'On':'Off');
a.addEventListener('click', changeSettings.bind(undefined, a, div), false);
div.appendChild(a);
div.appendChild(document.createElement('br'));
var a=document.createElement('a');
a.href='javascript:void(0);';
a.innerHTML = 'Force show separate preview area: '+(settings.alwaysShowExtraBox ? 'On':'Off');
a.addEventListener('click', changeSettings.bind(undefined, a, div), false);
div.appendChild(a);
div.appendChild(document.createElement('br'));
var input=document.createElement('input');
input.placeholder = 'Youtube quality';
input.value=settings.quality ? settings.quality:'';
input.addEventListener('change', changeSettings.bind(undefined, undefined, div), false);
div.appendChild(input);
div.appendChild(document.createElement('br'));
var input=document.createElement('input');
input.placeholder = 'Youtube volume';
input.type='number';
input.value=settings.volume ? settings.volume:'';
input.addEventListener('change', changeSettings.bind(undefined, undefined, div), false);
div.appendChild(input);
div.appendChild(document.createElement('br'));
var input=document.createElement('input');
input.placeholder = 'API Key';
input.value=settings.apiKey ? settings.apiKey:'AIzaSyBkMKh0dR1lWSrr2Bia_JdRc1kv7Nue8H8';
input.addEventListener('change', changeSettings.bind(undefined, undefined, div), false);
div.appendChild(input);
div.appendChild(document.createElement('br'));
var a=document.createElement('a');
div.appendChild(a);
a.href='javascript:void(0);';
a.innerHTML = 'Save';
}
function changeSettings(a, div)
{
var settings=getSettings();
var as=div.getElementsByTagName('a');
if(a == as[0])
{
if(as[0].innerHTML.indexOf('Off') != -1)
{
settings.masterPlayer = true;
}
else
settings.masterPlayer = false;
}
if(a == as[1])
{
if(as[1].innerHTML.indexOf('Off') != -1)
{
settings.useYoutubeAPI = true;
}
else
settings.useYoutubeAPI = false;
}
if(a == as[2])
{
if(as[2].innerHTML.indexOf('Off') != -1)
{
settings.hideTrackPreview = true;
}
else
settings.hideTrackPreview = false;
}
if(a == as[3])
{
if(as[3].innerHTML.indexOf('Off') != -1)
{
settings.alwaysShowExtraBox = true;
}
else
settings.alwaysShowExtraBox = false;
}
var inputs=div.getElementsByTagName('input');
settings.quality=inputs[0].value;
settings.volume=inputs[1].value;
settings.apiKey=inputs[2].value;
window.localStorage.previewTracksSettings = JSON.stringify(settings);
showSettings();
}
function getSettings()
{
var settings = window.localStorage.previewTracksSettings;
if(!settings)
{
settings = {masterPlayer:false, useYoutubeAPI:true, alwaysShowExtraBox:false};
}
else
settings = JSON.parse(settings);
if(settings.useYoutubeAPI !== false)
settings.useYoutubeAPI=true;
return settings;
}
function waitForYT(messageDiv)
{
messageDiv.innerHTML = 'Waiting on Youtube API to load';
window.setTimeout(loadPlayer.bind(undefined, messageDiv), 1000);
}
function loadPlayer(messageDiv)
{
var div=document.getElementById('youtubePlayerDiv');
var thin=document.getElementsByClassName('thin')[0];
if(!div)
{
div=document.createElement('div');
div.setAttribute('id', 'youtubePlayerDiv');
div.setAttribute('style', 'background: rgba(0,0,200,0.5); text-align: center; border-radius: 20px; padding-bottom: 10px;');
thin.insertBefore(div, thin.firstElementChild);
var messageDiv=document.createElement('div');
div.appendChild(messageDiv);
}
if(typeof(YT) == "undefined")
{
waitForYT(messageDiv);
return;
}
messageDiv.innerHTML = '';
var header=document.createElement('div');
div.appendChild(header);
var youtubeDiv=document.createElement('div');
youtubeDiv.setAttribute('id', 'playlistPlayer');
div.appendChild(youtubeDiv);
var playlist=getPlaylist();
var youtube;
if(playlist.length === 0)
{
messageDiv.innerHTML = 'no videos to play ';
var a=document.createElement('a');
messageDiv.appendChild(a);
a.innerHTML = 'Reload playlist';
a.href='javascript:void(0);';
a.addEventListener('click', loadPlayer.bind(undefined, messageDiv), false);
return;
}
else if(!playlist[0].track)
{
messageDiv.innerHTML = 'Old playlist, ';
var a=document.createElement('a');
messageDiv.appendChild(a);
a.innerHTML = 'clear it and rebuild';
a.href='javascript:void(0);';
a.addEventListener('click', clearAndLoadPlayer.bind(undefined, messageDiv), false);
return;
}
else
{
/*var width = thin.clientWidth-20;
var height = Math.round(width/(16/9));
youtube=new YT.Player('playlistPlayer', {
height: height,
width: width,
events: {'onReady': playerReady, 'onStateChange': playerStateChanged.bind(undefined, messageDiv)}});*/
playPlaylistVideo(messageDiv, youtube);
}
var a=document.createElement('a');
a.innerHTML = 'Go to start of playlist';
a.href='javascript:void(0);';
header.appendChild(a);
a.addEventListener('click', playlistResetIndex.bind(undefined, messageDiv, youtube), false);
header.appendChild(document.createTextNode(' | '));
var a=document.createElement('a');
a.innerHTML = 'Clear playlist';
a.href='javascript:void(0);';
header.appendChild(a);
a.addEventListener('click', playlistReset.bind(undefined, messageDiv, youtube), false);
header.appendChild(document.createTextNode(' | '));
var a=document.createElement('a');
a.innerHTML = 'Play';
a.href='javascript:void(0);';
header.appendChild(a);
a.addEventListener('click', playPlaylistVideo.bind(undefined, messageDiv, youtube), false);
header.appendChild(document.createTextNode(' | '));
var a=document.createElement('a');
a.innerHTML = 'Next';
a.href='javascript:void(0);';
header.appendChild(a);
a.addEventListener('click', playNextPlaylistVideo.bind(undefined, messageDiv, youtube), false);
header.appendChild(document.createTextNode(' | '));
var a=document.createElement('a');
a.innerHTML = 'Previous';
a.href='javascript:void(0);';
header.appendChild(a);
a.addEventListener('click', playPrevPlaylistVideo.bind(undefined, messageDiv, youtube), false);
header.appendChild(document.createTextNode(' | '));
var a=document.createElement('a');
a.innerHTML = 'Show playlist';
a.href='javascript:void(0);';
header.appendChild(a);
a.addEventListener('click', showPlaylist.bind(undefined, messageDiv), false);
}
function showPlaylist(messageDiv, onlyifopen)
{
var div=document.getElementById('playlistDiv');
if(!div && onlyifopen=="yes")
{
div=document.createElement('div');
div.setAttribute('id', 'playlistDiv');
div.setAttribute('style', 'margin: 10px; background: rgba(0,0,0,0.6); padding: 10px; border-radius: 10px;');
var thin=document.getElementsByClassName('thin')[0];
thin.insertBefore(div, thin.firstElementChild.nextElementSibling);
}
div.innerHTML = '';
var headers=["", "", "Track", "Artist", "Album"];
var baseHeaderStyle="display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;";
var headersStyle=["width: 80px;", "width: 30px;", "width: 300px;", "width: 200px; text-align: center;", "width:200px; text-align: center;"];
var hStyle="text-align: center;";
var header=document.createElement('div');
div.appendChild(header);
for(var i=0; i<headers.length; i++)
{
var span=document.createElement('span');
header.appendChild(span);
span.innerHTML=headers[i];
span.setAttribute('style', baseHeaderStyle+headersStyle[i]+hStyle);
}
var playlist=getPlaylist();
var playlistIndex=getPlaylistIndex();
for(var i=0; i<playlist.length; i++)
{
var p=playlist[i];
var pDiv=document.createElement('div');
pDiv.setAttribute('playlistItem', JSON.stringify(p));
if(i===parseInt(playlistIndex))
{
pDiv.setAttribute('style', 'background: rgba(0,128,128,0.5);');
}
div.appendChild(pDiv);
var span=document.createElement('span');
span.setAttribute('style', baseHeaderStyle+headersStyle[0]);
pDiv.appendChild(span);
//span.innerHTML = "Up / Down";
var a=document.createElement('a');
span.appendChild(a);
a.innerHTML = '-';
a.href='javascript:void(0);';
a.addEventListener('click', removePlaylist.bind(undefined, messageDiv, i), false);
span.appendChild(document.createTextNode(' / '));
var a=document.createElement('a');
span.appendChild(a);
a.innerHTML = 'Up';
a.href='javascript:void(0);';
a.addEventListener('click', movePlaylistUp.bind(undefined, messageDiv, i), false);
span.appendChild(document.createTextNode(' / '));
var a=document.createElement('a');
span.appendChild(a);
a.innerHTML = 'Down';
a.href='javascript:void(0);';
a.addEventListener('click', movePlaylistDown.bind(undefined, messageDiv, i), false);
var span=document.createElement('span');
span.setAttribute('style', baseHeaderStyle+headersStyle[1]);
pDiv.appendChild(span);
span.innerHTML = i+1;
var span=document.createElement('a');
span.setAttribute('style', baseHeaderStyle+headersStyle[2]);
pDiv.appendChild(span);
span.innerHTML = p.track;
span.href='javascript:void(0);';
span.addEventListener('click', playIndex.bind(undefined, messageDiv, i), false);
var span=document.createElement('span');
span.setAttribute('style', baseHeaderStyle+headersStyle[3]);
pDiv.appendChild(span);
span.innerHTML = p.artist === '' ? '<Unknown>':p.artist;
var span=document.createElement('span');
span.setAttribute('style', baseHeaderStyle+headersStyle[4]);
pDiv.appendChild(span);
span.innerHTML = p.album;
}
}
function removePlaylist(messageDiv, index)
{
var playlist=getPlaylist();
playlist.splice(index, 1);
savePlaylist(playlist);
showPlaylist(messageDiv);
}
function movePlaylistUp(messageDiv, index)
{
if(index === 0)
return;
var playlist=getPlaylist();
playlist.splice(index-1, 0, playlist.splice(index, 1)[0]);
if(index === parseInt(getPlaylistIndex()))
setPlaylistIndex(index-1);
savePlaylist(playlist);
showPlaylist(messageDiv);
}
function movePlaylistDown(messageDiv, index)
{
var playlist=getPlaylist();
if(index > playlist.length-2)
return;
playlist.splice(index+1, 0, playlist.splice(index, 1)[0]);
if(index === parseInt(getPlaylistIndex()))
setPlaylistIndex(index+1);
savePlaylist(playlist);
showPlaylist(messageDiv);
}
function playIndex(messageDiv, index)
{
setPlaylistIndex(index);
playPlaylistVideo(messageDiv);
}
function clearAndLoadPlayer(messageDiv)
{
playlistReset(messageDiv);
loadPlayer(messageDiv);
}
function playNextPlaylistVideo(messageDiv)
{
setPlaylistIndex(parseInt(getPlaylistIndex())+1);
playPlaylistVideo(messageDiv);
}
function playPrevPlaylistVideo(messageDiv)
{
var index=parseInt(getPlaylistIndex())-1;
if(index<0)
index=0;
setPlaylistIndex(index);
playPlaylistVideo(messageDiv);
}
function playlistReset(messageDiv)
{
savePlaylist([]);
setPlaylistIndex(0);
}
function playlistResetIndex(messageDiv)
{
setPlaylistIndex(0);
playPlaylistVideo(messageDiv);
}
function playPlaylistVideo(messageDiv)
{
messageDiv.innerHTML = 'loading video';
var index=getPlaylistIndex();
var playlist=getPlaylist();
if(index >= playlist.length)
{
messageDiv.innerHTML = 'Finished playlist';
return;
}
showPlaylist(messageDiv, "yes");
var settings=getSettings();
var search=encodeURIComponent((playlist[index].artist+' '+playlist[index].track).trim());
var xhr = new XMLHttpRequest();
var apikey=settings.apiKey?settings.apiKey:'AIzaSyBkMKh0dR1lWSrr2Bia_JdRc1kv7Nue8H8';
xhr.open('GET', "https://www.googleapis.com/youtube/v3/search?part=snippet&order=relevance&type=video&key="+apikey+"&q="+search);
xhr.onreadystatechange = xhr_func.bind(undefined, messageDiv, xhr, playPlayer.bind(undefined, messageDiv), playPlaylistVideo.bind(undefined, messageDiv));
xhr.send();
}
function playPlayer(messageDiv, response)
{
messageDiv.innerHTML = 'Got videos';
/*if(typeof(youtube.loadVideoById) == "undefined")
{
window.setTimeout(playPlayer.bind(undefined, messageDiv, youtube, response), 500);
return;
}*/
var data=JSON.parse(response);
if(data.items.length === 0)
{
messageDiv.innerHTML = "Couldn't find any videos :(";
window.setTimeout(clear.bind(undefined, messageDiv), 5000);
setPlaylistIndex(parseInt(getPlaylistIndex())+1);
return;
}
var videoId=data.items[0].id.videoId;
var iframe = document.getElementById('playlistPlayer');
var t=iframe.parentNode;
var prev=document.getElementById('playlistPlayer');
if(prev)
prev.parentNode.removeChild(prev);
iframe=document.createElement('div');
iframe.setAttribute('id', 'playlistPlayer');
t.appendChild(iframe);
var width = iframe.parentNode.clientWidth-20;
var height = Math.round(width/(16/9));
console.log(videoId);
console.log(YT);
new YT.Player('playlistPlayer', {
height: height,
width: width,
videoId: videoId,
events: {'onReady': playerReady, 'onStateChange': playerStateChanged.bind(undefined, messageDiv)}});
}
function playerReady(event)
{
event.target.playVideo();
var settings=getSettings();
if(settings.quality && settings.quality.length > '')
event.target.setPlaybackQuality(settings.quality);
}
function playerStateChanged(messageDiv, event)
{
if(event.target.getPlayerState() === 0)
{
setPlaylistIndex(parseInt(getPlaylistIndex())+1);
playPlaylistVideo(messageDiv);
}
if(event.data == YT.PlayerState.BUFFERING)
{
var settings=getSettings();
if(settings.quality && settings.quality.length > '')
event.target.setPlaybackQuality(settings.quality);
if(settings.volume)
event.target.setVolume(settings.volume);
}
}
function getPlaylistIndex()
{
var playlistIndex=window.localStorage.youtubeIndex;
if(!playlistIndex)
playlistIndex=0;
return playlistIndex;
}
function setPlaylistIndex(index)
{
window.localStorage.youtubeIndex=index;
}
function getPlaylist()
{
var playlist=window.localStorage.youtubePlaylist;
if(!playlist)
playlist=[];
else
playlist=JSON.parse(playlist);
return playlist;
}
function savePlaylist(playlist)
{
window.localStorage.youtubePlaylist = JSON.stringify(playlist);
}
function loadTorrent()
{
var settings=getSettings();
var h2 = document.getElementsByTagName('h2')[0];
var artist = h2.getElementsByTagName('a');
if(artist.length > 0)
artist = artist[0].innerHTML;
else
artist = '';
var tracks = document.getElementsByClassName('torrent_description')[0].getElementsByClassName('postlist');
var tD=document.getElementsByClassName('torrent_description')[0].textContent;
if(tD.indexOf('discogs.com') != -1 && tD.indexOf('/release/') != -1)
{
var discogs_release=parseInt(tD.split('/release/')[1]);
doDiscogs(discogs_release);
}
else if(tracks.length > 0 && !settings.alwaysShowExtraBox)
{
var s=document.createElement('span');
var a=document.createElement('a');
s.appendChild(a);
a.innerHTML = 'Close Videos';
a.href='javascript:void(0);';
a.addEventListener('click', closeIframes, false);
tracks[0].parentNode.insertBefore(s, tracks[0]);
tracks=tracks[0].getElementsByTagName('li');
if(settings.useYoutubeAPI)
{
var a=document.createElement('a');
s.appendChild(document.createTextNode(' '));
s.appendChild(a);
a.innerHTML = '(enqueue all)';
a.href='javascript:void(0);';
var album=h2.getElementsByTagName('span')[0].textContent;
a.addEventListener('click', enqueueTracks.bind(undefined, a, tracks, artist, album), false);
}
doTracks(artist, tracks);
}
else
{
tracks=makePreview(getTracks);
doTracks(artist, tracks);
}
}
function doDiscogs(id)
{
var messageDiv=document.getElementById('previewTracksMessages');
if(!messageDiv)
{
messageDiv=document.createElement('div');
messageDiv.setAttribute('style', 'position: fixed; background: rgba(0,0,0,0.7); top: 50px; margin: auto; left: 0; right: 0; text-align: center; font-size: 2em;');
messageDiv.setAttribute('id', 'previewTracksMessages');
document.body.appendChild(messageDiv);
}
messageDiv.innerHTML = 'Getting tracklist from discogs.com';
var xhr = new XMLHttpRequest();
xhr.open('GET', "https://api.discogs.com/releases/"+id);
xhr.onreadystatechange = xhr_func.bind(undefined, messageDiv, xhr, gotDiscogs.bind(undefined, messageDiv), doDiscogs.bind(undefined, id));
xhr.send();
}
function gotDiscogs(messageDiv, response)
{
messageDiv.innerHTML = '';
var r=JSON.parse(response);
console.log(r.tracklist);
var tracks=makePreview(getDiscogTracks.bind(undefined, r.tracklist));
doTracks(r.artists[0].name.split('(')[0], tracks);
}
function getDiscogTracks(tracks)
{
var r###lt=[];
for(var i=0; i<tracks.length; i++)
{
if(tracks[i].title.length > 0)
r###lt.push(tracks[i].title);
}
return r###lt;
}
function doTracks(artist, tracks)
{
var settings=getSettings();
for(var i=0; i<tracks.length; i++)
{
var input=document.createElement('input');
var t=tracks[i];
var track=t.textContent;
input.value=(artist+' '+track).trim();
t.innerHTML = '';
var span=document.createElement('span');
var a=document.createElement('a');
a.href='javascript:void(0);';
a.setAttribute('class', 'previewLinks');
a.innerHTML = track;
a.addEventListener('click', preview.bind(undefined, a, t, span, artist, track, i, input), false);
t.appendChild(a);
t.appendChild(document.createTextNode(' '));
if(settings.useYoutubeAPI)
{
var a=document.createElement('a');
a.href='javascript:void(0);';
a.innerHTML = '(enqueue)';
var album=document.getElementsByTagName('h2')[0].getElementsByTagName('span')[0].textContent;
a.addEventListener('click', enqueueTrack.bind(undefined, a, artist, track, album), false);
t.appendChild(a);
t.appendChild(document.createTextNode(' '));
}
var a=document.createElement('a');
a.href='javascript:void(0);';
a.innerHTML = '(show search)';
a.addEventListener('click', toggleShow.bind(undefined, input, a), false);
t.appendChild(a);
t.appendChild(document.createTextNode(' '));
t.appendChild(input);
input.style.display='none';
t.appendChild(span);
}
}
function toggleShow(el, link)
{
if(el.style.display=='none')
{
link.innerHTML=link.innerHTML.replace(/show/, 'hide');
el.style.display='';
}
else
{
link.innerHTML=link.innerHTML.replace(/hide/, 'show');
el.style.display='none';
}
}
function enqueueTrack(a, artist, track, album)
{
var playlist=getPlaylist();
playlist.push({artist:artist, album:album, track:track});
savePlaylist(playlist);
a.innerHTML = '(enqueued)';
}
function enqueueTracks(a, trackLis, artist, album)
{
var playlist=getPlaylist();
for(var i=0; i<trackLis.length; i++)
{
playlist.push({artist:artist, album:album, track:trackLis[i].getElementsByTagName('a')[0].textContent.trim()});
}
savePlaylist(playlist);
a.innerHTML='(enqueued all)';
}
function closeIframes()
{
var prev=document.getElementById('previewIframe');
if(prev)
prev.parentNode.removeChild(prev);
}
function toggle(div)
{
if(div.style.display == 'none')
div.style.display = 'initial';
else
div.style.display = 'none';
}
function makePreview(getTracksFunc)
{
var settings=getSettings();
var div=document.createElement('div');
div.setAttribute('class', 'box torrent_description');
var before=document.getElementsByClassName('torrent_description')[0];
before.parentNode.insertBefore(div, before);
var clone=before.getElementsByClassName('head')[0].cloneNode(true);
div.appendChild(clone);
clone.getElementsByTagName('strong')[0].innerHTML = 'Track Preview';
var body=document.createElement('div');
if(settings.hideTrackPreview)
body.style.display='none';
var a=document.createElement('a');
a.href='javascript:void(0);';
a.innerHTML = '(toggle)';
clone.appendChild(document.createTextNode(' '));
clone.appendChild(a);
a.addEventListener('click', toggle.bind(undefined, body), false);
var a=document.createElement('a');
a.setAttribute('style', 'float: right;');
a.innerHTML='Settings';
a.href='/forums.php?action=viewthread&threadid=1837';
clone.appendChild(a);
div.appendChild(body);
body.setAttribute('class', 'body');
body.innerHTML = 'Track List:<br />';
var a=document.createElement('a');
a.innerHTML = 'Close Videos';
a.href='javascript:void(0);';
a.addEventListener('click', closeIframes, false);
body.appendChild(a);
var tracks=getTracksFunc();
if(settings.useYoutubeAPI)
{
var a=document.createElement('a');
body.appendChild(document.createTextNode(' '));
body.appendChild(a);
a.innerHTML = '(enqueue all)';
a.href='javascript:void(0);';
}
var ol=document.createElement('ol');
ol.setAttribute('class', 'postlist');
body.appendChild(ol);
var r###lt = [];
for(var i=0; i<tracks.length; i++)
{
var li=document.createElement('li');
li.innerHTML = tracks[i];
ol.appendChild(li);
r###lt.push(li);
}
if(settings.useYoutubeAPI)
{
var h2 = document.getElementsByTagName('h2')[0];
var artist = h2.getElementsByTagName('a');
if(artist.length > 0)
artist = artist[0].innerHTML;
else
artist = '';
var album=h2.getElementsByTagName('span')[0].textContent;
a.addEventListener('click', enqueueTracks.bind(undefined, a, r###lt, artist, album), false);
}
return r###lt;
}
function getTracks(offset)
{
if(!offset)
offset=0;
var torrent_row = document.getElementsByClassName('torrent_row')[offset];
var type = torrent_row.getElementsByTagName('a');
type = type[type.length-1].innerHTML.split(' / ')[0].toLowerCase();
var filelist = document.getElementsByClassName('filelist_table')[offset].getElementsByTagName('tr');
var files=[];
for(var i=1; i<filelist.length; i++)
{
var f=filelist[i].getElementsByTagName('td')[0].innerHTML;
if(f.indexOf(type) != f.length-type.length)
continue;
var f1 = f.split('/');
if(f1.length > 1)
f=f1[f1.length-1];
f1 = f.split(f.match(/\d+/));
if(f1.length > 1)
f=f1[1];
f = f.replace(/^[0-9]+\.?/, '').replace(/ - /g, ' ').replace(new RegExp("."+type), '').replace(/_/g, ' ').replace(/-/g, ' ');
var artist = document.getElementsByTagName('h2')[0].getElementsByTagName('a');
if(artist.length > 0)
artist = artist[0].innerHTML;
else
artist='';
var l=f.toLowerCase().indexOf(artist.toLowerCase());
if( l != -1)
f=f.substr(0, l)+f.substr(l+artist.length);
//f = f.split('(')[0];
files.push(f);
}
if(files.length === 0)
return getTracks(offset+1);
return files;
}
function preview(a, t, span, artist, track, index1, input)
{
var existingSearch=a.getAttribute('search');
if(existingSearch == input.value)
{
var videoIds = t.getAttribute('videoIds');
if(videoIds)
{
var index = parseInt(t.getAttribute('index'));
videoIds = JSON.parse(videoIds);
if(index >= videoIds.length)
{
span.innerHTML = 'Already on last video';
window.setTimeout(clear.bind(undefined, span), 5000);
return;
}
addEmbed(t, span, videoIds[index]);
t.setAttribute('index', index+1);
return;
}
}
a.setAttribute('search', input.value);
t.parentNode.setAttribute('index', index1);
span.innerHTML = 'Getting videos';
//track = track.split('(')[0];
var xhr = new XMLHttpRequest();
var settings=getSettings();
var apikey=settings.apiKey?settings.apiKey:'AIzaSyBkMKh0dR1lWSrr2Bia_JdRc1kv7Nue8H8';
var search=input.value.trim();
//xhr.open('GET', "https://gdata.youtube.com/feeds/api/videos?v=2&alt=json&orderby=relevance&q="+encodeURIComponent(artist+' '+track));
//xhr.open('GET', "https://www.googleapis.com/youtube/v3/search?part=snippet&order=relevance&type=video&key="+apikey+"&q="+encodeURIComponent(search));
/*console.log('https://www.youtube.com/r###lts?search_query='+encodeURIComponent(search));
return;
xhr.open('GET', 'https://www.youtube.com/r###lts?search_query='+encodeURIComponent(search));
xhr.onreadystatechange = xhr_func.bind(undefined, span, xhr, previewing.bind(undefined, t, span), preview.bind(undefined, a, t, span, artist, track, input));
xhr.send();
*/
GM_xmlhttpRequest({
method:'GET',
url:'https://www.youtube.com/r###lts?search_query='+encodeURIComponent(search),
onload:function(xhr)
{
if(xhr.readyState == 4 && xhr.status==200)
{
previewing(t, span, xhr);
}
}
});
}
function previewing(t, span, response)
{
span.innerHTML = 'Got videos';
/*
var data=JSON.parse(response);
if(data.items.length === 0)
{
span.innerHTML = "Couldn't find any videos :(";
window.setTimeout(clear.bind(undefined, span), 5000);
return;
}
var videoIds = [];
for(var i=0; i<data.items.length; i++)
{
videoIds.push(data.items[i].id.videoId);
}
*/
var videoIds=[];
/*var newDoc=document.implementation.createHTMLDocument();
newDoc.body.innerHTML=response.responseText;
var as=newDoc.querySelectorAll('a.ytd-thumbnail');
console.log(response.responseText);
for(var i=0; i<as.length; i++)
{
var a=as[i];
if(a.href.indexOf('watch?v=')==-1)
continue;
videoIds.push(a.href.split('watch?v=')[1]);
}
*/
var splits=response.responseText.split('"videoId":"');
for(var i=1; i<splits.length-1; i++)
{
videoIds.push(splits[i].split('"')[0]);
}
if(videoIds.length === 0)
{
span.innerHTML = "Couldn't find any videos :(";
window.setTimeout(clear.bind(undefined, span), 5000);
return;
}
t.setAttribute('videoIds', JSON.stringify(videoIds));
t.setAttribute('index', 1);
addEmbed(t, span, videoIds[0]);
}
function addEmbed(t, span, videoId)
{
var settings=getSettings();
var iframe = t.getElementsByTagName('iframe');
if(iframe.length === 0)
{
var prev=document.getElementById('previewIframe');
if(prev)
prev.parentNode.removeChild(prev);
if(settings.useYoutubeAPI)
{
iframe=document.createElement('div');
iframe.setAttribute('id', 'previewIframe');
t.appendChild(iframe);
var width = t.parentNode.clientWidth-20;
var height = Math.round(width/(16/9));
new YT.Player('previewIframe', {
height: height,
width: width,
videoId: videoId,
events: {'onReady': previewReady, 'onStateChange': previewStateChanged}});
}
else
{
iframe = document.createElement('iframe');
iframe.setAttribute('id', 'previewIframe');
t.appendChild(iframe);
iframe.width = t.parentNode.clientWidth-20;
iframe.height = iframe.width/(16/9);
iframe.setAttribute('allowfullscreen', 'true');
iframe.frameBorder='0';
}
}
else
iframe = iframe[0];
iframe.src='https://www.youtube.com/embed/'+videoId+'?autoplay=1';
//iframe.setAttribute('autoplay', true);
span.innerHTML = ' Added youtube embed';
var link=document.getElementById('youtubeLink');
if(link)
link.parentNode.removeChild(link);
link=document.createElement('a');
span.parentNode.insertBefore(link, span);
link.href='https://youtu.be/'+videoId;
link.innerHTML='(Link)';
link.id='youtubeLink';
window.setTimeout(clear.bind(undefined, span), 5000);
}
function previewReady(event)
{
event.target.playVideo();
var settings=getSettings();
if(settings.quality && settings.quality.length > '')
event.target.setPlaybackQuality(settings.quality);
}
function previewStateChanged(event)
{
if(event.target.getPlayerState() === 0)
{
//console.log('ended');
var as=document.getElementsByClassName('previewLinks');
var index=parseInt(as[0].parentNode.parentNode.getAttribute('index'))+1;
if(index < as.length)
as[index].click();
}
if(event.data == YT.PlayerState.BUFFERING)
{
var settings=getSettings();
if(settings.quality && settings.quality.length > '')
event.target.setPlaybackQuality(settings.quality);
if(settings.volume)
event.target.setVolume(settings.volume);
}
}
function clear(span)
{
span.innerHTML = '';
}
function xhr_func(messageDiv, xhr, func, repeatFunc)
{
if(xhr.readyState == 4)
{
if(xhr.status == 200)
func(xhr.responseText);
else
{
messageDiv.innerHTML = 'Error: '+xhr.status+'<br />retrying in 1 second';
window.setTimeout(repeatFunc, 1000);
}
}
}