2018-06-21 21:29:49 +00:00
var $jscomp = $jscomp || { } ; $jscomp . scope = { } ; $jscomp . ASSUME _ES5 = ! 1 ; $jscomp . ASSUME _NO _NATIVE _MAP = ! 1 ; $jscomp . ASSUME _NO _NATIVE _SET = ! 1 ; $jscomp . defineProperty = $jscomp . ASSUME _ES5 || "function" == typeof Object . defineProperties ? Object . defineProperty : function ( a , b , c ) { a != Array . prototype && a != Object . prototype && ( a [ b ] = c . value ) } ; $jscomp . getGlobal = function ( a ) { return "undefined" != typeof window && window === a ? a : "undefined" != typeof global && null != global ? global : a } ; $jscomp . global = $jscomp . getGlobal ( this ) ; $jscomp . SYMBOL _PREFIX = "jscomp_symbol_" ;
$jscomp . initSymbol = function ( ) { $jscomp . initSymbol = function ( ) { } ; $jscomp . global . Symbol || ( $jscomp . global . Symbol = $jscomp . Symbol ) } ; $jscomp . Symbol = function ( ) { var a = 0 ; return function ( b ) { return $jscomp . SYMBOL _PREFIX + ( b || "" ) + a ++ } } ( ) ;
$jscomp . initSymbolIterator = function ( ) { $jscomp . initSymbol ( ) ; var a = $jscomp . global . Symbol . iterator ; a || ( a = $jscomp . global . Symbol . iterator = $jscomp . global . Symbol ( "iterator" ) ) ; "function" != typeof Array . prototype [ a ] && $jscomp . defineProperty ( Array . prototype , a , { configurable : ! 0 , writable : ! 0 , value : function ( ) { return $jscomp . arrayIterator ( this ) } } ) ; $jscomp . initSymbolIterator = function ( ) { } } ; $jscomp . arrayIterator = function ( a ) { var b = 0 ; return $jscomp . iteratorPrototype ( function ( ) { return b < a . length ? { done : ! 1 , value : a [ b ++ ] } : { done : ! 0 } } ) } ;
$jscomp . iteratorPrototype = function ( a ) { $jscomp . initSymbolIterator ( ) ; a = { next : a } ; a [ $jscomp . global . Symbol . iterator ] = function ( ) { return this } ; return a } ; $jscomp . iteratorFromArray = function ( a , b ) { $jscomp . initSymbolIterator ( ) ; a instanceof String && ( a += "" ) ; var c = 0 , d = { next : function ( ) { if ( c < a . length ) { var e = c ++ ; return { value : b ( e , a [ e ] ) , done : ! 1 } } d . next = function ( ) { return { done : ! 0 , value : void 0 } } ; return d . next ( ) } } ; d [ Symbol . iterator ] = function ( ) { return d } ; return d } ;
$jscomp . polyfill = function ( a , b , c , d ) { if ( b ) { c = $jscomp . global ; a = a . split ( "." ) ; for ( d = 0 ; d < a . length - 1 ; d ++ ) { var e = a [ d ] ; e in c || ( c [ e ] = { } ) ; c = c [ e ] } a = a [ a . length - 1 ] ; d = c [ a ] ; b = b ( d ) ; b != d && null != b && $jscomp . defineProperty ( c , a , { configurable : ! 0 , writable : ! 0 , value : b } ) } } ; $jscomp . polyfill ( "Array.prototype.keys" , function ( a ) { return a ? a : function ( ) { return $jscomp . iteratorFromArray ( this , function ( a ) { return a } ) } } , "es6" , "es3" ) ;
$jscomp . findInternal = function ( a , b , c ) { a instanceof String && ( a = String ( a ) ) ; for ( var d = a . length , e = 0 ; e < d ; e ++ ) { var f = a [ e ] ; if ( b . call ( c , f , e , a ) ) return { i : e , v : f } } return { i : - 1 , v : void 0 } } ; $jscomp . polyfill ( "Array.prototype.find" , function ( a ) { return a ? a : function ( a , c ) { return $jscomp . findInternal ( this , a , c ) . v } } , "es6" , "es3" ) ;
var socket , last _song = "" , last _state , last _outputs , current _song = { } , isTouch = Modernizr . touch ? 1 : 0 , playstate = "" , progressBar , volumeBar , settings = { } , app = { apps : { Playback : { state : "0/-/" } , Queue : { state : "0/Any Tag/" } , Browse : { active : "Database" , tabs : { Filesystem : { state : "0/-/" } , Playlists : { state : "0/-/" } , Database : { active : "Artist" , views : { Artist : { state : "0/-/" } , Album : { state : "0/-/" } } } } } , Search : { state : "0/Any Tag/" } } , current : { app : "Playback" , tab : void 0 , view : void 0 , page : 0 , filter : "" , search : "" } , last : { app : void 0 , tab : void 0 , view : void 0 } ,
prepare : function ( ) { if ( app . current . app != app . last . app || app . current . tab != app . last . tab || app . current . view != app . last . view ) $ ( "#navbar-bottom > div" ) . removeClass ( "active" ) , $ ( "#cardPlayback" ) . addClass ( "hide" ) , $ ( "#cardQueue" ) . addClass ( "hide" ) , $ ( "#cardBrowse" ) . addClass ( "hide" ) , $ ( "#cardSearch" ) . addClass ( "hide" ) , $ ( "#panel-heading-browse > ul > li > a" ) . removeClass ( "active" ) , $ ( "#cardBrowsePlaylists" ) . addClass ( "hide" ) , $ ( "#cardBrowseDatabase" ) . addClass ( "hide" ) , $ ( "#cardBrowseFilesystem" ) . addClass ( "hide" ) , $ ( "#card" +
app . current . app ) . removeClass ( "hide" ) , $ ( "#nav" + app . current . app ) . addClass ( "active" ) , void 0 != app . current . tab && ( $ ( "#card" + app . current . app + app . current . tab ) . removeClass ( "hide" ) , $ ( "#card" + app . current . app + "Nav" + app . current . tab ) . addClass ( "active" ) ) } , goto : function ( a , b , c , d ) { app . apps [ a ] . tabs ? ( void 0 == b && ( b = app . apps [ a ] . active ) , app . apps [ a ] . tabs [ b ] . views ? ( void 0 == c && ( c = app . apps [ a ] . tabs [ b ] . active ) , a = "/" + a + "/" + b + "/" + c + "!" + ( void 0 == d ? app . apps [ a ] . tabs [ b ] . views [ c ] . state : d ) ) : a = "/" + a + "/" + b + "!" + ( void 0 == d ? app . apps [ a ] . tabs [ b ] . state :
d ) ) : a = "/" + a + "!" + ( void 0 == d ? app . apps [ a ] . state : d ) ; location . hash = a } , route : function ( ) { if ( params = decodeURI ( location . hash ) . match ( /^#\/(\w+)\/?(\w+)?\/?(\w+)?!((\d+)\/([^\/]+)\/(.*))$/ ) ) { app . current . app = params [ 1 ] ; app . current . tab = params [ 2 ] ; app . current . view = params [ 3 ] ; app . apps [ app . current . app ] . state ? app . apps [ app . current . app ] . state = params [ 4 ] : app . apps [ app . current . app ] . tabs [ app . current . tab ] . state ? ( app . apps [ app . current . app ] . tabs [ app . current . tab ] . state = params [ 4 ] , app . apps [ app . current . app ] . active = app . current . tab ) :
app . apps [ app . current . app ] . tabs [ app . current . tab ] . views [ app . current . view ] . state && ( app . apps [ app . current . app ] . tabs [ app . current . tab ] . views [ app . current . view ] . state = params [ 4 ] , app . apps [ app . current . app ] . active = app . current . tab , app . apps [ app . current . app ] . tabs [ app . current . tab ] . active = app . current . view ) ; app . current . page = parseInt ( params [ 5 ] ) ; app . current . filter = params [ 6 ] ; app . current . search = params [ 7 ] ; app . prepare ( ) ; if ( "Playback" == app . current . app ) sendAPI ( { cmd : "MPD_API_GET_CURRENT_SONG" } , songChange ) ; else if ( "Queue" == app . current . app ) app . last . app !=
2018-06-24 18:25:58 +00:00
app . current . app && ( 2 > app . current . search . length && setPagination ( app . current . page ) , $ ( "#searchqueuetag > button" ) . each ( function ( ) { $ ( this ) . removeClass ( "active" ) ; $ ( this ) . text ( ) == app . current . filter && ( $ ( this ) . addClass ( "active" ) , $ ( "#searchqueuetagdesc" ) . text ( $ ( this ) . text ( ) ) ) } ) ) , getQueue ( ) ; else if ( "Browse" == app . current . app && "Playlists" == app . current . tab ) sendAPI ( { cmd : "MPD_API_GET_PLAYLISTS" , data : { offset : app . current . page , filter : app . current . filter } } , parsePlaylists ) ; else if ( "Browse" == app . current . app && "Database" ==
app . current . tab && "Artist" == app . current . view ) sendAPI ( { cmd : "MPD_API_GET_ARTISTS" , data : { offset : app . current . page , filter : app . current . filter } } , parseListDBtags ) ; else if ( "Browse" == app . current . app && "Database" == app . current . tab && "Album" == app . current . view ) sendAPI ( { cmd : "MPD_API_GET_ARTISTALBUMS" , data : { offset : app . current . page , filter : app . current . filter , albumartist : app . current . search } } , parseListDBtags ) ; else if ( "Browse" == app . current . app && "Filesystem" == app . current . tab ) { $ ( "#BrowseBreadcrumb" ) . empty ( ) . append ( '<li class="breadcrumb-item"><a uri="">root</a></li>' ) ;
sendAPI ( { cmd : "MPD_API_GET_FILESYSTEM" , data : { offset : app . current . page , path : app . current . search ? app . current . search : "/" , filter : app . current . filter } } , parseFilesystem ) ; var a = $ ( "#browseFilesystemAddAllSongs" ) ; app . current . search ? ( a . off ( ) , a . on ( "click" , function ( ) { sendAPI ( { cmd : "MPD_API_ADD_TRACK" , data : { uri : app . current . search } } ) } ) , a . removeAttr ( "disabled" ) . removeClass ( "disabled" ) ) : a . attr ( "disabled" , "disabled" ) . addClass ( "disabled" ) ; var b = app . current . search . split ( "/" ) , c = "" ; $ . each ( b , function ( a , e ) { b . length - 1 == a ? $ ( "#BrowseBreadcrumb" ) . append ( '<li class="breadcrumb-item active">' +
e + "</li>" ) : ( c += e , $ ( "#BrowseBreadcrumb" ) . append ( '<li class="breadcrumb-item"><a uri="' + c + '">' + e + "</a></li>" ) , c += "/" ) } ) } else "Search" == app . current . app ? ( app . last . app != app . current . app && ( "" != app . current . search ? $ ( "#SearchList > tbody" ) . append ( '<tr><td><span class="material-icons">search</span></td><td colspan="3">Searching</td><td></td><td></td></tr>' ) : setPagination ( app . current . page ) , $ ( "#searchstr2" ) . val ( app . current . search ) ) , $ ( "#searchtags2 > button" ) . each ( function ( ) { $ ( this ) . removeClass ( "active" ) ; $ ( this ) . text ( ) ==
app . current . filter && ( $ ( this ) . addClass ( "active" ) , $ ( "#searchtags2desc" ) . text ( $ ( this ) . text ( ) ) ) } ) , 2 <= app . current . search . length ? sendAPI ( { cmd : "MPD_API_SEARCH" , data : { mpdtag : app . current . filter , offset : app . current . page , searchstr : app . current . search } } , parseSearch ) : ( $ ( "#SearchList > tbody" ) . empty ( ) , $ ( "#searchAddAllSongs" ) . attr ( "disabled" , "disabled" ) . addClass ( "disabled" ) ) ) : app . goto ( "Playback" ) ; app . last . app = app . current . app ; app . last . tab = app . current . tab ; app . last . view = app . current . view } else app . goto ( "Playback" ) } } ;
2018-06-21 21:29:49 +00:00
$ ( document ) . ready ( function ( ) { getSettings ( ) ; sendAPI ( { cmd : "MPD_API_GET_OUTPUTNAMES" } , parseOutputnames ) ; webSocketConnect ( ) ; volumeBar = $ ( "#volumebar" ) . slider ( ) ; volumeBar . slider ( "setValue" , 0 ) ; volumeBar . slider ( "on" , "slideStop" , function ( a ) { sendAPI ( { cmd : "MPD_API_SET_VOLUME" , data : { volume : a } } ) } ) ; progressBar = $ ( "#progressbar" ) . slider ( ) ; progressBar . slider ( "setValue" , 0 ) ; progressBar . slider ( "on" , "slideStop" , function ( a ) { current _song && 0 <= current _song . currentSongId && sendAPI ( { cmd : "MPD_API_SET_SEEK" , data : { songid : current _song . currentSongId ,
2018-06-24 18:25:58 +00:00
seek : Math . ceil ( a / 100 * current _song . totalTime ) } } ) } ) ; $ ( "#about" ) . on ( "shown.bs.modal" , function ( ) { sendAPI ( { cmd : "MPD_API_GET_STATS" } , parseStats ) } ) ; $ ( "#settings" ) . on ( "shown.bs.modal" , function ( ) { sendAPI ( { cmd : "MPD_API_GET_SETTINGS" } , parseSettings ) ; document . getElementById ( "settingsFrm" ) . classList . remove ( "was-validated" ) ; document . getElementById ( "inputCrossfade" ) . classList . remove ( "is-invalid" ) ; document . getElementById ( "inputMixrampdb" ) . classList . remove ( "is-invalid" ) ; document . getElementById ( "inputMixrampdelay" ) . classList . remove ( "is-invalid" ) } ) ;
$ ( "#addstream" ) . on ( "shown.bs.modal" , function ( ) { $ ( "#streamurl" ) . focus ( ) } ) ; $ ( "#addstream form" ) . on ( "submit" , function ( a ) { addStream ( ) } ) ; $ ( "#mainMenu" ) . on ( "shown.bs.dropdown" , function ( ) { $ ( "#search > input" ) . val ( "" ) ; $ ( "#search > input" ) . focus ( ) } ) ; add _filter ( "#BrowseFilesystemFilterLetters" ) ; add _filter ( "#BrowseDatabaseFilterLetters" ) ; add _filter ( "#BrowsePlaylistsFilterLetters" ) ; window . addEventListener ( "hashchange" , app . route , ! 1 ) } ) ;
2018-06-21 21:29:49 +00:00
function webSocketConnect ( ) { socket = "undefined" != typeof MozWebSocket ? new MozWebSocket ( get _appropriate _ws _url ( ) ) : new WebSocket ( get _appropriate _ws _url ( ) ) ; try { socket . onopen = function ( ) { console . log ( "connected" ) ; showNotification ( "Connected to myMPD" , "" , "" , "success" ) ; $ ( "#modalConnectionError" ) . modal ( "hide" ) ; app . route ( ) } , socket . onmessage = function ( a ) { if ( a . data !== last _state && 0 != a . data . length ) { try { var b = JSON . parse ( a . data ) } catch ( c ) { console . log ( "Invalid JSON data received: " + a . data ) } switch ( b . type ) { case "state" : parseState ( b ) ;
break ; case "disconnected" : showNotification ( "myMPD lost connection to MPD" , "" , "" , "danger" ) ; break ; case "update_queue" : "Queue" === app . current . app && getQueue ( ) ; break ; case "song_change" : songChange ( b ) ; break ; case "error" : showNotification ( b . data , "" , "" , "danger" ) } } } , socket . onclose = function ( ) { console . log ( "disconnected" ) ; $ ( "#modalConnectionError" ) . modal ( "show" ) ; setTimeout ( function ( ) { console . log ( "reconnect" ) ; webSocketConnect ( ) } , 3E3 ) } } catch ( a ) { alert ( "<p>Error" + a ) } }
function get _appropriate _ws _url ( ) { var a = document . URL ; if ( "https" == a . substring ( 0 , 5 ) ) { var b = "wss://" ; a = a . substr ( 8 ) } else b = "ws://" , "http" == a . substring ( 0 , 4 ) && ( a = a . substr ( 7 ) ) ; a = a . split ( "#" ) ; var c = /\/$/ . test ( a [ 0 ] ) ? "" : "/" ; return b + a [ 0 ] + c + "ws" }
function parseStats ( a ) { $ ( "#mpdstats_artists" ) . text ( a . data . artists ) ; $ ( "#mpdstats_albums" ) . text ( a . data . albums ) ; $ ( "#mpdstats_songs" ) . text ( a . data . songs ) ; $ ( "#mpdstats_dbplaytime" ) . text ( beautifyDuration ( a . data . dbplaytime ) ) ; $ ( "#mpdstats_playtime" ) . text ( beautifyDuration ( a . data . playtime ) ) ; $ ( "#mpdstats_uptime" ) . text ( beautifyDuration ( a . data . uptime ) ) ; var b = new Date ( 1E3 * a . data . dbupdated ) ; $ ( "#mpdstats_dbupdated" ) . text ( b . toUTCString ( ) ) ; $ ( "#mympdVersion" ) . text ( a . data . mympd _version ) ; $ ( "#mpdVersion" ) . text ( a . data . mpd _version ) }
2018-06-24 18:25:58 +00:00
function parseSettings ( a ) { a . data . random ? $ ( "#btnrandom" ) . addClass ( "active" ) . attr ( "aria-pressed" , "true" ) : $ ( "#btnrandom" ) . removeClass ( "active" ) . attr ( "aria-pressed" , "false" ) ; a . data . consume ? $ ( "#btnconsume" ) . addClass ( "active" ) . attr ( "aria-pressed" , "true" ) : $ ( "#btnconsume" ) . removeClass ( "active" ) . attr ( "aria-pressed" , "false" ) ; a . data . single ? $ ( "#btnsingle" ) . addClass ( "active" ) . attr ( "aria-pressed" , "true" ) : $ ( "#btnsingle" ) . removeClass ( "active" ) . attr ( "aria-pressed" , "false" ) ; a . data . repeat ? $ ( "#btnrepeat" ) . addClass ( "active" ) . attr ( "aria-pressed" ,
"true" ) : $ ( "#btnrepeat" ) . removeClass ( "active" ) . attr ( "aria-pressed" , "false" ) ; void 0 != a . data . crossfade ? $ ( "#inputCrossfade" ) . removeAttr ( "disabled" ) . val ( a . data . crossfade ) : $ ( "#inputCrossfade" ) . attr ( "disabled" , "disabled" ) ; void 0 != a . data . mixrampdb ? $ ( "#inputMixrampdb" ) . removeAttr ( "disabled" ) . val ( a . data . mixrampdb ) : $ ( "#inputMixrampdb" ) . attr ( "disabled" , "disabled" ) ; void 0 != a . data . mixrampdelay ? $ ( "#inputMixrampdelay" ) . removeAttr ( "disabled" ) . val ( a . data . mixrampdelay ) : $ ( "#inputMixrampdb" ) . attr ( "disabled" , "disabled" ) ;
$ ( "#selectReplaygain" ) . val ( a . data . replaygain ) ; notificationsSupported ( ) ? a . data . notificationWeb ? ( $ ( "#btnnotifyWeb" ) . addClass ( "active" ) . attr ( "aria-pressed" , "true" ) , Notification . requestPermission ( function ( b ) { "permission" in Notification || ( Notification . permission = b ) ; "granted" === b ? $ ( "#btnnotifyWeb" ) . addClass ( "active" ) . attr ( "aria-pressed" , "true" ) : ( $ ( "#btnnotifyWeb" ) . removeClass ( "active" ) . attr ( "aria-pressed" , "false" ) , a . data . notificationWeb = 0 ) } ) ) : $ ( "#btnnotifyWeb" ) . removeClass ( "active" ) . attr ( "aria-pressed" ,
"false" ) : ( $ ( "#btnnotifyWeb" ) . addClass ( "disabled" ) , $ ( "#btnnotifyWeb" ) . removeClass ( "active" ) . attr ( "aria-pressed" , "false" ) ) ; a . data . notificationPage ? $ ( "#btnnotifyPage" ) . addClass ( "active" ) . attr ( "aria-pressed" , "true" ) : $ ( "#btnnotifyPage" ) . removeClass ( "active" ) . attr ( "aria-pressed" , "false" ) ; settings = a . data ; setLocalStream ( a . data . mpdhost , a . data . streamport ) } function getSettings ( ) { sendAPI ( { cmd : "MPD_API_GET_SETTINGS" } , parseSettings ) }
2018-06-21 21:29:49 +00:00
function parseOutputnames ( a ) { $ ( "#btn-outputs-block button" ) . remove ( ) ; Object . keys ( a . data ) . length ? $ . each ( a . data , function ( a , c ) { $ ( '<button id="btnoutput' + a + '" class="btn btn-secondary btn-block" onclick="toggleoutput(this, ' + a + ')"><span class="material-icons float-left">volume_up</span> ' + c + "</button>" ) . appendTo ( $ ( "#btn-outputs-block" ) ) } ) : $ ( "#btn-outputs-block" ) . addClass ( "hide" ) ; last _outputs = "" }
function parseState ( a ) { updatePlayIcon ( a ) ; updateVolumeIcon ( a . data . volume ) ; if ( JSON . stringify ( a ) !== JSON . stringify ( last _state ) ) { current _song . totalTime = a . data . totalTime ; current _song . currentSongId = a . data . currentsongid ; var b = Math . floor ( a . data . totalTime / 60 ) , c = a . data . totalTime - 60 * b , d = Math . floor ( a . data . elapsedTime / 60 ) , e = a . data . elapsedTime - 60 * d ; volumeBar . slider ( "setValue" , a . data . volume ) ; progressBar . slider ( "setValue" , Math . floor ( 100 * a . data . elapsedTime / a . data . totalTime ) ) ; b = d + ":" + ( 10 > e ? "0" : "" ) + e + " / " + b + ":" + ( 10 >
c ? "0" : "" ) + c ; $ ( "#counter" ) . text ( b ) ; last _state && ( $ ( "#QueueList > tbody > tr[trackid=" + last _state . data . currentsongid + "] > td" ) . eq ( 4 ) . text ( last _state . data . totalTime ) , $ ( "#QueueList > tbody > tr[trackid=" + last _state . data . currentsongid + "] > td" ) . eq ( 0 ) . removeClass ( "material-icons" ) . text ( last _state . data . songpos ) ) ; $ ( "#QueueList > tbody > tr" ) . removeClass ( "active" ) . removeClass ( "font-weight-bold" ) ; $ ( "#QueueList > tbody > tr[trackid=" + a . data . currentsongid + "] > td" ) . eq ( 4 ) . text ( b ) ; $ ( "#QueueList > tbody > tr[trackid=" +
2018-06-24 18:25:58 +00:00
a . data . currentsongid + "] > td" ) . eq ( 0 ) . addClass ( "material-icons" ) . text ( "play_arrow" ) ; $ ( "#QueueList > tbody > tr[trackid=" + a . data . currentsongid + "]" ) . addClass ( "active" ) . addClass ( "font-weight-bold" ) ; void 0 != last _state && a . data . queue _version == last _state . data . queue _version || sendAPI ( { cmd : "MPD_API_GET_CURRENT_SONG" } , songChange ) ; last _state = a ; $ . each ( a . data . outputs , function ( a , b ) { b ? $ ( "#btnoutput" + a ) . addClass ( "active" ) : $ ( "#btnoutput" + a ) . removeClass ( "active" ) } ) ; last _outputs = a . data . outputs } }
function getQueue ( ) { 2 <= app . current . search . length ? sendAPI ( { cmd : "MPD_API_SEARCH_QUEUE" , data : { mpdtag : app . current . filter , offset : app . current . page , searchstr : app . current . search } } , parseQueue ) : sendAPI ( { cmd : "MPD_API_GET_QUEUE" , data : { offset : app . current . page } } , parseQueue ) }
2018-06-21 21:29:49 +00:00
function parseQueue ( a ) { if ( "Queue" === app . current . app ) { $ ( "#panel-heading-queue" ) . empty ( ) ; 0 < a . totalEntities && $ ( "#panel-heading-queue" ) . text ( a . totalEntities + " Songs" ) ; 0 < a . totalTime && $ ( "#panel-heading-queue" ) . append ( " \u2013 " + beautifyDuration ( a . totalTime ) ) ; var b = 0 , c = document . getElementById ( app . current . app + "List" ) . getElementsByTagName ( "tbody" ) [ 0 ] . getElementsByTagName ( "tr" ) , d ; for ( d in a . data ) { b ++ ; var e = Math . floor ( a . data [ d ] . duration / 60 ) , f = a . data [ d ] . duration - 60 * e ; e = '<tr trackid="' + a . data [ d ] . id + '"><td>' + ( a . data [ d ] . pos +
1 ) + "</td><td>" + a . data [ d ] . title + "</td><td>" + a . data [ d ] . artist + "</td><td>" + a . data [ d ] . album + "</td><td>" + e + ":" + ( 10 > f ? "0" : "" ) + f + "</td><td></td></tr>" ; b <= c . length ? $ ( c [ b - 1 ] ) . attr ( "trackid" ) != a . data [ d ] . id && $ ( c [ b - 1 ] ) . replaceWith ( e ) : $ ( "#" + app . current . app + "List > tbody" ) . append ( e ) } for ( d = c . length ; d > b ; d -- ) $ ( c [ c . length - 1 ] ) . remove ( ) ; "queuesearch" == a . type && 0 == b && $ ( "#QueueList > tbody" ) . append ( '<tr><td><span class="material-icons">error_outline</span></td><td colspan="3">No results, please refine your search!</td><td></td><td></td></tr>' ) ;
2018-06-24 18:25:58 +00:00
setPagination ( a . totalEntities ) ; if ( isTouch ) $ ( "#QueueList > tbody > tr > td:last-child" ) . append ( '<a class="pull-right btn-group-hover color-darkgrey" href="#/Queue!' + app . current . page + "/" + app . current . filter + "/" + app . current . search + '" onclick="delQueueSong($(this).parents(\'tr\'),event);"><span class="material-icons">delete</span></a>' ) ; else $ ( "#QueueList > tbody > tr" ) . on ( { mouseover : function ( ) { var a = $ ( this ) ; $ ( "#btntrashmodeup" ) . hasClass ( "active" ) && ( a = $ ( "#QueueList > tbody > tr:lt(" + ( $ ( this ) . index ( ) + 1 ) +
")" ) ) ; $ ( "#btntrashmodedown" ) . hasClass ( "active" ) && ( a = $ ( "#QueueList > tbody > tr:gt(" + ( $ ( this ) . index ( ) - 1 ) + ")" ) ) ; $ . each ( a , function ( ) { 0 == $ ( this ) . children ( ) . last ( ) . has ( "a" ) . length && $ ( this ) . children ( ) . last ( ) . append ( '<a class="pull-right btn-group-hover color-darkgrey" href="#/Queue!' + app . current . page + "/" + app . current . filter + "/" + app . current . search + '" onclick="delQueueSong($(this).parents(\'tr\'),event);"><span class="material-icons">delete</span></a>' ) . find ( "a" ) . fadeTo ( "fast" , 1 ) } ) } , mouseleave : function ( ) { var a =
$ ( this ) ; $ ( "#btntrashmodeup" ) . hasClass ( "active" ) && ( a = $ ( "#QueueList > tbody > tr:lt(" + ( $ ( this ) . index ( ) + 1 ) + ")" ) ) ; $ ( "#btntrashmodedown" ) . hasClass ( "active" ) && ( a = $ ( "#QueueList > tbody > tr:gt(" + ( $ ( this ) . index ( ) - 1 ) + ")" ) ) ; $ . each ( a , function ( ) { $ ( this ) . children ( ) . last ( ) . find ( "a" ) . stop ( ) . remove ( ) } ) } } ) ; $ ( "#QueueList > tbody > tr" ) . on ( { click : function ( ) { $ ( "#queueList > tbody > tr" ) . removeClass ( "active" ) ; sendAPI ( { cmd : "MPD_API_PLAY_TRACK" , data : { track : $ ( this ) . attr ( "trackid" ) } } ) ; $ ( this ) . addClass ( "active" ) } } ) } }
2018-06-21 21:29:49 +00:00
function parseSearch ( a ) { "Search" === app . current . app && ( $ ( "#panel-heading-search" ) . text ( a . totalEntities + " Songs found" ) , 0 < a . totalEntities ? $ ( "#searchAddAllSongs" ) . removeAttr ( "disabled" ) . removeClass ( "disabled" ) : $ ( "#searchAddAllSongs" ) . attr ( "disabled" , "disabled" ) . addClass ( "disabled" ) , parseFilesystem ( a ) ) }
function parseFilesystem ( a ) { function b ( a , b , c ) { $ ( a ) . append ( '<a role="button" class="pull-right btn-group-hover"><span class="material-icons">' + c + "</span></a>" ) . find ( "a" ) . click ( function ( a ) { a . stopPropagation ( ) ; sendAPI ( { cmd : b , data : { uri : decodeURI ( $ ( this ) . parents ( "tr" ) . attr ( "uri" ) ) } } ) ; showNotification ( '"' + $ ( "td:nth-last-child(3)" , $ ( this ) . parents ( "tr" ) ) . text ( ) + '" added' , "" , "" , "success" ) } ) } if ( "Browse" === app . current . app || "Filesystem" === app . current . tab || "Search" === app . current . app ) { var c = 0 , d = document . getElementById ( app . current . app +
( void 0 == app . current . tab ? "" : app . current . tab ) + "List" ) . getElementsByTagName ( "tbody" ) [ 0 ] . getElementsByTagName ( "tr" ) , e ; for ( e in a . data ) { c ++ ; var f = "" , g = "" ; switch ( a . data [ e ] . type ) { case "directory" : g = encodeURI ( a . data [ e ] . dir ) ; f = '<tr uri="' + g + '" class="dir"><td><span class="material-icons">folder_open</span></td><td colspan="3"><a>' + basename ( a . data [ e ] . dir ) + "</a></td><td></td><td></td></tr>" ; break ; case "song" : f = Math . floor ( a . data [ e ] . duration / 60 ) ; var h = a . data [ e ] . duration - 60 * f ; g = encodeURI ( a . data [ e ] . uri ) ; f = '<tr uri="' +
g + '" class="song"><td><span class="material-icons">music_note</span></td><td>' + a . data [ e ] . title + "</td><td>" + a . data [ e ] . artist + "</td><td>" + a . data [ e ] . album + "</td><td>" + f + ":" + ( 10 > h ? "0" : "" ) + h + "</td><td></td></tr>" ; break ; case "playlist" : g = encodeURI ( a . data [ e ] . plist ) , f = '<tr uri="' + g + '" class="plist"><td><span class="material-icons">list</span></td><td colspan="3"><a>' + basename ( a . data [ e ] . plist ) + "</a></td><td></td><td></td></tr>" } c <= d . length ? $ ( d [ c - 1 ] ) . attr ( "uri" ) != g && $ ( d [ c - 1 ] ) . replaceWith ( f ) : $ ( "#" + app . current . app +
( void 0 == app . current . tab ? "" : app . current . tab ) + "List > tbody" ) . append ( f ) } for ( e = d . length ; e > c ; e -- ) $ ( d [ d . length - 1 ] ) . remove ( ) ; setPagination ( a . totalEntities ) ; 0 == c && $ ( "#" + app . current . app + app . current . tab + "List > tbody" ) . append ( '<tr><td><span class="material-icons">error_outline</span></td><td colspan="3">No results</td><td></td><td></td></tr>' ) ; if ( isTouch ) b ( $ ( "#" + app . current . app + ( void 0 == app . current . tab ? "" : app . current . tab ) + "List > tbody > tr.dir > td:last-child" ) , "MPD_API_ADD_TRACK" , "playlist_add" ) , b ( $ ( "#" +
app . current . app + ( void 0 == app . current . tab ? "" : app . current . tab ) + "List > tbody > tr.song > td:last-child" ) , "MPD_API_ADD_TRACK" , "playlist_add" ) ; else $ ( "#" + app . current . app + ( void 0 == app . current . tab ? "" : app . current . tab ) + "List > tbody > tr" ) . on ( { mouseenter : function ( ) { $ ( this ) . is ( ".dir" ) ? b ( $ ( this ) . children ( ) . last ( ) , "MPD_API_ADD_TRACK" , "playlist_add" ) : $ ( this ) . is ( ".song" ) && b ( $ ( this ) . children ( ) . last ( ) , "MPD_API_ADD_TRACK" , "playlist_add" ) } , mouseleave : function ( ) { $ ( this ) . children ( ) . last ( ) . find ( "a" ) . stop ( ) . remove ( ) } } ) ;
$ ( "#" + app . current . app + ( void 0 == app . current . tab ? "" : app . current . tab ) + "List > tbody > tr" ) . on ( { click : function ( ) { switch ( $ ( this ) . attr ( "class" ) ) { case "dir" : app . current . page = 0 ; app . current . search = $ ( this ) . attr ( "uri" ) ; $ ( "#BrowseFilesystemList > a" ) . attr ( "href" , "#/Browse/Filesystem!" + app . current . page + "/" + app . current . filter + "/" + app . current . search ) ; app . goto ( "Browse" , "Filesystem" , void 0 , app . current . page + "/" + app . current . filter + "/" + app . current . search ) ; break ; case "song" : sendAPI ( { cmd : "MPD_API_ADD_TRACK" , data : { uri : decodeURI ( $ ( this ) . attr ( "uri" ) ) } } ) ;
showNotification ( '"' + $ ( "td:nth-last-child(5)" , this ) . text ( ) + '" added' , "" , "" , "success" ) ; break ; case "plist" : sendAPI ( { cmd : "MPD_API_ADD_PLAYLIST" , data : { plist : decodeURI ( $ ( this ) . attr ( "uri" ) ) } } ) , showNotification ( '"' + $ ( "td:nth-last-child(3)" , this ) . text ( ) + '" added' , "" , "" , "success" ) } } } ) ; $ ( "#BrowseBreadcrumb > li > a" ) . on ( { click : function ( ) { app . current . page = 0 ; app . current . search = $ ( this ) . attr ( "uri" ) ; $ ( "#BrowseFilesystemList > a" ) . attr ( "href" , "#/Browse/Filesystem!" + app . current . page + "/" + app . current . filter + "/" + app . current . search ) ;
app . goto ( "Browse" , "Filesystem" , void 0 , app . current . page + "/" + app . current . filter + "/" + app . current . search ) } } ) ; doSetFilterLetter ( "#BrowseFilesystemFilter" ) } }
function parsePlaylists ( a ) { if ( "Browse" === app . current . app || "Playlists" === app . current . tab ) { var b = 0 , c = document . getElementById ( app . current . app + app . current . tab + "List" ) . getElementsByTagName ( "tbody" ) [ 0 ] . getElementsByTagName ( "tr" ) , d ; for ( d in a . data ) { b ++ ; var e = new Date ( 1E3 * a . data [ d ] . last _modified ) , f = encodeURI ( a . data [ d ] . plist ) ; e = '<tr uri="' + f + '"><td><span class="material-icons">list</span></td><td><a>' + basename ( a . data [ d ] . plist ) + "</a></td><td>" + e . toUTCString ( ) + "</td><td></td></tr>" ; b <= c . length ? $ ( c [ b - 1 ] ) . attr ( "uri" ) !=
f && $ ( c [ b - 1 ] ) . replaceWith ( e ) : $ ( "#" + app . current . app + app . current . tab + "List > tbody" ) . append ( e ) } for ( d = c . length ; d > b ; d -- ) $ ( c [ c . length - 1 ] ) . remove ( ) ; setPagination ( a . totalEntities ) ; if ( isTouch ) $ ( "#" + app . current . app + app . current . tab + "List > tbody > tr > td:last-child" ) . append ( '<a class="pull-right btn-group-hover color-darkgrey" href="#/Browse/Playlists!' + app . current . page + "/" + app . current . filter + "/" + app . current . search + '" onclick="delPlaylist($(this).parents(\'tr\'));"><span class="material-icons">delete</span></a>' ) ;
else $ ( "#" + app . current . app + app . current . tab + "List > tbody > tr" ) . on ( { mouseover : function ( ) { 0 == $ ( this ) . children ( ) . last ( ) . has ( "a" ) . length && $ ( this ) . children ( ) . last ( ) . append ( '<a class="pull-right btn-group-hover color-darkgrey" href="#/Browse/Playlists!' + app . current . page + "/" + app . current . filter + "/" + app . current . search + '" onclick="delPlaylist($(this).parents(\'tr\'));"><span class="material-icons">delete</span></a>' ) } , mouseleave : function ( ) { $ ( this ) ; $ ( this ) . children ( ) . last ( ) . find ( "a" ) . stop ( ) . remove ( ) } } ) ; $ ( "#" +
app . current . app + app . current . tab + "List > tbody > tr" ) . on ( { click : function ( ) { sendAPI ( { cmd : "MPD_API_ADD_PLAYLIST" , data : { plist : decodeURI ( $ ( this ) . attr ( "uri" ) ) } } ) ; showNotification ( '"' + $ ( "td:nth-last-child(3)" , this ) . text ( ) + '" added' , "" , "" , "success" ) } } ) ; 0 == b && $ ( "#" + app . current . app + app . current . tab + "List > tbody" ) . append ( '<tr><td><span class="material-icons">error_outline</span></td><td colspan="3">No playlists found.</td><td></td><td></td></tr>' ) ; doSetFilterLetter ( "#browsePlaylistsFilter" ) } }
function parseListDBtags ( a ) { if ( "Browse" === app . current . app || "Database" === app . current . tab || "Artist" === app . current . view ) { if ( "AlbumArtist" == a . tagtype ) { $ ( "#BrowseDatabaseAlbumCards" ) . addClass ( "hide" ) ; $ ( "#BrowseDatabaseArtistList" ) . removeClass ( "hide" ) ; $ ( "#btnBrowseDatabaseArtist" ) . addClass ( "hide" ) ; var b = 0 , c = document . getElementById ( app . current . app + app . current . tab + app . current . view + "List" ) . getElementsByTagName ( "tbody" ) [ 0 ] . getElementsByTagName ( "tr" ) , d ; for ( d in a . data ) { b ++ ; var e = encodeURI ( a . data [ d ] . value ) , f =
'<tr uri="' + e + '"><td><span class="material-icons">album</span></td><td><a>' + a . data [ d ] . value + "</a></td></tr>" ; b <= c . length ? $ ( c [ b - 1 ] ) . attr ( "uri" ) != e && $ ( c [ b - 1 ] ) . replaceWith ( f ) : $ ( "#" + app . current . app + app . current . tab + app . current . view + "List > tbody" ) . append ( f ) } for ( d = c . length ; d > b ; d -- ) $ ( c [ c . length - 1 ] ) . remove ( ) ; setPagination ( a . totalEntities ) ; $ ( "#" + app . current . app + app . current . tab + app . current . view + "List > tbody > tr" ) . on ( { click : function ( ) { app . goto ( "Browse" , "Database" , "Album" , "0/-/" + $ ( this ) . attr ( "uri" ) ) } } ) ; 0 ==
b && $ ( "#" + app . current . app + app . current . tab + app . current . view + "List > tbody" ) . append ( '<tr><td><span class="material-icons">error_outline</span></td><td colspan="3">No entries found.</td><td></td><td></td></tr>' ) } else if ( "Album" == a . tagtype ) { $ ( "#BrowseDatabaseArtistList" ) . addClass ( "hide" ) ; $ ( "#BrowseDatabaseAlbumCards" ) . removeClass ( "hide" ) ; $ ( "#btnBrowseDatabaseArtist" ) . removeClass ( "hide" ) ; b = 0 ; c = document . getElementById ( "BrowseDatabaseAlbumCards" ) . querySelectorAll ( ".col-md" ) ; for ( d in a . data ) b ++ , e = genId ( a . data [ d ] . value ) ,
f = '<div class="col-md mr-0" id="' + e + '"><div class="card mb-4" id="card' + e + '"> <img class="card-img-top" src="" alt=""> <div class="card-body"> <h5 class="card-title">' + a . searchstr + '</h5> <h4 class="card-title">' + a . data [ d ] . value + '</h4> <table class="table table-sm table-hover" id="tbl' + e + '"><tbody></tbody></table </div></div></div>' , b <= c . length ? c [ b - 1 ] . id != e && $ ( c [ b - 1 ] ) . replaceWith ( f ) : $ ( "#BrowseDatabaseAlbumCards" ) . append ( f ) , ( b > c . length || c [ b - 1 ] . id != e ) && sendAPI ( { cmd : "MPD_API_GET_ARTISTALBUMTITLES" ,
data : { albumartist : a . searchstr , album : a . data [ d ] . value } } , parseListTitles ) ; for ( d = c . length ; d > b ; d -- ) $ ( c [ d - 1 ] ) . remove ( ) ; setPagination ( a . totalEntities ) } doSetFilterLetter ( "#BrowseDatabaseFilter" ) } }
2018-06-24 18:25:58 +00:00
function parseListTitles ( a ) { if ( "Browse" === app . current . app || "Database" === app . current . tab || "Album" === app . current . view ) { var b = genId ( a . album ) , c = $ ( "#card" + b + " > div > table > tbody" ) ; $ ( "#card" + b + " > img" ) . attr ( "src" , a . cover ) . attr ( "uri" , a . data [ 0 ] . uri . replace ( /\/[^\/]+$/ , "" ) ) . attr ( "data-album" , encodeURI ( a . album ) ) ; var d = "" , e ; for ( e in a . data ) d += '<tr uri="' + encodeURI ( a . data [ e ] . uri ) + '" class="song"><td>' + a . data [ e ] . track + "</td><td>" + a . data [ e ] . title + "</td></tr>" ; c . append ( d ) ; $ ( "#card" + b + " > img" ) . on ( { click : function ( ) { sendAPI ( { cmd : "MPD_API_ADD_TRACK" ,
data : { track : decodeURI ( $ ( this ) . attr ( "uri" ) ) } } ) ; showNotification ( '"' + decodeURI ( $ ( this ) . attr ( "data-album" ) ) + '" added' , "" , "" , "success" ) } } ) ; $ ( "#tbl" + b + " > tbody > tr" ) . on ( { click : function ( ) { sendAPI ( { cmd : "MPD_API_ADD_TRACK" , data : { track : decodeURI ( $ ( this ) . attr ( "uri" ) ) } } ) ; showNotification ( '"' + $ ( "td:nth-last-child(1)" , this ) . text ( ) + '" added' , "" , "" , "success" ) } } ) } }
2018-06-21 21:29:49 +00:00
function setPagination ( a ) { var b = Math . ceil ( a / settings . max _elements _per _page ) , c = app . current . app + ( void 0 == app . current . tab ? "" : app . current . tab ) ; 0 == b && ( b = 1 ) ; $ ( "#" + c + "PaginationTopPage" ) . text ( "Page " + ( app . current . page / settings . max _elements _per _page + 1 ) + " / " + b ) ; $ ( "#" + c + "PaginationBottomPage" ) . text ( "Page " + ( app . current . page / settings . max _elements _per _page + 1 ) + " / " + b ) ; if ( 1 < b ) { $ ( "#" + c + "PaginationTopPage" ) . removeClass ( "disabled" ) . removeAttr ( "disabled" ) ; $ ( "#" + c + "PaginationBottomPage" ) . removeClass ( "disabled" ) . removeAttr ( "disabled" ) ;
$ ( "#" + c + "PaginationTopPages" ) . empty ( ) ; $ ( "#" + c + "PaginationBottomPages" ) . empty ( ) ; for ( var d = 0 ; d < b ; d ++ ) $ ( "#" + c + "PaginationTopPages" ) . append ( '<button onclick="gotoPage(' + d * settings . max _elements _per _page + ',this,event)" type="button" class="mr-1 mb-1 btn-sm btn btn-secondary">' + ( d + 1 ) + "</button>" ) , $ ( "#" + c + "PaginationBottomPages" ) . append ( '<button onclick="gotoPage(' + d * settings . max _elements _per _page + ',this,event)" type="button" class="mr-1 mb-1 btn-sm btn btn-secondary">' + ( d + 1 ) + "</button>" ) } else $ ( "#" + c + "PaginationTopPage" ) . addClass ( "disabled" ) . attr ( "disabled" ,
"disabled" ) , $ ( "#" + c + "PaginationBottomPage" ) . addClass ( "disabled" ) . attr ( "disabled" , "disabled" ) ; a > app . current . page + settings . max _elements _per _page ? ( $ ( "#" + c + "PaginationTopNext" ) . removeClass ( "disabled" ) . removeAttr ( "disabled" ) , $ ( "#" + c + "PaginationBottomNext" ) . removeClass ( "disabled" ) . removeAttr ( "disabled" ) , $ ( "#" + c + "ButtonsBottom" ) . removeClass ( "hide" ) ) : ( $ ( "#" + c + "PaginationTopNext" ) . addClass ( "disabled" ) . attr ( "disabled" , "disabled" ) , $ ( "#" + c + "PaginationBottomNext" ) . addClass ( "disabled" ) . attr ( "disabled" , "disabled" ) ,
$ ( "#" + c + "ButtonsBottom" ) . addClass ( "hide" ) ) ; 0 < app . current . page ? ( $ ( "#" + c + "PaginationTopPrev" ) . removeClass ( "disabled" ) . removeAttr ( "disabled" ) , $ ( "#" + c + "PaginationBottomPrev" ) . removeClass ( "disabled" ) . removeAttr ( "disabled" ) ) : ( $ ( "#" + c + "PaginationTopPrev" ) . addClass ( "disabled" ) . attr ( "disabled" , "disabled" ) , $ ( "#" + c + "PaginationBottomPrev" ) . addClass ( "disabled" ) . attr ( "disabled" , "disabled" ) ) }
function updateVolumeIcon ( a ) { - 1 == a ? ( $ ( "#volumePrct" ) . text ( "Volumecontrol disabled" ) , $ ( "#volumeControl" ) . addClass ( "hide" ) ) : ( $ ( "#volumeControl" ) . removeClass ( "hidden" ) , $ ( "#volumePrct" ) . text ( a + " %" ) , 0 == a ? $ ( "#volume-icon" ) . text ( "volume_off" ) : 50 > a ? $ ( "#volume-icon" ) . text ( "volume_down" ) : $ ( "#volume-icon" ) . text ( "volume_up" ) ) }
function updatePlayIcon ( a ) { 1 == a . data . state ? ( $ ( "#btnPlay > span" ) . text ( "play_arrow" ) , playstate = "stop" ) : 2 == a . data . state ? ( $ ( "#btnPlay > span" ) . text ( "pause" ) , playstate = "play" ) : ( $ ( "#btnPlay > span" ) . text ( "play_arrow" ) , playstate = "pause" ) ; - 1 == a . data . nextsongpos ? $ ( "#btnNext" ) . addClass ( "disabled" ) . attr ( "disabled" , "disabled" ) : $ ( "#btnNext" ) . removeClass ( "disabled" ) . removeAttr ( "disabled" ) ; 0 >= a . data . songpos ? $ ( "#btnPrev" ) . addClass ( "disabled" ) . attr ( "disabled" , "disabled" ) : $ ( "#btnPrev" ) . removeClass ( "disabled" ) . removeAttr ( "disabled" ) ;
0 == a . data . queue _length ? $ ( "#btnPlay" ) . addClass ( "disabled" ) . attr ( "disabled" , "disabled" ) : $ ( "#btnPlay" ) . removeClass ( "disabled" ) . removeAttr ( "disabled" ) } function sendAPI ( a , b ) { $ . ajax ( { url : "/api" , contentType : "application/json" , method : "POST" , data : JSON . stringify ( a ) , success : b } ) } function updateDB ( a ) { sendAPI ( { cmd : "MPD_API_UPDATE_DB" } ) ; showNotification ( "Updating MPD Database..." , "" , "" , "success" ) ; a . preventDefault ( ) }
function clickPlay ( ) { "play" != playstate ? sendAPI ( { cmd : "MPD_API_SET_PLAY" } ) : sendAPI ( { cmd : "MPD_API_SET_PAUSE" } ) } function clickStop ( ) { sendAPI ( { cmd : "MPD_API_SET_STOP" } ) } function clickPrev ( ) { sendAPI ( { cmd : "MPD_API_SET_PREV" } ) } function clickNext ( ) { sendAPI ( { cmd : "MPD_API_SET_NEXT" } ) } function setLocalStream ( a , b ) { var c = "http://" ; c = "127.0.0.1" == a || "localhost" == a ? c + window . location . hostname : c + a ; settings . mpdstream = c + ( ":" + b + "/" ) }
2018-06-24 18:25:58 +00:00
function delQueueSong ( a , b ) { b . stopPropagation ( ) ; $ ( "#btntrashmodeup" ) . hasClass ( "active" ) ? sendAPI ( { cmd : "MPD_API_RM_RANGE" , data : { start : 0 , end : a . index ( ) + 1 } } ) : $ ( "#btntrashmodesingle" ) . hasClass ( "active" ) ? sendAPI ( { cmd : "MPD_API_RM_TRACK" , data : { track : a . attr ( "trackid" ) } } ) : $ ( "#btntrashmodedown" ) . hasClass ( "active" ) && sendAPI ( { cmd : "MPD_API_RM_RANGE" , data : { start : a . index ( ) , end : - 1 } } ) } function delPlaylist ( a ) { sendAPI ( { cmd : "MPD_API_RM_PLAYLIST" , data : { plist : decodeURI ( a . attr ( "uri" ) ) } } ) ; a . remove ( ) }
function basename ( a ) { return a . split ( "/" ) . reverse ( ) [ 0 ] } $ ( "#cardBrowseNavFilesystem" ) . on ( "click" , function ( a ) { app . goto ( "Browse" , "Filesystem" ) ; a . preventDefault ( ) } ) ; $ ( "#cardBrowseNavDatabase" ) . on ( "click" , function ( a ) { app . goto ( "Browse" , "Database" ) ; a . preventDefault ( ) } ) ; $ ( "#btnBrowseDatabaseArtist" ) . on ( "click" , function ( a ) { app . goto ( "Browse" , "Database" , "Artist" ) ; a . preventDefault ( ) } ) ; $ ( "#cardBrowseNavPlaylists" ) . on ( "click" , function ( a ) { app . goto ( "Browse" , "Playlists" ) ; a . preventDefault ( ) } ) ;
2018-06-21 21:29:49 +00:00
$ ( "#cardBrowseNavFilesystem" ) . on ( "click" , function ( a ) { app . goto ( "Browse" , "Filesystem" ) ; a . preventDefault ( ) } ) ; $ ( "#navPlayback" ) . on ( "click" , function ( a ) { app . goto ( "Playback" ) ; a . preventDefault ( ) } ) ; $ ( "#navQueue" ) . on ( "click" , function ( a ) { app . goto ( "Queue" ) ; a . preventDefault ( ) } ) ; $ ( "#navBrowse" ) . on ( "click" , function ( a ) { app . goto ( "Browse" ) ; a . preventDefault ( ) } ) ; $ ( "#navSearch" ) . on ( "click" , function ( a ) { app . goto ( "Search" ) ; a . preventDefault ( ) } ) ;
2018-06-24 18:25:58 +00:00
function confirmSettings ( ) { var a = ! 0 ; if ( ! $ ( "#inputCrossfade" ) . is ( ":disabled" ) ) { var b = parseInt ( $ ( "#inputCrossfade" ) . val ( ) ) ; isNaN ( b ) ? ( document . getElementById ( "inputCrossfade" ) . classList . add ( "is-invalid" ) , a = ! 1 ) : $ ( "#inputCrossfade" ) . val ( b ) } $ ( "#inputMixrampdb" ) . is ( ":disabled" ) || ( b = parseFloat ( $ ( "#inputMixrampdb" ) . val ( ) ) , isNaN ( b ) ? ( document . getElementById ( "inputMixrampdb" ) . classList . add ( "is-invalid" ) , a = ! 1 ) : $ ( "#inputMixrampdb" ) . val ( b ) ) ; $ ( "#inputMixrampdelay" ) . is ( ":disabled" ) || ( "nan" == $ ( "#inputMixrampdelay" ) . val ( ) &&
$ ( "#inputMixrampdelay" ) . val ( "-1" ) , b = parseFloat ( $ ( "#inputMixrampdelay" ) . val ( ) ) , isNaN ( b ) ? ( document . getElementById ( "inputMixrampdelay" ) . classList . add ( "is-invalid" ) , a = ! 1 ) : $ ( "#inputMixrampdelay" ) . val ( b ) ) ; 1 == a ? ( sendAPI ( { cmd : "MPD_API_SET_SETTINGS" , data : { consume : $ ( "#btnconsume" ) . hasClass ( "active" ) ? 1 : 0 , random : $ ( "#btnrandom" ) . hasClass ( "active" ) ? 1 : 0 , single : $ ( "#btnsingle" ) . hasClass ( "active" ) ? 1 : 0 , repeat : $ ( "#btnrepeat" ) . hasClass ( "active" ) ? 1 : 0 , replaygain : $ ( "#selectReplaygain" ) . val ( ) , crossfade : $ ( "#inputCrossfade" ) . val ( ) ,
mixrampdb : $ ( "#inputMixrampdb" ) . val ( ) , mixrampdelay : $ ( "#inputMixrampdelay" ) . val ( ) , notificationWeb : $ ( "#btnnotifyWeb" ) . hasClass ( "active" ) ? 1 : 0 , notificationPage : $ ( "#btnnotifyPage" ) . hasClass ( "active" ) ? 1 : 0 } } , getSettings ) , $ ( "#settings" ) . modal ( "hide" ) ) : document . getElementById ( "settingsFrm" ) . classList . add ( "was-validated" ) } function toggleoutput ( a , b ) { sendAPI ( { cmd : "MPD_API_TOGGLE_OUTPUT" , data : { output : b , state : $ ( a ) . hasClass ( "active" ) ? 0 : 1 } } ) }
$ ( "#trashmodebtns > button" ) . on ( "click" , function ( a ) { $ ( "#trashmodebtns" ) . children ( "button" ) . removeClass ( "active" ) ; $ ( this ) . addClass ( "active" ) } ) ; $ ( "#search > input" ) . keypress ( function ( a ) { 13 == a . which && $ ( "#mainMenu > a" ) . dropdown ( "toggle" ) } ) ; $ ( "#search" ) . submit ( function ( ) { app . goto ( "Search" , void 0 , void 0 , app . current . page + "/Any Tag/" + $ ( "#search > input" ) . val ( ) ) ; return ! 1 } ) ; $ ( "#search2" ) . submit ( function ( ) { return ! 1 } ) ;
function addAllFromSearch ( ) { if ( 2 <= app . current . search . length ) { sendAPI ( { cmd : "MPD_API_SEARCH_ADD" , data : { filter : app . current . filter , searchstr : + app . current . search } } ) ; var a = $ ( "#SearchList >tbody >tr" ) . length ; showNotification ( "Added " + a + " songs from search" , "" , "" , "success" ) } } $ ( "#searchstr2" ) . keyup ( function ( a ) { app . current . page = 0 ; app . current . search = $ ( this ) . val ( ) ; app . goto ( "Search" , void 0 , void 0 , app . current . page + "/" + app . current . filter + "/" + app . current . search ) } ) ;
$ ( "#searchtags2 > button" ) . on ( "click" , function ( a ) { $ ( "#searchtags2 > button" ) . removeClass ( "active" ) ; $ ( this ) . removeClass ( "btn-secondary" ) . addClass ( "active" ) ; app . current . filter = $ ( this ) . text ( ) ; app . goto ( app . current . app , app . current . tab , app . current . view , app . current . page + "/" + app . current . filter + "/" + app . current . search ) } ) ;
2018-06-21 21:29:49 +00:00
$ ( "#searchqueuestr" ) . keyup ( function ( a ) { app . current . page = 0 ; app . current . search = $ ( this ) . val ( ) ; app . goto ( app . current . app , app . current . tab , app . current . view , app . current . page + "/" + app . current . filter + "/" + app . current . search ) } ) ;
2018-06-24 18:25:58 +00:00
$ ( "#searchqueuetag > button" ) . on ( "click" , function ( a ) { $ ( "#searchqueuetag > button" ) . removeClass ( "active" ) ; $ ( this ) . removeClass ( "btn-secondary" ) . addClass ( "active" ) ; app . current . filter = $ ( this ) . text ( ) ; $ ( "#searchqueuetagdesc" ) . text ( app . current . filter ) ; app . goto ( app . current . app , app . current . tab , app . current . view , app . current . page + "/" + app . current . filter + "/" + app . current . search ) } ) ; $ ( "#searchqueue" ) . submit ( function ( ) { return ! 1 } ) ; $ ( "#searchqueue" ) . submit ( function ( ) { return ! 1 } ) ;
2018-06-21 21:29:49 +00:00
function scrollToTop ( ) { document . body . scrollTop = 0 ; document . documentElement . scrollTop = 0 } function gotoPage ( a , b , c ) { switch ( a ) { case "next" : app . current . page += settings . max _elements _per _page ; break ; case "prev" : app . current . page -= settings . max _elements _per _page ; 0 >= app . current . page && ( app . current . page = 0 ) ; break ; default : app . current . page = a } app . goto ( app . current . app , app . current . tab , app . current . view , app . current . page + "/" + app . current . filter + "/" + app . current . search ) ; c . preventDefault ( ) }
function addStream ( ) { 0 < $ ( "#streamurl" ) . val ( ) . length && sendAPI ( { cmd : "MPD_API_ADD_TRACK" , data : { uri : $ ( "#streamurl" ) . val ( ) } } ) ; $ ( "#streamurl" ) . val ( "" ) ; $ ( "#addstream" ) . modal ( "hide" ) } function saveQueue ( ) { 0 < $ ( "#playlistname" ) . val ( ) . length && sendAPI ( { cmd : "MPD_API_SAVE_QUEUE" , data : { plist : $ ( "#playlistname" ) . val ( ) } } ) ; $ ( "#savequeue" ) . modal ( "hide" ) }
function showNotification ( a , b , c , d ) { 1 == settings . notificationWeb && ( b = new Notification ( a , { icon : "assets/favicon.ico" , body : b } ) , setTimeout ( function ( a ) { a . close ( ) } , 3E3 , b ) ) ; 1 == settings . notificationPage && $ . notify ( { title : a , message : c } , { type : d , offset : { y : 60 , x : 20 } , template : '<div data-notify="container" class="alert alert-{0}" role="alert"><span data-notify="title">{1}</span> <span data-notify="message">{2}</span></div>' } ) } function notificationsSupported ( ) { return "Notification" in window }
2018-06-24 18:25:58 +00:00
function songChange ( a ) { if ( last _song != a . data . title + a . data . artist + a . data . album + a . data . uri + a . data . currentsongid ) { var b = "" , c = "" , d = "myMPD: " ; $ ( "#album-cover" ) . css ( "backgroundImage" , 'url("' + a . data . cover + '")' ) ; "undefined" != typeof a . data . artist && 0 < a . data . artist . length && "-" != a . data . artist ? ( b += a . data . artist , c += "<br/>" + a . data . artist , d += a . data . artist + " - " , $ ( "#artist" ) . text ( a . data . artist ) ) : $ ( "#artist" ) . text ( "" ) ; "undefined" != typeof a . data . album && 0 < a . data . album . length && "-" != a . data . album ? ( b += " - " + a . data . album ,
c += "<br/>" + a . data . album , $ ( "#album" ) . text ( a . data . album ) ) : $ ( "#album" ) . text ( "" ) ; "undefined" != typeof a . data . title && 0 < a . data . title . length ? ( d += a . data . title , $ ( "#currenttrack" ) . text ( a . data . title ) ) : $ ( "#currenttrack" ) . text ( "" ) ; document . title = d ; showNotification ( a . data . title , b , c , "success" ) ; last _song = a . data . title + a . data . artist + a . data . album + a . data . uri + a . data . currentsongid } }
$ ( document ) . keydown ( function ( a ) { if ( "INPUT" != a . target . tagName ) { switch ( a . which ) { case 37 : sendAPI ( { cmd : "MPD_API_SET_PREV" } ) ; break ; case 39 : sendAPI ( { cmd : "MPD_API_SET_NEXT" } ) ; break ; case 32 : clickPlay ( ) ; break ; default : return } a . preventDefault ( ) } } ) ; function setFilterLetter ( a ) { app . goto ( app . current . app , app . current . tab , app . current . view , "0/" + a + "/" + app . current . search ) }
function doSetFilterLetter ( a ) { $ ( a + "Letters > button" ) . removeClass ( "active" ) ; "0" == app . current . filter ? ( $ ( a ) . text ( "Filter: #" ) , $ ( a + "Letters > button" ) . each ( function ( ) { "#" == $ ( this ) . text ( ) && $ ( this ) . addClass ( "active" ) } ) ) : "-" != app . current . filter ? ( $ ( a ) . text ( "Filter: " + app . current . filter ) , $ ( a + "Letters > button" ) . each ( function ( ) { $ ( this ) . text ( ) == app . current . filter && $ ( this ) . addClass ( "active" ) } ) ) : $ ( a ) . text ( "Filter" ) }
2018-06-21 21:29:49 +00:00
function add _filter ( a ) { $ ( a ) . append ( '<button class="mr-1 mb-1 btn btn-sm btn-secondary" onclick="setFilterLetter(\'-\');"><span class="material-icons" style="font-size:14px;">delete</span></button>' ) ; $ ( a ) . append ( '<button class="mr-1 mb-1 btn btn-sm btn-secondary" onclick="setFilterLetter(\'0\');">#</button>' ) ; for ( i = 65 ; 90 >= i ; i ++ ) { var b = String . fromCharCode ( i ) ; $ ( a ) . append ( '<button class="mr-1 mb-1 btn-sm btn btn-secondary" onclick="setFilterLetter(\'' + b + "');\">" + b + "</button>" ) } }
function chVolume ( a ) { a = volumeBar . slider ( "getValue" ) + a ; 0 > a ? a = 0 : 100 < a && ( a = 100 ) ; volumeBar . slider ( "setValue" , a ) ; sendAPI ( { cmd : "MPD_API_SET_VOLUME" , data : { volume : a } } ) } function beautifyDuration ( a ) { var b = Math . floor ( a / 86400 ) , c = Math . floor ( a / 3600 ) - 24 * b , d = Math . floor ( a / 60 ) - 60 * c - 1440 * b ; a = a - 86400 * b - 3600 * c - 60 * d ; return ( 0 < b ? b + "\u2009d " : "" ) + ( 0 < c ? c + "\u2009h " + ( 10 > d ? "0" : "" ) : "" ) + d + "\u2009m " + ( 10 > a ? "0" : "" ) + a + "\u2009s" } function genId ( a ) { return "id" + a . replace ( /[^\w]/g , "" ) } ;