/** * @author Wouter van Wijk * * all kinds functions and vars */ var mopidy; //values for controls var play = false; var random; var repeat; var consume; var single; var currentVolume = -1; var mute; var volumeChanging = false; var posChanging = false; var posTimer; var volumeTimer; var seekTimer; var initgui = true; var currentpos = 0; var popupData = {}; var songlength = 0; var artistshtml = ''; var artiststext = ''; var songname = ''; var songdata = {'track':{}, 'tlid':-1}; var newposition = 0; var playlisttracksScroll; var playlistslistScroll; var STREAMS_PLAYLIST_NAME = '[Radio Streams]'; var STREAMS_PLAYLIST_SCHEME = 'm3u'; //array of cached playlists (not only user-playlists, also search, artist, album-playlists) var playlists = {}; var currentplaylist; var customTracklists = []; var browseStack = []; var browseTracks = []; var ua = navigator.userAgent, isMobileSafari = /Mac/.test(ua) && /Mobile/.test(ua), isMobileWebkit = /WebKit/.test(ua) && /Mobile/.test(ua), isMobile = /Mobile/.test(ua), isWebkit = /WebKit/.test(ua); //constants PROGRAM_NAME = 'MusicBox'; //PROGRAM_NAME = 'Mopidy'; ARTIST_TABLE = '#artiststable'; ALBUM_TABLE = '#albumstable'; PLAYLIST_TABLE = '#playlisttracks'; CURRENT_PLAYLIST_TABLE = '#currenttable'; SEARCH_ALL_TABLE = '#allresulttable'; SEARCH_ALBUM_TABLE = '#albumresulttable'; SEARCH_ARTIST_TABLE = '#artistresulttable'; SEARCH_TRACK_TABLE = '#trackresulttable'; URI_SCHEME = 'mbw'; PLAY_NOW = 0; PLAY_NEXT = 1; ADD_THIS_BOTTOM = 2; ADD_ALL_BOTTOM = 3; PLAY_ALL = 4; PLAY_NOW_SEARCH = 5; MAX_TABLEROWS = 50; //update track slider timer, milliseconds TRACK_TIMER = 1000; //check status timer, every 5 or 10 sec STATUS_TIMER = 10000; // the first part of Mopidy extensions which serve radio streams var radioExtensionsList = ['somafm', 'tunein', 'dirble', 'audioaddict']; var uriClassList = [ ['spotify', 'fa-spotify'], ['spotifytunigo', 'fa-spotify'], ['local', 'fa-file-sound-o'], ['m3u', 'fa-file-sound-o'], ['podcast', 'fa-rss-square'], ['dirble', 'fa-microphone'], ['tunein', 'fa-headphones'], ['soundcloud', 'fa-soundcloud'], ['sc', 'fa-soundcloud'], ['gmusic', 'fa-google'], ['internetarchive', 'fa-university'], ['somafm', 'fa-flask'], ['youtube', 'fa-youtube'], ['yt', 'fa-youtube'], ['audioaddict', 'fa-bullhorn'], ['subsonic', 'fa-folder-open'] ]; var uriHumanList = [ ['spotify', 'Spotify'], ['spotifytunigo', 'Spotify Browse'], ['local', 'Local Files'], ['m3u', 'Local Playlists'], ['podcast', 'Podcasts'], ['dirble', 'Dirble'], ['tunein', 'TuneIn'], ['soundcloud', 'SoundCloud'], ['gmusic', 'Google Music'], ['internetarchive', 'Internet Archive'], ['somafm', 'Soma FM'], ['youtube', 'YouTube'], ['audioaddict', 'AudioAddict'], ['subsonic', 'Subsonic'] ]; function scrollToTop() { var divtop = 0; $('body,html').animate({ scrollTop: divtop }, 250); } function scrollToTracklist() { /* if (isMobileWebkit) { playlistslistScroll.refresh(); } */ var divtop = $("#playlisttracksdiv").offset().top - 120; $('body,html').animate({ scrollTop: divtop }, 250); } //A hack to find the name of the first artist of a playlist. this is not yet returned by mopidy //does not work wel with multiple artists of course function getArtist(pl) { for (var i = 0; i < pl.length; i++) { for (var j = 0; j < pl[i].artists.length; j++) { if (pl[i].artists[j].name != '') { return pl[i].artists[j].name; } } }; } //A hack to find the first album of a playlist. this is not yet returned by mopidy function getAlbum(pl) { for (var i = 0; i < pl.length; i++) { if (pl[i].album.name != '') { return pl[i].album.name; } }; } function artistsToString(artists, max) { var result = ''; max = max || 3; for (var i = 0; i < artists.length && i < max; i++) { if (artists[i].name) { if (i > 0) { result += ', '; } result += artists[i].name; } } return result; } /******************************************************** * break up results and put them in album tables *********************************************************/ function albumTracksToTable(pl, target, uri) { var tmp = '
"; } else { html += '
"; } /* '' + timeFromSeconds(newalbum[0].length / 1000) + ''; */ if (newalbum[0].artists) { for (j = 0; j < newalbum[0].artists.length; j++) { html += newalbum[0].artists[j].name; html += (j == newalbum[0].artists.length - 1) ? '' : ' / '; //stop after 3 if (j > 2) { html += '...'; break; } } } if (newalbum[0].album.name != '') { html += ' / '; } html += '' + newalbum[0].album.name + '
'; html += ''; } if (results[i].album.artists) { for (j = 0; j < results[i].album.artists.length; j++) { html += results[i].album.artists[j].name; html += (j == results[i].album.artists.length - 1) ? '' : ' / '; //stop after 3 if (j > 2) { child += '...'; break; } } } html += '
' + timeFromSeconds(newalbum[j].length / 1000) + '
'; child += '' + timeFromSeconds(pl[i].length / 1000) + ''; // for (var j = 0; j < pl[i].artists.length; j++) { if (pl[i].artists[j]) { child += pl[i].artists[j].name; child += (j == pl[i].artists.length - 1) ? '' : ' / '; //stop after 3 if (j > 2) { child += '...'; break; } } } child += ' / ' + pl[i].album.name + '
'; child += '