some small fixes again
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 5 Sep 2020 10:40:58 +0000 (12:40 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 5 Sep 2020 10:40:58 +0000 (12:40 +0200)
18 files changed:
frontend/src/components/PlayerOSD.vue
frontend/src/plugins/server.js
music_assistant/models/player_queue.py
music_assistant/music_manager.py
music_assistant/player_manager.py
music_assistant/providers/chromecast/player.py
music_assistant/providers/demo/demo_playerprovider.py
music_assistant/providers/home_assistant/__init__.py
music_assistant/web/css/app.051f35c4.css [deleted file]
music_assistant/web/css/app.e388fe44.css [new file with mode: 0644]
music_assistant/web/index.html
music_assistant/web/js/app.413e2e3d.js [new file with mode: 0644]
music_assistant/web/js/app.413e2e3d.js.map [new file with mode: 0644]
music_assistant/web/js/app.d45df414.js [deleted file]
music_assistant/web/js/app.d45df414.js.map [deleted file]
music_assistant/web/precache-manifest.41143c0c7b0781d9975365999a94a71f.js [new file with mode: 0644]
music_assistant/web/precache-manifest.7d1a9077241115c1dc586f5d8e7900b1.js [deleted file]
music_assistant/web/service-worker.js

index c8d95881d1d30c65eae69496bba32e2cabd02714..d8c8d3b72646cb2069cf235432781264f2f9b614 100644 (file)
         <v-list-item-content> </v-list-item-content>
 
         <!-- active player queue button -->
-        <v-list-item-action style="padding:28px;" v-if="$server.activePlayer">
+        <v-list-item-action style="padding:16px;" v-if="$server.activePlayer">
           <v-btn
             text
             icon
         </v-list-item-action>
 
         <!-- active player volume -->
-        <v-list-item-action style="padding:20px;" v-if="$server.activePlayer && !$store.isMobile">
+        <v-list-item-action style="padding:16px;" v-if="$server.activePlayer && !$store.isMobile">
           <v-menu
             :close-on-content-click="false"
             :nudge-width="250"
         </v-list-item-action>
 
         <!-- active player btn -->
-        <v-list-item-action style="padding:30px;margin-right:15px">
+        <v-list-item-action style="padding:15px;margin-right:15px">
           <v-btn text icon @click="$server.$emit('showPlayersMenu')">
             <v-flex xs12 class="vertical-btn">
               <v-icon>speaker</v-icon>
               <span class="caption" v-if="$server.activePlayer" style="padding-top: 5px">{{
-                truncateString($server.activePlayer.name, 18)
+                truncateString($server.activePlayer.name, 12)
               }}</span>
               <span class="caption" v-else> </span>
             </v-flex>
index e87bbd6e1e7d70e105fc2a8782f324283e0a91de..90e7eda30fe2a970865e3d1b9cb94ae267c341de 100644 (file)
@@ -199,15 +199,15 @@ const server = new Vue({
 
     _selectActivePlayer () {
       // auto select new active player if we have none
-      if (!this.activePlayer || !this.activePlayer.enabled || this.activePlayer.group_parents.length > 0) {
+      if (!this.activePlayer || !this.activePlayer.available) {
         // prefer last selected player
         const lastPlayerId = localStorage.getItem('activePlayerId')
-        if (lastPlayerId && this.players[lastPlayerId] && this.players[lastPlayerId].enabled) {
+        if (lastPlayerId && this.players[lastPlayerId] && this.players[lastPlayerId].available) {
           this.switchPlayer(lastPlayerId)
         } else {
           // prefer the first playing player
           for (const playerId in this.players) {
-            if (this.players[playerId].state === 'playing' && this.players[playerId].enabled && this.players[playerId].group_parents.length === 0) {
+            if (this.players[playerId].state === 'playing' && this.players[playerId].available) {
               this.switchPlayer(playerId)
               break
             }
@@ -215,7 +215,7 @@ const server = new Vue({
           // fallback to just the first player
           if (!this.activePlayer || !this.activePlayer.enabled) {
             for (const playerId in this.players) {
-              if (this.players[playerId].enabled && this.players[playerId].group_parents.length === 0) {
+              if (this.players[playerId].available) {
                 this.switchPlayer(playerId)
                 break
               }
index f8a66f4d4bd90021634ddb323f1e3e221a02d4a7..64392c3d1530676f96c9f3e06e4133bd34713b10 100755 (executable)
@@ -39,6 +39,7 @@ class QueueOption(str, Enum):
 @dataclass
 class QueueItem(Track):
     """Representation of a queue item, extended version of track."""
+
     streamdetails: StreamDetails = None
     uri: str = ""
     queue_item_id: str = ""
@@ -54,7 +55,7 @@ class QueueItem(Track):
 
 class PlayerQueue:
     """
-        Class that holds the queue items for a player.
+    Class that holds the queue items for a player.
     """
 
     def __init__(self, mass, player_id):
@@ -71,9 +72,7 @@ class PlayerQueue:
         self._last_player_state = PlayerState.Stopped
         self._last_track = None
         # load previous queue settings from disk
-        self.mass.add_job(
-            self.__async_restore_saved_state()
-        )
+        self.mass.add_job(self.__async_restore_saved_state())
 
     async def async_close(self):
         """Call on shutdown/close."""
@@ -133,8 +132,8 @@ class PlayerQueue:
     @property
     def cur_index(self):
         """
-            Returns the current index of the queue.
-            Returns None if queue is empty.
+        Returns the current index of the queue.
+        Returns None if queue is empty.
         """
         if not self._items:
             return None
@@ -143,8 +142,8 @@ class PlayerQueue:
     @property
     def cur_item_id(self):
         """
-            Return the queue item id of the current item in the queue.
-            Returns None if queue is empty.
+        Return the queue item id of the current item in the queue.
+        Returns None if queue is empty.
         """
         if self.cur_index is None or not len(self.items) > self.cur_index:
             return None
@@ -153,8 +152,8 @@ class PlayerQueue:
     @property
     def cur_item(self):
         """
-            Return the current item in the queue.
-            Returns None if queue is empty.
+        Return the current item in the queue.
+        Returns None if queue is empty.
         """
         if self.cur_index is None or not len(self.items) > self.cur_index:
             return None
@@ -168,8 +167,8 @@ class PlayerQueue:
     @property
     def next_index(self):
         """
-            Returns the next index for this player's queue.
-            Returns None if queue is empty or no more items.
+        Returns the next index for this player's queue.
+        Returns None if queue is empty or no more items.
         """
         if not self.items:
             # queue is empty
@@ -189,8 +188,8 @@ class PlayerQueue:
     @property
     def next_item(self):
         """
-            Returns the next item in the queue.
-            Returns None if queue is empty or no more items.
+        Returns the next item in the queue.
+        Returns None if queue is empty or no more items.
         """
         if self.next_index is not None:
             return self.items[self.next_index]
@@ -199,16 +198,16 @@ class PlayerQueue:
     @property
     def items(self):
         """
-            Returns all queue items for this player's queue.
+        Returns all queue items for this player's queue.
         """
         return self._items
 
     @property
     def use_queue_stream(self):
         """
-            bool to indicate that we need to use the queue stream
-            for example if crossfading is requested but a player doesn't natively support it
-            it will send a constant stream of audio to the player with all tracks
+        bool to indicate that we need to use the queue stream
+        for example if crossfading is requested but a player doesn't natively support it
+        it will send a constant stream of audio to the player with all tracks
         """
         supports_crossfade = PlayerFeature.CROSSFADE in self.player.features
         return self.crossfade_enabled and not supports_crossfade
@@ -237,7 +236,9 @@ class PlayerQueue:
         if self.use_queue_stream:
             return await self.async_play_index(self.cur_index + 1)
         else:
-            return await self.mass.player_manager.get_player_provider(self.player_id).async_cmd_next(self.player_id)
+            return await self.mass.player_manager.get_player_provider(
+                self.player_id
+            ).async_cmd_next(self.player_id)
 
     async def async_previous(self):
         """Play the previous track in the queue."""
@@ -262,9 +263,7 @@ class PlayerQueue:
                 await player_provider.async_cmd_queue_load(self.player_id, self.items)
                 await self.async_play_index(prev_index)
         else:
-            LOGGER.warning(
-                "resume queue requested for %s but queue is empty", self.player.name
-            )
+            LOGGER.warning("resume queue requested for %s but queue is empty", self.player.name)
 
     async def async_play_index(self, index):
         """Play item at index X in queue."""
@@ -283,16 +282,24 @@ class PlayerQueue:
             )
             return await player_prov.async_cmd_play_uri(self.player_id, queue_stream_uri)
         elif supports_queue:
-            return await player_prov.async_cmd_queue_play_index(self.player_id, index)
+            try:
+                return await player_prov.async_cmd_queue_play_index(self.player_id, index)
+            except NotImplementedError:
+                # not supported by player, use load queue instead
+                LOGGER.debug(
+                    "cmd_queue_insert not supported by player, fallback to cmd_queue_load "
+                )
+                self._items = self._items[index:]
+                await player_prov.async_cmd_queue_load(self.player_id, self._items)
         else:
             return await player_prov.async_cmd_play_uri(self.player_id, self._items[index].uri)
 
     async def async_move_item(self, queue_item_id, pos_shift=1):
         """
-            move queue item x up/down the queue
-            param pos_shift: move item x positions down if positive value
-                             move item x positions up if negative value
-                             move item to top of queue as next item
+        move queue item x up/down the queue
+        param pos_shift: move item x positions down if positive value
+                         move item x positions up if negative value
+                         move item to top of queue as next item
         """
         items = self.items.copy()
         item_index = self.__index_by_id(queue_item_id)
@@ -328,11 +335,11 @@ class PlayerQueue:
 
     async def async_insert(self, queue_items: List[QueueItem], offset=0):
         """
-            insert new items at offset x from current position
-            keeps remaining items in queue
-            if offset 0, will start playing newly added item(s)
-                :param queue_items: a list of QueueItem
-                :param offset: offset from current queue position
+        insert new items at offset x from current position
+        keeps remaining items in queue
+        if offset 0, will start playing newly added item(s)
+            :param queue_items: a list of QueueItem
+            :param offset: offset from current queue position
         """
         supports_queue = PlayerFeature.QUEUE in self.player.features
 
@@ -348,9 +355,7 @@ class PlayerQueue:
             item.sort_index = insert_at_index + index
         if self.shuffle_enabled:
             queue_items = self.__shuffle_items(queue_items)
-        self._items = (
-            self._items[:insert_at_index] + queue_items + self._items[insert_at_index:]
-        )
+        self._items = self._items[:insert_at_index] + queue_items + self._items[insert_at_index:]
         if self.use_queue_stream or not supports_queue:
             if offset == 0:
                 await self.async_play_index(insert_at_index)
@@ -358,20 +363,22 @@ class PlayerQueue:
             # send queue to player's own implementation
             player_prov = self.mass.player_manager.get_player_provider(self.player_id)
             try:
-                await player_prov.async_cmd_queue_insert(self.player_id, queue_items, insert_at_index)
+                await player_prov.async_cmd_queue_insert(
+                    self.player_id, queue_items, insert_at_index
+                )
             except NotImplementedError:
                 # not supported by player, use load queue instead
                 LOGGER.debug(
                     "cmd_queue_insert not supported by player, fallback to cmd_queue_load "
                 )
-                self._items = self._items[self.cur_index:]
+                self._items = self._items[self.cur_index :]
                 await player_prov.async_cmd_queue_load(self.player_id, self._items)
         self.mass.signal_event(EVENT_QUEUE_ITEMS_UPDATED, self.to_dict())
         self.mass.add_job(self.__async_save_state())
 
     async def async_append(self, queue_items: List[QueueItem]):
         """
-            append new items at the end of the queue
+        append new items at the end of the queue
         """
         supports_queue = PlayerFeature.QUEUE in self.player.features
         for index, item in enumerate(queue_items):
@@ -400,7 +407,7 @@ class PlayerQueue:
 
     async def async_update(self, queue_items: List[QueueItem]):
         """
-            update the existing queue items, mostly caused by reordering
+        update the existing queue items, mostly caused by reordering
         """
         supports_queue = PlayerFeature.QUEUE in self.player.features
         self._items = queue_items
@@ -421,7 +428,7 @@ class PlayerQueue:
 
     async def async_clear(self):
         """
-            clear all items in the queue
+        clear all items in the queue
         """
         supports_queue = PlayerFeature.QUEUE in self.player.features
         await self.mass.player_manager.async_cmd_stop(self.player_id)
@@ -459,13 +466,15 @@ class PlayerQueue:
         self._last_queue_startindex = self._next_queue_startindex
         return self.get_item(self._next_queue_startindex)
 
-    async def async_get_stream_details(self, player_id: str, queue_item: QueueItem) -> StreamDetails:
+    async def async_get_stream_details(
+        self, player_id: str, queue_item: QueueItem
+    ) -> StreamDetails:
         """
-            Get streamdetails for the given queue_item.
-            This is called just-in-time when a player/queue wants a QueueItem to be played.
-            Do not try to request streamdetails in advance as this is expiring data.
-                param player_id: The id of the player that will be playing the stream.
-                param queue_item: The QueueItem for which to request the streamdetails for.
+        Get streamdetails for the given queue_item.
+        This is called just-in-time when a player/queue wants a QueueItem to be played.
+        Do not try to request streamdetails in advance as this is expiring data.
+            param player_id: The id of the player that will be playing the stream.
+            param queue_item: The QueueItem for which to request the streamdetails for.
         """
         # always request the full db track as there might be other qualities available
         # except for radio
@@ -473,25 +482,20 @@ class PlayerQueue:
             full_track = queue_item
         else:
             full_track = await self.mass.music_manager.async_get_track(
-                    queue_item.item_id,
-                    queue_item.provider,
-                    lazy=True,
-                    refresh=True
-                )
+                queue_item.item_id, queue_item.provider, lazy=True, refresh=True
+            )
         # sort by quality and check track availability
-        for prov_media in sorted(
-            full_track.provider_ids, key=lambda x: x.quality, reverse=True
-        ):
+        for prov_media in sorted(full_track.provider_ids, key=lambda x: x.quality, reverse=True):
             # get streamdetails from provider
             music_prov = self.mass.get_provider(prov_media.provider)
             if not music_prov:
                 continue  # provider temporary unavailable ?
-            
+
             streamdetails = await music_prov.async_get_stream_details(prov_media.item_id)
 
             if streamdetails:
                 # set streamdetails as attribute on the queue_item
-                queue_item.streamdetails=streamdetails
+                queue_item.streamdetails = streamdetails
                 return streamdetails
         return None
 
@@ -512,7 +516,7 @@ class PlayerQueue:
             "queue_stream_enabled": self.use_queue_stream,
         }
 
-    @ callback
+    @callback
     def __get_queue_stream_index(self):
         # player is playing a constant stream of the queue so we need to do this the hard way
         queue_index = 0
@@ -520,9 +524,7 @@ class PlayerQueue:
         total_time = 0
         track_time = 0
         if self.items and len(self.items) > self._last_queue_startindex:
-            queue_index = (
-                self._last_queue_startindex
-            )  # holds the last starting position
+            queue_index = self._last_queue_startindex  # holds the last starting position
             queue_track = None
             while len(self.items) > queue_index:
                 queue_track = self.items[queue_index]
@@ -543,13 +545,9 @@ class PlayerQueue:
             # account for track changing state so trigger track change after 1 second
             if self._last_track and self._last_track.streamdetails:
                 self._last_track.streamdetails.seconds_played = self._last_item_time
-                self.mass.signal_event(
-                    EVENT_PLAYBACK_STOPPED, self._last_track.streamdetails
-                )
+                self.mass.signal_event(EVENT_PLAYBACK_STOPPED, self._last_track.streamdetails)
             if new_track and new_track.streamdetails:
-                self.mass.signal_event(
-                    EVENT_PLAYBACK_STARTED, new_track.streamdetails
-                )
+                self.mass.signal_event(EVENT_PLAYBACK_STARTED, new_track.streamdetails)
                 self._last_track = new_track
         if self._last_player_state != self.player.state:
             self._last_player_state = self.player.state
@@ -559,9 +557,7 @@ class PlayerQueue:
             ]:
                 # player stopped playing
                 if self._last_track:
-                    self.mass.signal_event(
-                        EVENT_PLAYBACK_STOPPED, self._last_track.streamdetails
-                    )
+                    self.mass.signal_event(EVENT_PLAYBACK_STOPPED, self._last_track.streamdetails)
         # update vars
         if track_time > 2:
             # account for track changing state so keep this a few seconds behind
index aa55f31ebc587b8a6b206823d784609f99850587..a65c7dd37d8b012f96c85d3993756de6adfc3e92 100755 (executable)
@@ -285,7 +285,7 @@ class MusicManager:
                 # tracks from all providers
                 item_ids = []
                 artist = await self.mass.database.async_get_artist(
-                    artist_id, False, db_conn=db_conn
+                    artist_id, True, db_conn=db_conn
                 )
                 for prov_id in artist.provider_ids:
                     async for item in self.async_get_artist_toptracks(
@@ -308,7 +308,7 @@ class MusicManager:
                         )
                         if db_id:
                             # return database track instead if we have a match
-                            yield await self.mass.database.async_get_track(db_id, db_conn=db_conn)
+                            yield await self.mass.database.async_get_track(db_id, fulldata=False, db_conn=db_conn)
                         else:
                             yield item
 
index bf1c52954c7c0eecf754209cb7cf45bd33723325..70a1ea52273dd9036454e18e9bd8af16c66286f3 100755 (executable)
@@ -129,6 +129,8 @@ class PlayerManager:
 
     async def async_add_player(self, player: Player) -> None:
         """Register a new player or update an existing one."""
+        if not player:
+            return
         is_new_player = player.player_id not in self._players
         await self.__async_create_player_state(player)
         if is_new_player:
@@ -150,6 +152,8 @@ class PlayerManager:
 
     async def async_update_player(self, player: Player):
         """Update an existing player (or register as new if non existing)."""
+        if not player:
+            return
         if not player.player_id in self._players:
             return await self.async_add_player(player)
         await self.__async_create_player_state(player)
index c828c859beb1c84ef1e22c7e13c0d1c8384aa28e..5481866eaa149570b8a5ba8b91b16e0311c6f509 100644 (file)
@@ -177,8 +177,6 @@ class ChromecastPlayer:
 
     async def async_disconnect(self):
         """Disconnect Chromecast object if it is set."""
-        # if self.__cc_report_progress_task:
-        #     self.__cc_report_progress_task.cancel()
         if self._chromecast is None:
             return
         LOGGER.warning("[%s] Disconnecting from chromecast socket", self._cast_info.friendly_name)
@@ -248,31 +246,52 @@ class ChromecastPlayer:
 
     def stop(self):
         """Send stop command to player."""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         self._chromecast.media_controller.stop()
 
     def play(self):
         """Send play command to player."""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         self._chromecast.media_controller.play()
 
     def pause(self):
         """Send pause command to player."""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         self._chromecast.media_controller.pause()
 
     def next(self):
         """Send next track command to player."""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         self._chromecast.media_controller.queue_next()
 
     def previous(self):
         """Send previous track command to player."""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         self._chromecast.media_controller.queue_prev()
 
     def power_on(self):
         """Send power ON command to player."""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         self._powered = True
         self._chromecast.set_volume_muted(False)
 
     def power_off(self):
         """Send power OFF command to player."""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         if self.media_status and (
             self.media_status.player_is_playing or self.media_status.player_is_paused
         ):
@@ -284,15 +303,24 @@ class ChromecastPlayer:
 
     def volume_set(self, volume_level):
         """Send new volume level command to player."""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         self._chromecast.set_volume(volume_level)
         # self.volume_level = volume_level
 
     def volume_mute(self, is_muted=False):
         """Send mute command to player."""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         self._chromecast.set_volume_muted(is_muted)
 
     def play_uri(self, uri: str):
         """Play single uri on player."""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         player_queue = self.mass.player_manager.get_player_queue(self.player_id)
         if player_queue.use_queue_stream:
             # create CC queue so that skip and previous will work
@@ -305,6 +333,9 @@ class ChromecastPlayer:
 
     def queue_load(self, queue_items: List[QueueItem]):
         """load (overwrite) queue with new items"""
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         player_queue = self.mass.player_manager.get_player_queue(self.player_id)
         cc_queue_items = self.__create_queue_items(queue_items[:50])
         repeat_enabled = player_queue.use_queue_stream or player_queue.repeat_enabled
@@ -324,6 +355,9 @@ class ChromecastPlayer:
         """
         append new items at the end of the queue
         """
+        if not self._chromecast.socket_client.is_connected:
+            LOGGER.warning("Ignore player command: Socket client is not connected.")
+            return
         cc_queue_items = self.__create_queue_items(queue_items)
         for chunk in chunks(cc_queue_items, 50):
             queuedata = {"type": "QUEUE_INSERT", "insertBefore": None, "items": chunk}
index 77305344f47b7ec8f7f7b9bbf74153bda5f77306..4de5153351ea101aed9586488eb64318919707ba 100644 (file)
@@ -109,7 +109,6 @@ class DemoPlayerProvider(PlayerProvider):
 
     def player_event(self, player_id, event):
         """Called on vlc player events."""
-        print(event)
         vlc_player: vlc.MediaPlayer = self._players[player_id].vlc_player
         self._players[player_id].muted = vlc_player.audio_get_mute()
         self._players[player_id].volume_level = vlc_player.audio_get_volume()
index 04a3b7490f73f4918c1729b7c90f3133cd659977..136bb9fc8b68a2dfb26e03ca1086e3aff3830195 100644 (file)
@@ -88,7 +88,7 @@ class HomeAssistantPlugin(Provider):
                 entry_type=ConfigEntryType.STRING,
                 description_key=CONF_POWER_ENTITIES,
                 default_value=[],
-                values=self.__get_power_control_entities(),
+                values=self._power_entities,
                 multi_value=True,
             ),
             ConfigEntry(
@@ -96,7 +96,7 @@ class HomeAssistantPlugin(Provider):
                 entry_type=ConfigEntryType.STRING,
                 description_key=CONF_VOLUME_ENTITIES,
                 default_value=[],
-                values=self.__get_volume_control_entities(),
+                values=self._volume_entities,
                 multi_value=True,
             ),
         ]
@@ -146,8 +146,7 @@ class HomeAssistantPlugin(Provider):
             )
         elif event_type == EVENT_CONNECTED:
             # register player controls on connect
-            # await self.__async_register_power_controls()
-            await self.__async_register_volume_controls()
+            self.mass.add_job(self.__async_register_player_controls())
 
     async def __async_handle_player_command(self, service, service_data):
         """Handle forwarded service call for one of our players."""
@@ -241,11 +240,17 @@ class HomeAssistantPlugin(Provider):
             "media_duration": cur_item.duration if cur_item else None,
             "media_position": player_queue.cur_item_time if player_queue else None,
             "media_title": cur_item.name if cur_item else None,
-            "media_artist": cur_item.artists[0].name if cur_item else None,
-            "media_album_name": cur_item.album.name if cur_item else None,
-            "entity_picture": cur_item.album.metadata.get("image") if cur_item else None,
+            "media_artist": cur_item.artists[0].name if cur_item and cur_item.artists else None,
+            "media_album_name": cur_item.album.name if cur_item and cur_item.album else None,
+            "entity_picture": "",
             "mass_player_id": player_id,
         }
+        if cur_item:
+            host = f"{self.mass.web.local_ip}:{self.mass.web.http_port}"
+            img_url = (
+                f"http://{host}/api/track/{cur_item.item_id}/thumb?provider={cur_item.provider}"
+            )
+            state_attributes["entity_picture"] = img_url
         self._published_players[entity_id] = player.player_id
         await self._hass.async_set_state(entity_id, player.state, state_attributes)
 
@@ -319,14 +324,25 @@ class HomeAssistantPlugin(Provider):
                 control_entity["value"], cur_state
             )
 
+    async def __async_register_player_controls(self):
+        """Register all (enabled) player controls."""
+        self._volume_entities = self.__get_volume_control_entities()
+        self._power_entities = self.__get_power_control_entities()
+        await self.__async_register_power_controls()
+        await self.__async_register_volume_controls()
+
     async def __async_register_power_controls(self):
         """Register all (enabled) power controls."""
         conf = self.mass.config.providers[PROV_ID]
-        for control_entity in self.__get_power_control_entities():
+        enabled_controls = conf[CONF_POWER_ENTITIES]
+        for control_entity in self._power_entities:
             enabled_controls = conf[CONF_POWER_ENTITIES]
             if not control_entity["value"] in enabled_controls:
                 continue
             entity_id = control_entity["entity_id"]
+            if not entity_id in self._hass.states:
+                LOGGER.warning("entity not found: %s", entity_id)
+                continue
             state_obj = self._hass.states[entity_id]
             cur_state = state_obj["state"] != "off"
             source = control_entity.get("source")
@@ -350,13 +366,15 @@ class HomeAssistantPlugin(Provider):
     async def __async_register_volume_controls(self):
         """Register all (enabled) power controls."""
         conf = self.mass.config.providers[PROV_ID]
-        for control_entity in self.__get_volume_control_entities():
-            enabled_controls = conf[CONF_VOLUME_ENTITIES]
+        enabled_controls = conf[CONF_VOLUME_ENTITIES]
+        for control_entity in self._volume_entities:
             if not control_entity["value"] in enabled_controls:
                 continue
             entity_id = control_entity["entity_id"]
-            # cur_volume = try_parse_float(self._hass.get_state(entity_id, "volume_level")) * 100
-            cur_volume = 10
+            if not entity_id in self._hass.states:
+                LOGGER.warning("entity not found: %s", entity_id)
+                continue
+            cur_volume = try_parse_float(self._hass.get_state(entity_id, "volume_level")) * 100
             control = PlayerControl(
                 type=PlayerControlType.VOLUME,
                 id=control_entity["value"],
diff --git a/music_assistant/web/css/app.051f35c4.css b/music_assistant/web/css/app.051f35c4.css
deleted file mode 100644 (file)
index 54ab1f7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-.vertical-btn[data-v-21e0f2f0]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.divider[data-v-21e0f2f0]{height:1px;width:100%;background-color:#ccc}.right[data-v-21e0f2f0]{float:right}.left[data-v-21e0f2f0]{float:left}.vertical-btn[data-v-7c65a917]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.body{background-color:#000;overscroll-behavior-x:none}.scroller[data-v-764b0c8e]{height:100%}
\ No newline at end of file
diff --git a/music_assistant/web/css/app.e388fe44.css b/music_assistant/web/css/app.e388fe44.css
new file mode 100644 (file)
index 0000000..0ea300e
--- /dev/null
@@ -0,0 +1 @@
+.vertical-btn[data-v-66faf443]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.divider[data-v-66faf443]{height:1px;width:100%;background-color:#ccc}.right[data-v-66faf443]{float:right}.left[data-v-66faf443]{float:left}.vertical-btn[data-v-7c65a917]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.body{background-color:#000;overscroll-behavior-x:none}.scroller[data-v-764b0c8e]{height:100%}
\ No newline at end of file
index e0333a815e080b2e65fe88a1805f167316d0effc..6374f671dea93213812b8c230eaf2c5e9d037cf4 100644 (file)
@@ -1 +1 @@
-<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="favicon.ico"><![endif]--><title>Music Assistant</title><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css><link href=css/config.2956469c.css rel=prefetch><link href=css/itemdetails.28909c9e.css rel=prefetch><link href=css/itemdetails~playerqueue~search.133d2876.css rel=prefetch><link href=js/config.165ed655.js rel=prefetch><link href=js/itemdetails.79b5fa05.js rel=prefetch><link href=js/itemdetails~playerqueue~search.3c623cdf.js rel=prefetch><link href=js/playerqueue.84a8618a.js rel=prefetch><link href=js/search.31a9bea8.js rel=prefetch><link href=css/app.051f35c4.css rel=preload as=style><link href=css/chunk-vendors.f9907851.css rel=preload as=style><link href=js/app.d45df414.js rel=preload as=script><link href=js/chunk-vendors.31828971.js rel=preload as=script><link href=css/chunk-vendors.f9907851.css rel=stylesheet><link href=css/app.051f35c4.css rel=stylesheet><link rel=icon type=image/png sizes=32x32 href=img/icons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=img/icons/favicon-16x16.png><link rel=manifest href=manifest.json><meta name=theme-color content=#424242><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black><meta name=apple-mobile-web-app-title content="Music Assistant"><link rel=apple-touch-icon href=img/icons/apple-touch-icon-152x152.png><link rel=mask-icon href=img/icons/safari-pinned-tab.svg color=#424242><meta name=msapplication-TileImage content=img/icons/msapplication-icon-144x144.png><meta name=msapplication-TileColor content=#424242></head><body><noscript><strong>We're sorry but musicassistant-frontend doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=js/chunk-vendors.31828971.js></script><script src=js/app.d45df414.js></script></body></html>
\ No newline at end of file
+<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="favicon.ico"><![endif]--><title>Music Assistant</title><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css><link href=css/config.2956469c.css rel=prefetch><link href=css/itemdetails.28909c9e.css rel=prefetch><link href=css/itemdetails~playerqueue~search.133d2876.css rel=prefetch><link href=js/config.165ed655.js rel=prefetch><link href=js/itemdetails.79b5fa05.js rel=prefetch><link href=js/itemdetails~playerqueue~search.3c623cdf.js rel=prefetch><link href=js/playerqueue.84a8618a.js rel=prefetch><link href=js/search.31a9bea8.js rel=prefetch><link href=css/app.e388fe44.css rel=preload as=style><link href=css/chunk-vendors.f9907851.css rel=preload as=style><link href=js/app.413e2e3d.js rel=preload as=script><link href=js/chunk-vendors.31828971.js rel=preload as=script><link href=css/chunk-vendors.f9907851.css rel=stylesheet><link href=css/app.e388fe44.css rel=stylesheet><link rel=icon type=image/png sizes=32x32 href=img/icons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=img/icons/favicon-16x16.png><link rel=manifest href=manifest.json><meta name=theme-color content=#424242><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black><meta name=apple-mobile-web-app-title content="Music Assistant"><link rel=apple-touch-icon href=img/icons/apple-touch-icon-152x152.png><link rel=mask-icon href=img/icons/safari-pinned-tab.svg color=#424242><meta name=msapplication-TileImage content=img/icons/msapplication-icon-144x144.png><meta name=msapplication-TileColor content=#424242></head><body><noscript><strong>We're sorry but musicassistant-frontend doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=js/chunk-vendors.31828971.js></script><script src=js/app.413e2e3d.js></script></body></html>
\ No newline at end of file
diff --git a/music_assistant/web/js/app.413e2e3d.js b/music_assistant/web/js/app.413e2e3d.js
new file mode 100644 (file)
index 0000000..4c4b843
--- /dev/null
@@ -0,0 +1,2 @@
+(function(e){function t(t){for(var i,r,o=t[0],l=t[1],c=t[2],u=0,d=[];u<o.length;u++)r=o[u],Object.prototype.hasOwnProperty.call(n,r)&&n[r]&&d.push(n[r][0]),n[r]=0;for(i in l)Object.prototype.hasOwnProperty.call(l,i)&&(e[i]=l[i]);p&&p(t);while(d.length)d.shift()();return s.push.apply(s,c||[]),a()}function a(){for(var e,t=0;t<s.length;t++){for(var a=s[t],i=!0,r=1;r<a.length;r++){var o=a[r];0!==n[o]&&(i=!1)}i&&(s.splice(t--,1),e=l(l.s=a[0]))}return e}var i={},r={app:0},n={app:0},s=[];function o(e){return l.p+"js/"+({config:"config","itemdetails~playerqueue~search":"itemdetails~playerqueue~search",itemdetails:"itemdetails",playerqueue:"playerqueue",search:"search"}[e]||e)+"."+{config:"165ed655","itemdetails~playerqueue~search":"3c623cdf",itemdetails:"79b5fa05",playerqueue:"84a8618a",search:"31a9bea8"}[e]+".js"}function l(t){if(i[t])return i[t].exports;var a=i[t]={i:t,l:!1,exports:{}};return e[t].call(a.exports,a,a.exports,l),a.l=!0,a.exports}l.e=function(e){var t=[],a={config:1,"itemdetails~playerqueue~search":1,itemdetails:1};r[e]?t.push(r[e]):0!==r[e]&&a[e]&&t.push(r[e]=new Promise((function(t,a){for(var i="css/"+({config:"config","itemdetails~playerqueue~search":"itemdetails~playerqueue~search",itemdetails:"itemdetails",playerqueue:"playerqueue",search:"search"}[e]||e)+"."+{config:"2956469c","itemdetails~playerqueue~search":"133d2876",itemdetails:"28909c9e",playerqueue:"31d6cfe0",search:"31d6cfe0"}[e]+".css",n=l.p+i,s=document.getElementsByTagName("link"),o=0;o<s.length;o++){var c=s[o],u=c.getAttribute("data-href")||c.getAttribute("href");if("stylesheet"===c.rel&&(u===i||u===n))return t()}var d=document.getElementsByTagName("style");for(o=0;o<d.length;o++){c=d[o],u=c.getAttribute("data-href");if(u===i||u===n)return t()}var p=document.createElement("link");p.rel="stylesheet",p.type="text/css",p.onload=t,p.onerror=function(t){var i=t&&t.target&&t.target.src||n,s=new Error("Loading CSS chunk "+e+" failed.\n("+i+")");s.code="CSS_CHUNK_LOAD_FAILED",s.request=i,delete r[e],p.parentNode.removeChild(p),a(s)},p.href=n;var m=document.getElementsByTagName("head")[0];m.appendChild(p)})).then((function(){r[e]=0})));var i=n[e];if(0!==i)if(i)t.push(i[2]);else{var s=new Promise((function(t,a){i=n[e]=[t,a]}));t.push(i[2]=s);var c,u=document.createElement("script");u.charset="utf-8",u.timeout=120,l.nc&&u.setAttribute("nonce",l.nc),u.src=o(e);var d=new Error;c=function(t){u.onerror=u.onload=null,clearTimeout(p);var a=n[e];if(0!==a){if(a){var i=t&&("load"===t.type?"missing":t.type),r=t&&t.target&&t.target.src;d.message="Loading chunk "+e+" failed.\n("+i+": "+r+")",d.name="ChunkLoadError",d.type=i,d.request=r,a[1](d)}n[e]=void 0}};var p=setTimeout((function(){c({type:"timeout",target:u})}),12e4);u.onerror=u.onload=c,document.head.appendChild(u)}return Promise.all(t)},l.m=e,l.c=i,l.d=function(e,t,a){l.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},l.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,t){if(1&t&&(e=l(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(l.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)l.d(a,i,function(t){return e[t]}.bind(null,i));return a},l.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return l.d(t,"a",t),t},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.p="",l.oe=function(e){throw e};var c=window["webpackJsonp"]=window["webpackJsonp"]||[],u=c.push.bind(c);c.push=t,c=c.slice();for(var d=0;d<c.length;d++)t(c[d]);var p=u;s.push([0,"chunk-vendors"]),a()})({0:function(e,t,a){e.exports=a("56d7")},"034f":function(e,t,a){"use strict";var i=a("85ec"),r=a.n(i);r.a},"0863":function(e,t,a){e.exports=a.p+"img/qobuz.c7eb9a76.png"},"0c3b":function(e,t,a){e.exports=a.p+"img/spotify.1f3fb1af.png"},"0dac":function(e,t,a){"use strict";var i=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("section",[a("v-app-bar",{staticStyle:{"margin-bottom":"-8px"},attrs:{flat:"",light:"",dense:"",color:"transparent"}},[a("v-label",{attrs:{light:""}},[e._v(e._s(e.items.length+" "+e.$t("items")))]),a("v-spacer"),a("v-menu",{attrs:{left:"","close-on-content-click":!1},scopedSlots:e._u([{key:"activator",fn:function(t){var i=t.on;return[a("v-btn",e._g({attrs:{icon:""}},i),[a("v-icon",[e._v("sort")])],1)]}}])},[a("v-list",e._l(e.sortKeys,(function(t){return a("v-list-item",{key:t.value,domProps:{textContent:e._s(t.text)},on:{click:function(a){e.sortBy=t.value}}})})),1)],1),a("v-btn",{attrs:{icon:""},on:{click:function(t){e.sortDesc=!e.sortDesc}}},[e.sortDesc?e._e():a("v-icon",[e._v("arrow_upward")]),e.sortDesc?a("v-icon",[e._v("arrow_downward")]):e._e()],1),a("v-menu",{attrs:{left:"","close-on-content-click":!1},scopedSlots:e._u([{key:"activator",fn:function(t){var i=t.on;return[a("v-btn",e._g({attrs:{icon:""}},i),[a("v-icon",[e._v("search")])],1)]}}])},[a("v-card",[a("v-text-field",{attrs:{clearable:"","prepend-inner-icon":"search",label:"Search","hide-details":"",solo:"",dense:""},model:{value:e.search,callback:function(t){e.search=t},expression:"search"}})],1)],1),a("v-btn",{staticStyle:{"margin-right":"-15px"},attrs:{icon:""},on:{click:function(t){return e.toggleViewMode()}}},["panel"==e.viewMode?a("v-icon",[e._v("view_list")]):e._e(),"list"==e.viewMode?a("v-icon",[e._v("grid_on")]):e._e()],1)],1),a("v-data-iterator",{attrs:{items:e.items,search:e.search,"sort-by":e.sortBy,"sort-desc":e.sortDesc,"custom-filter":e.filteredItems,"hide-default-footer":"","disable-pagination":"",loading:""},scopedSlots:e._u([{key:"default",fn:function(t){return["panel"==e.viewMode?a("v-container",{attrs:{fluid:""}},[a("v-row",{attrs:{dense:"","align-content":"stretch",align:"stretch"}},e._l(t.items,(function(t){return a("v-col",{key:t.item_id,attrs:{"align-self":"stretch"}},[a("PanelviewItem",{attrs:{item:t,thumbWidth:e.thumbWidth,thumbHeight:e.thumbHeight}})],1)})),1)],1):e._e(),"list"==e.viewMode?a("v-list",{attrs:{"two-line":""}},[a("RecycleScroller",{staticClass:"scroller",attrs:{items:t.items,"item-size":72,"key-field":"item_id","page-mode":""},scopedSlots:e._u([{key:"default",fn:function(t){var i=t.item;return[a("ListviewItem",{attrs:{item:i,hideavatar:3==i.media_type&&e.$store.isMobile,hidetracknum:!0,hideproviders:i.media_type<4&&e.$store.isMobile,hidelibrary:!0,hidemenu:3==i.media_type&&e.$store.isMobile,hideduration:5==i.media_type}})]}}],null,!0)})],1):e._e()]}}])})],1)},r=[],n=(a("caad"),a("b0c0"),a("2532"),a("54f8")),s=(a("96cf"),a("c964")),o=a("d3cc"),l=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("v-card",{directives:[{name:"longpress",rawName:"v-longpress",value:e.menuClick,expression:"menuClick"}],attrs:{light:"","min-height":e.thumbHeight,"min-width":e.thumbWidth,"max-width":1.6*e.thumbWidth,hover:"",outlined:""},on:{click:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:void(e.onclickHandler?e.onclickHandler(e.item):e.itemClicked(e.item))},contextmenu:[e.menuClick,function(e){e.preventDefault()}]}},[i("v-img",{attrs:{src:e.$server.getImageUrl(e.item,"image",e.thumbWidth),width:"100%","aspect-ratio":"1"}}),e.isHiRes?i("div",{staticStyle:{position:"absolute","margin-left":"5px","margin-top":"-13px",height:"30px","background-color":"white","border-radius":"3px"}},[i("v-tooltip",{attrs:{bottom:""},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on;return[i("img",e._g({attrs:{src:a("f5e3"),height:"25"}},r))]}}],null,!1,1400808392)},[i("span",[e._v(e._s(e.isHiRes))])])],1):e._e(),i("v-divider"),i("v-card-title",{class:e.$store.isMobile?"body-2":"title",staticStyle:{padding:"8px",color:"primary","margin-top":"8px"},domProps:{textContent:e._s(e.item.name)}}),e.item.artist?i("v-card-subtitle",{class:e.$store.isMobile?"caption":"body-1",staticStyle:{padding:"8px"},domProps:{textContent:e._s(e.item.artist.name)}}):e._e(),e.item.artists?i("v-card-subtitle",{class:e.$store.isMobile?"caption":"body-1",staticStyle:{padding:"8px"},domProps:{textContent:e._s(e.item.artists[0].name)}}):e._e()],1)},c=[],u=(a("4160"),a("a9e3"),a("2b0e")),d=600;u["a"].directive("longpress",{bind:function(e,t,a){var i=t.value;if("function"===typeof i){var r=null,n=function(e){"click"===e.type&&0!==e.button||null===r&&(r=setTimeout((function(){return i(e)}),d))},s=function(){null!==r&&(clearTimeout(r),r=null)};["mousedown","touchstart"].forEach((function(t){return e.addEventListener(t,n)})),["click","mouseout","touchend","touchcancel"].forEach((function(t){return e.addEventListener(t,s)}))}else u["a"].$log.warn("Expect a function, got ".concat(i))}});var p=u["a"].extend({components:{},props:{item:Object,thumbHeight:Number,thumbWidth:Number,hideproviders:Boolean,hidelibrary:Boolean,onclickHandler:null},data:function(){return{touchMoving:!1,cancelled:!1}},computed:{isHiRes:function(){var e,t=Object(n["a"])(this.item.provider_ids);try{for(t.s();!(e=t.n()).done;){var a=e.value;if(a.quality>6)return a.details?a.details:7===a.quality?"44.1/48khz 24 bits":8===a.quality?"88.2/96khz 24 bits":9===a.quality?"176/192khz 24 bits":"+192kHz 24 bits"}}catch(i){t.e(i)}finally{t.f()}return""}},created:function(){},beforeDestroy:function(){this.cancelled=!0},mounted:function(){},methods:{itemClicked:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t="";if(1===e.media_type)t="/artists/"+e.item_id;else if(2===e.media_type)t="/albums/"+e.item_id;else{if(4!==e.media_type)return void this.$server.$emit("showPlayMenu",e);t="/playlists/"+e.item_id}this.$router.push({path:t,query:{provider:e.provider}})},menuClick:function(){this.cancelled||this.$server.$emit("showContextMenu",this.item)},toggleLibrary:function(e){var t=this;return Object(s["a"])(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return t.cancelled=!0,a.next=3,t.$server.toggleLibrary(e);case 3:t.cancelled=!1;case 4:case"end":return a.stop()}}),a)})))()}}}),m=p,h=a("2877"),v=a("6544"),f=a.n(v),g=a("b0af"),y=a("99d9"),A=a("ce7e"),b=a("adda"),k=a("3a2f"),w=Object(h["a"])(m,l,c,!1,null,null,null),I=w.exports;f()(w,{VCard:g["a"],VCardSubtitle:y["a"],VCardTitle:y["c"],VDivider:A["a"],VImg:b["a"],VTooltip:k["a"]});var x={components:{ListviewItem:o["a"],PanelviewItem:I},props:["mediatype","endpoint"],data:function(){return{items:[],viewMode:"list",search:"",sortDesc:!1,sortBy:"name",sortKeys:[{text:this.$t("sort_name"),value:"name"}]}},created:function(){this.endpoint.includes("playlists/")?(this.sortKeys.push({text:this.$t("sort_position"),value:"position"}),this.sortKeys.push({text:this.$t("sort_artist"),value:"artists[0].name"}),this.sortKeys.push({text:this.$t("sort_album"),value:"album.name"}),this.sortBy="position",this.viewMode="list"):this.endpoint.includes("tracks")?(this.sortKeys.push({text:this.$t("sort_artist"),value:"artists[0].name"}),this.sortKeys.push({text:this.$t("sort_album"),value:"album.name"}),this.viewMode="list"):this.endpoint.includes("albums")?(this.sortKeys.push({text:this.$t("sort_artist"),value:"artist.name"}),this.sortKeys.push({text:this.$t("sort_date"),value:"year"}),this.viewMode="panel"):this.viewMode="list";var e=localStorage.getItem("viewMode"+this.mediatype+this.endpoint);null!==e&&(this.viewMode=e),this.getItems(),this.$server.$on("refresh_listing",this.getItems)},computed:{thumbWidth:function(){return this.$store.isMobile?120:175},thumbHeight:function(){return 1.5*this.thumbWidth}},methods:{getItems:function(){var e=this;return Object(s["a"])(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,e.$server.getAllItems(e.endpoint,e.items);case 2:case"end":return t.stop()}}),t)})))()},toggleViewMode:function(){"panel"===this.viewMode?this.viewMode="list":this.viewMode="panel",localStorage.setItem("viewMode"+this.mediatype+this.endpoint,this.viewMode)},filteredItems:function(e,t){if(!t)return e;t=t.toLowerCase();var a,i=[],r=Object(n["a"])(e);try{for(r.s();!(a=r.n()).done;){var s=a.value;(s.name.toLowerCase().includes(t)||s.artist&&s.artist.name.toLowerCase().includes(t)||s.album&&s.album.name.toLowerCase().includes(t)||s.artists&&s.artists[0].name.toLowerCase().includes(t))&&i.push(s)}}catch(o){r.e(o)}finally{r.f()}return i}}},_=x,S=(a("a548"),a("40dc")),C=a("8336"),D=a("62ad"),P=a("a523"),R=a("c3774"),B=a("132d"),O=a("24c9"),M=a("8860"),E=a("da13"),H=a("e449"),F=a("0fd9b"),L=a("2fa4"),J=a("8654"),V=Object(h["a"])(_,i,r,!1,null,"764b0c8e",null);t["a"]=V.exports;f()(V,{VAppBar:S["a"],VBtn:C["a"],VCard:g["a"],VCol:D["a"],VContainer:P["a"],VDataIterator:R["a"],VIcon:B["a"],VLabel:O["a"],VList:M["a"],VListItem:E["a"],VMenu:H["a"],VRow:F["a"],VSpacer:L["a"],VTextField:J["a"]})},"26ea":function(e,t,a){e.exports=a.p+"img/demo_player.c079bd97.png"},2755:function(e,t,a){e.exports=a.p+"img/http_streamer.4c4e4880.png"},3232:function(e,t,a){e.exports=a.p+"img/homeassistant.29fe3282.png"},"3d05":function(e,t,a){e.exports=a.p+"img/webplayer.8e1a0da9.png"},"3fcf":function(e,t,a){},"49f8":function(e,t,a){var i={"./en.json":"edd4","./nl.json":"a625"};function r(e){var t=n(e);return a(t)}function n(e){if(!a.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=n,e.exports=r,r.id="49f8"},"4bfb":function(e,t,a){e.exports=a.p+"img/default_artist.7305b29c.png"},"4f9f":function(e,t,a){"use strict";var i=a("691f"),r=a.n(i);r.a},"56d7":function(e,t,a){"use strict";a.r(t);a("e623"),a("e379"),a("5dc8"),a("37e1");var i=a("2b0e"),r=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-app",[a("TopBar"),a("NavigationMenu"),a("v-main",[a("router-view",{key:e.$route.path,attrs:{app:""}})],1),a("PlayerOSD",{attrs:{showPlayerSelect:e.showPlayerSelect}}),a("ContextMenu"),a("PlayerSelect"),a("v-overlay",{attrs:{value:e.$store.loading}},[a("v-progress-circular",{attrs:{indeterminate:"",size:"64"}})],1)],1)},n=[],s=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-navigation-drawer",{attrs:{dark:"",app:"",clipped:"",temporary:""},model:{value:e.$store.showNavigationMenu,callback:function(t){e.$set(e.$store,"showNavigationMenu",t)},expression:"$store.showNavigationMenu"}},[a("v-list",[e._l(e.items,(function(t){return a("v-list-item",{key:t.title,on:{click:function(a){return e.$router.push(t.path)}}},[a("v-list-item-action",[a("v-icon",[e._v(e._s(t.icon))])],1),a("v-list-item-content",[a("v-list-item-title",[e._v(e._s(t.title))])],1)],1)})),a("v-btn",{attrs:{icon:""},on:{click:function(t){e.$store.showNavigationMenu=!e.$store.showNavigationMenu}}})],2)],1)},o=[],l=i["a"].extend({props:{},data:function(){return{items:[{title:this.$t("home"),icon:"home",path:"/"},{title:this.$t("artists"),icon:"person",path:"/artists"},{title:this.$t("albums"),icon:"album",path:"/albums"},{title:this.$t("tracks"),icon:"audiotrack",path:"/tracks"},{title:this.$t("playlists"),icon:"playlist_play",path:"/playlists"},{title:this.$t("radios"),icon:"radio",path:"/radios"},{title:this.$t("search"),icon:"search",path:"/search"},{title:this.$t("settings"),icon:"settings",path:"/config"}]}},mounted:function(){},methods:{}}),c=l,u=a("2877"),d=a("6544"),p=a.n(d),m=a("8336"),h=a("132d"),v=a("8860"),f=a("da13"),g=a("1800"),y=a("5d23"),A=a("f774"),b=Object(u["a"])(c,s,o,!1,null,null,null),k=b.exports;p()(b,{VBtn:m["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAction:g["a"],VListItemContent:y["a"],VListItemTitle:y["c"],VNavigationDrawer:A["a"]});var w=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-app-bar",{attrs:{app:"",flat:"",dense:"",dark:"",color:e.color}},[a("v-layout",[e.$store.topBarTransparent?e._e():a("div",{staticClass:"body-1",staticStyle:{position:"fixed",width:"100%","text-align":"center","vertical-align":"center","margin-top":"11px"}},[e._v(e._s(e.$store.windowtitle))]),a("v-btn",{staticStyle:{"margin-left":"-13px"},attrs:{icon:""},on:{click:function(t){e.$store.showNavigationMenu=!e.$store.showNavigationMenu}}},[a("v-icon",[e._v("menu")])],1),a("v-btn",{attrs:{icon:""},on:{click:function(t){return e.$router.go(-1)}}},[a("v-icon",[e._v("arrow_back")])],1),a("v-spacer"),e.$store.topBarContextItem?a("v-btn",{staticStyle:{"margin-right":"-23px"},attrs:{icon:""},on:{click:function(t){return e.$server.$emit("showContextMenu",e.$store.topBarContextItem)}}},[a("v-icon",[e._v("more_vert")])],1):e._e()],1)],1)},I=[],x=i["a"].extend({props:{},data:function(){return{}},computed:{color:function(){return this.$store.topBarTransparent?"transparent":"black"}},mounted:function(){},methods:{}}),_=x,S=a("40dc"),C=a("a722"),D=a("2fa4"),P=Object(u["a"])(_,w,I,!1,null,null,null),R=P.exports;p()(P,{VAppBar:S["a"],VBtn:m["a"],VIcon:h["a"],VLayout:C["a"],VSpacer:D["a"]});var B=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-dialog",{attrs:{"max-width":"500px"},on:{input:function(t){return e.$emit("input",t)}},model:{value:e.visible,callback:function(t){e.visible=t},expression:"visible"}},[a("v-card",[0===e.playlists.length?a("v-list",[a("v-subheader",{staticClass:"title"},[e._v(e._s(e.header))]),e.subheader?a("v-subheader",[e._v(e._s(e.subheader))]):e._e(),e._l(e.menuItems,(function(t){return a("div",{key:t.label},[a("v-list-item",{on:{click:function(a){return e.itemCommand(t.action)}}},[a("v-list-item-avatar",[a("v-icon",[e._v(e._s(t.icon))])],1),a("v-list-item-content",[a("v-list-item-title",[e._v(e._s(e.$t(t.label)))])],1)],1),a("v-divider")],1)}))],2):e._e(),e.playlists.length>0?a("v-list",[a("v-subheader",{staticClass:"title"},[e._v(e._s(e.header))]),e._l(e.playlists,(function(t,i){return a("listviewItem",{key:t.item_id,attrs:{item:t,totalitems:e.playlists.length,index:i,hideavatar:!1,hidetracknum:!0,hideproviders:!1,hidelibrary:!0,hidemenu:!0,onclickHandler:e.addToPlaylist}})}))],2):e._e()],1)],1)},O=[],M=(a("caad"),a("b0c0"),a("2532"),a("54f8")),E=(a("96cf"),a("c964")),H=a("d3cc"),F=i["a"].extend({components:{ListviewItem:H["a"]},props:{},watch:{},data:function(){return{visible:!1,menuItems:[],header:"",subheader:"",curItem:null,curPlaylist:null,playerQueueItems:[],playlists:[]}},mounted:function(){},created:function(){this.$server.$on("showContextMenu",this.showContextMenu),this.$server.$on("showPlayMenu",this.showPlayMenu)},computed:{},methods:{showContextMenu:function(e){if(this.playlists=[],e){this.curItem=e;var t=this.$store.topBarContextItem,a=[];e!==t&&a.push({label:"show_info",action:"info",icon:"info"}),0===e.in_library.length&&a.push({label:"add_library",action:"toggle_library",icon:"favorite_border"}),e.in_library.length>0&&a.push({label:"remove_library",action:"toggle_library",icon:"favorite"}),t&&4===t.media_type&&(this.curPlaylist=t,3===e.media_type&&t.is_editable&&a.push({label:"remove_playlist",action:"remove_playlist",icon:"remove_circle_outline"})),3===e.media_type&&a.push({label:"add_playlist",action:"add_playlist",icon:"add_circle_outline"}),this.menuItems=a,this.header=e.name,this.subheader="",this.visible=!0}},showPlayMenu:function(e){if(this.playlists=[],this.curItem=e,e){var t=[{label:"play_now",action:"play",icon:"play_circle_outline"},{label:"play_next",action:"next",icon:"queue_play_next"},{label:"add_queue",action:"add",icon:"playlist_add"}];this.menuItems=t,this.header=e.name,this.subheader="",this.visible=!0}},showPlaylistsMenu:function(){var e=this;return Object(E["a"])(regeneratorRuntime.mark((function t(){var a,i,r,n,s,o,l,c,u,d,p,m;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:a=[],i=Object(M["a"])(e.curItem.provider_ids);try{for(i.s();!(r=i.n()).done;)n=r.value,a.push(n.provider)}catch(h){i.e(h)}finally{i.f()}return t.next=5,e.$server.getData("library/playlists");case 5:s=t.sent,o=[],l=Object(M["a"])(s.items),t.prev=8,l.s();case 10:if((c=l.n()).done){t.next=33;break}if(u=c.value,!u.is_editable||e.curPlaylist&&u.item_id===e.curPlaylist.item_id){t.next=31;break}d=Object(M["a"])(u.provider_ids),t.prev=14,d.s();case 16:if((p=d.n()).done){t.next=23;break}if(m=p.value,!a.includes(m.provider)){t.next=21;break}return o.push(u),t.abrupt("break",23);case 21:t.next=16;break;case 23:t.next=28;break;case 25:t.prev=25,t.t0=t["catch"](14),d.e(t.t0);case 28:return t.prev=28,d.f(),t.finish(28);case 31:t.next=10;break;case 33:t.next=38;break;case 35:t.prev=35,t.t1=t["catch"](8),l.e(t.t1);case 38:return t.prev=38,l.f(),t.finish(38);case 41:e.playlists=o;case 42:case"end":return t.stop()}}),t,null,[[8,35,38,41],[14,25,28,31]])})))()},itemCommand:function(e){if("info"===e){var t="";1===this.curItem.media_type&&(t="artists"),2===this.curItem.media_type&&(t="albums"),3===this.curItem.media_type&&(t="tracks"),4===this.curItem.media_type&&(t="playlists"),5===this.curItem.media_type&&(t="radios"),this.$router.push({path:"/"+t+"/"+this.curItem.item_id,query:{provider:this.curItem.provider}}),this.visible=!1}else{if("playmenu"===e)return this.showPlayMenu(this.curItem);if("add_playlist"===e)return this.showPlaylistsMenu();"remove_playlist"===e?(this.removeFromPlaylist(this.curItem,this.curPlaylist.item_id,"playlist_remove"),this.visible=!1):"toggle_library"===e?(this.$server.toggleLibrary(this.curItem),this.visible=!1):(this.$server.playItem(this.curItem,e),this.visible=!1)}},addToPlaylist:function(e){var t=this,a="playlists/"+e.item_id+"/tracks";this.$server.putData(a,this.curItem).then((function(e){t.visible=!1}))},removeFromPlaylist:function(e,t){var a=this,i="playlists/"+t+"/tracks";this.$server.deleteData(i,e).then((function(e){a.$server.$emit("refresh_listing")}))}}}),L=F,J=a("b0af"),V=a("169a"),z=a("ce7e"),N=a("8270"),j=a("e0c7"),Y=Object(u["a"])(L,B,O,!1,null,null,null),T=Y.exports;p()(Y,{VCard:J["a"],VDialog:V["a"],VDivider:z["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAvatar:N["a"],VListItemContent:y["a"],VListItemTitle:y["c"],VSubheader:j["a"]});var U=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("v-footer",{staticStyle:{"background-color":"black"},attrs:{app:"",fixed:"",padless:"",light:"",elevation:"10"}},[e.$store.isMobile?e._e():i("v-card",{staticStyle:{"margin-top":"1px"},attrs:{dense:"",flat:"",light:"",subheader:"",tile:"",width:"100%",color:"#E0E0E0"}},[i("v-list-item",{attrs:{"two-line":""}},[e.curQueueItem?i("v-list-item-avatar",{attrs:{tile:""}},[i("img",{staticStyle:{border:"1px solid rgba(0,0,0,.54)"},attrs:{src:e.$server.getImageUrl(e.curQueueItem),"lazy-src":a("71db")}})]):i("v-list-item-avatar",[i("v-icon",[e._v("speaker")])],1),i("v-list-item-content",[e.curQueueItem?i("v-list-item-title",[e._v(" "+e._s(e.curQueueItem.name))]):e.$server.activePlayer?i("v-list-item-title",[e._v(" "+e._s(e.$server.activePlayer.name))]):e._e(),e.curQueueItem?i("v-list-item-subtitle",{staticStyle:{color:"primary"}},e._l(e.curQueueItem.artists,(function(t,a){return i("span",{key:a},[i("a",{on:{click:[function(a){return e.artistClick(t)},function(e){e.stopPropagation()}]}},[e._v(e._s(t.name))]),a+1<e.curQueueItem.artists.length?i("label",{key:a},[e._v(" / ")]):e._e()])})),0):e._e()],1),e.streamDetails?i("v-list-item-action",[i("v-menu",{attrs:{"close-on-content-click":!1,"nudge-width":250,"offset-x":"",top:""},nativeOn:{click:function(e){e.preventDefault()}},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on;return[i("v-btn",e._g({attrs:{icon:""}},r),[e.streamDetails.quality>6?i("v-img",{attrs:{contain:"",src:a("f5e3"),height:"30"}}):e._e(),e.streamDetails.quality<=6?i("v-img",{staticStyle:{filter:"invert(100%)"},attrs:{contain:"",src:e.streamDetails.content_type?a("9e01")("./"+e.streamDetails.content_type+".png"):"",height:"30"}}):e._e()],1)]}}],null,!1,872579316)},[e.streamDetails?i("v-list",[i("v-subheader",{staticClass:"title"},[e._v(e._s(e.$t("stream_details")))]),i("v-list-item",{attrs:{tile:"",dense:""}},[i("v-list-item-icon",[i("v-img",{attrs:{"max-width":"50",contain:"",src:e.streamDetails.provider?a("9e01")("./"+e.streamDetails.provider+".png"):""}})],1),i("v-list-item-content",[i("v-list-item-title",[e._v(e._s(e.streamDetails.provider))])],1)],1),i("v-divider"),i("v-list-item",{attrs:{tile:"",dense:""}},[i("v-list-item-icon",[i("v-img",{staticStyle:{filter:"invert(100%)"},attrs:{"max-width":"50",contain:"",src:e.streamDetails.content_type?a("9e01")("./"+e.streamDetails.content_type+".png"):""}})],1),i("v-list-item-content",[i("v-list-item-title",[e._v(e._s(e.streamDetails.sample_rate/1e3)+" kHz / "+e._s(e.streamDetails.bit_depth)+" bits ")])],1)],1),i("v-divider"),e.playerQueueDetails.crossfade_enabled?i("div",[i("v-list-item",{attrs:{tile:"",dense:""}},[i("v-list-item-icon",[i("v-img",{attrs:{"max-width":"50",contain:"",src:a("e7af")}})],1),i("v-list-item-content",[i("v-list-item-title",[e._v(e._s(e.$t("crossfade_enabled")))])],1)],1),i("v-divider")],1):e._e(),e.streamVolumeLevelAdjustment?i("div",[i("v-list-item",{attrs:{tile:"",dense:""}},[i("v-list-item-icon",[i("v-icon",{staticStyle:{"margin-left":"13px"},attrs:{color:"black"}},[e._v("volume_up")])],1),i("v-list-item-content",[i("v-list-item-title",{staticStyle:{"margin-left":"12px"}},[e._v(e._s(e.streamVolumeLevelAdjustment))])],1)],1),i("v-divider")],1):e._e()],1):e._e()],1)],1):e._e()],1),i("div",{staticClass:"body-2",staticStyle:{height:"30px",width:"100%",color:"rgba(0,0,0,.65)","margin-top":"-12px","background-color":"#E0E0E0"},attrs:{align:"center"}},[e.curQueueItem?i("div",{staticStyle:{height:"12px","margin-left":"22px","margin-right":"20px","margin-top":"2px"}},[i("span",{staticClass:"left"},[e._v(" "+e._s(e.playerCurTimeStr)+" ")]),i("span",{staticClass:"right"},[e._v(" "+e._s(e.playerTotalTimeStr)+" ")])]):e._e()]),e.curQueueItem?i("v-progress-linear",{style:"margin-top:-22px;margin-left:80px;width:"+e.progressBarWidth+"px;",attrs:{fixed:"",light:"",value:e.progress}}):e._e()],1),i("v-list-item",{staticStyle:{height:"62px","margin-bottom":"5px","margin-top":"-4px","background-color":"black"},attrs:{dark:"",dense:""}},[e.$server.activePlayer?i("v-list-item-action",{staticStyle:{"margin-top":"15px"}},[i("v-btn",{attrs:{small:"",icon:""},on:{click:function(t){return e.playerCommand("previous")}}},[i("v-icon",[e._v("skip_previous")])],1)],1):e._e(),e.$server.activePlayer?i("v-list-item-action",{staticStyle:{"margin-left":"-32px","margin-top":"15px"}},[i("v-btn",{attrs:{icon:"","x-large":""},on:{click:function(t){return e.playerCommand("play_pause")}}},[i("v-icon",{attrs:{size:"50"}},[e._v(e._s("playing"==e.$server.activePlayer.state?"pause":"play_arrow"))])],1)],1):e._e(),e.$server.activePlayer?i("v-list-item-action",{staticStyle:{"margin-top":"15px"}},[i("v-btn",{attrs:{icon:"",small:""},on:{click:function(t){return e.playerCommand("next")}}},[i("v-icon",[e._v("skip_next")])],1)],1):e._e(),i("v-list-item-content"),e.$server.activePlayer?i("v-list-item-action",{staticStyle:{padding:"16px"}},[i("v-btn",{attrs:{text:"",icon:""},on:{click:function(t){return e.$router.push("/playerqueue/")}}},[i("v-flex",{staticClass:"vertical-btn",attrs:{xs12:""}},[i("v-icon",[e._v("queue_music")]),i("span",{staticClass:"caption",staticStyle:{"padding-top":"5px"}},[e._v(e._s(e.$t("queue")))])],1)],1)],1):e._e(),e.$server.activePlayer&&!e.$store.isMobile?i("v-list-item-action",{staticStyle:{padding:"16px"}},[i("v-menu",{attrs:{"close-on-content-click":!1,"nudge-width":250,"offset-x":"",top:""},nativeOn:{click:function(e){e.preventDefault()}},scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[i("v-btn",e._g({attrs:{icon:""}},a),[i("v-flex",{staticClass:"vertical-btn",attrs:{xs12:""}},[i("v-icon",[e._v("volume_up")]),i("span",{staticClass:"caption",staticStyle:{"padding-top":"5px"}},[e._v(e._s(Math.round(e.$server.activePlayer.volume_level)))])],1)],1)]}}],null,!1,2163274026)},[i("VolumeControl",{attrs:{players:e.$server.players,player_id:e.$server.activePlayer.player_id}})],1)],1):e._e(),i("v-list-item-action",{staticStyle:{padding:"15px","margin-right":"15px"}},[i("v-btn",{attrs:{text:"",icon:""},on:{click:function(t){return e.$server.$emit("showPlayersMenu")}}},[i("v-flex",{staticClass:"vertical-btn",attrs:{xs12:""}},[i("v-icon",[e._v("speaker")]),e.$server.activePlayer?i("span",{staticClass:"caption",staticStyle:{"padding-top":"5px"}},[e._v(e._s(e.truncateString(e.$server.activePlayer.name,12)))]):i("span",{staticClass:"caption"})],1)],1)],1)],1),e.$store.isInStandaloneMode?i("v-card",{staticStyle:{height:"20px"},attrs:{dense:"",flat:"",light:"",subheader:"",tile:"",width:"100%",color:"black"}}):e._e()],1)},X=[],Q=(a("fb6a"),a("4fad"),a("d3b7"),a("ac1f"),a("25f0"),a("5319"),a("d0af")),K=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-card",[a("v-list",[a("v-list-item",{staticStyle:{height:"50px","padding-bottom":"5"}},[a("v-list-item-avatar",{staticStyle:{"margin-left":"-10px"},attrs:{tile:""}},[a("v-icon",{attrs:{large:""}},[e._v(e._s(e.players[e.player_id].is_group?"speaker_group":"speaker"))])],1),a("v-list-item-content",{staticStyle:{"margin-left":"-15px"}},[a("v-list-item-title",[e._v(e._s(e.players[e.player_id].name))]),a("v-list-item-subtitle",[e._v(e._s(e.$t("state."+e.players[e.player_id].state)))])],1)],1),a("v-divider"),e._l(e.volumePlayerIds,(function(t){return a("div",{key:t},[a("div",{staticClass:"body-2",style:e.players[t].powered?"color:rgba(0,0,0,.54);":"color:rgba(0,0,0,.38);"},[a("v-btn",{staticStyle:{"margin-left":"8px"},style:e.players[t].powered?"color:rgba(0,0,0,.54);":"color:rgba(0,0,0,.38);",attrs:{icon:""},on:{click:function(a){return e.togglePlayerPower(t)}}},[a("v-icon",[e._v("power_settings_new")])],1),a("span",{staticStyle:{"margin-left":"10px"}},[e._v(e._s(e.players[t].name))]),a("div",{staticStyle:{"margin-top":"-8px","margin-left":"15px","margin-right":"15px",height:"35px"}},[a("v-slider",{attrs:{lazy:"",disabled:!e.players[t].powered,value:Math.round(e.players[t].volume_level),"prepend-icon":"volume_down","append-icon":"volume_up"},on:{end:function(a){return e.setPlayerVolume(t,a)},"click:append":function(a){return e.setPlayerVolume(t,"up")},"click:prepend":function(a){return e.setPlayerVolume(t,"down")}}})],1)],1),a("v-divider")],1)}))],2)],1)},G=[],W=a("d0ff"),q=i["a"].extend({props:["value","players","player_id"],data:function(){return{}},computed:{volumePlayerIds:function(){var e=[this.player_id];return e.push.apply(e,Object(W["a"])(this.players[this.player_id].group_childs)),e}},mounted:function(){},methods:{setPlayerVolume:function(e,t){"up"===t?t=this.$server.players[e].volume_level+1:"down"===t&&(t=this.$server.players[e].volume_level-1),this.$server.playerCommand("volume_set",t,e),this.players[e].volume_level=t},togglePlayerPower:function(e){this.$server.playerCommand("power_toggle",null,e)}}}),Z=q,$=a("ba0d"),ee=Object(u["a"])(Z,K,G,!1,null,null,null),te=ee.exports;p()(ee,{VBtn:m["a"],VCard:J["a"],VDivider:z["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAvatar:N["a"],VListItemContent:y["a"],VListItemSubtitle:y["b"],VListItemTitle:y["c"],VSlider:$["a"]});var ae=i["a"].extend({components:{VolumeControl:te},props:[],data:function(){return{playerQueueDetails:{}}},watch:{},computed:{curQueueItem:function(){return this.playerQueueDetails?this.playerQueueDetails.cur_item:null},progress:function(){if(!this.curQueueItem)return 0;var e=this.curQueueItem.duration,t=this.playerQueueDetails.cur_item_time,a=t/e*100;return a},playerCurTimeStr:function(){if(!this.curQueueItem)return"0:00";var e=this.playerQueueDetails.cur_item_time;return e.toString().formatDuration()},playerTotalTimeStr:function(){if(!this.curQueueItem)return"0:00";var e=this.curQueueItem.duration;return e.toString().formatDuration()},progressBarWidth:function(){return window.innerWidth-160},streamDetails:function(){return this.playerQueueDetails.cur_item&&this.playerQueueDetails.cur_item&&this.playerQueueDetails.cur_item.streamdetails.provider&&this.playerQueueDetails.cur_item.streamdetails.content_type?this.playerQueueDetails.cur_item.streamdetails:{}},streamVolumeLevelAdjustment:function(){if(!this.streamDetails||!this.streamDetails.sox_options)return"";if(this.streamDetails.sox_options.includes("vol ")){var e=/(.*vol\s+)(.*)(\s+dB.*)/,t=this.streamDetails.sox_options.replace(e,"$2");return t+" dB"}return""}},created:function(){this.$server.$on("queue updated",this.queueUpdatedMsg),this.$server.$on("new player selected",this.getQueueDetails)},methods:{playerCommand:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.$server.playerCommand(e,t,this.$server.activePlayerId)},artistClick:function(e){var t="/artists/"+e.item_id;this.$router.push({path:t,query:{provider:e.provider}})},queueUpdatedMsg:function(e){var t=this.$server.players[this.$server.activePlayerId].active_queue;if(e.player_id===t)for(var a=0,r=Object.entries(e);a<r.length;a++){var n=Object(Q["a"])(r[a],2),s=n[0],o=n[1];i["a"].set(this.playerQueueDetails,s,o)}},getQueueDetails:function(){var e=this;return Object(E["a"])(regeneratorRuntime.mark((function t(){var a,i;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:if(!e.$server.activePlayer){t.next=6;break}return a=e.$server.players[e.$server.activePlayerId].active_queue,i="players/"+a+"/queue",t.next=5,e.$server.getData(i);case 5:e.playerQueueDetails=t.sent;case 6:case"end":return t.stop()}}),t)})))()},truncateString:function(e,t){return e.length<=t?e:e.slice(0,t)+"..."}}}),ie=ae,re=(a("df06"),a("0e8f")),ne=a("553a"),se=a("adda"),oe=a("34c3"),le=a("e449"),ce=a("8e36"),ue=Object(u["a"])(ie,U,X,!1,null,"66faf443",null),de=ue.exports;p()(ue,{VBtn:m["a"],VCard:J["a"],VDivider:z["a"],VFlex:re["a"],VFooter:ne["a"],VIcon:h["a"],VImg:se["a"],VList:v["a"],VListItem:f["a"],VListItemAction:g["a"],VListItemAvatar:N["a"],VListItemContent:y["a"],VListItemIcon:oe["a"],VListItemSubtitle:y["b"],VListItemTitle:y["c"],VMenu:le["a"],VProgressLinear:ce["a"],VSubheader:j["a"]});var pe=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-navigation-drawer",{attrs:{right:"",app:"",clipped:"",temporary:"",width:"300"},model:{value:e.visible,callback:function(t){e.visible=t},expression:"visible"}},[a("v-card-title",{staticClass:"headline"},[a("b",[e._v(e._s(e.$t("players")))])]),a("v-list",{attrs:{dense:""}},[a("v-divider"),e._l(e.filteredPlayerIds,(function(t){return a("div",{key:t,style:e.$server.activePlayerId==t?"background-color:rgba(50, 115, 220, 0.3);":""},[a("v-list-item",{staticStyle:{"margin-left":"-5px","margin-right":"-15px"},attrs:{ripple:"",dense:""},on:{click:function(a){return e.$server.switchPlayer(e.$server.players[t].player_id)}}},[a("v-list-item-avatar",{attrs:{tile:""}},[a("v-icon",{attrs:{size:"45"}},[e._v(e._s(e.$server.players[t].is_group_player?"speaker_group":"speaker"))])],1),a("v-list-item-content",{staticStyle:{"margin-left":"-15px"}},[a("v-list-item-title",{staticClass:"subtitle-1"},[e._v(e._s(e.$server.players[t].name))]),a("v-list-item-subtitle",{key:e.$server.players[t].state,staticClass:"body-2",staticStyle:{"font-weight":"normal"}},[e._v(" "+e._s(e.$t("state."+e.$server.players[t].state))+" ")])],1),e.$server.activePlayerId?a("v-list-item-action",{staticStyle:{"padding-right":"10px"}},[a("v-menu",{attrs:{"close-on-content-click":!1,"close-on-click":!0,"nudge-width":250,"offset-x":"",right:""},nativeOn:{click:[function(e){e.stopPropagation()},function(e){e.stopPropagation(),e.preventDefault()}]},scopedSlots:e._u([{key:"activator",fn:function(i){var r=i.on;return[a("v-btn",e._g({staticStyle:{color:"rgba(0,0,0,.54)"},attrs:{icon:""}},r),[a("v-flex",{staticClass:"vertical-btn",attrs:{xs12:""}},[a("v-icon",[e._v("volume_up")]),a("span",{staticClass:"overline"},[e._v(e._s(Math.round(e.$server.players[t].volume_level)))])],1)],1)]}}],null,!0)},[a("VolumeControl",{attrs:{players:e.$server.players,player_id:t}})],1)],1):e._e()],1),a("v-divider")],1)}))],2)],1)},me=[],he=i["a"].extend({components:{VolumeControl:te},watch:{},data:function(){return{filteredPlayerIds:[],visible:!1}},computed:{},created:function(){this.$server.$on("showPlayersMenu",this.show),this.$server.$on("players changed",this.getAvailablePlayers),this.getAvailablePlayers()},methods:{show:function(){this.visible=!0},getAvailablePlayers:function(){for(var e in this.filteredPlayerIds=[],this.$server.players)this.$server.players[e].available&&this.filteredPlayerIds.push(e)}}}),ve=he,fe=(a("4f9f"),a("99d9")),ge=Object(u["a"])(ve,pe,me,!1,null,"7c65a917",null),ye=ge.exports;p()(ge,{VBtn:m["a"],VCardTitle:fe["c"],VDivider:z["a"],VFlex:re["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAction:g["a"],VListItemAvatar:N["a"],VListItemContent:y["a"],VListItemSubtitle:y["b"],VListItemTitle:y["c"],VMenu:le["a"],VNavigationDrawer:A["a"]});var Ae=i["a"].extend({name:"App",components:{NavigationMenu:k,TopBar:R,ContextMenu:T,PlayerOSD:de,PlayerSelect:ye},data:function(){return{showPlayerSelect:!1}},created:function(){var e="",t=window.location;e=t.origin+t.pathname,this.$server.connect(e)}}),be=Ae,ke=(a("034f"),a("7496")),we=a("f6c4"),Ie=a("a797"),xe=a("490a"),_e=Object(u["a"])(be,r,n,!1,null,null,null),Se=_e.exports;p()(_e,{VApp:ke["a"],VMain:we["a"],VOverlay:Ie["a"],VProgressCircular:xe["a"]});var Ce=a("9483");Object(Ce["a"])("".concat("","service-worker.js"),{ready:function(){},registered:function(){},cached:function(){},updatefound:function(){},updated:function(){alert("New content is available; please refresh."),window.location.reload(!0)},offline:function(){alert("No internet connection found. App is running in offline mode.")},error:function(e){}});var De=a("f3f3"),Pe=a("8c4f"),Re=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("section",[a("v-list",{attrs:{tile:""}},e._l(e.items,(function(t){return a("v-list-item",{key:t.title,attrs:{tile:""},on:{click:function(a){return e.$router.push(t.path)}}},[a("v-list-item-icon",{staticStyle:{"margin-left":"15px"}},[a("v-icon",[e._v(e._s(t.icon))])],1),a("v-list-item-content",[a("v-list-item-title",{domProps:{textContent:e._s(t.title)}})],1)],1)})),1)],1)},Be=[],Oe={name:"home",data:function(){return{items:[{title:this.$t("artists"),icon:"person",path:"/artists"},{title:this.$t("albums"),icon:"album",path:"/albums"},{title:this.$t("tracks"),icon:"audiotrack",path:"/tracks"},{title:this.$t("playlists"),icon:"playlist_play",path:"/playlists"},{title:this.$t("search"),icon:"search",path:"/search"}]}},created:function(){this.$store.windowtitle=this.$t("musicassistant")}},Me=Oe,Ee=Object(u["a"])(Me,Re,Be,!1,null,null,null),He=Ee.exports;p()(Ee,{VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemContent:y["a"],VListItemIcon:oe["a"],VListItemTitle:y["c"]});var Fe=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("section",[a("ItemsListing",{attrs:{mediatype:e.mediatype,provider:e.provider,endpoint:"library/"+e.mediatype}})],1)},Le=[],Je=a("0dac"),Ve={name:"browse",components:{ItemsListing:Je["a"]},props:{mediatype:String,provider:String},data:function(){return{}},created:function(){this.$store.windowtitle=this.$t(this.mediatype)},computed:{},methods:{}},ze=Ve,Ne=Object(u["a"])(ze,Fe,Le,!1,null,null,null),je=Ne.exports;i["a"].use(Pe["a"]);var Ye=[{path:"/",name:"home",component:He},{path:"/config",name:"config",component:function(){return a.e("config").then(a.bind(null,"1071"))},props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}},{path:"/config/:configKey",name:"configKey",component:function(){return a.e("config").then(a.bind(null,"1071"))},props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}},{path:"/search",name:"search",component:function(){return Promise.all([a.e("itemdetails~playerqueue~search"),a.e("search")]).then(a.bind(null,"2d3b"))},props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}},{path:"/:media_type/:media_id",name:"itemdetails",component:function(){return Promise.all([a.e("itemdetails~playerqueue~search"),a.e("itemdetails")]).then(a.bind(null,"32a2"))},props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}},{path:"/playerqueue",name:"playerqueue",component:function(){return Promise.all([a.e("itemdetails~playerqueue~search"),a.e("playerqueue")]).then(a.bind(null,"b097"))},props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}},{path:"/:mediatype",name:"browse",component:je,props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}}],Te=new Pe["a"]({mode:"hash",routes:Ye}),Ue=Te,Xe=(a("4160"),a("466d"),a("1276"),a("159b"),a("ddb0"),a("a925"));function Qe(){var e=a("49f8"),t={};return e.keys().forEach((function(a){var i=a.match(/([A-Za-z0-9-_]+)\./i);if(i&&i.length>1){var r=i[1];t[r]=e(a)}})),t}i["a"].use(Xe["a"]);var Ke=new Xe["a"]({locale:navigator.language.split("-")[0],fallbackLocale:"en",messages:Qe()}),Ge=(a("d5e8"),a("d1e78"),a("e508")),We=(a("a899"),a("f309"));i["a"].use(We["a"]);var qe=new We["a"]({}),Ze=new i["a"]({data:function(){return{windowtitle:"Home",loading:!1,showNavigationMenu:!1,topBarTransparent:!1,topBarContextItem:null,isMobile:!1,isInStandaloneMode:!1}},created:function(){this.handleWindowOptions(),window.addEventListener("resize",this.handleWindowOptions)},destroyed:function(){window.removeEventListener("resize",this.handleWindowOptions)},methods:{handleWindowOptions:function(){this.isMobile=document.body.clientWidth<700,this.isInStandaloneMode=!0===window.navigator.standalone||window.matchMedia("(display-mode: standalone)").matches}}}),$e={globalStore:Ze,install:function(e,t){e.prototype.$store=Ze}},et=(a("99af"),a("a434"),a("8a79"),a("3ca3"),a("2b3d"),a("bc3a")),tt=a.n(et),at=a("3667"),it=a.n(at),rt={timeout:6e4},nt=tt.a.create(rt),st=new i["a"]({_address:"",_ws:null,data:function(){return{connected:!1,players:{},activePlayerId:null,syncStatus:[]}},methods:{connect:function(e){var t=this;return Object(E["a"])(regeneratorRuntime.mark((function a(){var i;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:e.endsWith("/")||(e+="/"),t._address=e,i=e.replace("http","ws")+"ws",t._ws=new WebSocket(i),t._ws.onopen=t._onWsConnect,t._ws.onmessage=t._onWsMessage,t._ws.onclose=t._onWsClose,t._ws.onerror=t._onWsError;case 8:case"end":return a.stop()}}),a)})))()},toggleLibrary:function(e){var t=this;return Object(E["a"])(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:if(0!==e.in_library.length){a.next=6;break}return a.next=3,t.putData("library",e);case 3:e.in_library=[e.provider],a.next=9;break;case 6:return a.next=8,t.deleteData("library",e);case 8:e.in_library=[];case 9:case"end":return a.stop()}}),a)})))()},getImageUrl:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"image",a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return e&&e.media_type?"database"===e.provider&&"image"===t?"".concat(this._address,"api/").concat(e.media_type,"/").concat(e.item_id,"/thumb?provider=").concat(e.provider,"&size=").concat(a):e.metadata&&e.metadata[t]?e.metadata[t]:e.album&&e.album.metadata&&e.album.metadata[t]?e.album.metadata[t]:e.artist&&e.artist.metadata&&e.artist.metadata[t]?e.artist.metadata[t]:e.album&&e.album.artist&&e.album.artist.metadata&&e.album.artist.metadata[t]?e.album.artist.metadata[t]:e.artists&&e.artists[0].metadata&&e.artists[0].metadata[t]?e.artists[0].metadata[t]:"fanart"===t?this.getImageUrl(e,"image",a):"":""},getData:function(e){var t=arguments,a=this;return Object(E["a"])(regeneratorRuntime.mark((function r(){var n,s,o;return regeneratorRuntime.wrap((function(r){while(1)switch(r.prev=r.next){case 0:return n=t.length>1&&void 0!==t[1]?t[1]:{},s=a._address+"api/"+e,r.next=4,nt.get(s,{params:n});case 4:return o=r.sent,i["a"].$log.debug("getData",e,o),r.abrupt("return",o.data);case 7:case"end":return r.stop()}}),r)})))()},postData:function(e,t){var a=this;return Object(E["a"])(regeneratorRuntime.mark((function r(){var n,s;return regeneratorRuntime.wrap((function(r){while(1)switch(r.prev=r.next){case 0:return n=a._address+"api/"+e,t=JSON.stringify(t),r.next=4,nt.post(n,t);case 4:return s=r.sent,i["a"].$log.debug("postData",e,s),r.abrupt("return",s.data);case 7:case"end":return r.stop()}}),r)})))()},putData:function(e,t){var a=this;return Object(E["a"])(regeneratorRuntime.mark((function r(){var n,s;return regeneratorRuntime.wrap((function(r){while(1)switch(r.prev=r.next){case 0:return n=a._address+"api/"+e,t=JSON.stringify(t),r.next=4,nt.put(n,t);case 4:return s=r.sent,i["a"].$log.debug("putData",e,s),r.abrupt("return",s.data);case 7:case"end":return r.stop()}}),r)})))()},deleteData:function(e,t){var a=this;return Object(E["a"])(regeneratorRuntime.mark((function r(){var n,s;return regeneratorRuntime.wrap((function(r){while(1)switch(r.prev=r.next){case 0:return n=a._address+"api/"+e,t=JSON.stringify(t),r.next=4,nt.delete(n,{data:t});case 4:return s=r.sent,i["a"].$log.debug("deleteData",e,s),r.abrupt("return",s.data);case 7:case"end":return r.stop()}}),r)})))()},getAllItems:function(e,t){var a=arguments,r=this;return Object(E["a"])(regeneratorRuntime.mark((function n(){var s,o,l,c;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:s=a.length>2&&void 0!==a[2]?a[2]:null,o=r._address+"api/"+e,s&&(l=new URLSearchParams(s),o+="?"+l.toString()),c=0,i["a"].$log.debug("getAllItems",o),it()(o).node("items.*",(function(e){i["a"].set(t,c,e),c+=1})).done((function(e){t.length>e.items.length&&t.splice(e.items.length)}));case 6:case"end":return n.stop()}}),n)})))()},playerCommand:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.activePlayerId,i="players/"+a+"/cmd/"+e;this.postData(i,t)},playItem:function(e,t){var a=this;return Object(E["a"])(regeneratorRuntime.mark((function i(){var r;return regeneratorRuntime.wrap((function(i){while(1)switch(i.prev=i.next){case 0:return a.$store.loading=!0,r="players/"+a.activePlayerId+"/play_media/"+t,i.next=4,a.postData(r,e);case 4:a.$store.loading=!1;case 5:case"end":return i.stop()}}),i)})))()},switchPlayer:function(e){e!==this.activePlayerId&&(this.activePlayerId=e,localStorage.setItem("activePlayerId",e),this.$emit("new player selected",e))},_onWsConnect:function(){var e=this;return Object(E["a"])(regeneratorRuntime.mark((function t(){var a,r,n,s;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return i["a"].$log.info("Connected to server "+e._address),e.connected=!0,t.next=4,e.getData("players");case 4:a=t.sent,r=Object(M["a"])(a);try{for(r.s();!(n=r.n()).done;)s=n.value,i["a"].set(e.players,s.player_id,s)}catch(o){r.e(o)}finally{r.f()}e._selectActivePlayer(),e.$emit("players changed");case 9:case"end":return t.stop()}}),t)})))()},_onWsMessage:function(e){var t=this;return Object(E["a"])(regeneratorRuntime.mark((function a(){var r;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:r=JSON.parse(e.data),"player changed"===r.message?i["a"].set(t.players,r.message_details.player_id,r.message_details):"player added"===r.message?(i["a"].set(t.players,r.message_details.player_id,r.message_details),t._selectActivePlayer(),t.$emit("players changed")):"player removed"===r.message?(i["a"].delete(t.players,r.message_details.player_id),t._selectActivePlayer(),t.$emit("players changed")):"music sync status"===r.message?t.syncStatus=r.message_details:t.$emit(r.message,r.message_details);case 2:case"end":return a.stop()}}),a)})))()},_onWsClose:function(e){this.connected=!1,i["a"].$log.error("Socket is closed. Reconnect will be attempted in 5 seconds.",e.reason),setTimeout(function(){this.connect(this._address)}.bind(this),5e3)},_onWsError:function(){this._ws.close()},_selectActivePlayer:function(){if(!this.activePlayer||!this.activePlayer.available){var e=localStorage.getItem("activePlayerId");if(e&&this.players[e]&&this.players[e].available)this.switchPlayer(e);else{for(var t in this.players)if("playing"===this.players[t].state&&this.players[t].available){this.switchPlayer(t);break}if(!this.activePlayer||!this.activePlayer.enabled)for(var a in this.players)if(this.players[a].available){this.switchPlayer(a);break}}}}},computed:{activePlayer:function(){return this.activePlayerId?this.players[this.activePlayerId]:null}}}),ot={server:st,install:function(e,t){e.prototype.$server=st}},lt=a("85ff"),ct=a.n(lt),ut=!0,dt={isEnabled:!0,logLevel:ut?"error":"debug",stringifyArguments:!1,showLogLevel:!0,showMethodName:!1,separator:"|",showConsoleColors:!0};i["a"].config.productionTip=!1,i["a"].use(ct.a,dt),i["a"].use(Ge["a"]),i["a"].use($e),i["a"].use(ot),String.prototype.formatDuration=function(){var e=parseInt(this,10),t=Math.floor(e/3600),a=Math.floor((e-3600*t)/60),i=e-3600*t-60*a;return t<10&&(t="0"+t),a<10&&(a="0"+a),i<10&&(i="0"+i),"00"===t?a+":"+i:t+":"+a+":"+i},new i["a"]({router:Ue,i18n:Ke,vuetify:qe,render:function(e){return e(Se)}}).$mount("#app")},"57d1":function(e,t){e.exports="data:image/png;base64,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"},"691f":function(e,t,a){},"71db":function(e,t,a){e.exports=a.p+"img/file.813f9dad.png"},"82f5":function(e,t,a){e.exports=a.p+"img/sonos.72e2fecb.png"},"85ec":function(e,t,a){},"94cc":function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJEAAABfCAYAAADoOiXnAAAMUElEQVR4nO2de5RVVR3HP4MSAwgIakqWiqIIkoHVivKxUksx6SE+kwg105VY+ShJzUdWmpWhaWpaLjNExSYN8YEPTNOFL0QFRRHTJYgi4AMUH8z47Y/fOeveObPP495z595zV/uz1ln3ztl7n9+eM985+7dfv9MiCY8nDz0aXQFP8+NF5MmNF5EnN15Entx4EXly40XkyY0XkSc3XkSe3HgReXLjReTJjReRJzdeRJ7ceBF5cuNF5MmNF5EnNxs2ugIVMgDYGxgDDAzOfQgsAe4BFgC1WiA1FNgX2AnoGVx3eWBnLtBeIzvDgH2AHYFewEfAMuBu4FFgfY3sdBstTbIorRX4KvCd4HNgJL0dWAzcANwILMphazBwIDARGAV8LJL+cmDnWuDJHHa2BA7GfqedMaGGKLAzA/gb8HQOO92PpKIfIyXdpeyslXSWpAEV2ukp6RhJyzLaeS+w07tCO70CO69ktPOOpFMltVZop25HwyuQchwo6c2MNzvKg5K2zWhnU0kzqrQzKyifxc4Wkm6u0k6bpIEZ7XgRBcehktqrudtlPCNpaIqdwZLm5rRzr6RNUuxsJWleTjt3KLtg/+9FtJekd1Nu6CpJV6fkkUwgg2Ls9JU0O8M1QmZJWhSTdqPim7b+ku6rwM7Nkp6PSWuTNb2N/hsVWkS9JD2Qfp81X9IQScsz5D0vxtaUDGVDFstENy0hz9kxds6qwM5Cmf/TlpBnSoydhhxFHCc6HNg1Q77HgReBSzLkPQH4YuTccOAUR97ngJWO81OAd0keFjkJ2CVybhhwoiPvImB15JyAnwLvp9g5BRt6KARFFNG4yM8COiLn3gGuCr7/EVgYfF+He/ymFTgscu4gYJAj753YH2gKpTGho4CbgvSke9YvyFvOOGx8K8pMYARwOjAHeAiYBNwepLck2BkEHJGQXl8a/SiMHIMlLY08utslnStpnKTDJR0saftIuWGS9pM50TtLusLRBDyizt3kWY48kvSBpC8n1PGGmHIhT0vauCz/bTH51kkak2BnZoqdeZL6JJSv29HwCkSOXSStd9yw/0raM+M1DpH0muMab6skvk0kPefIE/K0zBl2XX93WW/s9Ziya8vsDJb0YoKd+Yp3xvcK7KyKKbtK0jYxZet6FK056w1s4Dg/BHvk/xWbGnDRAkzFRpM3j7l23+B7X2DjhHqMACbHpP0H2BPYAWsS5zvqETZFaXZGAd+PSZsT2Nkea4oXJNhpKEUT0ft09X/KOQo4PyZtGuZAx1HuWwmbo0oiqR7hNVZi82nR8+Xf0+ykpQO8DrzqsFOIOauiTcCuAFYBWyTk2Sbm/IcZrw2wJsXOXcAFMWkTgaOxXtfHSX4ahHZcDjzALcT3Lo/EnOcdAzuFpWhPomVY1z2JO4PPjYH9saYH4BfAGwnlnqD03/w28HxMvhWYSOKeROOBPbAmM605WUn85OlS4JiEsocGdgotICieiMCeAnG8hXW1twHuB2YBj2FN3EuUBObinsjPc2Py3YR1yc8Nrn8d8C1KgvkgwYaLu2POt2FCPB+4NbDz9bL0Su00jkZ79o5jM9nosIvZsq68a6a9TdIZMeWeDa5bbmeo3D2stZI+dJy/Jig3PcZGefkdyuxsJ2m1I9+aGDtXBuVuSrHje2cJrAR+H5P2aeB6bC1OlAOA43E7qufQdRR6CXChI+9GdF7bEzIxON6LqVscLwB/cpzvF2PnaGydUaV2GkYRRQRwBfAHx/nBQP+YMi2Y/xD9nS4BpseUuRi4r4J6HYaNflfKVODhCvIfSvE6PbEUVUQAPwP+nPMa07G5qDjWAt/DVkVmYRDV/XHfxHpbL2XMPxD3eFkhKbKI1mPN06mkd99dXIg1De+n5HsBc2ifyHDNudj8XDUsCuw8kyHvwzSRY11kEYFNpv4Gm9WfQfqNFdYb2hs4mex+xWJssfy0hDyrMd8mzz1bCHwF+HtCnteAy3H7S4WkWdrdxzB/5LPAXtgyjs2xKZD12B/4eeABzMepZofESqzJuQUb5NuD0jTJPGxW/wW6LtyvlFcDO3cEdnYF+gRpj2Lifxkvom5BmJge60Yb7dgTrw2bs/oktoboqeATqnOso3Rg/tqMwM6WDjtxc4SFo5lEVE86gGeDo5z+wMga2mnHfKXoFqdBlEbiC0/RfaJ6kzaNcSK2qTGJHhmuk5Z+CrBVDezUBS+izoyn6wrIkCOxnmIaK0iewwMbBzooJu1YbJltGq9msFMXfHPWmRHY6PY44GbMYe8PfAP4Ltnu1wO412iXMxw4E9vdOhMTwwBs1H0i2f65H8QmkhuOF1Fnwpn7CcFRDTdmyBP2HicFR6Uoo5264Juz2vIvbIigu5lB8mqHuuJFVDveBs6rg53VdbKTGS+i2nESlU2yVsvp5ItGUnO8iDpTbZf5Akr74LJQ7eTqr8g/KV1zvIg6s6bC/ML+sD+psFylXfMO4IzgKB6NXhVXsKOnpGMlLYlfUChJ6pBtHty3SjsbSJqs5D1poZ1HlH3PXUOOZomUVm/6AmOxjQDDsbGiDmzrzgJsHfZc8ofC6wd8LbA1DNt80I4NWC7AensPUrvQft2CF1E6LZgP44oJ0B12PiLbXrTC4EXkyY13rD258SLy5KYoc2efA/bDfAHfvmanFduUWcmOlZpTFBHtis2ee6qjoSIqSnNW+KjxBabh3f+iiMjTxHgR1ZdXsG1J0YCfTU2ziOh32JLSydhuUhergOOAQ4C/1KFOi7HNla7t3nGcjK1cjIvC1pQ0i4g6sIVYlxIfqmUmcBm24s8VrbXW/BLbzLikgjJhIIrBta9O42gWEY2ltJnvmpg81wafW2O7TGuJ6Or8h1MTlSzrOA8LbhUX9URYDKal2CK3ppj+aBYRjcJ2voIt/IrGL1xKaS/9PnR9lRXYrtKzsddQ7Y+9IupyLCZ2lMexQA9XYZHOJgC7YUE/Q8K1Rz2DOk3GgmFNxMLfuARwG/YEiy6hFba1+ptYMPXhwOexDQMzHdcpFo1eRhAcx6UsiZAsNnWY/+JI2kVlaXMcZe9VKSBUi6QNy/Lvq65hfqcFaZ+StHXwvVX2wpmQCcH5zSX1c/xOpznq8cMg7fjI+Z+XldtR0mdUCoE81XGdcs502K7r0SxPIrAgDWEAzRsiaeHOh6HY6Hc5q4AfYGFdvoSFtnsSuBLbIDgbc3jLCQdhl2L+y2VY5P7tHfVagcUIuB74J/ZE6oGF67sj5rrlTeAyzNcDi2KyCAtr/ARwEZ1D8BWSooxYZ2FbrLm4CrvJz2D7xJ7CAi6AbTzsFyl3DbYduj/mCI8Kzo/A1u8cjK0POhmLxFbOEKw52SyhXiMxUYcBOg/AmqdLsb1rY1N+rw5KS0yWYkEjtgts/yilbCFopicRlHanvgv8I/h+NRZCZgPM34nyUPC5OyUBhYzGFqCtoWtQc7CA50kCAntCRiO8jg8+55G+BmlrSrthZwd13AeLQjInpWwhaDYR7UKpm3wb1lSFTupo3EEQwhhFGznS+lAaDqgmkFYcYbP7BtliJF0M/Br7/dqxPWW/xQRayThUQ2g2EW2CNWlgg31XY70usEFGV+ygMMaja5T4rbLzfR3pWXBtmX4t+OxHthAxvYHTsPhEc7EYj6ODtDPIFl2tYTSbiMDehwY2ch2G4mvFuu0udgs+76Nr83ArFn1tC8zprobpdHb012BOOMAXyBasaj3W7PXAmrMTKG1QXIet7S4szeRYh4zGnNmFlGawx2CvL3AxAeuJzcfeDfJjzGm9n1Jo4ImYb1IJ4bqnPtiY0v2Yb9SGLbIfQPZ3kp2D+U/jgU0xIU4N0jarom51pRlF1Bv4NrYTNGQS8U/V/thA3vHAv+kctqUXJqpzI2VCZzjJTwoHEydhzehFZWk7YL5M9G2PHZFPsMCk87GX5d0eyf+J4LpDEurRcJpRRGD/+cMoCWfvlPw7YWM2d2Fzb8uxZmMsXV+3CdaTuw530PWQE7ExnJHAzthTZAXmB43B/YqqI+j61GzFOgfzsLA0y4NrbItN37heu1UoirLb4zjcUec96ZxFg1eFNqNj7SkYRRFRUerRjDT83hXFJ1qHddnb8bs9KqEfpZDFDaMoPpGniWn4o9DT/HgReXLjReTJjReRJzdeRJ7ceBF5cuNF5MmNF5EnN15Entx4EXly40XkyY0XkSc3XkSe3HgReXLjReTJzf8A7VafuKusJ8IAAAAASUVORK5CYII="},"9a36":function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKEAAABtCAYAAADJewF5AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QwaCisvSBa6TQAACqJJREFUeNrtnXmQFdUVh787MGyirMqgBlDUEAKImkRRqUIxcbfcjcakFDFqlZrSBMtKlf5hSs2uRrOVVuKSGI27FFQlLiHG4AKKKxBBDYICIrtsAvPLH31eqn3Ou91vmHHmvT5fVRfy+p7T3dyft++5fe+54DiO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziO4ziOU3RCkR9eUm9gFDACmGjHeqAn8IUcLlYBa4DtwDpgMfAqsBxYCswPIcx3mbkIy4W3L3AEcLyJby+gsZ0utxpYBLwGPGr/vSCEsN6lV0ARSpoIXAEcBvTtqNsA3gRmAh8C04H/hBBWuQjrW3wDgB8ClwLdOuEtvmWinAk8CSwJIWx1EdaPAI8Ffmr9vh1twTZbX68bsAJ42/4cBAwF9gQ2ADsBO1u5hiqvsxmYBfwdmAa8FkLY7iKs3YDjGuAHrRDCCuCfwPvWh1sCLAPeA9aavy0hhA2p6/UCegHbgK7Wx9wLGAPsBuwBDDShDjXhZrERmAf8BXg8hLDAe4+1I8A+kqapetZKulnS3u14bz0l7SnpQElnSPqlpOclbcy4t48kPSzpBEk9vJY7twD7SXqiFQJ8VNLoDrrnIGmUpPMkTTXBxXhV0hRJw7zGO6cIH61SfEslndvJnmE/SedKuk3SLEmrIq3j7ZLGes13jorrJumPVQrwdUljOvlzBUnDJV0kaXqF1/bLroDOUVmXVCnAZyUNqbFnDJJG2Kv4aUnb7Vne8Oi44yunBzDXotE8vAicGEL4sA3vYXdgpEW9g4Emi4pL45KrbfhmpUXcy2y4Z3kI4aNWXK8rcDBwOTAohDDBRdixIrwM+FXO4i8BJ4QQlrVF343k89+ZwH42/FINa02cq7DvzMACG5b5AFiUZ9Ba0uAQwlJ/H3acAHtKuruKIZhRO3i9LhY0zDB/7cVqSS9KulXSoZJ6em13XhEekOobZXHzDl5rjAUHHcELkn4i6RhJu3rNdy4RXiupOUclbtyRSFjS+ZJWtKGomiVta6XtMkn3Sposaa96qMdQ4yKcA+QZJ5sNHBxCaK7SfyNwPTCllbe4iWR+4UILShaTfAZcTPJZrp8FM03AEAtmmuz3gSRzGmN1tAZ4MIRwYS3XY9ca/59oY85yT7ZCgN2B3wCTWnFfzwD3ADOAxSGELdUMxZB8h+5tQvwScKAdY/n0d+e+JFPTnA5sCf+d8xV2Vit8/64Vr8onJR3Tjs87TNKpkv4gaa5dc6EroTZEeESVfsfl7GuWeFvSBZ/zszdK+oakSa6E2hDhkVX6vb8KAf7VBqudgvYJ20PYhwAn5ix+C3Bltf3NsuuNtP5e/0i/dxkwN4TwjouwGFxNstoui5nA91sR8OwETACOA8ZbVNwnh+lKSfMt6JlHMsl2GfB+COFjr7Y6eR1L6iHptRz+1lQ7hUrSzpIuTQUUbcFKSY95S9ix9Gpjf3uSTMXP4rYQwitVCPBI4OfAAW18v/2BfWpdhA01fv9/Aprb0F9TpG9WYhvwQBUC/DrwWDsIsMQWF2HH8jTJSrgs8q5Yy7N+4wWSqWN5BDgCuItk4NmpUxH2BrrkKDcgp7/uOcpMzznFqhG4lWR+oVPHIlxJsv43izNz+tspR4v6Qk5fk4CjXGJ1LsIQwlzrb2UxQVJTjnKbMs6vADIDElv3fKXLqxgtIcAjOYKTQcDhOXy9A8TG3NbakcV4ktnWThFEGEJ4FngoR9HTc5RZYEcses7TxzvbpVWslhDgqRxlJma9kkMIn2SIsDfJgqYs9nBpFU+E91t/LcZA4PwcvuZFznUhySXjuAg/04KtIVn+mNU3/F6OAGUa8XHFPDNmNru0itcSEkK4z4KUrAAla6r+S8DUyPmxNvs5xnMurYJiq+82ZHz035A1+cCWWW6tYP++Jd6M2X9R0sef00q8mk8D0lBPIgwhzCHJ5xejF3CdpNizPw88EXkdZw1+LyDJcegUtDUcYtm2sjgtw8/pGenZembYT/aWsNhCPC9H5b0Xm5ZvcwtnR+yvyriHpkhaNxdhQYT4SI4KvD3DxwRJn0RSdeybYf97F2GxRbi3pA8yKnCbJVeP+bkmYv9Qhu0+NvvZRVhgIZ6ZI1fNf2O5Cm1pZaUMsNslnZFxD1e5CF2Iv86ZNLMp4mOwpAWR3DCjI7YDJL3hIiy2CPtkBBglZkjaOeLnEEmLKti+JKlbxHa0BUIuwgILcZSk5Tkq9DHLQVPJz0GS1lWwvSlHkLPURVhsIR6WY7+QPBHzBRHbm2Kf9CRNlLTeRVhsIZ5lQytZ3Bv7omIJKytxt+3wVMn2bElbXITFFuJ4CyayeNAWK1Xy87OI7Z0ZLeK32vDbsouwRoU4LhJkpHk4I+C4MWJ7Y4YQT26jvNcuwhoW4khJ89qgRbwo8oq/R9LAiO2xbSBEF2GNC3GYpOdyCrFrxM8BET+vSzo0YvvVnK2yi7COhThA0gM5hdgz4qefpH9EEihdErHd33b7dBEWWIiNkq7PuZXDmIifwZJezkioObSCbX9Jt7gIXYyTc4zjrZf07Ur9REmDJP05Yr9c0jmVhoAknVRl+ri3av3fPbj0PiOCo4HYlgyNJJkabgwhvBrx8x3gpBZOdSdZCHVxCGFlBdu+wBXAl3Pc8rshhClec47jOP46dtqzexBIEnc2AOtDCJtdhMUVw/HA/iQL458JITxXhW1fklRxPUgyvd4RQliVYbM7cCxwMjDObOeRrGl+IITwL6+VYgmwt6R3UhHpHNvsO6/9WWUR7YUZ5YdLejMSEa+TdIrXTLFEeEILQhhXhf3UMtu/RYZoGmxe4//XsUg62o6rUzO8P5Z0uNdOcUT4UGqFXWm7sd/mtN039X24NAa5pdIG4LancekaU8u/0tjXlVKWiRdzpCRx6kCAw1Mimmzfgkv72Q3IYX+llV9kA9GlibU/qlD+mVRLNzIi1POtn+oUQIRTUhMRGiTdkHpVnp1h29VaK0m603571v7+hu3u9KkAxlb/lUTrO265ANUo6RUTxWWp1+Em++3xDPtDU4vnjysTtSQdVVZ+mKQPUyJs9FpwER5lglgiaZfU73fb72tjWRgk/bi0J7GkXSXtIunE1PT+O8vKD00tyFqYkbTJKYgI7zBBbLQZNLMlzSqb/3dRBdtdJL1rZTZJmm92K8rWLA9O2XS3vqasfJcKvi+XNNOO0V5T9SvAXVMpPLbYa3WbHekciLNbEouk01JlNtqcwpX2uv0odW5Smd119vtWSd9swe/u5qvk19MX17EIL7aK/kTSqZb4cqQdI1LDNlsljW/B/r6USA+0KV4Dbd7gcEmL7fwTLbySl9i5pZIOL/UNbafQaSkBX+s1Vb8C7GoDypI0o0KZU1Ji+EXZuSHWWm2XdE4F+1tSrdnYsnMHpV7L22zY5q6y2df3xhbqO7UvwjGpyv5uhTK7pTIqfJBOIZIaG2yW1L+C/ddMYJJ0QwvnR1ifryWmS+pTL//ePtreskD6k+xX0gzMCSFsqlBuFFCKmmeVNl6UtB/JlhXNwMu2P0q5bQPJ9rPdgdUhhHktlOkHfIVkd6geJDNpFgJPhRDWeU05juM4juM4juM4juM4juM4juM4juM4juM4juM4juM4juPUC/8DLSVc5VaBblAAAAAASUVORK5CYII="},"9ad3":function(e,t){e.exports="data:image/png;base64,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"},"9e01":function(e,t,a){var i={"./aac.png":"9a36","./chromecast.png":"57d1","./crossfade.png":"e7af","./default_artist.png":"4bfb","./demo_player.png":"26ea","./file.png":"71db","./flac.png":"fb30","./hires.png":"f5e3","./homeassistant.png":"3232","./http_streamer.png":"2755","./logo.png":"cf05","./mp3.png":"f1d4","./ogg.png":"9ad3","./qobuz.png":"0863","./sonos.png":"82f5","./spotify.png":"0c3b","./squeezebox.png":"bd18","./tunein.png":"e428","./vorbis.png":"94cc","./web.png":"edbf","./webplayer.png":"3d05"};function r(e){var t=n(e);return a(t)}function n(e){if(!a.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=n,e.exports=r,r.id="9e01"},a471:function(e,t,a){},a548:function(e,t,a){"use strict";var i=a("a471"),r=a.n(i);r.a},a625:function(e){e.exports=JSON.parse('{"musicassistant":"Music Assistant","home":"Home","artists":"Artiesten","albums":"Albums","tracks":"Nummers","playlists":"Afspeellijsten","playlist_tracks":"Nummers in afspeellijst","radios":"Radio","search":"Zoeken","settings":"Instellingen","queue":"Wachtrij","artist_toptracks":"Top nummers","artist_albums":"Albums","album_tracks":"Album liedjes","album_versions":"Versies","track_versions":"Versies","type_to_search":"Type hier om te zoeken...","add_library":"Voeg toe aan bibliotheek","remove_library":"Verwijder uit bibliotheek","add_playlist":"Aan playlist toevoegen...","remove_playlist":"Verwijder uit playlist","no_player":"Geen speler geselecteerd","reboot_required":"Je moet de server opnieuw starten om de nieuwe instellingen actief te maken!","sort_name":"Sorteer op naam","sort_artist":"Sorteer op artiest","sort_album":"Sorteer op album","sort_date":"Sorteer op datum","sort_default":"Standaard sortering","items":"item(s)","conf":{"enabled":"Ingeschakeld","base":"Algemene instellingen","providers":"Providers / Plugins","player_settings":"Speler instellingen","homeassistant":"Home Assistant integratie","web":"Webserver","http_streamer":"Ingebouwde (sox gebaseerde) streamer","qobuz":"Qobuz","spotify":"Spotify","tunein":"TuneIn","file":"Bestandssysteem","chromecast":"Chromecast","squeezebox":"Squeezebox ondersteuning","sonos":"Sonos","webplayer":"Web Player (alleen Chrome browser)","username":"Gebruikersnaam","password":"Wachtwoord","hostname":"Hostnaam (of IP)","port":"Poort","hass_url":"URL naar homeassistant (b.v. https://homeassistant:8123)","hass_token":"Token met lange levensduur","hass_publish_players":"Publiceer spelers naar Home Assistant","hass_power_entities":"Entities die gebruikt mogen worden als aan/uit Control voor spelers.","hass_volume_entities":"Entities die gebruikt mogen worden als volume Control voor spelers.","web_ssl_cert":"Pad naar ssl certificaat bestand","web_ssl_key":"Pad naar ssl certificaat key bestand","player_enabled":"Speler inschakelen","player_name":"Aangepaste naam voor deze speler","file_prov_music_path":"Pad naar muziek bestanden","file_prov_playlists_path":"Pad naar playlist bestanden (.m3u)","web_http_port":"HTTP poort","web_https_port":"HTTPS poort","cert_fqdn_host":"Hostname (FQDN van certificaat)","enable_r128_volume_normalisation":"Schakel R128 volume normalisatie in","target_volume_lufs":"Doelvolume (R128 standaard is -23 LUFS)","fallback_gain_correct":"Fallback gain correctie indien R128 meting (nog) niet beschikbaar is","enable_audio_cache":"Sta het cachen van audio toe naar temp map","trim_silence":"Strip stilte van begin en eind van audio (in temp bestanden)","http_streamer_sox_effects":"Eigen sox effects toepassen op audio (alleen voor ingebouwde streamer). Zie http://sox.sourceforge.net/sox.html#EFFECTS","max_sample_rate":"Maximale sample rate welke deze speler ondersteund, hoger wordt gedownsampled.","force_http_streamer":"Forceer het gebruik van de ingebouwde streamer, ook al heeft de speler directe ondersteuning voor de muziek provider","not_grouped":"Niet gegroepeerd","conf_saved":"Configuratie is opgeslagen, herstart om actief te maken","audio_cache_folder":"Map om te gebruiken voor cache bestanden","audio_cache_max_size_gb":"Maximale grootte van de cache map in GB.","gapless_enabled":"Schakel ondersteuning voor gapless in.","crossfade_duration":"Crossfade (in seconden, 0 om uit te schakelen).","power_control":"Verbind Power Control met speler.","volume_control":"Verbind Volume Control met speler."},"players":"Spelers","play":"Afspelen","play_on":"Afspelen op:","play_now":"Nu afspelen","play_next":"Speel als volgende af","add_queue":"Voeg toe aan wachtrij","queue_clear":"Wachtrij leegmaken","show_info":"Bekijk informatie","queue_next_tracks":"Aankomend","queue_previous_tracks":"Afgespeeld","queue_move_up":"Verplaats omhoog","queue_move_down":"Verplaats omlaag","queue_options":"Wachtrij opties","enable_repeat":"Repeat inschakelen","disable_repeat":"Repeat uitschakelen","enable_shuffle":"Shuffle inschakelen","disable_shuffle":"Shuffle uitschakelen","read_more":"meer lezen","stream_details":"Streamdetails","crossfade_enabled":"Crossfade ingeschakeld","state":{"playing":"afspelen","stopped":"gestopt","paused":"gepauzeerd","off":"uitgeschakeld"}}')},bd18:function(e,t,a){e.exports=a.p+"img/squeezebox.60631223.png"},cf05:function(e,t,a){e.exports=a.p+"img/logo.c079bd97.png"},d3cc:function(e,t,a){"use strict";var i=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",[i("v-list-item",{directives:[{name:"longpress",rawName:"v-longpress",value:e.menuClick,expression:"menuClick"}],attrs:{ripple:""},on:{click:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:void(e.onclickHandler?e.onclickHandler(e.item):e.itemClicked(e.item))},contextmenu:[e.menuClick,function(e){e.preventDefault()}]}},[e.hideavatar?e._e():i("v-list-item-avatar",{attrs:{tile:"",color:"grey"}},[i("img",{staticStyle:{border:"1px solid rgba(0,0,0,.22)"},attrs:{src:e.$server.getImageUrl(e.item,"image",80),"lazy-src":a("71db")}})]),i("v-list-item-content",[i("v-list-item-title",[e._v(" "+e._s(e.item.name)+" "),e.item.version?i("span",[e._v("("+e._s(e.item.version)+")")]):e._e()]),e.item.artists?i("v-list-item-subtitle",[e._l(e.item.artists,(function(t,a){return i("span",{key:t.item_id},[i("a",{on:{click:[function(a){return e.itemClicked(t)},function(e){e.stopPropagation()}]}},[e._v(e._s(t.name))]),a+1<e.item.artists.length?i("label",{key:a},[e._v("/")]):e._e()])})),e.item.album&&e.hidetracknum?i("a",{staticStyle:{color:"grey"},on:{click:[function(t){return e.itemClicked(e.item.album)},function(e){e.stopPropagation()}]}},[e._v(" - "+e._s(e.item.album.name))]):e._e(),!e.hidetracknum&&e.item.track_number?i("label",{staticStyle:{color:"grey"}},[e._v("- disc "+e._s(e.item.disc_number)+" track "+e._s(e.item.track_number))]):e._e()],2):e._e(),e.item.artist?i("v-list-item-subtitle",[i("a",{on:{click:[function(t){return e.itemClicked(e.item.artist)},function(e){e.stopPropagation()}]}},[e._v(e._s(e.item.artist.name))])]):e._e(),e.item.owner?i("v-list-item-subtitle",[e._v(e._s(e.item.owner))]):e._e()],1),e.hideproviders?e._e():i("v-list-item-action",[i("ProviderIcons",{attrs:{providerIds:e.item.provider_ids,height:20}})],1),e.isHiRes?i("v-list-item-action",[i("v-tooltip",{attrs:{bottom:""},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on;return[i("img",e._g({attrs:{src:a("f5e3"),height:"20"}},r))]}}],null,!1,2747613229)},[i("span",[e._v(e._s(e.isHiRes))])])],1):e._e(),e.hidelibrary?e._e():i("v-list-item-action",[i("v-tooltip",{attrs:{bottom:""},scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[i("v-btn",e._g({attrs:{icon:"",ripple:""},on:{click:[function(t){return e.toggleLibrary(e.item)},function(e){e.preventDefault()},function(e){e.stopPropagation()}]}},a),[e.item.in_library.length>0?i("v-icon",{attrs:{height:"20"}},[e._v("favorite")]):e._e(),0==e.item.in_library.length?i("v-icon",{attrs:{height:"20"}},[e._v("favorite_border")]):e._e()],1)]}}],null,!1,113966118)},[e.item.in_library.length>0?i("span",[e._v(e._s(e.$t("remove_library")))]):e._e(),0==e.item.in_library.length?i("span",[e._v(e._s(e.$t("add_library")))]):e._e()])],1),!e.hideduration&&e.item.duration?i("v-list-item-action",[e._v(e._s(e.item.duration.toString().formatDuration()))]):e._e(),e.hidemenu?e._e():i("v-icon",{staticStyle:{"margin-right":"-10px","padding-left":"10px"},attrs:{color:"grey lighten-1"},on:{click:[function(t){return e.menuClick(e.item)},function(e){e.stopPropagation()}]}},[e._v("more_vert")])],1),i("v-divider")],1)},r=[],n=(a("4160"),a("a9e3"),a("96cf"),a("c964")),s=a("54f8"),o=a("2b0e"),l=a("e00a"),c=600;o["a"].directive("longpress",{bind:function(e,t,a){var i=t.value;if("function"===typeof i){var r=null,n=function(e){"click"===e.type&&0!==e.button||null===r&&(r=setTimeout((function(){return i(e)}),c))},s=function(){null!==r&&(clearTimeout(r),r=null)};["mousedown","touchstart"].forEach((function(t){return e.addEventListener(t,n)})),["click","mouseout","touchend","touchcancel"].forEach((function(t){return e.addEventListener(t,s)}))}else o["a"].$log.warn("Expect a function, got ".concat(i))}});var u=o["a"].extend({components:{ProviderIcons:l["a"]},props:{item:Object,index:Number,totalitems:Number,hideavatar:Boolean,hidetracknum:Boolean,hideproviders:Boolean,hidemenu:Boolean,hidelibrary:Boolean,hideduration:Boolean,onclickHandler:null},data:function(){return{touchMoving:!1,cancelled:!1}},computed:{isHiRes:function(){var e,t=Object(s["a"])(this.item.provider_ids);try{for(t.s();!(e=t.n()).done;){var a=e.value;if(a.quality>6)return a.details?a.details:7===a.quality?"44.1/48khz 24 bits":8===a.quality?"88.2/96khz 24 bits":9===a.quality?"176/192khz 24 bits":"+192kHz 24 bits"}}catch(i){t.e(i)}finally{t.f()}return""}},created:function(){},beforeDestroy:function(){this.cancelled=!0},mounted:function(){},methods:{itemClicked:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t="";if(1===e.media_type)t="/artists/"+e.item_id;else if(2===e.media_type)t="/albums/"+e.item_id;else{if(4!==e.media_type)return void this.$server.$emit("showPlayMenu",e);t="/playlists/"+e.item_id}this.$router.push({path:t,query:{provider:e.provider}})},menuClick:function(){this.cancelled||this.$server.$emit("showContextMenu",this.item)},toggleLibrary:function(e){var t=this;return Object(n["a"])(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return t.cancelled=!0,a.next=3,t.$server.toggleLibrary(e);case 3:t.cancelled=!1;case 4:case"end":return a.stop()}}),a)})))()}}}),d=u,p=a("2877"),m=a("6544"),h=a.n(m),v=a("8336"),f=a("ce7e"),g=a("132d"),y=a("da13"),A=a("1800"),b=a("8270"),k=a("5d23"),w=a("3a2f"),I=Object(p["a"])(d,i,r,!1,null,null,null);t["a"]=I.exports;h()(I,{VBtn:v["a"],VDivider:f["a"],VIcon:g["a"],VListItem:y["a"],VListItemAction:A["a"],VListItemAvatar:b["a"],VListItemContent:k["a"],VListItemSubtitle:k["b"],VListItemTitle:k["c"],VTooltip:w["a"]})},df06:function(e,t,a){"use strict";var i=a("3fcf"),r=a.n(i);r.a},e00a:function(e,t,a){"use strict";var i=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",e._l(e.uniqueProviders,(function(t){return i("img",{key:t.provider,staticStyle:{"margin-right":"6px","margin-top":"6px"},attrs:{height:e.height,src:a("9e01")("./"+t.provider+".png")}})})),0)},r=[],n=(a("4160"),a("c975"),a("a9e3"),a("159b"),a("2b0e")),s=n["a"].extend({props:{providerIds:Array,height:Number},data:function(){return{isHiRes:!1}},computed:{uniqueProviders:function(){var e=[],t=[];return this.providerIds?(this.providerIds.forEach((function(a){var i=a.provider;-1===t.indexOf(i)&&(t.push(i),e.push(a))})),e):[]}},mounted:function(){},methods:{}}),o=s,l=a("2877"),c=Object(l["a"])(o,i,r,!1,null,null,null);t["a"]=c.exports},e428:function(e,t,a){e.exports=a.p+"img/tunein.ca1c1bb0.png"},e7af:function(e,t){e.exports="data:image/png;base64,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"},edbf:function(e,t,a){e.exports=a.p+"img/web.798ba28f.png"},edd4:function(e){e.exports=JSON.parse('{"musicassistant":"Music Assistant","home":"Home","artists":"Artists","albums":"Albums","tracks":"Tracks","playlists":"Playlists","playlist_tracks":"Playlist tracks","radios":"Radio","search":"Search","settings":"Settings","queue":"Queue","artist_toptracks":"Top tracks","artist_albums":"Albums","album_tracks":"Album tracks","album_versions":"Versions","track_versions":"Versions","type_to_search":"Type here to search...","add_library":"Add to library","remove_library":"Remove from library","add_playlist":"Add to playlist...","remove_playlist":"Remove from playlist","no_player":"No player selected","reboot_required":"A reboot is required to activate the new settings!","sort_name":"Sort by name","sort_artist":"Sort by artist name","sort_album":"Sort by album name","sort_date":"Sort by date","sort_default":"Default sorting","items":"item(s)","conf":{"enabled":"Enabled","base":"Generic settings","providers":"Providers / Plugins","player_settings":"Player settings","homeassistant":"Home Assistant integration","web":"Webserver","http_streamer":"Built-in (sox based) streamer","qobuz":"Qobuz","spotify":"Spotify","tunein":"TuneIn","file":"Filesystem","chromecast":"Chromecast","squeezebox":"Squeezebox support","sonos":"Sonos","webplayer":"Web Player (Chrome browser only)","username":"Username","password":"Password","hostname":"Hostname (or IP)","port":"Port","hass_url":"URL to homeassistant (e.g. https://homeassistant:8123)","hass_token":"Long Lived Access Token","hass_publish_players":"Publish players to Home Assistant","hass_power_entities":"Enable entities to be used as Power Control for players.","hass_volume_entities":"Enable entities to be used as Volume Control for players.","web_ssl_cert":"Path to ssl certificate file","web_ssl_key":"Path to ssl keyfile","player_enabled":"Enable player","player_name":"Custom name for this player","file_prov_playlists_path":"Path to playlists (.m3u)","web_http_port":"HTTP port","web_https_port":"HTTPS port","cert_fqdn_host":"FQDN of hostname in certificate","enable_r128_volume_normalisation":"Enable R128 volume normalization","target_volume_lufs":"Target volume (R128 default is -23 LUFS)","fallback_gain_correct":"Fallback gain correction if R128 readings not (yet) available","enable_audio_cache":"Allow caching of audio to temp files","trim_silence":"Strip silence from beginning and end of audio (temp files only!)","http_streamer_sox_effects":"Custom sox effects to apply to audio (built-in streamer only!) See http://sox.sourceforge.net/sox.html#EFFECTS","max_sample_rate":"Maximum sample rate this player supports, higher will be downsampled","force_http_streamer":"Force use of built-in streamer, even if the player can handle the music provider directly","not_grouped":"Not grouped","conf_saved":"Configuration saved, restart app to make effective","audio_cache_folder":"Directory to use for cache files","audio_cache_max_size_gb":"Maximum size of the cache folder (GB)","gapless_enabled":"Enable gapless support","crossfade_duration":"Crossfade duration (in seconds, 0 to disable)","power_control":"Attach Power Control to player.","volume_control":"Attach Volume Control to player."},"players":"Players","play":"Play","play_on":"Play on:","play_now":"Play Now","play_next":"Play Next","add_queue":"Add to Queue","queue_clear":"Clear queue","show_info":"Show info","queue_next_tracks":"Next","queue_previous_tracks":"Played","queue_move_up":"Move up","queue_move_down":"Move down","queue_options":"Queue options","enable_repeat":"Enable repeat","disable_repeat":"Disable repeat","enable_shuffle":"Enable shuffle","disable_shuffle":"Disable shuffle","read_more":"read more","stream_details":"Streamdetails","crossfade_enabled":"Crossfade enabled","state":{"playing":"playing","stopped":"stopped","paused":"paused","off":"off"}}')},f1d4:function(e,t){e.exports="data:image/png;base64,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"},f5e3:function(e,t,a){e.exports=a.p+"img/hires.eabcf7ae.png"},fb30:function(e,t){e.exports="data:image/png;base64,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"}});
+//# sourceMappingURL=app.413e2e3d.js.map
\ No newline at end of file
diff --git a/music_assistant/web/js/app.413e2e3d.js.map b/music_assistant/web/js/app.413e2e3d.js.map
new file mode 100644 (file)
index 0000000..1204b1c
--- /dev/null
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?0f16","webpack:///./src/assets/qobuz.png","webpack:///./src/assets/spotify.png","webpack:///./src/components/ItemsListing.vue?8d1e","webpack:///./src/components/PanelviewItem.vue?cf5a","webpack:///src/components/PanelviewItem.vue","webpack:///./src/components/PanelviewItem.vue?2434","webpack:///./src/components/PanelviewItem.vue","webpack:///src/components/ItemsListing.vue","webpack:///./src/components/ItemsListing.vue?0bf5","webpack:///./src/components/ItemsListing.vue?3a42","webpack:///./src/assets/demo_player.png","webpack:///./src/assets/http_streamer.png","webpack:///./src/assets/homeassistant.png","webpack:///./src/assets/webplayer.png","webpack:///./src/locales sync [A-Za-z0-9-_,\\s]+\\.json$/","webpack:///./src/assets/default_artist.png","webpack:///./src/components/PlayerSelect.vue?82ac","webpack:///./src/App.vue?5077","webpack:///./src/components/NavigationMenu.vue?9860","webpack:///src/components/NavigationMenu.vue","webpack:///./src/components/NavigationMenu.vue?878f","webpack:///./src/components/NavigationMenu.vue","webpack:///./src/components/TopBar.vue?c899","webpack:///src/components/TopBar.vue","webpack:///./src/components/TopBar.vue?6b44","webpack:///./src/components/TopBar.vue","webpack:///./src/components/ContextMenu.vue?8c48","webpack:///src/components/ContextMenu.vue","webpack:///./src/components/ContextMenu.vue?8e1a","webpack:///./src/components/ContextMenu.vue","webpack:///./src/components/PlayerOSD.vue?9501","webpack:///./src/components/VolumeControl.vue?71ad","webpack:///src/components/VolumeControl.vue","webpack:///./src/components/VolumeControl.vue?2966","webpack:///./src/components/VolumeControl.vue","webpack:///src/components/PlayerOSD.vue","webpack:///./src/components/PlayerOSD.vue?50d9","webpack:///./src/components/PlayerOSD.vue?dd97","webpack:///./src/components/PlayerSelect.vue?d1a9","webpack:///src/components/PlayerSelect.vue","webpack:///./src/components/PlayerSelect.vue?63dc","webpack:///./src/components/PlayerSelect.vue?ba31","webpack:///src/App.vue","webpack:///./src/App.vue?3359","webpack:///./src/App.vue?2d25","webpack:///./src/registerServiceWorker.js","webpack:///./src/views/Home.vue?3267","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?f458","webpack:///./src/views/Home.vue","webpack:///./src/views/Browse.vue?9280","webpack:///src/views/Browse.vue","webpack:///./src/views/Browse.vue?68e7","webpack:///./src/views/Browse.vue","webpack:///./src/router/index.js","webpack:///./src/i18n.js","webpack:///./src/plugins/vuetify.js","webpack:///./src/plugins/store.js","webpack:///./src/plugins/server.js","webpack:///./src/main.js","webpack:///./src/assets/chromecast.png","webpack:///./src/assets/file.png","webpack:///./src/assets/sonos.png","webpack:///./src/assets/vorbis.png","webpack:///./src/assets/aac.png","webpack:///./src/assets/ogg.png","webpack:///./src/assets sync ^\\.\\/.*\\.png$","webpack:///./src/components/ItemsListing.vue?2279","webpack:///./src/assets/squeezebox.png","webpack:///./src/assets/logo.png","webpack:///./src/components/ListviewItem.vue?1742","webpack:///src/components/ListviewItem.vue","webpack:///./src/components/ListviewItem.vue?0071","webpack:///./src/components/ListviewItem.vue","webpack:///./src/components/PlayerOSD.vue?22e7","webpack:///./src/components/ProviderIcons.vue?3616","webpack:///src/components/ProviderIcons.vue","webpack:///./src/components/ProviderIcons.vue?8a80","webpack:///./src/components/ProviderIcons.vue","webpack:///./src/assets/tunein.png","webpack:///./src/assets/crossfade.png","webpack:///./src/assets/web.png","webpack:///./src/assets/mp3.png","webpack:///./src/assets/hires.png","webpack:///./src/assets/flac.png"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","jsonpArray","window","oldJsonpFunction","slice","render","_vm","this","_h","$createElement","_c","_self","staticStyle","attrs","_v","_s","items","$t","scopedSlots","_u","fn","ref","on","_g","_l","item","domProps","text","$event","sortBy","sortDesc","_e","model","callback","$$v","search","expression","toggleViewMode","viewMode","filteredItems","props","item_id","thumbWidth","thumbHeight","staticClass","media_type","$store","isMobile","staticRenderFns","directives","rawName","indexOf","_k","keyCode","button","onclickHandler","itemClicked","menuClick","preventDefault","$server","getImageUrl","isHiRes","class","artist","artists","pressTimer","components","Number","hideproviders","Boolean","hidelibrary","touchMoving","cancelled","computed","created","beforeDestroy","mounted","methods","mediaItem","url","$emit","$router","component","VCard","VCardSubtitle","VCardTitle","VDivider","VImg","VTooltip","ListviewItem","PanelviewItem","sortKeys","endpoint","includes","getItems","$on","localStorage","setItem","mediatype","toLowerCase","newLst","VAppBar","VBtn","VCol","VContainer","VDataIterator","VIcon","VLabel","VList","VListItem","VMenu","VRow","VSpacer","VTextField","map","webpackContext","req","id","webpackContextResolve","keys","$route","path","showPlayerSelect","loading","$set","title","icon","showNavigationMenu","VListItemAction","VListItemContent","VListItemTitle","VNavigationDrawer","color","topBarTransparent","windowtitle","go","topBarContextItem","VLayout","visible","playlists","header","subheader","label","itemCommand","action","index","addToPlaylist","watch","menuItems","curItem","curPlaylist","playerQueueItems","showContextMenu","showPlayMenu","curBrowseContext","in_library","is_editable","cmd","query","showPlaylistsMenu","removeFromPlaylist","toggleLibrary","playItem","putData","deleteData","track","VDialog","VListItemAvatar","VSubheader","curQueueItem","activePlayer","artistindex","artistClick","stopPropagation","nativeOn","streamDetails","quality","content_type","provider","sample_rate","bit_depth","playerQueueDetails","streamVolumeLevelAdjustment","playerCurTimeStr","playerTotalTimeStr","style","progressBarWidth","progress","playerCommand","state","Math","round","volume_level","players","player_id","truncateString","is_group","child_id","powered","togglePlayerPower","setPlayerVolume","volumePlayerIds","allIds","newVolume","playerId","VListItemSubtitle","VSlider","VolumeControl","cur_item","totalSecs","duration","curSecs","cur_item_time","curPercent","toString","formatDuration","innerWidth","streamdetails","sox_options","re","volLevel","replace","queueUpdatedMsg","getQueueDetails","cmd_opt","activePlayerId","queueId","str","num","VFlex","VFooter","VListItemIcon","VProgressLinear","switchPlayer","is_group_player","filteredPlayerIds","show","getAvailablePlayers","available","NavigationMenu","TopBar","ContextMenu","PlayerOSD","PlayerSelect","serverAddress","loc","origin","pathname","connect","VApp","VMain","VOverlay","VProgressCircular","register","process","ready","registered","cached","updatefound","updated","alert","location","reload","offline","ItemsListing","String","Vue","use","VueRouter","routes","Home","route","params","Browse","router","loadLocaleMessages","locales","require","messages","forEach","matched","match","locale","VueI18n","navigator","language","split","fallbackLocale","Vuetify","globalStore","isInStandaloneMode","handleWindowOptions","addEventListener","destroyed","removeEventListener","body","clientWidth","standalone","matchMedia","matches","install","options","axiosConfig","_axios","axios","server","_address","_ws","connected","syncStatus","endsWith","wsAddress","WebSocket","onopen","_onWsConnect","onmessage","_onWsMessage","onclose","_onWsClose","_onWsError","imageType","size","metadata","album","getData","$log","debug","postData","JSON","stringify","post","put","dataObj","delete","getAllItems","list","urlParams","URLSearchParams","oboe","node","set","done","fullList","queueOpt","newPlayerId","info","player","_selectActivePlayer","msg","parse","message_details","reason","close","lastPlayerId","getItem","enabled","isProduction","loggerOptions","isEnabled","logLevel","stringifyArguments","showLogLevel","showMethodName","separator","showConsoleColors","config","productionTip","VueLogger","VueVirtualScroller","store","secNum","parseInt","hours","floor","minutes","seconds","i18n","vuetify","h","App","$mount","hideavatar","version","hidetracknum","track_number","disc_number","owner","provider_ids","hideduration","hidemenu","ProviderIcons","totalitems","prov","height","providerIds","Array","uniqueProviders","output"],"mappings":"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","file":"js/app.413e2e3d.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({\"config\":\"config\",\"itemdetails~playerqueue~search\":\"itemdetails~playerqueue~search\",\"itemdetails\":\"itemdetails\",\"playerqueue\":\"playerqueue\",\"search\":\"search\"}[chunkId]||chunkId) + \".\" + {\"config\":\"165ed655\",\"itemdetails~playerqueue~search\":\"3c623cdf\",\"itemdetails\":\"79b5fa05\",\"playerqueue\":\"84a8618a\",\"search\":\"31a9bea8\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"config\":1,\"itemdetails~playerqueue~search\":1,\"itemdetails\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({\"config\":\"config\",\"itemdetails~playerqueue~search\":\"itemdetails~playerqueue~search\",\"itemdetails\":\"itemdetails\",\"playerqueue\":\"playerqueue\",\"search\":\"search\"}[chunkId]||chunkId) + \".\" + {\"config\":\"2956469c\",\"itemdetails~playerqueue~search\":\"133d2876\",\"itemdetails\":\"28909c9e\",\"playerqueue\":\"31d6cfe0\",\"search\":\"31d6cfe0\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"","module.exports = __webpack_public_path__ + \"img/qobuz.c7eb9a76.png\";","module.exports = __webpack_public_path__ + \"img/spotify.1f3fb1af.png\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[_c('v-app-bar',{staticStyle:{\"margin-bottom\":\"-8px\"},attrs:{\"flat\":\"\",\"light\":\"\",\"dense\":\"\",\"color\":\"transparent\"}},[_c('v-label',{attrs:{\"light\":\"\"}},[_vm._v(_vm._s(_vm.items.length + \" \" + _vm.$t(\"items\")))]),_c('v-spacer'),_c('v-menu',{attrs:{\"left\":\"\",\"close-on-content-click\":false},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"}},on),[_c('v-icon',[_vm._v(\"sort\")])],1)]}}])},[_c('v-list',_vm._l((_vm.sortKeys),function(item){return _c('v-list-item',{key:item.value,domProps:{\"textContent\":_vm._s(item.text)},on:{\"click\":function($event){_vm.sortBy = item.value}}})}),1)],1),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){_vm.sortDesc = !_vm.sortDesc}}},[(!_vm.sortDesc)?_c('v-icon',[_vm._v(\"arrow_upward\")]):_vm._e(),(_vm.sortDesc)?_c('v-icon',[_vm._v(\"arrow_downward\")]):_vm._e()],1),_c('v-menu',{attrs:{\"left\":\"\",\"close-on-content-click\":false},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"}},on),[_c('v-icon',[_vm._v(\"search\")])],1)]}}])},[_c('v-card',[_c('v-text-field',{attrs:{\"clearable\":\"\",\"prepend-inner-icon\":\"search\",\"label\":\"Search\",\"hide-details\":\"\",\"solo\":\"\",\"dense\":\"\"},model:{value:(_vm.search),callback:function ($$v) {_vm.search=$$v},expression:\"search\"}})],1)],1),_c('v-btn',{staticStyle:{\"margin-right\":\"-15px\"},attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.toggleViewMode()}}},[(_vm.viewMode == 'panel')?_c('v-icon',[_vm._v(\"view_list\")]):_vm._e(),(_vm.viewMode == 'list')?_c('v-icon',[_vm._v(\"grid_on\")]):_vm._e()],1)],1),_c('v-data-iterator',{attrs:{\"items\":_vm.items,\"search\":_vm.search,\"sort-by\":_vm.sortBy,\"sort-desc\":_vm.sortDesc,\"custom-filter\":_vm.filteredItems,\"hide-default-footer\":\"\",\"disable-pagination\":\"\",\"loading\":\"\"},scopedSlots:_vm._u([{key:\"default\",fn:function(props){return [(_vm.viewMode == 'panel')?_c('v-container',{attrs:{\"fluid\":\"\"}},[_c('v-row',{attrs:{\"dense\":\"\",\"align-content\":\"stretch\",\"align\":\"stretch\"}},_vm._l((props.items),function(item){return _c('v-col',{key:item.item_id,attrs:{\"align-self\":\"stretch\"}},[_c('PanelviewItem',{attrs:{\"item\":item,\"thumbWidth\":_vm.thumbWidth,\"thumbHeight\":_vm.thumbHeight}})],1)}),1)],1):_vm._e(),(_vm.viewMode == 'list')?_c('v-list',{attrs:{\"two-line\":\"\"}},[_c('RecycleScroller',{staticClass:\"scroller\",attrs:{\"items\":props.items,\"item-size\":72,\"key-field\":\"item_id\",\"page-mode\":\"\"},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar item = ref.item;\nreturn [_c('ListviewItem',{attrs:{\"item\":item,\"hideavatar\":item.media_type == 3 ? _vm.$store.isMobile : false,\"hidetracknum\":true,\"hideproviders\":item.media_type < 4 ? _vm.$store.isMobile : false,\"hidelibrary\":true,\"hidemenu\":item.media_type == 3 ? _vm.$store.isMobile : false,\"hideduration\":item.media_type == 5}})]}}],null,true)})],1):_vm._e()]}}])})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',{directives:[{name:\"longpress\",rawName:\"v-longpress\",value:(_vm.menuClick),expression:\"menuClick\"}],attrs:{\"light\":\"\",\"min-height\":_vm.thumbHeight,\"min-width\":_vm.thumbWidth,\"max-width\":_vm.thumbWidth*1.6,\"hover\":\"\",\"outlined\":\"\"},on:{\"click\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"left\",37,$event.key,[\"Left\",\"ArrowLeft\"])){ return null; }if('button' in $event && $event.button !== 0){ return null; }_vm.onclickHandler ? _vm.onclickHandler(_vm.item) : _vm.itemClicked(_vm.item)},\"contextmenu\":[_vm.menuClick,function($event){$event.preventDefault();}]}},[_c('v-img',{attrs:{\"src\":_vm.$server.getImageUrl(_vm.item, 'image', _vm.thumbWidth),\"width\":\"100%\",\"aspect-ratio\":\"1\"}}),(_vm.isHiRes)?_c('div',{staticStyle:{\"position\":\"absolute\",\"margin-left\":\"5px\",\"margin-top\":\"-13px\",\"height\":\"30px\",\"background-color\":\"white\",\"border-radius\":\"3px\"}},[_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('img',_vm._g({attrs:{\"src\":require('../assets/hires.png'),\"height\":\"25\"}},on))]}}],null,false,1400808392)},[_c('span',[_vm._v(_vm._s(_vm.isHiRes))])])],1):_vm._e(),_c('v-divider'),_c('v-card-title',{class:_vm.$store.isMobile ? 'body-2' : 'title',staticStyle:{\"padding\":\"8px\",\"color\":\"primary\",\"margin-top\":\"8px\"},domProps:{\"textContent\":_vm._s(_vm.item.name)}}),(_vm.item.artist)?_c('v-card-subtitle',{class:_vm.$store.isMobile ? 'caption' : 'body-1',staticStyle:{\"padding\":\"8px\"},domProps:{\"textContent\":_vm._s(_vm.item.artist.name)}}):_vm._e(),(_vm.item.artists)?_c('v-card-subtitle',{class:_vm.$store.isMobile ? 'caption' : 'body-1',staticStyle:{\"padding\":\"8px\"},domProps:{\"textContent\":_vm._s(_vm.item.artists[0].name)}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <v-card\n    light\n    :min-height=\"thumbHeight\"\n    :min-width=\"thumbWidth\"\n    :max-width=\"thumbWidth*1.6\"\n    hover\n    outlined\n    @click.left=\"onclickHandler ? onclickHandler(item) : itemClicked(item)\"\n    @contextmenu=\"menuClick\"\n    @contextmenu.prevent\n    v-longpress=\"menuClick\"\n  >\n    <v-img\n      :src=\"$server.getImageUrl(item, 'image', thumbWidth)\"\n      width=\"100%\"\n      aspect-ratio=\"1\"\n    >\n    </v-img>\n    <div v-if=\"isHiRes\" style=\"position:absolute;margin-left:5px;margin-top:-13px;height:30px;background-color: white;border-radius: 3px;\">\n    <v-tooltip bottom>\n          <template v-slot:activator=\"{ on }\">\n          <img :src=\"require('../assets/hires.png')\" height=\"25\" v-on=\"on\" />\n          </template>\n          <span>{{ isHiRes }}</span>\n        </v-tooltip>\n    </div>\n    <v-divider />\n    <v-card-title\n      :class=\"$store.isMobile ? 'body-2' : 'title'\"\n      v-text=\"item.name\"\n      style=\"padding: 8px;color: primary;margin-top:8px\"\n    />\n    <v-card-subtitle\n      :class=\"$store.isMobile ? 'caption' : 'body-1'\"\n      v-text=\"item.artist.name\"\n      v-if=\"item.artist\"\n      style=\"padding: 8px\"\n    />\n    <v-card-subtitle\n      :class=\"$store.isMobile ? 'caption' : 'body-1'\"\n      v-text=\"item.artists[0].name\"\n      v-if=\"item.artists\"\n      style=\"padding: 8px\"\n    />\n  </v-card>\n</template>\n\n<script>\nimport Vue from 'vue'\n\nconst PRESS_TIMEOUT = 600\n\nVue.directive('longpress', {\n  bind: function (el, { value }, vNode) {\n    if (typeof value !== 'function') {\n      Vue.$log.warn(`Expect a function, got ${value}`)\n      return\n    }\n    let pressTimer = null\n    const start = e => {\n      if (e.type === 'click' && e.button !== 0) {\n        return\n      }\n      if (pressTimer === null) {\n        pressTimer = setTimeout(() => value(e), PRESS_TIMEOUT)\n      }\n    }\n    const cancel = () => {\n      if (pressTimer !== null) {\n        clearTimeout(pressTimer)\n        pressTimer = null\n      }\n    }\n    ;['mousedown', 'touchstart'].forEach(e => el.addEventListener(e, start))\n    ;['click', 'mouseout', 'touchend', 'touchcancel'].forEach(e => el.addEventListener(e, cancel))\n  }\n})\n\nexport default Vue.extend({\n  components: {\n  },\n  props: {\n    item: Object,\n    thumbHeight: Number,\n    thumbWidth: Number,\n    hideproviders: Boolean,\n    hidelibrary: Boolean,\n    onclickHandler: null\n  },\n  data () {\n    return {\n      touchMoving: false,\n      cancelled: false\n    }\n  },\n  computed: {\n    isHiRes () {\n      for (var prov of this.item.provider_ids) {\n        if (prov.quality > 6) {\n          if (prov.details) {\n            return prov.details\n          } else if (prov.quality === 7) {\n            return '44.1/48khz 24 bits'\n          } else if (prov.quality === 8) {\n            return '88.2/96khz 24 bits'\n          } else if (prov.quality === 9) {\n            return '176/192khz 24 bits'\n          } else {\n            return '+192kHz 24 bits'\n          }\n        }\n      }\n      return ''\n    }\n  },\n  created () { },\n  beforeDestroy () {\n    this.cancelled = true\n  },\n  mounted () { },\n  methods: {\n    itemClicked (mediaItem = null) {\n      // mediaItem in the list is clicked\n      let url = ''\n      if (mediaItem.media_type === 1) {\n        url = '/artists/' + mediaItem.item_id\n      } else if (mediaItem.media_type === 2) {\n        url = '/albums/' + mediaItem.item_id\n      } else if (mediaItem.media_type === 4) {\n        url = '/playlists/' + mediaItem.item_id\n      } else {\n        // assume track (or radio) item\n        this.$server.$emit('showPlayMenu', mediaItem)\n        return\n      }\n      this.$router.push({ path: url, query: { provider: mediaItem.provider } })\n    },\n    menuClick () {\n      // contextmenu button clicked\n      if (this.cancelled) return\n      this.$server.$emit('showContextMenu', this.item)\n    },\n    async toggleLibrary (mediaItem) {\n      // library button clicked on item\n      this.cancelled = true\n      await this.$server.toggleLibrary(mediaItem)\n      this.cancelled = false\n    }\n  }\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PanelviewItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PanelviewItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PanelviewItem.vue?vue&type=template&id=e92cc4a4&\"\nimport script from \"./PanelviewItem.vue?vue&type=script&lang=js&\"\nexport * from \"./PanelviewItem.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardSubtitle } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VCard,VCardSubtitle,VCardTitle,VDivider,VImg,VTooltip})\n","<template>\n  <section>\n    <v-app-bar\n      flat\n      light\n      dense\n      color=\"transparent\"\n      style=\"margin-bottom:-8px;\"\n    >\n      <v-label light>{{ items.length + \" \" + $t(\"items\") }}</v-label>\n      <v-spacer></v-spacer>\n      <v-menu left :close-on-content-click=\"false\">\n        <template v-slot:activator=\"{ on }\">\n          <v-btn icon v-on=\"on\">\n            <v-icon>sort</v-icon>\n          </v-btn>\n        </template>\n        <v-list>\n          <v-list-item\n            v-for=\"item of sortKeys\"\n            :key=\"item.value\"\n            v-text=\"item.text\"\n            @click=\"sortBy = item.value\"\n          >\n          </v-list-item>\n        </v-list>\n      </v-menu>\n      <v-btn icon @click=\"sortDesc = !sortDesc\">\n        <v-icon v-if=\"!sortDesc\">arrow_upward</v-icon>\n        <v-icon v-if=\"sortDesc\">arrow_downward</v-icon>\n      </v-btn>\n      <v-menu left :close-on-content-click=\"false\">\n        <template v-slot:activator=\"{ on }\">\n          <v-btn icon v-on=\"on\">\n            <v-icon>search</v-icon>\n          </v-btn>\n        </template>\n        <v-card>\n          <v-text-field\n            v-model=\"search\"\n            clearable\n            prepend-inner-icon=\"search\"\n            label=\"Search\"\n            hide-details\n            solo\n            dense\n          ></v-text-field>\n        </v-card>\n      </v-menu>\n      <v-btn icon @click=\"toggleViewMode()\" style=\"margin-right:-15px;\">\n        <v-icon v-if=\"viewMode == 'panel'\">view_list</v-icon>\n        <v-icon v-if=\"viewMode == 'list'\">grid_on</v-icon>\n      </v-btn>\n    </v-app-bar>\n    <v-data-iterator\n      :items=\"items\"\n      :search=\"search\"\n      :sort-by=\"sortBy\"\n      :sort-desc=\"sortDesc\"\n      :custom-filter=\"filteredItems\"\n      hide-default-footer\n      disable-pagination\n      loading\n    >\n      <template v-slot:default=\"props\">\n        <v-container fluid v-if=\"viewMode == 'panel'\">\n          <v-row dense align-content=\"stretch\" align=\"stretch\">\n            <v-col\n              v-for=\"item in props.items\"\n              :key=\"item.item_id\"\n              align-self=\"stretch\"\n            >\n              <PanelviewItem\n                :item=\"item\"\n                :thumbWidth=\"thumbWidth\"\n                :thumbHeight=\"thumbHeight\"\n              />\n            </v-col>\n          </v-row>\n        </v-container>\n        <v-list two-line v-if=\"viewMode == 'list'\">\n          <RecycleScroller\n            class=\"scroller\"\n            :items=\"props.items\"\n            :item-size=\"72\"\n            key-field=\"item_id\"\n            v-slot=\"{ item }\"\n            page-mode\n          >\n            <ListviewItem\n              v-bind:item=\"item\"\n              :hideavatar=\"item.media_type == 3 ? $store.isMobile : false\"\n              :hidetracknum=\"true\"\n              :hideproviders=\"item.media_type < 4 ? $store.isMobile : false\"\n              :hidelibrary=\"true\"\n              :hidemenu=\"item.media_type == 3 ? $store.isMobile : false\"\n              :hideduration=\"item.media_type == 5\"\n            ></ListviewItem>\n          </RecycleScroller>\n        </v-list>\n      </template>\n    </v-data-iterator>\n  </section>\n</template>\n\n<style scoped>\n.scroller {\n  height: 100%;\n}\n</style>\n\n<script>\n// @ is an alias to /src\nimport ListviewItem from '@/components/ListviewItem.vue'\nimport PanelviewItem from '@/components/PanelviewItem.vue'\n\nexport default {\n  components: {\n    ListviewItem,\n    PanelviewItem\n  },\n  props: [\n    'mediatype',\n    'endpoint'\n  ],\n  data () {\n    return {\n      items: [],\n      viewMode: 'list',\n      search: '',\n      sortDesc: false,\n      sortBy: 'name',\n      sortKeys: [{ text: this.$t('sort_name'), value: 'name' }]\n    }\n  },\n  created () {\n    if (this.endpoint.includes('playlists/')) {\n      // playlist tracks\n      this.sortKeys.push({ text: this.$t('sort_position'), value: 'position' })\n      this.sortKeys.push({ text: this.$t('sort_artist'), value: 'artists[0].name' })\n      this.sortKeys.push({ text: this.$t('sort_album'), value: 'album.name' })\n      this.sortBy = 'position'\n      this.viewMode = 'list'\n    } else if (this.endpoint.includes('tracks')) {\n      // tracks listing\n      this.sortKeys.push({ text: this.$t('sort_artist'), value: 'artists[0].name' })\n      this.sortKeys.push({ text: this.$t('sort_album'), value: 'album.name' })\n      this.viewMode = 'list'\n    } else if (this.endpoint.includes('albums')) {\n      // albums listing\n      this.sortKeys.push({ text: this.$t('sort_artist'), value: 'artist.name' })\n      this.sortKeys.push({ text: this.$t('sort_date'), value: 'year' })\n      this.viewMode = 'panel'\n    } else {\n      this.viewMode = 'list'\n    }\n    // get stored viewMode for this endpoint\n    const viewMode = localStorage.getItem('viewMode' + this.mediatype + this.endpoint)\n    if (viewMode !== null) {\n      this.viewMode = viewMode\n    }\n    this.getItems()\n    this.$server.$on('refresh_listing', this.getItems)\n  },\n  computed: {\n    thumbWidth () {\n      return this.$store.isMobile ? 120 : 175\n    },\n    thumbHeight () {\n      return this.thumbWidth * 1.5\n    }\n  },\n  methods: {\n    async getItems () {\n      // retrieve the full list of items\n      await this.$server.getAllItems(this.endpoint, this.items)\n    },\n    toggleViewMode () {\n      if (this.viewMode === 'panel') this.viewMode = 'list'\n      else this.viewMode = 'panel'\n      localStorage.setItem('viewMode' + this.mediatype + this.endpoint, this.viewMode)\n    },\n    filteredItems (items, search) {\n      if (!search) return items\n      search = search.toLowerCase()\n      const newLst = []\n      for (const item of items) {\n        if (item.name.toLowerCase().includes(search)) {\n          newLst.push(item)\n        } else if (item.artist && item.artist.name.toLowerCase().includes(search)) {\n          newLst.push(item)\n        } else if (item.album && item.album.name.toLowerCase().includes(search)) {\n          newLst.push(item)\n        } else if (item.artists && item.artists[0].name.toLowerCase().includes(search)) {\n          newLst.push(item)\n        }\n      }\n      return newLst\n    }\n  }\n}\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemsListing.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemsListing.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemsListing.vue?vue&type=template&id=764b0c8e&scoped=true&\"\nimport script from \"./ItemsListing.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemsListing.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemsListing.vue?vue&type=style&index=0&id=764b0c8e&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"764b0c8e\",\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAppBar } from 'vuetify/lib/components/VAppBar';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VDataIterator } from 'vuetify/lib/components/VDataIterator';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VLabel } from 'vuetify/lib/components/VLabel';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VAppBar,VBtn,VCard,VCol,VContainer,VDataIterator,VIcon,VLabel,VList,VListItem,VMenu,VRow,VSpacer,VTextField})\n","module.exports = __webpack_public_path__ + \"img/demo_player.c079bd97.png\";","module.exports = __webpack_public_path__ + \"img/http_streamer.4c4e4880.png\";","module.exports = __webpack_public_path__ + \"img/homeassistant.29fe3282.png\";","module.exports = __webpack_public_path__ + \"img/webplayer.8e1a0da9.png\";","var map = {\n\t\"./en.json\": \"edd4\",\n\t\"./nl.json\": \"a625\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"49f8\";","module.exports = __webpack_public_path__ + \"img/default_artist.7305b29c.png\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerSelect.vue?vue&type=style&index=0&id=7c65a917&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerSelect.vue?vue&type=style&index=0&id=7c65a917&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',[_c('TopBar'),_c('NavigationMenu'),_c('v-main',[_c('router-view',{key:_vm.$route.path,attrs:{\"app\":\"\"}})],1),_c('PlayerOSD',{attrs:{\"showPlayerSelect\":_vm.showPlayerSelect}}),_c('ContextMenu'),_c('PlayerSelect'),_c('v-overlay',{attrs:{\"value\":_vm.$store.loading}},[_c('v-progress-circular',{attrs:{\"indeterminate\":\"\",\"size\":\"64\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-navigation-drawer',{attrs:{\"dark\":\"\",\"app\":\"\",\"clipped\":\"\",\"temporary\":\"\"},model:{value:(_vm.$store.showNavigationMenu),callback:function ($$v) {_vm.$set(_vm.$store, \"showNavigationMenu\", $$v)},expression:\"$store.showNavigationMenu\"}},[_c('v-list',[_vm._l((_vm.items),function(item){return _c('v-list-item',{key:item.title,on:{\"click\":function($event){return _vm.$router.push(item.path)}}},[_c('v-list-item-action',[_c('v-icon',[_vm._v(_vm._s(item.icon))])],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(_vm._s(item.title))])],1)],1)}),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){_vm.$store.showNavigationMenu=!_vm.$store.showNavigationMenu}}})],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <v-navigation-drawer dark app clipped temporary v-model=\"$store.showNavigationMenu\">\n    <v-list>\n      <v-list-item v-for=\"item in items\" :key=\"item.title\" @click=\"$router.push(item.path)\">\n        <v-list-item-action>\n          <v-icon>{{ item.icon }}</v-icon>\n        </v-list-item-action>\n        <v-list-item-content>\n          <v-list-item-title>{{ item.title }}</v-list-item-title>\n        </v-list-item-content>\n      </v-list-item>\n      <v-btn icon v-on:click=\"$store.showNavigationMenu=!$store.showNavigationMenu\" />\n    </v-list>\n  </v-navigation-drawer>\n</template>\n\n<script>\nimport Vue from 'vue'\n\nexport default Vue.extend({\n  props: {},\n  data () {\n    return {\n      items: [\n        { title: this.$t('home'), icon: 'home', path: '/' },\n        { title: this.$t('artists'), icon: 'person', path: '/artists' },\n        { title: this.$t('albums'), icon: 'album', path: '/albums' },\n        { title: this.$t('tracks'), icon: 'audiotrack', path: '/tracks' },\n        { title: this.$t('playlists'), icon: 'playlist_play', path: '/playlists' },\n        { title: this.$t('radios'), icon: 'radio', path: '/radios' },\n        { title: this.$t('search'), icon: 'search', path: '/search' },\n        { title: this.$t('settings'), icon: 'settings', path: '/config' }\n      ]\n    }\n  },\n  mounted () { },\n  methods: {}\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NavigationMenu.vue?vue&type=template&id=5fe9f182&\"\nimport script from \"./NavigationMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./NavigationMenu.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VNavigationDrawer } from 'vuetify/lib/components/VNavigationDrawer';\ninstallComponents(component, {VBtn,VIcon,VList,VListItem,VListItemAction,VListItemContent,VListItemTitle,VNavigationDrawer})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app-bar',{attrs:{\"app\":\"\",\"flat\":\"\",\"dense\":\"\",\"dark\":\"\",\"color\":_vm.color}},[_c('v-layout',[(!_vm.$store.topBarTransparent)?_c('div',{staticClass:\"body-1\",staticStyle:{\"position\":\"fixed\",\"width\":\"100%\",\"text-align\":\"center\",\"vertical-align\":\"center\",\"margin-top\":\"11px\"}},[_vm._v(_vm._s(_vm.$store.windowtitle))]):_vm._e(),_c('v-btn',{staticStyle:{\"margin-left\":\"-13px\"},attrs:{\"icon\":\"\"},on:{\"click\":function($event){_vm.$store.showNavigationMenu=!_vm.$store.showNavigationMenu}}},[_c('v-icon',[_vm._v(\"menu\")])],1),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.$router.go(-1)}}},[_c('v-icon',[_vm._v(\"arrow_back\")])],1),_c('v-spacer'),(_vm.$store.topBarContextItem)?_c('v-btn',{staticStyle:{\"margin-right\":\"-23px\"},attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.$server.$emit('showContextMenu', _vm.$store.topBarContextItem)}}},[_c('v-icon',[_vm._v(\"more_vert\")])],1):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <v-app-bar app flat dense dark :color=\"color\">\n    <v-layout>\n      <div class=\"body-1\" v-if=\"!$store.topBarTransparent\" style=\"position:fixed;width:100%;text-align:center;vertical-align:center;margin-top:11px;\">{{ $store.windowtitle }}</div>\n      <v-btn icon v-on:click=\"$store.showNavigationMenu=!$store.showNavigationMenu\" style=\"margin-left:-13px\">\n        <v-icon>menu</v-icon>\n      </v-btn>\n      <v-btn @click=\"$router.go(-1)\" icon>\n        <v-icon>arrow_back</v-icon>\n      </v-btn>\n      <v-spacer></v-spacer>\n      <v-btn v-if=\"$store.topBarContextItem\" icon @click=\"$server.$emit('showContextMenu', $store.topBarContextItem)\" style=\"margin-right:-23px\">\n        <v-icon>more_vert</v-icon>\n      </v-btn>\n    </v-layout>\n  </v-app-bar>\n</template>\n\n<script>\nimport Vue from 'vue'\n\nexport default Vue.extend({\n  props: { },\n  data () {\n    return {\n    }\n  },\n  computed: {\n    color () {\n      if (this.$store.topBarTransparent) {\n        return 'transparent'\n      } else return 'black'\n    }\n  },\n  mounted () { },\n  methods: {}\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TopBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TopBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TopBar.vue?vue&type=template&id=0b1c8523&\"\nimport script from \"./TopBar.vue?vue&type=script&lang=js&\"\nexport * from \"./TopBar.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAppBar } from 'vuetify/lib/components/VAppBar';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VLayout } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VAppBar,VBtn,VIcon,VLayout,VSpacer})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"max-width\":\"500px\"},on:{\"input\":function($event){return _vm.$emit('input', $event)}},model:{value:(_vm.visible),callback:function ($$v) {_vm.visible=$$v},expression:\"visible\"}},[_c('v-card',[(_vm.playlists.length === 0)?_c('v-list',[_c('v-subheader',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.header))]),(_vm.subheader)?_c('v-subheader',[_vm._v(_vm._s(_vm.subheader))]):_vm._e(),_vm._l((_vm.menuItems),function(item){return _c('div',{key:item.label},[_c('v-list-item',{on:{\"click\":function($event){return _vm.itemCommand(item.action)}}},[_c('v-list-item-avatar',[_c('v-icon',[_vm._v(_vm._s(item.icon))])],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(_vm._s(_vm.$t(item.label)))])],1)],1),_c('v-divider')],1)})],2):_vm._e(),(_vm.playlists.length > 0)?_c('v-list',[_c('v-subheader',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.header))]),_vm._l((_vm.playlists),function(item,index){return _c('listviewItem',{key:item.item_id,attrs:{\"item\":item,\"totalitems\":_vm.playlists.length,\"index\":index,\"hideavatar\":false,\"hidetracknum\":true,\"hideproviders\":false,\"hidelibrary\":true,\"hidemenu\":true,\"onclickHandler\":_vm.addToPlaylist}})})],2):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n  <v-dialog v-model=\"visible\" @input=\"$emit('input', $event)\" max-width=\"500px\">\r\n    <v-card>\r\n      <!-- normal contextmenu items -->\r\n      <v-list v-if=\"playlists.length === 0\">\r\n        <v-subheader class=\"title\">{{ header }}</v-subheader>\r\n        <v-subheader v-if=\"subheader\">{{ subheader }}</v-subheader>\r\n        <div v-for=\"item of menuItems\" :key=\"item.label\">\r\n          <v-list-item @click=\"itemCommand(item.action)\">\r\n            <v-list-item-avatar>\r\n              <v-icon>{{ item.icon }}</v-icon>\r\n            </v-list-item-avatar>\r\n            <v-list-item-content>\r\n              <v-list-item-title>{{ $t(item.label) }}</v-list-item-title>\r\n            </v-list-item-content>\r\n          </v-list-item>\r\n          <v-divider></v-divider>\r\n        </div>\r\n      </v-list>\r\n      <!-- playlists selection -->\r\n      <v-list v-if=\"playlists.length > 0\">\r\n        <v-subheader class=\"title\">{{ header }}</v-subheader>\r\n        <listviewItem\r\n          v-for=\"(item, index) in playlists\"\r\n          :key=\"item.item_id\"\r\n          v-bind:item=\"item\"\r\n          v-bind:totalitems=\"playlists.length\"\r\n          v-bind:index=\"index\"\r\n          :hideavatar=\"false\"\r\n          :hidetracknum=\"true\"\r\n          :hideproviders=\"false\"\r\n          :hidelibrary=\"true\"\r\n          :hidemenu=\"true\"\r\n          :onclickHandler=\"addToPlaylist\"\r\n        ></listviewItem>\r\n      </v-list>\r\n    </v-card>\r\n  </v-dialog>\r\n</template>\r\n\r\n<script>\r\nimport Vue from 'vue'\r\nimport ListviewItem from '@/components/ListviewItem.vue'\r\n\r\nexport default Vue.extend({\r\n  components:\r\n  {\r\n    ListviewItem\r\n  },\r\n  props:\r\n    {},\r\n  watch:\r\n    {},\r\n  data () {\r\n    return {\r\n      visible: false,\r\n      menuItems: [],\r\n      header: '',\r\n      subheader: '',\r\n      curItem: null,\r\n      curPlaylist: null,\r\n      playerQueueItems: [],\r\n      playlists: []\r\n    }\r\n  },\r\n  mounted () { },\r\n  created () {\r\n    this.$server.$on('showContextMenu', this.showContextMenu)\r\n    this.$server.$on('showPlayMenu', this.showPlayMenu)\r\n  },\r\n  computed: {\r\n  },\r\n  methods: {\r\n    showContextMenu (mediaItem) {\r\n      // show contextmenu items for the given mediaItem\r\n      this.playlists = []\r\n      if (!mediaItem) return\r\n      this.curItem = mediaItem\r\n      const curBrowseContext = this.$store.topBarContextItem\r\n      const menuItems = []\r\n      // show info\r\n      if (mediaItem !== curBrowseContext) {\r\n        menuItems.push({\r\n          label: 'show_info',\r\n          action: 'info',\r\n          icon: 'info'\r\n        })\r\n      }\r\n      // add to library\r\n      if (mediaItem.in_library.length === 0) {\r\n        menuItems.push({\r\n          label: 'add_library',\r\n          action: 'toggle_library',\r\n          icon: 'favorite_border'\r\n        })\r\n      }\r\n      // remove from library\r\n      if (mediaItem.in_library.length > 0) {\r\n        menuItems.push({\r\n          label: 'remove_library',\r\n          action: 'toggle_library',\r\n          icon: 'favorite'\r\n        })\r\n      }\r\n      // remove from playlist (playlist tracks only)\r\n      if (curBrowseContext && curBrowseContext.media_type === 4) {\r\n        this.curPlaylist = curBrowseContext\r\n        if (mediaItem.media_type === 3 && curBrowseContext.is_editable) {\r\n          menuItems.push({\r\n            label: 'remove_playlist',\r\n            action: 'remove_playlist',\r\n            icon: 'remove_circle_outline'\r\n          })\r\n        }\r\n      }\r\n      // add to playlist action (tracks only)\r\n      if (mediaItem.media_type === 3) {\r\n        menuItems.push({\r\n          label: 'add_playlist',\r\n          action: 'add_playlist',\r\n          icon: 'add_circle_outline'\r\n        })\r\n      }\r\n      this.menuItems = menuItems\r\n      this.header = mediaItem.name\r\n      this.subheader = ''\r\n      this.visible = true\r\n    },\r\n    showPlayMenu (mediaItem) {\r\n      // show playmenu items for the given mediaItem\r\n      this.playlists = []\r\n      this.curItem = mediaItem\r\n      if (!mediaItem) return\r\n      const menuItems = [\r\n        {\r\n          label: 'play_now',\r\n          action: 'play',\r\n          icon: 'play_circle_outline'\r\n        },\r\n        {\r\n          label: 'play_next',\r\n          action: 'next',\r\n          icon: 'queue_play_next'\r\n        },\r\n        {\r\n          label: 'add_queue',\r\n          action: 'add',\r\n          icon: 'playlist_add'\r\n        }\r\n      ]\r\n      this.menuItems = menuItems\r\n      this.header = mediaItem.name\r\n      this.subheader = ''\r\n      this.visible = true\r\n    },\r\n    async showPlaylistsMenu () {\r\n      // get all editable playlists\r\n      const trackProviders = []\r\n      for (const item of this.curItem.provider_ids) {\r\n        trackProviders.push(item.provider)\r\n      }\r\n      const playlists = await this.$server.getData('library/playlists')\r\n      const items = []\r\n      for (var playlist of playlists.items) {\r\n        if (\r\n          playlist.is_editable &&\r\n          (!this.curPlaylist || playlist.item_id !== this.curPlaylist.item_id)\r\n        ) {\r\n          for (const item of playlist.provider_ids) {\r\n            if (trackProviders.includes(item.provider)) {\r\n              items.push(playlist)\r\n              break\r\n            }\r\n          }\r\n        }\r\n      }\r\n      this.playlists = items\r\n    },\r\n    itemCommand (cmd) {\r\n      if (cmd === 'info') {\r\n        // show media info\r\n        let endpoint = ''\r\n        if (this.curItem.media_type === 1) endpoint = 'artists'\r\n        if (this.curItem.media_type === 2) endpoint = 'albums'\r\n        if (this.curItem.media_type === 3) endpoint = 'tracks'\r\n        if (this.curItem.media_type === 4) endpoint = 'playlists'\r\n        if (this.curItem.media_type === 5) endpoint = 'radios'\r\n        this.$router.push({\r\n          path: '/' + endpoint + '/' + this.curItem.item_id,\r\n          query: { provider: this.curItem.provider }\r\n        })\r\n        this.visible = false\r\n      } else if (cmd === 'playmenu') {\r\n        // show play menu\r\n        return this.showPlayMenu(this.curItem)\r\n      } else if (cmd === 'add_playlist') {\r\n        // add to playlist\r\n        return this.showPlaylistsMenu()\r\n      } else if (cmd === 'remove_playlist') {\r\n        // remove track from playlist\r\n        this.removeFromPlaylist(\r\n          this.curItem,\r\n          this.curPlaylist.item_id,\r\n          'playlist_remove'\r\n        )\r\n        this.visible = false\r\n      } else if (cmd === 'toggle_library') {\r\n        // add/remove to/from library\r\n        this.$server.toggleLibrary(this.curItem)\r\n        this.visible = false\r\n      } else {\r\n        // assume play command\r\n        this.$server.playItem(this.curItem, cmd)\r\n        this.visible = false\r\n      }\r\n    },\r\n    addToPlaylist (playlistObj) {\r\n      /// add track to playlist\r\n      const endpoint = 'playlists/' + playlistObj.item_id + '/tracks'\r\n      this.$server.putData(endpoint, this.curItem)\r\n        .then(result => {\r\n          this.visible = false\r\n        })\r\n    },\r\n    removeFromPlaylist (track, playlistId) {\r\n      /// remove track from playlist\r\n      const endpoint = 'playlists/' + playlistId + '/tracks'\r\n      this.$server.deleteData(endpoint, track)\r\n        .then(result => {\r\n          // reload listing\r\n          this.$server.$emit('refresh_listing')\r\n        })\r\n    }\r\n  }\r\n})\r\n</script>\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ContextMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ContextMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ContextMenu.vue?vue&type=template&id=0f9be24a&\"\nimport script from \"./ContextMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./ContextMenu.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VSubheader } from 'vuetify/lib/components/VSubheader';\ninstallComponents(component, {VCard,VDialog,VDivider,VIcon,VList,VListItem,VListItemAvatar,VListItemContent,VListItemTitle,VSubheader})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-footer',{staticStyle:{\"background-color\":\"black\"},attrs:{\"app\":\"\",\"fixed\":\"\",\"padless\":\"\",\"light\":\"\",\"elevation\":\"10\"}},[(!_vm.$store.isMobile)?_c('v-card',{staticStyle:{\"margin-top\":\"1px\"},attrs:{\"dense\":\"\",\"flat\":\"\",\"light\":\"\",\"subheader\":\"\",\"tile\":\"\",\"width\":\"100%\",\"color\":\"#E0E0E0\"}},[_c('v-list-item',{attrs:{\"two-line\":\"\"}},[(_vm.curQueueItem)?_c('v-list-item-avatar',{attrs:{\"tile\":\"\"}},[_c('img',{staticStyle:{\"border\":\"1px solid rgba(0,0,0,.54)\"},attrs:{\"src\":_vm.$server.getImageUrl(_vm.curQueueItem),\"lazy-src\":require('../assets/file.png')}})]):_c('v-list-item-avatar',[_c('v-icon',[_vm._v(\"speaker\")])],1),_c('v-list-item-content',[(_vm.curQueueItem)?_c('v-list-item-title',[_vm._v(\" \"+_vm._s(_vm.curQueueItem.name))]):(_vm.$server.activePlayer)?_c('v-list-item-title',[_vm._v(\" \"+_vm._s(_vm.$server.activePlayer.name))]):_vm._e(),(_vm.curQueueItem)?_c('v-list-item-subtitle',{staticStyle:{\"color\":\"primary\"}},_vm._l((_vm.curQueueItem.artists),function(artist,artistindex){return _c('span',{key:artistindex},[_c('a',{on:{\"click\":[function($event){return _vm.artistClick(artist)},function($event){$event.stopPropagation();}]}},[_vm._v(_vm._s(artist.name))]),(artistindex + 1 < _vm.curQueueItem.artists.length)?_c('label',{key:artistindex},[_vm._v(\" / \")]):_vm._e()])}),0):_vm._e()],1),(_vm.streamDetails)?_c('v-list-item-action',[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-width\":250,\"offset-x\":\"\",\"top\":\"\"},nativeOn:{\"click\":function($event){$event.preventDefault();}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"}},on),[(_vm.streamDetails.quality > 6)?_c('v-img',{attrs:{\"contain\":\"\",\"src\":require('../assets/hires.png'),\"height\":\"30\"}}):_vm._e(),(_vm.streamDetails.quality <= 6)?_c('v-img',{staticStyle:{\"filter\":\"invert(100%)\"},attrs:{\"contain\":\"\",\"src\":_vm.streamDetails.content_type ? require('../assets/' + _vm.streamDetails.content_type + '.png') : '',\"height\":\"30\"}}):_vm._e()],1)]}}],null,false,872579316)},[(_vm.streamDetails)?_c('v-list',[_c('v-subheader',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('stream_details')))]),_c('v-list-item',{attrs:{\"tile\":\"\",\"dense\":\"\"}},[_c('v-list-item-icon',[_c('v-img',{attrs:{\"max-width\":\"50\",\"contain\":\"\",\"src\":_vm.streamDetails.provider ? require('../assets/' + _vm.streamDetails.provider + '.png') : ''}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(_vm._s(_vm.streamDetails.provider))])],1)],1),_c('v-divider'),_c('v-list-item',{attrs:{\"tile\":\"\",\"dense\":\"\"}},[_c('v-list-item-icon',[_c('v-img',{staticStyle:{\"filter\":\"invert(100%)\"},attrs:{\"max-width\":\"50\",\"contain\":\"\",\"src\":_vm.streamDetails.content_type ? require('../assets/' + _vm.streamDetails.content_type + '.png') : ''}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(_vm._s(_vm.streamDetails.sample_rate/1000)+\" kHz / \"+_vm._s(_vm.streamDetails.bit_depth)+\" bits \")])],1)],1),_c('v-divider'),(_vm.playerQueueDetails.crossfade_enabled)?_c('div',[_c('v-list-item',{attrs:{\"tile\":\"\",\"dense\":\"\"}},[_c('v-list-item-icon',[_c('v-img',{attrs:{\"max-width\":\"50\",\"contain\":\"\",\"src\":require('../assets/crossfade.png')}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(_vm._s(_vm.$t('crossfade_enabled')))])],1)],1),_c('v-divider')],1):_vm._e(),(_vm.streamVolumeLevelAdjustment)?_c('div',[_c('v-list-item',{attrs:{\"tile\":\"\",\"dense\":\"\"}},[_c('v-list-item-icon',[_c('v-icon',{staticStyle:{\"margin-left\":\"13px\"},attrs:{\"color\":\"black\"}},[_vm._v(\"volume_up\")])],1),_c('v-list-item-content',[_c('v-list-item-title',{staticStyle:{\"margin-left\":\"12px\"}},[_vm._v(_vm._s(_vm.streamVolumeLevelAdjustment))])],1)],1),_c('v-divider')],1):_vm._e()],1):_vm._e()],1)],1):_vm._e()],1),_c('div',{staticClass:\"body-2\",staticStyle:{\"height\":\"30px\",\"width\":\"100%\",\"color\":\"rgba(0,0,0,.65)\",\"margin-top\":\"-12px\",\"background-color\":\"#E0E0E0\"},attrs:{\"align\":\"center\"}},[(_vm.curQueueItem)?_c('div',{staticStyle:{\"height\":\"12px\",\"margin-left\":\"22px\",\"margin-right\":\"20px\",\"margin-top\":\"2px\"}},[_c('span',{staticClass:\"left\"},[_vm._v(\" \"+_vm._s(_vm.playerCurTimeStr)+\" \")]),_c('span',{staticClass:\"right\"},[_vm._v(\" \"+_vm._s(_vm.playerTotalTimeStr)+\" \")])]):_vm._e()]),(_vm.curQueueItem)?_c('v-progress-linear',{style:('margin-top:-22px;margin-left:80px;width:' + _vm.progressBarWidth + 'px;'),attrs:{\"fixed\":\"\",\"light\":\"\",\"value\":_vm.progress}}):_vm._e()],1):_vm._e(),_c('v-list-item',{staticStyle:{\"height\":\"62px\",\"margin-bottom\":\"5px\",\"margin-top\":\"-4px\",\"background-color\":\"black\"},attrs:{\"dark\":\"\",\"dense\":\"\"}},[(_vm.$server.activePlayer)?_c('v-list-item-action',{staticStyle:{\"margin-top\":\"15px\"}},[_c('v-btn',{attrs:{\"small\":\"\",\"icon\":\"\"},on:{\"click\":function($event){return _vm.playerCommand('previous')}}},[_c('v-icon',[_vm._v(\"skip_previous\")])],1)],1):_vm._e(),(_vm.$server.activePlayer)?_c('v-list-item-action',{staticStyle:{\"margin-left\":\"-32px\",\"margin-top\":\"15px\"}},[_c('v-btn',{attrs:{\"icon\":\"\",\"x-large\":\"\"},on:{\"click\":function($event){return _vm.playerCommand('play_pause')}}},[_c('v-icon',{attrs:{\"size\":\"50\"}},[_vm._v(_vm._s(_vm.$server.activePlayer.state == \"playing\" ? \"pause\" : \"play_arrow\"))])],1)],1):_vm._e(),(_vm.$server.activePlayer)?_c('v-list-item-action',{staticStyle:{\"margin-top\":\"15px\"}},[_c('v-btn',{attrs:{\"icon\":\"\",\"small\":\"\"},on:{\"click\":function($event){return _vm.playerCommand('next')}}},[_c('v-icon',[_vm._v(\"skip_next\")])],1)],1):_vm._e(),_c('v-list-item-content'),(_vm.$server.activePlayer)?_c('v-list-item-action',{staticStyle:{\"padding\":\"16px\"}},[_c('v-btn',{attrs:{\"text\":\"\",\"icon\":\"\"},on:{\"click\":function($event){return _vm.$router.push('/playerqueue/')}}},[_c('v-flex',{staticClass:\"vertical-btn\",attrs:{\"xs12\":\"\"}},[_c('v-icon',[_vm._v(\"queue_music\")]),_c('span',{staticClass:\"caption\",staticStyle:{\"padding-top\":\"5px\"}},[_vm._v(_vm._s(_vm.$t(\"queue\")))])],1)],1)],1):_vm._e(),(_vm.$server.activePlayer && !_vm.$store.isMobile)?_c('v-list-item-action',{staticStyle:{\"padding\":\"16px\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-width\":250,\"offset-x\":\"\",\"top\":\"\"},nativeOn:{\"click\":function($event){$event.preventDefault();}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"}},on),[_c('v-flex',{staticClass:\"vertical-btn\",attrs:{\"xs12\":\"\"}},[_c('v-icon',[_vm._v(\"volume_up\")]),_c('span',{staticClass:\"caption\",staticStyle:{\"padding-top\":\"5px\"}},[_vm._v(_vm._s(Math.round(_vm.$server.activePlayer.volume_level)))])],1)],1)]}}],null,false,2163274026)},[_c('VolumeControl',{attrs:{\"players\":_vm.$server.players,\"player_id\":_vm.$server.activePlayer.player_id}})],1)],1):_vm._e(),_c('v-list-item-action',{staticStyle:{\"padding\":\"15px\",\"margin-right\":\"15px\"}},[_c('v-btn',{attrs:{\"text\":\"\",\"icon\":\"\"},on:{\"click\":function($event){return _vm.$server.$emit('showPlayersMenu')}}},[_c('v-flex',{staticClass:\"vertical-btn\",attrs:{\"xs12\":\"\"}},[_c('v-icon',[_vm._v(\"speaker\")]),(_vm.$server.activePlayer)?_c('span',{staticClass:\"caption\",staticStyle:{\"padding-top\":\"5px\"}},[_vm._v(_vm._s(_vm.truncateString(_vm.$server.activePlayer.name, 12)))]):_c('span',{staticClass:\"caption\"})],1)],1)],1)],1),(_vm.$store.isInStandaloneMode)?_c('v-card',{staticStyle:{\"height\":\"20px\"},attrs:{\"dense\":\"\",\"flat\":\"\",\"light\":\"\",\"subheader\":\"\",\"tile\":\"\",\"width\":\"100%\",\"color\":\"black\"}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',[_c('v-list',[_c('v-list-item',{staticStyle:{\"height\":\"50px\",\"padding-bottom\":\"5\"}},[_c('v-list-item-avatar',{staticStyle:{\"margin-left\":\"-10px\"},attrs:{\"tile\":\"\"}},[_c('v-icon',{attrs:{\"large\":\"\"}},[_vm._v(_vm._s(_vm.players[_vm.player_id].is_group ? \"speaker_group\" : \"speaker\"))])],1),_c('v-list-item-content',{staticStyle:{\"margin-left\":\"-15px\"}},[_c('v-list-item-title',[_vm._v(_vm._s(_vm.players[_vm.player_id].name))]),_c('v-list-item-subtitle',[_vm._v(_vm._s(_vm.$t(\"state.\" + _vm.players[_vm.player_id].state)))])],1)],1),_c('v-divider'),_vm._l((_vm.volumePlayerIds),function(child_id){return _c('div',{key:child_id},[_c('div',{staticClass:\"body-2\",style:(!_vm.players[child_id].powered\n          ? 'color:rgba(0,0,0,.38);'\n          : 'color:rgba(0,0,0,.54);')},[_c('v-btn',{staticStyle:{\"margin-left\":\"8px\"},style:(!_vm.players[child_id].powered\n            ? 'color:rgba(0,0,0,.38);'\n            : 'color:rgba(0,0,0,.54);'),attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.togglePlayerPower(child_id)}}},[_c('v-icon',[_vm._v(\"power_settings_new\")])],1),_c('span',{staticStyle:{\"margin-left\":\"10px\"}},[_vm._v(_vm._s(_vm.players[child_id].name))]),_c('div',{staticStyle:{\"margin-top\":\"-8px\",\"margin-left\":\"15px\",\"margin-right\":\"15px\",\"height\":\"35px\"}},[_c('v-slider',{attrs:{\"lazy\":\"\",\"disabled\":!_vm.players[child_id].powered,\"value\":Math.round(_vm.players[child_id].volume_level),\"prepend-icon\":\"volume_down\",\"append-icon\":\"volume_up\"},on:{\"end\":function($event){return _vm.setPlayerVolume(child_id, $event)},\"click:append\":function($event){return _vm.setPlayerVolume(child_id, 'up')},\"click:prepend\":function($event){return _vm.setPlayerVolume(child_id, 'down')}}})],1)],1),_c('v-divider')],1)})],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <v-card>\n    <v-list>\n    <v-list-item style=\"height:50px;padding-bottom:5;\">\n      <v-list-item-avatar tile style=\"margin-left:-10px;\">\n        <v-icon large>{{\n          players[player_id].is_group ? \"speaker_group\" : \"speaker\"\n        }}</v-icon>\n      </v-list-item-avatar>\n      <v-list-item-content style=\"margin-left:-15px;\">\n        <v-list-item-title>{{ players[player_id].name }}</v-list-item-title>\n        <v-list-item-subtitle>{{\n          $t(\"state.\" + players[player_id].state)\n        }}</v-list-item-subtitle>\n      </v-list-item-content>\n    </v-list-item>\n    <v-divider></v-divider>\n    <div v-for=\"child_id in volumePlayerIds\" :key=\"child_id\">\n      <div\n        class=\"body-2\"\n        :style=\"\n          !players[child_id].powered\n            ? 'color:rgba(0,0,0,.38);'\n            : 'color:rgba(0,0,0,.54);'\n        \"\n      >\n        <v-btn\n          icon\n          @click=\"togglePlayerPower(child_id)\"\n          style=\"margin-left:8px\"\n          :style=\"\n            !players[child_id].powered\n              ? 'color:rgba(0,0,0,.38);'\n              : 'color:rgba(0,0,0,.54);'\n          \"\n        >\n          <v-icon>power_settings_new</v-icon>\n        </v-btn>\n        <span style=\"margin-left:10px\">{{ players[child_id].name }}</span>\n        <div\n          style=\"margin-top:-8px;margin-left:15px;margin-right:15px;height:35px;\"\n        >\n          <v-slider\n            lazy\n            :disabled=\"!players[child_id].powered\"\n            :value=\"Math.round(players[child_id].volume_level)\"\n            prepend-icon=\"volume_down\"\n            append-icon=\"volume_up\"\n            @end=\"setPlayerVolume(child_id, $event)\"\n            @click:append=\"setPlayerVolume(child_id, 'up')\"\n            @click:prepend=\"setPlayerVolume(child_id, 'down')\"\n          ></v-slider>\n        </div>\n      </div>\n      <v-divider></v-divider>\n    </div>\n    </v-list>\n  </v-card>\n</template>\n\n<script>\nimport Vue from 'vue'\n\nexport default Vue.extend({\n  props: ['value', 'players', 'player_id'],\n  data () {\n    return {}\n  },\n  computed: {\n    volumePlayerIds () {\n      var allIds = [this.player_id]\n      allIds.push(...this.players[this.player_id].group_childs)\n      return allIds\n    }\n  },\n  mounted () { },\n  methods: {\n    setPlayerVolume: function (playerId, newVolume) {\n      // if (newVolume === 'up') {\n      //   this.$server.playerCommand('volume_up', null, playerId)\n      // } else if (newVolume === 'down') {\n      //   this.$server.playerCommand('volume_down', null, playerId)\n      // } else {\n      //   this.$server.playerCommand('volume_set', newVolume, playerId)\n      //   this.players[playerId].volume_level = newVolume\n      // }\n      if (newVolume === 'up') {\n        newVolume = this.$server.players[playerId].volume_level + 1\n      } else if (newVolume === 'down') {\n        newVolume = this.$server.players[playerId].volume_level - 1\n      }\n      this.$server.playerCommand('volume_set', newVolume, playerId)\n      this.players[playerId].volume_level = newVolume\n    },\n    togglePlayerPower: function (playerId) {\n      this.$server.playerCommand('power_toggle', null, playerId)\n    }\n  }\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VolumeControl.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VolumeControl.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VolumeControl.vue?vue&type=template&id=8277ef42&\"\nimport script from \"./VolumeControl.vue?vue&type=script&lang=js&\"\nexport * from \"./VolumeControl.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemSubtitle } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VSlider } from 'vuetify/lib/components/VSlider';\ninstallComponents(component, {VBtn,VCard,VDivider,VIcon,VList,VListItem,VListItemAvatar,VListItemContent,VListItemSubtitle,VListItemTitle,VSlider})\n","<template>\n  <v-footer\n    app\n    fixed\n    padless\n    light\n    elevation=\"10\"\n    style=\"background-color: black;\"\n  >\n    <v-card\n      dense\n      flat\n      light\n      subheader\n      tile\n      width=\"100%\"\n      color=\"#E0E0E0\"\n      style=\"margin-top:1px;\"\n      v-if=\"!$store.isMobile\"\n    >\n      <!-- now playing media -->\n      <v-list-item two-line>\n        <v-list-item-avatar tile v-if=\"curQueueItem\">\n          <img\n            :src=\"$server.getImageUrl(curQueueItem)\"\n            :lazy-src=\"require('../assets/file.png')\"\n            style=\"border: 1px solid rgba(0,0,0,.54);\"\n          />\n        </v-list-item-avatar>\n        <v-list-item-avatar v-else>\n          <v-icon>speaker</v-icon>\n        </v-list-item-avatar>\n\n        <v-list-item-content>\n          <v-list-item-title v-if=\"curQueueItem\">\n            {{ curQueueItem.name }}</v-list-item-title\n          >\n          <v-list-item-title v-else-if=\"$server.activePlayer\">\n            {{ $server.activePlayer.name }}</v-list-item-title\n          >\n          <v-list-item-subtitle v-if=\"curQueueItem\" style=\"color: primary\">\n            <span\n              v-for=\"(artist, artistindex) in curQueueItem.artists\"\n              :key=\"artistindex\"\n            >\n              <a v-on:click=\"artistClick(artist)\" @click.stop=\"\">{{\n                artist.name\n              }}</a>\n              <label\n                v-if=\"artistindex + 1 < curQueueItem.artists.length\"\n                :key=\"artistindex\"\n              >\n                /\n              </label>\n            </span>\n          </v-list-item-subtitle>\n        </v-list-item-content>\n         <!-- streaming quality details -->\n        <v-list-item-action v-if=\"streamDetails\">\n          <v-menu\n            :close-on-content-click=\"false\"\n            :nudge-width=\"250\"\n            offset-x\n            top\n            @click.native.prevent\n          >\n            <template v-slot:activator=\"{ on }\">\n              <v-btn icon v-on=\"on\">\n              <v-img contain v-if=\"streamDetails.quality > 6\" :src=\"require('../assets/hires.png')\" height=\"30\" />\n              <v-img contain v-if=\"streamDetails.quality <= 6\" :src=\"streamDetails.content_type ? require('../assets/' + streamDetails.content_type + '.png') : ''\" height=\"30\" style='filter: invert(100%);' />\n              </v-btn>\n            </template>\n            <v-list v-if=\"streamDetails\">\n              <v-subheader class=\"title\">{{ $t('stream_details') }}</v-subheader>\n                <v-list-item tile dense>\n                  <v-list-item-icon>\n                    <v-img max-width=\"50\" contain :src=\"streamDetails.provider ? require('../assets/' + streamDetails.provider + '.png') : ''\" />\n                  </v-list-item-icon>\n                  <v-list-item-content>\n                    <v-list-item-title>{{ streamDetails.provider }}</v-list-item-title>\n                  </v-list-item-content>\n                </v-list-item>\n                <v-divider></v-divider>\n                <v-list-item tile dense>\n                  <v-list-item-icon>\n                    <v-img max-width=\"50\" contain :src=\"streamDetails.content_type ? require('../assets/' + streamDetails.content_type + '.png') : ''\" style='filter: invert(100%);' />\n                  </v-list-item-icon>\n                  <v-list-item-content>\n                    <v-list-item-title>{{ streamDetails.sample_rate/1000 }} kHz / {{ streamDetails.bit_depth }} bits </v-list-item-title>\n                  </v-list-item-content>\n                </v-list-item>\n                <v-divider></v-divider>\n                <div v-if=\"playerQueueDetails.crossfade_enabled\">\n                  <v-list-item tile dense>\n                  <v-list-item-icon>\n                    <v-img max-width=\"50\" contain :src=\"require('../assets/crossfade.png')\"/>\n                  </v-list-item-icon>\n                  <v-list-item-content>\n                    <v-list-item-title>{{ $t('crossfade_enabled') }}</v-list-item-title>\n                  </v-list-item-content>\n                </v-list-item>\n                <v-divider></v-divider>\n                </div>\n                <div v-if=\"streamVolumeLevelAdjustment\">\n                  <v-list-item tile dense>\n                  <v-list-item-icon>\n                    <v-icon color=\"black\" style=\"margin-left:13px\">volume_up</v-icon>\n                  </v-list-item-icon>\n                  <v-list-item-content>\n                    <v-list-item-title style=\"margin-left:12px\">{{ streamVolumeLevelAdjustment }}</v-list-item-title>\n                  </v-list-item-content>\n                </v-list-item>\n                <v-divider></v-divider>\n                </div>\n            </v-list>\n          </v-menu>\n        </v-list-item-action>\n      </v-list-item>\n\n      <!-- progress bar -->\n      <div\n        class=\"body-2\"\n        style=\"height:30px;width:100%;color:rgba(0,0,0,.65);margin-top:-12px;background-color:#E0E0E0;\"\n        align=\"center\"\n      >\n        <div\n          style=\"height:12px;margin-left:22px;margin-right:20px;margin-top:2px;\"\n          v-if=\"curQueueItem\"\n        >\n          <span class=\"left\">\n            {{ playerCurTimeStr }}\n          </span>\n          <span class=\"right\">\n            {{ playerTotalTimeStr }}\n          </span>\n        </div>\n      </div>\n      <v-progress-linear\n        fixed\n        light\n        :value=\"progress\"\n        v-if=\"curQueueItem\"\n        :style=\"\n          'margin-top:-22px;margin-left:80px;width:' + progressBarWidth + 'px;'\n        \"\n      />\n    </v-card>\n\n      <!-- Control buttons -->\n      <v-list-item\n        dark\n        dense\n        style=\"height:62px;margin-bottom:5px;margin-top:-4px;background-color:black;\"\n      >\n        <v-list-item-action v-if=\"$server.activePlayer\" style=\"margin-top:15px\">\n          <v-btn small icon @click=\"playerCommand('previous')\">\n            <v-icon>skip_previous</v-icon>\n          </v-btn>\n        </v-list-item-action>\n        <v-list-item-action\n          v-if=\"$server.activePlayer\"\n          style=\"margin-left:-32px;margin-top:15px\"\n        >\n          <v-btn icon x-large @click=\"playerCommand('play_pause')\">\n            <v-icon size=\"50\">{{\n              $server.activePlayer.state == \"playing\" ? \"pause\" : \"play_arrow\"\n            }}</v-icon>\n          </v-btn>\n        </v-list-item-action>\n        <v-list-item-action v-if=\"$server.activePlayer\" style=\"margin-top:15px\">\n          <v-btn icon small @click=\"playerCommand('next')\">\n            <v-icon>skip_next</v-icon>\n          </v-btn>\n        </v-list-item-action>\n        <!-- player controls -->\n        <v-list-item-content> </v-list-item-content>\n\n        <!-- active player queue button -->\n        <v-list-item-action style=\"padding:16px;\" v-if=\"$server.activePlayer\">\n          <v-btn\n            text\n            icon\n            @click=\"$router.push('/playerqueue/')\"\n          >\n            <v-flex xs12 class=\"vertical-btn\">\n              <v-icon>queue_music</v-icon>\n              <span class=\"caption\" style=\"padding-top: 5px\">{{ $t(\"queue\") }}</span>\n            </v-flex>\n          </v-btn>\n        </v-list-item-action>\n\n        <!-- active player volume -->\n        <v-list-item-action style=\"padding:16px;\" v-if=\"$server.activePlayer && !$store.isMobile\">\n          <v-menu\n            :close-on-content-click=\"false\"\n            :nudge-width=\"250\"\n            offset-x\n            top\n            @click.native.prevent\n          >\n            <template v-slot:activator=\"{ on }\">\n              <v-btn icon v-on=\"on\">\n                <v-flex xs12 class=\"vertical-btn\">\n                  <v-icon>volume_up</v-icon>\n                  <span class=\"caption\" style=\"padding-top: 5px\">{{\n                    Math.round($server.activePlayer.volume_level)\n                  }}</span>\n                </v-flex>\n              </v-btn>\n            </template>\n            <VolumeControl\n              v-bind:players=\"$server.players\"\n              v-bind:player_id=\"$server.activePlayer.player_id\"\n            />\n          </v-menu>\n        </v-list-item-action>\n\n        <!-- active player btn -->\n        <v-list-item-action style=\"padding:15px;margin-right:15px\">\n          <v-btn text icon @click=\"$server.$emit('showPlayersMenu')\">\n            <v-flex xs12 class=\"vertical-btn\">\n              <v-icon>speaker</v-icon>\n              <span class=\"caption\" v-if=\"$server.activePlayer\" style=\"padding-top: 5px\">{{\n                truncateString($server.activePlayer.name, 12)\n              }}</span>\n              <span class=\"caption\" v-else> </span>\n            </v-flex>\n          </v-btn>\n        </v-list-item-action>\n      </v-list-item>\n      <!-- add some additional whitespace in standalone mode only -->\n      <v-card\n        dense\n        flat\n        light\n        subheader\n        tile\n        width=\"100%\"\n        color=\"black\"\n        style=\"height:20px\" v-if=\"$store.isInStandaloneMode\"/>\n  </v-footer>\n</template>\n\n<style scoped>\n.vertical-btn {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n.divider {\n  height: 1px;\n  width: 100%;\n  background-color: #cccccc;\n}\n.right {\n  float: right;\n}\n.left {\n  float: left;\n}\n</style>\n\n<script>\nimport Vue from 'vue'\nimport VolumeControl from '@/components/VolumeControl.vue'\n\nexport default Vue.extend({\n  components: {\n    VolumeControl\n  },\n  props: [],\n  data () {\n    return {\n      playerQueueDetails: {}\n    }\n  },\n  watch: { },\n  computed: {\n    curQueueItem () {\n      if (this.playerQueueDetails) {\n        return this.playerQueueDetails.cur_item\n      } else {\n        return null\n      }\n    },\n    progress () {\n      if (!this.curQueueItem) return 0\n      var totalSecs = this.curQueueItem.duration\n      var curSecs = this.playerQueueDetails.cur_item_time\n      var curPercent = curSecs / totalSecs * 100\n      return curPercent\n    },\n    playerCurTimeStr () {\n      if (!this.curQueueItem) return '0:00'\n      var curSecs = this.playerQueueDetails.cur_item_time\n      return curSecs.toString().formatDuration()\n    },\n    playerTotalTimeStr () {\n      if (!this.curQueueItem) return '0:00'\n      var totalSecs = this.curQueueItem.duration\n      return totalSecs.toString().formatDuration()\n    },\n    progressBarWidth () {\n      return window.innerWidth - 160\n    },\n    streamDetails () {\n      if (!this.playerQueueDetails.cur_item || !this.playerQueueDetails.cur_item || !this.playerQueueDetails.cur_item.streamdetails.provider || !this.playerQueueDetails.cur_item.streamdetails.content_type) return {}\n      return this.playerQueueDetails.cur_item.streamdetails\n    },\n    streamVolumeLevelAdjustment () {\n      if (!this.streamDetails || !this.streamDetails.sox_options) return ''\n      if (this.streamDetails.sox_options.includes('vol ')) {\n        var re = /(.*vol\\s+)(.*)(\\s+dB.*)/\n        var volLevel = this.streamDetails.sox_options.replace(re, '$2')\n        return volLevel + ' dB'\n      }\n      return ''\n    }\n  },\n  created () {\n    this.$server.$on('queue updated', this.queueUpdatedMsg)\n    this.$server.$on('new player selected', this.getQueueDetails)\n  },\n  methods: {\n    playerCommand (cmd, cmd_opt = null) {\n      this.$server.playerCommand(cmd, cmd_opt, this.$server.activePlayerId)\n    },\n    artistClick (item) {\n      // artist entry clicked within the listviewItem\n      var url = '/artists/' + item.item_id\n      this.$router.push({ path: url, query: { provider: item.provider } })\n    },\n    queueUpdatedMsg (data) {\n      const queueId = this.$server.players[this.$server.activePlayerId].active_queue\n      if (data.player_id === queueId) {\n        for (const [key, value] of Object.entries(data)) {\n          Vue.set(this.playerQueueDetails, key, value)\n        }\n      }\n    },\n    async getQueueDetails () {\n      if (this.$server.activePlayer) {\n        const queueId = this.$server.players[this.$server.activePlayerId].active_queue\n        const endpoint = 'players/' + queueId + '/queue'\n        this.playerQueueDetails = await this.$server.getData(endpoint)\n      }\n    },\n    truncateString (str, num) {\n      // If the length of str is less than or equal to num\n      // just return str--don't truncate it.\n      if (str.length <= num) {\n        return str\n      }\n      // Return str truncated with '...' concatenated to the end of str.\n      return str.slice(0, num) + '...'\n    }\n  }\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerOSD.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerOSD.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PlayerOSD.vue?vue&type=template&id=66faf443&scoped=true&\"\nimport script from \"./PlayerOSD.vue?vue&type=script&lang=js&\"\nexport * from \"./PlayerOSD.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PlayerOSD.vue?vue&type=style&index=0&id=66faf443&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"66faf443\",\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VFlex } from 'vuetify/lib/components/VGrid';\nimport { VFooter } from 'vuetify/lib/components/VFooter';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemIcon } from 'vuetify/lib/components/VList';\nimport { VListItemSubtitle } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VProgressLinear } from 'vuetify/lib/components/VProgressLinear';\nimport { VSubheader } from 'vuetify/lib/components/VSubheader';\ninstallComponents(component, {VBtn,VCard,VDivider,VFlex,VFooter,VIcon,VImg,VList,VListItem,VListItemAction,VListItemAvatar,VListItemContent,VListItemIcon,VListItemSubtitle,VListItemTitle,VMenu,VProgressLinear,VSubheader})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-navigation-drawer',{attrs:{\"right\":\"\",\"app\":\"\",\"clipped\":\"\",\"temporary\":\"\",\"width\":\"300\"},model:{value:(_vm.visible),callback:function ($$v) {_vm.visible=$$v},expression:\"visible\"}},[_c('v-card-title',{staticClass:\"headline\"},[_c('b',[_vm._v(_vm._s(_vm.$t('players')))])]),_c('v-list',{attrs:{\"dense\":\"\"}},[_c('v-divider'),_vm._l((_vm.filteredPlayerIds),function(playerId){return _c('div',{key:playerId,style:(_vm.$server.activePlayerId == playerId ? 'background-color:rgba(50, 115, 220, 0.3);' : '')},[_c('v-list-item',{staticStyle:{\"margin-left\":\"-5px\",\"margin-right\":\"-15px\"},attrs:{\"ripple\":\"\",\"dense\":\"\"},on:{\"click\":function($event){return _vm.$server.switchPlayer(_vm.$server.players[playerId].player_id)}}},[_c('v-list-item-avatar',{attrs:{\"tile\":\"\"}},[_c('v-icon',{attrs:{\"size\":\"45\"}},[_vm._v(_vm._s(_vm.$server.players[playerId].is_group_player ? 'speaker_group' : 'speaker'))])],1),_c('v-list-item-content',{staticStyle:{\"margin-left\":\"-15px\"}},[_c('v-list-item-title',{staticClass:\"subtitle-1\"},[_vm._v(_vm._s(_vm.$server.players[playerId].name))]),_c('v-list-item-subtitle',{key:_vm.$server.players[playerId].state,staticClass:\"body-2\",staticStyle:{\"font-weight\":\"normal\"}},[_vm._v(\" \"+_vm._s(_vm.$t('state.' + _vm.$server.players[playerId].state))+\" \")])],1),(_vm.$server.activePlayerId)?_c('v-list-item-action',{staticStyle:{\"padding-right\":\"10px\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"close-on-click\":true,\"nudge-width\":250,\"offset-x\":\"\",\"right\":\"\"},nativeOn:{\"click\":[function($event){$event.stopPropagation();},function($event){$event.stopPropagation();$event.preventDefault();}]},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({staticStyle:{\"color\":\"rgba(0,0,0,.54)\"},attrs:{\"icon\":\"\"}},on),[_c('v-flex',{staticClass:\"vertical-btn\",attrs:{\"xs12\":\"\"}},[_c('v-icon',[_vm._v(\"volume_up\")]),_c('span',{staticClass:\"overline\"},[_vm._v(_vm._s(Math.round(_vm.$server.players[playerId].volume_level)))])],1)],1)]}}],null,true)},[_c('VolumeControl',{attrs:{\"players\":_vm.$server.players,\"player_id\":playerId}})],1)],1):_vm._e()],1),_c('v-divider')],1)})],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <!-- players side menu -->\n  <v-navigation-drawer\n    right\n    app\n    clipped\n    temporary\n    v-model=\"visible\"\n    width=\"300\"\n  >\n    <v-card-title class=\"headline\">\n      <b>{{ $t('players') }}</b>\n    </v-card-title>\n    <v-list dense>\n      <v-divider></v-divider>\n      <div\n        v-for=\"playerId of filteredPlayerIds\"\n        :key=\"playerId\"\n        :style=\"$server.activePlayerId == playerId ? 'background-color:rgba(50, 115, 220, 0.3);' : ''\"\n      >\n        <v-list-item\n          ripple\n          dense\n          style=\"margin-left: -5px; margin-right: -15px\"\n          @click=\"$server.switchPlayer($server.players[playerId].player_id)\"\n        >\n          <v-list-item-avatar tile>\n            <v-icon size=\"45\">{{ $server.players[playerId].is_group_player ? 'speaker_group' : 'speaker' }}</v-icon>\n          </v-list-item-avatar>\n          <v-list-item-content style=\"margin-left:-15px;\">\n            <v-list-item-title class=\"subtitle-1\">{{ $server.players[playerId].name }}</v-list-item-title>\n\n            <v-list-item-subtitle\n              class=\"body-2\"\n              style=\"font-weight:normal;\"\n              :key=\"$server.players[playerId].state\"\n            >\n              {{ $t('state.' + $server.players[playerId].state) }}\n            </v-list-item-subtitle>\n\n          </v-list-item-content>\n\n          <v-list-item-action\n            style=\"padding-right:10px;\"\n            v-if=\"$server.activePlayerId\"\n          >\n            <v-menu\n              :close-on-content-click=\"false\"\n              :close-on-click=\"true\"\n              :nudge-width=\"250\"\n              offset-x\n              right\n              @click.native.stop\n              @click.native.stop.prevent\n            >\n              <template v-slot:activator=\"{ on }\">\n                <v-btn\n                  icon\n                  style=\"color:rgba(0,0,0,.54);\"\n                  v-on=\"on\"\n                >\n                  <v-flex\n                    xs12\n                    class=\"vertical-btn\"\n                  >\n                    <v-icon>volume_up</v-icon>\n                    <span class=\"overline\">{{ Math.round($server.players[playerId].volume_level) }}</span>\n                  </v-flex>\n                </v-btn>\n              </template>\n              <VolumeControl\n                v-bind:players=\"$server.players\"\n                v-bind:player_id=\"playerId\"\n              />\n            </v-menu>\n          </v-list-item-action>\n        </v-list-item>\n        <v-divider></v-divider>\n      </div>\n    </v-list>\n  </v-navigation-drawer>\n</template>\n\n<style scoped>\n.vertical-btn {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n</style>\n\n<script>\nimport Vue from 'vue'\nimport VolumeControl from '@/components/VolumeControl.vue'\n\nexport default Vue.extend({\n  components: {\n    VolumeControl\n  },\n  watch: {\n  },\n  data () {\n    return {\n      filteredPlayerIds: [],\n      visible: false\n    }\n  },\n  computed: {\n  },\n  created () {\n    this.$server.$on('showPlayersMenu', this.show)\n    this.$server.$on('players changed', this.getAvailablePlayers)\n    this.getAvailablePlayers()\n  },\n  methods: {\n    show () {\n      this.visible = true\n    },\n    getAvailablePlayers () {\n      // generate a list of playerIds that we want to show in the list\n      this.filteredPlayerIds = []\n      for (var playerId in this.$server.players) {\n        // we're only interested in enabled players that are not group childs\n        if (this.$server.players[playerId].available) {\n          this.filteredPlayerIds.push(playerId)\n        }\n      }\n    }\n  }\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerSelect.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerSelect.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PlayerSelect.vue?vue&type=template&id=7c65a917&scoped=true&\"\nimport script from \"./PlayerSelect.vue?vue&type=script&lang=js&\"\nexport * from \"./PlayerSelect.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PlayerSelect.vue?vue&type=style&index=0&id=7c65a917&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7c65a917\",\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VFlex } from 'vuetify/lib/components/VGrid';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemSubtitle } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VNavigationDrawer } from 'vuetify/lib/components/VNavigationDrawer';\ninstallComponents(component, {VBtn,VCardTitle,VDivider,VFlex,VIcon,VList,VListItem,VListItemAction,VListItemAvatar,VListItemContent,VListItemSubtitle,VListItemTitle,VMenu,VNavigationDrawer})\n","<template>\n  <v-app>\n    <TopBar />\n    <NavigationMenu></NavigationMenu>\n    <v-main>\n      <router-view app :key=\"$route.path\"></router-view>\n    </v-main>\n    <PlayerOSD :showPlayerSelect=\"showPlayerSelect\" />\n    <ContextMenu/>\n    <PlayerSelect/>\n    <v-overlay :value=\"$store.loading\">\n      <v-progress-circular indeterminate size=\"64\"></v-progress-circular>\n    </v-overlay>\n  </v-app>\n</template>\n\n<style>\n  .body {\n    background-color: black;\n    overscroll-behavior-x: none;\n  }\n</style>\n\n<script>\nimport Vue from 'vue'\nimport NavigationMenu from './components/NavigationMenu.vue'\nimport TopBar from './components/TopBar.vue'\nimport ContextMenu from './components/ContextMenu.vue'\nimport PlayerOSD from './components/PlayerOSD.vue'\nimport PlayerSelect from './components/PlayerSelect.vue'\n\nexport default Vue.extend({\n  name: 'App',\n  components: {\n    NavigationMenu,\n    TopBar,\n    ContextMenu,\n    PlayerOSD,\n    PlayerSelect\n  },\n  data: () => ({\n    showPlayerSelect: false\n  }),\n  created () {\n    // TODO: retrieve serveraddress through discovery and/or user settings\n    let serverAddress = ''\n    if (process.env.NODE_ENV === 'production') {\n      const loc = window.location\n      serverAddress = loc.origin + loc.pathname\n    } else {\n      serverAddress = 'http://localhost:8095/'\n    }\n    this.$server.connect(serverAddress)\n  }\n})\n</script>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=7f0d4007&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VApp } from 'vuetify/lib/components/VApp';\nimport { VMain } from 'vuetify/lib/components/VMain';\nimport { VOverlay } from 'vuetify/lib/components/VOverlay';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\ninstallComponents(component, {VApp,VMain,VOverlay,VProgressCircular})\n","/* eslint-disable no-console */\n\nimport { register } from 'register-service-worker'\n\nif (process.env.NODE_ENV === 'production') {\n  register(`${process.env.BASE_URL}service-worker.js`, {\n    ready () {\n      console.log(\n        'App is being served from cache by a service worker.\\n' +\n        'For more details, visit https://goo.gl/AFskqB'\n      )\n    },\n    registered () {\n      console.log('Service worker has been registered.')\n    },\n    cached () {\n      console.log('Content has been cached for offline use.')\n    },\n    updatefound () {\n      console.log('New content is downloading.')\n    },\n    updated () {\n      alert('New content is available; please refresh.')\n      window.location.reload(true)\n    },\n    offline () {\n      alert('No internet connection found. App is running in offline mode.')\n    },\n    error (error) {\n      console.error('Error during service worker registration:', error)\n    }\n  })\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[_c('v-list',{attrs:{\"tile\":\"\"}},_vm._l((_vm.items),function(item){return _c('v-list-item',{key:item.title,attrs:{\"tile\":\"\"},on:{\"click\":function($event){return _vm.$router.push(item.path)}}},[_c('v-list-item-icon',{staticStyle:{\"margin-left\":\"15px\"}},[_c('v-icon',[_vm._v(_vm._s(item.icon))])],1),_c('v-list-item-content',[_c('v-list-item-title',{domProps:{\"textContent\":_vm._s(item.title)}})],1)],1)}),1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <section>\n    <v-list tile>\n      <v-list-item tile\n        v-for=\"item in items\" :key=\"item.title\" @click=\"$router.push(item.path)\">\n          <v-list-item-icon style=\"margin-left:15px\">\n            <v-icon>{{ item.icon }}</v-icon>\n          </v-list-item-icon>\n          <v-list-item-content>\n            <v-list-item-title v-text=\"item.title\"></v-list-item-title>\n          </v-list-item-content>\n      </v-list-item>\n    </v-list>\n  </section>\n</template>\n\n<script>\n\nexport default {\n  name: 'home',\n  data () {\n    return {\n      items: [\n        { title: this.$t('artists'), icon: 'person', path: '/artists' },\n        { title: this.$t('albums'), icon: 'album', path: '/albums' },\n        { title: this.$t('tracks'), icon: 'audiotrack', path: '/tracks' },\n        { title: this.$t('playlists'), icon: 'playlist_play', path: '/playlists' },\n        { title: this.$t('search'), icon: 'search', path: '/search' }\n      ]\n    }\n  },\n  created () {\n    this.$store.windowtitle = this.$t('musicassistant')\n  }\n}\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=38d5da10&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemIcon } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\ninstallComponents(component, {VIcon,VList,VListItem,VListItemContent,VListItemIcon,VListItemTitle})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[_c('ItemsListing',{attrs:{\"mediatype\":_vm.mediatype,\"provider\":_vm.provider,\"endpoint\":'library/' + _vm.mediatype}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <section>\n    <ItemsListing :mediatype=\"mediatype\" :provider=\"provider\" :endpoint=\"'library/' + mediatype\" />\n  </section>\n</template>\n\n<script>\n// @ is an alias to /src\nimport ItemsListing from '@/components/ItemsListing.vue'\n\nexport default {\n  name: 'browse',\n  components: {\n    ItemsListing\n  },\n  props: {\n    mediatype: String,\n    provider: String\n  },\n  data () {\n    return { }\n  },\n  created () {\n    this.$store.windowtitle = this.$t(this.mediatype)\n  },\n  computed: { },\n  methods: { }\n}\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Browse.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Browse.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Browse.vue?vue&type=template&id=0b869ae6&\"\nimport script from \"./Browse.vue?vue&type=script&lang=js&\"\nexport * from \"./Browse.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport Home from '../views/Home.vue'\nimport Browse from '../views/Browse.vue'\n\nVue.use(VueRouter)\n\nconst routes = [\n  {\n    path: '/',\n    name: 'home',\n    component: Home\n  },\n  {\n    path: '/config',\n    name: 'config',\n    component: () => import(/* webpackChunkName: \"config\" */ '../views/Config.vue'),\n    props: route => ({ ...route.params, ...route.query })\n  },\n  {\n    path: '/config/:configKey',\n    name: 'configKey',\n    component: () => import(/* webpackChunkName: \"config\" */ '../views/Config.vue'),\n    props: route => ({ ...route.params, ...route.query })\n  },\n  {\n    path: '/search',\n    name: 'search',\n    component: () => import(/* webpackChunkName: \"search\" */ '../views/Search.vue'),\n    props: route => ({ ...route.params, ...route.query })\n  },\n  {\n    path: '/:media_type/:media_id',\n    name: 'itemdetails',\n    component: () => import(/* webpackChunkName: \"itemdetails\" */ '../views/ItemDetails.vue'),\n    props: route => ({ ...route.params, ...route.query })\n  },\n  {\n    path: '/playerqueue',\n    name: 'playerqueue',\n    component: () => import(/* webpackChunkName: \"playerqueue\" */ '../views/PlayerQueue.vue'),\n    props: route => ({ ...route.params, ...route.query })\n  },\n  {\n    path: '/:mediatype',\n    name: 'browse',\n    component: Browse,\n    props: route => ({ ...route.params, ...route.query })\n  }\n]\n\nconst router = new VueRouter({\n  mode: 'hash',\n  routes\n})\n\nexport default router\n","import Vue from 'vue'\nimport VueI18n from 'vue-i18n'\n\nVue.use(VueI18n)\n\nfunction loadLocaleMessages () {\n  const locales = require.context('./locales', true, /[A-Za-z0-9-_,\\s]+\\.json$/i)\n  const messages = {}\n  locales.keys().forEach(key => {\n    const matched = key.match(/([A-Za-z0-9-_]+)\\./i)\n    if (matched && matched.length > 1) {\n      const locale = matched[1]\n      messages[locale] = locales(key)\n    }\n  })\n  return messages\n}\n\nexport default new VueI18n({\n  // locale: process.env.VUE_APP_I18N_LOCALE || 'en',\n  locale: navigator.language.split('-')[0],\n  fallbackLocale: 'en',\n  messages: loadLocaleMessages()\n})\n","import Vue from 'vue'\nimport Vuetify from 'vuetify/lib'\n\nVue.use(Vuetify)\n\nexport default new Vuetify({\n})\n","import Vue from 'vue'\n\nconst globalStore = new Vue({\n  data () {\n    return {\n      windowtitle: 'Home',\n      loading: false,\n      showNavigationMenu: false,\n      topBarTransparent: false,\n      topBarContextItem: null,\n      isMobile: false,\n      isInStandaloneMode: false\n    }\n  },\n  created () {\n    this.handleWindowOptions()\n    window.addEventListener('resize', this.handleWindowOptions)\n  },\n  destroyed () {\n    window.removeEventListener('resize', this.handleWindowOptions)\n  },\n  methods: {\n    handleWindowOptions () {\n      this.isMobile = (document.body.clientWidth < 700)\n      this.isInStandaloneMode = (window.navigator.standalone === true) || (window.matchMedia('(display-mode: standalone)').matches)\n    }\n  }\n})\n\nexport default {\n  globalStore,\n  // we can add objects to the Vue prototype in the install() hook:\n  install (Vue, options) {\n    Vue.prototype.$store = globalStore\n  }\n}\n","'use strict'\n\nimport Vue from 'vue'\nimport axios from 'axios'\nimport oboe from 'oboe'\n\nconst axiosConfig = {\n  timeout: 60 * 1000\n  // withCredentials: true, // Check cross-site Access-Control\n}\nconst _axios = axios.create(axiosConfig)\n\n// Holds the connection to the server\n\nconst server = new Vue({\n\n  _address: '',\n  _ws: null,\n\n  data () {\n    return {\n      connected: false,\n      players: {},\n      activePlayerId: null,\n      syncStatus: []\n    }\n  },\n  methods: {\n\n    async connect (serverAddress) {\n      // Connect to the server\n      if (!serverAddress.endsWith('/')) {\n        serverAddress = serverAddress + '/'\n      }\n      this._address = serverAddress\n      const wsAddress = serverAddress.replace('http', 'ws') + 'ws'\n      this._ws = new WebSocket(wsAddress)\n      this._ws.onopen = this._onWsConnect\n      this._ws.onmessage = this._onWsMessage\n      this._ws.onclose = this._onWsClose\n      this._ws.onerror = this._onWsError\n    },\n\n    async toggleLibrary (item) {\n      /// triggered when user clicks the library (heart) button\n      if (item.in_library.length === 0) {\n        // add to library\n        await this.putData('library', item)\n        item.in_library = [item.provider]\n      } else {\n        // remove from library\n        await this.deleteData('library', item)\n        item.in_library = []\n      }\n    },\n\n    getImageUrl (mediaItem, imageType = 'image', size = 0) {\n      // format the image url\n      if (!mediaItem || !mediaItem.media_type) return ''\n      if (mediaItem.provider === 'database' && imageType === 'image') {\n        return `${this._address}api/${mediaItem.media_type}/${mediaItem.item_id}/thumb?provider=${mediaItem.provider}&size=${size}`\n      } else if (mediaItem.metadata && mediaItem.metadata[imageType]) {\n        return mediaItem.metadata[imageType]\n      } else if (mediaItem.album && mediaItem.album.metadata && mediaItem.album.metadata[imageType]) {\n        return mediaItem.album.metadata[imageType]\n      } else if (mediaItem.artist && mediaItem.artist.metadata && mediaItem.artist.metadata[imageType]) {\n        return mediaItem.artist.metadata[imageType]\n      } else if (mediaItem.album && mediaItem.album.artist && mediaItem.album.artist.metadata && mediaItem.album.artist.metadata[imageType]) {\n        return mediaItem.album.artist.metadata[imageType]\n      } else if (mediaItem.artists && mediaItem.artists[0].metadata && mediaItem.artists[0].metadata[imageType]) {\n        return mediaItem.artists[0].metadata[imageType]\n      } else if (imageType === 'fanart') {\n        // fallback to normal image instead of fanart\n        return this.getImageUrl(mediaItem, 'image', size)\n      } else return ''\n    },\n\n    async getData (endpoint, params = {}) {\n      // get data from the server\n      const url = this._address + 'api/' + endpoint\n      const result = await _axios.get(url, { params: params })\n      Vue.$log.debug('getData', endpoint, result)\n      return result.data\n    },\n\n    async postData (endpoint, data) {\n      // post data to the server\n      const url = this._address + 'api/' + endpoint\n      data = JSON.stringify(data)\n      const result = await _axios.post(url, data)\n      Vue.$log.debug('postData', endpoint, result)\n      return result.data\n    },\n\n    async putData (endpoint, data) {\n      // put data to the server\n      const url = this._address + 'api/' + endpoint\n      data = JSON.stringify(data)\n      const result = await _axios.put(url, data)\n      Vue.$log.debug('putData', endpoint, result)\n      return result.data\n    },\n\n    async deleteData (endpoint, dataObj) {\n      // delete data on the server\n      const url = this._address + 'api/' + endpoint\n      dataObj = JSON.stringify(dataObj)\n      const result = await _axios.delete(url, { data: dataObj })\n      Vue.$log.debug('deleteData', endpoint, result)\n      return result.data\n    },\n\n    async getAllItems (endpoint, list, params = null) {\n      // retrieve all items and fill list\n      let url = this._address + 'api/' + endpoint\n      if (params) {\n        var urlParams = new URLSearchParams(params)\n        url += '?' + urlParams.toString()\n      }\n      let index = 0\n      Vue.$log.debug('getAllItems', url)\n      oboe(url)\n        .node('items.*', function (item) {\n          Vue.set(list, index, item)\n          index += 1\n        })\n        .done(function (fullList) {\n          // truncate list if needed\n          if (list.length > fullList.items.length) {\n            list.splice(fullList.items.length)\n          }\n        })\n    },\n\n    playerCommand (cmd, cmd_opt = '', playerId = this.activePlayerId) {\n      const endpoint = 'players/' + playerId + '/cmd/' + cmd\n      this.postData(endpoint, cmd_opt)\n    },\n\n    async playItem (item, queueOpt) {\n      this.$store.loading = true\n      const endpoint = 'players/' + this.activePlayerId + '/play_media/' + queueOpt\n      await this.postData(endpoint, item)\n      this.$store.loading = false\n    },\n\n    switchPlayer (newPlayerId) {\n      if (newPlayerId !== this.activePlayerId) {\n        this.activePlayerId = newPlayerId\n        localStorage.setItem('activePlayerId', newPlayerId)\n        this.$emit('new player selected', newPlayerId)\n      }\n    },\n\n    async _onWsConnect () {\n      // Websockets connection established\n      Vue.$log.info('Connected to server ' + this._address)\n      this.connected = true\n      // retrieve all players once through api\n      const players = await this.getData('players')\n      for (const player of players) {\n        Vue.set(this.players, player.player_id, player)\n      }\n      this._selectActivePlayer()\n      this.$emit('players changed')\n    },\n\n    async _onWsMessage (e) {\n      // Message retrieved on the websocket\n      var msg = JSON.parse(e.data)\n      if (msg.message === 'player changed') {\n        Vue.set(this.players, msg.message_details.player_id, msg.message_details)\n      } else if (msg.message === 'player added') {\n        Vue.set(this.players, msg.message_details.player_id, msg.message_details)\n        this._selectActivePlayer()\n        this.$emit('players changed')\n      } else if (msg.message === 'player removed') {\n        Vue.delete(this.players, msg.message_details.player_id)\n        this._selectActivePlayer()\n        this.$emit('players changed')\n      } else if (msg.message === 'music sync status') {\n        this.syncStatus = msg.message_details\n      } else {\n        this.$emit(msg.message, msg.message_details)\n      }\n    },\n\n    _onWsClose (e) {\n      this.connected = false\n      Vue.$log.error('Socket is closed. Reconnect will be attempted in 5 seconds.', e.reason)\n      setTimeout(function () {\n        this.connect(this._address)\n      }.bind(this), 5000)\n    },\n\n    _onWsError () {\n      this._ws.close()\n    },\n\n    _selectActivePlayer () {\n      // auto select new active player if we have none\n      if (!this.activePlayer || !this.activePlayer.available) {\n        // prefer last selected player\n        const lastPlayerId = localStorage.getItem('activePlayerId')\n        if (lastPlayerId && this.players[lastPlayerId] && this.players[lastPlayerId].available) {\n          this.switchPlayer(lastPlayerId)\n        } else {\n          // prefer the first playing player\n          for (const playerId in this.players) {\n            if (this.players[playerId].state === 'playing' && this.players[playerId].available) {\n              this.switchPlayer(playerId)\n              break\n            }\n          }\n          // fallback to just the first player\n          if (!this.activePlayer || !this.activePlayer.enabled) {\n            for (const playerId in this.players) {\n              if (this.players[playerId].available) {\n                this.switchPlayer(playerId)\n                break\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  computed: {\n    activePlayer () {\n      if (!this.activePlayerId) {\n        return null\n      } else {\n        return this.players[this.activePlayerId]\n      }\n    }\n  }\n})\n\n// install as plugin\nexport default {\n  server,\n  // we can add objects to the Vue prototype in the install() hook:\n  install (Vue, options) {\n    Vue.prototype.$server = server\n  }\n}\n","import Vue from 'vue'\nimport App from './App.vue'\nimport './registerServiceWorker'\nimport router from './router'\nimport i18n from './i18n'\nimport 'roboto-fontface/css/roboto/roboto-fontface.css'\nimport 'material-design-icons-iconfont/dist/material-design-icons.css'\nimport VueVirtualScroller from 'vue-virtual-scroller'\nimport 'vue-virtual-scroller/dist/vue-virtual-scroller.css'\nimport vuetify from './plugins/vuetify'\nimport store from './plugins/store'\nimport server from './plugins/server'\nimport '@babel/polyfill'\nimport VueLogger from 'vuejs-logger'\n\nconst isProduction = process.env.NODE_ENV === 'production'\nconst loggerOptions = {\n  isEnabled: true,\n  logLevel: isProduction ? 'error' : 'debug',\n  stringifyArguments: false,\n  showLogLevel: true,\n  showMethodName: false,\n  separator: '|',\n  showConsoleColors: true\n}\n\nVue.config.productionTip = false\nVue.use(VueLogger, loggerOptions)\nVue.use(VueVirtualScroller)\nVue.use(store)\nVue.use(server)\n\n// eslint-disable-next-line no-extend-native\nString.prototype.formatDuration = function () {\n  var secNum = parseInt(this, 10) // don't forget the second param\n  var hours = Math.floor(secNum / 3600)\n  var minutes = Math.floor((secNum - (hours * 3600)) / 60)\n  var seconds = secNum - (hours * 3600) - (minutes * 60)\n  if (hours < 10) { hours = '0' + hours }\n  if (minutes < 10) { minutes = '0' + minutes }\n  if (seconds < 10) { seconds = '0' + seconds }\n  if (hours === '00') { return minutes + ':' + seconds } else { return hours + ':' + minutes + ':' + seconds }\n}\n\nnew Vue({\n  router,\n  i18n,\n  vuetify,\n  render: h => h(App)\n}).$mount('#app')\n","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"img/file.813f9dad.png\";","module.exports = __webpack_public_path__ + \"img/sonos.72e2fecb.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","var map = {\n\t\"./aac.png\": \"9a36\",\n\t\"./chromecast.png\": \"57d1\",\n\t\"./crossfade.png\": \"e7af\",\n\t\"./default_artist.png\": \"4bfb\",\n\t\"./demo_player.png\": \"26ea\",\n\t\"./file.png\": \"71db\",\n\t\"./flac.png\": \"fb30\",\n\t\"./hires.png\": \"f5e3\",\n\t\"./homeassistant.png\": \"3232\",\n\t\"./http_streamer.png\": \"2755\",\n\t\"./logo.png\": \"cf05\",\n\t\"./mp3.png\": \"f1d4\",\n\t\"./ogg.png\": \"9ad3\",\n\t\"./qobuz.png\": \"0863\",\n\t\"./sonos.png\": \"82f5\",\n\t\"./spotify.png\": \"0c3b\",\n\t\"./squeezebox.png\": \"bd18\",\n\t\"./tunein.png\": \"e428\",\n\t\"./vorbis.png\": \"94cc\",\n\t\"./web.png\": \"edbf\",\n\t\"./webplayer.png\": \"3d05\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"9e01\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemsListing.vue?vue&type=style&index=0&id=764b0c8e&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemsListing.vue?vue&type=style&index=0&id=764b0c8e&scoped=true&lang=css&\"","module.exports = __webpack_public_path__ + \"img/squeezebox.60631223.png\";","module.exports = __webpack_public_path__ + \"img/logo.c079bd97.png\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-list-item',{directives:[{name:\"longpress\",rawName:\"v-longpress\",value:(_vm.menuClick),expression:\"menuClick\"}],attrs:{\"ripple\":\"\"},on:{\"click\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"left\",37,$event.key,[\"Left\",\"ArrowLeft\"])){ return null; }if('button' in $event && $event.button !== 0){ return null; }_vm.onclickHandler ? _vm.onclickHandler(_vm.item) : _vm.itemClicked(_vm.item)},\"contextmenu\":[_vm.menuClick,function($event){$event.preventDefault();}]}},[(!_vm.hideavatar)?_c('v-list-item-avatar',{attrs:{\"tile\":\"\",\"color\":\"grey\"}},[_c('img',{staticStyle:{\"border\":\"1px solid rgba(0,0,0,.22)\"},attrs:{\"src\":_vm.$server.getImageUrl(_vm.item, 'image', 80),\"lazy-src\":require('../assets/file.png')}})]):_vm._e(),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\" \"+_vm._s(_vm.item.name)+\" \"),(!!_vm.item.version)?_c('span',[_vm._v(\"(\"+_vm._s(_vm.item.version)+\")\")]):_vm._e()]),(_vm.item.artists)?_c('v-list-item-subtitle',[_vm._l((_vm.item.artists),function(artist,artistindex){return _c('span',{key:artist.item_id},[_c('a',{on:{\"click\":[function($event){return _vm.itemClicked(artist)},function($event){$event.stopPropagation();}]}},[_vm._v(_vm._s(artist.name))]),(artistindex + 1 < _vm.item.artists.length)?_c('label',{key:artistindex},[_vm._v(\"/\")]):_vm._e()])}),(!!_vm.item.album && !!_vm.hidetracknum)?_c('a',{staticStyle:{\"color\":\"grey\"},on:{\"click\":[function($event){return _vm.itemClicked(_vm.item.album)},function($event){$event.stopPropagation();}]}},[_vm._v(\" - \"+_vm._s(_vm.item.album.name))]):_vm._e(),(!_vm.hidetracknum && _vm.item.track_number)?_c('label',{staticStyle:{\"color\":\"grey\"}},[_vm._v(\"- disc \"+_vm._s(_vm.item.disc_number)+\" track \"+_vm._s(_vm.item.track_number))]):_vm._e()],2):_vm._e(),(_vm.item.artist)?_c('v-list-item-subtitle',[_c('a',{on:{\"click\":[function($event){return _vm.itemClicked(_vm.item.artist)},function($event){$event.stopPropagation();}]}},[_vm._v(_vm._s(_vm.item.artist.name))])]):_vm._e(),(!!_vm.item.owner)?_c('v-list-item-subtitle',[_vm._v(_vm._s(_vm.item.owner))]):_vm._e()],1),(!_vm.hideproviders)?_c('v-list-item-action',[_c('ProviderIcons',{attrs:{\"providerIds\":_vm.item.provider_ids,\"height\":20}})],1):_vm._e(),(_vm.isHiRes)?_c('v-list-item-action',[_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('img',_vm._g({attrs:{\"src\":require('../assets/hires.png'),\"height\":\"20\"}},on))]}}],null,false,2747613229)},[_c('span',[_vm._v(_vm._s(_vm.isHiRes))])])],1):_vm._e(),(!_vm.hidelibrary)?_c('v-list-item-action',[_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\",\"ripple\":\"\"},on:{\"click\":[function($event){return _vm.toggleLibrary(_vm.item)},function($event){$event.preventDefault();},function($event){$event.stopPropagation();}]}},on),[(_vm.item.in_library.length > 0)?_c('v-icon',{attrs:{\"height\":\"20\"}},[_vm._v(\"favorite\")]):_vm._e(),(_vm.item.in_library.length == 0)?_c('v-icon',{attrs:{\"height\":\"20\"}},[_vm._v(\"favorite_border\")]):_vm._e()],1)]}}],null,false,113966118)},[(_vm.item.in_library.length > 0)?_c('span',[_vm._v(_vm._s(_vm.$t(\"remove_library\")))]):_vm._e(),(_vm.item.in_library.length == 0)?_c('span',[_vm._v(_vm._s(_vm.$t(\"add_library\")))]):_vm._e()])],1):_vm._e(),(!_vm.hideduration && !!_vm.item.duration)?_c('v-list-item-action',[_vm._v(_vm._s(_vm.item.duration.toString().formatDuration()))]):_vm._e(),(!_vm.hidemenu)?_c('v-icon',{staticStyle:{\"margin-right\":\"-10px\",\"padding-left\":\"10px\"},attrs:{\"color\":\"grey lighten-1\"},on:{\"click\":[function($event){return _vm.menuClick(_vm.item)},function($event){$event.stopPropagation();}]}},[_vm._v(\"more_vert\")]):_vm._e()],1),_c('v-divider')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <v-list-item\n      ripple\n      @click.left=\"onclickHandler ? onclickHandler(item) : itemClicked(item)\"\n      @contextmenu=\"menuClick\"\n      @contextmenu.prevent\n      v-longpress=\"menuClick\"\n    >\n      <v-list-item-avatar tile color=\"grey\" v-if=\"!hideavatar\">\n        <img\n          :src=\"$server.getImageUrl(item, 'image', 80)\"\n          :lazy-src=\"require('../assets/file.png')\"\n          style=\"border: 1px solid rgba(0,0,0,.22);\"\n        />\n      </v-list-item-avatar>\n\n      <v-list-item-content>\n        <v-list-item-title>\n          {{ item.name }}\n          <span v-if=\"!!item.version\">({{ item.version }})</span>\n        </v-list-item-title>\n\n        <v-list-item-subtitle v-if=\"item.artists\">\n          <span\n            v-for=\"(artist, artistindex) in item.artists\"\n            :key=\"artist.item_id\"\n          >\n            <a v-on:click=\"itemClicked(artist)\" @click.stop>{{\n              artist.name\n            }}</a>\n            <label\n              v-if=\"artistindex + 1 < item.artists.length\"\n              :key=\"artistindex\"\n              >/</label\n            >\n          </span>\n          <a\n            v-if=\"!!item.album && !!hidetracknum\"\n            v-on:click=\"itemClicked(item.album)\"\n            @click.stop\n            style=\"color:grey\"\n          >\n            - {{ item.album.name }}</a\n          >\n          <label v-if=\"!hidetracknum && item.track_number\" style=\"color:grey\"\n            >- disc {{ item.disc_number }} track {{ item.track_number }}</label\n          >\n        </v-list-item-subtitle>\n        <v-list-item-subtitle v-if=\"item.artist\">\n          <a v-on:click=\"itemClicked(item.artist)\" @click.stop>{{\n            item.artist.name\n          }}</a>\n        </v-list-item-subtitle>\n\n        <v-list-item-subtitle v-if=\"!!item.owner\">{{\n          item.owner\n        }}</v-list-item-subtitle>\n      </v-list-item-content>\n\n      <v-list-item-action v-if=\"!hideproviders\">\n        <ProviderIcons v-bind:providerIds=\"item.provider_ids\" :height=\"20\" />\n      </v-list-item-action>\n\n      <v-list-item-action v-if=\"isHiRes\">\n        <v-tooltip bottom>\n          <template v-slot:activator=\"{ on }\">\n          <img :src=\"require('../assets/hires.png')\" height=\"20\" v-on=\"on\" />\n          </template>\n          <span>{{ isHiRes }}</span>\n        </v-tooltip>\n      </v-list-item-action>\n\n      <v-list-item-action v-if=\"!hidelibrary\">\n        <v-tooltip bottom>\n          <template v-slot:activator=\"{ on }\">\n            <v-btn\n              icon\n              ripple\n              v-on=\"on\"\n              v-on:click=\"toggleLibrary(item)\"\n              @click.prevent\n              @click.stop\n            >\n              <v-icon height=\"20\" v-if=\"item.in_library.length > 0\"\n                >favorite</v-icon\n              >\n              <v-icon height=\"20\" v-if=\"item.in_library.length == 0\"\n                >favorite_border</v-icon\n              >\n            </v-btn>\n          </template>\n          <span v-if=\"item.in_library.length > 0\">{{\n            $t(\"remove_library\")\n          }}</span>\n          <span v-if=\"item.in_library.length == 0\">{{\n            $t(\"add_library\")\n          }}</span>\n        </v-tooltip>\n      </v-list-item-action>\n\n      <v-list-item-action v-if=\"!hideduration && !!item.duration\">{{\n        item.duration.toString().formatDuration()\n      }}</v-list-item-action>\n\n      <!-- menu button/icon -->\n      <v-icon\n        v-if=\"!hidemenu\"\n        @click=\"menuClick(item)\"\n        @click.stop\n        color=\"grey lighten-1\"\n        style=\"margin-right:-10px;padding-left:10px\"\n        >more_vert</v-icon\n      >\n    </v-list-item>\n    <v-divider></v-divider>\n  </div>\n</template>\n\n<script>\nimport Vue from 'vue'\nimport ProviderIcons from '@/components/ProviderIcons.vue'\n\nconst PRESS_TIMEOUT = 600\n\nVue.directive('longpress', {\n  bind: function (el, { value }, vNode) {\n    if (typeof value !== 'function') {\n      Vue.$log.warn(`Expect a function, got ${value}`)\n      return\n    }\n    let pressTimer = null\n    const start = e => {\n      if (e.type === 'click' && e.button !== 0) {\n        return\n      }\n      if (pressTimer === null) {\n        pressTimer = setTimeout(() => value(e), PRESS_TIMEOUT)\n      }\n    }\n    const cancel = () => {\n      if (pressTimer !== null) {\n        clearTimeout(pressTimer)\n        pressTimer = null\n      }\n    }\n    ;['mousedown', 'touchstart'].forEach(e => el.addEventListener(e, start))\n    ;['click', 'mouseout', 'touchend', 'touchcancel'].forEach(e => el.addEventListener(e, cancel))\n  }\n})\n\nexport default Vue.extend({\n  components: {\n    ProviderIcons\n  },\n  props: {\n    item: Object,\n    index: Number,\n    totalitems: Number,\n    hideavatar: Boolean,\n    hidetracknum: Boolean,\n    hideproviders: Boolean,\n    hidemenu: Boolean,\n    hidelibrary: Boolean,\n    hideduration: Boolean,\n    onclickHandler: null\n  },\n  data () {\n    return {\n      touchMoving: false,\n      cancelled: false\n    }\n  },\n  computed: {\n    isHiRes () {\n      for (var prov of this.item.provider_ids) {\n        if (prov.quality > 6) {\n          if (prov.details) {\n            return prov.details\n          } else if (prov.quality === 7) {\n            return '44.1/48khz 24 bits'\n          } else if (prov.quality === 8) {\n            return '88.2/96khz 24 bits'\n          } else if (prov.quality === 9) {\n            return '176/192khz 24 bits'\n          } else {\n            return '+192kHz 24 bits'\n          }\n        }\n      }\n      return ''\n    }\n  },\n  created () { },\n  beforeDestroy () {\n    this.cancelled = true\n  },\n  mounted () { },\n  methods: {\n    itemClicked (mediaItem = null) {\n      // mediaItem in the list is clicked\n      let url = ''\n      if (mediaItem.media_type === 1) {\n        url = '/artists/' + mediaItem.item_id\n      } else if (mediaItem.media_type === 2) {\n        url = '/albums/' + mediaItem.item_id\n      } else if (mediaItem.media_type === 4) {\n        url = '/playlists/' + mediaItem.item_id\n      } else {\n        // assume track (or radio) item\n        this.$server.$emit('showPlayMenu', mediaItem)\n        return\n      }\n      this.$router.push({ path: url, query: { provider: mediaItem.provider } })\n    },\n    menuClick () {\n      // contextmenu button clicked\n      if (this.cancelled) return\n      this.$server.$emit('showContextMenu', this.item)\n    },\n    async toggleLibrary (mediaItem) {\n      // library button clicked on item\n      this.cancelled = true\n      await this.$server.toggleLibrary(mediaItem)\n      this.cancelled = false\n    }\n  }\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListviewItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListviewItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ListviewItem.vue?vue&type=template&id=36620bf4&\"\nimport script from \"./ListviewItem.vue?vue&type=script&lang=js&\"\nexport * from \"./ListviewItem.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemSubtitle } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VBtn,VDivider,VIcon,VListItem,VListItemAction,VListItemAvatar,VListItemContent,VListItemSubtitle,VListItemTitle,VTooltip})\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerOSD.vue?vue&type=style&index=0&id=66faf443&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerOSD.vue?vue&type=style&index=0&id=66faf443&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',_vm._l((_vm.uniqueProviders),function(prov){return _c('img',{key:prov.provider,staticStyle:{\"margin-right\":\"6px\",\"margin-top\":\"6px\"},attrs:{\"height\":_vm.height,\"src\":require('../assets/' + prov.provider + '.png')}})}),0)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n  <div>\r\n  <img\r\n    v-for=\"prov of uniqueProviders\" :key=\"prov.provider\"\r\n    :height=\"height\"\r\n    :src=\"require('../assets/' + prov.provider + '.png')\"\r\n    style=\"margin-right:6px;margin-top:6px;\"\r\n  />\r\n  </div>\r\n</template>\r\n\r\n<script>\r\nimport Vue from 'vue'\r\n\r\nexport default Vue.extend({\r\n  props: {\r\n    providerIds: Array,\r\n    height: Number\r\n  },\r\n  data () {\r\n    return {\r\n      isHiRes: false\r\n    }\r\n  },\r\n  computed: {\r\n    uniqueProviders: function () {\r\n      var output = []\r\n      var keys = []\r\n      if (!this.providerIds) return []\r\n      this.providerIds.forEach(function (prov) {\r\n        var key = prov.provider\r\n        if (keys.indexOf(key) === -1) {\r\n          keys.push(key)\r\n          output.push(prov)\r\n        }\r\n      })\r\n      return output\r\n    }\r\n  },\r\n  mounted () { },\r\n  methods: {\r\n  }\r\n})\r\n</script>\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProviderIcons.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProviderIcons.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ProviderIcons.vue?vue&type=template&id=20bea3a1&\"\nimport script from \"./ProviderIcons.vue?vue&type=script&lang=js&\"\nexport * from \"./ProviderIcons.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","module.exports = __webpack_public_path__ + \"img/tunein.ca1c1bb0.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"img/web.798ba28f.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"img/hires.eabcf7ae.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJEAAABfCAYAAADoOiXnAAAPMElEQVR4nO2de7RUVR3HP3Pv9V5eF71eUEBAEQVBufhM0FziE1NRSi1NqaXlI2v5LmtZUlZqrVo+yJKWWCaRWpLio3yh+UjRRJ4higgJIpgooMCFy0x/fPfunDnMzDkzZ98HuL9rzZqZM/vsfc7Z3/3bv9fek8nlcnh4pEFVe1+Ax7YPTyKP1PAk8kgNTyKP1PAk8kgNTyKP1PAk8kgNTyKP1PAk8kgNTyKP1PAk8kgNTyKP1PAk8kgNTyKP1PAk8kgNTyKP1PAk8kiNGgd1TAJaECFXANeZ7x6fEmQcpMeGK1gADAO2pK3UY9uBC0kUxnrH9bnALkhKrgM+aedr2S7hmkTtjb7AUOAIoBcwCOiP7vN+4LIy66sCsi4vcHuEaxJVO64vKY4BvgwcB/QrUmY00Ah8YL5XAw3A3kAG6AEMBJrM773N72cBi1vlqrcTuCDRBqQDVQMfO6ivHPQFvgV8E+gWU3YQIpglURMwDehDcSs1C3RJf5nbN1yQqAdSrjOITG2lVPcH7kDSJwmqkMSaZb7XIRKWwkb8dBYLFyT6PiJOFbAS+DXFTfzz0cjPmrYfAV6uoM0dgYkkJ5DFsNDnHAH5PVLABYm+F/r8BiJRMVwM7B/6/g6VkWgccEIF541CkvO/FZzrUQSuPdZxOlHUBbCpgjZ2oXwry6I3sFeF53oUwbYY9hiNrKhKUIv0Ig+HcG3ix5HShf5xSpnlNyAnYwbdb4ODa/AIwQWJmpGinEHTUymi5ELvmZiyhVBNcin0MHArsApYbo5VIYvLwyFckKgvAYmylA6+jkWmdRZ16Ooy2+qNTPs4TAPOpu39Vp9KuCDROQQm/vvAFGQFjQQ2mzZmA38DDgZ6Epj4LwGvl9HWAOR1jsMU2pZA1ei+GoAR5j0b+f1NYC56Rq6vrQfQFT33XgXanmNeyxy3C7gh0U2hzwtRB54MXBk6fg8i0XWISBbnEU+izsCeiKh9ifftbERT7JBQuSrgPdyb9gOBrwEHAcOR17xrifIfIrfGdCQtnyE/C6IcZIDDkXQfjfxvOxcpm0P3/gLwKPAEsKTCdreCa8XajrCo3rGhyPEkJv6xwL0EDztOj9oBuBsRx5bNAKcCjydorxyMIN9PFocG82oCvo6u8+eU36F7AtcApyHHaxwySFKONa+3UR7YLTiQim1t4lcy6oYgadSFZHGsaiQRupjzOgOdKmw7DvukOLcb8A3gAeCAMs47B3gSSfEkBCqEAcBPkFQ6tMI6/g/XJComJdKY9uWGNtoShzuoYzgwGRgcU6478CMkQQY4aBeUMvObtJW4JpGtL5oSYklUGzkeN53WUXyeb29kkJRzgaHAj9FUXAzjgWvZ+hmmxRNpK3ChEw0hMNmtznMTcFfo+Efm+NlIBFvl+O2Yug8gP2jakTCYeOlRDj4PHImmqijORukurvE88Iu0lbggURP5ZFmC/Dn7EOQZLUbWUQ9Eoqw5/gGyWIqhkdKjsz1hk9ZcoQYRaTr5JnoT6ug6h22Bnv145HJIBRckujf0+XUkmcaRb+L/CWUe3kK+Incu8PsSdX/OwfVZuJ66e0W+v4s841uARWiwWKIl9bIfjaZImwueAa4q0JYL3IYImxquTXx781FT3n7fHDke/R5FZ+TfaEFTYC3xzsYcsBZlDNjQSguBm8EVjkc+nz8DzwL/RtNzhuC+apD0HQv8APlySqEb+SQ6GJnxSbESmIFcGcuQz+pA5PgdSaCb/h2FhJygrRP1yzWzL0ESzZ53BPBQzDlrkbNzbqRdlytRqlAnXI880cXQgqbx25GkmgzUlyjfkyDfqQq4kOTpudPQ9DQrcnwK6ufRwM3IUPkuQZpwargmkWsTP7rEZ12Cc7JIB1tTYZtJkAVeixzrjkZ+LSLtx+ZlHarTgHlIIhRDHYHu0xM5WpPgDpRr3lzk9xaURTofSfLZCetNBNcksg+gmCkfHVXlKs1JV5O4NoOLYQ9gDHAUsiLr0T3lEOGXo3DPNCQZn6c0iTYRkO4wkgWbX0OmfzEChbEEh+EOCxckOpLAOrMu9NsR8611tsIcvxCJa4s5DtpvD9QBX0Shh2JmfiMi2eHA1cioiEv6X0MgbRuIl+A5FDZZEVOuVeGCRLnIqxQ2I93EkiuLRu5hBNZTBphJ4FvqaOiCAslXxhUMoR4taEgSp7LP8LMJyi5BSnK7wgWJng19tib+RcC3Q8cnI7P/ThTxthiH4jePEES/c6ZMVOfoKBhPeQQKI25tXFjy7JGgvnfpAEvDXftOrGkbjc6XOp4jX8y35dq1cnEqlRMoCdYRSKskz+BV4t0krQ7XJCo2neVifs8W+dyR0Ih0oNZcKt5MMgXZoo4OsG6urUz8uN8zCcq0N5qAQxKUW4G8+E+iFJSjkLNxtwTnhvPOkwzwgxGp23U/KNeSyEa1O0WOd4r8blGLHlo4G3AH2m9jiEKw0vOkBGXnIk/25UjPux/5b05iaydgMVgSzU9Q1u6C0q5wIYlOJzDxbTD1D8j93mLasLtqXIoWH24xx2cgPeALBL6dLK3gy3CAuHX7m5EFNq/Ab7PRVDiV+ECqJVES0u2K9LR2dZW4kETV5hXOr2lG8bLN5t2O5l4oMNkA7ISslVrkO6o3rwbazllYDuIi9ssoHdB8isIEK4ZVJAsTXUo7J+65juKvQeQ4Dfhp6PijSKRPQJLI4iJkjUyK1DkSBRM7AmxHxiWgxa2jaybekgrnhT+PJHJcFmMjyk68gPio/KEok3ISDi1g1zrRpsi7hbW4opF0a+KHkaNjmfi2U1fFlOuDUjmKYSTxCXZrCZTkNSRfWDAQpdSchQZxFDuiae+PaDeV8xLWmwiurbM4E39bRpwUqUWe7CVsHeAcDPyS0suJQFOiTZvJAX9BOVdJpvd+yKk7H3iMwFVQh5T9oQT9/UOkjzrRpba3PRtbE4sSlGlCU/dU4EFkNBwLnIGmkThErdJ/oNSXpDlFVUjaxUm8PiiWdwrJMiNiG3UJO9KiI8ea+NEofg1b6xGZVriuNLDX91TC8n2QWf8E8CJampOEQFDYo389rRNgHUXlW/TkwdVm6HYtvk10mok2u7Kmv93I6m5klubQqHsLjYTJofrC9XQkzELZi+X4Zcp1nL5b4NhMZKTcgnv/2dVIgX86TSUuSHRD6LNViF9GS6otbKrqdGTG2+i91QEeJtCbqpGC2dHwERoEN8QVbAVMRBmJ43FLpK6m7kFpKnFBorCusBr5fC5BN2zxOErPnEi++/8ClMpwT6TOEcRbQ+2BW1EY4/hWqr/YNN6CpFELeq4uV36kXtfXVrqHHT1R072YKZ8mCOsyKLlDpK71aP3XPyuo60PypXMhlNpwIgvcCHyJ8nZSKYVXgDPTVtJaUfxCvp9Cx0vVUQhxG2i9h0zcJAHJJJtsvVegrkXAV9AUnJTsq9G6+xkx5eJWpOSQ1XccctxW6pBdhFbcnkzhxZJlYVsz8ZvR6FmHLJeX0APZjDp8ofktyW5oWdQJy5Fjz9Zt61tuPheaVt9CI/hEtDp1OIWTyBaj7WN+hZLsDkJ/orOSIJl/PlKo30e77ybBMhTuuBmpCWPRTiHFNjXdhEIuC1C+91M4NF5c/8vQJmTOX4+WpVi8iFJgV5If9rgQ6URLI3WOoPCotUnwLlIfapGSv47KdrENYzfUgTl0fx+ia1yIyG1hXRyt8Uc6jYjM9l8AuiNi5pCEe5X091kQLiTRbQRr6/9jPj9H/vqqmeb3x5EfxZr4K9ADDftg7D8CFYLLLL5NuBuNywn2hSyF1vwXpg9wtKK1XLiQRFEH4nokMcLLgbag6aIXAXGtP6gZLTcOYyUdIO3TIxlcKNarQ683CdaPh49PNWWfRiJ+IbIwjkZTwcLQayalk9T7oGh0JWauTVspB23lQQ+348oXZFN0WhUuHk5d6GWlUk3kuA172B3M7MuGPcLHusVc11XIMuqH9JpiU3KhjhiDNoqySHL/9ShCbvOJ0j4zS5bodY8CfoY84hMi5Qsh7jqGokhAseCts4HheoRZv090jsxGfqdIuUJlwtgZ+CrSvY4B/oXCK6ORFTQRdfoZSC+bQn5GYj2aOnsDf0XK+yiUs3MH8sN0RQsTp6NQQzcUha8FrjD1XmuO34ik63lIsX4ArXgNB0B7mut4BmVwDgK+Y9odj8g0wbwGoryl3iil4zZkMZ4beQ7nI0X5VhRGmmTu5XSkUN+FpP9+iIQXAfehvQxq0VY1r6Ct+1KjIwU6k2ADUsafRg97FzT93YAe3hgUVLwGec7HkJ87k0Vm9QWo0+ejlNbzUaT8RPQnemci8u2PSLUG7a5xBeqEy5Cv5lSk5w03ZY9AS5/3DLXZH9gdWU/j0EDYG0ndQ9CWO59BMSz7h8xZ9Ac4JyDSXkwwfe+EArwvmns8GbkOXkUW8fHmel4y93ogIs0ByCVwFHJYLkD7IUXz4cuGaxLZxXlRfaVL5HeLmgLXUGo624B0qaXIunoFLdluRPG2tWjk1RMsSQ5fi3UwdkfB1KmITG8jqdYJdewcpMv1NNezBeluPZAxYFfxzkCLB3uZa5uLDIJwNuIwcw0bCaYwu/FDMyLUYpQhaqf3KjRI3jDHu4TO7YcGz0MoKNzXnH8nIuHuSDe1i0obEZnsHtq7mvv9nXlPbaG7MPEfI3/7vBxiefj4c6bsfeSP0hXIp/IgwYhYT+kclxr0gD9GD7cK5d3sjTryBeRn6o9GdNgHZTtoHpqy9kWrMjoTbAO4ET14u5F7jalnNuqILsicX4c6cCMiST0imd1LycLmlK8icG8MRyuFF6Jp9S4kLV43bdnrHojIMY/APbAASd+bzf1ejqbJ35r6piPJuh8aSAvN+dYFM9NczwREvnLWuRWECxO/rTEMddwnaFTOQFNEE5JEc1FnDkMdPYsgnNAHSYGlBFPVHHPeQaiD7UMehki+1Jz3FpIwA9DmVm8i4vZBnu01iBg1pk47EDoR/MfbBtRxAxDplqNMyH0R2d5Bg8q2NxhJndnkb0u4BxqMKxGp9kKEttJmiDlvNZK4vU2b80w9Q0wb83CQy74tksijg2FbU6w9OiA8iTxSw5PIIzU8iTxSw5PIIzU8iTxSw5PIIzU8iTxSw5PIIzU8iTxSw5PIIzU8iTxSw5PIIzU8iTxSw5PIIzU8iTxSw5PIIzU8iTxSw5PIIzX+B1yXSRtpspd4AAAAAElFTkSuQmCC\""],"sourceRoot":""}
\ No newline at end of file
diff --git a/music_assistant/web/js/app.d45df414.js b/music_assistant/web/js/app.d45df414.js
deleted file mode 100644 (file)
index 6f4c8e1..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-(function(e){function t(t){for(var i,r,o=t[0],l=t[1],c=t[2],u=0,d=[];u<o.length;u++)r=o[u],Object.prototype.hasOwnProperty.call(n,r)&&n[r]&&d.push(n[r][0]),n[r]=0;for(i in l)Object.prototype.hasOwnProperty.call(l,i)&&(e[i]=l[i]);p&&p(t);while(d.length)d.shift()();return s.push.apply(s,c||[]),a()}function a(){for(var e,t=0;t<s.length;t++){for(var a=s[t],i=!0,r=1;r<a.length;r++){var o=a[r];0!==n[o]&&(i=!1)}i&&(s.splice(t--,1),e=l(l.s=a[0]))}return e}var i={},r={app:0},n={app:0},s=[];function o(e){return l.p+"js/"+({config:"config","itemdetails~playerqueue~search":"itemdetails~playerqueue~search",itemdetails:"itemdetails",playerqueue:"playerqueue",search:"search"}[e]||e)+"."+{config:"165ed655","itemdetails~playerqueue~search":"3c623cdf",itemdetails:"79b5fa05",playerqueue:"84a8618a",search:"31a9bea8"}[e]+".js"}function l(t){if(i[t])return i[t].exports;var a=i[t]={i:t,l:!1,exports:{}};return e[t].call(a.exports,a,a.exports,l),a.l=!0,a.exports}l.e=function(e){var t=[],a={config:1,"itemdetails~playerqueue~search":1,itemdetails:1};r[e]?t.push(r[e]):0!==r[e]&&a[e]&&t.push(r[e]=new Promise((function(t,a){for(var i="css/"+({config:"config","itemdetails~playerqueue~search":"itemdetails~playerqueue~search",itemdetails:"itemdetails",playerqueue:"playerqueue",search:"search"}[e]||e)+"."+{config:"2956469c","itemdetails~playerqueue~search":"133d2876",itemdetails:"28909c9e",playerqueue:"31d6cfe0",search:"31d6cfe0"}[e]+".css",n=l.p+i,s=document.getElementsByTagName("link"),o=0;o<s.length;o++){var c=s[o],u=c.getAttribute("data-href")||c.getAttribute("href");if("stylesheet"===c.rel&&(u===i||u===n))return t()}var d=document.getElementsByTagName("style");for(o=0;o<d.length;o++){c=d[o],u=c.getAttribute("data-href");if(u===i||u===n)return t()}var p=document.createElement("link");p.rel="stylesheet",p.type="text/css",p.onload=t,p.onerror=function(t){var i=t&&t.target&&t.target.src||n,s=new Error("Loading CSS chunk "+e+" failed.\n("+i+")");s.code="CSS_CHUNK_LOAD_FAILED",s.request=i,delete r[e],p.parentNode.removeChild(p),a(s)},p.href=n;var m=document.getElementsByTagName("head")[0];m.appendChild(p)})).then((function(){r[e]=0})));var i=n[e];if(0!==i)if(i)t.push(i[2]);else{var s=new Promise((function(t,a){i=n[e]=[t,a]}));t.push(i[2]=s);var c,u=document.createElement("script");u.charset="utf-8",u.timeout=120,l.nc&&u.setAttribute("nonce",l.nc),u.src=o(e);var d=new Error;c=function(t){u.onerror=u.onload=null,clearTimeout(p);var a=n[e];if(0!==a){if(a){var i=t&&("load"===t.type?"missing":t.type),r=t&&t.target&&t.target.src;d.message="Loading chunk "+e+" failed.\n("+i+": "+r+")",d.name="ChunkLoadError",d.type=i,d.request=r,a[1](d)}n[e]=void 0}};var p=setTimeout((function(){c({type:"timeout",target:u})}),12e4);u.onerror=u.onload=c,document.head.appendChild(u)}return Promise.all(t)},l.m=e,l.c=i,l.d=function(e,t,a){l.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},l.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,t){if(1&t&&(e=l(e)),8&t)return e;if(4&t&&"object"===typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(l.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)l.d(a,i,function(t){return e[t]}.bind(null,i));return a},l.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return l.d(t,"a",t),t},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.p="",l.oe=function(e){throw e};var c=window["webpackJsonp"]=window["webpackJsonp"]||[],u=c.push.bind(c);c.push=t,c=c.slice();for(var d=0;d<c.length;d++)t(c[d]);var p=u;s.push([0,"chunk-vendors"]),a()})({0:function(e,t,a){e.exports=a("56d7")},"034f":function(e,t,a){"use strict";var i=a("85ec"),r=a.n(i);r.a},"0863":function(e,t,a){e.exports=a.p+"img/qobuz.c7eb9a76.png"},"0c3b":function(e,t,a){e.exports=a.p+"img/spotify.1f3fb1af.png"},"0dac":function(e,t,a){"use strict";var i=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("section",[a("v-app-bar",{staticStyle:{"margin-bottom":"-8px"},attrs:{flat:"",light:"",dense:"",color:"transparent"}},[a("v-label",{attrs:{light:""}},[e._v(e._s(e.items.length+" "+e.$t("items")))]),a("v-spacer"),a("v-menu",{attrs:{left:"","close-on-content-click":!1},scopedSlots:e._u([{key:"activator",fn:function(t){var i=t.on;return[a("v-btn",e._g({attrs:{icon:""}},i),[a("v-icon",[e._v("sort")])],1)]}}])},[a("v-list",e._l(e.sortKeys,(function(t){return a("v-list-item",{key:t.value,domProps:{textContent:e._s(t.text)},on:{click:function(a){e.sortBy=t.value}}})})),1)],1),a("v-btn",{attrs:{icon:""},on:{click:function(t){e.sortDesc=!e.sortDesc}}},[e.sortDesc?e._e():a("v-icon",[e._v("arrow_upward")]),e.sortDesc?a("v-icon",[e._v("arrow_downward")]):e._e()],1),a("v-menu",{attrs:{left:"","close-on-content-click":!1},scopedSlots:e._u([{key:"activator",fn:function(t){var i=t.on;return[a("v-btn",e._g({attrs:{icon:""}},i),[a("v-icon",[e._v("search")])],1)]}}])},[a("v-card",[a("v-text-field",{attrs:{clearable:"","prepend-inner-icon":"search",label:"Search","hide-details":"",solo:"",dense:""},model:{value:e.search,callback:function(t){e.search=t},expression:"search"}})],1)],1),a("v-btn",{staticStyle:{"margin-right":"-15px"},attrs:{icon:""},on:{click:function(t){return e.toggleViewMode()}}},["panel"==e.viewMode?a("v-icon",[e._v("view_list")]):e._e(),"list"==e.viewMode?a("v-icon",[e._v("grid_on")]):e._e()],1)],1),a("v-data-iterator",{attrs:{items:e.items,search:e.search,"sort-by":e.sortBy,"sort-desc":e.sortDesc,"custom-filter":e.filteredItems,"hide-default-footer":"","disable-pagination":"",loading:""},scopedSlots:e._u([{key:"default",fn:function(t){return["panel"==e.viewMode?a("v-container",{attrs:{fluid:""}},[a("v-row",{attrs:{dense:"","align-content":"stretch",align:"stretch"}},e._l(t.items,(function(t){return a("v-col",{key:t.item_id,attrs:{"align-self":"stretch"}},[a("PanelviewItem",{attrs:{item:t,thumbWidth:e.thumbWidth,thumbHeight:e.thumbHeight}})],1)})),1)],1):e._e(),"list"==e.viewMode?a("v-list",{attrs:{"two-line":""}},[a("RecycleScroller",{staticClass:"scroller",attrs:{items:t.items,"item-size":72,"key-field":"item_id","page-mode":""},scopedSlots:e._u([{key:"default",fn:function(t){var i=t.item;return[a("ListviewItem",{attrs:{item:i,hideavatar:3==i.media_type&&e.$store.isMobile,hidetracknum:!0,hideproviders:i.media_type<4&&e.$store.isMobile,hidelibrary:!0,hidemenu:3==i.media_type&&e.$store.isMobile,hideduration:5==i.media_type}})]}}],null,!0)})],1):e._e()]}}])})],1)},r=[],n=(a("caad"),a("b0c0"),a("2532"),a("54f8")),s=(a("96cf"),a("c964")),o=a("d3cc"),l=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("v-card",{directives:[{name:"longpress",rawName:"v-longpress",value:e.menuClick,expression:"menuClick"}],attrs:{light:"","min-height":e.thumbHeight,"min-width":e.thumbWidth,"max-width":1.6*e.thumbWidth,hover:"",outlined:""},on:{click:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:void(e.onclickHandler?e.onclickHandler(e.item):e.itemClicked(e.item))},contextmenu:[e.menuClick,function(e){e.preventDefault()}]}},[i("v-img",{attrs:{src:e.$server.getImageUrl(e.item,"image",e.thumbWidth),width:"100%","aspect-ratio":"1"}}),e.isHiRes?i("div",{staticStyle:{position:"absolute","margin-left":"5px","margin-top":"-13px",height:"30px","background-color":"white","border-radius":"3px"}},[i("v-tooltip",{attrs:{bottom:""},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on;return[i("img",e._g({attrs:{src:a("f5e3"),height:"25"}},r))]}}],null,!1,1400808392)},[i("span",[e._v(e._s(e.isHiRes))])])],1):e._e(),i("v-divider"),i("v-card-title",{class:e.$store.isMobile?"body-2":"title",staticStyle:{padding:"8px",color:"primary","margin-top":"8px"},domProps:{textContent:e._s(e.item.name)}}),e.item.artist?i("v-card-subtitle",{class:e.$store.isMobile?"caption":"body-1",staticStyle:{padding:"8px"},domProps:{textContent:e._s(e.item.artist.name)}}):e._e(),e.item.artists?i("v-card-subtitle",{class:e.$store.isMobile?"caption":"body-1",staticStyle:{padding:"8px"},domProps:{textContent:e._s(e.item.artists[0].name)}}):e._e()],1)},c=[],u=(a("4160"),a("a9e3"),a("2b0e")),d=600;u["a"].directive("longpress",{bind:function(e,t,a){var i=t.value;if("function"===typeof i){var r=null,n=function(e){"click"===e.type&&0!==e.button||null===r&&(r=setTimeout((function(){return i(e)}),d))},s=function(){null!==r&&(clearTimeout(r),r=null)};["mousedown","touchstart"].forEach((function(t){return e.addEventListener(t,n)})),["click","mouseout","touchend","touchcancel"].forEach((function(t){return e.addEventListener(t,s)}))}else u["a"].$log.warn("Expect a function, got ".concat(i))}});var p=u["a"].extend({components:{},props:{item:Object,thumbHeight:Number,thumbWidth:Number,hideproviders:Boolean,hidelibrary:Boolean,onclickHandler:null},data:function(){return{touchMoving:!1,cancelled:!1}},computed:{isHiRes:function(){var e,t=Object(n["a"])(this.item.provider_ids);try{for(t.s();!(e=t.n()).done;){var a=e.value;if(a.quality>6)return a.details?a.details:7===a.quality?"44.1/48khz 24 bits":8===a.quality?"88.2/96khz 24 bits":9===a.quality?"176/192khz 24 bits":"+192kHz 24 bits"}}catch(i){t.e(i)}finally{t.f()}return""}},created:function(){},beforeDestroy:function(){this.cancelled=!0},mounted:function(){},methods:{itemClicked:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t="";if(1===e.media_type)t="/artists/"+e.item_id;else if(2===e.media_type)t="/albums/"+e.item_id;else{if(4!==e.media_type)return void this.$server.$emit("showPlayMenu",e);t="/playlists/"+e.item_id}this.$router.push({path:t,query:{provider:e.provider}})},menuClick:function(){this.cancelled||this.$server.$emit("showContextMenu",this.item)},toggleLibrary:function(e){var t=this;return Object(s["a"])(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return t.cancelled=!0,a.next=3,t.$server.toggleLibrary(e);case 3:t.cancelled=!1;case 4:case"end":return a.stop()}}),a)})))()}}}),m=p,h=a("2877"),v=a("6544"),f=a.n(v),g=a("b0af"),y=a("99d9"),b=a("ce7e"),A=a("adda"),k=a("3a2f"),w=Object(h["a"])(m,l,c,!1,null,null,null),I=w.exports;f()(w,{VCard:g["a"],VCardSubtitle:y["a"],VCardTitle:y["c"],VDivider:b["a"],VImg:A["a"],VTooltip:k["a"]});var x={components:{ListviewItem:o["a"],PanelviewItem:I},props:["mediatype","endpoint"],data:function(){return{items:[],viewMode:"list",search:"",sortDesc:!1,sortBy:"name",sortKeys:[{text:this.$t("sort_name"),value:"name"}]}},created:function(){this.endpoint.includes("playlists/")?(this.sortKeys.push({text:this.$t("sort_position"),value:"position"}),this.sortKeys.push({text:this.$t("sort_artist"),value:"artists[0].name"}),this.sortKeys.push({text:this.$t("sort_album"),value:"album.name"}),this.sortBy="position",this.viewMode="list"):this.endpoint.includes("tracks")?(this.sortKeys.push({text:this.$t("sort_artist"),value:"artists[0].name"}),this.sortKeys.push({text:this.$t("sort_album"),value:"album.name"}),this.viewMode="list"):this.endpoint.includes("albums")?(this.sortKeys.push({text:this.$t("sort_artist"),value:"artist.name"}),this.sortKeys.push({text:this.$t("sort_date"),value:"year"}),this.viewMode="panel"):this.viewMode="list";var e=localStorage.getItem("viewMode"+this.mediatype+this.endpoint);null!==e&&(this.viewMode=e),this.getItems(),this.$server.$on("refresh_listing",this.getItems)},computed:{thumbWidth:function(){return this.$store.isMobile?120:175},thumbHeight:function(){return 1.5*this.thumbWidth}},methods:{getItems:function(){var e=this;return Object(s["a"])(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,e.$server.getAllItems(e.endpoint,e.items);case 2:case"end":return t.stop()}}),t)})))()},toggleViewMode:function(){"panel"===this.viewMode?this.viewMode="list":this.viewMode="panel",localStorage.setItem("viewMode"+this.mediatype+this.endpoint,this.viewMode)},filteredItems:function(e,t){if(!t)return e;t=t.toLowerCase();var a,i=[],r=Object(n["a"])(e);try{for(r.s();!(a=r.n()).done;){var s=a.value;(s.name.toLowerCase().includes(t)||s.artist&&s.artist.name.toLowerCase().includes(t)||s.album&&s.album.name.toLowerCase().includes(t)||s.artists&&s.artists[0].name.toLowerCase().includes(t))&&i.push(s)}}catch(o){r.e(o)}finally{r.f()}return i}}},_=x,S=(a("a548"),a("40dc")),C=a("8336"),D=a("62ad"),P=a("a523"),R=a("c3774"),B=a("132d"),O=a("24c9"),M=a("8860"),E=a("da13"),H=a("e449"),F=a("0fd9b"),L=a("2fa4"),J=a("8654"),V=Object(h["a"])(_,i,r,!1,null,"764b0c8e",null);t["a"]=V.exports;f()(V,{VAppBar:S["a"],VBtn:C["a"],VCard:g["a"],VCol:D["a"],VContainer:P["a"],VDataIterator:R["a"],VIcon:B["a"],VLabel:O["a"],VList:M["a"],VListItem:E["a"],VMenu:H["a"],VRow:F["a"],VSpacer:L["a"],VTextField:J["a"]})},"26ea":function(e,t,a){e.exports=a.p+"img/demo_player.c079bd97.png"},2755:function(e,t,a){e.exports=a.p+"img/http_streamer.4c4e4880.png"},3232:function(e,t,a){e.exports=a.p+"img/homeassistant.29fe3282.png"},"3d05":function(e,t,a){e.exports=a.p+"img/webplayer.8e1a0da9.png"},"49f8":function(e,t,a){var i={"./en.json":"edd4","./nl.json":"a625"};function r(e){var t=n(e);return a(t)}function n(e){if(!a.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=n,e.exports=r,r.id="49f8"},"4bfb":function(e,t,a){e.exports=a.p+"img/default_artist.7305b29c.png"},"4f9f":function(e,t,a){"use strict";var i=a("691f"),r=a.n(i);r.a},"56d7":function(e,t,a){"use strict";a.r(t);a("e623"),a("e379"),a("5dc8"),a("37e1");var i=a("2b0e"),r=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-app",[a("TopBar"),a("NavigationMenu"),a("v-main",[a("router-view",{key:e.$route.path,attrs:{app:""}})],1),a("PlayerOSD",{attrs:{showPlayerSelect:e.showPlayerSelect}}),a("ContextMenu"),a("PlayerSelect"),a("v-overlay",{attrs:{value:e.$store.loading}},[a("v-progress-circular",{attrs:{indeterminate:"",size:"64"}})],1)],1)},n=[],s=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-navigation-drawer",{attrs:{dark:"",app:"",clipped:"",temporary:""},model:{value:e.$store.showNavigationMenu,callback:function(t){e.$set(e.$store,"showNavigationMenu",t)},expression:"$store.showNavigationMenu"}},[a("v-list",[e._l(e.items,(function(t){return a("v-list-item",{key:t.title,on:{click:function(a){return e.$router.push(t.path)}}},[a("v-list-item-action",[a("v-icon",[e._v(e._s(t.icon))])],1),a("v-list-item-content",[a("v-list-item-title",[e._v(e._s(t.title))])],1)],1)})),a("v-btn",{attrs:{icon:""},on:{click:function(t){e.$store.showNavigationMenu=!e.$store.showNavigationMenu}}})],2)],1)},o=[],l=i["a"].extend({props:{},data:function(){return{items:[{title:this.$t("home"),icon:"home",path:"/"},{title:this.$t("artists"),icon:"person",path:"/artists"},{title:this.$t("albums"),icon:"album",path:"/albums"},{title:this.$t("tracks"),icon:"audiotrack",path:"/tracks"},{title:this.$t("playlists"),icon:"playlist_play",path:"/playlists"},{title:this.$t("radios"),icon:"radio",path:"/radios"},{title:this.$t("search"),icon:"search",path:"/search"},{title:this.$t("settings"),icon:"settings",path:"/config"}]}},mounted:function(){},methods:{}}),c=l,u=a("2877"),d=a("6544"),p=a.n(d),m=a("8336"),h=a("132d"),v=a("8860"),f=a("da13"),g=a("1800"),y=a("5d23"),b=a("f774"),A=Object(u["a"])(c,s,o,!1,null,null,null),k=A.exports;p()(A,{VBtn:m["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAction:g["a"],VListItemContent:y["a"],VListItemTitle:y["c"],VNavigationDrawer:b["a"]});var w=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-app-bar",{attrs:{app:"",flat:"",dense:"",dark:"",color:e.color}},[a("v-layout",[e.$store.topBarTransparent?e._e():a("div",{staticClass:"body-1",staticStyle:{position:"fixed",width:"100%","text-align":"center","vertical-align":"center","margin-top":"11px"}},[e._v(e._s(e.$store.windowtitle))]),a("v-btn",{staticStyle:{"margin-left":"-13px"},attrs:{icon:""},on:{click:function(t){e.$store.showNavigationMenu=!e.$store.showNavigationMenu}}},[a("v-icon",[e._v("menu")])],1),a("v-btn",{attrs:{icon:""},on:{click:function(t){return e.$router.go(-1)}}},[a("v-icon",[e._v("arrow_back")])],1),a("v-spacer"),e.$store.topBarContextItem?a("v-btn",{staticStyle:{"margin-right":"-23px"},attrs:{icon:""},on:{click:function(t){return e.$server.$emit("showContextMenu",e.$store.topBarContextItem)}}},[a("v-icon",[e._v("more_vert")])],1):e._e()],1)],1)},I=[],x=i["a"].extend({props:{},data:function(){return{}},computed:{color:function(){return this.$store.topBarTransparent?"transparent":"black"}},mounted:function(){},methods:{}}),_=x,S=a("40dc"),C=a("a722"),D=a("2fa4"),P=Object(u["a"])(_,w,I,!1,null,null,null),R=P.exports;p()(P,{VAppBar:S["a"],VBtn:m["a"],VIcon:h["a"],VLayout:C["a"],VSpacer:D["a"]});var B=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-dialog",{attrs:{"max-width":"500px"},on:{input:function(t){return e.$emit("input",t)}},model:{value:e.visible,callback:function(t){e.visible=t},expression:"visible"}},[a("v-card",[0===e.playlists.length?a("v-list",[a("v-subheader",{staticClass:"title"},[e._v(e._s(e.header))]),e.subheader?a("v-subheader",[e._v(e._s(e.subheader))]):e._e(),e._l(e.menuItems,(function(t){return a("div",{key:t.label},[a("v-list-item",{on:{click:function(a){return e.itemCommand(t.action)}}},[a("v-list-item-avatar",[a("v-icon",[e._v(e._s(t.icon))])],1),a("v-list-item-content",[a("v-list-item-title",[e._v(e._s(e.$t(t.label)))])],1)],1),a("v-divider")],1)}))],2):e._e(),e.playlists.length>0?a("v-list",[a("v-subheader",{staticClass:"title"},[e._v(e._s(e.header))]),e._l(e.playlists,(function(t,i){return a("listviewItem",{key:t.item_id,attrs:{item:t,totalitems:e.playlists.length,index:i,hideavatar:!1,hidetracknum:!0,hideproviders:!1,hidelibrary:!0,hidemenu:!0,onclickHandler:e.addToPlaylist}})}))],2):e._e()],1)],1)},O=[],M=(a("caad"),a("b0c0"),a("2532"),a("54f8")),E=(a("96cf"),a("c964")),H=a("d3cc"),F=i["a"].extend({components:{ListviewItem:H["a"]},props:{},watch:{},data:function(){return{visible:!1,menuItems:[],header:"",subheader:"",curItem:null,curPlaylist:null,playerQueueItems:[],playlists:[]}},mounted:function(){},created:function(){this.$server.$on("showContextMenu",this.showContextMenu),this.$server.$on("showPlayMenu",this.showPlayMenu)},computed:{},methods:{showContextMenu:function(e){if(this.playlists=[],e){this.curItem=e;var t=this.$store.topBarContextItem,a=[];e!==t&&a.push({label:"show_info",action:"info",icon:"info"}),0===e.in_library.length&&a.push({label:"add_library",action:"toggle_library",icon:"favorite_border"}),e.in_library.length>0&&a.push({label:"remove_library",action:"toggle_library",icon:"favorite"}),t&&4===t.media_type&&(this.curPlaylist=t,3===e.media_type&&t.is_editable&&a.push({label:"remove_playlist",action:"remove_playlist",icon:"remove_circle_outline"})),3===e.media_type&&a.push({label:"add_playlist",action:"add_playlist",icon:"add_circle_outline"}),this.menuItems=a,this.header=e.name,this.subheader="",this.visible=!0}},showPlayMenu:function(e){if(this.playlists=[],this.curItem=e,e){var t=[{label:"play_now",action:"play",icon:"play_circle_outline"},{label:"play_next",action:"next",icon:"queue_play_next"},{label:"add_queue",action:"add",icon:"playlist_add"}];this.menuItems=t,this.header=e.name,this.subheader="",this.visible=!0}},showPlaylistsMenu:function(){var e=this;return Object(E["a"])(regeneratorRuntime.mark((function t(){var a,i,r,n,s,o,l,c,u,d,p,m;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:a=[],i=Object(M["a"])(e.curItem.provider_ids);try{for(i.s();!(r=i.n()).done;)n=r.value,a.push(n.provider)}catch(h){i.e(h)}finally{i.f()}return t.next=5,e.$server.getData("library/playlists");case 5:s=t.sent,o=[],l=Object(M["a"])(s.items),t.prev=8,l.s();case 10:if((c=l.n()).done){t.next=33;break}if(u=c.value,!u.is_editable||e.curPlaylist&&u.item_id===e.curPlaylist.item_id){t.next=31;break}d=Object(M["a"])(u.provider_ids),t.prev=14,d.s();case 16:if((p=d.n()).done){t.next=23;break}if(m=p.value,!a.includes(m.provider)){t.next=21;break}return o.push(u),t.abrupt("break",23);case 21:t.next=16;break;case 23:t.next=28;break;case 25:t.prev=25,t.t0=t["catch"](14),d.e(t.t0);case 28:return t.prev=28,d.f(),t.finish(28);case 31:t.next=10;break;case 33:t.next=38;break;case 35:t.prev=35,t.t1=t["catch"](8),l.e(t.t1);case 38:return t.prev=38,l.f(),t.finish(38);case 41:e.playlists=o;case 42:case"end":return t.stop()}}),t,null,[[8,35,38,41],[14,25,28,31]])})))()},itemCommand:function(e){if("info"===e){var t="";1===this.curItem.media_type&&(t="artists"),2===this.curItem.media_type&&(t="albums"),3===this.curItem.media_type&&(t="tracks"),4===this.curItem.media_type&&(t="playlists"),5===this.curItem.media_type&&(t="radios"),this.$router.push({path:"/"+t+"/"+this.curItem.item_id,query:{provider:this.curItem.provider}}),this.visible=!1}else{if("playmenu"===e)return this.showPlayMenu(this.curItem);if("add_playlist"===e)return this.showPlaylistsMenu();"remove_playlist"===e?(this.removeFromPlaylist(this.curItem,this.curPlaylist.item_id,"playlist_remove"),this.visible=!1):"toggle_library"===e?(this.$server.toggleLibrary(this.curItem),this.visible=!1):(this.$server.playItem(this.curItem,e),this.visible=!1)}},addToPlaylist:function(e){var t=this,a="playlists/"+e.item_id+"/tracks";this.$server.putData(a,this.curItem).then((function(e){t.visible=!1}))},removeFromPlaylist:function(e,t){var a=this,i="playlists/"+t+"/tracks";this.$server.deleteData(i,e).then((function(e){a.$server.$emit("refresh_listing")}))}}}),L=F,J=a("b0af"),V=a("169a"),z=a("ce7e"),N=a("8270"),j=a("e0c7"),Y=Object(u["a"])(L,B,O,!1,null,null,null),T=Y.exports;p()(Y,{VCard:J["a"],VDialog:V["a"],VDivider:z["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAvatar:N["a"],VListItemContent:y["a"],VListItemTitle:y["c"],VSubheader:j["a"]});var U=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("v-footer",{staticStyle:{"background-color":"black"},attrs:{app:"",fixed:"",padless:"",light:"",elevation:"10"}},[e.$store.isMobile?e._e():i("v-card",{staticStyle:{"margin-top":"1px"},attrs:{dense:"",flat:"",light:"",subheader:"",tile:"",width:"100%",color:"#E0E0E0"}},[i("v-list-item",{attrs:{"two-line":""}},[e.curQueueItem?i("v-list-item-avatar",{attrs:{tile:""}},[i("img",{staticStyle:{border:"1px solid rgba(0,0,0,.54)"},attrs:{src:e.$server.getImageUrl(e.curQueueItem),"lazy-src":a("71db")}})]):i("v-list-item-avatar",[i("v-icon",[e._v("speaker")])],1),i("v-list-item-content",[e.curQueueItem?i("v-list-item-title",[e._v(" "+e._s(e.curQueueItem.name))]):e.$server.activePlayer?i("v-list-item-title",[e._v(" "+e._s(e.$server.activePlayer.name))]):e._e(),e.curQueueItem?i("v-list-item-subtitle",{staticStyle:{color:"primary"}},e._l(e.curQueueItem.artists,(function(t,a){return i("span",{key:a},[i("a",{on:{click:[function(a){return e.artistClick(t)},function(e){e.stopPropagation()}]}},[e._v(e._s(t.name))]),a+1<e.curQueueItem.artists.length?i("label",{key:a},[e._v(" / ")]):e._e()])})),0):e._e()],1),e.streamDetails?i("v-list-item-action",[i("v-menu",{attrs:{"close-on-content-click":!1,"nudge-width":250,"offset-x":"",top:""},nativeOn:{click:function(e){e.preventDefault()}},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on;return[i("v-btn",e._g({attrs:{icon:""}},r),[e.streamDetails.quality>6?i("v-img",{attrs:{contain:"",src:a("f5e3"),height:"30"}}):e._e(),e.streamDetails.quality<=6?i("v-img",{staticStyle:{filter:"invert(100%)"},attrs:{contain:"",src:e.streamDetails.content_type?a("9e01")("./"+e.streamDetails.content_type+".png"):"",height:"30"}}):e._e()],1)]}}],null,!1,872579316)},[e.streamDetails?i("v-list",[i("v-subheader",{staticClass:"title"},[e._v(e._s(e.$t("stream_details")))]),i("v-list-item",{attrs:{tile:"",dense:""}},[i("v-list-item-icon",[i("v-img",{attrs:{"max-width":"50",contain:"",src:e.streamDetails.provider?a("9e01")("./"+e.streamDetails.provider+".png"):""}})],1),i("v-list-item-content",[i("v-list-item-title",[e._v(e._s(e.streamDetails.provider))])],1)],1),i("v-divider"),i("v-list-item",{attrs:{tile:"",dense:""}},[i("v-list-item-icon",[i("v-img",{staticStyle:{filter:"invert(100%)"},attrs:{"max-width":"50",contain:"",src:e.streamDetails.content_type?a("9e01")("./"+e.streamDetails.content_type+".png"):""}})],1),i("v-list-item-content",[i("v-list-item-title",[e._v(e._s(e.streamDetails.sample_rate/1e3)+" kHz / "+e._s(e.streamDetails.bit_depth)+" bits ")])],1)],1),i("v-divider"),e.playerQueueDetails.crossfade_enabled?i("div",[i("v-list-item",{attrs:{tile:"",dense:""}},[i("v-list-item-icon",[i("v-img",{attrs:{"max-width":"50",contain:"",src:a("e7af")}})],1),i("v-list-item-content",[i("v-list-item-title",[e._v(e._s(e.$t("crossfade_enabled")))])],1)],1),i("v-divider")],1):e._e(),e.streamVolumeLevelAdjustment?i("div",[i("v-list-item",{attrs:{tile:"",dense:""}},[i("v-list-item-icon",[i("v-icon",{staticStyle:{"margin-left":"13px"},attrs:{color:"black"}},[e._v("volume_up")])],1),i("v-list-item-content",[i("v-list-item-title",{staticStyle:{"margin-left":"12px"}},[e._v(e._s(e.streamVolumeLevelAdjustment))])],1)],1),i("v-divider")],1):e._e()],1):e._e()],1)],1):e._e()],1),i("div",{staticClass:"body-2",staticStyle:{height:"30px",width:"100%",color:"rgba(0,0,0,.65)","margin-top":"-12px","background-color":"#E0E0E0"},attrs:{align:"center"}},[e.curQueueItem?i("div",{staticStyle:{height:"12px","margin-left":"22px","margin-right":"20px","margin-top":"2px"}},[i("span",{staticClass:"left"},[e._v(" "+e._s(e.playerCurTimeStr)+" ")]),i("span",{staticClass:"right"},[e._v(" "+e._s(e.playerTotalTimeStr)+" ")])]):e._e()]),e.curQueueItem?i("v-progress-linear",{style:"margin-top:-22px;margin-left:80px;width:"+e.progressBarWidth+"px;",attrs:{fixed:"",light:"",value:e.progress}}):e._e()],1),i("v-list-item",{staticStyle:{height:"62px","margin-bottom":"5px","margin-top":"-4px","background-color":"black"},attrs:{dark:"",dense:""}},[e.$server.activePlayer?i("v-list-item-action",{staticStyle:{"margin-top":"15px"}},[i("v-btn",{attrs:{small:"",icon:""},on:{click:function(t){return e.playerCommand("previous")}}},[i("v-icon",[e._v("skip_previous")])],1)],1):e._e(),e.$server.activePlayer?i("v-list-item-action",{staticStyle:{"margin-left":"-32px","margin-top":"15px"}},[i("v-btn",{attrs:{icon:"","x-large":""},on:{click:function(t){return e.playerCommand("play_pause")}}},[i("v-icon",{attrs:{size:"50"}},[e._v(e._s("playing"==e.$server.activePlayer.state?"pause":"play_arrow"))])],1)],1):e._e(),e.$server.activePlayer?i("v-list-item-action",{staticStyle:{"margin-top":"15px"}},[i("v-btn",{attrs:{icon:"",small:""},on:{click:function(t){return e.playerCommand("next")}}},[i("v-icon",[e._v("skip_next")])],1)],1):e._e(),i("v-list-item-content"),e.$server.activePlayer?i("v-list-item-action",{staticStyle:{padding:"28px"}},[i("v-btn",{attrs:{text:"",icon:""},on:{click:function(t){return e.$router.push("/playerqueue/")}}},[i("v-flex",{staticClass:"vertical-btn",attrs:{xs12:""}},[i("v-icon",[e._v("queue_music")]),i("span",{staticClass:"caption",staticStyle:{"padding-top":"5px"}},[e._v(e._s(e.$t("queue")))])],1)],1)],1):e._e(),e.$server.activePlayer&&!e.$store.isMobile?i("v-list-item-action",{staticStyle:{padding:"20px"}},[i("v-menu",{attrs:{"close-on-content-click":!1,"nudge-width":250,"offset-x":"",top:""},nativeOn:{click:function(e){e.preventDefault()}},scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[i("v-btn",e._g({attrs:{icon:""}},a),[i("v-flex",{staticClass:"vertical-btn",attrs:{xs12:""}},[i("v-icon",[e._v("volume_up")]),i("span",{staticClass:"caption",staticStyle:{"padding-top":"5px"}},[e._v(e._s(Math.round(e.$server.activePlayer.volume_level)))])],1)],1)]}}],null,!1,2163274026)},[i("VolumeControl",{attrs:{players:e.$server.players,player_id:e.$server.activePlayer.player_id}})],1)],1):e._e(),i("v-list-item-action",{staticStyle:{padding:"30px","margin-right":"15px"}},[i("v-btn",{attrs:{text:"",icon:""},on:{click:function(t){return e.$server.$emit("showPlayersMenu")}}},[i("v-flex",{staticClass:"vertical-btn",attrs:{xs12:""}},[i("v-icon",[e._v("speaker")]),e.$server.activePlayer?i("span",{staticClass:"caption",staticStyle:{"padding-top":"5px"}},[e._v(e._s(e.truncateString(e.$server.activePlayer.name,18)))]):i("span",{staticClass:"caption"})],1)],1)],1)],1),e.$store.isInStandaloneMode?i("v-card",{staticStyle:{height:"20px"},attrs:{dense:"",flat:"",light:"",subheader:"",tile:"",width:"100%",color:"black"}}):e._e()],1)},X=[],Q=(a("fb6a"),a("4fad"),a("d3b7"),a("ac1f"),a("25f0"),a("5319"),a("d0af")),K=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-card",[a("v-list",[a("v-list-item",{staticStyle:{height:"50px","padding-bottom":"5"}},[a("v-list-item-avatar",{staticStyle:{"margin-left":"-10px"},attrs:{tile:""}},[a("v-icon",{attrs:{large:""}},[e._v(e._s(e.players[e.player_id].is_group?"speaker_group":"speaker"))])],1),a("v-list-item-content",{staticStyle:{"margin-left":"-15px"}},[a("v-list-item-title",[e._v(e._s(e.players[e.player_id].name))]),a("v-list-item-subtitle",[e._v(e._s(e.$t("state."+e.players[e.player_id].state)))])],1)],1),a("v-divider"),e._l(e.volumePlayerIds,(function(t){return a("div",{key:t},[a("div",{staticClass:"body-2",style:e.players[t].powered?"color:rgba(0,0,0,.54);":"color:rgba(0,0,0,.38);"},[a("v-btn",{staticStyle:{"margin-left":"8px"},style:e.players[t].powered?"color:rgba(0,0,0,.54);":"color:rgba(0,0,0,.38);",attrs:{icon:""},on:{click:function(a){return e.togglePlayerPower(t)}}},[a("v-icon",[e._v("power_settings_new")])],1),a("span",{staticStyle:{"margin-left":"10px"}},[e._v(e._s(e.players[t].name))]),a("div",{staticStyle:{"margin-top":"-8px","margin-left":"15px","margin-right":"15px",height:"35px"}},[a("v-slider",{attrs:{lazy:"",disabled:!e.players[t].powered,value:Math.round(e.players[t].volume_level),"prepend-icon":"volume_down","append-icon":"volume_up"},on:{end:function(a){return e.setPlayerVolume(t,a)},"click:append":function(a){return e.setPlayerVolume(t,"up")},"click:prepend":function(a){return e.setPlayerVolume(t,"down")}}})],1)],1),a("v-divider")],1)}))],2)],1)},G=[],W=a("d0ff"),q=i["a"].extend({props:["value","players","player_id"],data:function(){return{}},computed:{volumePlayerIds:function(){var e=[this.player_id];return e.push.apply(e,Object(W["a"])(this.players[this.player_id].group_childs)),e}},mounted:function(){},methods:{setPlayerVolume:function(e,t){"up"===t?t=this.$server.players[e].volume_level+1:"down"===t&&(t=this.$server.players[e].volume_level-1),this.$server.playerCommand("volume_set",t,e),this.players[e].volume_level=t},togglePlayerPower:function(e){this.$server.playerCommand("power_toggle",null,e)}}}),Z=q,$=a("ba0d"),ee=Object(u["a"])(Z,K,G,!1,null,null,null),te=ee.exports;p()(ee,{VBtn:m["a"],VCard:J["a"],VDivider:z["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAvatar:N["a"],VListItemContent:y["a"],VListItemSubtitle:y["b"],VListItemTitle:y["c"],VSlider:$["a"]});var ae=i["a"].extend({components:{VolumeControl:te},props:[],data:function(){return{playerQueueDetails:{}}},watch:{},computed:{curQueueItem:function(){return this.playerQueueDetails?this.playerQueueDetails.cur_item:null},progress:function(){if(!this.curQueueItem)return 0;var e=this.curQueueItem.duration,t=this.playerQueueDetails.cur_item_time,a=t/e*100;return a},playerCurTimeStr:function(){if(!this.curQueueItem)return"0:00";var e=this.playerQueueDetails.cur_item_time;return e.toString().formatDuration()},playerTotalTimeStr:function(){if(!this.curQueueItem)return"0:00";var e=this.curQueueItem.duration;return e.toString().formatDuration()},progressBarWidth:function(){return window.innerWidth-160},streamDetails:function(){return this.playerQueueDetails.cur_item&&this.playerQueueDetails.cur_item&&this.playerQueueDetails.cur_item.streamdetails.provider&&this.playerQueueDetails.cur_item.streamdetails.content_type?this.playerQueueDetails.cur_item.streamdetails:{}},streamVolumeLevelAdjustment:function(){if(!this.streamDetails||!this.streamDetails.sox_options)return"";if(this.streamDetails.sox_options.includes("vol ")){var e=/(.*vol\s+)(.*)(\s+dB.*)/,t=this.streamDetails.sox_options.replace(e,"$2");return t+" dB"}return""}},created:function(){this.$server.$on("queue updated",this.queueUpdatedMsg),this.$server.$on("new player selected",this.getQueueDetails)},methods:{playerCommand:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.$server.playerCommand(e,t,this.$server.activePlayerId)},artistClick:function(e){var t="/artists/"+e.item_id;this.$router.push({path:t,query:{provider:e.provider}})},queueUpdatedMsg:function(e){var t=this.$server.players[this.$server.activePlayerId].active_queue;if(e.player_id===t)for(var a=0,r=Object.entries(e);a<r.length;a++){var n=Object(Q["a"])(r[a],2),s=n[0],o=n[1];i["a"].set(this.playerQueueDetails,s,o)}},getQueueDetails:function(){var e=this;return Object(E["a"])(regeneratorRuntime.mark((function t(){var a,i;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:if(!e.$server.activePlayer){t.next=6;break}return a=e.$server.players[e.$server.activePlayerId].active_queue,i="players/"+a+"/queue",t.next=5,e.$server.getData(i);case 5:e.playerQueueDetails=t.sent;case 6:case"end":return t.stop()}}),t)})))()},truncateString:function(e,t){return e.length<=t?e:e.slice(0,t)+"..."}}}),ie=ae,re=(a("6915"),a("0e8f")),ne=a("553a"),se=a("adda"),oe=a("34c3"),le=a("e449"),ce=a("8e36"),ue=Object(u["a"])(ie,U,X,!1,null,"21e0f2f0",null),de=ue.exports;p()(ue,{VBtn:m["a"],VCard:J["a"],VDivider:z["a"],VFlex:re["a"],VFooter:ne["a"],VIcon:h["a"],VImg:se["a"],VList:v["a"],VListItem:f["a"],VListItemAction:g["a"],VListItemAvatar:N["a"],VListItemContent:y["a"],VListItemIcon:oe["a"],VListItemSubtitle:y["b"],VListItemTitle:y["c"],VMenu:le["a"],VProgressLinear:ce["a"],VSubheader:j["a"]});var pe=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-navigation-drawer",{attrs:{right:"",app:"",clipped:"",temporary:"",width:"300"},model:{value:e.visible,callback:function(t){e.visible=t},expression:"visible"}},[a("v-card-title",{staticClass:"headline"},[a("b",[e._v(e._s(e.$t("players")))])]),a("v-list",{attrs:{dense:""}},[a("v-divider"),e._l(e.filteredPlayerIds,(function(t){return a("div",{key:t,style:e.$server.activePlayerId==t?"background-color:rgba(50, 115, 220, 0.3);":""},[a("v-list-item",{staticStyle:{"margin-left":"-5px","margin-right":"-15px"},attrs:{ripple:"",dense:""},on:{click:function(a){return e.$server.switchPlayer(e.$server.players[t].player_id)}}},[a("v-list-item-avatar",{attrs:{tile:""}},[a("v-icon",{attrs:{size:"45"}},[e._v(e._s(e.$server.players[t].is_group_player?"speaker_group":"speaker"))])],1),a("v-list-item-content",{staticStyle:{"margin-left":"-15px"}},[a("v-list-item-title",{staticClass:"subtitle-1"},[e._v(e._s(e.$server.players[t].name))]),a("v-list-item-subtitle",{key:e.$server.players[t].state,staticClass:"body-2",staticStyle:{"font-weight":"normal"}},[e._v(" "+e._s(e.$t("state."+e.$server.players[t].state))+" ")])],1),e.$server.activePlayerId?a("v-list-item-action",{staticStyle:{"padding-right":"10px"}},[a("v-menu",{attrs:{"close-on-content-click":!1,"close-on-click":!0,"nudge-width":250,"offset-x":"",right:""},nativeOn:{click:[function(e){e.stopPropagation()},function(e){e.stopPropagation(),e.preventDefault()}]},scopedSlots:e._u([{key:"activator",fn:function(i){var r=i.on;return[a("v-btn",e._g({staticStyle:{color:"rgba(0,0,0,.54)"},attrs:{icon:""}},r),[a("v-flex",{staticClass:"vertical-btn",attrs:{xs12:""}},[a("v-icon",[e._v("volume_up")]),a("span",{staticClass:"overline"},[e._v(e._s(Math.round(e.$server.players[t].volume_level)))])],1)],1)]}}],null,!0)},[a("VolumeControl",{attrs:{players:e.$server.players,player_id:t}})],1)],1):e._e()],1),a("v-divider")],1)}))],2)],1)},me=[],he=i["a"].extend({components:{VolumeControl:te},watch:{},data:function(){return{filteredPlayerIds:[],visible:!1}},computed:{},created:function(){this.$server.$on("showPlayersMenu",this.show),this.$server.$on("players changed",this.getAvailablePlayers),this.getAvailablePlayers()},methods:{show:function(){this.visible=!0},getAvailablePlayers:function(){for(var e in this.filteredPlayerIds=[],this.$server.players)this.$server.players[e].available&&this.filteredPlayerIds.push(e)}}}),ve=he,fe=(a("4f9f"),a("99d9")),ge=Object(u["a"])(ve,pe,me,!1,null,"7c65a917",null),ye=ge.exports;p()(ge,{VBtn:m["a"],VCardTitle:fe["c"],VDivider:z["a"],VFlex:re["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAction:g["a"],VListItemAvatar:N["a"],VListItemContent:y["a"],VListItemSubtitle:y["b"],VListItemTitle:y["c"],VMenu:le["a"],VNavigationDrawer:b["a"]});var be=i["a"].extend({name:"App",components:{NavigationMenu:k,TopBar:R,ContextMenu:T,PlayerOSD:de,PlayerSelect:ye},data:function(){return{showPlayerSelect:!1}},created:function(){var e="",t=window.location;e=t.origin+t.pathname,this.$server.connect(e)}}),Ae=be,ke=(a("034f"),a("7496")),we=a("f6c4"),Ie=a("a797"),xe=a("490a"),_e=Object(u["a"])(Ae,r,n,!1,null,null,null),Se=_e.exports;p()(_e,{VApp:ke["a"],VMain:we["a"],VOverlay:Ie["a"],VProgressCircular:xe["a"]});var Ce=a("9483");Object(Ce["a"])("".concat("","service-worker.js"),{ready:function(){},registered:function(){},cached:function(){},updatefound:function(){},updated:function(){alert("New content is available; please refresh."),window.location.reload(!0)},offline:function(){alert("No internet connection found. App is running in offline mode.")},error:function(e){}});var De=a("f3f3"),Pe=a("8c4f"),Re=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("section",[a("v-list",{attrs:{tile:""}},e._l(e.items,(function(t){return a("v-list-item",{key:t.title,attrs:{tile:""},on:{click:function(a){return e.$router.push(t.path)}}},[a("v-list-item-icon",{staticStyle:{"margin-left":"15px"}},[a("v-icon",[e._v(e._s(t.icon))])],1),a("v-list-item-content",[a("v-list-item-title",{domProps:{textContent:e._s(t.title)}})],1)],1)})),1)],1)},Be=[],Oe={name:"home",data:function(){return{items:[{title:this.$t("artists"),icon:"person",path:"/artists"},{title:this.$t("albums"),icon:"album",path:"/albums"},{title:this.$t("tracks"),icon:"audiotrack",path:"/tracks"},{title:this.$t("playlists"),icon:"playlist_play",path:"/playlists"},{title:this.$t("search"),icon:"search",path:"/search"}]}},created:function(){this.$store.windowtitle=this.$t("musicassistant")}},Me=Oe,Ee=Object(u["a"])(Me,Re,Be,!1,null,null,null),He=Ee.exports;p()(Ee,{VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemContent:y["a"],VListItemIcon:oe["a"],VListItemTitle:y["c"]});var Fe=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("section",[a("ItemsListing",{attrs:{mediatype:e.mediatype,provider:e.provider,endpoint:"library/"+e.mediatype}})],1)},Le=[],Je=a("0dac"),Ve={name:"browse",components:{ItemsListing:Je["a"]},props:{mediatype:String,provider:String},data:function(){return{}},created:function(){this.$store.windowtitle=this.$t(this.mediatype)},computed:{},methods:{}},ze=Ve,Ne=Object(u["a"])(ze,Fe,Le,!1,null,null,null),je=Ne.exports;i["a"].use(Pe["a"]);var Ye=[{path:"/",name:"home",component:He},{path:"/config",name:"config",component:function(){return a.e("config").then(a.bind(null,"1071"))},props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}},{path:"/config/:configKey",name:"configKey",component:function(){return a.e("config").then(a.bind(null,"1071"))},props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}},{path:"/search",name:"search",component:function(){return Promise.all([a.e("itemdetails~playerqueue~search"),a.e("search")]).then(a.bind(null,"2d3b"))},props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}},{path:"/:media_type/:media_id",name:"itemdetails",component:function(){return Promise.all([a.e("itemdetails~playerqueue~search"),a.e("itemdetails")]).then(a.bind(null,"32a2"))},props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}},{path:"/playerqueue",name:"playerqueue",component:function(){return Promise.all([a.e("itemdetails~playerqueue~search"),a.e("playerqueue")]).then(a.bind(null,"b097"))},props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}},{path:"/:mediatype",name:"browse",component:je,props:function(e){return Object(De["a"])(Object(De["a"])({},e.params),e.query)}}],Te=new Pe["a"]({mode:"hash",routes:Ye}),Ue=Te,Xe=(a("4160"),a("466d"),a("1276"),a("159b"),a("ddb0"),a("a925"));function Qe(){var e=a("49f8"),t={};return e.keys().forEach((function(a){var i=a.match(/([A-Za-z0-9-_]+)\./i);if(i&&i.length>1){var r=i[1];t[r]=e(a)}})),t}i["a"].use(Xe["a"]);var Ke=new Xe["a"]({locale:navigator.language.split("-")[0],fallbackLocale:"en",messages:Qe()}),Ge=(a("d5e8"),a("d1e78"),a("e508")),We=(a("a899"),a("f309"));i["a"].use(We["a"]);var qe=new We["a"]({}),Ze=new i["a"]({data:function(){return{windowtitle:"Home",loading:!1,showNavigationMenu:!1,topBarTransparent:!1,topBarContextItem:null,isMobile:!1,isInStandaloneMode:!1}},created:function(){this.handleWindowOptions(),window.addEventListener("resize",this.handleWindowOptions)},destroyed:function(){window.removeEventListener("resize",this.handleWindowOptions)},methods:{handleWindowOptions:function(){this.isMobile=document.body.clientWidth<700,this.isInStandaloneMode=!0===window.navigator.standalone||window.matchMedia("(display-mode: standalone)").matches}}}),$e={globalStore:Ze,install:function(e,t){e.prototype.$store=Ze}},et=(a("99af"),a("a434"),a("8a79"),a("3ca3"),a("2b3d"),a("bc3a")),tt=a.n(et),at=a("3667"),it=a.n(at),rt={timeout:6e4},nt=tt.a.create(rt),st=new i["a"]({_address:"",_ws:null,data:function(){return{connected:!1,players:{},activePlayerId:null,syncStatus:[]}},methods:{connect:function(e){var t=this;return Object(E["a"])(regeneratorRuntime.mark((function a(){var i;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:e.endsWith("/")||(e+="/"),t._address=e,i=e.replace("http","ws")+"ws",t._ws=new WebSocket(i),t._ws.onopen=t._onWsConnect,t._ws.onmessage=t._onWsMessage,t._ws.onclose=t._onWsClose,t._ws.onerror=t._onWsError;case 8:case"end":return a.stop()}}),a)})))()},toggleLibrary:function(e){var t=this;return Object(E["a"])(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:if(0!==e.in_library.length){a.next=6;break}return a.next=3,t.putData("library",e);case 3:e.in_library=[e.provider],a.next=9;break;case 6:return a.next=8,t.deleteData("library",e);case 8:e.in_library=[];case 9:case"end":return a.stop()}}),a)})))()},getImageUrl:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"image",a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return e&&e.media_type?"database"===e.provider&&"image"===t?"".concat(this._address,"api/").concat(e.media_type,"/").concat(e.item_id,"/thumb?provider=").concat(e.provider,"&size=").concat(a):e.metadata&&e.metadata[t]?e.metadata[t]:e.album&&e.album.metadata&&e.album.metadata[t]?e.album.metadata[t]:e.artist&&e.artist.metadata&&e.artist.metadata[t]?e.artist.metadata[t]:e.album&&e.album.artist&&e.album.artist.metadata&&e.album.artist.metadata[t]?e.album.artist.metadata[t]:e.artists&&e.artists[0].metadata&&e.artists[0].metadata[t]?e.artists[0].metadata[t]:"fanart"===t?this.getImageUrl(e,"image",a):"":""},getData:function(e){var t=arguments,a=this;return Object(E["a"])(regeneratorRuntime.mark((function r(){var n,s,o;return regeneratorRuntime.wrap((function(r){while(1)switch(r.prev=r.next){case 0:return n=t.length>1&&void 0!==t[1]?t[1]:{},s=a._address+"api/"+e,r.next=4,nt.get(s,{params:n});case 4:return o=r.sent,i["a"].$log.debug("getData",e,o),r.abrupt("return",o.data);case 7:case"end":return r.stop()}}),r)})))()},postData:function(e,t){var a=this;return Object(E["a"])(regeneratorRuntime.mark((function r(){var n,s;return regeneratorRuntime.wrap((function(r){while(1)switch(r.prev=r.next){case 0:return n=a._address+"api/"+e,t=JSON.stringify(t),r.next=4,nt.post(n,t);case 4:return s=r.sent,i["a"].$log.debug("postData",e,s),r.abrupt("return",s.data);case 7:case"end":return r.stop()}}),r)})))()},putData:function(e,t){var a=this;return Object(E["a"])(regeneratorRuntime.mark((function r(){var n,s;return regeneratorRuntime.wrap((function(r){while(1)switch(r.prev=r.next){case 0:return n=a._address+"api/"+e,t=JSON.stringify(t),r.next=4,nt.put(n,t);case 4:return s=r.sent,i["a"].$log.debug("putData",e,s),r.abrupt("return",s.data);case 7:case"end":return r.stop()}}),r)})))()},deleteData:function(e,t){var a=this;return Object(E["a"])(regeneratorRuntime.mark((function r(){var n,s;return regeneratorRuntime.wrap((function(r){while(1)switch(r.prev=r.next){case 0:return n=a._address+"api/"+e,t=JSON.stringify(t),r.next=4,nt.delete(n,{data:t});case 4:return s=r.sent,i["a"].$log.debug("deleteData",e,s),r.abrupt("return",s.data);case 7:case"end":return r.stop()}}),r)})))()},getAllItems:function(e,t){var a=arguments,r=this;return Object(E["a"])(regeneratorRuntime.mark((function n(){var s,o,l,c;return regeneratorRuntime.wrap((function(n){while(1)switch(n.prev=n.next){case 0:s=a.length>2&&void 0!==a[2]?a[2]:null,o=r._address+"api/"+e,s&&(l=new URLSearchParams(s),o+="?"+l.toString()),c=0,i["a"].$log.debug("getAllItems",o),it()(o).node("items.*",(function(e){i["a"].set(t,c,e),c+=1})).done((function(e){t.length>e.items.length&&t.splice(e.items.length)}));case 6:case"end":return n.stop()}}),n)})))()},playerCommand:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.activePlayerId,i="players/"+a+"/cmd/"+e;this.postData(i,t)},playItem:function(e,t){var a=this;return Object(E["a"])(regeneratorRuntime.mark((function i(){var r;return regeneratorRuntime.wrap((function(i){while(1)switch(i.prev=i.next){case 0:return a.$store.loading=!0,r="players/"+a.activePlayerId+"/play_media/"+t,i.next=4,a.postData(r,e);case 4:a.$store.loading=!1;case 5:case"end":return i.stop()}}),i)})))()},switchPlayer:function(e){e!==this.activePlayerId&&(this.activePlayerId=e,localStorage.setItem("activePlayerId",e),this.$emit("new player selected",e))},_onWsConnect:function(){var e=this;return Object(E["a"])(regeneratorRuntime.mark((function t(){var a,r,n,s;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return i["a"].$log.info("Connected to server "+e._address),e.connected=!0,t.next=4,e.getData("players");case 4:a=t.sent,r=Object(M["a"])(a);try{for(r.s();!(n=r.n()).done;)s=n.value,i["a"].set(e.players,s.player_id,s)}catch(o){r.e(o)}finally{r.f()}e._selectActivePlayer(),e.$emit("players changed");case 9:case"end":return t.stop()}}),t)})))()},_onWsMessage:function(e){var t=this;return Object(E["a"])(regeneratorRuntime.mark((function a(){var r;return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:r=JSON.parse(e.data),"player changed"===r.message?i["a"].set(t.players,r.message_details.player_id,r.message_details):"player added"===r.message?(i["a"].set(t.players,r.message_details.player_id,r.message_details),t._selectActivePlayer(),t.$emit("players changed")):"player removed"===r.message?(i["a"].delete(t.players,r.message_details.player_id),t._selectActivePlayer(),t.$emit("players changed")):"music sync status"===r.message?t.syncStatus=r.message_details:t.$emit(r.message,r.message_details);case 2:case"end":return a.stop()}}),a)})))()},_onWsClose:function(e){this.connected=!1,i["a"].$log.error("Socket is closed. Reconnect will be attempted in 5 seconds.",e.reason),setTimeout(function(){this.connect(this._address)}.bind(this),5e3)},_onWsError:function(){this._ws.close()},_selectActivePlayer:function(){if(!this.activePlayer||!this.activePlayer.enabled||this.activePlayer.group_parents.length>0){var e=localStorage.getItem("activePlayerId");if(e&&this.players[e]&&this.players[e].enabled)this.switchPlayer(e);else{for(var t in this.players)if("playing"===this.players[t].state&&this.players[t].enabled&&0===this.players[t].group_parents.length){this.switchPlayer(t);break}if(!this.activePlayer||!this.activePlayer.enabled)for(var a in this.players)if(this.players[a].enabled&&0===this.players[a].group_parents.length){this.switchPlayer(a);break}}}}},computed:{activePlayer:function(){return this.activePlayerId?this.players[this.activePlayerId]:null}}}),ot={server:st,install:function(e,t){e.prototype.$server=st}},lt=a("85ff"),ct=a.n(lt),ut=!0,dt={isEnabled:!0,logLevel:ut?"error":"debug",stringifyArguments:!1,showLogLevel:!0,showMethodName:!1,separator:"|",showConsoleColors:!0};i["a"].config.productionTip=!1,i["a"].use(ct.a,dt),i["a"].use(Ge["a"]),i["a"].use($e),i["a"].use(ot),String.prototype.formatDuration=function(){var e=parseInt(this,10),t=Math.floor(e/3600),a=Math.floor((e-3600*t)/60),i=e-3600*t-60*a;return t<10&&(t="0"+t),a<10&&(a="0"+a),i<10&&(i="0"+i),"00"===t?a+":"+i:t+":"+a+":"+i},new i["a"]({router:Ue,i18n:Ke,vuetify:qe,render:function(e){return e(Se)}}).$mount("#app")},"57d1":function(e,t){e.exports="data:image/png;base64,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"},6915:function(e,t,a){"use strict";var i=a("b75b"),r=a.n(i);r.a},"691f":function(e,t,a){},"71db":function(e,t,a){e.exports=a.p+"img/file.813f9dad.png"},"82f5":function(e,t,a){e.exports=a.p+"img/sonos.72e2fecb.png"},"85ec":function(e,t,a){},"94cc":function(e,t){e.exports="data:image/png;base64,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"},"9a36":function(e,t){e.exports="data:image/png;base64,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"},"9ad3":function(e,t){e.exports="data:image/png;base64,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"},"9e01":function(e,t,a){var i={"./aac.png":"9a36","./chromecast.png":"57d1","./crossfade.png":"e7af","./default_artist.png":"4bfb","./demo_player.png":"26ea","./file.png":"71db","./flac.png":"fb30","./hires.png":"f5e3","./homeassistant.png":"3232","./http_streamer.png":"2755","./logo.png":"cf05","./mp3.png":"f1d4","./ogg.png":"9ad3","./qobuz.png":"0863","./sonos.png":"82f5","./spotify.png":"0c3b","./squeezebox.png":"bd18","./tunein.png":"e428","./vorbis.png":"94cc","./web.png":"edbf","./webplayer.png":"3d05"};function r(e){var t=n(e);return a(t)}function n(e){if(!a.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=n,e.exports=r,r.id="9e01"},a471:function(e,t,a){},a548:function(e,t,a){"use strict";var i=a("a471"),r=a.n(i);r.a},a625:function(e){e.exports=JSON.parse('{"musicassistant":"Music Assistant","home":"Home","artists":"Artiesten","albums":"Albums","tracks":"Nummers","playlists":"Afspeellijsten","playlist_tracks":"Nummers in afspeellijst","radios":"Radio","search":"Zoeken","settings":"Instellingen","queue":"Wachtrij","artist_toptracks":"Top nummers","artist_albums":"Albums","album_tracks":"Album liedjes","album_versions":"Versies","track_versions":"Versies","type_to_search":"Type hier om te zoeken...","add_library":"Voeg toe aan bibliotheek","remove_library":"Verwijder uit bibliotheek","add_playlist":"Aan playlist toevoegen...","remove_playlist":"Verwijder uit playlist","no_player":"Geen speler geselecteerd","reboot_required":"Je moet de server opnieuw starten om de nieuwe instellingen actief te maken!","sort_name":"Sorteer op naam","sort_artist":"Sorteer op artiest","sort_album":"Sorteer op album","sort_date":"Sorteer op datum","sort_default":"Standaard sortering","items":"item(s)","conf":{"enabled":"Ingeschakeld","base":"Algemene instellingen","providers":"Providers / Plugins","player_settings":"Speler instellingen","homeassistant":"Home Assistant integratie","web":"Webserver","http_streamer":"Ingebouwde (sox gebaseerde) streamer","qobuz":"Qobuz","spotify":"Spotify","tunein":"TuneIn","file":"Bestandssysteem","chromecast":"Chromecast","squeezebox":"Squeezebox ondersteuning","sonos":"Sonos","webplayer":"Web Player (alleen Chrome browser)","username":"Gebruikersnaam","password":"Wachtwoord","hostname":"Hostnaam (of IP)","port":"Poort","hass_url":"URL naar homeassistant (b.v. https://homeassistant:8123)","hass_token":"Token met lange levensduur","hass_publish_players":"Publiceer spelers naar Home Assistant","hass_power_entities":"Entities die gebruikt mogen worden als aan/uit Control voor spelers.","hass_volume_entities":"Entities die gebruikt mogen worden als volume Control voor spelers.","web_ssl_cert":"Pad naar ssl certificaat bestand","web_ssl_key":"Pad naar ssl certificaat key bestand","player_enabled":"Speler inschakelen","player_name":"Aangepaste naam voor deze speler","file_prov_music_path":"Pad naar muziek bestanden","file_prov_playlists_path":"Pad naar playlist bestanden (.m3u)","web_http_port":"HTTP poort","web_https_port":"HTTPS poort","cert_fqdn_host":"Hostname (FQDN van certificaat)","enable_r128_volume_normalisation":"Schakel R128 volume normalisatie in","target_volume_lufs":"Doelvolume (R128 standaard is -23 LUFS)","fallback_gain_correct":"Fallback gain correctie indien R128 meting (nog) niet beschikbaar is","enable_audio_cache":"Sta het cachen van audio toe naar temp map","trim_silence":"Strip stilte van begin en eind van audio (in temp bestanden)","http_streamer_sox_effects":"Eigen sox effects toepassen op audio (alleen voor ingebouwde streamer). Zie http://sox.sourceforge.net/sox.html#EFFECTS","max_sample_rate":"Maximale sample rate welke deze speler ondersteund, hoger wordt gedownsampled.","force_http_streamer":"Forceer het gebruik van de ingebouwde streamer, ook al heeft de speler directe ondersteuning voor de muziek provider","not_grouped":"Niet gegroepeerd","conf_saved":"Configuratie is opgeslagen, herstart om actief te maken","audio_cache_folder":"Map om te gebruiken voor cache bestanden","audio_cache_max_size_gb":"Maximale grootte van de cache map in GB.","gapless_enabled":"Schakel ondersteuning voor gapless in.","crossfade_duration":"Crossfade (in seconden, 0 om uit te schakelen).","power_control":"Verbind Power Control met speler.","volume_control":"Verbind Volume Control met speler."},"players":"Spelers","play":"Afspelen","play_on":"Afspelen op:","play_now":"Nu afspelen","play_next":"Speel als volgende af","add_queue":"Voeg toe aan wachtrij","queue_clear":"Wachtrij leegmaken","show_info":"Bekijk informatie","queue_next_tracks":"Aankomend","queue_previous_tracks":"Afgespeeld","queue_move_up":"Verplaats omhoog","queue_move_down":"Verplaats omlaag","queue_options":"Wachtrij opties","enable_repeat":"Repeat inschakelen","disable_repeat":"Repeat uitschakelen","enable_shuffle":"Shuffle inschakelen","disable_shuffle":"Shuffle uitschakelen","read_more":"meer lezen","stream_details":"Streamdetails","crossfade_enabled":"Crossfade ingeschakeld","state":{"playing":"afspelen","stopped":"gestopt","paused":"gepauzeerd","off":"uitgeschakeld"}}')},b75b:function(e,t,a){},bd18:function(e,t,a){e.exports=a.p+"img/squeezebox.60631223.png"},cf05:function(e,t,a){e.exports=a.p+"img/logo.c079bd97.png"},d3cc:function(e,t,a){"use strict";var i=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",[i("v-list-item",{directives:[{name:"longpress",rawName:"v-longpress",value:e.menuClick,expression:"menuClick"}],attrs:{ripple:""},on:{click:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button?null:void(e.onclickHandler?e.onclickHandler(e.item):e.itemClicked(e.item))},contextmenu:[e.menuClick,function(e){e.preventDefault()}]}},[e.hideavatar?e._e():i("v-list-item-avatar",{attrs:{tile:"",color:"grey"}},[i("img",{staticStyle:{border:"1px solid rgba(0,0,0,.22)"},attrs:{src:e.$server.getImageUrl(e.item,"image",80),"lazy-src":a("71db")}})]),i("v-list-item-content",[i("v-list-item-title",[e._v(" "+e._s(e.item.name)+" "),e.item.version?i("span",[e._v("("+e._s(e.item.version)+")")]):e._e()]),e.item.artists?i("v-list-item-subtitle",[e._l(e.item.artists,(function(t,a){return i("span",{key:t.item_id},[i("a",{on:{click:[function(a){return e.itemClicked(t)},function(e){e.stopPropagation()}]}},[e._v(e._s(t.name))]),a+1<e.item.artists.length?i("label",{key:a},[e._v("/")]):e._e()])})),e.item.album&&e.hidetracknum?i("a",{staticStyle:{color:"grey"},on:{click:[function(t){return e.itemClicked(e.item.album)},function(e){e.stopPropagation()}]}},[e._v(" - "+e._s(e.item.album.name))]):e._e(),!e.hidetracknum&&e.item.track_number?i("label",{staticStyle:{color:"grey"}},[e._v("- disc "+e._s(e.item.disc_number)+" track "+e._s(e.item.track_number))]):e._e()],2):e._e(),e.item.artist?i("v-list-item-subtitle",[i("a",{on:{click:[function(t){return e.itemClicked(e.item.artist)},function(e){e.stopPropagation()}]}},[e._v(e._s(e.item.artist.name))])]):e._e(),e.item.owner?i("v-list-item-subtitle",[e._v(e._s(e.item.owner))]):e._e()],1),e.hideproviders?e._e():i("v-list-item-action",[i("ProviderIcons",{attrs:{providerIds:e.item.provider_ids,height:20}})],1),e.isHiRes?i("v-list-item-action",[i("v-tooltip",{attrs:{bottom:""},scopedSlots:e._u([{key:"activator",fn:function(t){var r=t.on;return[i("img",e._g({attrs:{src:a("f5e3"),height:"20"}},r))]}}],null,!1,2747613229)},[i("span",[e._v(e._s(e.isHiRes))])])],1):e._e(),e.hidelibrary?e._e():i("v-list-item-action",[i("v-tooltip",{attrs:{bottom:""},scopedSlots:e._u([{key:"activator",fn:function(t){var a=t.on;return[i("v-btn",e._g({attrs:{icon:"",ripple:""},on:{click:[function(t){return e.toggleLibrary(e.item)},function(e){e.preventDefault()},function(e){e.stopPropagation()}]}},a),[e.item.in_library.length>0?i("v-icon",{attrs:{height:"20"}},[e._v("favorite")]):e._e(),0==e.item.in_library.length?i("v-icon",{attrs:{height:"20"}},[e._v("favorite_border")]):e._e()],1)]}}],null,!1,113966118)},[e.item.in_library.length>0?i("span",[e._v(e._s(e.$t("remove_library")))]):e._e(),0==e.item.in_library.length?i("span",[e._v(e._s(e.$t("add_library")))]):e._e()])],1),!e.hideduration&&e.item.duration?i("v-list-item-action",[e._v(e._s(e.item.duration.toString().formatDuration()))]):e._e(),e.hidemenu?e._e():i("v-icon",{staticStyle:{"margin-right":"-10px","padding-left":"10px"},attrs:{color:"grey lighten-1"},on:{click:[function(t){return e.menuClick(e.item)},function(e){e.stopPropagation()}]}},[e._v("more_vert")])],1),i("v-divider")],1)},r=[],n=(a("4160"),a("a9e3"),a("96cf"),a("c964")),s=a("54f8"),o=a("2b0e"),l=a("e00a"),c=600;o["a"].directive("longpress",{bind:function(e,t,a){var i=t.value;if("function"===typeof i){var r=null,n=function(e){"click"===e.type&&0!==e.button||null===r&&(r=setTimeout((function(){return i(e)}),c))},s=function(){null!==r&&(clearTimeout(r),r=null)};["mousedown","touchstart"].forEach((function(t){return e.addEventListener(t,n)})),["click","mouseout","touchend","touchcancel"].forEach((function(t){return e.addEventListener(t,s)}))}else o["a"].$log.warn("Expect a function, got ".concat(i))}});var u=o["a"].extend({components:{ProviderIcons:l["a"]},props:{item:Object,index:Number,totalitems:Number,hideavatar:Boolean,hidetracknum:Boolean,hideproviders:Boolean,hidemenu:Boolean,hidelibrary:Boolean,hideduration:Boolean,onclickHandler:null},data:function(){return{touchMoving:!1,cancelled:!1}},computed:{isHiRes:function(){var e,t=Object(s["a"])(this.item.provider_ids);try{for(t.s();!(e=t.n()).done;){var a=e.value;if(a.quality>6)return a.details?a.details:7===a.quality?"44.1/48khz 24 bits":8===a.quality?"88.2/96khz 24 bits":9===a.quality?"176/192khz 24 bits":"+192kHz 24 bits"}}catch(i){t.e(i)}finally{t.f()}return""}},created:function(){},beforeDestroy:function(){this.cancelled=!0},mounted:function(){},methods:{itemClicked:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t="";if(1===e.media_type)t="/artists/"+e.item_id;else if(2===e.media_type)t="/albums/"+e.item_id;else{if(4!==e.media_type)return void this.$server.$emit("showPlayMenu",e);t="/playlists/"+e.item_id}this.$router.push({path:t,query:{provider:e.provider}})},menuClick:function(){this.cancelled||this.$server.$emit("showContextMenu",this.item)},toggleLibrary:function(e){var t=this;return Object(n["a"])(regeneratorRuntime.mark((function a(){return regeneratorRuntime.wrap((function(a){while(1)switch(a.prev=a.next){case 0:return t.cancelled=!0,a.next=3,t.$server.toggleLibrary(e);case 3:t.cancelled=!1;case 4:case"end":return a.stop()}}),a)})))()}}}),d=u,p=a("2877"),m=a("6544"),h=a.n(m),v=a("8336"),f=a("ce7e"),g=a("132d"),y=a("da13"),b=a("1800"),A=a("8270"),k=a("5d23"),w=a("3a2f"),I=Object(p["a"])(d,i,r,!1,null,null,null);t["a"]=I.exports;h()(I,{VBtn:v["a"],VDivider:f["a"],VIcon:g["a"],VListItem:y["a"],VListItemAction:b["a"],VListItemAvatar:A["a"],VListItemContent:k["a"],VListItemSubtitle:k["b"],VListItemTitle:k["c"],VTooltip:w["a"]})},e00a:function(e,t,a){"use strict";var i=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",e._l(e.uniqueProviders,(function(t){return i("img",{key:t.provider,staticStyle:{"margin-right":"6px","margin-top":"6px"},attrs:{height:e.height,src:a("9e01")("./"+t.provider+".png")}})})),0)},r=[],n=(a("4160"),a("c975"),a("a9e3"),a("159b"),a("2b0e")),s=n["a"].extend({props:{providerIds:Array,height:Number},data:function(){return{isHiRes:!1}},computed:{uniqueProviders:function(){var e=[],t=[];return this.providerIds?(this.providerIds.forEach((function(a){var i=a.provider;-1===t.indexOf(i)&&(t.push(i),e.push(a))})),e):[]}},mounted:function(){},methods:{}}),o=s,l=a("2877"),c=Object(l["a"])(o,i,r,!1,null,null,null);t["a"]=c.exports},e428:function(e,t,a){e.exports=a.p+"img/tunein.ca1c1bb0.png"},e7af:function(e,t){e.exports="data:image/png;base64,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"},edbf:function(e,t,a){e.exports=a.p+"img/web.798ba28f.png"},edd4:function(e){e.exports=JSON.parse('{"musicassistant":"Music Assistant","home":"Home","artists":"Artists","albums":"Albums","tracks":"Tracks","playlists":"Playlists","playlist_tracks":"Playlist tracks","radios":"Radio","search":"Search","settings":"Settings","queue":"Queue","artist_toptracks":"Top tracks","artist_albums":"Albums","album_tracks":"Album tracks","album_versions":"Versions","track_versions":"Versions","type_to_search":"Type here to search...","add_library":"Add to library","remove_library":"Remove from library","add_playlist":"Add to playlist...","remove_playlist":"Remove from playlist","no_player":"No player selected","reboot_required":"A reboot is required to activate the new settings!","sort_name":"Sort by name","sort_artist":"Sort by artist name","sort_album":"Sort by album name","sort_date":"Sort by date","sort_default":"Default sorting","items":"item(s)","conf":{"enabled":"Enabled","base":"Generic settings","providers":"Providers / Plugins","player_settings":"Player settings","homeassistant":"Home Assistant integration","web":"Webserver","http_streamer":"Built-in (sox based) streamer","qobuz":"Qobuz","spotify":"Spotify","tunein":"TuneIn","file":"Filesystem","chromecast":"Chromecast","squeezebox":"Squeezebox support","sonos":"Sonos","webplayer":"Web Player (Chrome browser only)","username":"Username","password":"Password","hostname":"Hostname (or IP)","port":"Port","hass_url":"URL to homeassistant (e.g. https://homeassistant:8123)","hass_token":"Long Lived Access Token","hass_publish_players":"Publish players to Home Assistant","hass_power_entities":"Enable entities to be used as Power Control for players.","hass_volume_entities":"Enable entities to be used as Volume Control for players.","web_ssl_cert":"Path to ssl certificate file","web_ssl_key":"Path to ssl keyfile","player_enabled":"Enable player","player_name":"Custom name for this player","file_prov_playlists_path":"Path to playlists (.m3u)","web_http_port":"HTTP port","web_https_port":"HTTPS port","cert_fqdn_host":"FQDN of hostname in certificate","enable_r128_volume_normalisation":"Enable R128 volume normalization","target_volume_lufs":"Target volume (R128 default is -23 LUFS)","fallback_gain_correct":"Fallback gain correction if R128 readings not (yet) available","enable_audio_cache":"Allow caching of audio to temp files","trim_silence":"Strip silence from beginning and end of audio (temp files only!)","http_streamer_sox_effects":"Custom sox effects to apply to audio (built-in streamer only!) See http://sox.sourceforge.net/sox.html#EFFECTS","max_sample_rate":"Maximum sample rate this player supports, higher will be downsampled","force_http_streamer":"Force use of built-in streamer, even if the player can handle the music provider directly","not_grouped":"Not grouped","conf_saved":"Configuration saved, restart app to make effective","audio_cache_folder":"Directory to use for cache files","audio_cache_max_size_gb":"Maximum size of the cache folder (GB)","gapless_enabled":"Enable gapless support","crossfade_duration":"Crossfade duration (in seconds, 0 to disable)","power_control":"Attach Power Control to player.","volume_control":"Attach Volume Control to player."},"players":"Players","play":"Play","play_on":"Play on:","play_now":"Play Now","play_next":"Play Next","add_queue":"Add to Queue","queue_clear":"Clear queue","show_info":"Show info","queue_next_tracks":"Next","queue_previous_tracks":"Played","queue_move_up":"Move up","queue_move_down":"Move down","queue_options":"Queue options","enable_repeat":"Enable repeat","disable_repeat":"Disable repeat","enable_shuffle":"Enable shuffle","disable_shuffle":"Disable shuffle","read_more":"read more","stream_details":"Streamdetails","crossfade_enabled":"Crossfade enabled","state":{"playing":"playing","stopped":"stopped","paused":"paused","off":"off"}}')},f1d4:function(e,t){e.exports="data:image/png;base64,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"},f5e3:function(e,t,a){e.exports=a.p+"img/hires.eabcf7ae.png"},fb30:function(e,t){e.exports="data:image/png;base64,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"}});
-//# sourceMappingURL=app.d45df414.js.map
\ No newline at end of file
diff --git a/music_assistant/web/js/app.d45df414.js.map b/music_assistant/web/js/app.d45df414.js.map
deleted file mode 100644 (file)
index 40a45a5..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?0f16","webpack:///./src/assets/qobuz.png","webpack:///./src/assets/spotify.png","webpack:///./src/components/ItemsListing.vue?8d1e","webpack:///./src/components/PanelviewItem.vue?cf5a","webpack:///src/components/PanelviewItem.vue","webpack:///./src/components/PanelviewItem.vue?2434","webpack:///./src/components/PanelviewItem.vue","webpack:///src/components/ItemsListing.vue","webpack:///./src/components/ItemsListing.vue?0bf5","webpack:///./src/components/ItemsListing.vue?3a42","webpack:///./src/assets/demo_player.png","webpack:///./src/assets/http_streamer.png","webpack:///./src/assets/homeassistant.png","webpack:///./src/assets/webplayer.png","webpack:///./src/locales sync [A-Za-z0-9-_,\\s]+\\.json$/","webpack:///./src/assets/default_artist.png","webpack:///./src/components/PlayerSelect.vue?82ac","webpack:///./src/App.vue?5077","webpack:///./src/components/NavigationMenu.vue?9860","webpack:///src/components/NavigationMenu.vue","webpack:///./src/components/NavigationMenu.vue?878f","webpack:///./src/components/NavigationMenu.vue","webpack:///./src/components/TopBar.vue?c899","webpack:///src/components/TopBar.vue","webpack:///./src/components/TopBar.vue?6b44","webpack:///./src/components/TopBar.vue","webpack:///./src/components/ContextMenu.vue?8c48","webpack:///src/components/ContextMenu.vue","webpack:///./src/components/ContextMenu.vue?8e1a","webpack:///./src/components/ContextMenu.vue","webpack:///./src/components/PlayerOSD.vue?029d","webpack:///./src/components/VolumeControl.vue?71ad","webpack:///src/components/VolumeControl.vue","webpack:///./src/components/VolumeControl.vue?2966","webpack:///./src/components/VolumeControl.vue","webpack:///src/components/PlayerOSD.vue","webpack:///./src/components/PlayerOSD.vue?50d9","webpack:///./src/components/PlayerOSD.vue?dd97","webpack:///./src/components/PlayerSelect.vue?d1a9","webpack:///src/components/PlayerSelect.vue","webpack:///./src/components/PlayerSelect.vue?63dc","webpack:///./src/components/PlayerSelect.vue?ba31","webpack:///src/App.vue","webpack:///./src/App.vue?3359","webpack:///./src/App.vue?2d25","webpack:///./src/registerServiceWorker.js","webpack:///./src/views/Home.vue?3267","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?f458","webpack:///./src/views/Home.vue","webpack:///./src/views/Browse.vue?9280","webpack:///src/views/Browse.vue","webpack:///./src/views/Browse.vue?68e7","webpack:///./src/views/Browse.vue","webpack:///./src/router/index.js","webpack:///./src/i18n.js","webpack:///./src/plugins/vuetify.js","webpack:///./src/plugins/store.js","webpack:///./src/plugins/server.js","webpack:///./src/main.js","webpack:///./src/assets/chromecast.png","webpack:///./src/components/PlayerOSD.vue?977b","webpack:///./src/assets/file.png","webpack:///./src/assets/sonos.png","webpack:///./src/assets/vorbis.png","webpack:///./src/assets/aac.png","webpack:///./src/assets/ogg.png","webpack:///./src/assets sync ^\\.\\/.*\\.png$","webpack:///./src/components/ItemsListing.vue?2279","webpack:///./src/assets/squeezebox.png","webpack:///./src/assets/logo.png","webpack:///./src/components/ListviewItem.vue?1742","webpack:///src/components/ListviewItem.vue","webpack:///./src/components/ListviewItem.vue?0071","webpack:///./src/components/ListviewItem.vue","webpack:///./src/components/ProviderIcons.vue?3616","webpack:///src/components/ProviderIcons.vue","webpack:///./src/components/ProviderIcons.vue?8a80","webpack:///./src/components/ProviderIcons.vue","webpack:///./src/assets/tunein.png","webpack:///./src/assets/crossfade.png","webpack:///./src/assets/web.png","webpack:///./src/assets/mp3.png","webpack:///./src/assets/hires.png","webpack:///./src/assets/flac.png"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","jsonpArray","window","oldJsonpFunction","slice","render","_vm","this","_h","$createElement","_c","_self","staticStyle","attrs","_v","_s","items","$t","scopedSlots","_u","fn","ref","on","_g","_l","item","domProps","text","$event","sortBy","sortDesc","_e","model","callback","$$v","search","expression","toggleViewMode","viewMode","filteredItems","props","item_id","thumbWidth","thumbHeight","staticClass","media_type","$store","isMobile","staticRenderFns","directives","rawName","indexOf","_k","keyCode","button","onclickHandler","itemClicked","menuClick","preventDefault","$server","getImageUrl","isHiRes","class","artist","artists","pressTimer","components","Number","hideproviders","Boolean","hidelibrary","touchMoving","cancelled","computed","created","beforeDestroy","mounted","methods","mediaItem","url","$emit","$router","component","VCard","VCardSubtitle","VCardTitle","VDivider","VImg","VTooltip","ListviewItem","PanelviewItem","sortKeys","endpoint","includes","getItems","$on","localStorage","setItem","mediatype","toLowerCase","newLst","VAppBar","VBtn","VCol","VContainer","VDataIterator","VIcon","VLabel","VList","VListItem","VMenu","VRow","VSpacer","VTextField","map","webpackContext","req","id","webpackContextResolve","keys","$route","path","showPlayerSelect","loading","$set","title","icon","showNavigationMenu","VListItemAction","VListItemContent","VListItemTitle","VNavigationDrawer","color","topBarTransparent","windowtitle","go","topBarContextItem","VLayout","visible","playlists","header","subheader","label","itemCommand","action","index","addToPlaylist","watch","menuItems","curItem","curPlaylist","playerQueueItems","showContextMenu","showPlayMenu","curBrowseContext","in_library","is_editable","cmd","query","showPlaylistsMenu","removeFromPlaylist","toggleLibrary","playItem","putData","deleteData","track","VDialog","VListItemAvatar","VSubheader","curQueueItem","activePlayer","artistindex","artistClick","stopPropagation","nativeOn","streamDetails","quality","content_type","provider","sample_rate","bit_depth","playerQueueDetails","streamVolumeLevelAdjustment","playerCurTimeStr","playerTotalTimeStr","style","progressBarWidth","progress","playerCommand","state","Math","round","volume_level","players","player_id","truncateString","is_group","child_id","powered","togglePlayerPower","setPlayerVolume","volumePlayerIds","allIds","newVolume","playerId","VListItemSubtitle","VSlider","VolumeControl","cur_item","totalSecs","duration","curSecs","cur_item_time","curPercent","toString","formatDuration","innerWidth","streamdetails","sox_options","re","volLevel","replace","queueUpdatedMsg","getQueueDetails","cmd_opt","activePlayerId","queueId","str","num","VFlex","VFooter","VListItemIcon","VProgressLinear","switchPlayer","is_group_player","filteredPlayerIds","show","getAvailablePlayers","available","NavigationMenu","TopBar","ContextMenu","PlayerOSD","PlayerSelect","serverAddress","loc","origin","pathname","connect","VApp","VMain","VOverlay","VProgressCircular","register","process","ready","registered","cached","updatefound","updated","alert","location","reload","offline","ItemsListing","String","Vue","use","VueRouter","routes","Home","route","params","Browse","router","loadLocaleMessages","locales","require","messages","forEach","matched","match","locale","VueI18n","navigator","language","split","fallbackLocale","Vuetify","globalStore","isInStandaloneMode","handleWindowOptions","addEventListener","destroyed","removeEventListener","body","clientWidth","standalone","matchMedia","matches","install","options","axiosConfig","_axios","axios","server","_address","_ws","connected","syncStatus","endsWith","wsAddress","WebSocket","onopen","_onWsConnect","onmessage","_onWsMessage","onclose","_onWsClose","_onWsError","imageType","size","metadata","album","getData","$log","debug","postData","JSON","stringify","post","put","dataObj","delete","getAllItems","list","urlParams","URLSearchParams","oboe","node","set","done","fullList","queueOpt","newPlayerId","info","player","_selectActivePlayer","msg","parse","message_details","reason","close","enabled","group_parents","lastPlayerId","getItem","isProduction","loggerOptions","isEnabled","logLevel","stringifyArguments","showLogLevel","showMethodName","separator","showConsoleColors","config","productionTip","VueLogger","VueVirtualScroller","store","secNum","parseInt","hours","floor","minutes","seconds","i18n","vuetify","h","App","$mount","hideavatar","version","hidetracknum","track_number","disc_number","owner","provider_ids","hideduration","hidemenu","ProviderIcons","totalitems","prov","height","providerIds","Array","uniqueProviders","output"],"mappings":"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","file":"js/app.d45df414.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"app\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({\"config\":\"config\",\"itemdetails~playerqueue~search\":\"itemdetails~playerqueue~search\",\"itemdetails\":\"itemdetails\",\"playerqueue\":\"playerqueue\",\"search\":\"search\"}[chunkId]||chunkId) + \".\" + {\"config\":\"165ed655\",\"itemdetails~playerqueue~search\":\"3c623cdf\",\"itemdetails\":\"79b5fa05\",\"playerqueue\":\"84a8618a\",\"search\":\"31a9bea8\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"config\":1,\"itemdetails~playerqueue~search\":1,\"itemdetails\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({\"config\":\"config\",\"itemdetails~playerqueue~search\":\"itemdetails~playerqueue~search\",\"itemdetails\":\"itemdetails\",\"playerqueue\":\"playerqueue\",\"search\":\"search\"}[chunkId]||chunkId) + \".\" + {\"config\":\"2956469c\",\"itemdetails~playerqueue~search\":\"133d2876\",\"itemdetails\":\"28909c9e\",\"playerqueue\":\"31d6cfe0\",\"search\":\"31d6cfe0\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"","module.exports = __webpack_public_path__ + \"img/qobuz.c7eb9a76.png\";","module.exports = __webpack_public_path__ + \"img/spotify.1f3fb1af.png\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[_c('v-app-bar',{staticStyle:{\"margin-bottom\":\"-8px\"},attrs:{\"flat\":\"\",\"light\":\"\",\"dense\":\"\",\"color\":\"transparent\"}},[_c('v-label',{attrs:{\"light\":\"\"}},[_vm._v(_vm._s(_vm.items.length + \" \" + _vm.$t(\"items\")))]),_c('v-spacer'),_c('v-menu',{attrs:{\"left\":\"\",\"close-on-content-click\":false},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"}},on),[_c('v-icon',[_vm._v(\"sort\")])],1)]}}])},[_c('v-list',_vm._l((_vm.sortKeys),function(item){return _c('v-list-item',{key:item.value,domProps:{\"textContent\":_vm._s(item.text)},on:{\"click\":function($event){_vm.sortBy = item.value}}})}),1)],1),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){_vm.sortDesc = !_vm.sortDesc}}},[(!_vm.sortDesc)?_c('v-icon',[_vm._v(\"arrow_upward\")]):_vm._e(),(_vm.sortDesc)?_c('v-icon',[_vm._v(\"arrow_downward\")]):_vm._e()],1),_c('v-menu',{attrs:{\"left\":\"\",\"close-on-content-click\":false},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"}},on),[_c('v-icon',[_vm._v(\"search\")])],1)]}}])},[_c('v-card',[_c('v-text-field',{attrs:{\"clearable\":\"\",\"prepend-inner-icon\":\"search\",\"label\":\"Search\",\"hide-details\":\"\",\"solo\":\"\",\"dense\":\"\"},model:{value:(_vm.search),callback:function ($$v) {_vm.search=$$v},expression:\"search\"}})],1)],1),_c('v-btn',{staticStyle:{\"margin-right\":\"-15px\"},attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.toggleViewMode()}}},[(_vm.viewMode == 'panel')?_c('v-icon',[_vm._v(\"view_list\")]):_vm._e(),(_vm.viewMode == 'list')?_c('v-icon',[_vm._v(\"grid_on\")]):_vm._e()],1)],1),_c('v-data-iterator',{attrs:{\"items\":_vm.items,\"search\":_vm.search,\"sort-by\":_vm.sortBy,\"sort-desc\":_vm.sortDesc,\"custom-filter\":_vm.filteredItems,\"hide-default-footer\":\"\",\"disable-pagination\":\"\",\"loading\":\"\"},scopedSlots:_vm._u([{key:\"default\",fn:function(props){return [(_vm.viewMode == 'panel')?_c('v-container',{attrs:{\"fluid\":\"\"}},[_c('v-row',{attrs:{\"dense\":\"\",\"align-content\":\"stretch\",\"align\":\"stretch\"}},_vm._l((props.items),function(item){return _c('v-col',{key:item.item_id,attrs:{\"align-self\":\"stretch\"}},[_c('PanelviewItem',{attrs:{\"item\":item,\"thumbWidth\":_vm.thumbWidth,\"thumbHeight\":_vm.thumbHeight}})],1)}),1)],1):_vm._e(),(_vm.viewMode == 'list')?_c('v-list',{attrs:{\"two-line\":\"\"}},[_c('RecycleScroller',{staticClass:\"scroller\",attrs:{\"items\":props.items,\"item-size\":72,\"key-field\":\"item_id\",\"page-mode\":\"\"},scopedSlots:_vm._u([{key:\"default\",fn:function(ref){\nvar item = ref.item;\nreturn [_c('ListviewItem',{attrs:{\"item\":item,\"hideavatar\":item.media_type == 3 ? _vm.$store.isMobile : false,\"hidetracknum\":true,\"hideproviders\":item.media_type < 4 ? _vm.$store.isMobile : false,\"hidelibrary\":true,\"hidemenu\":item.media_type == 3 ? _vm.$store.isMobile : false,\"hideduration\":item.media_type == 5}})]}}],null,true)})],1):_vm._e()]}}])})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',{directives:[{name:\"longpress\",rawName:\"v-longpress\",value:(_vm.menuClick),expression:\"menuClick\"}],attrs:{\"light\":\"\",\"min-height\":_vm.thumbHeight,\"min-width\":_vm.thumbWidth,\"max-width\":_vm.thumbWidth*1.6,\"hover\":\"\",\"outlined\":\"\"},on:{\"click\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"left\",37,$event.key,[\"Left\",\"ArrowLeft\"])){ return null; }if('button' in $event && $event.button !== 0){ return null; }_vm.onclickHandler ? _vm.onclickHandler(_vm.item) : _vm.itemClicked(_vm.item)},\"contextmenu\":[_vm.menuClick,function($event){$event.preventDefault();}]}},[_c('v-img',{attrs:{\"src\":_vm.$server.getImageUrl(_vm.item, 'image', _vm.thumbWidth),\"width\":\"100%\",\"aspect-ratio\":\"1\"}}),(_vm.isHiRes)?_c('div',{staticStyle:{\"position\":\"absolute\",\"margin-left\":\"5px\",\"margin-top\":\"-13px\",\"height\":\"30px\",\"background-color\":\"white\",\"border-radius\":\"3px\"}},[_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('img',_vm._g({attrs:{\"src\":require('../assets/hires.png'),\"height\":\"25\"}},on))]}}],null,false,1400808392)},[_c('span',[_vm._v(_vm._s(_vm.isHiRes))])])],1):_vm._e(),_c('v-divider'),_c('v-card-title',{class:_vm.$store.isMobile ? 'body-2' : 'title',staticStyle:{\"padding\":\"8px\",\"color\":\"primary\",\"margin-top\":\"8px\"},domProps:{\"textContent\":_vm._s(_vm.item.name)}}),(_vm.item.artist)?_c('v-card-subtitle',{class:_vm.$store.isMobile ? 'caption' : 'body-1',staticStyle:{\"padding\":\"8px\"},domProps:{\"textContent\":_vm._s(_vm.item.artist.name)}}):_vm._e(),(_vm.item.artists)?_c('v-card-subtitle',{class:_vm.$store.isMobile ? 'caption' : 'body-1',staticStyle:{\"padding\":\"8px\"},domProps:{\"textContent\":_vm._s(_vm.item.artists[0].name)}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <v-card\n    light\n    :min-height=\"thumbHeight\"\n    :min-width=\"thumbWidth\"\n    :max-width=\"thumbWidth*1.6\"\n    hover\n    outlined\n    @click.left=\"onclickHandler ? onclickHandler(item) : itemClicked(item)\"\n    @contextmenu=\"menuClick\"\n    @contextmenu.prevent\n    v-longpress=\"menuClick\"\n  >\n    <v-img\n      :src=\"$server.getImageUrl(item, 'image', thumbWidth)\"\n      width=\"100%\"\n      aspect-ratio=\"1\"\n    >\n    </v-img>\n    <div v-if=\"isHiRes\" style=\"position:absolute;margin-left:5px;margin-top:-13px;height:30px;background-color: white;border-radius: 3px;\">\n    <v-tooltip bottom>\n          <template v-slot:activator=\"{ on }\">\n          <img :src=\"require('../assets/hires.png')\" height=\"25\" v-on=\"on\" />\n          </template>\n          <span>{{ isHiRes }}</span>\n        </v-tooltip>\n    </div>\n    <v-divider />\n    <v-card-title\n      :class=\"$store.isMobile ? 'body-2' : 'title'\"\n      v-text=\"item.name\"\n      style=\"padding: 8px;color: primary;margin-top:8px\"\n    />\n    <v-card-subtitle\n      :class=\"$store.isMobile ? 'caption' : 'body-1'\"\n      v-text=\"item.artist.name\"\n      v-if=\"item.artist\"\n      style=\"padding: 8px\"\n    />\n    <v-card-subtitle\n      :class=\"$store.isMobile ? 'caption' : 'body-1'\"\n      v-text=\"item.artists[0].name\"\n      v-if=\"item.artists\"\n      style=\"padding: 8px\"\n    />\n  </v-card>\n</template>\n\n<script>\nimport Vue from 'vue'\n\nconst PRESS_TIMEOUT = 600\n\nVue.directive('longpress', {\n  bind: function (el, { value }, vNode) {\n    if (typeof value !== 'function') {\n      Vue.$log.warn(`Expect a function, got ${value}`)\n      return\n    }\n    let pressTimer = null\n    const start = e => {\n      if (e.type === 'click' && e.button !== 0) {\n        return\n      }\n      if (pressTimer === null) {\n        pressTimer = setTimeout(() => value(e), PRESS_TIMEOUT)\n      }\n    }\n    const cancel = () => {\n      if (pressTimer !== null) {\n        clearTimeout(pressTimer)\n        pressTimer = null\n      }\n    }\n    ;['mousedown', 'touchstart'].forEach(e => el.addEventListener(e, start))\n    ;['click', 'mouseout', 'touchend', 'touchcancel'].forEach(e => el.addEventListener(e, cancel))\n  }\n})\n\nexport default Vue.extend({\n  components: {\n  },\n  props: {\n    item: Object,\n    thumbHeight: Number,\n    thumbWidth: Number,\n    hideproviders: Boolean,\n    hidelibrary: Boolean,\n    onclickHandler: null\n  },\n  data () {\n    return {\n      touchMoving: false,\n      cancelled: false\n    }\n  },\n  computed: {\n    isHiRes () {\n      for (var prov of this.item.provider_ids) {\n        if (prov.quality > 6) {\n          if (prov.details) {\n            return prov.details\n          } else if (prov.quality === 7) {\n            return '44.1/48khz 24 bits'\n          } else if (prov.quality === 8) {\n            return '88.2/96khz 24 bits'\n          } else if (prov.quality === 9) {\n            return '176/192khz 24 bits'\n          } else {\n            return '+192kHz 24 bits'\n          }\n        }\n      }\n      return ''\n    }\n  },\n  created () { },\n  beforeDestroy () {\n    this.cancelled = true\n  },\n  mounted () { },\n  methods: {\n    itemClicked (mediaItem = null) {\n      // mediaItem in the list is clicked\n      let url = ''\n      if (mediaItem.media_type === 1) {\n        url = '/artists/' + mediaItem.item_id\n      } else if (mediaItem.media_type === 2) {\n        url = '/albums/' + mediaItem.item_id\n      } else if (mediaItem.media_type === 4) {\n        url = '/playlists/' + mediaItem.item_id\n      } else {\n        // assume track (or radio) item\n        this.$server.$emit('showPlayMenu', mediaItem)\n        return\n      }\n      this.$router.push({ path: url, query: { provider: mediaItem.provider } })\n    },\n    menuClick () {\n      // contextmenu button clicked\n      if (this.cancelled) return\n      this.$server.$emit('showContextMenu', this.item)\n    },\n    async toggleLibrary (mediaItem) {\n      // library button clicked on item\n      this.cancelled = true\n      await this.$server.toggleLibrary(mediaItem)\n      this.cancelled = false\n    }\n  }\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PanelviewItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PanelviewItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PanelviewItem.vue?vue&type=template&id=e92cc4a4&\"\nimport script from \"./PanelviewItem.vue?vue&type=script&lang=js&\"\nexport * from \"./PanelviewItem.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCardSubtitle } from 'vuetify/lib/components/VCard';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VCard,VCardSubtitle,VCardTitle,VDivider,VImg,VTooltip})\n","<template>\n  <section>\n    <v-app-bar\n      flat\n      light\n      dense\n      color=\"transparent\"\n      style=\"margin-bottom:-8px;\"\n    >\n      <v-label light>{{ items.length + \" \" + $t(\"items\") }}</v-label>\n      <v-spacer></v-spacer>\n      <v-menu left :close-on-content-click=\"false\">\n        <template v-slot:activator=\"{ on }\">\n          <v-btn icon v-on=\"on\">\n            <v-icon>sort</v-icon>\n          </v-btn>\n        </template>\n        <v-list>\n          <v-list-item\n            v-for=\"item of sortKeys\"\n            :key=\"item.value\"\n            v-text=\"item.text\"\n            @click=\"sortBy = item.value\"\n          >\n          </v-list-item>\n        </v-list>\n      </v-menu>\n      <v-btn icon @click=\"sortDesc = !sortDesc\">\n        <v-icon v-if=\"!sortDesc\">arrow_upward</v-icon>\n        <v-icon v-if=\"sortDesc\">arrow_downward</v-icon>\n      </v-btn>\n      <v-menu left :close-on-content-click=\"false\">\n        <template v-slot:activator=\"{ on }\">\n          <v-btn icon v-on=\"on\">\n            <v-icon>search</v-icon>\n          </v-btn>\n        </template>\n        <v-card>\n          <v-text-field\n            v-model=\"search\"\n            clearable\n            prepend-inner-icon=\"search\"\n            label=\"Search\"\n            hide-details\n            solo\n            dense\n          ></v-text-field>\n        </v-card>\n      </v-menu>\n      <v-btn icon @click=\"toggleViewMode()\" style=\"margin-right:-15px;\">\n        <v-icon v-if=\"viewMode == 'panel'\">view_list</v-icon>\n        <v-icon v-if=\"viewMode == 'list'\">grid_on</v-icon>\n      </v-btn>\n    </v-app-bar>\n    <v-data-iterator\n      :items=\"items\"\n      :search=\"search\"\n      :sort-by=\"sortBy\"\n      :sort-desc=\"sortDesc\"\n      :custom-filter=\"filteredItems\"\n      hide-default-footer\n      disable-pagination\n      loading\n    >\n      <template v-slot:default=\"props\">\n        <v-container fluid v-if=\"viewMode == 'panel'\">\n          <v-row dense align-content=\"stretch\" align=\"stretch\">\n            <v-col\n              v-for=\"item in props.items\"\n              :key=\"item.item_id\"\n              align-self=\"stretch\"\n            >\n              <PanelviewItem\n                :item=\"item\"\n                :thumbWidth=\"thumbWidth\"\n                :thumbHeight=\"thumbHeight\"\n              />\n            </v-col>\n          </v-row>\n        </v-container>\n        <v-list two-line v-if=\"viewMode == 'list'\">\n          <RecycleScroller\n            class=\"scroller\"\n            :items=\"props.items\"\n            :item-size=\"72\"\n            key-field=\"item_id\"\n            v-slot=\"{ item }\"\n            page-mode\n          >\n            <ListviewItem\n              v-bind:item=\"item\"\n              :hideavatar=\"item.media_type == 3 ? $store.isMobile : false\"\n              :hidetracknum=\"true\"\n              :hideproviders=\"item.media_type < 4 ? $store.isMobile : false\"\n              :hidelibrary=\"true\"\n              :hidemenu=\"item.media_type == 3 ? $store.isMobile : false\"\n              :hideduration=\"item.media_type == 5\"\n            ></ListviewItem>\n          </RecycleScroller>\n        </v-list>\n      </template>\n    </v-data-iterator>\n  </section>\n</template>\n\n<style scoped>\n.scroller {\n  height: 100%;\n}\n</style>\n\n<script>\n// @ is an alias to /src\nimport ListviewItem from '@/components/ListviewItem.vue'\nimport PanelviewItem from '@/components/PanelviewItem.vue'\n\nexport default {\n  components: {\n    ListviewItem,\n    PanelviewItem\n  },\n  props: [\n    'mediatype',\n    'endpoint'\n  ],\n  data () {\n    return {\n      items: [],\n      viewMode: 'list',\n      search: '',\n      sortDesc: false,\n      sortBy: 'name',\n      sortKeys: [{ text: this.$t('sort_name'), value: 'name' }]\n    }\n  },\n  created () {\n    if (this.endpoint.includes('playlists/')) {\n      // playlist tracks\n      this.sortKeys.push({ text: this.$t('sort_position'), value: 'position' })\n      this.sortKeys.push({ text: this.$t('sort_artist'), value: 'artists[0].name' })\n      this.sortKeys.push({ text: this.$t('sort_album'), value: 'album.name' })\n      this.sortBy = 'position'\n      this.viewMode = 'list'\n    } else if (this.endpoint.includes('tracks')) {\n      // tracks listing\n      this.sortKeys.push({ text: this.$t('sort_artist'), value: 'artists[0].name' })\n      this.sortKeys.push({ text: this.$t('sort_album'), value: 'album.name' })\n      this.viewMode = 'list'\n    } else if (this.endpoint.includes('albums')) {\n      // albums listing\n      this.sortKeys.push({ text: this.$t('sort_artist'), value: 'artist.name' })\n      this.sortKeys.push({ text: this.$t('sort_date'), value: 'year' })\n      this.viewMode = 'panel'\n    } else {\n      this.viewMode = 'list'\n    }\n    // get stored viewMode for this endpoint\n    const viewMode = localStorage.getItem('viewMode' + this.mediatype + this.endpoint)\n    if (viewMode !== null) {\n      this.viewMode = viewMode\n    }\n    this.getItems()\n    this.$server.$on('refresh_listing', this.getItems)\n  },\n  computed: {\n    thumbWidth () {\n      return this.$store.isMobile ? 120 : 175\n    },\n    thumbHeight () {\n      return this.thumbWidth * 1.5\n    }\n  },\n  methods: {\n    async getItems () {\n      // retrieve the full list of items\n      await this.$server.getAllItems(this.endpoint, this.items)\n    },\n    toggleViewMode () {\n      if (this.viewMode === 'panel') this.viewMode = 'list'\n      else this.viewMode = 'panel'\n      localStorage.setItem('viewMode' + this.mediatype + this.endpoint, this.viewMode)\n    },\n    filteredItems (items, search) {\n      if (!search) return items\n      search = search.toLowerCase()\n      const newLst = []\n      for (const item of items) {\n        if (item.name.toLowerCase().includes(search)) {\n          newLst.push(item)\n        } else if (item.artist && item.artist.name.toLowerCase().includes(search)) {\n          newLst.push(item)\n        } else if (item.album && item.album.name.toLowerCase().includes(search)) {\n          newLst.push(item)\n        } else if (item.artists && item.artists[0].name.toLowerCase().includes(search)) {\n          newLst.push(item)\n        }\n      }\n      return newLst\n    }\n  }\n}\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemsListing.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemsListing.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemsListing.vue?vue&type=template&id=764b0c8e&scoped=true&\"\nimport script from \"./ItemsListing.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemsListing.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemsListing.vue?vue&type=style&index=0&id=764b0c8e&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"764b0c8e\",\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAppBar } from 'vuetify/lib/components/VAppBar';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VCol } from 'vuetify/lib/components/VGrid';\nimport { VContainer } from 'vuetify/lib/components/VGrid';\nimport { VDataIterator } from 'vuetify/lib/components/VDataIterator';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VLabel } from 'vuetify/lib/components/VLabel';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VRow } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\nimport { VTextField } from 'vuetify/lib/components/VTextField';\ninstallComponents(component, {VAppBar,VBtn,VCard,VCol,VContainer,VDataIterator,VIcon,VLabel,VList,VListItem,VMenu,VRow,VSpacer,VTextField})\n","module.exports = __webpack_public_path__ + \"img/demo_player.c079bd97.png\";","module.exports = __webpack_public_path__ + \"img/http_streamer.4c4e4880.png\";","module.exports = __webpack_public_path__ + \"img/homeassistant.29fe3282.png\";","module.exports = __webpack_public_path__ + \"img/webplayer.8e1a0da9.png\";","var map = {\n\t\"./en.json\": \"edd4\",\n\t\"./nl.json\": \"a625\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"49f8\";","module.exports = __webpack_public_path__ + \"img/default_artist.7305b29c.png\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerSelect.vue?vue&type=style&index=0&id=7c65a917&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerSelect.vue?vue&type=style&index=0&id=7c65a917&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',[_c('TopBar'),_c('NavigationMenu'),_c('v-main',[_c('router-view',{key:_vm.$route.path,attrs:{\"app\":\"\"}})],1),_c('PlayerOSD',{attrs:{\"showPlayerSelect\":_vm.showPlayerSelect}}),_c('ContextMenu'),_c('PlayerSelect'),_c('v-overlay',{attrs:{\"value\":_vm.$store.loading}},[_c('v-progress-circular',{attrs:{\"indeterminate\":\"\",\"size\":\"64\"}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-navigation-drawer',{attrs:{\"dark\":\"\",\"app\":\"\",\"clipped\":\"\",\"temporary\":\"\"},model:{value:(_vm.$store.showNavigationMenu),callback:function ($$v) {_vm.$set(_vm.$store, \"showNavigationMenu\", $$v)},expression:\"$store.showNavigationMenu\"}},[_c('v-list',[_vm._l((_vm.items),function(item){return _c('v-list-item',{key:item.title,on:{\"click\":function($event){return _vm.$router.push(item.path)}}},[_c('v-list-item-action',[_c('v-icon',[_vm._v(_vm._s(item.icon))])],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(_vm._s(item.title))])],1)],1)}),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){_vm.$store.showNavigationMenu=!_vm.$store.showNavigationMenu}}})],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <v-navigation-drawer dark app clipped temporary v-model=\"$store.showNavigationMenu\">\n    <v-list>\n      <v-list-item v-for=\"item in items\" :key=\"item.title\" @click=\"$router.push(item.path)\">\n        <v-list-item-action>\n          <v-icon>{{ item.icon }}</v-icon>\n        </v-list-item-action>\n        <v-list-item-content>\n          <v-list-item-title>{{ item.title }}</v-list-item-title>\n        </v-list-item-content>\n      </v-list-item>\n      <v-btn icon v-on:click=\"$store.showNavigationMenu=!$store.showNavigationMenu\" />\n    </v-list>\n  </v-navigation-drawer>\n</template>\n\n<script>\nimport Vue from 'vue'\n\nexport default Vue.extend({\n  props: {},\n  data () {\n    return {\n      items: [\n        { title: this.$t('home'), icon: 'home', path: '/' },\n        { title: this.$t('artists'), icon: 'person', path: '/artists' },\n        { title: this.$t('albums'), icon: 'album', path: '/albums' },\n        { title: this.$t('tracks'), icon: 'audiotrack', path: '/tracks' },\n        { title: this.$t('playlists'), icon: 'playlist_play', path: '/playlists' },\n        { title: this.$t('radios'), icon: 'radio', path: '/radios' },\n        { title: this.$t('search'), icon: 'search', path: '/search' },\n        { title: this.$t('settings'), icon: 'settings', path: '/config' }\n      ]\n    }\n  },\n  mounted () { },\n  methods: {}\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NavigationMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./NavigationMenu.vue?vue&type=template&id=5fe9f182&\"\nimport script from \"./NavigationMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./NavigationMenu.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VNavigationDrawer } from 'vuetify/lib/components/VNavigationDrawer';\ninstallComponents(component, {VBtn,VIcon,VList,VListItem,VListItemAction,VListItemContent,VListItemTitle,VNavigationDrawer})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app-bar',{attrs:{\"app\":\"\",\"flat\":\"\",\"dense\":\"\",\"dark\":\"\",\"color\":_vm.color}},[_c('v-layout',[(!_vm.$store.topBarTransparent)?_c('div',{staticClass:\"body-1\",staticStyle:{\"position\":\"fixed\",\"width\":\"100%\",\"text-align\":\"center\",\"vertical-align\":\"center\",\"margin-top\":\"11px\"}},[_vm._v(_vm._s(_vm.$store.windowtitle))]):_vm._e(),_c('v-btn',{staticStyle:{\"margin-left\":\"-13px\"},attrs:{\"icon\":\"\"},on:{\"click\":function($event){_vm.$store.showNavigationMenu=!_vm.$store.showNavigationMenu}}},[_c('v-icon',[_vm._v(\"menu\")])],1),_c('v-btn',{attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.$router.go(-1)}}},[_c('v-icon',[_vm._v(\"arrow_back\")])],1),_c('v-spacer'),(_vm.$store.topBarContextItem)?_c('v-btn',{staticStyle:{\"margin-right\":\"-23px\"},attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.$server.$emit('showContextMenu', _vm.$store.topBarContextItem)}}},[_c('v-icon',[_vm._v(\"more_vert\")])],1):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <v-app-bar app flat dense dark :color=\"color\">\n    <v-layout>\n      <div class=\"body-1\" v-if=\"!$store.topBarTransparent\" style=\"position:fixed;width:100%;text-align:center;vertical-align:center;margin-top:11px;\">{{ $store.windowtitle }}</div>\n      <v-btn icon v-on:click=\"$store.showNavigationMenu=!$store.showNavigationMenu\" style=\"margin-left:-13px\">\n        <v-icon>menu</v-icon>\n      </v-btn>\n      <v-btn @click=\"$router.go(-1)\" icon>\n        <v-icon>arrow_back</v-icon>\n      </v-btn>\n      <v-spacer></v-spacer>\n      <v-btn v-if=\"$store.topBarContextItem\" icon @click=\"$server.$emit('showContextMenu', $store.topBarContextItem)\" style=\"margin-right:-23px\">\n        <v-icon>more_vert</v-icon>\n      </v-btn>\n    </v-layout>\n  </v-app-bar>\n</template>\n\n<script>\nimport Vue from 'vue'\n\nexport default Vue.extend({\n  props: { },\n  data () {\n    return {\n    }\n  },\n  computed: {\n    color () {\n      if (this.$store.topBarTransparent) {\n        return 'transparent'\n      } else return 'black'\n    }\n  },\n  mounted () { },\n  methods: {}\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TopBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TopBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TopBar.vue?vue&type=template&id=0b1c8523&\"\nimport script from \"./TopBar.vue?vue&type=script&lang=js&\"\nexport * from \"./TopBar.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VAppBar } from 'vuetify/lib/components/VAppBar';\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VLayout } from 'vuetify/lib/components/VGrid';\nimport { VSpacer } from 'vuetify/lib/components/VGrid';\ninstallComponents(component, {VAppBar,VBtn,VIcon,VLayout,VSpacer})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-dialog',{attrs:{\"max-width\":\"500px\"},on:{\"input\":function($event){return _vm.$emit('input', $event)}},model:{value:(_vm.visible),callback:function ($$v) {_vm.visible=$$v},expression:\"visible\"}},[_c('v-card',[(_vm.playlists.length === 0)?_c('v-list',[_c('v-subheader',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.header))]),(_vm.subheader)?_c('v-subheader',[_vm._v(_vm._s(_vm.subheader))]):_vm._e(),_vm._l((_vm.menuItems),function(item){return _c('div',{key:item.label},[_c('v-list-item',{on:{\"click\":function($event){return _vm.itemCommand(item.action)}}},[_c('v-list-item-avatar',[_c('v-icon',[_vm._v(_vm._s(item.icon))])],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(_vm._s(_vm.$t(item.label)))])],1)],1),_c('v-divider')],1)})],2):_vm._e(),(_vm.playlists.length > 0)?_c('v-list',[_c('v-subheader',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.header))]),_vm._l((_vm.playlists),function(item,index){return _c('listviewItem',{key:item.item_id,attrs:{\"item\":item,\"totalitems\":_vm.playlists.length,\"index\":index,\"hideavatar\":false,\"hidetracknum\":true,\"hideproviders\":false,\"hidelibrary\":true,\"hidemenu\":true,\"onclickHandler\":_vm.addToPlaylist}})})],2):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n  <v-dialog v-model=\"visible\" @input=\"$emit('input', $event)\" max-width=\"500px\">\r\n    <v-card>\r\n      <!-- normal contextmenu items -->\r\n      <v-list v-if=\"playlists.length === 0\">\r\n        <v-subheader class=\"title\">{{ header }}</v-subheader>\r\n        <v-subheader v-if=\"subheader\">{{ subheader }}</v-subheader>\r\n        <div v-for=\"item of menuItems\" :key=\"item.label\">\r\n          <v-list-item @click=\"itemCommand(item.action)\">\r\n            <v-list-item-avatar>\r\n              <v-icon>{{ item.icon }}</v-icon>\r\n            </v-list-item-avatar>\r\n            <v-list-item-content>\r\n              <v-list-item-title>{{ $t(item.label) }}</v-list-item-title>\r\n            </v-list-item-content>\r\n          </v-list-item>\r\n          <v-divider></v-divider>\r\n        </div>\r\n      </v-list>\r\n      <!-- playlists selection -->\r\n      <v-list v-if=\"playlists.length > 0\">\r\n        <v-subheader class=\"title\">{{ header }}</v-subheader>\r\n        <listviewItem\r\n          v-for=\"(item, index) in playlists\"\r\n          :key=\"item.item_id\"\r\n          v-bind:item=\"item\"\r\n          v-bind:totalitems=\"playlists.length\"\r\n          v-bind:index=\"index\"\r\n          :hideavatar=\"false\"\r\n          :hidetracknum=\"true\"\r\n          :hideproviders=\"false\"\r\n          :hidelibrary=\"true\"\r\n          :hidemenu=\"true\"\r\n          :onclickHandler=\"addToPlaylist\"\r\n        ></listviewItem>\r\n      </v-list>\r\n    </v-card>\r\n  </v-dialog>\r\n</template>\r\n\r\n<script>\r\nimport Vue from 'vue'\r\nimport ListviewItem from '@/components/ListviewItem.vue'\r\n\r\nexport default Vue.extend({\r\n  components:\r\n  {\r\n    ListviewItem\r\n  },\r\n  props:\r\n    {},\r\n  watch:\r\n    {},\r\n  data () {\r\n    return {\r\n      visible: false,\r\n      menuItems: [],\r\n      header: '',\r\n      subheader: '',\r\n      curItem: null,\r\n      curPlaylist: null,\r\n      playerQueueItems: [],\r\n      playlists: []\r\n    }\r\n  },\r\n  mounted () { },\r\n  created () {\r\n    this.$server.$on('showContextMenu', this.showContextMenu)\r\n    this.$server.$on('showPlayMenu', this.showPlayMenu)\r\n  },\r\n  computed: {\r\n  },\r\n  methods: {\r\n    showContextMenu (mediaItem) {\r\n      // show contextmenu items for the given mediaItem\r\n      this.playlists = []\r\n      if (!mediaItem) return\r\n      this.curItem = mediaItem\r\n      const curBrowseContext = this.$store.topBarContextItem\r\n      const menuItems = []\r\n      // show info\r\n      if (mediaItem !== curBrowseContext) {\r\n        menuItems.push({\r\n          label: 'show_info',\r\n          action: 'info',\r\n          icon: 'info'\r\n        })\r\n      }\r\n      // add to library\r\n      if (mediaItem.in_library.length === 0) {\r\n        menuItems.push({\r\n          label: 'add_library',\r\n          action: 'toggle_library',\r\n          icon: 'favorite_border'\r\n        })\r\n      }\r\n      // remove from library\r\n      if (mediaItem.in_library.length > 0) {\r\n        menuItems.push({\r\n          label: 'remove_library',\r\n          action: 'toggle_library',\r\n          icon: 'favorite'\r\n        })\r\n      }\r\n      // remove from playlist (playlist tracks only)\r\n      if (curBrowseContext && curBrowseContext.media_type === 4) {\r\n        this.curPlaylist = curBrowseContext\r\n        if (mediaItem.media_type === 3 && curBrowseContext.is_editable) {\r\n          menuItems.push({\r\n            label: 'remove_playlist',\r\n            action: 'remove_playlist',\r\n            icon: 'remove_circle_outline'\r\n          })\r\n        }\r\n      }\r\n      // add to playlist action (tracks only)\r\n      if (mediaItem.media_type === 3) {\r\n        menuItems.push({\r\n          label: 'add_playlist',\r\n          action: 'add_playlist',\r\n          icon: 'add_circle_outline'\r\n        })\r\n      }\r\n      this.menuItems = menuItems\r\n      this.header = mediaItem.name\r\n      this.subheader = ''\r\n      this.visible = true\r\n    },\r\n    showPlayMenu (mediaItem) {\r\n      // show playmenu items for the given mediaItem\r\n      this.playlists = []\r\n      this.curItem = mediaItem\r\n      if (!mediaItem) return\r\n      const menuItems = [\r\n        {\r\n          label: 'play_now',\r\n          action: 'play',\r\n          icon: 'play_circle_outline'\r\n        },\r\n        {\r\n          label: 'play_next',\r\n          action: 'next',\r\n          icon: 'queue_play_next'\r\n        },\r\n        {\r\n          label: 'add_queue',\r\n          action: 'add',\r\n          icon: 'playlist_add'\r\n        }\r\n      ]\r\n      this.menuItems = menuItems\r\n      this.header = mediaItem.name\r\n      this.subheader = ''\r\n      this.visible = true\r\n    },\r\n    async showPlaylistsMenu () {\r\n      // get all editable playlists\r\n      const trackProviders = []\r\n      for (const item of this.curItem.provider_ids) {\r\n        trackProviders.push(item.provider)\r\n      }\r\n      const playlists = await this.$server.getData('library/playlists')\r\n      const items = []\r\n      for (var playlist of playlists.items) {\r\n        if (\r\n          playlist.is_editable &&\r\n          (!this.curPlaylist || playlist.item_id !== this.curPlaylist.item_id)\r\n        ) {\r\n          for (const item of playlist.provider_ids) {\r\n            if (trackProviders.includes(item.provider)) {\r\n              items.push(playlist)\r\n              break\r\n            }\r\n          }\r\n        }\r\n      }\r\n      this.playlists = items\r\n    },\r\n    itemCommand (cmd) {\r\n      if (cmd === 'info') {\r\n        // show media info\r\n        let endpoint = ''\r\n        if (this.curItem.media_type === 1) endpoint = 'artists'\r\n        if (this.curItem.media_type === 2) endpoint = 'albums'\r\n        if (this.curItem.media_type === 3) endpoint = 'tracks'\r\n        if (this.curItem.media_type === 4) endpoint = 'playlists'\r\n        if (this.curItem.media_type === 5) endpoint = 'radios'\r\n        this.$router.push({\r\n          path: '/' + endpoint + '/' + this.curItem.item_id,\r\n          query: { provider: this.curItem.provider }\r\n        })\r\n        this.visible = false\r\n      } else if (cmd === 'playmenu') {\r\n        // show play menu\r\n        return this.showPlayMenu(this.curItem)\r\n      } else if (cmd === 'add_playlist') {\r\n        // add to playlist\r\n        return this.showPlaylistsMenu()\r\n      } else if (cmd === 'remove_playlist') {\r\n        // remove track from playlist\r\n        this.removeFromPlaylist(\r\n          this.curItem,\r\n          this.curPlaylist.item_id,\r\n          'playlist_remove'\r\n        )\r\n        this.visible = false\r\n      } else if (cmd === 'toggle_library') {\r\n        // add/remove to/from library\r\n        this.$server.toggleLibrary(this.curItem)\r\n        this.visible = false\r\n      } else {\r\n        // assume play command\r\n        this.$server.playItem(this.curItem, cmd)\r\n        this.visible = false\r\n      }\r\n    },\r\n    addToPlaylist (playlistObj) {\r\n      /// add track to playlist\r\n      const endpoint = 'playlists/' + playlistObj.item_id + '/tracks'\r\n      this.$server.putData(endpoint, this.curItem)\r\n        .then(result => {\r\n          this.visible = false\r\n        })\r\n    },\r\n    removeFromPlaylist (track, playlistId) {\r\n      /// remove track from playlist\r\n      const endpoint = 'playlists/' + playlistId + '/tracks'\r\n      this.$server.deleteData(endpoint, track)\r\n        .then(result => {\r\n          // reload listing\r\n          this.$server.$emit('refresh_listing')\r\n        })\r\n    }\r\n  }\r\n})\r\n</script>\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ContextMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ContextMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ContextMenu.vue?vue&type=template&id=0f9be24a&\"\nimport script from \"./ContextMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./ContextMenu.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VDialog } from 'vuetify/lib/components/VDialog';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VSubheader } from 'vuetify/lib/components/VSubheader';\ninstallComponents(component, {VCard,VDialog,VDivider,VIcon,VList,VListItem,VListItemAvatar,VListItemContent,VListItemTitle,VSubheader})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-footer',{staticStyle:{\"background-color\":\"black\"},attrs:{\"app\":\"\",\"fixed\":\"\",\"padless\":\"\",\"light\":\"\",\"elevation\":\"10\"}},[(!_vm.$store.isMobile)?_c('v-card',{staticStyle:{\"margin-top\":\"1px\"},attrs:{\"dense\":\"\",\"flat\":\"\",\"light\":\"\",\"subheader\":\"\",\"tile\":\"\",\"width\":\"100%\",\"color\":\"#E0E0E0\"}},[_c('v-list-item',{attrs:{\"two-line\":\"\"}},[(_vm.curQueueItem)?_c('v-list-item-avatar',{attrs:{\"tile\":\"\"}},[_c('img',{staticStyle:{\"border\":\"1px solid rgba(0,0,0,.54)\"},attrs:{\"src\":_vm.$server.getImageUrl(_vm.curQueueItem),\"lazy-src\":require('../assets/file.png')}})]):_c('v-list-item-avatar',[_c('v-icon',[_vm._v(\"speaker\")])],1),_c('v-list-item-content',[(_vm.curQueueItem)?_c('v-list-item-title',[_vm._v(\" \"+_vm._s(_vm.curQueueItem.name))]):(_vm.$server.activePlayer)?_c('v-list-item-title',[_vm._v(\" \"+_vm._s(_vm.$server.activePlayer.name))]):_vm._e(),(_vm.curQueueItem)?_c('v-list-item-subtitle',{staticStyle:{\"color\":\"primary\"}},_vm._l((_vm.curQueueItem.artists),function(artist,artistindex){return _c('span',{key:artistindex},[_c('a',{on:{\"click\":[function($event){return _vm.artistClick(artist)},function($event){$event.stopPropagation();}]}},[_vm._v(_vm._s(artist.name))]),(artistindex + 1 < _vm.curQueueItem.artists.length)?_c('label',{key:artistindex},[_vm._v(\" / \")]):_vm._e()])}),0):_vm._e()],1),(_vm.streamDetails)?_c('v-list-item-action',[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-width\":250,\"offset-x\":\"\",\"top\":\"\"},nativeOn:{\"click\":function($event){$event.preventDefault();}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"}},on),[(_vm.streamDetails.quality > 6)?_c('v-img',{attrs:{\"contain\":\"\",\"src\":require('../assets/hires.png'),\"height\":\"30\"}}):_vm._e(),(_vm.streamDetails.quality <= 6)?_c('v-img',{staticStyle:{\"filter\":\"invert(100%)\"},attrs:{\"contain\":\"\",\"src\":_vm.streamDetails.content_type ? require('../assets/' + _vm.streamDetails.content_type + '.png') : '',\"height\":\"30\"}}):_vm._e()],1)]}}],null,false,872579316)},[(_vm.streamDetails)?_c('v-list',[_c('v-subheader',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('stream_details')))]),_c('v-list-item',{attrs:{\"tile\":\"\",\"dense\":\"\"}},[_c('v-list-item-icon',[_c('v-img',{attrs:{\"max-width\":\"50\",\"contain\":\"\",\"src\":_vm.streamDetails.provider ? require('../assets/' + _vm.streamDetails.provider + '.png') : ''}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(_vm._s(_vm.streamDetails.provider))])],1)],1),_c('v-divider'),_c('v-list-item',{attrs:{\"tile\":\"\",\"dense\":\"\"}},[_c('v-list-item-icon',[_c('v-img',{staticStyle:{\"filter\":\"invert(100%)\"},attrs:{\"max-width\":\"50\",\"contain\":\"\",\"src\":_vm.streamDetails.content_type ? require('../assets/' + _vm.streamDetails.content_type + '.png') : ''}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(_vm._s(_vm.streamDetails.sample_rate/1000)+\" kHz / \"+_vm._s(_vm.streamDetails.bit_depth)+\" bits \")])],1)],1),_c('v-divider'),(_vm.playerQueueDetails.crossfade_enabled)?_c('div',[_c('v-list-item',{attrs:{\"tile\":\"\",\"dense\":\"\"}},[_c('v-list-item-icon',[_c('v-img',{attrs:{\"max-width\":\"50\",\"contain\":\"\",\"src\":require('../assets/crossfade.png')}})],1),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(_vm._s(_vm.$t('crossfade_enabled')))])],1)],1),_c('v-divider')],1):_vm._e(),(_vm.streamVolumeLevelAdjustment)?_c('div',[_c('v-list-item',{attrs:{\"tile\":\"\",\"dense\":\"\"}},[_c('v-list-item-icon',[_c('v-icon',{staticStyle:{\"margin-left\":\"13px\"},attrs:{\"color\":\"black\"}},[_vm._v(\"volume_up\")])],1),_c('v-list-item-content',[_c('v-list-item-title',{staticStyle:{\"margin-left\":\"12px\"}},[_vm._v(_vm._s(_vm.streamVolumeLevelAdjustment))])],1)],1),_c('v-divider')],1):_vm._e()],1):_vm._e()],1)],1):_vm._e()],1),_c('div',{staticClass:\"body-2\",staticStyle:{\"height\":\"30px\",\"width\":\"100%\",\"color\":\"rgba(0,0,0,.65)\",\"margin-top\":\"-12px\",\"background-color\":\"#E0E0E0\"},attrs:{\"align\":\"center\"}},[(_vm.curQueueItem)?_c('div',{staticStyle:{\"height\":\"12px\",\"margin-left\":\"22px\",\"margin-right\":\"20px\",\"margin-top\":\"2px\"}},[_c('span',{staticClass:\"left\"},[_vm._v(\" \"+_vm._s(_vm.playerCurTimeStr)+\" \")]),_c('span',{staticClass:\"right\"},[_vm._v(\" \"+_vm._s(_vm.playerTotalTimeStr)+\" \")])]):_vm._e()]),(_vm.curQueueItem)?_c('v-progress-linear',{style:('margin-top:-22px;margin-left:80px;width:' + _vm.progressBarWidth + 'px;'),attrs:{\"fixed\":\"\",\"light\":\"\",\"value\":_vm.progress}}):_vm._e()],1):_vm._e(),_c('v-list-item',{staticStyle:{\"height\":\"62px\",\"margin-bottom\":\"5px\",\"margin-top\":\"-4px\",\"background-color\":\"black\"},attrs:{\"dark\":\"\",\"dense\":\"\"}},[(_vm.$server.activePlayer)?_c('v-list-item-action',{staticStyle:{\"margin-top\":\"15px\"}},[_c('v-btn',{attrs:{\"small\":\"\",\"icon\":\"\"},on:{\"click\":function($event){return _vm.playerCommand('previous')}}},[_c('v-icon',[_vm._v(\"skip_previous\")])],1)],1):_vm._e(),(_vm.$server.activePlayer)?_c('v-list-item-action',{staticStyle:{\"margin-left\":\"-32px\",\"margin-top\":\"15px\"}},[_c('v-btn',{attrs:{\"icon\":\"\",\"x-large\":\"\"},on:{\"click\":function($event){return _vm.playerCommand('play_pause')}}},[_c('v-icon',{attrs:{\"size\":\"50\"}},[_vm._v(_vm._s(_vm.$server.activePlayer.state == \"playing\" ? \"pause\" : \"play_arrow\"))])],1)],1):_vm._e(),(_vm.$server.activePlayer)?_c('v-list-item-action',{staticStyle:{\"margin-top\":\"15px\"}},[_c('v-btn',{attrs:{\"icon\":\"\",\"small\":\"\"},on:{\"click\":function($event){return _vm.playerCommand('next')}}},[_c('v-icon',[_vm._v(\"skip_next\")])],1)],1):_vm._e(),_c('v-list-item-content'),(_vm.$server.activePlayer)?_c('v-list-item-action',{staticStyle:{\"padding\":\"28px\"}},[_c('v-btn',{attrs:{\"text\":\"\",\"icon\":\"\"},on:{\"click\":function($event){return _vm.$router.push('/playerqueue/')}}},[_c('v-flex',{staticClass:\"vertical-btn\",attrs:{\"xs12\":\"\"}},[_c('v-icon',[_vm._v(\"queue_music\")]),_c('span',{staticClass:\"caption\",staticStyle:{\"padding-top\":\"5px\"}},[_vm._v(_vm._s(_vm.$t(\"queue\")))])],1)],1)],1):_vm._e(),(_vm.$server.activePlayer && !_vm.$store.isMobile)?_c('v-list-item-action',{staticStyle:{\"padding\":\"20px\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"nudge-width\":250,\"offset-x\":\"\",\"top\":\"\"},nativeOn:{\"click\":function($event){$event.preventDefault();}},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\"}},on),[_c('v-flex',{staticClass:\"vertical-btn\",attrs:{\"xs12\":\"\"}},[_c('v-icon',[_vm._v(\"volume_up\")]),_c('span',{staticClass:\"caption\",staticStyle:{\"padding-top\":\"5px\"}},[_vm._v(_vm._s(Math.round(_vm.$server.activePlayer.volume_level)))])],1)],1)]}}],null,false,2163274026)},[_c('VolumeControl',{attrs:{\"players\":_vm.$server.players,\"player_id\":_vm.$server.activePlayer.player_id}})],1)],1):_vm._e(),_c('v-list-item-action',{staticStyle:{\"padding\":\"30px\",\"margin-right\":\"15px\"}},[_c('v-btn',{attrs:{\"text\":\"\",\"icon\":\"\"},on:{\"click\":function($event){return _vm.$server.$emit('showPlayersMenu')}}},[_c('v-flex',{staticClass:\"vertical-btn\",attrs:{\"xs12\":\"\"}},[_c('v-icon',[_vm._v(\"speaker\")]),(_vm.$server.activePlayer)?_c('span',{staticClass:\"caption\",staticStyle:{\"padding-top\":\"5px\"}},[_vm._v(_vm._s(_vm.truncateString(_vm.$server.activePlayer.name, 18)))]):_c('span',{staticClass:\"caption\"})],1)],1)],1)],1),(_vm.$store.isInStandaloneMode)?_c('v-card',{staticStyle:{\"height\":\"20px\"},attrs:{\"dense\":\"\",\"flat\":\"\",\"light\":\"\",\"subheader\":\"\",\"tile\":\"\",\"width\":\"100%\",\"color\":\"black\"}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',[_c('v-list',[_c('v-list-item',{staticStyle:{\"height\":\"50px\",\"padding-bottom\":\"5\"}},[_c('v-list-item-avatar',{staticStyle:{\"margin-left\":\"-10px\"},attrs:{\"tile\":\"\"}},[_c('v-icon',{attrs:{\"large\":\"\"}},[_vm._v(_vm._s(_vm.players[_vm.player_id].is_group ? \"speaker_group\" : \"speaker\"))])],1),_c('v-list-item-content',{staticStyle:{\"margin-left\":\"-15px\"}},[_c('v-list-item-title',[_vm._v(_vm._s(_vm.players[_vm.player_id].name))]),_c('v-list-item-subtitle',[_vm._v(_vm._s(_vm.$t(\"state.\" + _vm.players[_vm.player_id].state)))])],1)],1),_c('v-divider'),_vm._l((_vm.volumePlayerIds),function(child_id){return _c('div',{key:child_id},[_c('div',{staticClass:\"body-2\",style:(!_vm.players[child_id].powered\n          ? 'color:rgba(0,0,0,.38);'\n          : 'color:rgba(0,0,0,.54);')},[_c('v-btn',{staticStyle:{\"margin-left\":\"8px\"},style:(!_vm.players[child_id].powered\n            ? 'color:rgba(0,0,0,.38);'\n            : 'color:rgba(0,0,0,.54);'),attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.togglePlayerPower(child_id)}}},[_c('v-icon',[_vm._v(\"power_settings_new\")])],1),_c('span',{staticStyle:{\"margin-left\":\"10px\"}},[_vm._v(_vm._s(_vm.players[child_id].name))]),_c('div',{staticStyle:{\"margin-top\":\"-8px\",\"margin-left\":\"15px\",\"margin-right\":\"15px\",\"height\":\"35px\"}},[_c('v-slider',{attrs:{\"lazy\":\"\",\"disabled\":!_vm.players[child_id].powered,\"value\":Math.round(_vm.players[child_id].volume_level),\"prepend-icon\":\"volume_down\",\"append-icon\":\"volume_up\"},on:{\"end\":function($event){return _vm.setPlayerVolume(child_id, $event)},\"click:append\":function($event){return _vm.setPlayerVolume(child_id, 'up')},\"click:prepend\":function($event){return _vm.setPlayerVolume(child_id, 'down')}}})],1)],1),_c('v-divider')],1)})],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <v-card>\n    <v-list>\n    <v-list-item style=\"height:50px;padding-bottom:5;\">\n      <v-list-item-avatar tile style=\"margin-left:-10px;\">\n        <v-icon large>{{\n          players[player_id].is_group ? \"speaker_group\" : \"speaker\"\n        }}</v-icon>\n      </v-list-item-avatar>\n      <v-list-item-content style=\"margin-left:-15px;\">\n        <v-list-item-title>{{ players[player_id].name }}</v-list-item-title>\n        <v-list-item-subtitle>{{\n          $t(\"state.\" + players[player_id].state)\n        }}</v-list-item-subtitle>\n      </v-list-item-content>\n    </v-list-item>\n    <v-divider></v-divider>\n    <div v-for=\"child_id in volumePlayerIds\" :key=\"child_id\">\n      <div\n        class=\"body-2\"\n        :style=\"\n          !players[child_id].powered\n            ? 'color:rgba(0,0,0,.38);'\n            : 'color:rgba(0,0,0,.54);'\n        \"\n      >\n        <v-btn\n          icon\n          @click=\"togglePlayerPower(child_id)\"\n          style=\"margin-left:8px\"\n          :style=\"\n            !players[child_id].powered\n              ? 'color:rgba(0,0,0,.38);'\n              : 'color:rgba(0,0,0,.54);'\n          \"\n        >\n          <v-icon>power_settings_new</v-icon>\n        </v-btn>\n        <span style=\"margin-left:10px\">{{ players[child_id].name }}</span>\n        <div\n          style=\"margin-top:-8px;margin-left:15px;margin-right:15px;height:35px;\"\n        >\n          <v-slider\n            lazy\n            :disabled=\"!players[child_id].powered\"\n            :value=\"Math.round(players[child_id].volume_level)\"\n            prepend-icon=\"volume_down\"\n            append-icon=\"volume_up\"\n            @end=\"setPlayerVolume(child_id, $event)\"\n            @click:append=\"setPlayerVolume(child_id, 'up')\"\n            @click:prepend=\"setPlayerVolume(child_id, 'down')\"\n          ></v-slider>\n        </div>\n      </div>\n      <v-divider></v-divider>\n    </div>\n    </v-list>\n  </v-card>\n</template>\n\n<script>\nimport Vue from 'vue'\n\nexport default Vue.extend({\n  props: ['value', 'players', 'player_id'],\n  data () {\n    return {}\n  },\n  computed: {\n    volumePlayerIds () {\n      var allIds = [this.player_id]\n      allIds.push(...this.players[this.player_id].group_childs)\n      return allIds\n    }\n  },\n  mounted () { },\n  methods: {\n    setPlayerVolume: function (playerId, newVolume) {\n      // if (newVolume === 'up') {\n      //   this.$server.playerCommand('volume_up', null, playerId)\n      // } else if (newVolume === 'down') {\n      //   this.$server.playerCommand('volume_down', null, playerId)\n      // } else {\n      //   this.$server.playerCommand('volume_set', newVolume, playerId)\n      //   this.players[playerId].volume_level = newVolume\n      // }\n      if (newVolume === 'up') {\n        newVolume = this.$server.players[playerId].volume_level + 1\n      } else if (newVolume === 'down') {\n        newVolume = this.$server.players[playerId].volume_level - 1\n      }\n      this.$server.playerCommand('volume_set', newVolume, playerId)\n      this.players[playerId].volume_level = newVolume\n    },\n    togglePlayerPower: function (playerId) {\n      this.$server.playerCommand('power_toggle', null, playerId)\n    }\n  }\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VolumeControl.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VolumeControl.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./VolumeControl.vue?vue&type=template&id=8277ef42&\"\nimport script from \"./VolumeControl.vue?vue&type=script&lang=js&\"\nexport * from \"./VolumeControl.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemSubtitle } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VSlider } from 'vuetify/lib/components/VSlider';\ninstallComponents(component, {VBtn,VCard,VDivider,VIcon,VList,VListItem,VListItemAvatar,VListItemContent,VListItemSubtitle,VListItemTitle,VSlider})\n","<template>\n  <v-footer\n    app\n    fixed\n    padless\n    light\n    elevation=\"10\"\n    style=\"background-color: black;\"\n  >\n    <v-card\n      dense\n      flat\n      light\n      subheader\n      tile\n      width=\"100%\"\n      color=\"#E0E0E0\"\n      style=\"margin-top:1px;\"\n      v-if=\"!$store.isMobile\"\n    >\n      <!-- now playing media -->\n      <v-list-item two-line>\n        <v-list-item-avatar tile v-if=\"curQueueItem\">\n          <img\n            :src=\"$server.getImageUrl(curQueueItem)\"\n            :lazy-src=\"require('../assets/file.png')\"\n            style=\"border: 1px solid rgba(0,0,0,.54);\"\n          />\n        </v-list-item-avatar>\n        <v-list-item-avatar v-else>\n          <v-icon>speaker</v-icon>\n        </v-list-item-avatar>\n\n        <v-list-item-content>\n          <v-list-item-title v-if=\"curQueueItem\">\n            {{ curQueueItem.name }}</v-list-item-title\n          >\n          <v-list-item-title v-else-if=\"$server.activePlayer\">\n            {{ $server.activePlayer.name }}</v-list-item-title\n          >\n          <v-list-item-subtitle v-if=\"curQueueItem\" style=\"color: primary\">\n            <span\n              v-for=\"(artist, artistindex) in curQueueItem.artists\"\n              :key=\"artistindex\"\n            >\n              <a v-on:click=\"artistClick(artist)\" @click.stop=\"\">{{\n                artist.name\n              }}</a>\n              <label\n                v-if=\"artistindex + 1 < curQueueItem.artists.length\"\n                :key=\"artistindex\"\n              >\n                /\n              </label>\n            </span>\n          </v-list-item-subtitle>\n        </v-list-item-content>\n         <!-- streaming quality details -->\n        <v-list-item-action v-if=\"streamDetails\">\n          <v-menu\n            :close-on-content-click=\"false\"\n            :nudge-width=\"250\"\n            offset-x\n            top\n            @click.native.prevent\n          >\n            <template v-slot:activator=\"{ on }\">\n              <v-btn icon v-on=\"on\">\n              <v-img contain v-if=\"streamDetails.quality > 6\" :src=\"require('../assets/hires.png')\" height=\"30\" />\n              <v-img contain v-if=\"streamDetails.quality <= 6\" :src=\"streamDetails.content_type ? require('../assets/' + streamDetails.content_type + '.png') : ''\" height=\"30\" style='filter: invert(100%);' />\n              </v-btn>\n            </template>\n            <v-list v-if=\"streamDetails\">\n              <v-subheader class=\"title\">{{ $t('stream_details') }}</v-subheader>\n                <v-list-item tile dense>\n                  <v-list-item-icon>\n                    <v-img max-width=\"50\" contain :src=\"streamDetails.provider ? require('../assets/' + streamDetails.provider + '.png') : ''\" />\n                  </v-list-item-icon>\n                  <v-list-item-content>\n                    <v-list-item-title>{{ streamDetails.provider }}</v-list-item-title>\n                  </v-list-item-content>\n                </v-list-item>\n                <v-divider></v-divider>\n                <v-list-item tile dense>\n                  <v-list-item-icon>\n                    <v-img max-width=\"50\" contain :src=\"streamDetails.content_type ? require('../assets/' + streamDetails.content_type + '.png') : ''\" style='filter: invert(100%);' />\n                  </v-list-item-icon>\n                  <v-list-item-content>\n                    <v-list-item-title>{{ streamDetails.sample_rate/1000 }} kHz / {{ streamDetails.bit_depth }} bits </v-list-item-title>\n                  </v-list-item-content>\n                </v-list-item>\n                <v-divider></v-divider>\n                <div v-if=\"playerQueueDetails.crossfade_enabled\">\n                  <v-list-item tile dense>\n                  <v-list-item-icon>\n                    <v-img max-width=\"50\" contain :src=\"require('../assets/crossfade.png')\"/>\n                  </v-list-item-icon>\n                  <v-list-item-content>\n                    <v-list-item-title>{{ $t('crossfade_enabled') }}</v-list-item-title>\n                  </v-list-item-content>\n                </v-list-item>\n                <v-divider></v-divider>\n                </div>\n                <div v-if=\"streamVolumeLevelAdjustment\">\n                  <v-list-item tile dense>\n                  <v-list-item-icon>\n                    <v-icon color=\"black\" style=\"margin-left:13px\">volume_up</v-icon>\n                  </v-list-item-icon>\n                  <v-list-item-content>\n                    <v-list-item-title style=\"margin-left:12px\">{{ streamVolumeLevelAdjustment }}</v-list-item-title>\n                  </v-list-item-content>\n                </v-list-item>\n                <v-divider></v-divider>\n                </div>\n            </v-list>\n          </v-menu>\n        </v-list-item-action>\n      </v-list-item>\n\n      <!-- progress bar -->\n      <div\n        class=\"body-2\"\n        style=\"height:30px;width:100%;color:rgba(0,0,0,.65);margin-top:-12px;background-color:#E0E0E0;\"\n        align=\"center\"\n      >\n        <div\n          style=\"height:12px;margin-left:22px;margin-right:20px;margin-top:2px;\"\n          v-if=\"curQueueItem\"\n        >\n          <span class=\"left\">\n            {{ playerCurTimeStr }}\n          </span>\n          <span class=\"right\">\n            {{ playerTotalTimeStr }}\n          </span>\n        </div>\n      </div>\n      <v-progress-linear\n        fixed\n        light\n        :value=\"progress\"\n        v-if=\"curQueueItem\"\n        :style=\"\n          'margin-top:-22px;margin-left:80px;width:' + progressBarWidth + 'px;'\n        \"\n      />\n    </v-card>\n\n      <!-- Control buttons -->\n      <v-list-item\n        dark\n        dense\n        style=\"height:62px;margin-bottom:5px;margin-top:-4px;background-color:black;\"\n      >\n        <v-list-item-action v-if=\"$server.activePlayer\" style=\"margin-top:15px\">\n          <v-btn small icon @click=\"playerCommand('previous')\">\n            <v-icon>skip_previous</v-icon>\n          </v-btn>\n        </v-list-item-action>\n        <v-list-item-action\n          v-if=\"$server.activePlayer\"\n          style=\"margin-left:-32px;margin-top:15px\"\n        >\n          <v-btn icon x-large @click=\"playerCommand('play_pause')\">\n            <v-icon size=\"50\">{{\n              $server.activePlayer.state == \"playing\" ? \"pause\" : \"play_arrow\"\n            }}</v-icon>\n          </v-btn>\n        </v-list-item-action>\n        <v-list-item-action v-if=\"$server.activePlayer\" style=\"margin-top:15px\">\n          <v-btn icon small @click=\"playerCommand('next')\">\n            <v-icon>skip_next</v-icon>\n          </v-btn>\n        </v-list-item-action>\n        <!-- player controls -->\n        <v-list-item-content> </v-list-item-content>\n\n        <!-- active player queue button -->\n        <v-list-item-action style=\"padding:28px;\" v-if=\"$server.activePlayer\">\n          <v-btn\n            text\n            icon\n            @click=\"$router.push('/playerqueue/')\"\n          >\n            <v-flex xs12 class=\"vertical-btn\">\n              <v-icon>queue_music</v-icon>\n              <span class=\"caption\" style=\"padding-top: 5px\">{{ $t(\"queue\") }}</span>\n            </v-flex>\n          </v-btn>\n        </v-list-item-action>\n\n        <!-- active player volume -->\n        <v-list-item-action style=\"padding:20px;\" v-if=\"$server.activePlayer && !$store.isMobile\">\n          <v-menu\n            :close-on-content-click=\"false\"\n            :nudge-width=\"250\"\n            offset-x\n            top\n            @click.native.prevent\n          >\n            <template v-slot:activator=\"{ on }\">\n              <v-btn icon v-on=\"on\">\n                <v-flex xs12 class=\"vertical-btn\">\n                  <v-icon>volume_up</v-icon>\n                  <span class=\"caption\" style=\"padding-top: 5px\">{{\n                    Math.round($server.activePlayer.volume_level)\n                  }}</span>\n                </v-flex>\n              </v-btn>\n            </template>\n            <VolumeControl\n              v-bind:players=\"$server.players\"\n              v-bind:player_id=\"$server.activePlayer.player_id\"\n            />\n          </v-menu>\n        </v-list-item-action>\n\n        <!-- active player btn -->\n        <v-list-item-action style=\"padding:30px;margin-right:15px\">\n          <v-btn text icon @click=\"$server.$emit('showPlayersMenu')\">\n            <v-flex xs12 class=\"vertical-btn\">\n              <v-icon>speaker</v-icon>\n              <span class=\"caption\" v-if=\"$server.activePlayer\" style=\"padding-top: 5px\">{{\n                truncateString($server.activePlayer.name, 18)\n              }}</span>\n              <span class=\"caption\" v-else> </span>\n            </v-flex>\n          </v-btn>\n        </v-list-item-action>\n      </v-list-item>\n      <!-- add some additional whitespace in standalone mode only -->\n      <v-card\n        dense\n        flat\n        light\n        subheader\n        tile\n        width=\"100%\"\n        color=\"black\"\n        style=\"height:20px\" v-if=\"$store.isInStandaloneMode\"/>\n  </v-footer>\n</template>\n\n<style scoped>\n.vertical-btn {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n.divider {\n  height: 1px;\n  width: 100%;\n  background-color: #cccccc;\n}\n.right {\n  float: right;\n}\n.left {\n  float: left;\n}\n</style>\n\n<script>\nimport Vue from 'vue'\nimport VolumeControl from '@/components/VolumeControl.vue'\n\nexport default Vue.extend({\n  components: {\n    VolumeControl\n  },\n  props: [],\n  data () {\n    return {\n      playerQueueDetails: {}\n    }\n  },\n  watch: { },\n  computed: {\n    curQueueItem () {\n      if (this.playerQueueDetails) {\n        return this.playerQueueDetails.cur_item\n      } else {\n        return null\n      }\n    },\n    progress () {\n      if (!this.curQueueItem) return 0\n      var totalSecs = this.curQueueItem.duration\n      var curSecs = this.playerQueueDetails.cur_item_time\n      var curPercent = curSecs / totalSecs * 100\n      return curPercent\n    },\n    playerCurTimeStr () {\n      if (!this.curQueueItem) return '0:00'\n      var curSecs = this.playerQueueDetails.cur_item_time\n      return curSecs.toString().formatDuration()\n    },\n    playerTotalTimeStr () {\n      if (!this.curQueueItem) return '0:00'\n      var totalSecs = this.curQueueItem.duration\n      return totalSecs.toString().formatDuration()\n    },\n    progressBarWidth () {\n      return window.innerWidth - 160\n    },\n    streamDetails () {\n      if (!this.playerQueueDetails.cur_item || !this.playerQueueDetails.cur_item || !this.playerQueueDetails.cur_item.streamdetails.provider || !this.playerQueueDetails.cur_item.streamdetails.content_type) return {}\n      return this.playerQueueDetails.cur_item.streamdetails\n    },\n    streamVolumeLevelAdjustment () {\n      if (!this.streamDetails || !this.streamDetails.sox_options) return ''\n      if (this.streamDetails.sox_options.includes('vol ')) {\n        var re = /(.*vol\\s+)(.*)(\\s+dB.*)/\n        var volLevel = this.streamDetails.sox_options.replace(re, '$2')\n        return volLevel + ' dB'\n      }\n      return ''\n    }\n  },\n  created () {\n    this.$server.$on('queue updated', this.queueUpdatedMsg)\n    this.$server.$on('new player selected', this.getQueueDetails)\n  },\n  methods: {\n    playerCommand (cmd, cmd_opt = null) {\n      this.$server.playerCommand(cmd, cmd_opt, this.$server.activePlayerId)\n    },\n    artistClick (item) {\n      // artist entry clicked within the listviewItem\n      var url = '/artists/' + item.item_id\n      this.$router.push({ path: url, query: { provider: item.provider } })\n    },\n    queueUpdatedMsg (data) {\n      const queueId = this.$server.players[this.$server.activePlayerId].active_queue\n      if (data.player_id === queueId) {\n        for (const [key, value] of Object.entries(data)) {\n          Vue.set(this.playerQueueDetails, key, value)\n        }\n      }\n    },\n    async getQueueDetails () {\n      if (this.$server.activePlayer) {\n        const queueId = this.$server.players[this.$server.activePlayerId].active_queue\n        const endpoint = 'players/' + queueId + '/queue'\n        this.playerQueueDetails = await this.$server.getData(endpoint)\n      }\n    },\n    truncateString (str, num) {\n      // If the length of str is less than or equal to num\n      // just return str--don't truncate it.\n      if (str.length <= num) {\n        return str\n      }\n      // Return str truncated with '...' concatenated to the end of str.\n      return str.slice(0, num) + '...'\n    }\n  }\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerOSD.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerOSD.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PlayerOSD.vue?vue&type=template&id=21e0f2f0&scoped=true&\"\nimport script from \"./PlayerOSD.vue?vue&type=script&lang=js&\"\nexport * from \"./PlayerOSD.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PlayerOSD.vue?vue&type=style&index=0&id=21e0f2f0&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"21e0f2f0\",\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCard } from 'vuetify/lib/components/VCard';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VFlex } from 'vuetify/lib/components/VGrid';\nimport { VFooter } from 'vuetify/lib/components/VFooter';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VImg } from 'vuetify/lib/components/VImg';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemIcon } from 'vuetify/lib/components/VList';\nimport { VListItemSubtitle } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VProgressLinear } from 'vuetify/lib/components/VProgressLinear';\nimport { VSubheader } from 'vuetify/lib/components/VSubheader';\ninstallComponents(component, {VBtn,VCard,VDivider,VFlex,VFooter,VIcon,VImg,VList,VListItem,VListItemAction,VListItemAvatar,VListItemContent,VListItemIcon,VListItemSubtitle,VListItemTitle,VMenu,VProgressLinear,VSubheader})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-navigation-drawer',{attrs:{\"right\":\"\",\"app\":\"\",\"clipped\":\"\",\"temporary\":\"\",\"width\":\"300\"},model:{value:(_vm.visible),callback:function ($$v) {_vm.visible=$$v},expression:\"visible\"}},[_c('v-card-title',{staticClass:\"headline\"},[_c('b',[_vm._v(_vm._s(_vm.$t('players')))])]),_c('v-list',{attrs:{\"dense\":\"\"}},[_c('v-divider'),_vm._l((_vm.filteredPlayerIds),function(playerId){return _c('div',{key:playerId,style:(_vm.$server.activePlayerId == playerId ? 'background-color:rgba(50, 115, 220, 0.3);' : '')},[_c('v-list-item',{staticStyle:{\"margin-left\":\"-5px\",\"margin-right\":\"-15px\"},attrs:{\"ripple\":\"\",\"dense\":\"\"},on:{\"click\":function($event){return _vm.$server.switchPlayer(_vm.$server.players[playerId].player_id)}}},[_c('v-list-item-avatar',{attrs:{\"tile\":\"\"}},[_c('v-icon',{attrs:{\"size\":\"45\"}},[_vm._v(_vm._s(_vm.$server.players[playerId].is_group_player ? 'speaker_group' : 'speaker'))])],1),_c('v-list-item-content',{staticStyle:{\"margin-left\":\"-15px\"}},[_c('v-list-item-title',{staticClass:\"subtitle-1\"},[_vm._v(_vm._s(_vm.$server.players[playerId].name))]),_c('v-list-item-subtitle',{key:_vm.$server.players[playerId].state,staticClass:\"body-2\",staticStyle:{\"font-weight\":\"normal\"}},[_vm._v(\" \"+_vm._s(_vm.$t('state.' + _vm.$server.players[playerId].state))+\" \")])],1),(_vm.$server.activePlayerId)?_c('v-list-item-action',{staticStyle:{\"padding-right\":\"10px\"}},[_c('v-menu',{attrs:{\"close-on-content-click\":false,\"close-on-click\":true,\"nudge-width\":250,\"offset-x\":\"\",\"right\":\"\"},nativeOn:{\"click\":[function($event){$event.stopPropagation();},function($event){$event.stopPropagation();$event.preventDefault();}]},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({staticStyle:{\"color\":\"rgba(0,0,0,.54)\"},attrs:{\"icon\":\"\"}},on),[_c('v-flex',{staticClass:\"vertical-btn\",attrs:{\"xs12\":\"\"}},[_c('v-icon',[_vm._v(\"volume_up\")]),_c('span',{staticClass:\"overline\"},[_vm._v(_vm._s(Math.round(_vm.$server.players[playerId].volume_level)))])],1)],1)]}}],null,true)},[_c('VolumeControl',{attrs:{\"players\":_vm.$server.players,\"player_id\":playerId}})],1)],1):_vm._e()],1),_c('v-divider')],1)})],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <!-- players side menu -->\n  <v-navigation-drawer\n    right\n    app\n    clipped\n    temporary\n    v-model=\"visible\"\n    width=\"300\"\n  >\n    <v-card-title class=\"headline\">\n      <b>{{ $t('players') }}</b>\n    </v-card-title>\n    <v-list dense>\n      <v-divider></v-divider>\n      <div\n        v-for=\"playerId of filteredPlayerIds\"\n        :key=\"playerId\"\n        :style=\"$server.activePlayerId == playerId ? 'background-color:rgba(50, 115, 220, 0.3);' : ''\"\n      >\n        <v-list-item\n          ripple\n          dense\n          style=\"margin-left: -5px; margin-right: -15px\"\n          @click=\"$server.switchPlayer($server.players[playerId].player_id)\"\n        >\n          <v-list-item-avatar tile>\n            <v-icon size=\"45\">{{ $server.players[playerId].is_group_player ? 'speaker_group' : 'speaker' }}</v-icon>\n          </v-list-item-avatar>\n          <v-list-item-content style=\"margin-left:-15px;\">\n            <v-list-item-title class=\"subtitle-1\">{{ $server.players[playerId].name }}</v-list-item-title>\n\n            <v-list-item-subtitle\n              class=\"body-2\"\n              style=\"font-weight:normal;\"\n              :key=\"$server.players[playerId].state\"\n            >\n              {{ $t('state.' + $server.players[playerId].state) }}\n            </v-list-item-subtitle>\n\n          </v-list-item-content>\n\n          <v-list-item-action\n            style=\"padding-right:10px;\"\n            v-if=\"$server.activePlayerId\"\n          >\n            <v-menu\n              :close-on-content-click=\"false\"\n              :close-on-click=\"true\"\n              :nudge-width=\"250\"\n              offset-x\n              right\n              @click.native.stop\n              @click.native.stop.prevent\n            >\n              <template v-slot:activator=\"{ on }\">\n                <v-btn\n                  icon\n                  style=\"color:rgba(0,0,0,.54);\"\n                  v-on=\"on\"\n                >\n                  <v-flex\n                    xs12\n                    class=\"vertical-btn\"\n                  >\n                    <v-icon>volume_up</v-icon>\n                    <span class=\"overline\">{{ Math.round($server.players[playerId].volume_level) }}</span>\n                  </v-flex>\n                </v-btn>\n              </template>\n              <VolumeControl\n                v-bind:players=\"$server.players\"\n                v-bind:player_id=\"playerId\"\n              />\n            </v-menu>\n          </v-list-item-action>\n        </v-list-item>\n        <v-divider></v-divider>\n      </div>\n    </v-list>\n  </v-navigation-drawer>\n</template>\n\n<style scoped>\n.vertical-btn {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n</style>\n\n<script>\nimport Vue from 'vue'\nimport VolumeControl from '@/components/VolumeControl.vue'\n\nexport default Vue.extend({\n  components: {\n    VolumeControl\n  },\n  watch: {\n  },\n  data () {\n    return {\n      filteredPlayerIds: [],\n      visible: false\n    }\n  },\n  computed: {\n  },\n  created () {\n    this.$server.$on('showPlayersMenu', this.show)\n    this.$server.$on('players changed', this.getAvailablePlayers)\n    this.getAvailablePlayers()\n  },\n  methods: {\n    show () {\n      this.visible = true\n    },\n    getAvailablePlayers () {\n      // generate a list of playerIds that we want to show in the list\n      this.filteredPlayerIds = []\n      for (var playerId in this.$server.players) {\n        // we're only interested in enabled players that are not group childs\n        if (this.$server.players[playerId].available) {\n          this.filteredPlayerIds.push(playerId)\n        }\n      }\n    }\n  }\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerSelect.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerSelect.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PlayerSelect.vue?vue&type=template&id=7c65a917&scoped=true&\"\nimport script from \"./PlayerSelect.vue?vue&type=script&lang=js&\"\nexport * from \"./PlayerSelect.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PlayerSelect.vue?vue&type=style&index=0&id=7c65a917&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  \"7c65a917\",\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VCardTitle } from 'vuetify/lib/components/VCard';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VFlex } from 'vuetify/lib/components/VGrid';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemSubtitle } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VNavigationDrawer } from 'vuetify/lib/components/VNavigationDrawer';\ninstallComponents(component, {VBtn,VCardTitle,VDivider,VFlex,VIcon,VList,VListItem,VListItemAction,VListItemAvatar,VListItemContent,VListItemSubtitle,VListItemTitle,VMenu,VNavigationDrawer})\n","<template>\n  <v-app>\n    <TopBar />\n    <NavigationMenu></NavigationMenu>\n    <v-main>\n      <router-view app :key=\"$route.path\"></router-view>\n    </v-main>\n    <PlayerOSD :showPlayerSelect=\"showPlayerSelect\" />\n    <ContextMenu/>\n    <PlayerSelect/>\n    <v-overlay :value=\"$store.loading\">\n      <v-progress-circular indeterminate size=\"64\"></v-progress-circular>\n    </v-overlay>\n  </v-app>\n</template>\n\n<style>\n  .body {\n    background-color: black;\n    overscroll-behavior-x: none;\n  }\n</style>\n\n<script>\nimport Vue from 'vue'\nimport NavigationMenu from './components/NavigationMenu.vue'\nimport TopBar from './components/TopBar.vue'\nimport ContextMenu from './components/ContextMenu.vue'\nimport PlayerOSD from './components/PlayerOSD.vue'\nimport PlayerSelect from './components/PlayerSelect.vue'\n\nexport default Vue.extend({\n  name: 'App',\n  components: {\n    NavigationMenu,\n    TopBar,\n    ContextMenu,\n    PlayerOSD,\n    PlayerSelect\n  },\n  data: () => ({\n    showPlayerSelect: false\n  }),\n  created () {\n    // TODO: retrieve serveraddress through discovery and/or user settings\n    let serverAddress = ''\n    if (process.env.NODE_ENV === 'production') {\n      const loc = window.location\n      serverAddress = loc.origin + loc.pathname\n    } else {\n      serverAddress = 'http://localhost:8095/'\n    }\n    this.$server.connect(serverAddress)\n  }\n})\n</script>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=7f0d4007&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VApp } from 'vuetify/lib/components/VApp';\nimport { VMain } from 'vuetify/lib/components/VMain';\nimport { VOverlay } from 'vuetify/lib/components/VOverlay';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\ninstallComponents(component, {VApp,VMain,VOverlay,VProgressCircular})\n","/* eslint-disable no-console */\n\nimport { register } from 'register-service-worker'\n\nif (process.env.NODE_ENV === 'production') {\n  register(`${process.env.BASE_URL}service-worker.js`, {\n    ready () {\n      console.log(\n        'App is being served from cache by a service worker.\\n' +\n        'For more details, visit https://goo.gl/AFskqB'\n      )\n    },\n    registered () {\n      console.log('Service worker has been registered.')\n    },\n    cached () {\n      console.log('Content has been cached for offline use.')\n    },\n    updatefound () {\n      console.log('New content is downloading.')\n    },\n    updated () {\n      alert('New content is available; please refresh.')\n      window.location.reload(true)\n    },\n    offline () {\n      alert('No internet connection found. App is running in offline mode.')\n    },\n    error (error) {\n      console.error('Error during service worker registration:', error)\n    }\n  })\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[_c('v-list',{attrs:{\"tile\":\"\"}},_vm._l((_vm.items),function(item){return _c('v-list-item',{key:item.title,attrs:{\"tile\":\"\"},on:{\"click\":function($event){return _vm.$router.push(item.path)}}},[_c('v-list-item-icon',{staticStyle:{\"margin-left\":\"15px\"}},[_c('v-icon',[_vm._v(_vm._s(item.icon))])],1),_c('v-list-item-content',[_c('v-list-item-title',{domProps:{\"textContent\":_vm._s(item.title)}})],1)],1)}),1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <section>\n    <v-list tile>\n      <v-list-item tile\n        v-for=\"item in items\" :key=\"item.title\" @click=\"$router.push(item.path)\">\n          <v-list-item-icon style=\"margin-left:15px\">\n            <v-icon>{{ item.icon }}</v-icon>\n          </v-list-item-icon>\n          <v-list-item-content>\n            <v-list-item-title v-text=\"item.title\"></v-list-item-title>\n          </v-list-item-content>\n      </v-list-item>\n    </v-list>\n  </section>\n</template>\n\n<script>\n\nexport default {\n  name: 'home',\n  data () {\n    return {\n      items: [\n        { title: this.$t('artists'), icon: 'person', path: '/artists' },\n        { title: this.$t('albums'), icon: 'album', path: '/albums' },\n        { title: this.$t('tracks'), icon: 'audiotrack', path: '/tracks' },\n        { title: this.$t('playlists'), icon: 'playlist_play', path: '/playlists' },\n        { title: this.$t('search'), icon: 'search', path: '/search' }\n      ]\n    }\n  },\n  created () {\n    this.$store.windowtitle = this.$t('musicassistant')\n  }\n}\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=38d5da10&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VList } from 'vuetify/lib/components/VList';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemIcon } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\ninstallComponents(component, {VIcon,VList,VListItem,VListItemContent,VListItemIcon,VListItemTitle})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[_c('ItemsListing',{attrs:{\"mediatype\":_vm.mediatype,\"provider\":_vm.provider,\"endpoint\":'library/' + _vm.mediatype}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <section>\n    <ItemsListing :mediatype=\"mediatype\" :provider=\"provider\" :endpoint=\"'library/' + mediatype\" />\n  </section>\n</template>\n\n<script>\n// @ is an alias to /src\nimport ItemsListing from '@/components/ItemsListing.vue'\n\nexport default {\n  name: 'browse',\n  components: {\n    ItemsListing\n  },\n  props: {\n    mediatype: String,\n    provider: String\n  },\n  data () {\n    return { }\n  },\n  created () {\n    this.$store.windowtitle = this.$t(this.mediatype)\n  },\n  computed: { },\n  methods: { }\n}\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Browse.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Browse.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Browse.vue?vue&type=template&id=0b869ae6&\"\nimport script from \"./Browse.vue?vue&type=script&lang=js&\"\nexport * from \"./Browse.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","import Vue from 'vue'\nimport VueRouter from 'vue-router'\nimport Home from '../views/Home.vue'\nimport Browse from '../views/Browse.vue'\n\nVue.use(VueRouter)\n\nconst routes = [\n  {\n    path: '/',\n    name: 'home',\n    component: Home\n  },\n  {\n    path: '/config',\n    name: 'config',\n    component: () => import(/* webpackChunkName: \"config\" */ '../views/Config.vue'),\n    props: route => ({ ...route.params, ...route.query })\n  },\n  {\n    path: '/config/:configKey',\n    name: 'configKey',\n    component: () => import(/* webpackChunkName: \"config\" */ '../views/Config.vue'),\n    props: route => ({ ...route.params, ...route.query })\n  },\n  {\n    path: '/search',\n    name: 'search',\n    component: () => import(/* webpackChunkName: \"search\" */ '../views/Search.vue'),\n    props: route => ({ ...route.params, ...route.query })\n  },\n  {\n    path: '/:media_type/:media_id',\n    name: 'itemdetails',\n    component: () => import(/* webpackChunkName: \"itemdetails\" */ '../views/ItemDetails.vue'),\n    props: route => ({ ...route.params, ...route.query })\n  },\n  {\n    path: '/playerqueue',\n    name: 'playerqueue',\n    component: () => import(/* webpackChunkName: \"playerqueue\" */ '../views/PlayerQueue.vue'),\n    props: route => ({ ...route.params, ...route.query })\n  },\n  {\n    path: '/:mediatype',\n    name: 'browse',\n    component: Browse,\n    props: route => ({ ...route.params, ...route.query })\n  }\n]\n\nconst router = new VueRouter({\n  mode: 'hash',\n  routes\n})\n\nexport default router\n","import Vue from 'vue'\nimport VueI18n from 'vue-i18n'\n\nVue.use(VueI18n)\n\nfunction loadLocaleMessages () {\n  const locales = require.context('./locales', true, /[A-Za-z0-9-_,\\s]+\\.json$/i)\n  const messages = {}\n  locales.keys().forEach(key => {\n    const matched = key.match(/([A-Za-z0-9-_]+)\\./i)\n    if (matched && matched.length > 1) {\n      const locale = matched[1]\n      messages[locale] = locales(key)\n    }\n  })\n  return messages\n}\n\nexport default new VueI18n({\n  // locale: process.env.VUE_APP_I18N_LOCALE || 'en',\n  locale: navigator.language.split('-')[0],\n  fallbackLocale: 'en',\n  messages: loadLocaleMessages()\n})\n","import Vue from 'vue'\nimport Vuetify from 'vuetify/lib'\n\nVue.use(Vuetify)\n\nexport default new Vuetify({\n})\n","import Vue from 'vue'\n\nconst globalStore = new Vue({\n  data () {\n    return {\n      windowtitle: 'Home',\n      loading: false,\n      showNavigationMenu: false,\n      topBarTransparent: false,\n      topBarContextItem: null,\n      isMobile: false,\n      isInStandaloneMode: false\n    }\n  },\n  created () {\n    this.handleWindowOptions()\n    window.addEventListener('resize', this.handleWindowOptions)\n  },\n  destroyed () {\n    window.removeEventListener('resize', this.handleWindowOptions)\n  },\n  methods: {\n    handleWindowOptions () {\n      this.isMobile = (document.body.clientWidth < 700)\n      this.isInStandaloneMode = (window.navigator.standalone === true) || (window.matchMedia('(display-mode: standalone)').matches)\n    }\n  }\n})\n\nexport default {\n  globalStore,\n  // we can add objects to the Vue prototype in the install() hook:\n  install (Vue, options) {\n    Vue.prototype.$store = globalStore\n  }\n}\n","'use strict'\n\nimport Vue from 'vue'\nimport axios from 'axios'\nimport oboe from 'oboe'\n\nconst axiosConfig = {\n  timeout: 60 * 1000\n  // withCredentials: true, // Check cross-site Access-Control\n}\nconst _axios = axios.create(axiosConfig)\n\n// Holds the connection to the server\n\nconst server = new Vue({\n\n  _address: '',\n  _ws: null,\n\n  data () {\n    return {\n      connected: false,\n      players: {},\n      activePlayerId: null,\n      syncStatus: []\n    }\n  },\n  methods: {\n\n    async connect (serverAddress) {\n      // Connect to the server\n      if (!serverAddress.endsWith('/')) {\n        serverAddress = serverAddress + '/'\n      }\n      this._address = serverAddress\n      const wsAddress = serverAddress.replace('http', 'ws') + 'ws'\n      this._ws = new WebSocket(wsAddress)\n      this._ws.onopen = this._onWsConnect\n      this._ws.onmessage = this._onWsMessage\n      this._ws.onclose = this._onWsClose\n      this._ws.onerror = this._onWsError\n    },\n\n    async toggleLibrary (item) {\n      /// triggered when user clicks the library (heart) button\n      if (item.in_library.length === 0) {\n        // add to library\n        await this.putData('library', item)\n        item.in_library = [item.provider]\n      } else {\n        // remove from library\n        await this.deleteData('library', item)\n        item.in_library = []\n      }\n    },\n\n    getImageUrl (mediaItem, imageType = 'image', size = 0) {\n      // format the image url\n      if (!mediaItem || !mediaItem.media_type) return ''\n      if (mediaItem.provider === 'database' && imageType === 'image') {\n        return `${this._address}api/${mediaItem.media_type}/${mediaItem.item_id}/thumb?provider=${mediaItem.provider}&size=${size}`\n      } else if (mediaItem.metadata && mediaItem.metadata[imageType]) {\n        return mediaItem.metadata[imageType]\n      } else if (mediaItem.album && mediaItem.album.metadata && mediaItem.album.metadata[imageType]) {\n        return mediaItem.album.metadata[imageType]\n      } else if (mediaItem.artist && mediaItem.artist.metadata && mediaItem.artist.metadata[imageType]) {\n        return mediaItem.artist.metadata[imageType]\n      } else if (mediaItem.album && mediaItem.album.artist && mediaItem.album.artist.metadata && mediaItem.album.artist.metadata[imageType]) {\n        return mediaItem.album.artist.metadata[imageType]\n      } else if (mediaItem.artists && mediaItem.artists[0].metadata && mediaItem.artists[0].metadata[imageType]) {\n        return mediaItem.artists[0].metadata[imageType]\n      } else if (imageType === 'fanart') {\n        // fallback to normal image instead of fanart\n        return this.getImageUrl(mediaItem, 'image', size)\n      } else return ''\n    },\n\n    async getData (endpoint, params = {}) {\n      // get data from the server\n      const url = this._address + 'api/' + endpoint\n      const result = await _axios.get(url, { params: params })\n      Vue.$log.debug('getData', endpoint, result)\n      return result.data\n    },\n\n    async postData (endpoint, data) {\n      // post data to the server\n      const url = this._address + 'api/' + endpoint\n      data = JSON.stringify(data)\n      const result = await _axios.post(url, data)\n      Vue.$log.debug('postData', endpoint, result)\n      return result.data\n    },\n\n    async putData (endpoint, data) {\n      // put data to the server\n      const url = this._address + 'api/' + endpoint\n      data = JSON.stringify(data)\n      const result = await _axios.put(url, data)\n      Vue.$log.debug('putData', endpoint, result)\n      return result.data\n    },\n\n    async deleteData (endpoint, dataObj) {\n      // delete data on the server\n      const url = this._address + 'api/' + endpoint\n      dataObj = JSON.stringify(dataObj)\n      const result = await _axios.delete(url, { data: dataObj })\n      Vue.$log.debug('deleteData', endpoint, result)\n      return result.data\n    },\n\n    async getAllItems (endpoint, list, params = null) {\n      // retrieve all items and fill list\n      let url = this._address + 'api/' + endpoint\n      if (params) {\n        var urlParams = new URLSearchParams(params)\n        url += '?' + urlParams.toString()\n      }\n      let index = 0\n      Vue.$log.debug('getAllItems', url)\n      oboe(url)\n        .node('items.*', function (item) {\n          Vue.set(list, index, item)\n          index += 1\n        })\n        .done(function (fullList) {\n          // truncate list if needed\n          if (list.length > fullList.items.length) {\n            list.splice(fullList.items.length)\n          }\n        })\n    },\n\n    playerCommand (cmd, cmd_opt = '', playerId = this.activePlayerId) {\n      const endpoint = 'players/' + playerId + '/cmd/' + cmd\n      this.postData(endpoint, cmd_opt)\n    },\n\n    async playItem (item, queueOpt) {\n      this.$store.loading = true\n      const endpoint = 'players/' + this.activePlayerId + '/play_media/' + queueOpt\n      await this.postData(endpoint, item)\n      this.$store.loading = false\n    },\n\n    switchPlayer (newPlayerId) {\n      if (newPlayerId !== this.activePlayerId) {\n        this.activePlayerId = newPlayerId\n        localStorage.setItem('activePlayerId', newPlayerId)\n        this.$emit('new player selected', newPlayerId)\n      }\n    },\n\n    async _onWsConnect () {\n      // Websockets connection established\n      Vue.$log.info('Connected to server ' + this._address)\n      this.connected = true\n      // retrieve all players once through api\n      const players = await this.getData('players')\n      for (const player of players) {\n        Vue.set(this.players, player.player_id, player)\n      }\n      this._selectActivePlayer()\n      this.$emit('players changed')\n    },\n\n    async _onWsMessage (e) {\n      // Message retrieved on the websocket\n      var msg = JSON.parse(e.data)\n      if (msg.message === 'player changed') {\n        Vue.set(this.players, msg.message_details.player_id, msg.message_details)\n      } else if (msg.message === 'player added') {\n        Vue.set(this.players, msg.message_details.player_id, msg.message_details)\n        this._selectActivePlayer()\n        this.$emit('players changed')\n      } else if (msg.message === 'player removed') {\n        Vue.delete(this.players, msg.message_details.player_id)\n        this._selectActivePlayer()\n        this.$emit('players changed')\n      } else if (msg.message === 'music sync status') {\n        this.syncStatus = msg.message_details\n      } else {\n        this.$emit(msg.message, msg.message_details)\n      }\n    },\n\n    _onWsClose (e) {\n      this.connected = false\n      Vue.$log.error('Socket is closed. Reconnect will be attempted in 5 seconds.', e.reason)\n      setTimeout(function () {\n        this.connect(this._address)\n      }.bind(this), 5000)\n    },\n\n    _onWsError () {\n      this._ws.close()\n    },\n\n    _selectActivePlayer () {\n      // auto select new active player if we have none\n      if (!this.activePlayer || !this.activePlayer.enabled || this.activePlayer.group_parents.length > 0) {\n        // prefer last selected player\n        const lastPlayerId = localStorage.getItem('activePlayerId')\n        if (lastPlayerId && this.players[lastPlayerId] && this.players[lastPlayerId].enabled) {\n          this.switchPlayer(lastPlayerId)\n        } else {\n          // prefer the first playing player\n          for (const playerId in this.players) {\n            if (this.players[playerId].state === 'playing' && this.players[playerId].enabled && this.players[playerId].group_parents.length === 0) {\n              this.switchPlayer(playerId)\n              break\n            }\n          }\n          // fallback to just the first player\n          if (!this.activePlayer || !this.activePlayer.enabled) {\n            for (const playerId in this.players) {\n              if (this.players[playerId].enabled && this.players[playerId].group_parents.length === 0) {\n                this.switchPlayer(playerId)\n                break\n              }\n            }\n          }\n        }\n      }\n    }\n  },\n  computed: {\n    activePlayer () {\n      if (!this.activePlayerId) {\n        return null\n      } else {\n        return this.players[this.activePlayerId]\n      }\n    }\n  }\n})\n\n// install as plugin\nexport default {\n  server,\n  // we can add objects to the Vue prototype in the install() hook:\n  install (Vue, options) {\n    Vue.prototype.$server = server\n  }\n}\n","import Vue from 'vue'\nimport App from './App.vue'\nimport './registerServiceWorker'\nimport router from './router'\nimport i18n from './i18n'\nimport 'roboto-fontface/css/roboto/roboto-fontface.css'\nimport 'material-design-icons-iconfont/dist/material-design-icons.css'\nimport VueVirtualScroller from 'vue-virtual-scroller'\nimport 'vue-virtual-scroller/dist/vue-virtual-scroller.css'\nimport vuetify from './plugins/vuetify'\nimport store from './plugins/store'\nimport server from './plugins/server'\nimport '@babel/polyfill'\nimport VueLogger from 'vuejs-logger'\n\nconst isProduction = process.env.NODE_ENV === 'production'\nconst loggerOptions = {\n  isEnabled: true,\n  logLevel: isProduction ? 'error' : 'debug',\n  stringifyArguments: false,\n  showLogLevel: true,\n  showMethodName: false,\n  separator: '|',\n  showConsoleColors: true\n}\n\nVue.config.productionTip = false\nVue.use(VueLogger, loggerOptions)\nVue.use(VueVirtualScroller)\nVue.use(store)\nVue.use(server)\n\n// eslint-disable-next-line no-extend-native\nString.prototype.formatDuration = function () {\n  var secNum = parseInt(this, 10) // don't forget the second param\n  var hours = Math.floor(secNum / 3600)\n  var minutes = Math.floor((secNum - (hours * 3600)) / 60)\n  var seconds = secNum - (hours * 3600) - (minutes * 60)\n  if (hours < 10) { hours = '0' + hours }\n  if (minutes < 10) { minutes = '0' + minutes }\n  if (seconds < 10) { seconds = '0' + seconds }\n  if (hours === '00') { return minutes + ':' + seconds } else { return hours + ':' + minutes + ':' + seconds }\n}\n\nnew Vue({\n  router,\n  i18n,\n  vuetify,\n  render: h => h(App)\n}).$mount('#app')\n","module.exports = \"data:image/png;base64,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\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerOSD.vue?vue&type=style&index=0&id=21e0f2f0&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PlayerOSD.vue?vue&type=style&index=0&id=21e0f2f0&scoped=true&lang=css&\"","module.exports = __webpack_public_path__ + \"img/file.813f9dad.png\";","module.exports = __webpack_public_path__ + \"img/sonos.72e2fecb.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","var map = {\n\t\"./aac.png\": \"9a36\",\n\t\"./chromecast.png\": \"57d1\",\n\t\"./crossfade.png\": \"e7af\",\n\t\"./default_artist.png\": \"4bfb\",\n\t\"./demo_player.png\": \"26ea\",\n\t\"./file.png\": \"71db\",\n\t\"./flac.png\": \"fb30\",\n\t\"./hires.png\": \"f5e3\",\n\t\"./homeassistant.png\": \"3232\",\n\t\"./http_streamer.png\": \"2755\",\n\t\"./logo.png\": \"cf05\",\n\t\"./mp3.png\": \"f1d4\",\n\t\"./ogg.png\": \"9ad3\",\n\t\"./qobuz.png\": \"0863\",\n\t\"./sonos.png\": \"82f5\",\n\t\"./spotify.png\": \"0c3b\",\n\t\"./squeezebox.png\": \"bd18\",\n\t\"./tunein.png\": \"e428\",\n\t\"./vorbis.png\": \"94cc\",\n\t\"./web.png\": \"edbf\",\n\t\"./webplayer.png\": \"3d05\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"9e01\";","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemsListing.vue?vue&type=style&index=0&id=764b0c8e&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemsListing.vue?vue&type=style&index=0&id=764b0c8e&scoped=true&lang=css&\"","module.exports = __webpack_public_path__ + \"img/squeezebox.60631223.png\";","module.exports = __webpack_public_path__ + \"img/logo.c079bd97.png\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('v-list-item',{directives:[{name:\"longpress\",rawName:\"v-longpress\",value:(_vm.menuClick),expression:\"menuClick\"}],attrs:{\"ripple\":\"\"},on:{\"click\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"left\",37,$event.key,[\"Left\",\"ArrowLeft\"])){ return null; }if('button' in $event && $event.button !== 0){ return null; }_vm.onclickHandler ? _vm.onclickHandler(_vm.item) : _vm.itemClicked(_vm.item)},\"contextmenu\":[_vm.menuClick,function($event){$event.preventDefault();}]}},[(!_vm.hideavatar)?_c('v-list-item-avatar',{attrs:{\"tile\":\"\",\"color\":\"grey\"}},[_c('img',{staticStyle:{\"border\":\"1px solid rgba(0,0,0,.22)\"},attrs:{\"src\":_vm.$server.getImageUrl(_vm.item, 'image', 80),\"lazy-src\":require('../assets/file.png')}})]):_vm._e(),_c('v-list-item-content',[_c('v-list-item-title',[_vm._v(\" \"+_vm._s(_vm.item.name)+\" \"),(!!_vm.item.version)?_c('span',[_vm._v(\"(\"+_vm._s(_vm.item.version)+\")\")]):_vm._e()]),(_vm.item.artists)?_c('v-list-item-subtitle',[_vm._l((_vm.item.artists),function(artist,artistindex){return _c('span',{key:artist.item_id},[_c('a',{on:{\"click\":[function($event){return _vm.itemClicked(artist)},function($event){$event.stopPropagation();}]}},[_vm._v(_vm._s(artist.name))]),(artistindex + 1 < _vm.item.artists.length)?_c('label',{key:artistindex},[_vm._v(\"/\")]):_vm._e()])}),(!!_vm.item.album && !!_vm.hidetracknum)?_c('a',{staticStyle:{\"color\":\"grey\"},on:{\"click\":[function($event){return _vm.itemClicked(_vm.item.album)},function($event){$event.stopPropagation();}]}},[_vm._v(\" - \"+_vm._s(_vm.item.album.name))]):_vm._e(),(!_vm.hidetracknum && _vm.item.track_number)?_c('label',{staticStyle:{\"color\":\"grey\"}},[_vm._v(\"- disc \"+_vm._s(_vm.item.disc_number)+\" track \"+_vm._s(_vm.item.track_number))]):_vm._e()],2):_vm._e(),(_vm.item.artist)?_c('v-list-item-subtitle',[_c('a',{on:{\"click\":[function($event){return _vm.itemClicked(_vm.item.artist)},function($event){$event.stopPropagation();}]}},[_vm._v(_vm._s(_vm.item.artist.name))])]):_vm._e(),(!!_vm.item.owner)?_c('v-list-item-subtitle',[_vm._v(_vm._s(_vm.item.owner))]):_vm._e()],1),(!_vm.hideproviders)?_c('v-list-item-action',[_c('ProviderIcons',{attrs:{\"providerIds\":_vm.item.provider_ids,\"height\":20}})],1):_vm._e(),(_vm.isHiRes)?_c('v-list-item-action',[_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('img',_vm._g({attrs:{\"src\":require('../assets/hires.png'),\"height\":\"20\"}},on))]}}],null,false,2747613229)},[_c('span',[_vm._v(_vm._s(_vm.isHiRes))])])],1):_vm._e(),(!_vm.hidelibrary)?_c('v-list-item-action',[_c('v-tooltip',{attrs:{\"bottom\":\"\"},scopedSlots:_vm._u([{key:\"activator\",fn:function(ref){\nvar on = ref.on;\nreturn [_c('v-btn',_vm._g({attrs:{\"icon\":\"\",\"ripple\":\"\"},on:{\"click\":[function($event){return _vm.toggleLibrary(_vm.item)},function($event){$event.preventDefault();},function($event){$event.stopPropagation();}]}},on),[(_vm.item.in_library.length > 0)?_c('v-icon',{attrs:{\"height\":\"20\"}},[_vm._v(\"favorite\")]):_vm._e(),(_vm.item.in_library.length == 0)?_c('v-icon',{attrs:{\"height\":\"20\"}},[_vm._v(\"favorite_border\")]):_vm._e()],1)]}}],null,false,113966118)},[(_vm.item.in_library.length > 0)?_c('span',[_vm._v(_vm._s(_vm.$t(\"remove_library\")))]):_vm._e(),(_vm.item.in_library.length == 0)?_c('span',[_vm._v(_vm._s(_vm.$t(\"add_library\")))]):_vm._e()])],1):_vm._e(),(!_vm.hideduration && !!_vm.item.duration)?_c('v-list-item-action',[_vm._v(_vm._s(_vm.item.duration.toString().formatDuration()))]):_vm._e(),(!_vm.hidemenu)?_c('v-icon',{staticStyle:{\"margin-right\":\"-10px\",\"padding-left\":\"10px\"},attrs:{\"color\":\"grey lighten-1\"},on:{\"click\":[function($event){return _vm.menuClick(_vm.item)},function($event){$event.stopPropagation();}]}},[_vm._v(\"more_vert\")]):_vm._e()],1),_c('v-divider')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n  <div>\n    <v-list-item\n      ripple\n      @click.left=\"onclickHandler ? onclickHandler(item) : itemClicked(item)\"\n      @contextmenu=\"menuClick\"\n      @contextmenu.prevent\n      v-longpress=\"menuClick\"\n    >\n      <v-list-item-avatar tile color=\"grey\" v-if=\"!hideavatar\">\n        <img\n          :src=\"$server.getImageUrl(item, 'image', 80)\"\n          :lazy-src=\"require('../assets/file.png')\"\n          style=\"border: 1px solid rgba(0,0,0,.22);\"\n        />\n      </v-list-item-avatar>\n\n      <v-list-item-content>\n        <v-list-item-title>\n          {{ item.name }}\n          <span v-if=\"!!item.version\">({{ item.version }})</span>\n        </v-list-item-title>\n\n        <v-list-item-subtitle v-if=\"item.artists\">\n          <span\n            v-for=\"(artist, artistindex) in item.artists\"\n            :key=\"artist.item_id\"\n          >\n            <a v-on:click=\"itemClicked(artist)\" @click.stop>{{\n              artist.name\n            }}</a>\n            <label\n              v-if=\"artistindex + 1 < item.artists.length\"\n              :key=\"artistindex\"\n              >/</label\n            >\n          </span>\n          <a\n            v-if=\"!!item.album && !!hidetracknum\"\n            v-on:click=\"itemClicked(item.album)\"\n            @click.stop\n            style=\"color:grey\"\n          >\n            - {{ item.album.name }}</a\n          >\n          <label v-if=\"!hidetracknum && item.track_number\" style=\"color:grey\"\n            >- disc {{ item.disc_number }} track {{ item.track_number }}</label\n          >\n        </v-list-item-subtitle>\n        <v-list-item-subtitle v-if=\"item.artist\">\n          <a v-on:click=\"itemClicked(item.artist)\" @click.stop>{{\n            item.artist.name\n          }}</a>\n        </v-list-item-subtitle>\n\n        <v-list-item-subtitle v-if=\"!!item.owner\">{{\n          item.owner\n        }}</v-list-item-subtitle>\n      </v-list-item-content>\n\n      <v-list-item-action v-if=\"!hideproviders\">\n        <ProviderIcons v-bind:providerIds=\"item.provider_ids\" :height=\"20\" />\n      </v-list-item-action>\n\n      <v-list-item-action v-if=\"isHiRes\">\n        <v-tooltip bottom>\n          <template v-slot:activator=\"{ on }\">\n          <img :src=\"require('../assets/hires.png')\" height=\"20\" v-on=\"on\" />\n          </template>\n          <span>{{ isHiRes }}</span>\n        </v-tooltip>\n      </v-list-item-action>\n\n      <v-list-item-action v-if=\"!hidelibrary\">\n        <v-tooltip bottom>\n          <template v-slot:activator=\"{ on }\">\n            <v-btn\n              icon\n              ripple\n              v-on=\"on\"\n              v-on:click=\"toggleLibrary(item)\"\n              @click.prevent\n              @click.stop\n            >\n              <v-icon height=\"20\" v-if=\"item.in_library.length > 0\"\n                >favorite</v-icon\n              >\n              <v-icon height=\"20\" v-if=\"item.in_library.length == 0\"\n                >favorite_border</v-icon\n              >\n            </v-btn>\n          </template>\n          <span v-if=\"item.in_library.length > 0\">{{\n            $t(\"remove_library\")\n          }}</span>\n          <span v-if=\"item.in_library.length == 0\">{{\n            $t(\"add_library\")\n          }}</span>\n        </v-tooltip>\n      </v-list-item-action>\n\n      <v-list-item-action v-if=\"!hideduration && !!item.duration\">{{\n        item.duration.toString().formatDuration()\n      }}</v-list-item-action>\n\n      <!-- menu button/icon -->\n      <v-icon\n        v-if=\"!hidemenu\"\n        @click=\"menuClick(item)\"\n        @click.stop\n        color=\"grey lighten-1\"\n        style=\"margin-right:-10px;padding-left:10px\"\n        >more_vert</v-icon\n      >\n    </v-list-item>\n    <v-divider></v-divider>\n  </div>\n</template>\n\n<script>\nimport Vue from 'vue'\nimport ProviderIcons from '@/components/ProviderIcons.vue'\n\nconst PRESS_TIMEOUT = 600\n\nVue.directive('longpress', {\n  bind: function (el, { value }, vNode) {\n    if (typeof value !== 'function') {\n      Vue.$log.warn(`Expect a function, got ${value}`)\n      return\n    }\n    let pressTimer = null\n    const start = e => {\n      if (e.type === 'click' && e.button !== 0) {\n        return\n      }\n      if (pressTimer === null) {\n        pressTimer = setTimeout(() => value(e), PRESS_TIMEOUT)\n      }\n    }\n    const cancel = () => {\n      if (pressTimer !== null) {\n        clearTimeout(pressTimer)\n        pressTimer = null\n      }\n    }\n    ;['mousedown', 'touchstart'].forEach(e => el.addEventListener(e, start))\n    ;['click', 'mouseout', 'touchend', 'touchcancel'].forEach(e => el.addEventListener(e, cancel))\n  }\n})\n\nexport default Vue.extend({\n  components: {\n    ProviderIcons\n  },\n  props: {\n    item: Object,\n    index: Number,\n    totalitems: Number,\n    hideavatar: Boolean,\n    hidetracknum: Boolean,\n    hideproviders: Boolean,\n    hidemenu: Boolean,\n    hidelibrary: Boolean,\n    hideduration: Boolean,\n    onclickHandler: null\n  },\n  data () {\n    return {\n      touchMoving: false,\n      cancelled: false\n    }\n  },\n  computed: {\n    isHiRes () {\n      for (var prov of this.item.provider_ids) {\n        if (prov.quality > 6) {\n          if (prov.details) {\n            return prov.details\n          } else if (prov.quality === 7) {\n            return '44.1/48khz 24 bits'\n          } else if (prov.quality === 8) {\n            return '88.2/96khz 24 bits'\n          } else if (prov.quality === 9) {\n            return '176/192khz 24 bits'\n          } else {\n            return '+192kHz 24 bits'\n          }\n        }\n      }\n      return ''\n    }\n  },\n  created () { },\n  beforeDestroy () {\n    this.cancelled = true\n  },\n  mounted () { },\n  methods: {\n    itemClicked (mediaItem = null) {\n      // mediaItem in the list is clicked\n      let url = ''\n      if (mediaItem.media_type === 1) {\n        url = '/artists/' + mediaItem.item_id\n      } else if (mediaItem.media_type === 2) {\n        url = '/albums/' + mediaItem.item_id\n      } else if (mediaItem.media_type === 4) {\n        url = '/playlists/' + mediaItem.item_id\n      } else {\n        // assume track (or radio) item\n        this.$server.$emit('showPlayMenu', mediaItem)\n        return\n      }\n      this.$router.push({ path: url, query: { provider: mediaItem.provider } })\n    },\n    menuClick () {\n      // contextmenu button clicked\n      if (this.cancelled) return\n      this.$server.$emit('showContextMenu', this.item)\n    },\n    async toggleLibrary (mediaItem) {\n      // library button clicked on item\n      this.cancelled = true\n      await this.$server.toggleLibrary(mediaItem)\n      this.cancelled = false\n    }\n  }\n})\n</script>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListviewItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListviewItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ListviewItem.vue?vue&type=template&id=36620bf4&\"\nimport script from \"./ListviewItem.vue?vue&type=script&lang=js&\"\nexport * from \"./ListviewItem.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VBtn } from 'vuetify/lib/components/VBtn';\nimport { VDivider } from 'vuetify/lib/components/VDivider';\nimport { VIcon } from 'vuetify/lib/components/VIcon';\nimport { VListItem } from 'vuetify/lib/components/VList';\nimport { VListItemAction } from 'vuetify/lib/components/VList';\nimport { VListItemAvatar } from 'vuetify/lib/components/VList';\nimport { VListItemContent } from 'vuetify/lib/components/VList';\nimport { VListItemSubtitle } from 'vuetify/lib/components/VList';\nimport { VListItemTitle } from 'vuetify/lib/components/VList';\nimport { VTooltip } from 'vuetify/lib/components/VTooltip';\ninstallComponents(component, {VBtn,VDivider,VIcon,VListItem,VListItemAction,VListItemAvatar,VListItemContent,VListItemSubtitle,VListItemTitle,VTooltip})\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',_vm._l((_vm.uniqueProviders),function(prov){return _c('img',{key:prov.provider,staticStyle:{\"margin-right\":\"6px\",\"margin-top\":\"6px\"},attrs:{\"height\":_vm.height,\"src\":require('../assets/' + prov.provider + '.png')}})}),0)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n  <div>\r\n  <img\r\n    v-for=\"prov of uniqueProviders\" :key=\"prov.provider\"\r\n    :height=\"height\"\r\n    :src=\"require('../assets/' + prov.provider + '.png')\"\r\n    style=\"margin-right:6px;margin-top:6px;\"\r\n  />\r\n  </div>\r\n</template>\r\n\r\n<script>\r\nimport Vue from 'vue'\r\n\r\nexport default Vue.extend({\r\n  props: {\r\n    providerIds: Array,\r\n    height: Number\r\n  },\r\n  data () {\r\n    return {\r\n      isHiRes: false\r\n    }\r\n  },\r\n  computed: {\r\n    uniqueProviders: function () {\r\n      var output = []\r\n      var keys = []\r\n      if (!this.providerIds) return []\r\n      this.providerIds.forEach(function (prov) {\r\n        var key = prov.provider\r\n        if (keys.indexOf(key) === -1) {\r\n          keys.push(key)\r\n          output.push(prov)\r\n        }\r\n      })\r\n      return output\r\n    }\r\n  },\r\n  mounted () { },\r\n  methods: {\r\n  }\r\n})\r\n</script>\r\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProviderIcons.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProviderIcons.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ProviderIcons.vue?vue&type=template&id=20bea3a1&\"\nimport script from \"./ProviderIcons.vue?vue&type=script&lang=js&\"\nexport * from \"./ProviderIcons.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","module.exports = __webpack_public_path__ + \"img/tunein.ca1c1bb0.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAACUtJREFUeJzt3VuMXVUdgPGvlVqhLZXSagkGlApUiPUSUcDaoiLVkCgEb/FKJL6YqDEm+m584MFHExMSE28PkohBjRYeKL1ARxMS8EZaraFA0wsINp2hl5nS+rDmmNN69pl9PXutvb9fspJJk57zX6vzZc6lsw9IkiRJkiRJkiRJkiRJkiRJkiRJUkcsqvj33wbcBKwHLgOWA0uqDlWjI8DXgeNtD9JRK4EfApe0PciQOWAaOAjsAXYD/5jkAFcB9wLPA2cTWI8AFzVyEv22Evgj7f/75lnPAN8HrmjkJOZdDvwMOB3BhouubRhJnVKKY3jNAj8G1tZ9IF8l/Nhqe4NG0r5U4xheR4Ev13EYS4CfRLAhI4lDF+IYXvcBryl7GK8Ffh/BJupej2IkZXQtjsH6DSVeWFoE3B/B8EYSh67GMVi/KHog341gaCOJQ9fjGKxv5T2QDYTXktseeBJrO0YyTl/iOEt4heu6PIeyK4JhJx3JsjwH0zN9imOwti10KB+JYEgjaV8f4xisW8YdTBdftcq7dmAk0O84zgK/zTqYtaT5LrmR1KfvcZwlPP9eMziQxUOH81EqvGnSEZuAP9DPSFYCDwPva3uQll1AaAE4N5BNk58lSpuArfQrEuM41+bBF8OBXN/CILH6AP2JxDj+38gWjtD+47/Y1k7C77h0lc85Rq/Dow7rZASDxbi6GolxZK+Rv2DXl3fPy6xddCsS4xi/5gYHNfwcZKbAAffNRsJzki5E4nOOhU0PvhgO5FALg6SkC5EYRz4HB18MB7K3hUFSsxF4iDQjMY789gy+GA5kqoVBUvR+QiQr2h6kAOMoZmQL76T9J0cprcdIIxKfkBdfb886zL9HMFxKK/ZIjKP4+svwAQ4/xAL40fjz1nlifrjlw6pyxjZwIeHVrLYrTm09TlyR+JOj3DoALF3ocL8UwaAprlgiMY7y67N5D7nPvzhVZe2m3UiMo/x6sMhBX0q4nmnbQ6e4dgMXFznsmhhH+bWPEhfgvhr/h2/ZNelIjKP8OgSsK37kwTXA/gg2keKaYjKRGEf59S/grcWP/FxrCC9ltr2ZFFfTkRhH+fU7YFXxIx9tEfAV4IUINpbaaioS4yi3DgFfLHHeuSwDvk14UtP2RlNadUdiHMXXHuAbhPf6cqvyEWw3ArcBNwPXEj5gJ6aPX4vNnwjndazi7fgO+cJmCW/6DT6C7WHgiTI3VPUzCs+3lGYjWUl4j+YdDd5HU84CnwIeqHAbqccxBdxBs58ZOTu/eutS4M+0/yO7yDoD3FNx36k/rGr7TdReSSmSV4G7K+7XOFRYCpGcBr5QcZ/GodJijuQ0Bf7zWwbjUGUxRjIHfLLivoxDtYkpklngzor7MQ7VbjXtR3IK+HjFfRiHGtNmJCeB2yvObxxqXBuRnAC2VJzbODQxk4zkOHBrxXmNQxM3iUhmgA9WnNM41JomI5mm+qdyGYdat5pwMbA6vzGOEa6JVYVxKBp1RnKU8F/9qzAORaeOSF4Gbqg4h3EoWlUieQl4d8X7Nw5Fr0wkL1L9l7SMQ8lYQ/5IXmDM5fBzMg4lJ08kh4HrKt6PcShZ4yI5CKyvePvGoeSNiuQA4dKrVRiHOmM4kueocK3WecahzllDuBzlWyrejnFIGYxDymAcUgbjkDIYh5TBOKQMxiFlMA4pg3FIGYxDymAcUgbjkDIYh5TBOKQMxiFlMA4pg3FIGYxDymAcwSrg4hpuRx1iHMFq4Kn5szASAcYx8Abgr0O3ayQyjnlrgadH3L6R9JhxBJcDe8fcj5H0kHEEVwD7ctzfFEbSG8YRvBl4psD9GkkPGEewDni2xP0bSYcZR3A14drDZecwkg4yjmA94ar1dcxjJB1hHMH1wJGa5zKSxBlHsIHwMXKxzqcWGEfwLuDfCcypCTKO4AbCR1enMq8mwDiCG4GjCc6tBhlHsBE4lvD8aoBxBJuBmRb38XhN+1CNjCP4MPBKBPsxkogYR7AFOBHBfowkIsYR3A6cjGA/RhIR4wg+AZyKYD9Z67Ga9qkCjCO4C5iNYD9GEhHjCD4DzEWwHyOJiHEEnwdOR7CfMpEsr2H/GsE4gsXArgj2YyQRMY5zrZi/zbb3ZSQRMI7RjETGsQAj6THjyCf1SHZhJIUZRzFG0iPGUY6R9IBxVJN6JDsxkkzGUQ8j6SDjqJeRdIhxNMNIOsA4mtWFSJbVfiqJMI7JMJIEGcdkGUlCjKMdRpIA42hX6pHsoMORGEccjCRCxhEXI4mIccTJSCJgHHFLPZLtJByJcaTBSFpgHGkxkgkyjjR1IZKL6j6UuhlH2oykQcbRDUbSAOPoFiOpkXF0U+qRPEoEkRhHtxlJBcbRD0ZSgnH0i5EUYBz9lHok25hAJMbRb0YyhnEIjGQk49AwIxliHBol9UgeoYZIjEPj9DoS41AevYzkQsKn/7Q9vHGkIfVIHgKWFNnw/REMbRxpST2S+/Ju9J4IhjWONKUeyacX2uAq4KUIBjWOdKUcyUEWuKL89yIY0jjSl3Ik38na1BLgxQgGNI5uSDWSA8DiURv6WATDGUe3pBrJLYMNDJdyWx0nMkFTwBZguu1BlGma8G801fYgBW0Z9Ycpve/hT460pPaTZNuoTRyOYDDj6K6UInlu1AZmIxjMOLotlUheGTX8mQgGM47uSyGS2VGDT0cwmHH0Q+yRvDxq6KcjGMw4+iPmSJ4cDDn8Mu/f6tx9TXwpt7tifgn4fy0MB7KjhUHGMY7uizWS7aP+8E3E80Tdh1X9EtPDrTlgTdagWyMY0Dj6KZZIHhg35OaWhzOOfms7kjPAexYa8tctDWccgnYj+WmeAS8Djkx4MOPQsDYieRa4JO+Am4GTExrMODTKJCOZIcdDq/PdAZxqeLAdGIeyrQB20nwct5Yd8EOEt92bGOyXwNKyg6k3Xgf8ima+Bw8B76064JXArhqHmgG+VnUo9c43gePU9324FXhjXcMtAu4G9lcY6DTwc8IbklIZVxIeebxK+e/DvcBdTQ14AfA5wpXo5nIOtB+4F7iqqaHUO9cAPwCeJ9/34EngQeBOMi7IkGVRhSGXAzcDG4B1wOsJV0aZIVxfaC/hVYh/VrgPaSHrgZuAawlvUSwj/D7Hf4B9wFOEa0yfaGtASZIkSZIkSZIkSZIkSZIkSZIkSYrCfwGWtk+6sWAEBAAAAABJRU5ErkJggg==\"","module.exports = __webpack_public_path__ + \"img/web.798ba28f.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"img/hires.eabcf7ae.png\";","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""}
\ No newline at end of file
diff --git a/music_assistant/web/precache-manifest.41143c0c7b0781d9975365999a94a71f.js b/music_assistant/web/precache-manifest.41143c0c7b0781d9975365999a94a71f.js
new file mode 100644 (file)
index 0000000..ac6ef57
--- /dev/null
@@ -0,0 +1,234 @@
+self.__precacheManifest = (self.__precacheManifest || []).concat([
+  {
+    "revision": "fa900f556cc10265c075",
+    "url": "css/app.e388fe44.css"
+  },
+  {
+    "revision": "4f3c65b5f0369a230d8b",
+    "url": "css/chunk-vendors.f9907851.css"
+  },
+  {
+    "revision": "b6337190f503e09ea032",
+    "url": "css/config.2956469c.css"
+  },
+  {
+    "revision": "58fabceeefe4389effc5",
+    "url": "css/itemdetails.28909c9e.css"
+  },
+  {
+    "revision": "9bd66517467185f0366d",
+    "url": "css/itemdetails~playerqueue~search.133d2876.css"
+  },
+  {
+    "revision": "0509ab09c1b0d2200a4135803c91d6ce",
+    "url": "fonts/MaterialIcons-Regular.0509ab09.woff2"
+  },
+  {
+    "revision": "29b882f018fa6fe75fd338aaae6235b8",
+    "url": "fonts/MaterialIcons-Regular.29b882f0.woff"
+  },
+  {
+    "revision": "96c476804d7a788cc1c05351b287ee41",
+    "url": "fonts/MaterialIcons-Regular.96c47680.eot"
+  },
+  {
+    "revision": "da4ea5cdfca6b3baab285741f5ccb59f",
+    "url": "fonts/MaterialIcons-Regular.da4ea5cd.ttf"
+  },
+  {
+    "revision": "313a65630d341645c13e4f2a0364381d",
+    "url": "fonts/Roboto-Black.313a6563.woff"
+  },
+  {
+    "revision": "59eb3601394dd87f30f82433fb39dd94",
+    "url": "fonts/Roboto-Black.59eb3601.woff2"
+  },
+  {
+    "revision": "cc2fadc3928f2f223418887111947b40",
+    "url": "fonts/Roboto-BlackItalic.cc2fadc3.woff"
+  },
+  {
+    "revision": "f75569f8a5fab0893fa712d8c0d9c3fe",
+    "url": "fonts/Roboto-BlackItalic.f75569f8.woff2"
+  },
+  {
+    "revision": "50d75e48e0a3ddab1dd15d6bfb9d3700",
+    "url": "fonts/Roboto-Bold.50d75e48.woff"
+  },
+  {
+    "revision": "b52fac2bb93c5858f3f2675e4b52e1de",
+    "url": "fonts/Roboto-Bold.b52fac2b.woff2"
+  },
+  {
+    "revision": "4fe0f73cc919ba2b7a3c36e4540d725c",
+    "url": "fonts/Roboto-BoldItalic.4fe0f73c.woff"
+  },
+  {
+    "revision": "94008e69aaf05da75c0bbf8f8bb0db41",
+    "url": "fonts/Roboto-BoldItalic.94008e69.woff2"
+  },
+  {
+    "revision": "c73eb1ceba3321a80a0aff13ad373cb4",
+    "url": "fonts/Roboto-Light.c73eb1ce.woff"
+  },
+  {
+    "revision": "d26871e8149b5759f814fd3c7a4f784b",
+    "url": "fonts/Roboto-Light.d26871e8.woff2"
+  },
+  {
+    "revision": "13efe6cbc10b97144a28310ebdeda594",
+    "url": "fonts/Roboto-LightItalic.13efe6cb.woff"
+  },
+  {
+    "revision": "e8eaae902c3a4dacb9a5062667e10576",
+    "url": "fonts/Roboto-LightItalic.e8eaae90.woff2"
+  },
+  {
+    "revision": "1d6594826615607f6dc860bb49258acb",
+    "url": "fonts/Roboto-Medium.1d659482.woff"
+  },
+  {
+    "revision": "90d1676003d9c28c04994c18bfd8b558",
+    "url": "fonts/Roboto-Medium.90d16760.woff2"
+  },
+  {
+    "revision": "13ec0eb5bdb821ff4930237d7c9f943f",
+    "url": "fonts/Roboto-MediumItalic.13ec0eb5.woff2"
+  },
+  {
+    "revision": "83e114c316fcc3f23f524ec3e1c65984",
+    "url": "fonts/Roboto-MediumItalic.83e114c3.woff"
+  },
+  {
+    "revision": "35b07eb2f8711ae08d1f58c043880930",
+    "url": "fonts/Roboto-Regular.35b07eb2.woff"
+  },
+  {
+    "revision": "73f0a88bbca1bec19fb1303c689d04c6",
+    "url": "fonts/Roboto-Regular.73f0a88b.woff2"
+  },
+  {
+    "revision": "4357beb823a5f8d65c260f045d9e019a",
+    "url": "fonts/Roboto-RegularItalic.4357beb8.woff2"
+  },
+  {
+    "revision": "f5902d5ef961717ed263902fc429e6ae",
+    "url": "fonts/Roboto-RegularItalic.f5902d5e.woff"
+  },
+  {
+    "revision": "ad538a69b0e8615ed0419c4529344ffc",
+    "url": "fonts/Roboto-Thin.ad538a69.woff2"
+  },
+  {
+    "revision": "d3b47375afd904983d9be8d6e239a949",
+    "url": "fonts/Roboto-Thin.d3b47375.woff"
+  },
+  {
+    "revision": "5b4a33e176ff736a74f0ca2dd9e6b396",
+    "url": "fonts/Roboto-ThinItalic.5b4a33e1.woff2"
+  },
+  {
+    "revision": "8a96edbbcd9a6991d79371aed0b0288e",
+    "url": "fonts/Roboto-ThinItalic.8a96edbb.woff"
+  },
+  {
+    "revision": "7305b29c7526c212938516a0717e5ccd",
+    "url": "img/default_artist.7305b29c.png"
+  },
+  {
+    "revision": "c079bd979828319b9104eae3c39cc373",
+    "url": "img/demo_player.c079bd97.png"
+  },
+  {
+    "revision": "813f9dad5c3f55bddb15abc0b68f847b",
+    "url": "img/file.813f9dad.png"
+  },
+  {
+    "revision": "eabcf7ae3898600793d98017531fb3e2",
+    "url": "img/hires.eabcf7ae.png"
+  },
+  {
+    "revision": "29fe3282407f51338f27ae7bc33d8513",
+    "url": "img/homeassistant.29fe3282.png"
+  },
+  {
+    "revision": "4c4e488018bcf5af49d08a8a1434dd9b",
+    "url": "img/http_streamer.4c4e4880.png"
+  },
+  {
+    "revision": "4db55f47d3079cd17637da3220b953e2",
+    "url": "img/info_gradient.4db55f47.jpg"
+  },
+  {
+    "revision": "c079bd979828319b9104eae3c39cc373",
+    "url": "img/logo.c079bd97.png"
+  },
+  {
+    "revision": "c7eb9a768cf919b7eae7f80ce7100f8f",
+    "url": "img/qobuz.c7eb9a76.png"
+  },
+  {
+    "revision": "72e2fecbb918cb44d850686550c9a335",
+    "url": "img/sonos.72e2fecb.png"
+  },
+  {
+    "revision": "1f3fb1afff253402ff14288344ef1adc",
+    "url": "img/spotify.1f3fb1af.png"
+  },
+  {
+    "revision": "6063122339ae24244df236a92769470d",
+    "url": "img/squeezebox.60631223.png"
+  },
+  {
+    "revision": "ca1c1bb082ed1b32e4a7563a85279149",
+    "url": "img/tunein.ca1c1bb0.png"
+  },
+  {
+    "revision": "798ba28fac7cd93ad48b7bf28cce3f52",
+    "url": "img/web.798ba28f.png"
+  },
+  {
+    "revision": "8e1a0da98ad9d90c423b2b03ccb13033",
+    "url": "img/webplayer.8e1a0da9.png"
+  },
+  {
+    "revision": "f7c78253e19e1ad1f850c08354184dc7",
+    "url": "index.html"
+  },
+  {
+    "revision": "fa900f556cc10265c075",
+    "url": "js/app.413e2e3d.js"
+  },
+  {
+    "revision": "4f3c65b5f0369a230d8b",
+    "url": "js/chunk-vendors.31828971.js"
+  },
+  {
+    "revision": "b6337190f503e09ea032",
+    "url": "js/config.165ed655.js"
+  },
+  {
+    "revision": "58fabceeefe4389effc5",
+    "url": "js/itemdetails.79b5fa05.js"
+  },
+  {
+    "revision": "9bd66517467185f0366d",
+    "url": "js/itemdetails~playerqueue~search.3c623cdf.js"
+  },
+  {
+    "revision": "b9d320b56b5e0a72037f",
+    "url": "js/playerqueue.84a8618a.js"
+  },
+  {
+    "revision": "4ccb2a5caa6ea57ee3b0",
+    "url": "js/search.31a9bea8.js"
+  },
+  {
+    "revision": "c93d318ec22138832730289be28caa77",
+    "url": "manifest.json"
+  },
+  {
+    "revision": "b6216d61c03e6ce0c9aea6ca7808f7ca",
+    "url": "robots.txt"
+  }
+]);
\ No newline at end of file
diff --git a/music_assistant/web/precache-manifest.7d1a9077241115c1dc586f5d8e7900b1.js b/music_assistant/web/precache-manifest.7d1a9077241115c1dc586f5d8e7900b1.js
deleted file mode 100644 (file)
index 5a34fc9..0000000
+++ /dev/null
@@ -1,234 +0,0 @@
-self.__precacheManifest = (self.__precacheManifest || []).concat([
-  {
-    "revision": "176ad134c275dc32e48c",
-    "url": "css/app.051f35c4.css"
-  },
-  {
-    "revision": "4f3c65b5f0369a230d8b",
-    "url": "css/chunk-vendors.f9907851.css"
-  },
-  {
-    "revision": "b6337190f503e09ea032",
-    "url": "css/config.2956469c.css"
-  },
-  {
-    "revision": "58fabceeefe4389effc5",
-    "url": "css/itemdetails.28909c9e.css"
-  },
-  {
-    "revision": "9bd66517467185f0366d",
-    "url": "css/itemdetails~playerqueue~search.133d2876.css"
-  },
-  {
-    "revision": "0509ab09c1b0d2200a4135803c91d6ce",
-    "url": "fonts/MaterialIcons-Regular.0509ab09.woff2"
-  },
-  {
-    "revision": "29b882f018fa6fe75fd338aaae6235b8",
-    "url": "fonts/MaterialIcons-Regular.29b882f0.woff"
-  },
-  {
-    "revision": "96c476804d7a788cc1c05351b287ee41",
-    "url": "fonts/MaterialIcons-Regular.96c47680.eot"
-  },
-  {
-    "revision": "da4ea5cdfca6b3baab285741f5ccb59f",
-    "url": "fonts/MaterialIcons-Regular.da4ea5cd.ttf"
-  },
-  {
-    "revision": "313a65630d341645c13e4f2a0364381d",
-    "url": "fonts/Roboto-Black.313a6563.woff"
-  },
-  {
-    "revision": "59eb3601394dd87f30f82433fb39dd94",
-    "url": "fonts/Roboto-Black.59eb3601.woff2"
-  },
-  {
-    "revision": "cc2fadc3928f2f223418887111947b40",
-    "url": "fonts/Roboto-BlackItalic.cc2fadc3.woff"
-  },
-  {
-    "revision": "f75569f8a5fab0893fa712d8c0d9c3fe",
-    "url": "fonts/Roboto-BlackItalic.f75569f8.woff2"
-  },
-  {
-    "revision": "50d75e48e0a3ddab1dd15d6bfb9d3700",
-    "url": "fonts/Roboto-Bold.50d75e48.woff"
-  },
-  {
-    "revision": "b52fac2bb93c5858f3f2675e4b52e1de",
-    "url": "fonts/Roboto-Bold.b52fac2b.woff2"
-  },
-  {
-    "revision": "4fe0f73cc919ba2b7a3c36e4540d725c",
-    "url": "fonts/Roboto-BoldItalic.4fe0f73c.woff"
-  },
-  {
-    "revision": "94008e69aaf05da75c0bbf8f8bb0db41",
-    "url": "fonts/Roboto-BoldItalic.94008e69.woff2"
-  },
-  {
-    "revision": "c73eb1ceba3321a80a0aff13ad373cb4",
-    "url": "fonts/Roboto-Light.c73eb1ce.woff"
-  },
-  {
-    "revision": "d26871e8149b5759f814fd3c7a4f784b",
-    "url": "fonts/Roboto-Light.d26871e8.woff2"
-  },
-  {
-    "revision": "13efe6cbc10b97144a28310ebdeda594",
-    "url": "fonts/Roboto-LightItalic.13efe6cb.woff"
-  },
-  {
-    "revision": "e8eaae902c3a4dacb9a5062667e10576",
-    "url": "fonts/Roboto-LightItalic.e8eaae90.woff2"
-  },
-  {
-    "revision": "1d6594826615607f6dc860bb49258acb",
-    "url": "fonts/Roboto-Medium.1d659482.woff"
-  },
-  {
-    "revision": "90d1676003d9c28c04994c18bfd8b558",
-    "url": "fonts/Roboto-Medium.90d16760.woff2"
-  },
-  {
-    "revision": "13ec0eb5bdb821ff4930237d7c9f943f",
-    "url": "fonts/Roboto-MediumItalic.13ec0eb5.woff2"
-  },
-  {
-    "revision": "83e114c316fcc3f23f524ec3e1c65984",
-    "url": "fonts/Roboto-MediumItalic.83e114c3.woff"
-  },
-  {
-    "revision": "35b07eb2f8711ae08d1f58c043880930",
-    "url": "fonts/Roboto-Regular.35b07eb2.woff"
-  },
-  {
-    "revision": "73f0a88bbca1bec19fb1303c689d04c6",
-    "url": "fonts/Roboto-Regular.73f0a88b.woff2"
-  },
-  {
-    "revision": "4357beb823a5f8d65c260f045d9e019a",
-    "url": "fonts/Roboto-RegularItalic.4357beb8.woff2"
-  },
-  {
-    "revision": "f5902d5ef961717ed263902fc429e6ae",
-    "url": "fonts/Roboto-RegularItalic.f5902d5e.woff"
-  },
-  {
-    "revision": "ad538a69b0e8615ed0419c4529344ffc",
-    "url": "fonts/Roboto-Thin.ad538a69.woff2"
-  },
-  {
-    "revision": "d3b47375afd904983d9be8d6e239a949",
-    "url": "fonts/Roboto-Thin.d3b47375.woff"
-  },
-  {
-    "revision": "5b4a33e176ff736a74f0ca2dd9e6b396",
-    "url": "fonts/Roboto-ThinItalic.5b4a33e1.woff2"
-  },
-  {
-    "revision": "8a96edbbcd9a6991d79371aed0b0288e",
-    "url": "fonts/Roboto-ThinItalic.8a96edbb.woff"
-  },
-  {
-    "revision": "7305b29c7526c212938516a0717e5ccd",
-    "url": "img/default_artist.7305b29c.png"
-  },
-  {
-    "revision": "c079bd979828319b9104eae3c39cc373",
-    "url": "img/demo_player.c079bd97.png"
-  },
-  {
-    "revision": "813f9dad5c3f55bddb15abc0b68f847b",
-    "url": "img/file.813f9dad.png"
-  },
-  {
-    "revision": "eabcf7ae3898600793d98017531fb3e2",
-    "url": "img/hires.eabcf7ae.png"
-  },
-  {
-    "revision": "29fe3282407f51338f27ae7bc33d8513",
-    "url": "img/homeassistant.29fe3282.png"
-  },
-  {
-    "revision": "4c4e488018bcf5af49d08a8a1434dd9b",
-    "url": "img/http_streamer.4c4e4880.png"
-  },
-  {
-    "revision": "4db55f47d3079cd17637da3220b953e2",
-    "url": "img/info_gradient.4db55f47.jpg"
-  },
-  {
-    "revision": "c079bd979828319b9104eae3c39cc373",
-    "url": "img/logo.c079bd97.png"
-  },
-  {
-    "revision": "c7eb9a768cf919b7eae7f80ce7100f8f",
-    "url": "img/qobuz.c7eb9a76.png"
-  },
-  {
-    "revision": "72e2fecbb918cb44d850686550c9a335",
-    "url": "img/sonos.72e2fecb.png"
-  },
-  {
-    "revision": "1f3fb1afff253402ff14288344ef1adc",
-    "url": "img/spotify.1f3fb1af.png"
-  },
-  {
-    "revision": "6063122339ae24244df236a92769470d",
-    "url": "img/squeezebox.60631223.png"
-  },
-  {
-    "revision": "ca1c1bb082ed1b32e4a7563a85279149",
-    "url": "img/tunein.ca1c1bb0.png"
-  },
-  {
-    "revision": "798ba28fac7cd93ad48b7bf28cce3f52",
-    "url": "img/web.798ba28f.png"
-  },
-  {
-    "revision": "8e1a0da98ad9d90c423b2b03ccb13033",
-    "url": "img/webplayer.8e1a0da9.png"
-  },
-  {
-    "revision": "121d7f2c4002e10bbc20de6e2229bc38",
-    "url": "index.html"
-  },
-  {
-    "revision": "176ad134c275dc32e48c",
-    "url": "js/app.d45df414.js"
-  },
-  {
-    "revision": "4f3c65b5f0369a230d8b",
-    "url": "js/chunk-vendors.31828971.js"
-  },
-  {
-    "revision": "b6337190f503e09ea032",
-    "url": "js/config.165ed655.js"
-  },
-  {
-    "revision": "58fabceeefe4389effc5",
-    "url": "js/itemdetails.79b5fa05.js"
-  },
-  {
-    "revision": "9bd66517467185f0366d",
-    "url": "js/itemdetails~playerqueue~search.3c623cdf.js"
-  },
-  {
-    "revision": "b9d320b56b5e0a72037f",
-    "url": "js/playerqueue.84a8618a.js"
-  },
-  {
-    "revision": "4ccb2a5caa6ea57ee3b0",
-    "url": "js/search.31a9bea8.js"
-  },
-  {
-    "revision": "c93d318ec22138832730289be28caa77",
-    "url": "manifest.json"
-  },
-  {
-    "revision": "b6216d61c03e6ce0c9aea6ca7808f7ca",
-    "url": "robots.txt"
-  }
-]);
\ No newline at end of file
index faf7f47cc05d41d14715d14e5dc5a82e9ea994cb..807ee3e027df59e1b7e7dda43da84d5e31bb8f22 100644 (file)
@@ -14,7 +14,7 @@
 importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
 
 importScripts(
-  "precache-manifest.7d1a9077241115c1dc586f5d8e7900b1.js"
+  "precache-manifest.41143c0c7b0781d9975365999a94a71f.js"
 );
 
 workbox.core.setCacheNameDetails({prefix: "musicassistant-frontend"});