Embed youtube clips for the tracks of a torrent group
// ==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); } } }