diff --git a/mopidy_spotmop/static/app.js b/mopidy_spotmop/static/app.js index 78655b8..23efe41 100644 --- a/mopidy_spotmop/static/app.js +++ b/mopidy_spotmop/static/app.js @@ -33821,7 +33821,7 @@ angular.module('spotmop.services.dialog', []) replace: true, transclude: true, templateUrl: 'app/services/dialog/addtoplaylist.template.html', - controller: ['$scope', '$element', '$rootScope', '$filter', 'DialogService', 'SpotifyService', 'SettingsService', function( $scope, $element, $rootScope, $filter, DialogService, SpotifyService, SettingsService ){ + controller: ['$scope', '$element', '$rootScope', '$filter', 'DialogService', 'SpotifyService', 'SettingsService', 'NotifyService', function( $scope, $element, $rootScope, $filter, DialogService, SpotifyService, SettingsService, NotifyService ){ $scope.playlists = []; var spotifyUserID = SettingsService.getSetting('spotifyuser', {id: 'undefined'}).id; @@ -33836,7 +33836,7 @@ angular.module('spotmop.services.dialog', []) **/ $scope.playlistSelected = function( playlist ){ - var selectedTracks = $filter('filter')( $scope.$parent.tracklist.tracks, { selected: true } ); + var selectedTracks = $filter('filter')( $scope.$parent.tracks, { selected: true } ); var selectedTracksUris = []; // construct a flat array of track uris @@ -33858,7 +33858,7 @@ angular.module('spotmop.services.dialog', []) // remove this dialog, and initiate standard notification DialogService.remove(); $rootScope.$broadcast('spotmop:tracklist:unselectAll'); - $scope.$emit('spotmop:notifyUser', {id: 'adding-to-playlist', message: 'Added '+selectedTracksUris.length+' tracks', autoremove: true}); + NotifyService.notify( selectedTracksUris.length +' tracks added to '+ playlist.name ); }); }; }] diff --git a/mopidy_spotmop/static/app.min.js b/mopidy_spotmop/static/app.min.js index 03af4f8..5533e8a 100644 --- a/mopidy_spotmop/static/app.min.js +++ b/mopidy_spotmop/static/app.min.js @@ -1,6 +1,6 @@ /** * Mopidy-Spotmop - * Built 2016-04-15 + * Built 2016-04-17 **/ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b="length"in a&&a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(ha.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=oa[a]={};return _.each(a.match(na)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+h.uid++}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ua,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:ta.test(c)?_.parseJSON(c):c}catch(e){}sa.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Ka.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)ra.set(a[c],"globalEval",!b||ra.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(ra.hasData(a)&&(f=ra.access(a),g=ra.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sa.hasData(a)&&(h=sa.access(a),i=_.extend({},h),sa.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ya.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Oa[a];return c||(c=t(a,b),"none"!==c&&c||(Na=(Na||_("');$(body).append(b),"undefined"==typeof c.spotify&&(c.spotify={}),"undefined"==typeof c.spotify.AccessToken&&(c.spotify.AccessToken=null),"undefined"==typeof c.spotify.RefreshToken&&(c.spotify.RefreshToken=null),"undefined"==typeof c.spotify.AuthorizationCode&&(c.spotify.AuthorizationCode=null),"undefined"==typeof c.spotify.AccessTokenExpiry&&(c.spotify.AccessTokenExpiry=null),window.addEventListener("message",function(b){if("http://jamesbarnsley.co.nz"!==b.origin)return!1;var d=JSON.parse(b.data);console.info("Spotify authorization successful"),c.spotify.AuthorizationCode=d.authorization_code,c.spotify.AccessToken=d.access_token,c.spotify.RefreshToken=d.refresh_token,a.spotifyOnline=!0,this.authenticationMethod="client",l.getMe().then(function(b){j.setSetting("spotifyuser",b),a.$broadcast("spotmop:spotify:authenticationChanged",this.authenticationMethod)})},!1),this.isAuthorized()?(a.spotifyAuthorized=!0,this.authenticationMethod="client"):(j.setSetting("spotifyuser",!1),a.spotifyAuthorized=!1,this.authenticationMethod="server"),a.$broadcast("spotmop:spotify:online")},logout:function(){c.spotify={},this.authenticationMethod="server",this.refreshToken(),a.$broadcast("spotmop:spotify:authenticationChanged",this.authenticationMethod)},authorize:function(){var a=$(document).find("#authorization-frame");a.attr("src","http://jamesbarnsley.co.nz/spotmop.php?action=authorize&app="+location.protocol+"//"+window.location.host)},isAuthorized:function(){return c.spotify.AuthorizationCode&&c.spotify.RefreshToken?!0:!1},refreshToken:function(){var b=h.defer(),e="";if("client"==this.authenticationMethod)e="http://jamesbarnsley.co.nz/spotmop.php?action=refresh&refresh_token="+c.spotify.RefreshToken;else{if("server"!=this.authenticationMethod)return!1;var f=j.getSetting("mopidyhost",window.location.hostname),g=j.getSetting("mopidyport","6680");e="http://"+f+":"+g+"/spotmop/auth"}return d({method:"GET",url:e,dataType:"json",async:!1,timeout:1e4}).success(function(d){"undefined"!=typeof d.error?(k.error("Spotify authorization error: "+d.error_description),a.spotifyOnline=!1,b.reject(d.error.message)):(c.spotify.AccessToken=d.access_token,c.spotify.AccessTokenExpiry=(new Date).getTime()+36e5,a.spotifyOnline=!0,b.resolve(d))}),b.promise},serviceUnavailable:function(){k.error("Request failed. Spotify API may be temporarily unavailable.")},getFromUri:function(a,b){var c=b.split(":");return"userid"==a&&"user"==c[1]?c[2]:"playlistid"==a&&"playlist"==c[3]?c[4]:"artistid"==a&&"artist"==c[1]?c[2]:"albumid"==a&&"album"==c[1]?c[2]:"trackid"==a&&"track"==c[1]?c[2]:null},uriType:function(a){var b=a.split(":");return"spotify"==b[0]&&"artist"==b[1]?"artist":"spotify"==b[0]&&"album"==b[1]?"album":"spotify"==b[0]&&"user"==b[1]&&"playlist"==b[3]?"playlist":null},getUrl:function(a){var b=h.defer();return d({method:"GET",url:a,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getMe:function(){var a=h.defer();return this.isAuthorized()?(d({method:"GET",url:m+"me/",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(b){a.resolve(b)}).error(function(b){k.error(b.error.message),a.reject(b.error.message)}),a.promise):(a.reject(),a.promise)},getUser:function(a){var b=this.getFromUri("userid",a),c=h.defer();return d({method:"GET",url:m+"users/"+b}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},isFollowing:function(a,b){var e=this.getFromUri(a+"id",b),f=h.defer();return this.isAuthorized()?(d({method:"GET",url:m+"me/following/contains?type="+a+"&ids="+e,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise):(f.reject(),f.promise)},getTrack:function(a){var b=this.getFromUri("trackid",a),c=h.defer();return d({method:"GET",url:m+"tracks/"+b}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},getMyTracks:function(a){var b=h.defer();return this.isAuthorized()?(d({method:"GET",url:m+"me/tracks/?limit=50",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise):(b.reject(),b.promise)},addTracksToLibrary:function(a){var b=h.defer();if(!this.isAuthorized())return b.reject(),b.promise;var e=i.get("$http");return e.remove(m+"me/tracks/?limit=50"),d({method:"PUT",url:m+"me/tracks",dataType:"json",data:JSON.stringify({ids:a}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},addAlbumsToLibrary:function(a){if(!this.isAuthorized())return e.reject(),e.promise;var b=i.get("$http");b.remove(m+"me/albums?limit=40&offset=0");var e=h.defer();return"array"!=typeof a&&(a=[a]),d({method:"PUT",url:m+"me/albums",dataType:"json",data:JSON.stringify({ids:a}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise},removeAlbumsFromLibrary:function(a){if(!this.isAuthorized())return b.reject(),b.promise;var b=h.defer();return"array"!=typeof a&&(a=[a]),d({method:"DELETE",url:m+"me/albums",dataType:"json",data:JSON.stringify({ids:a}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},deleteTracksFromLibrary:function(a){var b=h.defer();if(!this.isAuthorized())return b.reject(),b.promise;var e=i.get("$http");return e.remove(m+"me/tracks/?limit=50"),d({method:"DELETE",url:m+"me/tracks",dataType:"json",data:JSON.stringify({ids:a}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getMyArtists:function(a){var b=h.defer();return this.isAuthorized()?(d({method:"GET",url:m+"me/following?type=artist",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise):(b.reject(),b.promise)},getMyAlbums:function(a,b,e){if(!this.isAuthorized())return f.reject(),f.promise;"undefined"!=typeof b&&b||(b=40),"undefined"==typeof e&&(e=0);var f=h.defer();return d({cache:!0,method:"GET",url:m+"me/albums?limit="+b+"&offset="+e,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){for(var b=[],c=Math.ceil(a.items.length/20),d=1;c>=d;d++){var e=a.items.splice(0,20),g=[],h=20;e.length<20&&(h=e.length);for(var i=0;h>i;i++)g.push(e[i].album.id);l.getAlbums(g).then(function(e){b=b.concat(e.albums),d>=c&&(a.items=b,f.resolve(a))})}}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise},isFollowingArtist:function(a,b){var e=this.getFromUri("artistid",a),f=h.defer();return this.isAuthorized()?(d({cache:!1,method:"GET",url:m+"me/following/contains?type=artist&ids="+e,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise):(f.reject(),f.promise)},followArtist:function(a){var b=this.getFromUri("artistid",a),e=h.defer();return this.isAuthorized()?(d({method:"PUT",cache:!1,url:m+"me/following?type=artist&ids="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise):(e.reject(),e.promise)},unfollowArtist:function(a){var b=this.getFromUri("artistid",a),e=h.defer();return this.isAuthorized()?(d({method:"DELETE",cache:!1,url:m+"me/following?type=artist&ids="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise):(e.reject(),e.promise)},getPlaylists:function(a,b){"undefined"==typeof b&&(b=40);var e=h.defer();return d({cache:!1,method:"GET",url:m+"users/"+a+"/playlists?limit="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise},getPlaylist:function(a){var b=this.getFromUri("userid",a),e=this.getFromUri("playlistid",a),f=h.defer();return d({cache:!0,method:"GET",url:m+"users/"+b+"/playlists/"+e+"?market="+n,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise},isFollowingPlaylist:function(a,b){var e=this.getFromUri("userid",a),f=this.getFromUri("playlistid",a),g=h.defer();return this.isAuthorized()?(d({cache:!0,method:"GET",url:m+"users/"+e+"/playlists/"+f+"/followers/contains?ids="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){g.resolve(a)}).error(function(a){k.error(a.error.message),g.reject(a.error.message)}),g.promise):(g.reject(),g.promise)},followPlaylist:function(a){var b=this.getFromUri("userid",a),e=this.getFromUri("playlistid",a),f=h.defer();return this.isAuthorized()?(d({method:"PUT",url:m+"users/"+b+"/playlists/"+e+"/followers",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise):(f.reject(),f.promise)},unfollowPlaylist:function(a){var b=this.getFromUri("userid",a),e=this.getFromUri("playlistid",a),f=h.defer();return this.isAuthorized()?(d({method:"DELETE",url:m+"users/"+b+"/playlists/"+e+"/followers",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise):(f.reject(),f.promise)},featuredPlaylists:function(a){"undefined"==typeof a&&(a=40);var b=g("date")(new Date,"yyyy-MM-ddTHH:mm:ss"),e=j.getSetting("countrycode","NZ"),f=h.defer();return d({cache:!0,method:"GET",url:m+"browse/featured-playlists?timestamp="+b+"&country="+e+"&limit="+a,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise},addTracksToPlaylist:function(a,b){var e=this.getFromUri("userid",a),f=this.getFromUri("playlistid",a),g=h.defer();return this.isAuthorized()?(d({method:"POST",url:m+"users/"+e+"/playlists/"+f+"/tracks",dataType:"json",data:JSON.stringify({uris:b}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){g.resolve(a)}).error(function(a){k.error(a.error.message),g.reject(a.error.message)}),g.promise):(g.reject(),g.promise)},movePlaylistTracks:function(a,b,e,f){if(!this.isAuthorized())return l.reject(),l.promise;var g=this.getFromUri("userid",a),i=this.getFromUri("playlistid",a);if(g!=j.getSetting("spotifyuser",{id:null}).id)return!1;var l=h.defer();return d({method:"PUT",url:m+"users/"+g+"/playlists/"+i+"/tracks",dataType:"json",data:JSON.stringify({range_start:b,range_length:e,insert_before:f}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){l.resolve(a)}).error(function(a){k.error(a.error.message),l.reject(a.error.message)}),l.promise},deleteTracksFromPlaylist:function(a,b,e){var f=this.getFromUri("userid",a),g=this.getFromUri("playlistid",a),i=h.defer();return d({method:"DELETE",url:m+"users/"+f+"/playlists/"+g+"/tracks",dataType:"json",data:JSON.stringify({snapshot_id:b,positions:e}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){i.resolve(a)}).error(function(a){k.error(a.error.message),i.reject(a.error.message); -}),i.promise},createPlaylist:function(a,b){var e=h.defer();return this.isAuthorized()?(d({method:"POST",url:m+"users/"+a+"/playlists/",dataType:"json",data:b,contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise):(e.reject(),e.promise)},updatePlaylist:function(a,b){var e=this.getFromUri("userid",a),f=this.getFromUri("playlistid",a),g=h.defer();return this.isAuthorized()?(d({method:"PUT",url:m+"users/"+e+"/playlists/"+f,dataType:"json",data:b,contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){g.resolve(a)}).error(function(a){k.error(a.error.message),g.reject(a.error.message)}),g.promise):(g.reject(),g.promise)},newReleases:function(a,b){"undefined"!=typeof a&&a||(a=40),"undefined"==typeof b&&(b=0);var e=h.defer();return d({cache:!0,method:"GET",url:m+"browse/new-releases?country="+n+"&limit="+a+"&offset="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){for(var b=[],c=Math.ceil(a.albums.items.length/20),d=1;c>d;d++){for(var f=a.albums.items.splice(0,20),g=[],h=0;20>h;h++)g.push(f[h].id);l.getAlbums(g).then(function(f){b=b.concat(f.albums),d>=c&&(a.albums.items=b,e.resolve(a))})}}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise},browseCategories:function(a){"undefined"==typeof a&&(a=40);var b=h.defer();return d({cache:!0,method:"GET",url:m+"browse/categories?limit="+a,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getCategory:function(a){var b=h.defer();return d({cache:!0,method:"GET",url:m+"browse/categories/"+a,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getCategoryPlaylists:function(a,b){"undefined"==typeof b&&(b=40);var e=h.defer();return d({cache:!0,method:"GET",url:m+"browse/categories/"+a+"/playlists?limit="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise},getMyFavorites:function(a,b,e,f){if("undefined"==typeof b)var b=25;if("undefined"==typeof e)var e=0;if("undefined"==typeof f)var f="long_term";var g=h.defer();return d({cache:!0,method:"GET",url:m+"me/top/"+a+"?limit="+b+"&offset="+e+"&time_range="+f,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){g.resolve(a)}).error(function(a){k.error(a.error.message),g.reject(a.error.message)}),g.promise},getRecommendations:function(a,b,e,f,g){var i=m+"recommendations/?";"undefined"!=typeof a&&a&&(i+="limit="+a),"undefined"!=typeof b&&b&&(i+="&offset="+b),"undefined"!=typeof e&&e&&(i+="&seed_artists="+e),"undefined"!=typeof f&&f&&(i+="&seed_albums="+f),"undefined"!=typeof g&&g&&(i+="&seed_tracks="+g);var j=h.defer();return d({cache:!0,method:"GET",url:i,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){j.resolve(a)}).error(function(a){k.error(a.error.message),j.reject(a.error.message)}),j.promise},getArtist:function(a){var b=this.getFromUri("artistid",a),c=h.defer();return d({cache:!0,method:"GET",url:m+"artists/"+b}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},getArtists:function(a){var b=this,c="";angular.forEach(a,function(a){""!=c&&(c+=","),c+=b.getFromUri("artistid",a)});var e=h.defer();return d({method:"GET",url:m+"artists/?ids="+c}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise},getAlbum:function(a){var b=h.defer(),c=this.getFromUri("albumid",a);return d({method:"GET",url:m+"albums/"+c}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getAlbums:function(a){for(var b=h.defer(),c="",e=0;e0&&(c+=","),c+=a[e];return d({cache:!0,method:"GET",url:m+"albums?ids="+c+"&market="+n}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getArtistAlbums:function(a){var b=this.getFromUri("artistid",a),c=h.defer();return d({cache:!0,method:"GET",url:m+"artists/"+b+"/albums?album_type=album,single&market="+n}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},getTopTracks:function(a){var b=this.getFromUri("artistid",a),c=h.defer();return d({cache:!0,method:"GET",url:m+"artists/"+b+"/top-tracks?country="+n}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},getRelatedArtists:function(a){var b=this.getFromUri("artistid",a),c=h.defer();return d({cache:!0,method:"GET",url:m+"artists/"+b+"/related-artists"}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},getSearchResults:function(a,b,e,f){"undefined"==typeof e&&(e=10),"undefined"==typeof f&&(f=0);var g=h.defer();return d({cache:!0,method:"GET",url:m+"search?q="+b+"&type="+a+"&country="+n+"&limit="+e+"&offset="+f,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(b){if("album"==a)for(var c=[],d=Math.ceil(b.albums.items.length/20),e=1;d>e;e++){for(var f=b.albums.items.splice(0,20),h=[],i=0;20>i;i++)h.push(f[i].id);l.getAlbums(h).then(function(a){c=c.concat(a.albums),e>=d&&(b.albums.items=c,g.resolve(b))})}else g.resolve(b)}).error(function(a){k.error(a.error.message),g.reject(a.error.message)}),g.promise}},m="https://api.spotify.com/v1/",n=j.getSetting("spotifycountry","NZ");j.getSetting("spotifylocale","en_NZ");return l}]).factory("SpotifyServiceIntercepter",["$q","$rootScope","$injector","$localStorage",function(a,b,c,d){"use strict";function e(a,b,d){function e(a){b.resolve(a)}function f(a){b.reject(a)}var g=c.get("$http");a.headers={Authorization:"Bearer "+d},g(a).then(e,f)}var f=0,g={responseError:function(b){if(b.config.url.search("https://api.spotify.com/")>=0&&3>f){if(401==b.status){f++;var d=a.defer();return c.get("SpotifyService").refreshToken().then(function(a){return"undefined"!=typeof a.error?b:(f--,void e(b.config,d,a.access_token))}),d.promise}if(0==b.status){var d=a.defer();return c.get("SpotifyService").serviceUnavailable(),d.promise}}return b}};return g}]),angular.module("spotmop.settings",[]).config(["$stateProvider",function(a){a.state("settings",{url:"/settings",templateUrl:"app/settings/template.html"})}]).controller("SettingsController",["$scope","$http","$rootScope","$timeout","MopidyService","SpotifyService","SettingsService","NotifyService","PusherService",function(a,b,c,d,e,f,g,h,i){a.version,a.settings=g.getSettings(),a.currentSubpage="mopidy",a.subpageNavigate=function(b){a.currentSubpage=b},a.authorizeSpotify=function(){f.authorize()},a.refreshSpotifyToken=function(){h.notify("Refreshing token"),f.refreshToken().then(function(){})},a.spotifyLogout=function(){f.logout()},a.upgradeCheck=function(){h.notify("Checking for updates"),g.upgradeCheck().then(function(a){g.setSetting("version",a,"latest"),g.getSetting("version",0,"installed")0&&console.log("A dialog already exists..."),$("body").append(b('')(c))},remove:function(){$("body").children(".dialog").fadeOut(200,function(){$(this).remove()})}}}]).directive("dialog",["$compile",function(a){return{restrict:"E",replace:!0,transclude:!0,scope:{type:"@"},templateUrl:"app/services/dialog/template.html",link:function(b,c){c.find(".content").html(a("<"+b.type+"dialog />")(b))},controller:["$scope","$element","DialogService",function(a,b,c){a.closeDisabled=!1,"initialsetup"==a.type&&(a.closeDisabled=!0),a.closeDialog=function(){c.remove()},a.$on("spotmop:keyboardShortcut:esc",function(b){a.closeDisabled||c.remove()})}]}}]).directive("createplaylistdialog",function(){return{restrict:"E",replace:!0,transclude:!0,templateUrl:"app/services/dialog/createplaylist.template.html",controller:["$scope","$element","$rootScope","DialogService","SettingsService","SpotifyService",function(a,b,c,d,e,f){a.saving=!1,a.playlistPublic="true",a.savePlaylist=function(){a.saving=!0,"true"==a.playlistPublic?a.playlistPublic=!0:a.playlistPublic=!1,f.createPlaylist(a.$parent.spotifyUser.id,{name:a.playlistName,"public":a.playlistPublic}).then(function(b){a.$parent.playlists.items.push(b),a.$parent.updatePlaylists(),d.remove(),c.$broadcast("spotmop:notifyUser",{id:"saved",message:"Saved",autoremove:!0})})}}]}}).directive("editplaylistdialog",function(){return{restrict:"E",replace:!0,transclude:!0,templateUrl:"app/services/dialog/editplaylist.template.html",controller:["$scope","$element","$rootScope","DialogService","SpotifyService",function(a,b,c,d,e){a.playlistNewName=a.$parent.playlist.name,a.playlistNewPublic=a.$parent.playlist["public"].toString(),a.saving=!1,a.savePlaylist=function(){a.saving=!0,"true"==a.playlistNewPublic?a.playlistNewPublic=!0:a.playlistNewPublic=!1,e.updatePlaylist(a.$parent.playlist.uri,{name:a.playlistNewName,"public":a.playlistNewPublic}).then(function(b){a.$parent.playlist.name=a.playlistNewName,a.$parent.playlist["public"]=a.playlistNewPublic,a.$parent.updatePlaylists(),d.remove(),c.$broadcast("spotmop:notifyUser",{id:"saved",message:"Saved",autoremove:!0})})}}]}}).directive("addtoplaylistdialog",function(){return{restrict:"E",replace:!0,transclude:!0,templateUrl:"app/services/dialog/addtoplaylist.template.html",controller:["$scope","$element","$rootScope","$filter","DialogService","SpotifyService","SettingsService","NotifyService",function(a,b,c,d,e,f,g,h){a.playlists=[];var i=g.getSetting("spotifyuser",{id:"undefined"}).id;f.getPlaylists(i,50).then(function(b){a.playlists=d("filter")(b.items,{owner:{id:i}})}),a.playlistSelected=function(b){var g=d("filter")(a.$parent.tracks,{selected:!0}),i=[];angular.forEach(g,function(a){"undefined"!=typeof a.track?i.push(a.track.uri):i.push(a.uri)}),f.addTracksToPlaylist(b.uri,i).then(function(a){e.remove(),c.$broadcast("spotmop:tracklist:unselectAll"),h.notify(i.length+" tracks added to "+b.name)})}}]}}).directive("volumecontrolsdialog",function(){return{restrict:"E",replace:!0,transclude:!0,templateUrl:"app/services/dialog/volumecontrols.template.html",controller:["$scope","$element","$rootScope","$filter","DialogService","PlayerService",function(a,b,c,d,e,f){a.state=function(){return f.state()},a.setVolume=function(a){var b,c,d,e;b=$(a.target).hasClass("slider")?$(a.target):$(a.target).closest(".slider"),c=b.offset(),d=a.pageX-c.left,e=d/b.innerWidth()*100,e=parseInt(e),f.setVolume(e)}}]}}).directive("initialsetupdialog",function(){return{restrict:"E",replace:!0,transclude:!0,templateUrl:"app/services/dialog/initialsetup.template.html",controller:["$scope","$element","$rootScope","$filter","DialogService","SettingsService","SpotifyService",function(a,b,c,d,e,f,g){a.settings=f.getSettings(),f.setSetting("spotify",!0,"authorizationenabled"),a.saving=!1,a.save=function(){a.name&&""!=a.name?(a.saving=!0,f.getSetting("spotify",!1,"authorizationenabled")&&g.authorize(),f.setSetting("pushername",a.name),e.remove()):a.error=!0}}]}}).directive("addbyuridialog",function(){return{restrict:"E",replace:!0,transclude:!0,templateUrl:"app/services/dialog/addbyuri.template.html",controller:["$scope","$element","DialogService","SpotifyService","MopidyService",function(a,b,c,d,e){a.saving=!1,a.add=function(){a.uri&&""!=a.uri?(a.error=!1,a.saving=!0,e.addToTrackList([a.uri])["catch"](function(b){a.saving=!1,a.error=!0}).then(function(b){a.error||c.remove()})):a.error=!0}}]}}),angular.module("spotmop.services.lastfm",[]).factory("LastfmService",["$rootScope","$resource","$localStorage","$http","$interval","$timeout","$filter","$q","SettingsService","NotifyService",function(a,b,c,d,e,f,g,h,i,j){var k={sendRequest:function(a){var b=h.defer();return d({cache:!0,method:"GET",url:l+"?format=json&api_key="+m+"&"+a}).success(function(a){b.resolve(a)}).error(function(a){j.error(a.error.message),b.reject(a.error.message)}),b.promise},trackInfo:function(a,b){return this.sendRequest("method=track.getInfo&track="+b+"&artist="+a)},albumInfo:function(a,b){return this.sendRequest("method=album.getInfo&album="+b+"&artist="+a)},artistInfo:function(a){return this.sendRequest("method=artist.getInfo&artist="+a)}},l="http://ws.audioscrobbler.com/2.0",m=i.getSetting("lastfmkey","4320a3ef51c9b3d69de552ac083c55e3");return k}]),angular.module("spotmop.services.mopidy",[]).factory("MopidyService",["$q","$rootScope","$cacheFactory","$location","$timeout","SettingsService","PusherService",function(a,b,c,d,e,f,g){function h(c,d){return function(){var e=a.defer(),f=Array.prototype.slice.call(arguments),g=d||this;return b.$broadcast("spotmop:callingmopidy",{name:c,args:f}),g.isConnected?i(c,g,f).then(function(a){e.resolve(a),b.$broadcast("spotmop:calledmopidy",{name:c,args:f})},function(a){e.reject(a),b.$broadcast("spotmop:errormopidy",{name:c,args:f,err:a})}):i(c,g,f).then(function(a){e.resolve(a),b.$broadcast("spotmop:calledmopidy",{name:c,args:f})},function(a){e.reject(a),b.$broadcast("spotmop:errormopidy",{name:c,args:f,err:a})}),e.promise}}function i(a,b,c){for(var d=a.split("."),e=d.pop(),f=0;f'+a+"");$("#notifications").append(c),b&&d(function(){c.fadeOut(200,function(){c.remove()})},b)},error:function(a,b){if("undefined"==typeof b)var b=2500;var c=$(''+a+"");$("#notifications").append(c),b&&d(function(){c.fadeOut(200,function(){c.remove()})},b)},spotifyAuthenticationError:function(){this.error("Please authenticate with Spotify - you can find this under settings")},shortcut:function(a){$("#notifications").find("notification.keyboard-shortcut").remove();var b=$('');$("#notifications").append(b),d(function(){b.fadeOut(200,function(){b.remove()})},1500)},browserNotify:function(a,b,c){if(e.getSetting("notificationsDisabled",!1))return!1;var d=window.Notification||window.mozNotification||window.webkitNotification;if("undefined"==typeof d)return!1;if("undefined"!=typeof d&&d.requestPermission(function(a){}),"undefined"==typeof c)var c="";new d(a,{body:b,dir:"auto",lang:"EN",tag:"spotmopNotification",icon:c});return!0}}}]).directive("notification",function(){return{restrict:"AE",link:function(a,b,c){console.log(b)}}}),angular.module("spotmop.services.pusher",[]).factory("PusherService",["$rootScope","$http","$q","$localStorage","$cacheFactory","$templateCache","SettingsService","NotifyService",function(a,b,c,d,e,f,g,h){"undefined"==typeof d.pusher&&(d.pusher={});var i="http://"+g.getSetting("mopidyhost",window.location.hostname);i+=":"+g.getSetting("mopidyport","6680"),i+="/spotmop/";var j={pusher:{},isConnected:!1,start:function(){var b=g.getSetting("mopidyhost",window.location.hostname),c=g.getSetting("pusherport","6681");try{var d="ws://"+b+":"+c+"/pusher",i=new WebSocket(d);i.onopen=function(){a.$broadcast("spotmop:pusher:online"),this.isConnected=!0},i.onmessage=function(b){var c=JSON.parse(b.data);if(c.pusher)if(c.startup){console.info("Pusher connected as "+c.details.id),g.setSetting("pusherid",c.details.id),g.setSetting("pusherip",c.details.ip),g.getSetting("version",0,"installed")!=c.version&&(h.notify("New version detected, clearing caches..."),e.get("$http").removeAll(),f.removeAll(),g.setSetting("version",c.version,"installed"));var d=g.getSetting("pushername","");d&&j.setMe(d)}else c.id==g.getSetting("pusherid","")||g.getSetting("pusherdisabled",!1)||a.$broadcast("spotmop:pusher:received",c)},i.onclose=function(){a.$broadcast("spotmop:pusher:offline"),j.isConnected=!1,setTimeout(function(){j.start()},5e3)},j.pusher=i}catch(k){console.log("Connecting with Pusher failed with the following error message: "+k)}},stop:function(){this.pusher=null,this.isConnected=!1},send:function(a){a.pusher=!0,a.id=g.getSetting("pusherid",null),j.pusher.send(JSON.stringify(a))},setMe:function(a){var b=g.getSetting("pusherid",null);$.ajax({method:"GET",cache:!1,url:i+"pusher/me?id="+b+"&name="+a})},getConnections:function(){var a=c.defer();return b({method:"GET",cache:!1,url:i+"pusher/connections"}).success(function(b){a.resolve(b)}).error(function(b){h.error(b.error.message),a.reject(b.error.message)}),a.promise}};return j}]),angular.module("spotmop.services.spotify",[]).factory("SpotifyService",["$rootScope","$resource","$localStorage","$http","$interval","$timeout","$filter","$q","$cacheFactory","SettingsService","NotifyService",function(a,b,c,d,e,f,g,h,i,j,k){var l={authenticationMethod:"server",start:function(){var b=$('');$(body).append(b),"undefined"==typeof c.spotify&&(c.spotify={}),"undefined"==typeof c.spotify.AccessToken&&(c.spotify.AccessToken=null),"undefined"==typeof c.spotify.RefreshToken&&(c.spotify.RefreshToken=null),"undefined"==typeof c.spotify.AuthorizationCode&&(c.spotify.AuthorizationCode=null),"undefined"==typeof c.spotify.AccessTokenExpiry&&(c.spotify.AccessTokenExpiry=null),window.addEventListener("message",function(b){if("http://jamesbarnsley.co.nz"!==b.origin)return!1;var d=JSON.parse(b.data);console.info("Spotify authorization successful"),c.spotify.AuthorizationCode=d.authorization_code,c.spotify.AccessToken=d.access_token,c.spotify.RefreshToken=d.refresh_token,a.spotifyOnline=!0,this.authenticationMethod="client",l.getMe().then(function(b){j.setSetting("spotifyuser",b),a.$broadcast("spotmop:spotify:authenticationChanged",this.authenticationMethod)})},!1),this.isAuthorized()?(a.spotifyAuthorized=!0,this.authenticationMethod="client"):(j.setSetting("spotifyuser",!1),a.spotifyAuthorized=!1,this.authenticationMethod="server"),a.$broadcast("spotmop:spotify:online")},logout:function(){c.spotify={},this.authenticationMethod="server",this.refreshToken(),a.$broadcast("spotmop:spotify:authenticationChanged",this.authenticationMethod)},authorize:function(){var a=$(document).find("#authorization-frame");a.attr("src","http://jamesbarnsley.co.nz/spotmop.php?action=authorize&app="+location.protocol+"//"+window.location.host)},isAuthorized:function(){return c.spotify.AuthorizationCode&&c.spotify.RefreshToken?!0:!1},refreshToken:function(){var b=h.defer(),e="";if("client"==this.authenticationMethod)e="http://jamesbarnsley.co.nz/spotmop.php?action=refresh&refresh_token="+c.spotify.RefreshToken;else{if("server"!=this.authenticationMethod)return!1;var f=j.getSetting("mopidyhost",window.location.hostname),g=j.getSetting("mopidyport","6680");e="http://"+f+":"+g+"/spotmop/auth"}return d({method:"GET",url:e,dataType:"json",async:!1,timeout:1e4}).success(function(d){"undefined"!=typeof d.error?(k.error("Spotify authorization error: "+d.error_description),a.spotifyOnline=!1,b.reject(d.error.message)):(c.spotify.AccessToken=d.access_token,c.spotify.AccessTokenExpiry=(new Date).getTime()+36e5,a.spotifyOnline=!0,b.resolve(d))}),b.promise},serviceUnavailable:function(){k.error("Request failed. Spotify API may be temporarily unavailable.")},getFromUri:function(a,b){var c=b.split(":");return"userid"==a&&"user"==c[1]?c[2]:"playlistid"==a&&"playlist"==c[3]?c[4]:"artistid"==a&&"artist"==c[1]?c[2]:"albumid"==a&&"album"==c[1]?c[2]:"trackid"==a&&"track"==c[1]?c[2]:null},uriType:function(a){var b=a.split(":");return"spotify"==b[0]&&"artist"==b[1]?"artist":"spotify"==b[0]&&"album"==b[1]?"album":"spotify"==b[0]&&"user"==b[1]&&"playlist"==b[3]?"playlist":null},getUrl:function(a){var b=h.defer();return d({method:"GET",url:a,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getMe:function(){var a=h.defer();return this.isAuthorized()?(d({method:"GET",url:m+"me/",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(b){a.resolve(b)}).error(function(b){k.error(b.error.message),a.reject(b.error.message)}),a.promise):(a.reject(),a.promise)},getUser:function(a){var b=this.getFromUri("userid",a),c=h.defer();return d({method:"GET",url:m+"users/"+b}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},isFollowing:function(a,b){var e=this.getFromUri(a+"id",b),f=h.defer();return this.isAuthorized()?(d({method:"GET",url:m+"me/following/contains?type="+a+"&ids="+e,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise):(f.reject(),f.promise)},getTrack:function(a){var b=this.getFromUri("trackid",a),c=h.defer();return d({method:"GET",url:m+"tracks/"+b}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},getMyTracks:function(a){var b=h.defer();return this.isAuthorized()?(d({method:"GET",url:m+"me/tracks/?limit=50",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise):(b.reject(),b.promise)},addTracksToLibrary:function(a){var b=h.defer();if(!this.isAuthorized())return b.reject(),b.promise;var e=i.get("$http");return e.remove(m+"me/tracks/?limit=50"),d({method:"PUT",url:m+"me/tracks",dataType:"json",data:JSON.stringify({ids:a}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},addAlbumsToLibrary:function(a){if(!this.isAuthorized())return e.reject(),e.promise;var b=i.get("$http");b.remove(m+"me/albums?limit=40&offset=0");var e=h.defer();return"array"!=typeof a&&(a=[a]),d({method:"PUT",url:m+"me/albums",dataType:"json",data:JSON.stringify({ids:a}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise},removeAlbumsFromLibrary:function(a){if(!this.isAuthorized())return b.reject(),b.promise;var b=h.defer();return"array"!=typeof a&&(a=[a]),d({method:"DELETE",url:m+"me/albums",dataType:"json",data:JSON.stringify({ids:a}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},deleteTracksFromLibrary:function(a){var b=h.defer();if(!this.isAuthorized())return b.reject(),b.promise;var e=i.get("$http");return e.remove(m+"me/tracks/?limit=50"),d({method:"DELETE",url:m+"me/tracks",dataType:"json",data:JSON.stringify({ids:a}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getMyArtists:function(a){var b=h.defer();return this.isAuthorized()?(d({method:"GET",url:m+"me/following?type=artist",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise):(b.reject(),b.promise)},getMyAlbums:function(a,b,e){if(!this.isAuthorized())return f.reject(),f.promise;"undefined"!=typeof b&&b||(b=40),"undefined"==typeof e&&(e=0);var f=h.defer();return d({cache:!0,method:"GET",url:m+"me/albums?limit="+b+"&offset="+e,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){for(var b=[],c=Math.ceil(a.items.length/20),d=1;c>=d;d++){var e=a.items.splice(0,20),g=[],h=20;e.length<20&&(h=e.length);for(var i=0;h>i;i++)g.push(e[i].album.id);l.getAlbums(g).then(function(e){b=b.concat(e.albums),d>=c&&(a.items=b,f.resolve(a))})}}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise},isFollowingArtist:function(a,b){var e=this.getFromUri("artistid",a),f=h.defer();return this.isAuthorized()?(d({cache:!1,method:"GET",url:m+"me/following/contains?type=artist&ids="+e,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise):(f.reject(),f.promise)},followArtist:function(a){var b=this.getFromUri("artistid",a),e=h.defer();return this.isAuthorized()?(d({method:"PUT",cache:!1,url:m+"me/following?type=artist&ids="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise):(e.reject(),e.promise)},unfollowArtist:function(a){var b=this.getFromUri("artistid",a),e=h.defer();return this.isAuthorized()?(d({method:"DELETE",cache:!1,url:m+"me/following?type=artist&ids="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise):(e.reject(),e.promise)},getPlaylists:function(a,b){"undefined"==typeof b&&(b=40);var e=h.defer();return d({cache:!1,method:"GET",url:m+"users/"+a+"/playlists?limit="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise},getPlaylist:function(a){var b=this.getFromUri("userid",a),e=this.getFromUri("playlistid",a),f=h.defer();return d({cache:!0,method:"GET",url:m+"users/"+b+"/playlists/"+e+"?market="+n,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise},isFollowingPlaylist:function(a,b){var e=this.getFromUri("userid",a),f=this.getFromUri("playlistid",a),g=h.defer();return this.isAuthorized()?(d({cache:!0,method:"GET",url:m+"users/"+e+"/playlists/"+f+"/followers/contains?ids="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){g.resolve(a)}).error(function(a){k.error(a.error.message),g.reject(a.error.message)}),g.promise):(g.reject(),g.promise)},followPlaylist:function(a){var b=this.getFromUri("userid",a),e=this.getFromUri("playlistid",a),f=h.defer();return this.isAuthorized()?(d({method:"PUT",url:m+"users/"+b+"/playlists/"+e+"/followers",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise):(f.reject(),f.promise)},unfollowPlaylist:function(a){var b=this.getFromUri("userid",a),e=this.getFromUri("playlistid",a),f=h.defer();return this.isAuthorized()?(d({method:"DELETE",url:m+"users/"+b+"/playlists/"+e+"/followers",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise):(f.reject(),f.promise)},featuredPlaylists:function(a){"undefined"==typeof a&&(a=40);var b=g("date")(new Date,"yyyy-MM-ddTHH:mm:ss"),e=j.getSetting("countrycode","NZ"),f=h.defer();return d({cache:!0,method:"GET",url:m+"browse/featured-playlists?timestamp="+b+"&country="+e+"&limit="+a,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){f.resolve(a)}).error(function(a){k.error(a.error.message),f.reject(a.error.message)}),f.promise},addTracksToPlaylist:function(a,b){var e=this.getFromUri("userid",a),f=this.getFromUri("playlistid",a),g=h.defer();return this.isAuthorized()?(d({method:"POST",url:m+"users/"+e+"/playlists/"+f+"/tracks",dataType:"json",data:JSON.stringify({uris:b}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){g.resolve(a)}).error(function(a){k.error(a.error.message),g.reject(a.error.message)}),g.promise):(g.reject(),g.promise)},movePlaylistTracks:function(a,b,e,f){if(!this.isAuthorized())return l.reject(),l.promise;var g=this.getFromUri("userid",a),i=this.getFromUri("playlistid",a);if(g!=j.getSetting("spotifyuser",{id:null}).id)return!1;var l=h.defer();return d({method:"PUT",url:m+"users/"+g+"/playlists/"+i+"/tracks",dataType:"json",data:JSON.stringify({range_start:b,range_length:e,insert_before:f}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){l.resolve(a)}).error(function(a){k.error(a.error.message),l.reject(a.error.message)}),l.promise},deleteTracksFromPlaylist:function(a,b,e){var f=this.getFromUri("userid",a),g=this.getFromUri("playlistid",a),i=h.defer();return d({method:"DELETE",url:m+"users/"+f+"/playlists/"+g+"/tracks",dataType:"json",data:JSON.stringify({snapshot_id:b,positions:e}),contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){i.resolve(a)}).error(function(a){k.error(a.error.message),i.reject(a.error.message)}),i.promise},createPlaylist:function(a,b){var e=h.defer(); +return this.isAuthorized()?(d({method:"POST",url:m+"users/"+a+"/playlists/",dataType:"json",data:b,contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise):(e.reject(),e.promise)},updatePlaylist:function(a,b){var e=this.getFromUri("userid",a),f=this.getFromUri("playlistid",a),g=h.defer();return this.isAuthorized()?(d({method:"PUT",url:m+"users/"+e+"/playlists/"+f,dataType:"json",data:b,contentType:"application/json; charset=utf-8",headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){g.resolve(a)}).error(function(a){k.error(a.error.message),g.reject(a.error.message)}),g.promise):(g.reject(),g.promise)},newReleases:function(a,b){"undefined"!=typeof a&&a||(a=40),"undefined"==typeof b&&(b=0);var e=h.defer();return d({cache:!0,method:"GET",url:m+"browse/new-releases?country="+n+"&limit="+a+"&offset="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){for(var b=[],c=Math.ceil(a.albums.items.length/20),d=1;c>d;d++){for(var f=a.albums.items.splice(0,20),g=[],h=0;20>h;h++)g.push(f[h].id);l.getAlbums(g).then(function(f){b=b.concat(f.albums),d>=c&&(a.albums.items=b,e.resolve(a))})}}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise},browseCategories:function(a){"undefined"==typeof a&&(a=40);var b=h.defer();return d({cache:!0,method:"GET",url:m+"browse/categories?limit="+a,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getCategory:function(a){var b=h.defer();return d({cache:!0,method:"GET",url:m+"browse/categories/"+a,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getCategoryPlaylists:function(a,b){"undefined"==typeof b&&(b=40);var e=h.defer();return d({cache:!0,method:"GET",url:m+"browse/categories/"+a+"/playlists?limit="+b,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise},getMyFavorites:function(a,b,e,f){if("undefined"==typeof b)var b=25;if("undefined"==typeof e)var e=0;if("undefined"==typeof f)var f="long_term";var g=h.defer();return d({cache:!0,method:"GET",url:m+"me/top/"+a+"?limit="+b+"&offset="+e+"&time_range="+f,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){g.resolve(a)}).error(function(a){k.error(a.error.message),g.reject(a.error.message)}),g.promise},getRecommendations:function(a,b,e,f,g){var i=m+"recommendations/?";"undefined"!=typeof a&&a&&(i+="limit="+a),"undefined"!=typeof b&&b&&(i+="&offset="+b),"undefined"!=typeof e&&e&&(i+="&seed_artists="+e),"undefined"!=typeof f&&f&&(i+="&seed_albums="+f),"undefined"!=typeof g&&g&&(i+="&seed_tracks="+g);var j=h.defer();return d({cache:!0,method:"GET",url:i,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(a){j.resolve(a)}).error(function(a){k.error(a.error.message),j.reject(a.error.message)}),j.promise},getArtist:function(a){var b=this.getFromUri("artistid",a),c=h.defer();return d({cache:!0,method:"GET",url:m+"artists/"+b}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},getArtists:function(a){var b=this,c="";angular.forEach(a,function(a){""!=c&&(c+=","),c+=b.getFromUri("artistid",a)});var e=h.defer();return d({method:"GET",url:m+"artists/?ids="+c}).success(function(a){e.resolve(a)}).error(function(a){k.error(a.error.message),e.reject(a.error.message)}),e.promise},getAlbum:function(a){var b=h.defer(),c=this.getFromUri("albumid",a);return d({method:"GET",url:m+"albums/"+c}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getAlbums:function(a){for(var b=h.defer(),c="",e=0;e0&&(c+=","),c+=a[e];return d({cache:!0,method:"GET",url:m+"albums?ids="+c+"&market="+n}).success(function(a){b.resolve(a)}).error(function(a){k.error(a.error.message),b.reject(a.error.message)}),b.promise},getArtistAlbums:function(a){var b=this.getFromUri("artistid",a),c=h.defer();return d({cache:!0,method:"GET",url:m+"artists/"+b+"/albums?album_type=album,single&market="+n}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},getTopTracks:function(a){var b=this.getFromUri("artistid",a),c=h.defer();return d({cache:!0,method:"GET",url:m+"artists/"+b+"/top-tracks?country="+n}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},getRelatedArtists:function(a){var b=this.getFromUri("artistid",a),c=h.defer();return d({cache:!0,method:"GET",url:m+"artists/"+b+"/related-artists"}).success(function(a){c.resolve(a)}).error(function(a){k.error(a.error.message),c.reject(a.error.message)}),c.promise},getSearchResults:function(a,b,e,f){"undefined"==typeof e&&(e=10),"undefined"==typeof f&&(f=0);var g=h.defer();return d({cache:!0,method:"GET",url:m+"search?q="+b+"&type="+a+"&country="+n+"&limit="+e+"&offset="+f,headers:{Authorization:"Bearer "+c.spotify.AccessToken}}).success(function(b){if("album"==a)for(var c=[],d=Math.ceil(b.albums.items.length/20),e=1;d>e;e++){for(var f=b.albums.items.splice(0,20),h=[],i=0;20>i;i++)h.push(f[i].id);l.getAlbums(h).then(function(a){c=c.concat(a.albums),e>=d&&(b.albums.items=c,g.resolve(b))})}else g.resolve(b)}).error(function(a){k.error(a.error.message),g.reject(a.error.message)}),g.promise}},m="https://api.spotify.com/v1/",n=j.getSetting("spotifycountry","NZ");j.getSetting("spotifylocale","en_NZ");return l}]).factory("SpotifyServiceIntercepter",["$q","$rootScope","$injector","$localStorage",function(a,b,c,d){"use strict";function e(a,b,d){function e(a){b.resolve(a)}function f(a){b.reject(a)}var g=c.get("$http");a.headers={Authorization:"Bearer "+d},g(a).then(e,f)}var f=0,g={responseError:function(b){if(b.config.url.search("https://api.spotify.com/")>=0&&3>f){if(401==b.status){f++;var d=a.defer();return c.get("SpotifyService").refreshToken().then(function(a){return"undefined"!=typeof a.error?b:(f--,void e(b.config,d,a.access_token))}),d.promise}if(0==b.status){var d=a.defer();return c.get("SpotifyService").serviceUnavailable(),d.promise}}return b}};return g}]),angular.module("spotmop.settings",[]).config(["$stateProvider",function(a){a.state("settings",{url:"/settings",templateUrl:"app/settings/template.html"})}]).controller("SettingsController",["$scope","$http","$rootScope","$timeout","MopidyService","SpotifyService","SettingsService","NotifyService","PusherService",function(a,b,c,d,e,f,g,h,i){a.version,a.settings=g.getSettings(),a.currentSubpage="mopidy",a.subpageNavigate=function(b){a.currentSubpage=b},a.authorizeSpotify=function(){f.authorize()},a.refreshSpotifyToken=function(){h.notify("Refreshing token"),f.refreshToken().then(function(){})},a.spotifyLogout=function(){f.logout()},a.upgradeCheck=function(){h.notify("Checking for updates"),g.upgradeCheck().then(function(a){g.setSetting("version",a,"latest"),g.getSetting("version",0,"installed")Select playlist
-
-
- -
-
-
-
+
+
diff --git a/mopidy_spotmop/static/app/settings/template.html b/mopidy_spotmop/static/app/settings/template.html index 7055345..4433f87 100644 --- a/mopidy_spotmop/static/app/settings/template.html +++ b/mopidy_spotmop/static/app/settings/template.html @@ -164,7 +164,7 @@

-
+
Spotify authentication
  Force token refresh diff --git a/mopidy_spotmop/static/assets/css/style.css b/mopidy_spotmop/static/assets/css/style.css index 3d1b20b..f8334bc 100644 --- a/mopidy_spotmop/static/assets/css/style.css +++ b/mopidy_spotmop/static/assets/css/style.css @@ -2590,17 +2590,23 @@ slider .item-container > .square-panel { .add-to-playlist-dialog .select-playlist { padding-top: 15px; - margin: 0 -2%; } - -.add-to-playlist-dialog .playlist { - display: block; + +.add-to-playlist-dialog .playlist-item { + font-size: 16px; + padding: 10px 3%; + border-top: 1px solid #333333; + width: 42%; float: left; - width: 12.6666%; } - -.add-to-playlist-dialog .square-panel .info { - height: 30px; + +.add-to-playlist-dialog .playlist-item:focus, +.add-to-playlist-dialog .playlist-item:active { + background: #08d58f; +} + +.add-to-playlist-dialog .playlist-item:nth-child(2n){ + margin-left: 4%; } @@ -3364,10 +3370,6 @@ slider .item-container > .square-panel { padding-right: 15%; } - .add-to-playlist-dialog .playlist { - width: 21%; - } - /** * Full player (now playing) @@ -3498,6 +3500,12 @@ slider .item-container > .square-panel { width: 100%; } + .add-to-playlist-dialog .playlist-item { + float: none; + width: 94%; + margin-left: 0 !important; + } + .edit-playlist-dialog .actions { padding-left: 0; } diff --git a/mopidy_spotmop/static/assets/css/style.min.css b/mopidy_spotmop/static/assets/css/style.min.css index 873ddae..0de0c1a 100644 --- a/mopidy_spotmop/static/assets/css/style.min.css +++ b/mopidy_spotmop/static/assets/css/style.min.css @@ -1,4 +1,4 @@ -.button,.menu-item,.noselect,body.dragging *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.button,.menu-item,.noselect,.tracklist .track,body.dragging *{-webkit-touch-callout:none;-khtml-user-select:none}.fa-ul,.main-menu .submenu>.menu-item{list-style-type:none}contextmenu{position:fixed;display:none;top:0;left:0;z-index:10;background:#222;color:#FFF;min-width:110px}contextmenu .menu-item{display:block;padding:8px 14px 8px 10px;border-bottom:1px solid rgba(255,255,255,.05);position:relative}contextmenu .menu-item.has-submenu i{position:absolute;top:8px;right:8px}contextmenu .menu-item:hover{background:#333;cursor:pointer}contextmenu .menu-item:hover>.sub-menu{display:block}contextmenu .sub-menu{display:none;position:absolute;right:-150px;background:#333;top:0;width:150px;max-height:306px;overflow-y:scroll}contextmenu.close-right .sub-menu,contextmenu.hard-right .sub-menu{right:auto;left:-150px}contextmenu.close-bottom .sub-menu,contextmenu.hard-bottom .sub-menu{top:auto;bottom:0}contextmenu .sub-menu>.menu-item:hover{background:#414141}#app:not(.touchDevice) contextmenu .menu-item i{font-size:8px;padding-right:5px;vertical-align:top;margin-top:5px}.touchDevice contextmenu{padding-left:5px;position:fixed;top:0;right:0;left:0;z-index:99}.touchDevice contextmenu .menu-item{display:block;float:left;padding:14px 0 12px;width:45px;text-align:center;border:0}.touchDevice contextmenu .menu-item.cancel{opacity:.5;float:right}.touchDevice contextmenu .menu-item .icon{font-size:16px}.touchDevice contextmenu .menu-item .text{font-size:8px;display:block;text-transform:uppercase;padding-top:5px}body,html{background:#f5f5f5;color:#000;font-family:'Archivo Narrow',Helvetica,Arial,sans-serif;font-size:14px}body{overflow-y:scroll;overflow-x:hidden}*{border:0;padding:0;margin:0}.button,.menu-item,body.dragging *{user-select:none}body.dragging,body.dragging *,body.dragging .body,body.dragging .body *{cursor:-webkit-grabbing!important;cursor:-moz-grabbing!important}#body,#sidebar{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#sidebar{position:fixed;top:0;left:0;bottom:0;width:20%;overflow:hidden;background:#111;z-index:1}#sidebar>.background-image{position:absolute;top:-50px;right:0;bottom:-50px;left:-50px;opacity:.3;z-index:1}#sidebar>.background-image .image{position:absolute;top:0;left:0;bottom:0;right:0;opacity:0;background-position:0 50%;background-size:cover}#sidebar>.inner{z-index:2;top:0;left:0;bottom:0;right:0;position:absolute;overflow-x:hidden;overflow-y:auto}#player{position:fixed;bottom:20px;left:0;width:20%;z-index:3}#body{padding-left:20%;position:relative;min-height:100vh}.page>.inner{padding:40px}.col{float:left;min-height:1px}.col.w5{width:5%}.col.w10{width:10%}.col.w15{width:15%}.col.w20{width:20%}.col.w25{width:25%}.col.w30{width:30%}.col.w35{width:35%}.col.w40{width:40%}.col.w45{width:45%}.col.w50{width:50%}.col.w55{width:55%}.col.w60{width:60%}.col.w65{width:65%}.col.w70{width:70%}.col.w75{width:75%}.col.w80{width:80%}.col.w85{width:85%}.col.w90{width:90%}.col.w95{width:95%}.col.w100{width:100%}.min-width{display:inline-block}.min-width.w50{min-width:50px}.min-width.w100{min-width:100px}.min-width.w150{min-width:150px}.min-width.w200{min-width:200px}.transitioning,.transitioning:hover{opacity:.2}.noselect{user-select:none}.main-menu .divider{padding:20px 0 5px 10px;font-size:11px;color:#FFF;opacity:.4;text-transform:uppercase}.main-menu .divider.spacer{height:0}.main-menu .menu-item:last-child{padding-bottom:20px}.main-menu a.unavailable{opacity:.5}.main-menu .menu-item>a{display:block;padding:8px 0 8px 10px;color:#FFF;text-decoration:none;font-size:16px;background-image:url(../svg/white-diamond.svg);background-position:110% 50%;background-repeat:no-repeat;border-left:4px solid transparent}.main-menu .menu-item>a.droppable.dropping,.main-menu .menu-item>a.droppable.dropping:hover{background-color:#08d58f}.main-menu .menu-item .info{font-size:12px;opacity:.5;padding:2px 20px 0 0;float:right}.main-menu>.menu-item>a>i.services-alert{float:right;padding:3px 12px 0 0}.main-menu .menu-item.active>a{background-color:rgba(0,0,0,.15);border-color:#08d58f}.main-menu .menu-item:not(.active)>a:hover{background-color:rgba(255,255,255,.05)}.main-menu .playlists-submenu-trigger{float:right;display:block;opacity:.5;margin-top:-7px;padding:6px 15px}.main-menu .playlists-submenu-trigger i{font-size:12px}.menu-reveal-trigger{position:absolute;top:1px;left:0;display:none;color:#FFF;font-size:17px;padding:16px;cursor:pointer;z-index:9}.main-menu .dragging-note{display:none;float:right;color:#333;font-size:12px;padding-right:7px;padding-top:2px}.dragging .main-menu .dropping>.dragging-note,.dragging .main-menu :hover>.dragging-note{display:block}.main-menu .submenu{display:none}.main-menu .menu-item.active .submenu,.main-menu .menu-item.section .submenu{display:block}.main-menu .submenu>.menu-item a{padding-left:39px}.main-menu .submenu.playlists{position:absolute;top:0;right:0;bottom:0;left:100%;overflow:hidden;background:rgba(48,48,48,.95);padding:20px 0;z-index:1;display:block}.main-menu .submenu.playlists .menu-item>a{color:#FFF;font-size:16px;padding:10px 0 10px 20px}.dragging .main-menu .menu-item.top-level.playlists.dropping-within .submenu.playlists,.main-menu .menu-item.top-level.playlists.show-submenu .submenu.playlists{left:20%}.sub-page-navigation{margin-bottom:35px;margin-top:-15px}.sub-page-navigation .menu-item{padding:12px 0;margin-right:25px;border-bottom:3px solid transparent;display:inline-block;font-size:18px;text-transform:capitalize}.breadcrumbs,.capitalize,.info-text,.player .track-info,h4.section-title{text-transform:uppercase}.sub-page-navigation .menu-item>i{font-size:6px;vertical-align:middle;margin-top:-4px;padding-right:2px}.sub-page-navigation .menu-item:hover{border-color:rgba(255,255,255,.5);cursor:pointer}.search-page .sub-page-navigation .menu-item:hover{border-color:#AAA}.sub-page-navigation .menu-item.active{border-color:#08d58f}.critical-services-status{padding-left:29px;padding-top:5px}#loading-bar .bar{left:20%!important;right:0!important}#loading-bar-spinner{right:10px!important;left:auto!important}#dropzones{display:none;position:fixed;top:0;left:0;bottom:0;width:20%;z-index:98;background:rgba(0,0,0,.75)}.dragging #dropzones{display:block}#dropzones>.dropzone{background:#444;text-align:center;font-size:20px;color:#FFF;margin:20px 20px 0;line-height:20px}#dropzones>.dropzone.disabled{background:#222}#dropzones .dropzone .dropzone.dropping,#dropzones .dropzone .menu-item.dropping,#dropzones .dropzone.dropping-within>.liner:not(.hover-content),#dropzones .dropzone.dropping>.liner:not(.hover-content){background:#08d58f}#dropzones>.dropzone.disabled>.liner{opacity:.3}#dropzones .dropzone>.liner{padding:50px 20px}#dropzones .dropzone.dropping .default-content,#dropzones .dropzone.dropping-within .default-content,#dropzones .dropzone:not(.dropping):not(.dropping-within) .hover-content{display:none}#dropzones .dropzone.dropping .hover-content,#dropzones .dropzone.dropping-within .hover-content{display:block!important}#dropzones .dropzone .label{padding-top:20px}#dropzones .dropzone .menu-item{display:block;text-align:left;padding:10px 20px;color:#FFF;text-decoration:none;font-size:16px}.drag-tracer .text,.drag-tracer .track-title{font-size:12px;vertical-align:top;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.drag-tracer,.drag-tracer .track-title{background:#32b5f2;box-shadow:1px 1px 5px rgba(0,0,0,.2)}#dropzones .dropzone .menu-item:not(:last-child){border-bottom:1px solid rgba(255,255,255,.1)}#dropzones .dropzone.playlists>.liner.hover-content,#dropzones .dropzone.queue>.liner.hover-content{padding:0}#dropzones .dropzone.queue .dropzone.add-to-queue{padding:30px 20px 20px}#dropzones .dropzone.queue .dropzone.add-to-queue-next{padding:14.5px 20px;border-top:1px solid rgba(255,255,255,.1)}#dropzones .dropzone.queue .dropzone.add-to-queue-next .label{padding:0}.clear-both{clear:both}.clear-left{clear:left}.clear-right{clear:right}.hide{display:none!important}.invisible{visibility:hidden!important}:focus{outline:0}.spacer{height:40px}.animate,.button,.main-menu a,.opacity-hover,button,input[type=submit]{-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.loading .animate,.loading .button,.loading .main-menu a,.loading .opacity-hover,.loading button,.loading input[type=submit]{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}@-moz-keyframes spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(360deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}.fadereveal{-webkit-animation:fadereveal .2s linear;-moz-animation:fadereveal .2s linear;-o-animation:fadereveal .2s linear;animation:fadereveal .2s linear;-webkit-animation-fill-mode:forward;-moz-animation-fill-mode:forward;-o-animation-fill-mode:forward;animation-fill-mode:forward}@-moz-keyframes fadereveal{0%{display:none;opacity:0}99%{display:block}100%{display:block;opacity:1}}@-webkit-keyframes fadereveal{0%{display:none;opacity:0}99%{display:block}100%{display:block;opacity:1}}@keyframes fadereveal{0%{display:none;opacity:0}99%{display:block}100%{display:block;opacity:1}}.opacity-hover{opacity:.5}.opacity-hover:hover{opacity:1}.blur{-webkit-filter:blur(10px);filter:blur(10px)}.invert{-webkit-filter:invert(100%);filter:invert(100%)}.drag-tracer{position:fixed;color:#FFF;z-index:99;display:none;pointer-events:none}.drag-tracer .track-title{padding:8px 12px;position:absolute;top:0;left:0;width:100px;z-index:3}.drag-tracer .track-title:nth-child(2){top:5px;left:5px;z-index:2;background:#29abe8}.drag-tracer .track-title:nth-child(3){top:10px;left:10px;z-index:1;background:#23a4e0}.drag-tracer .thumbnail{float:left;width:40px;height:40px;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.drag-tracer .text{float:left;padding:12px 15px;max-width:150px}.tooltip-wrapper{z-index:2;position:relative}.tooltip-wrapper .tooltip{display:none;position:absolute;top:0;right:0;background:#DDD;color:#333;font-size:11px;padding:2px 5px}.tooltip-wrapper:hover .tooltip{display:block}.popularity .tooltip{z-index:-1;top:-5px;right:-8px;padding:5px 16px 5px 8px}.popularity:hover .bar-track{background:#FFF}.si,.si.play{background-position:0 0}.si,.ssi{background-repeat:no-repeat;padding:0;display:inline-block;vertical-align:top}.si{width:16px;height:16px;background-image:url(../icons/icons.svg);margin-top:2px;margin-right:5px}.si.doublesize{width:32px;height:32px;background-size:32px 512px}.si.explore{background-position:0 -16px}.si.playlist{background-position:0 -32px}.si.music{background-position:0 -48px}.si.cog{background-position:0 -64px}.si.folder{background-position:0 -80px}.si.leaf{background-position:0 -96px}.si.star{background-position:0 -112px}.si.mic{background-position:0 -128px}.si.album{background-position:0 -144px}.si.grid{background-position:0 -160px}.si.find{background-position:0 -176px}.si.next{background-position:0 -192px}.si.prev{background-position:0 -208px}.si.play.doublesize{background-position:0 0}.si.explore.doublesize{background-position:0 -32px}.si.playlist.doublesize{background-position:0 -64px}.si.music.doublesize{background-position:0 -96px}.si.cog.doublesize{background-position:0 -128px}.si.folder.doublesize{background-position:0 -160px}.si.leaf.doublesize{background-position:0 -192px}.si.star.doublesize{background-position:0 -224px}.si.mic.doublesize{background-position:0 -256px}.si.album.doublesize{background-position:0 -288px}.si.grid.doublesize{background-position:0 -320px}.si.find.doublesize{background-position:0 -352px}.si.next.doublesize{background-position:0 -384px}.si.prev.doublesize{background-position:0 -416px}.ssi,.ssi.local{background-position:0 0}.ssi{width:16px;height:16px;background-image:url(../icons/source-icons.svg);margin-top:1px}.ssi.soundcloud{background-position:0 -16px}.ssi.spotify{background-position:0 -32px}.playing .ssi.local{background-position:-16px 0}.playing .ssi.soundcloud{background-position:-16px -16px}.playing .ssi.spotify{background-position:-16px -32px}#notifications{position:fixed;z-index:9;top:15px;left:20%;right:0;text-align:center;pointer-events:none}#notifications .notification{color:#FFF;display:inline-block;padding:10px 18px;background-color:rgba(0,0,0,.6);margin:0 1px}#notifications .notification.keyboard-shortcut{position:fixed;top:50%;left:50%;width:300px;margin:-150px 0 0 -150px;text-align:center;border-radius:10px}#notifications .notification.keyboard-shortcut i{line-height:300px;font-size:120px}#notifications .notification:not(.keyboard-shortcut):first-child{border-radius:100px 0 0 100px}#notifications .notification:not(.keyboard-shortcut):last-child{border-radius:0 100px 100px 0}#notifications .notification:not(.keyboard-shortcut):only-child{border-radius:100px}#notifications .notification.bad,#notifications .notification.error{background-color:rgba(214,47,47,.9)}#notifications .notification.good{background-color:rgba(53,204,53,.9)}.page-notification{margin:-40px -40px 30px;padding:20px 40px;font-size:16px}h1{font-size:40px;font-weight:200;padding-bottom:35px;margin-top:-10px}.heading-wrapper>h1{display:inline-block}h2{font-size:20px;font-weight:300}h3{font-size:18px;font-weight:600}h4{font-size:14px;font-weight:400}h4.section-title{font-weight:600;padding-bottom:5px}.bold-text,.no-items{font-weight:700}.underline{border-bottom:1px solid #999;padding-bottom:5px;margin-bottom:5px}.body a{color:inherit;text-decoration:none;border-bottom:1px dotted transparent;cursor:pointer}.body a:hover{border-color:inherit}.info-text{color:#AAA;padding-top:5px}.breadcrumbs{margin-top:-20px;color:#CCC}.breadcrumbs .divider{padding:0 3px}.white-text{color:#FFF}.black-text{color:#000}.grey-text{color:#AAA}.red-text{color:#d62f2f}.green-text{color:#35cc35}.primary-colour-text{color:#08d58f}.white-background{background-color:#FFF}.grey-background{background-color:#DDD}.black-background{background-color:#000}.red-background{background-color:#d62f2f}.green-background{background-color:#35cc35}.primary-colour-background{background-color:#08d58f}.italic-text{font-style:italic}.no-items{text-align:center;font-size:16px;color:#CCC;padding-top:50px}.flag{background:#EEE;display:inline-block;border-radius:3px;padding:3px 6px;font-size:11px;font-weight:400;margin-left:10px;margin-right:-10px}h1 .flag{vertical-align:top;margin-top:13px}.flag.blue{background:#08d58f;color:#FFF}.flag.clickable:hover{background:rgba(0,0,0,.65);color:rgba(255,255,255,.85)}.flag.dark{background:rgba(0,0,0,.4);color:rgba(255,255,255,.5)}.flag.black{background:rgba(0,0,0,.55);color:rgba(255,255,255,.8)}.flag.red{background:rgba(214,47,47,.9);color:#FFF}.flag.green{background:rgba(53,204,53,.9);color:#FFF}.flag.clickable{cursor:pointer}.flag.clickable.destructive:hover{background:rgba(214,47,47,.9);color:#FFF;cursor:pointer}.body .button,.dialog .button.primary,.dialog .button.secondary{display:inline-block;padding:12px 22px;margin-right:-3px;cursor:pointer;color:#FFF;border:0}.body .button,.dialog .button.secondary{background:#9b9b9b}.body .button:hover,.dialog .button.secondary:hover{background:#8B8B8B}.body .button .fa{margin-top:2px;margin-left:-2px;vertical-align:top}.body .heading-wrapper .button{vertical-align:top;margin-left:10px}.body .button.primary,.dialog .button.primary{background:#08d58f}.body .button.primary:hover,.dialog .button.primary:hover{background:#03c784}.body .button.destructive{background:#cf2d2d}.body .button.destructive:hover{background:#bc1f1f}.body .button.tertiary{background:#EEE;color:#AAA}.bar-track,.body .button.tertiary:hover{background:#DDD}.body .button.disabled,.body .button.disabled:hover{cursor:not-allowed;opacity:.5}.body .button.float-right{float:right}.body .follow-unfollow .unfollow{min-width:50px;text-align:center}.body .follow-unfollow.following>.follow,.body .follow-unfollow:not(.following)>.unfollow{display:none}.bar-track{display:inline-block;width:5px;position:relative;height:12px}.bar-track .bar{position:absolute;left:0;right:0;bottom:0;background:#666}.artist-grid .artist .image,.artist-list .artist .thumbnail{background-image:url(../svg/no-image.svg);background-repeat:no-repeat;background-position:50% 50%;background-size:cover;display:block}.info-text .bar-track{vertical-align:top;margin-top:7px}.artist-list .artist{display:block;clear:both;padding:10px 0;margin-bottom:5px;border:0!important}.artist-list .artist .thumbnail{width:50px;height:50px;border-radius:100px;float:left;margin-right:14px;background-color:#E9E9E9;border:2px solid #f5f5f5}.artist-list .artist:hover .thumbnail{opacity:.75;border-color:#08d58f}.artist-list .artist .name{padding-top:15px;padding-left:65px;font-weight:300;font-size:15px;display:block}.artist-grid{padding:0}.artist-grid .artist{display:block;float:left;border:0!important;width:50%;position:relative}.artist-grid .artist .image{width:100%;padding-bottom:100%;background-color:#777}.artist-grid .artist .name-wrapper{position:absolute;top:0;left:0;bottom:-.5px;right:0;text-align:center;color:#FFF;opacity:0;background:rgba(0,0,0,.8)}.image-container .image.placeholder,.square-panel .image-container .image,.thumbnail.placeholder{background-color:#E9E9E9;background-image:url(../svg/no-image.svg);background-position:50% 50%}.artist-grid .artist:hover .name-wrapper{opacity:1}.artist-grid .artist .name{padding-top:45%;font-weight:700}.square-panels{margin-left:-2%;margin-right:-2%}.square-panel{width:16%;margin:0 2% 3%;display:block;float:left;text-decoration:none;color:inherit;border:none!important}.square-panel .image-container{position:relative;width:100%;padding-bottom:100%}.square-panel .image-container .image{position:absolute;top:0;right:0;bottom:0;left:0;background-repeat:no-repeat;background-size:cover}.square-panel .image-container .overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;max-width:100%;max-height:100%}.image-container .image.placeholder,.thumbnail.placeholder{background-size:80% 80%}.square-panel:hover .image-container .image{opacity:.75}.square-panel .info{padding-top:10px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-top:3px solid transparent;margin-top:-3px;position:relative;height:50px}.square-panel .info.smaller{height:30px}.square-panel:hover .info{border-color:#08d58f}.square-panel .info .secondary{padding-top:2px;color:#AAA}.square-panel .info .name,.square-panel .info .tracks{overflow:hidden;max-height:2.6em}.square-panels.smaller{margin-left:-1%;margin-right:-1%}.square-panels.smaller .square-panel{width:12.28%;margin:0 1% 3%}.square-panel.category .name{position:absolute;padding-bottom:20%;border-bottom:3px solid transparent;left:0;right:0;bottom:0;text-align:center;color:#FFF;font-weight:700;font-size:16px}.square-panel.category:hover .name{border-color:#08d58f;padding-bottom:21%}.square-panel.library-album{width:90%;margin:0}.square-panel.library-album:hover .image{opacity:1}.tracklist .track{display:block;padding:10px;border-top:1px solid #EEE;border-bottom:1px solid #EEE;margin-bottom:-1px;cursor:pointer;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.track .album,.track .artist,.track .info,.track .title{float:left;min-height:1px}.track .source{display:none}.track .album,.track .artist,.track .title{width:30%}.track .info{width:10%;text-align:right}#full-player,.fa-fw,.fa-li,.fa-stack-1x,.fa-stack-2x,.player .track-info{text-align:center}.track .info .duration{display:inline-block;padding-right:20px}.track .info .popularity{position:absolute;top:11px;right:10px}.track .source{position:absolute;top:9px;right:5px}.tracklist.queue-tracks .track .source,.tracklist.search-results.other .track .source{display:inline-block}body:not(.dragging):not(.touchDevice) .tracklist .track:not(.selected):hover{background:#F4F4F4;border-color:#EEE}body.dragging .tracklist .track.selected{opacity:.5}.tracklist .track.selected,.tracklist .track.selected:hover{background:#FFF39C}.tracklist .track.playing{font-weight:700}body.dragging .tracklist .track.dropping,body.dragging .tracklist .track:hover{border-top:3px solid #32b5f2;margin-top:-3px}.track.folder .icon{width:24px;float:left}.track.folder .title{width:auto}.intro preloadedimage{position:absolute;top:-30px;right:-30px;bottom:-30px;left:-30px;overflow:hidden;opacity:0;background-position:50% -100px;background-repeat:no-repeat;background-size:cover}slider{height:250px;display:block;position:relative;margin-bottom:40px}slider.square-panels{margin-left:0;margin-right:-40px}slider .controls{position:absolute;top:-40px;right:40px;z-index:5}slider .controls .si{cursor:pointer;margin:5px;opacity:.7}slider .controls .si:hover{opacity:1}slider .slides{overflow:hidden;position:relative;height:100%}slider .slides-content{position:absolute;top:0;left:0;width:500%}slider .item-container{float:left;width:4%}slider .item-container>.square-panel{width:80%;margin:0}.queue-intro{padding-bottom:20px}.now-playing-page .page-header{display:none}.album-intro h1{padding:20px 0 0}.album-intro .square-panel{margin:0 30px 20px 0;width:250px;height:250px}.album-intro .image{background-color:#EEE;background-size:cover;background-position:50% 50%;opacity:1!important}.album-intro .info-text{padding-top:20px}.album-page .intro,.playlist-page .intro{position:relative;margin:0 0 50px}.asset-sidebar{width:20%;position:absolute;top:0;left:20%;bottom:0;background:#EEE}.content.has-asset-sidebar{padding-left:25%}.content.has-asset-sidebar>.inner{padding:40px 20px}.album-page .album.thumbnail,.playlist-page .playlist.thumbnail{width:100%;padding-bottom:100%;margin:0;background-image:url(../svg/no-image.svg);background-color:#E9E9E9;background-position:50% 50%;background-size:cover}.album-page h1,.playlist-page h1{padding-bottom:0;padding-top:15px;margin:0}.album-page h2,.playlist-page h2{font-style:italic;color:#888;font-weight:100;padding-top:5px}.album-page .asset-sidebar .info,.playlist-page .asset-sidebar .info{padding:14px 20px;margin-top:1px}.album-page .asset-sidebar .info>.info-item,.playlist-page .asset-sidebar .info>.info-item{padding:2px 0;color:#AAA}.album-page .asset-sidebar .info .bar-track,.playlist-page .asset-sidebar .info .bar-track{vertical-align:top;margin-top:7px;margin-left:6px}.playlist-owner{display:block;padding-top:10px;border:0!important}.playlist-owner:hover .thumbnail .border{border-color:#08d58f}.playlist-owner .name{display:block;font-size:15px;font-weight:300;padding-left:40px;padding-top:5px}.playlist-owner .thumbnail .border{display:block;position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;border:2px solid #eee;border-radius:60px;z-index:2}.playlist-owner .thumbnail{background-color:#e9e9e9;background-image:url(../svg/no-image.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:cover;border-radius:60px;display:block;float:left;height:30px;margin-right:8px;width:30px;position:relative}.artist-intro{position:relative;margin:-40px -40px 30px;padding:0 20px;height:50vh}.artist-intro h1{padding-bottom:10px}.artist-intro .menu-item,.artist-intro h1{color:#FFF}.artist-intro .image-container{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;z-index:-1;background:#444}.artist-intro .image-container .image{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0}.artist-intro .image-container canvas{background-color:#444}.artist-page .title-panel{position:absolute;bottom:0;left:0;padding-left:330px}.artist-page .sub-page-navigation{margin:0}.artist-page .info-panel{padding-left:290px;margin-bottom:50px;position:relative}.artist-page .info-panel .thumbnail{width:250px;height:250px;background-image:url(../svg/no-image.svg);background-color:#E9E9E9;background-size:cover;background-position:50% 50%;position:absolute;bottom:0;left:0}.artist-page .info-panel .buttons{padding-right:20px}.artist-page .info-panel .info-text{display:inline-block;vertical-align:top}.tracklist.top-track-items{padding-bottom:30px}.gallery-item img{max-width:90%}.biography .content{font:inherit;width:100%;font-size:18px;line-height:1.4em;white-space:pre-wrap}.player .track-info .artist,.player .track-info .track{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.biography .details{padding:20px 0;color:#666}.discover .discover-section{clear:both;padding-bottom:20px}.discover .discover-section .section-title{padding-bottom:20px}.library-albums .full-album{padding-bottom:40px}.library-albums .full-album .album-title{padding:0 10px 15px}.featured-playlists-intro{position:relative;margin:-40px -40px 40px;padding:0 20px;height:30vh;background:#303030}.featured-playlists-intro>.inner{z-index:1;position:relative;color:#FFF;text-align:center;padding-top:13vh}.search-results-section.tracks,.user-intro .info{padding-top:30px}.featured-playlists-intro>.image-container{position:absolute;top:0;left:0;right:0;bottom:0}.featured-playlists-intro>.image-container>.image{position:absolute;top:0;left:0;right:0;bottom:0;opacity:0}.user-intro{padding-bottom:30px}.user-intro .info-text{margin-top:-20px}.user-intro .image-container .image{width:120px;height:120px;border-radius:120px;float:left;background-size:cover;background-position:50% 50%;margin-right:20px}.search .loading{margin:50px auto;width:70px;height:70px}.search .loading img{width:100%;height:100%}.search .sub-page-navigation{margin:-10px 0 30px}.search-results-section.albums,.search-results-section.artists,.search-results-section.playlists{width:30.6667%;float:left}.search-results-section.albums,.search-results-section.artists{padding-right:4%}.search-results-section .square-panel{width:46%}.search-results-section .square-panel .info{height:60px}.settings>.section{padding-bottom:40px}.settings .section-title .state-label{display:inline-block;padding:1px 3px;font-size:11px;margin-left:5px}.actions{clear:both;padding:40px 0 0 15%}.sub-page{padding:10px 0 20px}.settings .field.current-user .input{padding-top:8px}.settings .field.current-user .image-container>.image{width:36px;height:36px;float:left;border-radius:36px;margin-right:10px;margin-top:-10px;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-color:#CCC}.settings .field .view-my-profile{display:inline-block;vertical-align:top;position:relative;z-index:1;margin-top:1px;margin-left:-35px;padding:10px;border:0}.settings .field.shortcut-keys .shortcuts{padding-top:15px}.settings .field.shortcut-keys .row{padding-bottom:5px}.settings .field.shortcut-keys .row .flag{margin-left:0}#player{color:#FFF}#player>.background-image{display:none}.player .button{padding:5px;margin:0 5px;font-size:14px;opacity:.75;display:inline-block;background:0 0}.player .button.active,.player .button:hover{opacity:1;cursor:pointer}.player .button.active{color:#08d58f}.player .track-info{font-size:16px;padding-bottom:20px;padding-left:15px;padding-right:15px}.player .track-info .artist{opacity:.5}.player .track-info .artist a{text-decoration:none;color:#FFF;border-bottom:1px dotted transparent}.player .track-info .artist a:hover{border-color:#FFF}#player .playback{float:left;padding-left:15px}#player .volume{float:right;padding-right:20px}#player .volume.touch-friendly{display:none}#player .volume .slider{display:inline-block;width:40px;vertical-align:middle;padding:8px 0}.player .slider{cursor:pointer}#player .slider.progress{padding-top:5px;position:fixed;bottom:0;left:0;right:0;z-index:8}#player .slider.progress .track{height:4px;background:0 0}#player .slider.progress:hover .track{height:12px;background:rgba(0,0,0,.15)}.player .slider .track{position:relative;height:2px;background:rgba(255,255,255,.3)}.player .slider .track .fill{position:absolute;top:0;left:0;bottom:0;background:#08d58f;max-width:100%}.player .slider .track .fill.animate{-webkit-transition:all 1s;-moz-transition:all 1s;-o-transition:all 1s;transition:all 1s}#full-player .artwork{width:400px;padding-bottom:400px;margin:0 auto 20px;position:relative;background:#EEE;display:block;border:0}#full-player .controls{width:400px;margin:0 auto}#full-player .artwork .image{position:absolute;top:0;right:0;bottom:0;left:0;background-image:url(../svg/no-image.svg);background-size:cover;background-position:50% 50%}#full-player .track-info{color:#000;font-weight:600}#full-player .track-info .artist a{color:#000;display:inline-block}#full-player .track-info .artist a:hover{border-color:#000}#full-player .button{color:#000;font-size:20px}#full-player .button.active{color:#08d58f}#full-player .button:hover{opacity:1;background:0 0}#full-player .track-timer{float:right;margin-top:12px}#full-player .track-timer .current{opacity:.5;padding-right:2px;display:inline-block}#full-player .volume,.dialog .field.radio input{display:none}#full-player .progress.slider{margin:35px 0;position:relative}#full-player .slider .track{background:#DDD;height:4px}.dialog .dialog-title{padding-bottom:20px}.dialog .background{background:rgba(0,0,0,.95);position:fixed;top:0;right:0;bottom:0;left:0;z-index:11}.dialog .content{position:fixed;top:0;right:0;bottom:0;left:0;padding:6% 20%;color:#FFF;z-index:12;overflow-y:auto}.dialog .button.close-dialog{position:fixed;top:20px;right:20px;font-size:30px;cursor:pointer;z-index:13;color:#FFF;width:30px}.dialog .button.close-dialog img{max-width:100%}.dialog .button.destructive:hover{color:#d62f2f}.dialog .button.productive:hover{color:#35cc35}.dialog .field .label{font-size:16px}.dialog .field.text input{padding:5px 0;background:0 0;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:200;color:#FFF;border:0;border-bottom:2px solid #FFF}.dialog .field.text input:focus{border-color:#1cf4c4}.dialog .field.large input{padding:10px 0;font-size:30px;width:70%}.dialog .field.switch .label{padding-top:6px}.dialog .field.radio .label{display:inline-block;float:none;width:auto;padding:5px 30px;position:relative;cursor:pointer}.dialog .field.radio input+.label:before{content:' ';display:inline-block;width:16px;height:16px;border-radius:50%;border:2px solid #FFF;position:absolute;top:4px;left:0}.add-to-playlist-dialog .square-panel .info,.volume-controls-dialog .slider .track{height:30px}.dialog .field.radio input:checked+.label:before{background:#FFF;box-shadow:inset 0 0 0 5px #111}.dialog .switch-button,.dialog .switch-button.on{background:rgba(255,255,255,.2)}.dialog .actions{padding-left:0;padding-top:30px}.dialog .actions .working{padding-top:5px;width:30px;height:30px}.add-to-playlist-dialog .select-playlist{padding-top:15px;margin:0 -2%}.add-to-playlist-dialog .playlist{display:block;float:left;width:12.6666%}.fa,.fa-stack{display:inline-block}.volume-controls-dialog .volume{padding-top:50px}.dialog .initial-setup-dialog .dialog-title{padding-bottom:0}/*! +.button,.menu-item,.noselect,body.dragging *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.button,.menu-item,.noselect,.tracklist .track,body.dragging *{-webkit-touch-callout:none;-khtml-user-select:none}.fa-ul,.main-menu .submenu>.menu-item{list-style-type:none}contextmenu{position:fixed;display:none;top:0;left:0;z-index:10;background:#222;color:#FFF;min-width:110px}contextmenu .menu-item{display:block;padding:8px 14px 8px 10px;border-bottom:1px solid rgba(255,255,255,.05);position:relative}contextmenu .menu-item.has-submenu i{position:absolute;top:8px;right:8px}contextmenu .menu-item:hover{background:#333;cursor:pointer}contextmenu .menu-item:hover>.sub-menu{display:block}contextmenu .sub-menu{display:none;position:absolute;right:-150px;background:#333;top:0;width:150px;max-height:306px;overflow-y:scroll}contextmenu.close-right .sub-menu,contextmenu.hard-right .sub-menu{right:auto;left:-150px}contextmenu.close-bottom .sub-menu,contextmenu.hard-bottom .sub-menu{top:auto;bottom:0}contextmenu .sub-menu>.menu-item:hover{background:#414141}#app:not(.touchDevice) contextmenu .menu-item i{font-size:8px;padding-right:5px;vertical-align:top;margin-top:5px}.touchDevice contextmenu{padding-left:5px;position:fixed;top:0;right:0;left:0;z-index:99}.touchDevice contextmenu .menu-item{display:block;float:left;padding:14px 0 12px;width:45px;text-align:center;border:0}.touchDevice contextmenu .menu-item.cancel{opacity:.5;float:right}.touchDevice contextmenu .menu-item .icon{font-size:16px}.touchDevice contextmenu .menu-item .text{font-size:8px;display:block;text-transform:uppercase;padding-top:5px}body,html{background:#f5f5f5;color:#000;font-family:'Archivo Narrow',Helvetica,Arial,sans-serif;font-size:14px}body{overflow-y:scroll;overflow-x:hidden}*{border:0;padding:0;margin:0}.button,.menu-item,body.dragging *{user-select:none}body.dragging,body.dragging *,body.dragging .body,body.dragging .body *{cursor:-webkit-grabbing!important;cursor:-moz-grabbing!important}#body,#sidebar{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#sidebar{position:fixed;top:0;left:0;bottom:0;width:20%;overflow:hidden;background:#111;z-index:1}#sidebar>.background-image{position:absolute;top:-50px;right:0;bottom:-50px;left:-50px;opacity:.3;z-index:1}#sidebar>.background-image .image{position:absolute;top:0;left:0;bottom:0;right:0;opacity:0;background-position:0 50%;background-size:cover}#sidebar>.inner{z-index:2;top:0;left:0;bottom:0;right:0;position:absolute;overflow-x:hidden;overflow-y:auto}#player{position:fixed;bottom:20px;left:0;width:20%;z-index:3}#body{padding-left:20%;position:relative;min-height:100vh}.page>.inner{padding:40px}.col{float:left;min-height:1px}.col.w5{width:5%}.col.w10{width:10%}.col.w15{width:15%}.col.w20{width:20%}.col.w25{width:25%}.col.w30{width:30%}.col.w35{width:35%}.col.w40{width:40%}.col.w45{width:45%}.col.w50{width:50%}.col.w55{width:55%}.col.w60{width:60%}.col.w65{width:65%}.col.w70{width:70%}.col.w75{width:75%}.col.w80{width:80%}.col.w85{width:85%}.col.w90{width:90%}.col.w95{width:95%}.col.w100{width:100%}.min-width{display:inline-block}.min-width.w50{min-width:50px}.min-width.w100{min-width:100px}.min-width.w150{min-width:150px}.min-width.w200{min-width:200px}.transitioning,.transitioning:hover{opacity:.2}.noselect{user-select:none}.main-menu .divider{padding:20px 0 5px 10px;font-size:11px;color:#FFF;opacity:.4;text-transform:uppercase}.main-menu .divider.spacer{height:0}.main-menu .menu-item:last-child{padding-bottom:20px}.main-menu a.unavailable{opacity:.5}.main-menu .menu-item>a{display:block;padding:8px 0 8px 10px;color:#FFF;text-decoration:none;font-size:16px;background-image:url(../svg/white-diamond.svg);background-position:110% 50%;background-repeat:no-repeat;border-left:4px solid transparent}.main-menu .menu-item>a.droppable.dropping,.main-menu .menu-item>a.droppable.dropping:hover{background-color:#08d58f}.main-menu .menu-item .info{font-size:12px;opacity:.5;padding:2px 20px 0 0;float:right}.main-menu>.menu-item>a>i.services-alert{float:right;padding:3px 12px 0 0}.main-menu .menu-item.active>a{background-color:rgba(0,0,0,.15);border-color:#08d58f}.main-menu .menu-item:not(.active)>a:hover{background-color:rgba(255,255,255,.05)}.main-menu .playlists-submenu-trigger{float:right;display:block;opacity:.5;margin-top:-7px;padding:6px 15px}.main-menu .playlists-submenu-trigger i{font-size:12px}.menu-reveal-trigger{position:absolute;top:1px;left:0;display:none;color:#FFF;font-size:17px;padding:16px;cursor:pointer;z-index:9}.main-menu .dragging-note{display:none;float:right;color:#333;font-size:12px;padding-right:7px;padding-top:2px}.dragging .main-menu .dropping>.dragging-note,.dragging .main-menu :hover>.dragging-note{display:block}.main-menu .submenu{display:none}.main-menu .menu-item.active .submenu,.main-menu .menu-item.section .submenu{display:block}.main-menu .submenu>.menu-item a{padding-left:39px}.main-menu .submenu.playlists{position:absolute;top:0;right:0;bottom:0;left:100%;overflow:hidden;background:rgba(48,48,48,.95);padding:20px 0;z-index:1;display:block}.main-menu .submenu.playlists .menu-item>a{color:#FFF;font-size:16px;padding:10px 0 10px 20px}.dragging .main-menu .menu-item.top-level.playlists.dropping-within .submenu.playlists,.main-menu .menu-item.top-level.playlists.show-submenu .submenu.playlists{left:20%}.sub-page-navigation{margin-bottom:35px;margin-top:-15px}.sub-page-navigation .menu-item{padding:12px 0;margin-right:25px;border-bottom:3px solid transparent;display:inline-block;font-size:18px;text-transform:capitalize}.breadcrumbs,.capitalize,.info-text,.player .track-info,h4.section-title{text-transform:uppercase}.sub-page-navigation .menu-item>i{font-size:6px;vertical-align:middle;margin-top:-4px;padding-right:2px}.sub-page-navigation .menu-item:hover{border-color:rgba(255,255,255,.5);cursor:pointer}.search-page .sub-page-navigation .menu-item:hover{border-color:#AAA}.sub-page-navigation .menu-item.active{border-color:#08d58f}.critical-services-status{padding-left:29px;padding-top:5px}#loading-bar .bar{left:20%!important;right:0!important}#loading-bar-spinner{right:10px!important;left:auto!important}#dropzones{display:none;position:fixed;top:0;left:0;bottom:0;width:20%;z-index:98;background:rgba(0,0,0,.75)}.dragging #dropzones{display:block}#dropzones>.dropzone{background:#444;text-align:center;font-size:20px;color:#FFF;margin:20px 20px 0;line-height:20px}#dropzones>.dropzone.disabled{background:#222}#dropzones .dropzone .dropzone.dropping,#dropzones .dropzone .menu-item.dropping,#dropzones .dropzone.dropping-within>.liner:not(.hover-content),#dropzones .dropzone.dropping>.liner:not(.hover-content){background:#08d58f}#dropzones>.dropzone.disabled>.liner{opacity:.3}#dropzones .dropzone>.liner{padding:50px 20px}#dropzones .dropzone.dropping .default-content,#dropzones .dropzone.dropping-within .default-content,#dropzones .dropzone:not(.dropping):not(.dropping-within) .hover-content{display:none}#dropzones .dropzone.dropping .hover-content,#dropzones .dropzone.dropping-within .hover-content{display:block!important}#dropzones .dropzone .label{padding-top:20px}#dropzones .dropzone .menu-item{display:block;text-align:left;padding:10px 20px;color:#FFF;text-decoration:none;font-size:16px}.drag-tracer .text,.drag-tracer .track-title{font-size:12px;vertical-align:top;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.drag-tracer,.drag-tracer .track-title{background:#32b5f2;box-shadow:1px 1px 5px rgba(0,0,0,.2)}#dropzones .dropzone .menu-item:not(:last-child){border-bottom:1px solid rgba(255,255,255,.1)}#dropzones .dropzone.playlists>.liner.hover-content,#dropzones .dropzone.queue>.liner.hover-content{padding:0}#dropzones .dropzone.queue .dropzone.add-to-queue{padding:30px 20px 20px}#dropzones .dropzone.queue .dropzone.add-to-queue-next{padding:14.5px 20px;border-top:1px solid rgba(255,255,255,.1)}#dropzones .dropzone.queue .dropzone.add-to-queue-next .label{padding:0}.clear-both{clear:both}.clear-left{clear:left}.clear-right{clear:right}.hide{display:none!important}.invisible{visibility:hidden!important}:focus{outline:0}.spacer{height:40px}.animate,.button,.main-menu a,.opacity-hover,button,input[type=submit]{-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.loading .animate,.loading .button,.loading .main-menu a,.loading .opacity-hover,.loading button,.loading input[type=submit]{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}@-moz-keyframes spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(360deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(360deg)}}.fadereveal{-webkit-animation:fadereveal .2s linear;-moz-animation:fadereveal .2s linear;-o-animation:fadereveal .2s linear;animation:fadereveal .2s linear;-webkit-animation-fill-mode:forward;-moz-animation-fill-mode:forward;-o-animation-fill-mode:forward;animation-fill-mode:forward}@-moz-keyframes fadereveal{0%{display:none;opacity:0}99%{display:block}100%{display:block;opacity:1}}@-webkit-keyframes fadereveal{0%{display:none;opacity:0}99%{display:block}100%{display:block;opacity:1}}@keyframes fadereveal{0%{display:none;opacity:0}99%{display:block}100%{display:block;opacity:1}}.opacity-hover{opacity:.5}.opacity-hover:hover{opacity:1}.blur{-webkit-filter:blur(10px);filter:blur(10px)}.invert{-webkit-filter:invert(100%);filter:invert(100%)}.drag-tracer{position:fixed;color:#FFF;z-index:99;display:none;pointer-events:none}.drag-tracer .track-title{padding:8px 12px;position:absolute;top:0;left:0;width:100px;z-index:3}.drag-tracer .track-title:nth-child(2){top:5px;left:5px;z-index:2;background:#29abe8}.drag-tracer .track-title:nth-child(3){top:10px;left:10px;z-index:1;background:#23a4e0}.drag-tracer .thumbnail{float:left;width:40px;height:40px;background-position:50% 50%;background-repeat:no-repeat;background-size:cover}.drag-tracer .text{float:left;padding:12px 15px;max-width:150px}.tooltip-wrapper{z-index:2;position:relative}.tooltip-wrapper .tooltip{display:none;position:absolute;top:0;right:0;background:#DDD;color:#333;font-size:11px;padding:2px 5px}.tooltip-wrapper:hover .tooltip{display:block}.popularity .tooltip{z-index:-1;top:-5px;right:-8px;padding:5px 16px 5px 8px}.popularity:hover .bar-track{background:#FFF}.si,.si.play{background-position:0 0}.si,.ssi{background-repeat:no-repeat;padding:0;display:inline-block;vertical-align:top}.si{width:16px;height:16px;background-image:url(../icons/icons.svg);margin-top:2px;margin-right:5px}.si.doublesize{width:32px;height:32px;background-size:32px 512px}.si.explore{background-position:0 -16px}.si.playlist{background-position:0 -32px}.si.music{background-position:0 -48px}.si.cog{background-position:0 -64px}.si.folder{background-position:0 -80px}.si.leaf{background-position:0 -96px}.si.star{background-position:0 -112px}.si.mic{background-position:0 -128px}.si.album{background-position:0 -144px}.si.grid{background-position:0 -160px}.si.find{background-position:0 -176px}.si.next{background-position:0 -192px}.si.prev{background-position:0 -208px}.si.play.doublesize{background-position:0 0}.si.explore.doublesize{background-position:0 -32px}.si.playlist.doublesize{background-position:0 -64px}.si.music.doublesize{background-position:0 -96px}.si.cog.doublesize{background-position:0 -128px}.si.folder.doublesize{background-position:0 -160px}.si.leaf.doublesize{background-position:0 -192px}.si.star.doublesize{background-position:0 -224px}.si.mic.doublesize{background-position:0 -256px}.si.album.doublesize{background-position:0 -288px}.si.grid.doublesize{background-position:0 -320px}.si.find.doublesize{background-position:0 -352px}.si.next.doublesize{background-position:0 -384px}.si.prev.doublesize{background-position:0 -416px}.ssi,.ssi.local{background-position:0 0}.ssi{width:16px;height:16px;background-image:url(../icons/source-icons.svg);margin-top:1px}.ssi.soundcloud{background-position:0 -16px}.ssi.spotify{background-position:0 -32px}.playing .ssi.local{background-position:-16px 0}.playing .ssi.soundcloud{background-position:-16px -16px}.playing .ssi.spotify{background-position:-16px -32px}#notifications{position:fixed;z-index:9;top:15px;left:20%;right:0;text-align:center;pointer-events:none}#notifications .notification{color:#FFF;display:inline-block;padding:10px 18px;background-color:rgba(0,0,0,.6);margin:0 1px}#notifications .notification.keyboard-shortcut{position:fixed;top:50%;left:50%;width:300px;margin:-150px 0 0 -150px;text-align:center;border-radius:10px}#notifications .notification.keyboard-shortcut i{line-height:300px;font-size:120px}#notifications .notification:not(.keyboard-shortcut):first-child{border-radius:100px 0 0 100px}#notifications .notification:not(.keyboard-shortcut):last-child{border-radius:0 100px 100px 0}#notifications .notification:not(.keyboard-shortcut):only-child{border-radius:100px}#notifications .notification.bad,#notifications .notification.error{background-color:rgba(214,47,47,.9)}#notifications .notification.good{background-color:rgba(53,204,53,.9)}.page-notification{margin:-40px -40px 30px;padding:20px 40px;font-size:16px}h1{font-size:40px;font-weight:200;padding-bottom:35px;margin-top:-10px}.heading-wrapper>h1{display:inline-block}h2{font-size:20px;font-weight:300}h3{font-size:18px;font-weight:600}h4{font-size:14px;font-weight:400}h4.section-title{font-weight:600;padding-bottom:5px}.bold-text,.no-items{font-weight:700}.underline{border-bottom:1px solid #999;padding-bottom:5px;margin-bottom:5px}.body a{color:inherit;text-decoration:none;border-bottom:1px dotted transparent;cursor:pointer}.body a:hover{border-color:inherit}.info-text{color:#AAA;padding-top:5px}.breadcrumbs{margin-top:-20px;color:#CCC}.breadcrumbs .divider{padding:0 3px}.white-text{color:#FFF}.black-text{color:#000}.grey-text{color:#AAA}.red-text{color:#d62f2f}.green-text{color:#35cc35}.primary-colour-text{color:#08d58f}.white-background{background-color:#FFF}.grey-background{background-color:#DDD}.black-background{background-color:#000}.red-background{background-color:#d62f2f}.green-background{background-color:#35cc35}.primary-colour-background{background-color:#08d58f}.italic-text{font-style:italic}.no-items{text-align:center;font-size:16px;color:#CCC;padding-top:50px}.flag{background:#EEE;display:inline-block;border-radius:3px;padding:3px 6px;font-size:11px;font-weight:400;margin-left:10px;margin-right:-10px}h1 .flag{vertical-align:top;margin-top:13px}.flag.blue{background:#08d58f;color:#FFF}.flag.clickable:hover{background:rgba(0,0,0,.65);color:rgba(255,255,255,.85)}.flag.dark{background:rgba(0,0,0,.4);color:rgba(255,255,255,.5)}.flag.black{background:rgba(0,0,0,.55);color:rgba(255,255,255,.8)}.flag.red{background:rgba(214,47,47,.9);color:#FFF}.flag.green{background:rgba(53,204,53,.9);color:#FFF}.flag.clickable{cursor:pointer}.flag.clickable.destructive:hover{background:rgba(214,47,47,.9);color:#FFF;cursor:pointer}.body .button,.dialog .button.primary,.dialog .button.secondary{display:inline-block;padding:12px 22px;margin-right:-3px;cursor:pointer;color:#FFF;border:0}.body .button,.dialog .button.secondary{background:#9b9b9b}.body .button:hover,.dialog .button.secondary:hover{background:#8B8B8B}.body .button .fa{margin-top:2px;margin-left:-2px;vertical-align:top}.body .heading-wrapper .button{vertical-align:top;margin-left:10px}.body .button.primary,.dialog .button.primary{background:#08d58f}.body .button.primary:hover,.dialog .button.primary:hover{background:#03c784}.body .button.destructive{background:#cf2d2d}.body .button.destructive:hover{background:#bc1f1f}.body .button.tertiary{background:#EEE;color:#AAA}.bar-track,.body .button.tertiary:hover{background:#DDD}.body .button.disabled,.body .button.disabled:hover{cursor:not-allowed;opacity:.5}.body .button.float-right{float:right}.body .follow-unfollow .unfollow{min-width:50px;text-align:center}.body .follow-unfollow.following>.follow,.body .follow-unfollow:not(.following)>.unfollow{display:none}.bar-track{display:inline-block;width:5px;position:relative;height:12px}.bar-track .bar{position:absolute;left:0;right:0;bottom:0;background:#666}.artist-grid .artist .image,.artist-list .artist .thumbnail{background-image:url(../svg/no-image.svg);background-repeat:no-repeat;background-position:50% 50%;background-size:cover;display:block}.info-text .bar-track{vertical-align:top;margin-top:7px}.artist-list .artist{display:block;clear:both;padding:10px 0;margin-bottom:5px;border:0!important}.artist-list .artist .thumbnail{width:50px;height:50px;border-radius:100px;float:left;margin-right:14px;background-color:#E9E9E9;border:2px solid #f5f5f5}.artist-list .artist:hover .thumbnail{opacity:.75;border-color:#08d58f}.artist-list .artist .name{padding-top:15px;padding-left:65px;font-weight:300;font-size:15px;display:block}.artist-grid{padding:0}.artist-grid .artist{display:block;float:left;border:0!important;width:50%;position:relative}.artist-grid .artist .image{width:100%;padding-bottom:100%;background-color:#777}.artist-grid .artist .name-wrapper{position:absolute;top:0;left:0;bottom:-.5px;right:0;text-align:center;color:#FFF;opacity:0;background:rgba(0,0,0,.8)}.image-container .image.placeholder,.square-panel .image-container .image,.thumbnail.placeholder{background-color:#E9E9E9;background-image:url(../svg/no-image.svg);background-position:50% 50%}.artist-grid .artist:hover .name-wrapper{opacity:1}.artist-grid .artist .name{padding-top:45%;font-weight:700}.square-panels{margin-left:-2%;margin-right:-2%}.square-panel{width:16%;margin:0 2% 3%;display:block;float:left;text-decoration:none;color:inherit;border:none!important}.square-panel .image-container{position:relative;width:100%;padding-bottom:100%}.square-panel .image-container .image{position:absolute;top:0;right:0;bottom:0;left:0;background-repeat:no-repeat;background-size:cover}.square-panel .image-container .overlay{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;max-width:100%;max-height:100%}.image-container .image.placeholder,.thumbnail.placeholder{background-size:80% 80%}.square-panel:hover .image-container .image{opacity:.75}.square-panel .info{padding-top:10px;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-top:3px solid transparent;margin-top:-3px;position:relative;height:50px}.square-panel .info.smaller{height:30px}.square-panel:hover .info{border-color:#08d58f}.square-panel .info .secondary{padding-top:2px;color:#AAA}.square-panel .info .name,.square-panel .info .tracks{overflow:hidden;max-height:2.6em}.square-panels.smaller{margin-left:-1%;margin-right:-1%}.square-panels.smaller .square-panel{width:12.28%;margin:0 1% 3%}.square-panel.category .name{position:absolute;padding-bottom:20%;border-bottom:3px solid transparent;left:0;right:0;bottom:0;text-align:center;color:#FFF;font-weight:700;font-size:16px}.square-panel.category:hover .name{border-color:#08d58f;padding-bottom:21%}.square-panel.library-album{width:90%;margin:0}.square-panel.library-album:hover .image{opacity:1}.tracklist .track{display:block;padding:10px;border-top:1px solid #EEE;border-bottom:1px solid #EEE;margin-bottom:-1px;cursor:pointer;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.track .album,.track .artist,.track .info,.track .title{float:left;min-height:1px}.track .source{display:none}.track .album,.track .artist,.track .title{width:30%}.track .info{width:10%;text-align:right}#full-player,.fa-fw,.fa-li,.fa-stack-1x,.fa-stack-2x,.player .track-info{text-align:center}.track .info .duration{display:inline-block;padding-right:20px}.track .info .popularity{position:absolute;top:11px;right:10px}.track .source{position:absolute;top:9px;right:5px}.tracklist.queue-tracks .track .source,.tracklist.search-results.other .track .source{display:inline-block}body:not(.dragging):not(.touchDevice) .tracklist .track:not(.selected):hover{background:#F4F4F4;border-color:#EEE}body.dragging .tracklist .track.selected{opacity:.5}.tracklist .track.selected,.tracklist .track.selected:hover{background:#FFF39C}.tracklist .track.playing{font-weight:700}body.dragging .tracklist .track.dropping,body.dragging .tracklist .track:hover{border-top:3px solid #32b5f2;margin-top:-3px}.track.folder .icon{width:24px;float:left}.track.folder .title{width:auto}.intro preloadedimage{position:absolute;top:-30px;right:-30px;bottom:-30px;left:-30px;overflow:hidden;opacity:0;background-position:50% -100px;background-repeat:no-repeat;background-size:cover}slider{height:250px;display:block;position:relative;margin-bottom:40px}slider.square-panels{margin-left:0;margin-right:-40px}slider .controls{position:absolute;top:-40px;right:40px;z-index:5}slider .controls .si{cursor:pointer;margin:5px;opacity:.7}slider .controls .si:hover{opacity:1}slider .slides{overflow:hidden;position:relative;height:100%}slider .slides-content{position:absolute;top:0;left:0;width:500%}slider .item-container{float:left;width:4%}slider .item-container>.square-panel{width:80%;margin:0}.queue-intro{padding-bottom:20px}.now-playing-page .page-header{display:none}.album-intro h1{padding:20px 0 0}.album-intro .square-panel{margin:0 30px 20px 0;width:250px;height:250px}.album-intro .image{background-color:#EEE;background-size:cover;background-position:50% 50%;opacity:1!important}.album-intro .info-text{padding-top:20px}.album-page .intro,.playlist-page .intro{position:relative;margin:0 0 50px}.asset-sidebar{width:20%;position:absolute;top:0;left:20%;bottom:0;background:#EEE}.content.has-asset-sidebar{padding-left:25%}.content.has-asset-sidebar>.inner{padding:40px 20px}.album-page .album.thumbnail,.playlist-page .playlist.thumbnail{width:100%;padding-bottom:100%;margin:0;background-image:url(../svg/no-image.svg);background-color:#E9E9E9;background-position:50% 50%;background-size:cover}.album-page h1,.playlist-page h1{padding-bottom:0;padding-top:15px;margin:0}.album-page h2,.playlist-page h2{font-style:italic;color:#888;font-weight:100;padding-top:5px}.album-page .asset-sidebar .info,.playlist-page .asset-sidebar .info{padding:14px 20px;margin-top:1px}.album-page .asset-sidebar .info>.info-item,.playlist-page .asset-sidebar .info>.info-item{padding:2px 0;color:#AAA}.album-page .asset-sidebar .info .bar-track,.playlist-page .asset-sidebar .info .bar-track{vertical-align:top;margin-top:7px;margin-left:6px}.playlist-owner{display:block;padding-top:10px;border:0!important}.playlist-owner:hover .thumbnail .border{border-color:#08d58f}.playlist-owner .name{display:block;font-size:15px;font-weight:300;padding-left:40px;padding-top:5px}.playlist-owner .thumbnail .border{display:block;position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;border:2px solid #eee;border-radius:60px;z-index:2}.playlist-owner .thumbnail{background-color:#e9e9e9;background-image:url(../svg/no-image.svg);background-position:50% 50%;background-repeat:no-repeat;background-size:cover;border-radius:60px;display:block;float:left;height:30px;margin-right:8px;width:30px;position:relative}.artist-intro{position:relative;margin:-40px -40px 30px;padding:0 20px;height:50vh}.artist-intro h1{padding-bottom:10px}.artist-intro .menu-item,.artist-intro h1{color:#FFF}.artist-intro .image-container{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;z-index:-1;background:#444}.artist-intro .image-container .image{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0}.artist-intro .image-container canvas{background-color:#444}.artist-page .title-panel{position:absolute;bottom:0;left:0;padding-left:330px}.artist-page .sub-page-navigation{margin:0}.artist-page .info-panel{padding-left:290px;margin-bottom:50px;position:relative}.artist-page .info-panel .thumbnail{width:250px;height:250px;background-image:url(../svg/no-image.svg);background-color:#E9E9E9;background-size:cover;background-position:50% 50%;position:absolute;bottom:0;left:0}.artist-page .info-panel .buttons{padding-right:20px}.artist-page .info-panel .info-text{display:inline-block;vertical-align:top}.tracklist.top-track-items{padding-bottom:30px}.gallery-item img{max-width:90%}.biography .content{font:inherit;width:100%;font-size:18px;line-height:1.4em;white-space:pre-wrap}.player .track-info .artist,.player .track-info .track{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.biography .details{padding:20px 0;color:#666}.discover .discover-section{clear:both;padding-bottom:20px}.discover .discover-section .section-title{padding-bottom:20px}.library-albums .full-album{padding-bottom:40px}.library-albums .full-album .album-title{padding:0 10px 15px}.featured-playlists-intro{position:relative;margin:-40px -40px 40px;padding:0 20px;height:30vh;background:#303030}.featured-playlists-intro>.inner{z-index:1;position:relative;color:#FFF;text-align:center;padding-top:13vh}.search-results-section.tracks,.user-intro .info{padding-top:30px}.featured-playlists-intro>.image-container{position:absolute;top:0;left:0;right:0;bottom:0}.featured-playlists-intro>.image-container>.image{position:absolute;top:0;left:0;right:0;bottom:0;opacity:0}.user-intro{padding-bottom:30px}.user-intro .info-text{margin-top:-20px}.user-intro .image-container .image{width:120px;height:120px;border-radius:120px;float:left;background-size:cover;background-position:50% 50%;margin-right:20px}.search .loading{margin:50px auto;width:70px;height:70px}.search .loading img{width:100%;height:100%}.search .sub-page-navigation{margin:-10px 0 30px}.search-results-section.albums,.search-results-section.artists,.search-results-section.playlists{width:30.6667%;float:left}.search-results-section.albums,.search-results-section.artists{padding-right:4%}.search-results-section .square-panel{width:46%}.search-results-section .square-panel .info{height:60px}.settings>.section{padding-bottom:40px}.settings .section-title .state-label{display:inline-block;padding:1px 3px;font-size:11px;margin-left:5px}.actions{clear:both;padding:40px 0 0 15%}.sub-page{padding:10px 0 20px}.settings .field.current-user .input{padding-top:8px}.settings .field.current-user .image-container>.image{width:36px;height:36px;float:left;border-radius:36px;margin-right:10px;margin-top:-10px;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-color:#CCC}.settings .field .view-my-profile{display:inline-block;vertical-align:top;position:relative;z-index:1;margin-top:1px;margin-left:-35px;padding:10px;border:0}.settings .field.shortcut-keys .shortcuts{padding-top:15px}.settings .field.shortcut-keys .row{padding-bottom:5px}.settings .field.shortcut-keys .row .flag{margin-left:0}#player{color:#FFF}#player>.background-image{display:none}.player .button{padding:5px;margin:0 5px;font-size:14px;opacity:.75;display:inline-block;background:0 0}.player .button.active,.player .button:hover{opacity:1;cursor:pointer}.player .button.active{color:#08d58f}.player .track-info{font-size:16px;padding-bottom:20px;padding-left:15px;padding-right:15px}.player .track-info .artist{opacity:.5}.player .track-info .artist a{text-decoration:none;color:#FFF;border-bottom:1px dotted transparent}.player .track-info .artist a:hover{border-color:#FFF}#player .playback{float:left;padding-left:15px}#player .volume{float:right;padding-right:20px}#player .volume.touch-friendly{display:none}#player .volume .slider{display:inline-block;width:40px;vertical-align:middle;padding:8px 0}.player .slider{cursor:pointer}#player .slider.progress{padding-top:5px;position:fixed;bottom:0;left:0;right:0;z-index:8}#player .slider.progress .track{height:4px;background:0 0}#player .slider.progress:hover .track{height:12px;background:rgba(0,0,0,.15)}.player .slider .track{position:relative;height:2px;background:rgba(255,255,255,.3)}.player .slider .track .fill{position:absolute;top:0;left:0;bottom:0;background:#08d58f;max-width:100%}.player .slider .track .fill.animate{-webkit-transition:all 1s;-moz-transition:all 1s;-o-transition:all 1s;transition:all 1s}#full-player .artwork{width:400px;padding-bottom:400px;margin:0 auto 20px;position:relative;background:#EEE;display:block;border:0}#full-player .controls{width:400px;margin:0 auto}#full-player .artwork .image{position:absolute;top:0;right:0;bottom:0;left:0;background-image:url(../svg/no-image.svg);background-size:cover;background-position:50% 50%}#full-player .track-info{color:#000;font-weight:600}#full-player .track-info .artist a{color:#000;display:inline-block}#full-player .track-info .artist a:hover{border-color:#000}#full-player .button{color:#000;font-size:20px}#full-player .button.active{color:#08d58f}#full-player .button:hover{opacity:1;background:0 0}#full-player .track-timer{float:right;margin-top:12px}#full-player .track-timer .current{opacity:.5;padding-right:2px;display:inline-block}#full-player .volume,.dialog .field.radio input{display:none}#full-player .progress.slider{margin:35px 0;position:relative}#full-player .slider .track{background:#DDD;height:4px}.dialog .dialog-title{padding-bottom:20px}.dialog .background{background:rgba(0,0,0,.95);position:fixed;top:0;right:0;bottom:0;left:0;z-index:11}.dialog .content{position:fixed;top:0;right:0;bottom:0;left:0;padding:6% 20%;color:#FFF;z-index:12;overflow-y:auto}.dialog .button.close-dialog{position:fixed;top:20px;right:20px;font-size:30px;cursor:pointer;z-index:13;color:#FFF;width:30px}.dialog .button.close-dialog img{max-width:100%}.dialog .button.destructive:hover{color:#d62f2f}.dialog .button.productive:hover{color:#35cc35}.dialog .field .label{font-size:16px}.dialog .field.text input{padding:5px 0;background:0 0;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:200;color:#FFF;border:0;border-bottom:2px solid #FFF}.dialog .field.text input:focus{border-color:#1cf4c4}.dialog .field.large input{padding:10px 0;font-size:30px;width:70%}.dialog .field.switch .label{padding-top:6px}.dialog .field.radio .label,.fa,.fa-stack{display:inline-block}.dialog .field.radio .label{float:none;width:auto;padding:5px 30px;position:relative;cursor:pointer}.dialog .field.radio input+.label:before{content:' ';display:inline-block;width:16px;height:16px;border-radius:50%;border:2px solid #FFF;position:absolute;top:4px;left:0}.dialog .field.radio input:checked+.label:before{background:#FFF;box-shadow:inset 0 0 0 5px #111}.dialog .switch-button,.dialog .switch-button.on{background:rgba(255,255,255,.2)}.dialog .actions{padding-left:0;padding-top:30px}.dialog .actions .working{padding-top:5px;width:30px;height:30px}.add-to-playlist-dialog .select-playlist{padding-top:15px}.add-to-playlist-dialog .playlist-item{font-size:16px;padding:10px 3%;border-top:1px solid #333;width:42%;float:left}.add-to-playlist-dialog .playlist-item:active,.add-to-playlist-dialog .playlist-item:focus{background:#08d58f}.add-to-playlist-dialog .playlist-item:nth-child(2n){margin-left:4%}.volume-controls-dialog .volume{padding-top:50px}.volume-controls-dialog .slider .track{height:30px}.dialog .initial-setup-dialog .dialog-title{padding-bottom:0}/*! * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.3.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0) format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.3.0) format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.3.0) format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.3.0) format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em}.fa-ul{padding-left:0;margin-left:2.14285714em}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before,.fa-genderless:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.field{clear:both;padding-top:20px;text-align:top}.field .label{float:left;width:13%;padding-top:8px;text-align:right;padding-right:2%}.note{display:block;padding:4px 0 5px;font-family:Roboto;font-size:12px;font-weight:300;color:#777}.field .input{float:left;width:85%}.field .input.readonly{padding-top:8.5px}.field input{padding:10px 16px;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:12px;width:50%;background:#FFF}.field input[readonly=true]{border-color:#999;background:#EEE}.field .autosave-success{display:none;color:#46D938;padding:8px;font-size:18px}.field .authentication-token>*,.field .connection-status .status{padding:8px 8px 8px 0;display:inline-block}.field .connection-status.offline .status.connected,.field .connection-status.online .status,.field .connection-status.online .status.disconnected{display:none}.field .connection-status.offline .status.disconnected,.field .connection-status.online .status.connected{display:block}.field.switch .input{float:left;width:auto;padding-right:15px}.field.switch .label{float:left;text-align:left;width:auto}.switch-button{margin-top:6px;width:30px;height:14px;background:rgba(0,0,0,.3);padding:3px;border-radius:20px;position:relative;cursor:pointer;display:inline-block;box-shadow:inset 1px 1px 4px 4px rgba(0,0,0,.1)}.switch-button>.switch{width:14px;height:14px;position:absolute;top:3px;left:3px;background:#DDD;border-radius:14px}.switch-button.on{background:rgba(0,0,0,.8);box-shadow:inset 1px 1px 4px 4px rgba(0,0,0,.4)}.switch-button.on>.switch{left:auto;right:3px;background:#08d58f}.search-form .query,.search-form .submit{background:0 0;color:#FFF;font-size:16px}.search-form .query{font-family:"Archivo Narrow";font-weight:100!important;border-bottom:1px solid #FFF;width:90%;padding:10px 10% 10px 0}.search-form .query:focus{border-color:#1cf4c4}.search-form{margin:20px 15px 30px;position:relative}.search-form .submit{position:absolute;top:10px;right:0;cursor:pointer}#body .search-form{width:100%;margin:0 0 20px}#body .search-form input{color:#333;border-color:#CCC}#body .search-form .submit{color:#333}/*! @@ -6,4 +6,4 @@ * https://chieffancypants.github.io/angular-loading-bar * Copyright (c) 2015 Wes Cruver * License: MIT - */#loading-bar,#loading-bar-spinner{pointer-events:none;-webkit-pointer-events:none;-webkit-transition:350ms linear all;-moz-transition:350ms linear all;-o-transition:350ms linear all;transition:350ms linear all}#loading-bar-spinner.ng-enter,#loading-bar-spinner.ng-leave.ng-leave-active,#loading-bar.ng-enter,#loading-bar.ng-leave.ng-leave-active{opacity:0}#loading-bar-spinner.ng-enter.ng-enter-active,#loading-bar-spinner.ng-leave,#loading-bar.ng-enter.ng-enter-active,#loading-bar.ng-leave{opacity:1}#loading-bar .bar{-webkit-transition:width 350ms;-moz-transition:width 350ms;-o-transition:width 350ms;transition:width 350ms;background:#29d;position:fixed;z-index:10002;top:0;width:100%;height:3px;border-bottom-right-radius:1px;border-top-right-radius:1px}#loading-bar .peg{position:absolute;width:70px;right:0;top:0;height:3px;opacity:.45;-moz-box-shadow:#29d 1px 0 6px 1px;-ms-box-shadow:#29d 1px 0 6px 1px;-webkit-box-shadow:#29d 1px 0 6px 1px;box-shadow:#29d 1px 0 6px 1px;-moz-border-radius:100%;-webkit-border-radius:100%;border-radius:100%}#loading-bar-spinner{display:block;position:fixed;z-index:10002;top:10px}#loading-bar-spinner .spinner-icon{width:14px;height:14px;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:loading-bar-spinner .4s linear infinite;-moz-animation:loading-bar-spinner .4s linear infinite;-ms-animation:loading-bar-spinner .4s linear infinite;-o-animation:loading-bar-spinner .4s linear infinite;animation:loading-bar-spinner .4s linear infinite}@-webkit-keyframes loading-bar-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes loading-bar-spinner{0%{-moz-transform:rotate(0);transform:rotate(0)}100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes loading-bar-spinner{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes loading-bar-spinner{0%{-ms-transform:rotate(0);transform:rotate(0)}100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-bar-spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.mobile-only,.mobile-show{display:none}@media(max-height:740px){.main-menu .menu-item>a{padding-top:7px;padding-bottom:7px}.main-menu .divider{padding-top:10px}.main-menu .divider.spacer{height:0}#body{padding-bottom:50px}}@media(min-width:800px){.mobile-show{display:none!important}}@media (max-width:800px),(max-height:650px){#sidebar>.inner{bottom:54px}#player{position:fixed;bottom:0;right:0;left:0;width:auto;height:40px;padding:12px 0 2px;background-color:#222;overflow:hidden;line-height:1.2em}.player .button{margin:0 3px}#player .button.previous,#player .volume:not(.touch-friendly){display:none!important}#player .volume.touch-friendly{display:inline-block!important;position:absolute;top:14px;right:-10px}#player .volume.touch-friendly .button{font-size:18px}#player .track-info{padding:0;font-size:13px;padding-left:80px;padding-right:80px}#player .playback{position:absolute;padding-left:10px;top:16px}#player>.background-image{display:block;position:absolute;top:-20px;right:-20px;bottom:-20px;left:-20px;z-index:-1;opacity:.3}#player>.background-image .image{position:absolute;top:0;right:0;bottom:0;left:0;background-position:0 50%;background-size:cover}#player .slider.progress{position:absolute;top:0;left:0;right:0;bottom:auto;padding:0}#player .slider.progress .track,#player .slider.progress:hover .track{height:2px}}@media (max-width:800px){.field>.input,.field>.label{float:none;width:auto}.mobile-show{display:block!important}.button.mobile-show{display:inline-block!important}.mobile-hide{display:none!important}.breadcrumbs{display:none}.menu-reveal-trigger,.page-header{display:block}.page:not(.search-page) .sub-page-navigation .menu-item.active{border-color:#FFF}.tracklist .track{padding-right:20px;margin-left:-20px;margin-right:-20px}#sidebar{width:30%;left:-30%;z-index:4}#sidebar>.inner{bottom:0}#body{width:100%;padding:0 0 50px}.menu-revealed #sidebar{left:0}#loading-bar .bar{left:0!important;right:0!important}#loading-bar-spinner{right:10px!important;left:auto!important}#sidebar .main-menu{padding-top:15px}#sidebar .main-menu .divider.spacer{height:0}.page>.inner{padding:20px}.page-header{position:relative;margin:-20px -20px 20px;background:#333;color:#FFF;padding:15px 20px}#full-player .progress.slider,#full-player .track-timer,.album-page .artist-grid,.album-page .info:not(.show),.artist-page .info-panel .thumbnail,.playlist-page .artist-grid,.playlist-page .info:not(.show){display:none}.album-page .page-header,.playlist-page .page-header{margin:0}.page-header h1{padding:0;margin:0;font-size:18px;text-align:center}.page-header .button,.page-header .button:hover{margin:-5px -10px 0 0;padding:8px;background:0 0}#notifications{left:0}.page-notification{margin-top:-20px;padding:10px 20px;text-align:center}.album-intro .square-panel{width:180px;height:180px}.asset-sidebar{position:static;width:auto;overflow:visible;background:0 0}.content.has-asset-sidebar{padding-left:0;overflow:visible}.content.has-asset-sidebar>.inner{padding-top:10px}.album-page .intro,.playlist-page .intro{margin-bottom:25px}.album-page .info,.playlist-page .info{margin-top:0;background:#EEE}.artist-page .artist-intro{margin-bottom:0;margin-left:-20px;margin-right:-20px;margin-top:-20px}.artist-page .title-panel{padding-left:40px}.artist-page .info-panel{padding-left:0;margin-top:20px}.artist-page .info-panel .buttons{padding-right:10px}.featured-playlists-intro{margin-left:-20px;margin-right:-20px;margin-top:-20px}.field>.label{text-align:left;padding:0 0 5px;font-weight:700}.field input{width:98%}.square-panel{width:21%;margin-bottom:5%}.square-panel.category .name,.square-panel.category:hover .name{padding-bottom:12%}.dialog .field.large input{width:100%}.dialog .content{padding-left:15%;padding-right:15%}.add-to-playlist-dialog .playlist{width:21%}#full-player .controls{padding-bottom:15px}#full-player .volume{display:inline-block}.library-albums .col.info,.library-albums .col.main{float:none;width:auto;clear:both}.library-albums .col.main{padding-top:20px}.library-albums .col.info .square-panel{width:25%;float:left;margin-right:20px;margin-left:-10px}}@media(max-width:600px){.actions,.edit-playlist-dialog .actions{padding-left:0}#sidebar{width:50%;left:-50%}.collapse-for-mobile .col{width:100%;float:none;padding-top:2px}.tracklist .track{padding-right:20px}.tracklist .track .duration,.tracklist .track .popularity{display:none}.tracklist .track .title{width:40%}.tracklist.album-items .track .artist,.tracklist.album-items .track .title{width:50%}.artist-page .info-panel{margin-left:-20px;margin-top:0}.artist-intro{height:60vh}.square-panel.category .name,.square-panel.category:hover .name{padding-bottom:8%;font-size:13px}.square-panels.smaller .square-panel{width:21%;margin:0 2% 5%}.dialog input.large{width:100%}.edit-playlist-dialog .actions .toggle-public{margin-left:0}.actions{display:block}.sub-page-navigation{margin-top:0}.sub-page-navigation .menu-item{margin-right:10px}.search-page .sub-page-navigation .menu-item{padding:5px 0}.touchDevice #utilities{right:5px}.page-notification{margin-top:-20px;margin-right:-20px;margin-left:-20px;padding:10px 20px}}@media(max-width:450px){.mobile-hide{display:none}h1{font-size:30px}#sidebar{width:70%;left:-70%}#full-player .artwork{width:100%;padding-bottom:100%}#full-player .controls{width:100%}#full-player .button{padding:3px 6px}.browse.album .album-intro .square-panel{width:100%;height:auto}.browse.album .album-intro{padding-bottom:20px}.playlist-intro>.inner{padding:0}.playlist-intro .thumbnail{width:100%;height:1px;padding-bottom:100%;margin:0}.playlist-intro .content{clear:both;padding-left:0}.playlist-intro .buttons,.playlist-intro .description{padding-top:10px}.square-panel{width:29%;margin-bottom:5%}.square-panel .info{padding-top:5px;height:60px}.dialog .content{padding-left:10%;padding-right:10%}.add-to-playlist-dialog .playlist{width:29.3333%}.tracklist .track .artist,.tracklist .track .title{width:50%}.tracklist .track .album{clear:left;width:auto;padding-left:50%;padding-right:10px;opacity:.5}}.touchDevice #full-player .volume,.touchDevice #player .volume.touch-friendly{display:inline-block}#app:not(.touchDevice) #player .volume.touch-friendly,.touchDevice #player .volume:not(.touch-friendly),.tracklist .track .selected-state{display:none}.touchDevice .tracklist .track{padding-left:30px}.touchDevice .tracklist .track .selected-state{display:block;width:10px;position:absolute;top:2px;left:0;padding:10px;font-size:14px}.tracklist-context-menu{background:rgba(50,50,50,.95);color:#FFF;z-index:9;position:fixed;top:0;right:0;left:0;box-shadow:0 2px 10px rgba(0,0,0,.5)}.tracklist-context-menu .menu-item:first-child{margin-left:6px}.tracklist-context-menu .menu-item{display:block;float:left;text-align:center;padding:20px 16px;margin-right:5px;font-weight:700;text-transform:uppercase;cursor:pointer}.tracklist-context-menu .menu-item .fa{display:block;font-size:16px}.tracklist-context-menu .menu-item .text{padding-top:5px;display:block;font-size:10px}.tracklist-context-menu .menu-item.cancel{float:right;opacity:.5} \ No newline at end of file + */#loading-bar,#loading-bar-spinner{pointer-events:none;-webkit-pointer-events:none;-webkit-transition:350ms linear all;-moz-transition:350ms linear all;-o-transition:350ms linear all;transition:350ms linear all}#loading-bar-spinner.ng-enter,#loading-bar-spinner.ng-leave.ng-leave-active,#loading-bar.ng-enter,#loading-bar.ng-leave.ng-leave-active{opacity:0}#loading-bar-spinner.ng-enter.ng-enter-active,#loading-bar-spinner.ng-leave,#loading-bar.ng-enter.ng-enter-active,#loading-bar.ng-leave{opacity:1}#loading-bar .bar{-webkit-transition:width 350ms;-moz-transition:width 350ms;-o-transition:width 350ms;transition:width 350ms;background:#29d;position:fixed;z-index:10002;top:0;width:100%;height:3px;border-bottom-right-radius:1px;border-top-right-radius:1px}#loading-bar .peg{position:absolute;width:70px;right:0;top:0;height:3px;opacity:.45;-moz-box-shadow:#29d 1px 0 6px 1px;-ms-box-shadow:#29d 1px 0 6px 1px;-webkit-box-shadow:#29d 1px 0 6px 1px;box-shadow:#29d 1px 0 6px 1px;-moz-border-radius:100%;-webkit-border-radius:100%;border-radius:100%}#loading-bar-spinner{display:block;position:fixed;z-index:10002;top:10px}#loading-bar-spinner .spinner-icon{width:14px;height:14px;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:loading-bar-spinner .4s linear infinite;-moz-animation:loading-bar-spinner .4s linear infinite;-ms-animation:loading-bar-spinner .4s linear infinite;-o-animation:loading-bar-spinner .4s linear infinite;animation:loading-bar-spinner .4s linear infinite}@-webkit-keyframes loading-bar-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes loading-bar-spinner{0%{-moz-transform:rotate(0);transform:rotate(0)}100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes loading-bar-spinner{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes loading-bar-spinner{0%{-ms-transform:rotate(0);transform:rotate(0)}100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-bar-spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.mobile-only,.mobile-show{display:none}@media(max-height:740px){.main-menu .menu-item>a{padding-top:7px;padding-bottom:7px}.main-menu .divider{padding-top:10px}.main-menu .divider.spacer{height:0}#body{padding-bottom:50px}}@media(min-width:800px){.mobile-show{display:none!important}}@media (max-width:800px),(max-height:650px){#sidebar>.inner{bottom:54px}#player{position:fixed;bottom:0;right:0;left:0;width:auto;height:40px;padding:12px 0 2px;background-color:#222;overflow:hidden;line-height:1.2em}.player .button{margin:0 3px}#player .button.previous,#player .volume:not(.touch-friendly){display:none!important}#player .volume.touch-friendly{display:inline-block!important;position:absolute;top:14px;right:-10px}#player .volume.touch-friendly .button{font-size:18px}#player .track-info{padding:0;font-size:13px;padding-left:80px;padding-right:80px}#player .playback{position:absolute;padding-left:10px;top:16px}#player>.background-image{display:block;position:absolute;top:-20px;right:-20px;bottom:-20px;left:-20px;z-index:-1;opacity:.3}#player>.background-image .image{position:absolute;top:0;right:0;bottom:0;left:0;background-position:0 50%;background-size:cover}#player .slider.progress{position:absolute;top:0;left:0;right:0;bottom:auto;padding:0}#player .slider.progress .track,#player .slider.progress:hover .track{height:2px}}@media (max-width:800px){.field>.input,.field>.label{float:none;width:auto}.mobile-show{display:block!important}.button.mobile-show{display:inline-block!important}.mobile-hide{display:none!important}.breadcrumbs{display:none}.menu-reveal-trigger,.page-header{display:block}.page:not(.search-page) .sub-page-navigation .menu-item.active{border-color:#FFF}.tracklist .track{padding-right:20px;margin-left:-20px;margin-right:-20px}#sidebar{width:30%;left:-30%;z-index:4}#sidebar>.inner{bottom:0}#body{width:100%;padding:0 0 50px}.menu-revealed #sidebar{left:0}#loading-bar .bar{left:0!important;right:0!important}#loading-bar-spinner{right:10px!important;left:auto!important}#sidebar .main-menu{padding-top:15px}#sidebar .main-menu .divider.spacer{height:0}.page>.inner{padding:20px}.page-header{position:relative;margin:-20px -20px 20px;background:#333;color:#FFF;padding:15px 20px}#full-player .progress.slider,#full-player .track-timer,.album-page .artist-grid,.album-page .info:not(.show),.artist-page .info-panel .thumbnail,.playlist-page .artist-grid,.playlist-page .info:not(.show){display:none}.album-page .page-header,.playlist-page .page-header{margin:0}.page-header h1{padding:0;margin:0;font-size:18px;text-align:center}.page-header .button,.page-header .button:hover{margin:-5px -10px 0 0;padding:8px;background:0 0}#notifications{left:0}.page-notification{margin-top:-20px;padding:10px 20px;text-align:center}.album-intro .square-panel{width:180px;height:180px}.asset-sidebar{position:static;width:auto;overflow:visible;background:0 0}.content.has-asset-sidebar{padding-left:0;overflow:visible}.content.has-asset-sidebar>.inner{padding-top:10px}.album-page .intro,.playlist-page .intro{margin-bottom:25px}.album-page .info,.playlist-page .info{margin-top:0;background:#EEE}.artist-page .artist-intro{margin-bottom:0;margin-left:-20px;margin-right:-20px;margin-top:-20px}.artist-page .title-panel{padding-left:40px}.artist-page .info-panel{padding-left:0;margin-top:20px}.artist-page .info-panel .buttons{padding-right:10px}.featured-playlists-intro{margin-left:-20px;margin-right:-20px;margin-top:-20px}.field>.label{text-align:left;padding:0 0 5px;font-weight:700}.field input{width:98%}.square-panel{width:21%;margin-bottom:5%}.square-panel.category .name,.square-panel.category:hover .name{padding-bottom:12%}.dialog .field.large input{width:100%}.dialog .content{padding-left:15%;padding-right:15%}#full-player .controls{padding-bottom:15px}#full-player .volume{display:inline-block}.library-albums .col.info,.library-albums .col.main{float:none;width:auto;clear:both}.library-albums .col.main{padding-top:20px}.library-albums .col.info .square-panel{width:25%;float:left;margin-right:20px;margin-left:-10px}}@media(max-width:600px){.actions,.edit-playlist-dialog .actions{padding-left:0}#sidebar{width:50%;left:-50%}.collapse-for-mobile .col{width:100%;float:none;padding-top:2px}.tracklist .track{padding-right:20px}.tracklist .track .duration,.tracklist .track .popularity{display:none}.tracklist .track .title{width:40%}.tracklist.album-items .track .artist,.tracklist.album-items .track .title{width:50%}.artist-page .info-panel{margin-left:-20px;margin-top:0}.artist-intro{height:60vh}.square-panel.category .name,.square-panel.category:hover .name{padding-bottom:8%;font-size:13px}.square-panels.smaller .square-panel{width:21%;margin:0 2% 5%}.dialog input.large{width:100%}.add-to-playlist-dialog .playlist-item{float:none;width:94%;margin-left:0!important}.edit-playlist-dialog .actions .toggle-public{margin-left:0}.actions{display:block}.sub-page-navigation{margin-top:0}.sub-page-navigation .menu-item{margin-right:10px}.search-page .sub-page-navigation .menu-item{padding:5px 0}.touchDevice #utilities{right:5px}.page-notification{margin-top:-20px;margin-right:-20px;margin-left:-20px;padding:10px 20px}}@media(max-width:450px){.mobile-hide{display:none}h1{font-size:30px}#sidebar{width:70%;left:-70%}#full-player .artwork{width:100%;padding-bottom:100%}#full-player .controls{width:100%}#full-player .button{padding:3px 6px}.browse.album .album-intro .square-panel{width:100%;height:auto}.browse.album .album-intro{padding-bottom:20px}.playlist-intro>.inner{padding:0}.playlist-intro .thumbnail{width:100%;height:1px;padding-bottom:100%;margin:0}.playlist-intro .content{clear:both;padding-left:0}.playlist-intro .buttons,.playlist-intro .description{padding-top:10px}.square-panel{width:29%;margin-bottom:5%}.square-panel .info{padding-top:5px;height:60px}.dialog .content{padding-left:10%;padding-right:10%}.add-to-playlist-dialog .playlist{width:29.3333%}.tracklist .track .artist,.tracklist .track .title{width:50%}.tracklist .track .album{clear:left;width:auto;padding-left:50%;padding-right:10px;opacity:.5}}.touchDevice #full-player .volume,.touchDevice #player .volume.touch-friendly{display:inline-block}#app:not(.touchDevice) #player .volume.touch-friendly,.touchDevice #player .volume:not(.touch-friendly),.tracklist .track .selected-state{display:none}.touchDevice .tracklist .track{padding-left:30px}.touchDevice .tracklist .track .selected-state{display:block;width:10px;position:absolute;top:2px;left:0;padding:10px;font-size:14px}.tracklist-context-menu{background:rgba(50,50,50,.95);color:#FFF;z-index:9;position:fixed;top:0;right:0;left:0;box-shadow:0 2px 10px rgba(0,0,0,.5)}.tracklist-context-menu .menu-item:first-child{margin-left:6px}.tracklist-context-menu .menu-item{display:block;float:left;text-align:center;padding:20px 16px;margin-right:5px;font-weight:700;text-transform:uppercase;cursor:pointer}.tracklist-context-menu .menu-item .fa{display:block;font-size:16px}.tracklist-context-menu .menu-item .text{padding-top:5px;display:block;font-size:10px}.tracklist-context-menu .menu-item.cancel{float:right;opacity:.5} \ No newline at end of file