From cddab6eb77234688c140f7a03e377f473467aa5e Mon Sep 17 00:00:00 2001 From: marcelveldt Date: Fri, 8 Nov 2019 01:26:59 +0100 Subject: [PATCH] switch to iterators for all listings results in ultra fast loading of (large) lists in frontend --- frontend/package-lock.json | 13 + frontend/package.json | 1 + frontend/src/components/ContextMenu.vue | 2 +- frontend/src/plugins/server.js | 36 +- frontend/src/views/Browse.vue | 2 +- frontend/src/views/ItemDetails.vue | 8 +- music_assistant/cache.py | 55 +-- music_assistant/database.py | 140 +++---- music_assistant/http_streamer.py | 251 +++++++----- music_assistant/models/media_types.py | 2 + music_assistant/models/musicprovider.py | 383 +++++++++++------- music_assistant/music_manager.py | 178 +++----- music_assistant/musicproviders/file.py | 3 +- music_assistant/musicproviders/qobuz.py | 333 ++++++++------- music_assistant/musicproviders/spotify.py | 184 +++------ music_assistant/player_manager.py | 4 +- music_assistant/web.py | 134 ++++-- .../web/css/itemdetails.66e507cb.css | 1 - .../web/css/itemdetails.742ba64e.css | 1 + music_assistant/web/index.html | 2 +- music_assistant/web/js/app.0ae1c192.js | 2 + music_assistant/web/js/app.0ae1c192.js.map | 1 + music_assistant/web/js/app.a7d20a64.js | 2 - music_assistant/web/js/app.a7d20a64.js.map | 1 - .../web/js/chunk-vendors.a6d30324.js | 30 ++ .../web/js/chunk-vendors.a6d30324.js.map | 1 + .../web/js/chunk-vendors.d9e063c0.js | 25 -- .../web/js/chunk-vendors.d9e063c0.js.map | 1 - ...{config.3af84ca2.js => config.ccaf05b8.js} | 2 +- ...3af84ca2.js.map => config.ccaf05b8.js.map} | 2 +- .../web/js/itemdetails.2785d492.js | 2 + .../web/js/itemdetails.2785d492.js.map | 1 + .../web/js/itemdetails.66f74ea0.js | 2 - .../web/js/itemdetails.66f74ea0.js.map | 1 - ...ue.a3006395.js => playerqueue.215152f1.js} | 2 +- ...395.js.map => playerqueue.215152f1.js.map} | 2 +- ...{search.a47a53ec.js => search.0b1a2f05.js} | 2 +- ...a47a53ec.js.map => search.0b1a2f05.js.map} | 2 +- ...ifest.af094e2fe1b27f0e08170369f890f4e7.js} | 36 +- music_assistant/web/service-worker.js | 2 +- 40 files changed, 993 insertions(+), 859 deletions(-) delete mode 100644 music_assistant/web/css/itemdetails.66e507cb.css create mode 100644 music_assistant/web/css/itemdetails.742ba64e.css create mode 100644 music_assistant/web/js/app.0ae1c192.js create mode 100644 music_assistant/web/js/app.0ae1c192.js.map delete mode 100644 music_assistant/web/js/app.a7d20a64.js delete mode 100644 music_assistant/web/js/app.a7d20a64.js.map create mode 100644 music_assistant/web/js/chunk-vendors.a6d30324.js create mode 100644 music_assistant/web/js/chunk-vendors.a6d30324.js.map delete mode 100644 music_assistant/web/js/chunk-vendors.d9e063c0.js delete mode 100644 music_assistant/web/js/chunk-vendors.d9e063c0.js.map rename music_assistant/web/js/{config.3af84ca2.js => config.ccaf05b8.js} (99%) rename music_assistant/web/js/{config.3af84ca2.js.map => config.ccaf05b8.js.map} (99%) create mode 100644 music_assistant/web/js/itemdetails.2785d492.js create mode 100644 music_assistant/web/js/itemdetails.2785d492.js.map delete mode 100644 music_assistant/web/js/itemdetails.66f74ea0.js delete mode 100644 music_assistant/web/js/itemdetails.66f74ea0.js.map rename music_assistant/web/js/{playerqueue.a3006395.js => playerqueue.215152f1.js} (98%) rename music_assistant/web/js/{playerqueue.a3006395.js.map => playerqueue.215152f1.js.map} (98%) rename music_assistant/web/js/{search.a47a53ec.js => search.0b1a2f05.js} (98%) rename music_assistant/web/js/{search.a47a53ec.js.map => search.0b1a2f05.js.map} (98%) rename music_assistant/web/{precache-manifest.69a2c2c748b337760e88b872f6a8f34b.js => precache-manifest.af094e2fe1b27f0e08170369f890f4e7.js} (88%) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e48e3f7f..f331637d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -6556,6 +6556,11 @@ } } }, + "http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs=" + }, "http-parser-js": { "version": "0.4.10", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", @@ -8739,6 +8744,14 @@ "has": "^1.0.3" } }, + "oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=", + "requires": { + "http-https": "^1.0.0" + } + }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 82858b79..ca122b67 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -24,6 +24,7 @@ "dependencies": { "@babel/polyfill": "^7.4.4", "core-js": "^3.3.2", + "oboe": "^2.1.5", "register-service-worker": "^1.6.2", "roboto-fontface": "*", "vue": "^2.6.10", diff --git a/frontend/src/components/ContextMenu.vue b/frontend/src/components/ContextMenu.vue index 1d9d999b..490a9907 100644 --- a/frontend/src/components/ContextMenu.vue +++ b/frontend/src/components/ContextMenu.vue @@ -171,7 +171,7 @@ export default Vue.extend({ } let playlists = await this.$server.getData('playlists') let items = [] - for (var playlist of playlists) { + for (var playlist of playlists.items) { if ( playlist.is_editable && (!this.curPlaylist || playlist.item_id !== this.curPlaylist.item_id) diff --git a/frontend/src/plugins/server.js b/frontend/src/plugins/server.js index 2c315270..e5d1dec3 100644 --- a/frontend/src/plugins/server.js +++ b/frontend/src/plugins/server.js @@ -2,6 +2,7 @@ import Vue from 'vue' import axios from 'axios' +import oboe from 'oboe' const axiosConfig = { timeout: 60 * 1000 @@ -85,24 +86,25 @@ const server = new Vue({ async getAllItems (endpoint, list, params = {}) { // retrieve all items and fill list - var offset = 0 - var limit = 50 - var index = 0 - while (true) { - let items = await this.$server.getData(endpoint, { offset: offset, limit: limit, ...params }) - if (!items || items.length === 0) break - for (var item of items) { - if (list.length >= index) { - Vue.set(list, index, item) - } else list.push(item) - index += 1 - } - offset += limit - } - // truncate list if needed - if (list.length > index) { - list = list.slice(0, index) + let url = this._address + 'api/' + endpoint + if (params) { + var urlParams = new URLSearchParams(params) + url += '?' + urlParams.toString() } + let index = 0 + oboe(url) + .node('items.*', function (item) { + Vue.set(list, index, item) + index += 1 + }) + .done(function (fullList) { + // truncate list if needed + if (list.length === 0) { + list = [] + } else if (list.length > index) { + list = list.slice(0, index) + } + }) }, playerCommand (cmd, cmd_opt = null, playerId = this.activePlayerId) { diff --git a/frontend/src/views/Browse.vue b/frontend/src/views/Browse.vue index e11e5903..393f5f50 100644 --- a/frontend/src/views/Browse.vue +++ b/frontend/src/views/Browse.vue @@ -49,7 +49,7 @@ export default { methods: { async getItems () { // retrieve the full list of items - return this.$server.getAllItems(this.mediatype, this.items, { provider: this.provider }) + return this.$server.getAllItems(this.mediatype, this.items) } } } diff --git a/frontend/src/views/ItemDetails.vue b/frontend/src/views/ItemDetails.vue index 27249b40..47753391 100644 --- a/frontend/src/views/ItemDetails.vue +++ b/frontend/src/views/ItemDetails.vue @@ -106,7 +106,6 @@ export default { { label: 'playlist_tracks', endpoint: 'playlists/' + this.media_id + '/tracks', - paginated: true, items: [] } ] @@ -136,12 +135,7 @@ export default { }, async getTabItems (tab) { // retrieve the lists of items for each tab - let paginated = 'paginated' in tab ? tab.paginated : false - if (paginated) { - return this.$server.getAllItems(tab.endpoint, tab.items, { provider: this.provider }) - } else { - tab.items = await this.$server.getData(tab.endpoint, { provider: this.provider }) - } + return this.$server.getAllItems(tab.endpoint, tab.items, { provider: this.provider }) } } } diff --git a/music_assistant/cache.py b/music_assistant/cache.py index 6e08a637..83dc2e93 100644 --- a/music_assistant/cache.py +++ b/music_assistant/cache.py @@ -4,8 +4,8 @@ import os import functools -import datetime import time +import pickle from functools import reduce import aiosqlite @@ -40,10 +40,10 @@ class Cache(object): await self._db.close() LOGGER.info("cache db connection closed") - async def get(self, endpoint, checksum=""): + async def get(self, cache_key, checksum=""): """ get object from cache and return the results - endpoint: the (unique) name of the cache object as reference + cache_key: the (unique) name of the cache object as reference checkum: optional argument to check if the checksum in the cacheobject matches the checkum provided """ @@ -51,34 +51,34 @@ class Cache(object): cur_time = int(time.time()) checksum = self._get_checksum(checksum) sql_query = "SELECT expires, data, checksum FROM simplecache WHERE id = ?" - async with self._db.execute(sql_query, (endpoint, )) as cursor: + async with self._db.execute(sql_query, (cache_key, )) as cursor: cache_data = await cursor.fetchone() if not cache_data: - LOGGER.debug('no cache data for %s', endpoint) + LOGGER.debug('no cache data for %s', cache_key) elif cache_data['expires'] < cur_time: - LOGGER.debug('cache expired for %s', endpoint) + LOGGER.debug('cache expired for %s', cache_key) elif checksum and cache_data['checksum'] != checksum: - LOGGER.debug('cache checksum mismatch for %s', endpoint) + LOGGER.debug('cache checksum mismatch for %s', cache_key) if cache_data and cache_data['expires'] > cur_time: if checksum is None or cache_data['checksum'] == checksum: - LOGGER.debug('return cache data for %s', endpoint) - result = eval(cache_data[1]) + LOGGER.debug('return cache data for %s', cache_key) + result = pickle.loads(cache_data[1]) return result async def set(self, - endpoint, + cache_key, data, checksum="", - expiration=datetime.timedelta(days=14)): + expiration=(86400*30)): """ set data in cache """ checksum = self._get_checksum(checksum) - expires = int(time.time() + expiration.seconds) - data = repr(data) + expires = int(time.time() + expiration) + data = pickle.dumps(data) sql_query = """INSERT OR REPLACE INTO simplecache (id, expires, data, checksum) VALUES (?, ?, ?, ?)""" - await self._db.execute(sql_query, (endpoint, expires, data, checksum)) + await self._db.execute(sql_query, (cache_key, expires, data, checksum)) await self._db.commit() @run_periodic(3600) @@ -102,11 +102,6 @@ class Cache(object): await self._db.commit() LOGGER.debug("Auto cleanup done") - @staticmethod - def _get_timestamp(date_time): - """Converts a datetime object to unix timestamp""" - return int(time.mktime(date_time.timetuple())) - @staticmethod def _get_checksum(stringinput): """get int checksum from string""" @@ -117,7 +112,22 @@ class Cache(object): return reduce(lambda x, y: x + y, map(ord, stringinput)) -def use_cache(cache_days=14, cache_hours=8): +async def cached_iterator(cache, iter_func, cache_key, expires=(86400*30), checksum=None): + """Helper method to store results of an iterator in the cache.""" + cache_result = await cache.get(cache_key, checksum) + if cache_result: + for item in cache_result: + yield item + else: + # nothing in cache, yield from iterator and store in cache when complete + cache_result = [] + async for item in iter_func: + yield item + cache_result.append(item) + await cache.set(cache_key, cache_result, checksum, expires) + +def use_cache(cache_days=14): + """ decorator that can be used to cache a method's result.""" def wrapper(func): @functools.wraps(func) async def wrapped(*args, **kwargs): @@ -157,11 +167,8 @@ def use_cache(cache_days=14, cache_hours=8): cache_str, result, checksum=cache_checksum, - expiration=datetime.timedelta(days=cache_days, - hours=cache_hours), + expiration=(86400*cache_days), ) return result - return wrapped - return wrapper diff --git a/music_assistant/database.py b/music_assistant/database.py index f0a05457..7f8908f2 100755 --- a/music_assistant/database.py +++ b/music_assistant/database.py @@ -49,7 +49,7 @@ class Database(): await self._db.execute('CREATE TABLE IF NOT EXISTS metadata(item_id INTEGER NOT NULL, media_type INTEGER NOT NULL, key TEXT NOT NULL, value TEXT, UNIQUE(item_id, media_type, key));') await self._db.execute('CREATE TABLE IF NOT EXISTS external_ids(item_id INTEGER NOT NULL, media_type INTEGER NOT NULL, key TEXT NOT NULL, value TEXT, UNIQUE(item_id, media_type, key, value));') - await self._db.execute('CREATE TABLE IF NOT EXISTS playlists(playlist_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, owner TEXT NOT NULL, is_editable BOOLEAN NOT NULL, UNIQUE(name, owner));') + await self._db.execute('CREATE TABLE IF NOT EXISTS playlists(playlist_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, owner TEXT NOT NULL, is_editable BOOLEAN NOT NULL, checksum TEXT NOT NULL, UNIQUE(name, owner));') await self._db.execute('CREATE TABLE IF NOT EXISTS radios(radio_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE);') @@ -70,7 +70,7 @@ class Database(): await cursor.close() return item_id - async def search(self, searchquery, media_types:List[MediaType], limit=10): + async def search(self, searchquery, media_types:List[MediaType]): ''' search library for the given searchphrase ''' result = { "artists": [], @@ -81,78 +81,75 @@ class Database(): searchquery = "%" + searchquery + "%" if MediaType.Artist in media_types: sql_query = ' WHERE name LIKE "%s"' % searchquery - result["artists"] = await self.artists(sql_query, limit=limit) + result["artists"] = [item async for item in self.artists(sql_query)] if MediaType.Album in media_types: sql_query = ' WHERE name LIKE "%s"' % searchquery - result["albums"] = await self.albums(sql_query, limit=limit) + result["albums"] = [item async for item in self.albums(sql_query)] if MediaType.Track in media_types: sql_query = 'SELECT * FROM tracks WHERE name LIKE "%s"' % searchquery - result["tracks"] = await self.tracks(sql_query, limit=limit) + result["tracks"] = [item async for item in self.tracks(sql_query)] if MediaType.Playlist in media_types: sql_query = ' WHERE name LIKE "%s"' % searchquery - result["playlists"] = await self.playlists(sql_query, limit=limit) + result["playlists"] = [item async for item in self.library_playlists(sql_query)] return result - async def library_artists(self, provider=None, limit=100000, offset=0, orderby='name') -> List[Artist]: + async def library_artists(self, provider=None, orderby='name') -> List[Artist]: ''' get all library artists, optionally filtered by provider''' if provider != None: sql_query = ' WHERE artist_id in (SELECT item_id FROM library_items WHERE provider = "%s" AND media_type = %d)' % (provider,MediaType.Artist) else: sql_query = ' WHERE artist_id in (SELECT item_id FROM library_items WHERE media_type = %d)' % MediaType.Artist - return await self.artists(sql_query, limit=limit, offset=offset, orderby=orderby) + async for item in self.artists(sql_query, orderby=orderby): + yield item - async def library_albums(self, provider=None, limit=100000, offset=0, orderby='name') -> List[Album]: + async def library_albums(self, provider=None, orderby='name') -> List[Album]: ''' get all library albums, optionally filtered by provider''' if provider != None: sql_query = ' WHERE album_id in (SELECT item_id FROM library_items WHERE provider = "%s" AND media_type = %d)' % (provider,MediaType.Album) else: sql_query = ' WHERE album_id in (SELECT item_id FROM library_items WHERE media_type = %d)' % MediaType.Album - return await self.albums(sql_query, limit=limit, offset=offset, orderby=orderby) + async for item in self.albums(sql_query, orderby=orderby): + yield item - async def library_tracks(self, provider=None, limit=100000, offset=0, orderby='name') -> List[Track]: + async def library_tracks(self, provider=None, orderby='name') -> List[Track]: ''' get all library tracks, optionally filtered by provider''' if provider != None: sql_query = 'SELECT * FROM tracks WHERE track_id in (SELECT item_id FROM library_items WHERE provider = "%s" AND media_type = %d)' % (provider,MediaType.Track) else: sql_query = 'SELECT * FROM tracks WHERE track_id in (SELECT item_id FROM library_items WHERE media_type = %d)' % MediaType.Track - return await self.tracks(sql_query, limit=limit, offset=offset, orderby=orderby) + async for item in self.tracks(sql_query, orderby=orderby): + yield item - async def playlists(self, filter_query=None, provider=None, limit=100000, offset=0, orderby='name') -> List[Playlist]: + async def library_playlists(self, filter_query=None, provider=None, orderby='name') -> List[Playlist]: ''' fetch all playlist records from table''' - playlists = [] sql_query = 'SELECT * FROM playlists' if filter_query: sql_query += filter_query elif provider != None: sql_query += ' WHERE playlist_id in (SELECT item_id FROM provider_mappings WHERE provider = "%s" AND media_type = %d)' % (provider,MediaType.Playlist) sql_query += ' ORDER BY %s' % orderby - if limit: - sql_query += ' LIMIT %d OFFSET %d' %(limit, offset) async with self._db.execute(sql_query) as cursor: db_rows = await cursor.fetchall() for db_row in db_rows: playlist = Playlist() - playlist.item_id = db_row[0] - playlist.name = db_row[1] - playlist.owner = db_row[2] - playlist.is_editable = db_row[3] + playlist.item_id = db_row['playlist_id'] + playlist.name = db_row['name'] + playlist.owner = db_row['owner'] + playlist.is_editable = db_row['is_editable'] + playlist.checksum = db_row['checksum'] playlist.metadata = await self.__get_metadata(playlist.item_id, MediaType.Playlist) playlist.provider_ids = await self.__get_prov_ids(playlist.item_id, MediaType.Playlist) playlist.in_library = await self.__get_library_providers(playlist.item_id, MediaType.Playlist) - playlists.append(playlist) - return playlists + yield playlist - async def radios(self, filter_query=None, provider=None, limit=100000, offset=0, orderby='name') -> List[Radio]: + async def library_radios(self, filter_query=None, provider=None, orderby='name') -> List[Radio]: ''' fetch all radio records from table''' - items = [] sql_query = 'SELECT * FROM radios' if filter_query: sql_query += filter_query elif provider != None: sql_query += ' WHERE radio_id in (SELECT item_id FROM provider_mappings WHERE provider = "%s" AND media_type = %d)' % (provider,MediaType.Radio) sql_query += ' ORDER BY %s' % orderby - if limit: - sql_query += ' LIMIT %d OFFSET %d' %(limit, offset) async with self._db.execute(sql_query) as cursor: db_rows = await cursor.fetchall() for db_row in db_rows: @@ -162,24 +159,21 @@ class Database(): radio.metadata = await self.__get_metadata(radio.item_id, MediaType.Radio) radio.provider_ids = await self.__get_prov_ids(radio.item_id, MediaType.Radio) radio.in_library = await self.__get_library_providers(radio.item_id, MediaType.Radio) - items.append(radio) - return items + yield radio async def playlist(self, playlist_id:int) -> Playlist: ''' get playlist record by id ''' playlist_id = try_parse_int(playlist_id) - playlists = await self.playlists(' WHERE playlist_id = %s' % playlist_id) - if not playlists: - return None - return playlists[0] + async for item in self.library_playlists(' WHERE playlist_id = %s' % playlist_id): + return item + return None async def radio(self, radio_id:int) -> Playlist: ''' get radio record by id ''' radio_id = try_parse_int(radio_id) - radios = await self.radios(' WHERE radio_id = %s' % radio_id) - if not radios: - return None - return radios[0] + async for item in self.library_radios(' WHERE radio_id = %s' % radio_id): + return item + return None async def add_playlist(self, playlist:Playlist): ''' add a new playlist record into table''' @@ -189,12 +183,12 @@ class Database(): if result: playlist_id = result[0] # update existing - sql_query = 'UPDATE playlists SET is_editable=? WHERE playlist_id=?;' - await self._db.execute(sql_query, (playlist.is_editable, playlist_id)) + sql_query = 'UPDATE playlists SET is_editable=?, checksum=? WHERE playlist_id=?;' + await self._db.execute(sql_query, (playlist.is_editable, playlist.checksum, playlist_id)) else: # insert playlist - sql_query = 'INSERT OR REPLACE INTO playlists (name, owner, is_editable) VALUES(?,?,?);' - await self._db.execute(sql_query, (playlist.name, playlist.owner, playlist.is_editable)) + sql_query = 'INSERT OR REPLACE INTO playlists (name, owner, is_editable, checksum) VALUES(?,?,?,?);' + await self._db.execute(sql_query, (playlist.name, playlist.owner, playlist.is_editable, playlist.checksum)) # get id from newly created item (the safe way) async with self._db.execute('SELECT (playlist_id) FROM playlists WHERE name=? AND owner=?;', (playlist.name,playlist.owner)) as cursor: playlist_id = await cursor.fetchone() @@ -243,23 +237,18 @@ class Database(): sql_query = 'DELETE FROM library_items WHERE item_id=? AND provider=? AND media_type=?;' await self._db.execute(sql_query, (item_id, provider, media_type)) if media_type == MediaType.Playlist: - sql_query = 'DELETE FROM playlist_tracks WHERE playlist_id=?;' - await self._db.execute(sql_query, (item_id,)) sql_query = 'DELETE FROM playlists WHERE playlist_id=?;' await self._db.execute(sql_query, (item_id,)) sql_query = 'DELETE FROM provider_mappings WHERE item_id=? AND media_type=? AND provider=?;' await self._db.execute(sql_query, (item_id,media_type, provider)) await self._db.commit() - async def artists(self, filter_query=None, limit=100000, offset=0, orderby='name', fulldata=True) -> List[Artist]: + async def artists(self, filter_query=None, orderby='name', fulldata=False) -> List[Artist]: ''' fetch artist records from table''' - artists = [] sql_query = 'SELECT * FROM artists' if filter_query: sql_query += ' ' + filter_query sql_query += ' ORDER BY %s' % orderby - if limit: - sql_query += ' LIMIT %d OFFSET %d' %(limit, offset) async with self._db.execute(sql_query) as cursor: db_rows = await cursor.fetchall() for db_row in db_rows: @@ -274,16 +263,14 @@ class Database(): artist.metadata = await self.__get_metadata(artist.item_id, MediaType.Artist) artist.tags = await self.__get_tags(artist.item_id, MediaType.Artist) artist.metadata = await self.__get_metadata(artist.item_id, MediaType.Artist) - artists.append(artist) - return artists + yield artist async def artist(self, artist_id:int, fulldata=True) -> Artist: ''' get artist record by id ''' artist_id = try_parse_int(artist_id) - artists = await self.artists('WHERE artist_id = %s' % artist_id, fulldata=fulldata) - if not artists: - return None - return artists[0] + async for item in self.artists('WHERE artist_id = %s' % artist_id, fulldata=fulldata): + return item + return None async def add_artist(self, artist:Artist): ''' add a new artist record into table''' @@ -319,15 +306,12 @@ class Database(): LOGGER.debug('added artist %s (%s) to database: %s' %(artist.name, artist.provider_ids, artist_id)) return artist_id - async def albums(self, filter_query=None, limit=100000, offset=0, orderby='name', fulldata=True) -> List[Album]: + async def albums(self, filter_query=None, orderby='name', fulldata=False) -> List[Album]: ''' fetch all album records from table''' - albums = [] sql_query = 'SELECT * FROM albums' if filter_query: sql_query += ' ' + filter_query sql_query += ' ORDER BY %s' % orderby - if limit: - sql_query += ' LIMIT %d OFFSET %d' %(limit, offset) async with self._db.execute(sql_query) as cursor: db_rows = await cursor.fetchall() for db_row in db_rows: @@ -345,16 +329,14 @@ class Database(): album.metadata = await self.__get_metadata(album.item_id, MediaType.Album) album.tags = await self.__get_tags(album.item_id, MediaType.Album) album.labels = await self.__get_album_labels(album.item_id) - albums.append(album) - return albums + yield album async def album(self, album_id:int, fulldata=True) -> Album: ''' get album record by id ''' album_id = try_parse_int(album_id) - albums = await self.albums('WHERE album_id = %s' % album_id, fulldata=fulldata) - if not albums: - return None - return albums[0] + async for item in self.albums('WHERE album_id = %s' % album_id, fulldata=fulldata): + return item + return None async def add_album(self, album:Album): ''' add a new album record into table''' @@ -393,15 +375,13 @@ class Database(): LOGGER.debug('added album %s (%s) to database: %s' %(album.name, album.provider_ids, album_id)) return album_id - async def tracks(self, custom_query=None, limit=100000, offset=0, orderby='name', fulldata=True) -> List[Track]: + async def tracks(self, custom_query=None, orderby='name', fulldata=False) -> List[Track]: ''' fetch all track records from table''' tracks = [] sql_query = 'SELECT * FROM tracks' if custom_query: sql_query = custom_query sql_query += ' ORDER BY %s' % orderby - if limit: - sql_query += ' LIMIT %d OFFSET %d' %(limit, offset) async with self._db.execute(sql_query) as cursor: for db_row in await cursor.fetchall(): track = Track() @@ -426,17 +406,15 @@ class Database(): if fulldata: track.metadata = await self.__get_metadata(track.item_id, MediaType.Track) track.tags = await self.__get_tags(track.item_id, MediaType.Track) - tracks.append(track) - return tracks + yield track async def track(self, track_id:int, fulldata=True) -> Track: ''' get track record by id ''' track_id = try_parse_int(track_id) sql_query = "SELECT * FROM tracks WHERE track_id = %s" % track_id - tracks = await self.tracks(sql_query, fulldata=fulldata) - if not tracks: - return None - return tracks[0] + async for item in self.tracks(sql_query, fulldata=fulldata): + return item + return None async def add_track(self, track:Track): ''' add a new track record into table''' @@ -488,19 +466,27 @@ class Database(): async def update_track(self, track_id, column_key, column_value): ''' update column of existing track ''' sql_query = 'UPDATE tracks SET %s=? WHERE track_id=?;' % column_key - await self._db.execute(sql_query, column_value, track_id) + await self._db.execute(sql_query, (column_value, track_id)) + await self._db.commit() + + async def update_playlist(self, playlist_id, column_key, column_value): + ''' update column of existing playlist ''' + sql_query = 'UPDATE playlists SET %s=? WHERE playlist_id=?;' % column_key + await self._db.execute(sql_query, (column_value, playlist_id)) await self._db.commit() - async def artist_tracks(self, artist_id, limit=1000000, offset=0, orderby='name') -> List[Track]: + async def artist_tracks(self, artist_id, orderby='name') -> List[Track]: ''' get all library tracks for the given artist ''' artist_id = try_parse_int(artist_id) sql_query = 'SELECT * FROM tracks WHERE track_id in (SELECT track_id FROM track_artists WHERE artist_id = %d)' % artist_id - return await self.tracks(sql_query, limit=limit, offset=offset, orderby=orderby, fulldata=False) + async for item in self.tracks(sql_query, orderby=orderby, fulldata=False): + yield item - async def artist_albums(self, artist_id, limit=1000000, offset=0, orderby='name') -> List[Album]: + async def artist_albums(self, artist_id, orderby='name') -> List[Album]: ''' get all library albums for the given artist ''' sql_query = ' WHERE artist_id = %d' % artist_id - return await self.albums(sql_query, limit=limit, offset=offset, orderby=orderby, fulldata=False) + async for item in self.albums(sql_query, orderby=orderby, fulldata=False): + yield item async def set_track_loudness(self, provider_track_id, provider, loudness): ''' set integrated loudness for a track in db ''' @@ -580,7 +566,7 @@ class Database(): async def __get_track_artists(self, track_id, fulldata=False) -> List[Artist]: ''' get artists for track ''' sql_query = 'WHERE artist_id in (SELECT artist_id FROM track_artists WHERE track_id = %s)' % track_id - return await self.artists(sql_query, fulldata=fulldata) + return [item async for item in self.artists(sql_query, fulldata=fulldata)] async def __add_external_ids(self, item_id, media_type, external_ids): ''' add or update external_ids''' diff --git a/music_assistant/http_streamer.py b/music_assistant/http_streamer.py index 22842ac7..8d66b6b2 100755 --- a/music_assistant/http_streamer.py +++ b/music_assistant/http_streamer.py @@ -21,9 +21,9 @@ from .utils import LOGGER, try_parse_int, get_ip, run_async_background_task, run from .models.media_types import TrackQuality, MediaType from .models.playerstate import PlayerState + class HTTPStreamer(): ''' Built-in streamer using sox and webserver ''' - def __init__(self, mass): self.mass = mass self.local_ip = get_ip() @@ -32,14 +32,14 @@ class HTTPStreamer(): async def setup(self): ''' async initialize of module ''' - pass # we have nothing to initialize - + pass # we have nothing to initialize + async def stream(self, http_request): ''' start stream for a player ''' # make sure we have valid params - player_id = http_request.match_info.get('player_id','') + player_id = http_request.match_info.get('player_id', '') player = await self.mass.players.get_player(player_id) if not player: return web.Response(status=404, reason="Player not found") @@ -49,17 +49,19 @@ class HTTPStreamer(): if not queue_item: return web.Response(status=404, reason="Invalid Queue item Id") # prepare headers as audio/flac content - resp = web.StreamResponse(status=200, reason='OK', - headers={'Content-Type': 'audio/flac'}) + resp = web.StreamResponse(status=200, + reason='OK', + headers={'Content-Type': 'audio/flac'}) await resp.prepare(http_request) # run the streamer in executor to prevent the subprocess locking up our eventloop cancelled = threading.Event() if player.queue.use_queue_stream: - bg_task = self.mass.event_loop.run_in_executor(None, - self.__get_queue_stream, player, resp, cancelled) + bg_task = self.mass.event_loop.run_in_executor( + None, self.__get_queue_stream, player, resp, cancelled) else: - bg_task = self.mass.event_loop.run_in_executor(None, - self.__get_queue_item_stream, player, queue_item, resp, cancelled) + bg_task = self.mass.event_loop.run_in_executor( + None, self.__get_queue_item_stream, player, queue_item, resp, + cancelled) # let the streaming begin! try: await asyncio.gather(bg_task) @@ -67,28 +69,37 @@ class HTTPStreamer(): cancelled.set() raise asyncio.CancelledError() return resp - + def __get_queue_item_stream(self, player, queue_item, buffer, cancelled): ''' start streaming single queue track ''' - LOGGER.debug("stream single queue track started for track %s on player %s" % (queue_item.name, player.name)) - for is_last_chunk, audio_chunk in self.__get_audio_stream(player, queue_item, cancelled): + LOGGER.debug( + "stream single queue track started for track %s on player %s" % + (queue_item.name, player.name)) + for is_last_chunk, audio_chunk in self.__get_audio_stream( + player, queue_item, cancelled): if cancelled.is_set(): # http session ended # we must consume the data to prevent hanging subprocess instances continue # put chunk in buffer - self.mass.run_task( - buffer.write(audio_chunk), wait_for_result=True, - ignore_exception=(BrokenPipeError,ConnectionResetError)) + self.mass.run_task(buffer.write(audio_chunk), + wait_for_result=True, + ignore_exception=(BrokenPipeError, + ConnectionResetError)) # all chunks received: streaming finished if cancelled.is_set(): - LOGGER.debug("stream single track interrupted for track %s on player %s" % (queue_item.name, player.name)) + LOGGER.debug( + "stream single track interrupted for track %s on player %s" % + (queue_item.name, player.name)) else: # indicate EOF if no more data - self.mass.run_task( - buffer.write_eof(), wait_for_result=True, - ignore_exception=(BrokenPipeError,ConnectionResetError)) - LOGGER.debug("stream single track finished for track %s on player %s" % (queue_item.name, player.name)) + self.mass.run_task(buffer.write_eof(), + wait_for_result=True, + ignore_exception=(BrokenPipeError, + ConnectionResetError)) + LOGGER.debug( + "stream single track finished for track %s on player %s" % + (queue_item.name, player.name)) def __get_queue_stream(self, player, buffer, cancelled): ''' start streaming all queue tracks ''' @@ -104,8 +115,10 @@ class HTTPStreamer(): args = 'sox -t %s - -t flac -C 0 -' % pcm_args # start sox process args = shlex.split(args) - sox_proc = subprocess.Popen(args, shell=False, - stdout=subprocess.PIPE, stdin=subprocess.PIPE) + sox_proc = subprocess.Popen(args, + shell=False, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE) def fill_buffer(): while True: @@ -113,18 +126,23 @@ class HTTPStreamer(): if not chunk: break if chunk and not cancelled.is_set(): - self.mass.run_task(buffer.write(chunk), - wait_for_result=True, ignore_exception=(BrokenPipeError,ConnectionResetError)) + self.mass.run_task(buffer.write(chunk), + wait_for_result=True, + ignore_exception=(BrokenPipeError, + ConnectionResetError)) del chunk # indicate EOF if no more data if not cancelled.is_set(): - self.mass.run_task(buffer.write_eof(), - wait_for_result=True, ignore_exception=(BrokenPipeError,ConnectionResetError)) + self.mass.run_task(buffer.write_eof(), + wait_for_result=True, + ignore_exception=(BrokenPipeError, + ConnectionResetError)) + # start fill buffer task in background fill_buffer_thread = threading.Thread(target=fill_buffer) fill_buffer_thread.start() - - LOGGER.info("Start Queue Stream for player %s " %(player.name)) + + LOGGER.info("Start Queue Stream for player %s " % (player.name)) is_start = True last_fadeout_data = b'' while True: @@ -134,7 +152,7 @@ class HTTPStreamer(): if is_start: # report start of queue playback so we can calculate current track/duration etc. queue_track = asyncio.run_coroutine_threadsafe( - player.queue.start_queue_stream(), + player.queue.start_queue_stream(), self.mass.event_loop).result() is_start = False else: @@ -142,14 +160,18 @@ class HTTPStreamer(): if not queue_track: LOGGER.debug("no (more) tracks left in queue") break - LOGGER.debug("Start Streaming queue track: %s (%s) on player %s" % (queue_track.item_id, queue_track.name, player.name)) + LOGGER.debug("Start Streaming queue track: %s (%s) on player %s" % + (queue_track.item_id, queue_track.name, player.name)) fade_in_part = b'' cur_chunk = 0 prev_chunk = None bytes_written = 0 # handle incoming audio chunks for is_last_chunk, chunk in self.__get_audio_stream( - player, queue_track, cancelled, chunksize=fade_bytes, + player, + queue_track, + cancelled, + chunksize=fade_bytes, resample=sample_rate): cur_chunk += 1 @@ -165,22 +187,25 @@ class HTTPStreamer(): ### HANDLE CROSSFADE OF PREVIOUS TRACK FADE_OUT AND THIS TRACK FADE_IN elif cur_chunk == 2 and last_fadeout_data: # combine the first 2 chunks and strip off silence - args = 'sox --ignore-length -t %s - -t %s - silence 1 0.1 1%%' % (pcm_args, pcm_args) - first_part, std_err = subprocess.Popen(args, shell=True, - stdout=subprocess.PIPE, - stdin=subprocess.PIPE).communicate(prev_chunk + chunk) + args = 'sox --ignore-length -t %s - -t %s - silence 1 0.1 1%%' % ( + pcm_args, pcm_args) + first_part, std_err = subprocess.Popen( + args, + shell=True, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE).communicate(prev_chunk + chunk) if len(first_part) < fade_bytes: # part is too short after the strip action?! # so we just cut off at the fade position - first_part = prev_chunk+chunk + first_part = prev_chunk + chunk if len(first_part) >= fade_bytes: first_part = first_part[fade_bytes:] fade_in_part = first_part[:fade_bytes] remaining_bytes = first_part[fade_bytes:] del first_part # do crossfade - crossfade_part = self.__crossfade_pcm_parts(fade_in_part, - last_fadeout_data, pcm_args, fade_length) + crossfade_part = self.__crossfade_pcm_parts( + fade_in_part, last_fadeout_data, pcm_args, fade_length) sox_proc.stdin.write(crossfade_part) bytes_written += len(crossfade_part) del crossfade_part @@ -191,19 +216,22 @@ class HTTPStreamer(): bytes_written += len(remaining_bytes) del remaining_bytes del chunk - prev_chunk = None # needed to prevent this chunk being sent again + prev_chunk = None # needed to prevent this chunk being sent again ### HANDLE LAST PART OF TRACK elif prev_chunk and is_last_chunk: # last chunk received so create the last_part with the previous chunk and this chunk # and strip off silence - args = 'sox --ignore-length -t %s - -t %s - reverse silence 1 0.1 1%% reverse' % (pcm_args, pcm_args) - last_part, stderr = subprocess.Popen(args, shell=True, - stdout=subprocess.PIPE, - stdin=subprocess.PIPE).communicate(prev_chunk + chunk) + args = 'sox --ignore-length -t %s - -t %s - reverse silence 1 0.1 1%% reverse' % ( + pcm_args, pcm_args) + last_part, stderr = subprocess.Popen( + args, + shell=True, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE).communicate(prev_chunk + chunk) if len(last_part) < fade_bytes: # part is too short after the strip action # so we just cut off at the fade position - last_part = prev_chunk+chunk + last_part = prev_chunk + chunk if len(last_part) >= fade_bytes: last_part = last_part[:fade_bytes] if not player.queue.crossfade_enabled: @@ -242,8 +270,10 @@ class HTTPStreamer(): # update actual duration to the queue for more accurate now playing info accurate_duration = bytes_written / int(sample_rate * 4 * 2) queue_track.duration = accurate_duration - LOGGER.debug("Finished Streaming queue track: %s (%s) on player %s" % (queue_track.item_id, queue_track.name, player.name)) - # run garbage collect manually to avoid too much memory fragmentation + LOGGER.debug( + "Finished Streaming queue track: %s (%s) on player %s" % + (queue_track.item_id, queue_track.name, player.name)) + # run garbage collect manually to avoid too much memory fragmentation gc.collect() # end of queue reached, pass last fadeout bits to final output if last_fadeout_data and not cancelled.is_set(): @@ -254,26 +284,33 @@ class HTTPStreamer(): sox_proc.terminate() fill_buffer_thread.join() del sox_proc - # run garbage collect manually to avoid too much memory fragmentation + # run garbage collect manually to avoid too much memory fragmentation gc.collect() if cancelled.is_set(): - LOGGER.info("streaming of queue for player %s interrupted" % player.name) + LOGGER.info("streaming of queue for player %s interrupted" % + player.name) else: - LOGGER.info("streaming of queue for player %s completed" % player.name) + LOGGER.info("streaming of queue for player %s completed" % + player.name) - def __get_audio_stream(self, player, queue_item, cancelled, - chunksize=128000, resample=None): + def __get_audio_stream(self, + player, + queue_item, + cancelled, + chunksize=128000, + resample=None): ''' get audio stream from provider and apply additional effects/processing where/if needed''' # get stream details from provider # sort by quality and check track availability streamdetails = None - for prov_media in sorted(queue_item.provider_ids, - key=operator.itemgetter('quality'), reverse=True): + for prov_media in sorted(queue_item.provider_ids, + key=operator.itemgetter('quality'), + reverse=True): if not prov_media['provider'] in self.mass.music.providers: continue - streamdetails = self.mass.run_task( - self.mass.music.providers[prov_media['provider']].get_stream_details(prov_media['item_id']), - wait_for_result=True) + streamdetails = self.mass.run_task(self.mass.music.providers[ + prov_media['provider']].get_stream_details( + prov_media['item_id']), wait_for_result=True) if streamdetails: streamdetails['player_id'] = player.player_id if not 'item_id' in streamdetails: @@ -298,24 +335,33 @@ class HTTPStreamer(): # determine how to proceed based on input file ype if streamdetails["content_type"] == 'aac': # support for AAC created with ffmpeg in between - args = 'ffmpeg -v quiet -i "%s" -f flac - | sox -t flac - -t %s - %s' % (streamdetails["path"], outputfmt, sox_options) - process = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE) + args = 'ffmpeg -v quiet -i "%s" -f flac - | sox -t flac - -t %s - %s' % ( + streamdetails["path"], outputfmt, sox_options) + process = subprocess.Popen(args, + shell=True, + stdout=subprocess.PIPE) elif streamdetails['type'] in ['url', 'file']: - args = 'sox -t %s "%s" -t %s - %s' % (streamdetails["content_type"], - streamdetails["path"], outputfmt, sox_options) + args = 'sox -t %s "%s" -t %s - %s' % ( + streamdetails["content_type"], streamdetails["path"], + outputfmt, sox_options) args = shlex.split(args) - process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE) + process = subprocess.Popen(args, + shell=False, + stdout=subprocess.PIPE) elif streamdetails['type'] == 'executable': - args = '%s | sox -t %s - -t %s - %s' % (streamdetails["path"], - streamdetails["content_type"], outputfmt, sox_options) - process = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE) + args = '%s | sox -t %s - -t %s - %s' % ( + streamdetails["path"], streamdetails["content_type"], + outputfmt, sox_options) + process = subprocess.Popen(args, + shell=True, + stdout=subprocess.PIPE) else: LOGGER.warning(f"no streaming options for {queue_item.name}") yield (True, b'') return # fire event that streaming has started for this track self.mass.run_task( - self.mass.signal_event(EVENT_STREAM_STARTED, streamdetails)) + self.mass.signal_event(EVENT_STREAM_STARTED, streamdetails)) # yield chunks from stdout # we keep 1 chunk behind to detect end of stream properly bytes_sent = 0 @@ -335,19 +381,21 @@ class HTTPStreamer(): bytes_sent += len(chunk) yield (False, chunk) # fire event that streaming has ended - self.mass.run_task(self.mass.signal_event(EVENT_STREAM_ENDED, streamdetails)) + self.mass.run_task( + self.mass.signal_event(EVENT_STREAM_ENDED, streamdetails)) # send task to background to analyse the audio if queue_item.media_type == MediaType.Track: - self.mass.event_loop.run_in_executor(None, self.__analyze_audio, streamdetails) + self.mass.event_loop.run_in_executor(None, self.__analyze_audio, + streamdetails) def __get_player_sox_options(self, player, streamdetails): ''' get player specific sox effect options ''' sox_options = [] # volume normalisation - gain_correct = self.mass.run_task( - self.mass.players.get_gain_correct( - player.player_id, streamdetails["item_id"], streamdetails["provider"]), - wait_for_result=True) + gain_correct = self.mass.run_task(self.mass.players.get_gain_correct( + player.player_id, streamdetails["item_id"], + streamdetails["provider"]), + wait_for_result=True) if gain_correct != 0: sox_options.append('vol %s dB ' % gain_correct) # downsample if needed @@ -364,56 +412,73 @@ class HTTPStreamer(): if player.settings.get('sox_options'): sox_options.append(player.settings['sox_options']) return " ".join(sox_options) - + def __analyze_audio(self, streamdetails): ''' analyze track audio, for now we only calculate EBU R128 loudness ''' - item_key = '%s%s' %(streamdetails["item_id"], streamdetails["provider"]) + item_key = '%s%s' % (streamdetails["item_id"], + streamdetails["provider"]) if item_key in self.analyze_jobs: - return # prevent multiple analyze jobs for same track + return # prevent multiple analyze jobs for same track self.analyze_jobs[item_key] = True track_loudness = self.mass.run_task(self.mass.db.get_track_loudness( - streamdetails["item_id"], streamdetails["provider"]), wait_for_result=True) + streamdetails["item_id"], streamdetails["provider"]), + wait_for_result=True) if track_loudness == None: # only when needed we do the analyze stuff LOGGER.debug('Start analyzing track %s' % item_key) if streamdetails['type'] == 'url': import urllib - audio_data = urllib.request.urlopen(streamdetails["path"]).read() + audio_data = urllib.request.urlopen( + streamdetails["path"]).read() elif streamdetails['type'] == 'executable': - audio_data = subprocess.check_output(streamdetails["path"], shell=True) + audio_data = subprocess.check_output(streamdetails["path"], + shell=True) # calculate BS.1770 R128 integrated loudness with io.BytesIO(audio_data) as tmpfile: data, rate = soundfile.read(tmpfile) - meter = pyloudnorm.Meter(rate) # create BS.1770 meter - loudness = meter.integrated_loudness(data) # measure loudness + meter = pyloudnorm.Meter(rate) # create BS.1770 meter + loudness = meter.integrated_loudness(data) # measure loudness del data self.mass.run_task( - self.mass.db.set_track_loudness(streamdetails["item_id"], streamdetails["provider"], loudness)) + self.mass.db.set_track_loudness(streamdetails["item_id"], + streamdetails["provider"], + loudness)) del audio_data - LOGGER.debug("Integrated loudness of track %s is: %s" %(item_key, loudness)) + LOGGER.debug("Integrated loudness of track %s is: %s" % + (item_key, loudness)) self.analyze_jobs.pop(item_key, None) - - def __crossfade_pcm_parts(self, fade_in_part, fade_out_part, pcm_args, fade_length): + + def __crossfade_pcm_parts(self, fade_in_part, fade_out_part, pcm_args, + fade_length): ''' crossfade two chunks of audio using sox ''' # create fade-in part - fadeinfile = MemoryTempfile(fallback=True).NamedTemporaryFile(buffering=0) - args = 'sox --ignore-length -t %s - -t %s %s fade t %s' % (pcm_args, pcm_args, fadeinfile.name, fade_length) + fadeinfile = MemoryTempfile(fallback=True).NamedTemporaryFile( + buffering=0) + args = 'sox --ignore-length -t %s - -t %s %s fade t %s' % ( + pcm_args, pcm_args, fadeinfile.name, fade_length) args = shlex.split(args) process = subprocess.Popen(args, shell=False, stdin=subprocess.PIPE) process.communicate(fade_in_part) # create fade-out part - fadeoutfile = MemoryTempfile(fallback=True).NamedTemporaryFile(buffering=0) - args = 'sox --ignore-length -t %s - -t %s %s reverse fade t %s reverse' % (pcm_args, pcm_args, fadeoutfile.name, fade_length) + fadeoutfile = MemoryTempfile(fallback=True).NamedTemporaryFile( + buffering=0) + args = 'sox --ignore-length -t %s - -t %s %s reverse fade t %s reverse' % ( + pcm_args, pcm_args, fadeoutfile.name, fade_length) args = shlex.split(args) - process = subprocess.Popen(args, shell=False, - stdout=subprocess.PIPE, stdin=subprocess.PIPE) + process = subprocess.Popen(args, + shell=False, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE) process.communicate(fade_out_part) # create crossfade using sox and some temp files # TODO: figure out how to make this less complex and without the tempfiles - args = 'sox -m -v 1.0 -t %s %s -v 1.0 -t %s %s -t %s -' % (pcm_args, fadeoutfile.name, pcm_args, fadeinfile.name, pcm_args) + args = 'sox -m -v 1.0 -t %s %s -v 1.0 -t %s %s -t %s -' % ( + pcm_args, fadeoutfile.name, pcm_args, fadeinfile.name, pcm_args) args = shlex.split(args) - process = subprocess.Popen(args, shell=False, - stdout=subprocess.PIPE, stdin=subprocess.PIPE) + process = subprocess.Popen(args, + shell=False, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE) crossfade_part, stderr = process.communicate() fadeinfile.close() fadeoutfile.close() diff --git a/music_assistant/models/media_types.py b/music_assistant/models/media_types.py index ee57f9c2..41d41767 100755 --- a/music_assistant/models/media_types.py +++ b/music_assistant/models/media_types.py @@ -57,6 +57,7 @@ class MediaItem(object): self.provider_ids = [] self.in_library = [] self.is_lazy = False + self.available = True def __eq__(self, other): if not isinstance(other, self.__class__): return NotImplemented @@ -103,6 +104,7 @@ class Playlist(MediaItem): self.owner = '' self.media_type = MediaType.Playlist self.is_editable = False + self.checksum = '' # some value to detect playlist track changes class Radio(MediaItem): ''' representation of a radio station ''' diff --git a/music_assistant/models/musicprovider.py b/music_assistant/models/musicprovider.py index 066fa0eb..afc326bf 100755 --- a/music_assistant/models/musicprovider.py +++ b/music_assistant/models/musicprovider.py @@ -3,94 +3,116 @@ import asyncio from typing import List -from ..utils import run_periodic, LOGGER, compare_strings -from ..cache import use_cache +from ..utils import LOGGER, compare_strings +from ..cache import use_cache, cached_iterator from ..constants import CONF_ENABLED from .media_types import Album, Artist, Track, Playlist, MediaType, Radio class MusicProvider(): - ''' + """ Model for a Musicprovider Common methods usable for every provider Provider specific get methods shoud be overriden in the provider specific implementation Uses a form of lazy provisioning to local db as cache - ''' + """ name = 'My great Music provider' # display name prov_id = 'my_provider' # used as id icon = '' - def __init__(self, mass, conf): + def __init__(self, mass): self.mass = mass self.cache = mass.cache async def setup(self): - ''' async initialize of module ''' + """ async initialize of module """ pass ### Common methods and properties #### - async def artist(self, prov_item_id, lazy=True, ref_album=None, ref_track=None) -> Artist: - ''' return artist details for the given provider artist id ''' - item_id = await self.mass.db.get_database_id(self.prov_id, prov_item_id, MediaType.Artist) + async def artist(self, + prov_item_id, + lazy=True, + ref_album=None, + ref_track=None) -> Artist: + """ return artist details for the given provider artist id """ + item_id = await self.mass.db.get_database_id(self.prov_id, + prov_item_id, + MediaType.Artist) if not item_id: # artist not yet in local database so fetch details artist_details = await self.get_artist(prov_item_id) if not artist_details: raise Exception('artist not found: %s' % prov_item_id) if lazy: - asyncio.create_task(self.add_artist( - artist_details)) + asyncio.create_task(self.add_artist(artist_details)) artist_details.is_lazy = True return artist_details - item_id = await self.add_artist(artist_details, ref_album=ref_album, ref_track=ref_track) + item_id = await self.add_artist(artist_details, + ref_album=ref_album, + ref_track=ref_track) return await self.mass.db.artist(item_id) - async def add_artist(self, artist_details, ref_album=None, ref_track=None) -> int: - ''' add artist to local db and return the new database id''' + async def add_artist(self, artist_details, ref_album=None, + ref_track=None) -> int: + """ add artist to local db and return the new database id""" musicbrainz_id = None for item in artist_details.external_ids: if item.get("musicbrainz"): musicbrainz_id = item["musicbrainz"] if not musicbrainz_id: musicbrainz_id = await self.get_artist_musicbrainz_id( - artist_details, ref_album=ref_album, ref_track=ref_track) + artist_details, ref_album=ref_album, ref_track=ref_track) if not musicbrainz_id: return # grab additional metadata if musicbrainz_id: artist_details.external_ids.append({"musicbrainz": musicbrainz_id}) artist_details.metadata = await self.mass.metadata.get_artist_metadata( - musicbrainz_id, artist_details.metadata) + musicbrainz_id, artist_details.metadata) item_id = await self.mass.db.add_artist(artist_details) # also fetch same artist on all providers new_artist = await self.mass.db.artist(item_id) if ref_track: new_artist_toptracks = [ref_track] else: - new_artist_toptracks = [item async for item in self.get_artist_toptracks(artist_details.item_id)] + new_artist_toptracks = [ + item async for item in self.get_artist_toptracks( + artist_details.item_id) + ] if ref_album: new_artist_albums = [ref_album] else: - new_artist_albums = [item async for item in self.get_artist_albums(artist_details.item_id)] + new_artist_albums = [ + item async for item in self.get_artist_albums( + artist_details.item_id) + ] if new_artist_toptracks or new_artist_albums: - item_provider_keys = [item['provider'] - for item in new_artist.provider_ids] + item_provider_keys = [ + item['provider'] for item in new_artist.provider_ids + ] for prov_id, provider in self.mass.music.providers.items(): if not prov_id in item_provider_keys: self.mass.event_loop.create_task( - provider.match_artist(new_artist, new_artist_albums, new_artist_toptracks)) + provider.match_artist(new_artist, new_artist_albums, + new_artist_toptracks)) return item_id - async def get_artist_musicbrainz_id(self, artist_details: Artist, ref_album=None, ref_track=None): - ''' fetch musicbrainz id by performing search with both the artist and one of it's albums or tracks ''' + async def get_artist_musicbrainz_id(self, + artist_details: Artist, + ref_album=None, + ref_track=None): + """ fetch musicbrainz id by performing search with both the artist and one of it's albums or tracks """ musicbrainz_id = "" # try with album first if ref_album: lookup_albums = [ref_album] else: - lookup_albums = [item async for item in self.get_artist_albums(artist_details.item_id)] + lookup_albums = [ + item async for item in self.get_artist_albums( + artist_details.item_id) + ] for lookup_album in lookup_albums[:10]: lookup_album_upc = None if not lookup_album: @@ -99,8 +121,10 @@ class MusicProvider(): if item.get("upc"): lookup_album_upc = item["upc"] break - musicbrainz_id = await self.mass.metadata.get_mb_artist_id(artist_details.name, - albumname=lookup_album.name, album_upc=lookup_album_upc) + musicbrainz_id = await self.mass.metadata.get_mb_artist_id( + artist_details.name, + albumname=lookup_album.name, + album_upc=lookup_album_upc) if musicbrainz_id: break # fallback to track @@ -108,7 +132,10 @@ class MusicProvider(): if ref_track: lookup_tracks = [ref_track] else: - lookup_tracks = [item async for item in self.get_artist_toptracks(artist_details.item_id)] + lookup_tracks = [ + item async for item in self.get_artist_toptracks( + artist_details.item_id) + ] for lookup_track in lookup_tracks[:25]: if not lookup_track: continue @@ -117,19 +144,24 @@ class MusicProvider(): if item.get("isrc"): lookup_track_isrc = item["isrc"] break - musicbrainz_id = await self.mass.metadata.get_mb_artist_id(artist_details.name, - trackname=lookup_track.name, track_isrc=lookup_track_isrc) + musicbrainz_id = await self.mass.metadata.get_mb_artist_id( + artist_details.name, + trackname=lookup_track.name, + track_isrc=lookup_track_isrc) if musicbrainz_id: break if not musicbrainz_id: - LOGGER.warning( - "Unable to get musicbrainz ID for artist %s !" % artist_details.name) + LOGGER.warning("Unable to get musicbrainz ID for artist %s !" % + artist_details.name) musicbrainz_id = artist_details.name return musicbrainz_id - async def album(self, prov_item_id, lazy=True, album_details=None) -> Album: - ''' return album details for the given provider album id''' - item_id = await self.mass.db.get_database_id(self.prov_id, prov_item_id, MediaType.Album) + async def album(self, prov_item_id, lazy=True, + album_details=None) -> Album: + """ return album details for the given provider album id""" + item_id = await self.mass.db.get_database_id(self.prov_id, + prov_item_id, + MediaType.Album) if not item_id: # album not yet in local database so fetch details if not album_details: @@ -137,32 +169,37 @@ class MusicProvider(): if not album_details: raise Exception('album not found: %s' % prov_item_id) if lazy: - asyncio.create_task(self.add_album( - album_details)) + asyncio.create_task(self.add_album(album_details)) album_details.is_lazy = True return album_details item_id = await self.add_album(album_details) return await self.mass.db.album(item_id) async def add_album(self, album_details) -> int: - ''' add album to local db and return the new database id''' + """ add album to local db and return the new database id""" # we need to fetch album artist too - db_album_artist = await self.artist(album_details.artist.item_id, lazy=False, ref_album=album_details) + db_album_artist = await self.artist(album_details.artist.item_id, + lazy=False, + ref_album=album_details) album_details.artist = db_album_artist item_id = await self.mass.db.add_album(album_details) # also fetch same album on all providers new_album = await self.mass.db.album(item_id) - item_provider_keys = [item['provider'] - for item in new_album.provider_ids] + item_provider_keys = [ + item['provider'] for item in new_album.provider_ids + ] for prov_id, provider in self.mass.music.providers.items(): if not prov_id in item_provider_keys: self.mass.event_loop.create_task( - provider.match_album(new_album)) + provider.match_album(new_album)) return item_id - async def track(self, prov_item_id, lazy=True, track_details=None) -> Track: - ''' return track details for the given provider track id ''' - item_id = await self.mass.db.get_database_id(self.prov_id, prov_item_id, MediaType.Track) + async def track(self, prov_item_id, lazy=True, + track_details=None) -> Track: + """ return track details for the given provider track id """ + item_id = await self.mass.db.get_database_id(self.prov_id, + prov_item_id, + MediaType.Track) if not item_id: # track not yet in local database so fetch details if not track_details: @@ -170,19 +207,20 @@ class MusicProvider(): if not track_details: raise Exception('track not found: %s' % prov_item_id) if lazy: - asyncio.create_task(self.add_track( - track_details)) + asyncio.create_task(self.add_track(track_details)) track_details.is_lazy = True return track_details item_id = await self.add_track(track_details) return await self.mass.db.track(item_id) async def add_track(self, track_details, prov_album_id=None) -> int: - ''' add track to local db and return the new database id''' + """ add track to local db and return the new database id""" track_artists = [] # we need to fetch track artists too for track_artist in track_details.artists: - db_track_artist = await self.artist(track_artist.item_id, lazy=False, ref_track=track_details) + db_track_artist = await self.artist(track_artist.item_id, + lazy=False, + ref_track=track_details) if db_track_artist: track_artists.append(db_track_artist) track_details.artists = track_artists @@ -192,17 +230,20 @@ class MusicProvider(): item_id = await self.mass.db.add_track(track_details) # also fetch same track on all providers (will also get other quality versions) new_track = await self.mass.db.track(item_id) - item_provider_keys = [item['provider'] - for item in new_track.provider_ids] + item_provider_keys = [ + item['provider'] for item in new_track.provider_ids + ] for prov_id, provider in self.mass.music.providers.items(): if not prov_id in item_provider_keys: self.mass.event_loop.create_task( - provider.match_track(new_track)) + provider.match_track(new_track)) return item_id async def playlist(self, prov_playlist_id) -> Playlist: - ''' return playlist details for the given provider playlist id ''' - db_id = await self.mass.db.get_database_id(self.prov_id, prov_playlist_id, MediaType.Playlist) + """ return playlist details for the given provider playlist id """ + db_id = await self.mass.db.get_database_id(self.prov_id, + prov_playlist_id, + MediaType.Playlist) if db_id: # synced playlist, return database details return await self.mass.db.playlist(db_id) @@ -210,8 +251,9 @@ class MusicProvider(): return await self.get_playlist(prov_playlist_id) async def radio(self, prov_radio_id) -> Radio: - ''' return radio details for the given provider playlist id ''' - db_id = await self.mass.db.get_database_id(self.prov_id, prov_radio_id, MediaType.Radio) + """ return radio details for the given provider playlist id """ + db_id = await self.mass.db.get_database_id(self.prov_id, prov_radio_id, + MediaType.Radio) if db_id: # synced radio, return database details return await self.mass.db.radio(db_id) @@ -219,91 +261,128 @@ class MusicProvider(): return await self.get_radio(prov_radio_id) async def album_tracks(self, prov_album_id) -> List[Track]: - ''' return album tracks for the given provider album id''' - album = await self.get_album(prov_album_id) - async for prov_track in self.get_album_tracks(prov_album_id): - if prov_track: - # lazy load to database - if not prov_track.album: - prov_track.album = album - db_track = await self.track(prov_track.item_id, lazy=True, track_details=prov_track) - db_track.disc_number = prov_track.disc_number - db_track.track_number = prov_track.track_number - yield db_track - - async def playlist_tracks(self, prov_playlist_id, limit=100, offset=0) -> List[Track]: - ''' return playlist tracks for the given provider playlist id''' - pos = offset - async for prov_track in self.get_playlist_tracks(prov_playlist_id, limit=limit, offset=offset): - db_id = await self.mass.db.get_database_id(prov_track.provider, prov_track.item_id, MediaType.Track) + """ return album tracks for the given provider album id""" + cache_key = f'{self.prov_id}.album_tracks.{prov_album_id}' + async for item in cached_iterator( + self.cache, self.get_album_tracks(prov_album_id), cache_key): + if not item: + continue + db_id = await self.mass.db.get_database_id(item.provider, + item.item_id, + MediaType.Track) if db_id: # return database track instead if we have a match - prov_track = await self.mass.db.track(db_id) - prov_track.position = pos + db_item = await self.mass.db.track(db_id, fulldata=False) + db_item.disc_number = item.disc_number + db_item.track_number = item.track_number + yield db_item + else: + yield item + + async def playlist_tracks(self, prov_playlist_id) -> List[Track]: + """ return playlist tracks for the given provider playlist id""" + playlist = await self.playlist(prov_playlist_id) + cache_checksum = playlist.checksum + cache_key = f'{self.prov_id}.playlist_tracks.{prov_playlist_id}' + pos = 0 + async for item in cached_iterator( + self.cache, + self.get_playlist_tracks(prov_playlist_id), + cache_key, checksum=cache_checksum): + if not item: + continue + db_id = await self.mass.db.get_database_id(item.provider, + item.item_id, + MediaType.Track) + if db_id: + # return database track instead if we have a match + item = await self.mass.db.track(db_id, fulldata=False) + item.position = pos pos += 1 - yield prov_track - - async def artist_toptracks(self, prov_item_id) -> List[Track]: - ''' return top tracks for an artist ''' - async for prov_track in self.get_artist_toptracks(prov_item_id): - if prov_track: - db_id = await self.mass.db.get_database_id(self.prov_id, prov_track.item_id, MediaType.Track) + yield item + + async def artist_toptracks(self, prov_artist_id) -> List[Track]: + """ return top tracks for an artist """ + cache_key = f'{self.prov_id}.artist_toptracks.{prov_artist_id}' + async for item in cached_iterator( + self.cache, self.get_artist_toptracks(prov_artist_id), cache_key): + if item: + db_id = await self.mass.db.get_database_id( + self.prov_id, item.item_id, MediaType.Track) if db_id: # return database track instead if we have a match - yield self.mass.db.track(db_id) + yield await self.mass.db.track(db_id) else: - yield prov_track - - async def artist_albums(self, prov_item_id) -> List[Track]: - ''' return (all) albums for an artist ''' - async for prov_album in self.get_artist_albums(prov_item_id): - db_id = await self.mass.db.get_database_id(self.prov_id, prov_album.item_id, MediaType.Album) + yield item + + async def artist_albums(self, prov_artist_id) -> List[Track]: + """ return (all) albums for an artist """ + cache_key = f'{self.prov_id}.artist_albums.{prov_artist_id}' + async for item in cached_iterator( + self.cache, self.get_artist_albums(prov_artist_id), cache_key): + db_id = await self.mass.db.get_database_id(self.prov_id, + item.item_id, + MediaType.Album) if db_id: # return database album instead if we have a match yield await self.mass.db.album(db_id) else: - yield prov_album + yield item - async def match_artist(self, searchartist: Artist, searchalbums: List[Album], searchtracks: List[Track]): - ''' try to match artist in this provider by supplying db artist ''' + async def match_artist(self, searchartist: Artist, + searchalbums: List[Album], + searchtracks: List[Track]): + """ try to match artist in this provider by supplying db artist """ for searchalbum in searchalbums: searchstr = "%s - %s" % (searchartist.name, searchalbum.name) - search_results = await self.search(searchstr, [MediaType.Album], limit=5) + search_results = await self.search(searchstr, [MediaType.Album], + limit=5) for strictness in [True, False]: for item in search_results["albums"]: - if (item and compare_strings(item.name, searchalbum.name, strict=strictness)): + if (item and compare_strings( + item.name, searchalbum.name, strict=strictness)): # double safety check - artist must match exactly ! - if compare_strings(item.artist.name, searchartist.name, strict=strictness): + if compare_strings(item.artist.name, + searchartist.name, + strict=strictness): # just load this item in the database where it will be strictly matched - await self.artist(item.artist.item_id, lazy=strictness) + await self.artist(item.artist.item_id, + lazy=strictness) return for searchtrack in searchtracks: searchstr = "%s - %s" % (searchartist.name, searchtrack.name) - search_results = await self.search(searchstr, [MediaType.Track], limit=5) + search_results = await self.search(searchstr, [MediaType.Track], + limit=5) for strictness in [True, False]: for item in search_results["tracks"]: - if (item and compare_strings(item.name, searchtrack.name, strict=strictness)): + if (item and compare_strings( + item.name, searchtrack.name, strict=strictness)): # double safety check - artist must match exactly ! for artist in item.artists: - if compare_strings(artist.name, searchartist.name, strict=strictness): + if compare_strings(artist.name, + searchartist.name, + strict=strictness): # just load this item in the database where it will be strictly matched # we set skip matching to false to prevent endless recursive matching await self.artist(artist.item_id, lazy=False) return async def match_album(self, searchalbum: Album): - ''' try to match album in this provider by supplying db album ''' - searchstr = "%s - %s" % (searchalbum.artist.name, - searchalbum.name) + """ try to match album in this provider by supplying db album """ + searchstr = "%s - %s" % (searchalbum.artist.name, searchalbum.name) if searchalbum.version: searchstr += ' ' + searchalbum.version - search_results = await self.search(searchstr, [MediaType.Album], limit=5) + search_results = await self.search(searchstr, [MediaType.Album], + limit=5) for item in search_results["albums"]: - if (item and (item.name in searchalbum.name or searchalbum.name in item.name) and - compare_strings(item.artist.name, searchalbum.artist.name, strict=False)): + if (item and + (item.name in searchalbum.name + or searchalbum.name in item.name) and compare_strings( + item.artist.name, searchalbum.artist.name, strict=False)): # some providers mess up versions in the title, try to fix that situation - if (searchalbum.version and not item.version and - searchalbum.name in item.name and searchalbum.version in item.name): + if (searchalbum.version and not item.version + and searchalbum.name in item.name + and searchalbum.version in item.name): item.name = searchalbum.name item.version = searchalbum.version # just load this item in the database where it will be strictly matched @@ -311,131 +390,135 @@ class MusicProvider(): await self.album(item.item_id, lazy=False, album_details=item) async def match_track(self, searchtrack: Track): - ''' try to match track in this provider by supplying db track ''' + """ try to match track in this provider by supplying db track """ searchstr = "%s - %s" % (searchtrack.artists[0].name, searchtrack.name) if searchtrack.version: searchstr += ' ' + searchtrack.version searchartists = [item.name for item in searchtrack.artists] - search_results = await self.search(searchstr, [MediaType.Track], limit=5) + search_results = await self.search(searchstr, [MediaType.Track], + limit=5) for item in search_results["tracks"]: if not item or not item.album: continue - if ((item.name in searchtrack.name or searchtrack.name in item.name) and - item.album and item.album.name == searchtrack.album.name): + if ((item.name in searchtrack.name + or searchtrack.name in item.name) and item.album + and item.album.name == searchtrack.album.name): # some providers mess up versions in the title, try to fix that situation - if (searchtrack.version and not item.version and - searchtrack.name in item.name and searchtrack.version in item.name): + if (searchtrack.version and not item.version + and searchtrack.name in item.name + and searchtrack.version in item.name): item.name = searchtrack.name item.version = searchtrack.version # double safety check - artist must match exactly ! for artist in item.artists: for searchartist in searchartists: - if compare_strings(artist.name, searchartist, strict=False): + if compare_strings(artist.name, + searchartist, + strict=False): # just load this item in the database where it will be strictly matched - await self.track(item.item_id, lazy=False, track_details=item) + await self.track(item.item_id, + lazy=False, + track_details=item) break ### Provider specific implementation ##### + # pylint: disable=unused-argument async def search(self, searchstring, media_types=List[MediaType], limit=5): - ''' perform search on the provider ''' - return { - "artists": [], - "albums": [], - "tracks": [], - "playlists": [] - } + """ perform search on the provider """ + return {"artists": [], "albums": [], "tracks": [], "playlists": []} async def get_library_artists(self) -> List[Artist]: - ''' retrieve library artists from the provider ''' + """ retrieve library artists from the provider """ # iterator ! return yield async def get_library_albums(self) -> List[Album]: - ''' retrieve library albums from the provider ''' + """ retrieve library albums from the provider """ # iterator ! return yield async def get_library_tracks(self) -> List[Track]: - ''' retrieve library tracks from the provider ''' + """ retrieve library tracks from the provider """ # iterator ! return yield - async def get_playlists(self) -> List[Playlist]: - ''' retrieve library/subscribed playlists from the provider ''' + async def get_library_playlists(self) -> List[Playlist]: + """ retrieve library/subscribed playlists from the provider """ # iterator ! return yield async def get_radios(self) -> List[Radio]: - ''' retrieve library/subscribed radio stations from the provider ''' + """ retrieve library/subscribed radio stations from the provider """ # iterator ! return yield - async def get_artist(self, prov_item_id) -> Artist: - ''' get full artist details by id ''' + async def get_artist(self, prov_artist_id) -> Artist: + """ get full artist details by id """ raise NotImplementedError - async def get_artist_albums(self, prov_item_id) -> List[Album]: - ''' get a list of albums for the given artist ''' + async def get_artist_albums(self, prov_artist_id) -> List[Album]: + """ get a list of all albums for the given artist """ # iterator ! return yield - async def get_artist_toptracks(self, prov_item_id) -> List[Track]: - ''' get a list of most popular tracks for the given artist ''' + async def get_artist_toptracks(self, prov_artist_id) -> List[Track]: + """ get a list of most popular tracks for the given artist """ # iterator ! return yield - async def get_album(self, prov_item_id) -> Album: - ''' get full album details by id ''' + async def get_album(self, prov_album_id) -> Album: + """ get full album details by id """ raise NotImplementedError - async def get_track(self, prov_item_id) -> Track: - ''' get full track details by id ''' + async def get_track(self, prov_track_id) -> Track: + """ get full track details by id """ raise NotImplementedError - async def get_playlist(self, prov_item_id) -> Playlist: - ''' get full playlist details by id ''' + async def get_playlist(self, prov_playlist_id) -> Playlist: + """ get full playlist details by id """ raise NotImplementedError - async def get_radio(self, prov_item_id) -> Radio: - ''' get full radio details by id ''' + async def get_radio(self, prov_radio_id) -> Radio: + """ get full radio details by id """ raise NotImplementedError - async def get_album_tracks(self, prov_album_id, limit=100, offset=0) -> List[Track]: - ''' get album tracks for given album id ''' + # pylint: disable=unreachable + async def get_album_tracks(self, prov_album_id) -> List[Track]: + """ get album tracks for given album id """ # iterator ! return yield - async def get_playlist_tracks(self, prov_playlist_id, limit=100, offset=0) -> List[Track]: - ''' get playlist tracks for given playlist id ''' + async def get_playlist_tracks(self, prov_playlist_id) -> List[Track]: + """ get all playlist tracks for given playlist id """ # iterator ! return yield async def add_library(self, prov_item_id, media_type: MediaType): - ''' add item to library ''' + """ add item to library """ raise NotImplementedError async def remove_library(self, prov_item_id, media_type: MediaType): - ''' remove item from library ''' + """ remove item from library """ raise NotImplementedError async def add_playlist_tracks(self, prov_playlist_id, prov_track_ids): - ''' add track(s) to playlist ''' + """ add track(s) to playlist """ raise NotImplementedError async def remove_playlist_tracks(self, prov_playlist_id, prov_track_ids): - ''' remove track(s) from playlist ''' + """ remove track(s) from playlist """ raise NotImplementedError async def get_stream_details(self, track_id): - ''' get streamdetails for a track ''' + """ get streamdetails for a track """ raise NotImplementedError diff --git a/music_assistant/music_manager.py b/music_assistant/music_manager.py index b3b2118d..cfb0c8d9 100755 --- a/music_assistant/music_manager.py +++ b/music_assistant/music_manager.py @@ -5,6 +5,7 @@ import operator import os import base64 import functools +import time from typing import List import toolz from PIL import Image @@ -83,93 +84,40 @@ class MusicManager(): else: return None - async def library_artists(self, - limit=0, - offset=0, - orderby='name', - provider_filter=None) -> List[Artist]: + async def library_artists(self, orderby='name', provider_filter=None) -> List[Artist]: ''' return all library artists, optionally filtered by provider ''' - return await self.mass.db.library_artists(provider=provider_filter, - limit=limit, - offset=offset, - orderby=orderby) + async for item in self.mass.db.library_artists(provider=provider_filter, orderby=orderby): + yield item async def library_albums(self, - limit=0, - offset=0, orderby='name', provider_filter=None) -> List[Album]: ''' return all library albums, optionally filtered by provider ''' - return await self.mass.db.library_albums(provider=provider_filter, - limit=limit, - offset=offset, - orderby=orderby) + async for item in self.mass.db.library_albums(provider=provider_filter, orderby=orderby): + yield item async def library_tracks(self, - limit=0, - offset=0, orderby='name', provider_filter=None) -> List[Track]: ''' return all library tracks, optionally filtered by provider ''' - return await self.mass.db.library_tracks(provider=provider_filter, - limit=limit, - offset=offset, - orderby=orderby) - - async def playlists(self, - limit=0, - offset=0, + async for item in self.mass.db.library_tracks(provider=provider_filter, orderby=orderby): + yield item + + async def library_playlists(self, orderby='name', provider_filter=None) -> List[Playlist]: ''' return all library playlists, optionally filtered by provider ''' - return await self.mass.db.playlists(provider=provider_filter, - limit=limit, - offset=offset, - orderby=orderby) - - async def radios(self, - limit=0, - offset=0, + async for item in self.mass.db.library_playlists(provider=provider_filter, + orderby=orderby): + yield item + + async def library_radios(self, orderby='name', provider_filter=None) -> List[Playlist]: ''' return all library radios, optionally filtered by provider ''' - return await self.mass.db.radios(provider=provider_filter, - limit=limit, - offset=offset, - orderby=orderby) - - async def library_items(self, - media_type: MediaType, - limit=0, - offset=0, - orderby='name', - provider_filter=None) -> List[object]: - ''' get multiple music items in library''' - if media_type == MediaType.Artist: - return await self.library_artists(limit=limit, - offset=offset, - orderby=orderby, - provider_filter=provider_filter) - elif media_type == MediaType.Album: - return await self.library_albums(limit=limit, - offset=offset, - orderby=orderby, - provider_filter=provider_filter) - elif media_type == MediaType.Track: - return await self.library_tracks(limit=limit, - offset=offset, - orderby=orderby, - provider_filter=provider_filter) - elif media_type == MediaType.Playlist: - return await self.playlists(limit=limit, - offset=offset, - orderby=orderby, - provider_filter=provider_filter) - elif media_type == MediaType.Radio: - return await self.radios(limit=limit, - offset=offset, - orderby=orderby, - provider_filter=provider_filter) + async for item in self.mass.db.library_radios(provider=provider_filter, + orderby=orderby): + yield item async def artist(self, item_id, provider='database', lazy=True) -> Artist: ''' get artist by id ''' @@ -203,14 +151,14 @@ class MusicManager(): async def playlist_by_name(self, name) -> Playlist: ''' get playlist by name ''' - for playlist in await self.playlists(): + async for playlist in self.library_playlists(): if playlist.name == name: return playlist return None async def radio_by_name(self, name) -> Radio: ''' get radio by name ''' - for radio in await self.radios(): + async for radio in self.library_radios(): if radio.name == name: return radio return None @@ -220,58 +168,49 @@ class MusicManager(): ''' get top tracks for given artist ''' artist = await self.artist(artist_id, provider) # always append database tracks - items = await self.mass.db.artist_tracks(artist.item_id) - for prov_mapping in artist.provider_ids: - prov_id = prov_mapping['provider'] - prov_item_id = prov_mapping['item_id'] - prov_obj = self.providers[prov_id] - items += [item async for item in prov_obj.artist_toptracks(prov_item_id)] - items = list(toolz.unique(items, key=operator.attrgetter('item_id'))) - #items.sort(key=lambda x: x.name, reverse=False) - return items + async for item in self.mass.db.artist_tracks(artist.item_id): + yield item + # for prov_mapping in artist.provider_ids: + # prov_id = prov_mapping['provider'] + # prov_item_id = prov_mapping['item_id'] + # prov_obj = self.providers[prov_id] + # items += [item async for item in prov_obj.artist_toptracks(prov_item_id)] + # items = list(toolz.unique(items, key=operator.attrgetter('item_id'))) + # #items.sort(key=lambda x: x.name, reverse=False) + # return items async def artist_albums(self, artist_id, provider='database') -> List[Album]: ''' get (all) albums for given artist ''' artist = await self.artist(artist_id, provider) # always append database tracks - items = await self.mass.db.artist_albums(artist.item_id) - for prov_mapping in artist.provider_ids: - prov_id = prov_mapping['provider'] - prov_item_id = prov_mapping['item_id'] - prov_obj = self.providers[prov_id] - items += [item async for item in prov_obj.artist_albums(prov_item_id)] - items = list(toolz.unique(items, key=operator.attrgetter('item_id'))) + async for item in self.mass.db.artist_albums(artist.item_id): + yield item + # for prov_mapping in artist.provider_ids: + # prov_id = prov_mapping['provider'] + # prov_item_id = prov_mapping['item_id'] + # prov_obj = self.providers[prov_id] + # items += [item async for item in prov_obj.artist_albums(prov_item_id)] + # items = list(toolz.unique(items, key=operator.attrgetter('item_id'))) #items.sort(key=lambda x: x.name, reverse=False) - return items + #return items async def album_tracks(self, album_id, provider='database') -> List[Track]: ''' get the album tracks for given album ''' - items = [] album = await self.album(album_id, provider) # collect the tracks from the first provider prov = album.provider_ids[0] prov_obj = self.providers[prov['provider']] - items = [item async for item in prov_obj.album_tracks(prov['item_id'])] - items = sorted(items, - key=operator.attrgetter('disc_number', 'track_number'), - reverse=False) - return items - - async def playlist_tracks(self, - playlist_id, - provider='database', - offset=0, - limit=50) -> List[Track]: + async for item in prov_obj.album_tracks(prov['item_id']): + yield item + + async def playlist_tracks(self, playlist_id, provider='database') -> List[Track]: ''' get the tracks for given playlist ''' playlist = await self.playlist(playlist_id, provider) # return playlist tracks from provider prov = playlist.provider_ids[0] - res = self.providers[prov['provider'] - ].playlist_tracks(prov['item_id'], - offset=offset, - limit=limit) - return [item async for item in res] + async for item in self.providers[prov['provider']].playlist_tracks(prov['item_id']): + yield item async def search(self, searchquery, @@ -280,7 +219,7 @@ class MusicManager(): online=False) -> dict: ''' search database or providers ''' # get results from database - result = await self.mass.db.search(searchquery, media_types, limit) + result = await self.mass.db.search(searchquery, media_types) if online: # include results from music providers for prov in self.providers.values(): @@ -384,10 +323,13 @@ class MusicManager(): continue # actually add the tracks to the playlist on the provider if track_ids_to_add: + # invalidate cache + await self.mass.db.update_playlist(playlist.item_id, 'checksum', str(time.time())) return await self.providers[playlist_prov['provider'] ].add_playlist_tracks( playlist_prov['item_id'], track_ids_to_add) + async def remove_playlist_tracks(self, playlist_id, tracks: List[Track]): ''' remove tracks from playlist ''' @@ -415,6 +357,8 @@ class MusicManager(): track_ids_to_remove.append(track_provider['item_id']) # actually remove the tracks from the playlist on the provider if track_ids_to_remove: + # invalidate cache + await self.mass.db.update_playlist(playlist.item_id, 'checksum', str(time.time())) return await self.providers[prov_playlist_provider_id ].remove_playlist_tracks( prov_playlist_playlist_id, @@ -434,14 +378,14 @@ class MusicManager(): await self.sync_library_albums(prov_id) await self.sync_library_tracks(prov_id) await self.sync_library_artists(prov_id) - await self.sync_playlists(prov_id) - await self.sync_radios(prov_id) + await self.sync_library_playlists(prov_id) + await self.sync_library_radios(prov_id) @sync_task('artists') async def sync_library_artists(self, prov_id): ''' sync library artists for given provider''' music_provider = self.providers[prov_id] - prev_items = await self.library_artists(provider_filter=prov_id) + prev_items = [item async for item in self.library_artists(provider_filter=prov_id)] prev_db_ids = [item.item_id for item in prev_items] cur_db_ids = [] async for item in music_provider.get_library_artists(): @@ -460,7 +404,7 @@ class MusicManager(): async def sync_library_albums(self, prov_id): ''' sync library albums for given provider''' music_provider = self.providers[prov_id] - prev_items = await self.library_albums(provider_filter=prov_id) + prev_items = [item async for item in self.library_albums(provider_filter=prov_id)] prev_db_ids = [item.item_id for item in prev_items] cur_db_ids = [] async for item in music_provider.get_library_albums(): @@ -481,7 +425,7 @@ class MusicManager(): async def sync_library_tracks(self, prov_id): ''' sync library tracks for given provider''' music_provider = self.providers[prov_id] - prev_items = await self.library_tracks(provider_filter=prov_id) + prev_items = [item async for item in self.library_tracks(provider_filter=prov_id)] prev_db_ids = [item.item_id for item in prev_items] cur_db_ids = [] async for item in music_provider.get_library_tracks(): @@ -497,13 +441,13 @@ class MusicManager(): prov_id) @sync_task('playlists') - async def sync_playlists(self, prov_id): + async def sync_library_playlists(self, prov_id): ''' sync library playlists for given provider''' music_provider = self.providers[prov_id] - prev_items = await self.playlists(provider_filter=prov_id) + prev_items = [item async for item in self.library_playlists(provider_filter=prov_id)] prev_db_ids = [item.item_id for item in prev_items] cur_db_ids = [] - async for item in music_provider.get_playlists(): + async for item in music_provider.get_library_playlists(): # always add to db because playlist attributes could have changed db_id = await self.mass.db.add_playlist(item) cur_db_ids.append(db_id) @@ -518,10 +462,10 @@ class MusicManager(): prov_id) @sync_task('radios') - async def sync_radios(self, prov_id): + async def sync_library_radios(self, prov_id): ''' sync library radios for given provider''' music_provider = self.providers[prov_id] - prev_items = await self.radios(provider_filter=prov_id) + prev_items = [item async for item in self.library_radios(provider_filter=prov_id)] prev_db_ids = [item.item_id for item in prev_items] cur_db_ids = [] async for item in music_provider.get_radios(): diff --git a/music_assistant/musicproviders/file.py b/music_assistant/musicproviders/file.py index 5cae841f..b1ae425d 100644 --- a/music_assistant/musicproviders/file.py +++ b/music_assistant/musicproviders/file.py @@ -84,7 +84,7 @@ class FileProvider(MusicProvider): async for track in self.get_album_tracks(album.item_id): yield track - async def get_playlists(self) -> List[Playlist]: + async def get_library_playlists(self) -> List[Playlist]: ''' retrieve playlists from disk ''' if not self._playlists_dir: return @@ -173,6 +173,7 @@ class FileProvider(MusicProvider): "item_id": prov_item_id }) playlist.owner = 'disk' + playlist.checksum = os.path.getmtime(itempath) return playlist async def get_album_tracks(self, prov_album_id) -> List[Track]: diff --git a/music_assistant/musicproviders/qobuz.py b/music_assistant/musicproviders/qobuz.py index 2603230a..5fccd178 100644 --- a/music_assistant/musicproviders/qobuz.py +++ b/music_assistant/musicproviders/qobuz.py @@ -1,18 +1,14 @@ #!/usr/bin/env python3 # -*- coding:utf-8 -*- -import asyncio -import os from typing import List -import json -import aiohttp -import time import datetime import hashlib +import time +import aiohttp from asyncio_throttle import Throttler -from ..cache import use_cache -from ..utils import run_periodic, LOGGER, parse_title_and_version +from ..utils import LOGGER, parse_title_and_version from ..app_vars import get_app_var from ..models import MusicProvider, MediaType, TrackQuality, \ AlbumType, Artist, Album, Track, Playlist @@ -23,21 +19,21 @@ PROV_ID = 'qobuz' PROV_NAME = 'Qobuz' PROV_CLASS = 'QobuzProvider' -CONFIG_ENTRIES = [ - (CONF_ENABLED, False, CONF_ENABLED), - (CONF_USERNAME, "", CONF_USERNAME), - (CONF_PASSWORD, CONF_TYPE_PASSWORD, CONF_PASSWORD) -] +CONFIG_ENTRIES = [(CONF_ENABLED, False, CONF_ENABLED), + (CONF_USERNAME, "", CONF_USERNAME), + (CONF_PASSWORD, CONF_TYPE_PASSWORD, CONF_PASSWORD)] class QobuzProvider(MusicProvider): + http_session = None + throttler = None + def __init__(self, mass, conf): ''' Support for streaming music provider Qobuz ''' + super().__init__(mass) self.name = PROV_NAME self.prov_id = PROV_ID - self.mass = mass - self.cache = mass.cache self.__username = conf[CONF_USERNAME] self.__password = conf[CONF_PASSWORD] if not conf[CONF_USERNAME] or not conf[CONF_PASSWORD]: @@ -50,17 +46,14 @@ class QobuzProvider(MusicProvider): self.http_session = aiohttp.ClientSession( loop=self.mass.event_loop, connector=aiohttp.TCPConnector()) self.throttler = Throttler(rate_limit=4, period=1) - await self.mass.add_event_listener(self.mass_event, EVENT_STREAM_STARTED) - await self.mass.add_event_listener(self.mass_event, EVENT_PLAYBACK_STOPPED) + await self.mass.add_event_listener(self.mass_event, + EVENT_STREAM_STARTED) + await self.mass.add_event_listener(self.mass_event, + EVENT_PLAYBACK_STOPPED) async def search(self, searchstring, media_types=List[MediaType], limit=5): ''' perform search on the provider ''' - result = { - "artists": [], - "albums": [], - "tracks": [], - "playlists": [] - } + result = {"artists": [], "albums": [], "tracks": [], "playlists": []} params = {"query": searchstring, "limit": limit} if len(media_types) == 1: # qobuz does not support multiple searchtypes, falls back to all if no type given @@ -91,21 +84,24 @@ class QobuzProvider(MusicProvider): result["tracks"].append(track) if "playlists" in searchresult: for item in searchresult["playlists"]["items"]: - result["playlists"].append(await self.__parse_playlist(item)) + result["playlists"].append(await + self.__parse_playlist(item)) return result async def get_library_artists(self) -> List[Artist]: - ''' retrieve library artists from qobuz ''' + ''' retrieve all library artists from qobuz ''' params = {'type': 'artists'} - for item in await self.__get_all_items("favorite/getUserFavorites", params, key='artists'): + endpoint = 'favorite/getUserFavorites' + async for item in self.__get_all_items(endpoint, params, key='artists'): artist = await self.__parse_artist(item) if artist: yield artist async def get_library_albums(self) -> List[Album]: - ''' retrieve library albums from qobuz ''' + ''' retrieve all library albums from qobuz ''' params = {'type': 'albums'} - for item in await self.__get_all_items("favorite/getUserFavorites", params, key='albums'): + endpoint = 'favorite/getUserFavorites' + async for item in self.__get_all_items(endpoint, params, key='albums'): album = await self.__parse_album(item) if album: yield album @@ -113,14 +109,16 @@ class QobuzProvider(MusicProvider): async def get_library_tracks(self) -> List[Track]: ''' retrieve library tracks from qobuz ''' params = {'type': 'tracks'} - for item in await self.__get_all_items("favorite/getUserFavorites", params, key='tracks'): + endpoint = 'favorite/getUserFavorites' + async for item in self.__get_all_items(endpoint, params, key='tracks'): track = await self.__parse_track(item) if track: yield track - async def get_playlists(self) -> List[Playlist]: - ''' retrieve playlists from the provider ''' - for item in await self.__get_all_items("playlist/getUserPlaylists", key='playlists', cache_checksum=time.time()): + async def get_library_playlists(self) -> List[Playlist]: + ''' retrieve all library playlists from the provider ''' + endpoint = 'favorite/getUserPlaylists' + async for item in self.__get_all_items(endpoint, key='playlists'): playlist = await self.__parse_playlist(item) if playlist: yield playlist @@ -149,40 +147,35 @@ class QobuzProvider(MusicProvider): playlist_obj = await self.__get_data("playlist/get", params) return await self.__parse_playlist(playlist_obj) - async def get_album_tracks(self, prov_album_id, limit=25, offset=0) -> List[Track]: - ''' get album tracks for given album id ''' + async def get_album_tracks(self, prov_album_id) -> List[Track]: + ''' get all album tracks for given album id ''' params = {'album_id': prov_album_id} - track_objs = await self.__get_all_items( - "album/get", params, key='tracks', limit=limit, offset=offset) - for track_obj in track_objs: - track = await self.__parse_track(track_obj) + async for item in self.__get_all_items('album/get', params, key='tracks'): + track = await self.__parse_track(item) if track: yield track else: LOGGER.warning("Unavailable track found in album %s: %s", - prov_album_id, track_obj['title']) + prov_album_id, item['title']) - async def get_playlist_tracks(self, prov_playlist_id, limit=25, offset=0) -> List[Track]: - ''' get playlist tracks for given playlist id ''' - playlist_obj = await self.__get_data("playlist/get?playlist_id=%s" % prov_playlist_id, ignore_cache=True) - cache_checksum = playlist_obj["updated_at"] + async def get_playlist_tracks(self, prov_playlist_id) -> List[Track]: + ''' get all playlist tracks for given playlist id ''' params = {'playlist_id': prov_playlist_id, 'extra': 'tracks'} - track_objs = await self.__get_all_items("playlist/get", params, key='tracks', limit=limit, offset=offset, cache_checksum=cache_checksum) - for track_obj in track_objs: - playlist_track = await self.__parse_track(track_obj) + endpoint = 'playlist/get' + async for item in self.__get_all_items(endpoint, params, key='tracks'): + playlist_track = await self.__parse_track(item) if playlist_track: yield playlist_track else: - LOGGER.warning("Unavailable track found in playlist %s: %s" % ( - playlist_obj['name'], track_obj['title'])) + LOGGER.warning("Unavailable track found in playlist %s: %s", + prov_playlist_id, item['title']) # TODO: should we look for an alternative track version if the original is marked unavailable ? - async def get_artist_albums(self, prov_artist_id, limit=25, offset=0) -> List[Album]: + async def get_artist_albums(self, prov_artist_id) -> List[Album]: ''' get a list of albums for the given artist ''' - params = {'artist_id': prov_artist_id, - 'extra': 'albums', 'limit': limit, 'offset': offset} - result = await self.__get_data('artist/get', params) - for item in result['albums']['items']: + params = { 'artist_id': prov_artist_id, 'extra': 'albums' } + endpoint = 'artist/get' + async for item in self.__get_all_items(endpoint, params, key='albums'): if str(item['artist']['id']) == str(prov_artist_id): album = await self.__parse_album(item) if album: @@ -196,7 +189,8 @@ class QobuzProvider(MusicProvider): params = {"query": artist.name, "limit": 25, "type": "tracks"} searchresult = await self.__get_data("catalog/search", params) for item in searchresult["tracks"]["items"]: - if "performer" in item and str(item["performer"]["id"]) == str(prov_artist_id): + if "performer" in item and str( + item["performer"]["id"]) == str(prov_artist_id): track = await self.__parse_track(item) if track: yield track @@ -204,32 +198,40 @@ class QobuzProvider(MusicProvider): async def add_library(self, prov_item_id, media_type: MediaType): ''' add item to library ''' if media_type == MediaType.Artist: - result = await self.__get_data('favorite/create', {'artist_ids': prov_item_id}) + result = await self.__get_data('favorite/create', + {'artist_ids': prov_item_id}) item = await self.artist(prov_item_id) elif media_type == MediaType.Album: - result = await self.__get_data('favorite/create', {'album_ids': prov_item_id}) + result = await self.__get_data('favorite/create', + {'album_ids': prov_item_id}) item = await self.album(prov_item_id) elif media_type == MediaType.Track: - result = await self.__get_data('favorite/create', {'track_ids': prov_item_id}) + result = await self.__get_data('favorite/create', + {'track_ids': prov_item_id}) item = await self.track(prov_item_id) - await self.mass.db.add_to_library(item.item_id, media_type, self.prov_id) - LOGGER.debug("added item %s to %s - %s" % - (prov_item_id, self.prov_id, result)) + await self.mass.db.add_to_library(item.item_id, media_type, + self.prov_id) + LOGGER.debug("added item %s to %s - %s", + prov_item_id, self.prov_id, result) async def remove_library(self, prov_item_id, media_type: MediaType): ''' remove item from library ''' if media_type == MediaType.Artist: - result = await self.__get_data('favorite/delete', {'artist_ids': prov_item_id}) + result = await self.__get_data('favorite/delete', + {'artist_ids': prov_item_id}) item = await self.artist(prov_item_id) elif media_type == MediaType.Album: - result = await self.__get_data('favorite/delete', {'album_ids': prov_item_id}) + result = await self.__get_data('favorite/delete', + {'album_ids': prov_item_id}) item = await self.album(prov_item_id) elif media_type == MediaType.Track: - result = await self.__get_data('favorite/delete', {'track_ids': prov_item_id}) + result = await self.__get_data('favorite/delete', + {'track_ids': prov_item_id}) item = await self.track(prov_item_id) - await self.mass.db.remove_from_library(item.item_id, media_type, self.prov_id) - LOGGER.debug("deleted item %s from %s - %s" % - (prov_item_id, self.prov_id, result)) + await self.mass.db.remove_from_library(item.item_id, media_type, + self.prov_id) + LOGGER.debug("deleted item %s from %s - %s", + prov_item_id, self.prov_id, result) async def add_playlist_tracks(self, prov_playlist_id, prov_track_ids): ''' add track(s) to playlist ''' @@ -243,11 +245,15 @@ class QobuzProvider(MusicProvider): ''' remove track(s) from playlist ''' playlist_track_ids = [] params = {'playlist_id': prov_playlist_id, 'extra': 'tracks'} - for track in await self.__get_all_items("playlist/get", params, key='tracks', limit=0): + for track in await self.__get_all_items("playlist/get", + params, + key='tracks'): if track['id'] in prov_track_ids: playlist_track_ids.append(track['playlist_track_id']) - params = {'playlist_id': prov_playlist_id, - 'track_ids': ",".join(playlist_track_ids)} + params = { + 'playlist_id': prov_playlist_id, + 'track_ids': ",".join(playlist_track_ids) + } return await self.__get_data('playlist/deleteTracks', params) async def get_stream_details(self, track_id): @@ -256,44 +262,62 @@ class QobuzProvider(MusicProvider): for format_id in [27, 7, 6, 5]: # it seems that simply requesting for highest available quality does not work # from time to time the api response is empty for this request ?! - params = {'format_id': format_id, - 'track_id': track_id, 'intent': 'stream'} - streamdetails = await self.__get_data('track/getFileUrl', params, sign_request=True, ignore_cache=True) + params = { + 'format_id': format_id, + 'track_id': track_id, + 'intent': 'stream' + } + streamdetails = await self.__get_data('track/getFileUrl', + params, + sign_request=True) if streamdetails and streamdetails.get('url'): break if not streamdetails or not streamdetails.get('url'): - LOGGER.error( - "Unable to retrieve stream url for track %s" % track_id) + LOGGER.error("Unable to retrieve stream url for track %s", + track_id) return None return { "type": "url", "path": streamdetails['url'], "content_type": streamdetails['mime_type'].split('/')[1], - "sample_rate": int(streamdetails['sampling_rate']*1000), + "sample_rate": int(streamdetails['sampling_rate'] * 1000), "bit_depth": streamdetails['bit_depth'], - "details": streamdetails # we need these details for reporting playback + "details": + streamdetails # we need these details for reporting playback } async def mass_event(self, msg, msg_details): - ''' - received event from mass + ''' + received event from mass we use this to report playback start/stop to qobuz ''' if not self.__user_auth_info: return # TODO: need to figure out if the streamed track is purchased by user - if msg == EVENT_STREAM_STARTED and msg_details["provider"] == self.prov_id: + if msg == EVENT_STREAM_STARTED and msg_details[ + "provider"] == self.prov_id: # report streaming started to qobuz device_id = self.__user_auth_info["user"]["device"]["id"] credential_id = self.__user_auth_info["user"]["credential"]["id"] user_id = self.__user_auth_info["user"]["id"] format_id = msg_details["details"]["format_id"] timestamp = int(time.time()) - events = [{"online": True, "sample": False, "intent": "stream", "device_id": device_id, - "track_id": msg_details["item_id"], "purchase": False, "date": timestamp, - "credential_id": credential_id, "user_id": user_id, "local": False, "format_id":format_id}] + events = [{ + "online": True, + "sample": False, + "intent": "stream", + "device_id": device_id, + "track_id": msg_details["item_id"], + "purchase": False, + "date": timestamp, + "credential_id": credential_id, + "user_id": user_id, + "local": False, + "format_id": format_id + }] await self.__post_data("track/reportStreamingStart", data=events) - elif msg == EVENT_PLAYBACK_STOPPED and msg_details["provider"] == self.prov_id: + elif msg == EVENT_PLAYBACK_STOPPED and msg_details[ + "provider"] == self.prov_id: # report streaming ended to qobuz user_id = self.__user_auth_info["user"]["id"] params = { @@ -301,7 +325,7 @@ class QobuzProvider(MusicProvider): 'track_id': msg_details["item_id"], 'duration': int(msg_details["seconds_played"]) } - await self.__get_data('/track/reportStreamingEnd', params, ignore_cache=True) + await self.__get_data('/track/reportStreamingEnd', params) async def __parse_artist(self, artist_obj): ''' parse qobuz artist object to generic layout ''' @@ -318,7 +342,8 @@ class QobuzProvider(MusicProvider): if artist_obj.get('image'): for key in ['extralarge', 'large', 'medium', 'small']: if artist_obj['image'].get(key): - if not '2a96cbd8b46e442fc41c2b86b821562f' in artist_obj['image'][key]: + if not '2a96cbd8b46e442fc41c2b86b821562f' in artist_obj[ + 'image'][key]: artist.metadata["image"] = artist_obj['image'][key] break if artist_obj.get('biography'): @@ -331,7 +356,8 @@ class QobuzProvider(MusicProvider): async def __parse_album(self, album_obj): ''' parse qobuz album object to generic layout ''' album = Album() - if not album_obj.get('id') or not album_obj["streamable"] or not album_obj["displayable"]: + if not album_obj.get('id') or not album_obj[ + "streamable"] or not album_obj["displayable"]: # do not return unavailable items return None album.item_id = album_obj['id'] @@ -349,18 +375,26 @@ class QobuzProvider(MusicProvider): else: quality = TrackQuality.FLAC_LOSSLESS album.provider_ids.append({ - "provider": self.prov_id, - "item_id": album_obj['id'], - "quality": quality, - "details": "%skHz %sbit" % (album_obj['maximum_sampling_rate'], album_obj['maximum_bit_depth']) + "provider": + self.prov_id, + "item_id": + album_obj['id'], + "quality": + quality, + "details": + "%skHz %sbit" % (album_obj['maximum_sampling_rate'], + album_obj['maximum_bit_depth']) }) - album.name, album.version = parse_title_and_version(album_obj['title'], album_obj.get('version')) + album.name, album.version = parse_title_and_version( + album_obj['title'], album_obj.get('version')) album.artist = await self.__parse_artist(album_obj['artist']) if not album.artist: raise Exception("No album artist ! %s" % album_obj) if album_obj.get('product_type', '') == 'single': album.albumtype = AlbumType.Single - elif album_obj.get('product_type', '') == 'compilation' or 'Various' in album_obj['artist']['name']: + elif album_obj.get( + 'product_type', '' + ) == 'compilation' or 'Various' in album_obj['artist']['name']: album.albumtype = AlbumType.Compilation else: album.albumtype = AlbumType.Album @@ -395,12 +429,14 @@ class QobuzProvider(MusicProvider): async def __parse_track(self, track_obj): ''' parse qobuz track object to generic layout ''' track = Track() - if not track_obj.get('id') or not track_obj["streamable"] or not track_obj["displayable"]: + if not track_obj.get('id') or not track_obj[ + "streamable"] or not track_obj["displayable"]: # do not return unavailable items return None track.item_id = track_obj['id'] track.provider = self.prov_id - if track_obj.get('performer') and not 'Various ' in track_obj['performer']: + if track_obj.get( + 'performer') and not 'Various ' in track_obj['performer']: artist = await self.__parse_artist(track_obj['performer']) if not artist: artist = self.get_artist(track_obj['performer']['id']) @@ -408,8 +444,11 @@ class QobuzProvider(MusicProvider): track.artists.append(artist) if not track.artists: # try to grab artist from album - if track_obj.get('album') and track_obj['album'].get('artist') and not 'Various ' in track_obj['album']['artist']: - artist = await self.__parse_artist(track_obj['album']['artist']) + if track_obj.get('album') and track_obj['album'].get( + 'artist' + ) and not 'Various ' in track_obj['album']['artist']: + artist = await self.__parse_artist(track_obj['album']['artist'] + ) if artist: track.artists.append(artist) if not track.artists: @@ -423,7 +462,8 @@ class QobuzProvider(MusicProvider): artist.item_id = name track.artists.append(artist) # TODO: fix grabbing composer from details - track.name, track.version = parse_title_and_version(track_obj['title'], track_obj.get('version')) + track.name, track.version = parse_title_and_version( + track_obj['title'], track_obj.get('version')) track.duration = track_obj['duration'] if 'album' in track_obj: album = await self.__parse_album(track_obj['album']) @@ -436,9 +476,7 @@ class QobuzProvider(MusicProvider): if track_obj.get('url'): track.metadata["qobuz_url"] = track_obj['url'] if track_obj.get('isrc'): - track.external_ids.append({ - "isrc": track_obj['isrc'] - }) + track.external_ids.append({"isrc": track_obj['isrc']}) if track_obj.get('performers'): track.metadata["performers"] = track_obj['performers'] if track_obj.get('copyright'): @@ -457,10 +495,15 @@ class QobuzProvider(MusicProvider): else: quality = TrackQuality.FLAC_LOSSLESS track.provider_ids.append({ - "provider": self.prov_id, - "item_id": track_obj['id'], - "quality": quality, - "details": "%skHz %sbit" % (track_obj['maximum_sampling_rate'], track_obj['maximum_bit_depth']) + "provider": + self.prov_id, + "item_id": + track_obj['id'], + "quality": + quality, + "details": + "%skHz %sbit" % (track_obj['maximum_sampling_rate'], + track_obj['maximum_bit_depth']) }) return track @@ -477,64 +520,54 @@ class QobuzProvider(MusicProvider): }) playlist.name = playlist_obj['name'] playlist.owner = playlist_obj['owner']['name'] - playlist.is_editable = playlist_obj['owner']['id'] == self.__user_auth_info[ - "user"]["id"] or playlist_obj['is_collaborative'] + playlist.is_editable = playlist_obj['owner'][ + 'id'] == self.__user_auth_info["user"]["id"] or playlist_obj[ + 'is_collaborative'] if playlist_obj.get('images300'): playlist.metadata["image"] = playlist_obj['images300'][0] if playlist_obj.get('url'): playlist.metadata["qobuz_url"] = playlist_obj['url'] + playlist.checksum = playlist_obj['updated_at'] return playlist async def __auth_token(self): ''' login to qobuz and store the token''' if self.__user_auth_info: return self.__user_auth_info["user_auth_token"] - params = {"username": self.__username, "password": self.__password, - "device_manufacturer_id": "music_assistant"} - details = await self.__get_data("user/login", params, ignore_cache=True) + params = { + "username": self.__username, + "password": self.__password, + "device_manufacturer_id": "music_assistant" + } + details = await self.__get_data("user/login", params) if details and "user" in details: self.__user_auth_info = details - LOGGER.info("Succesfully logged in to Qobuz as %s" % - (details["user"]["display_name"])) + LOGGER.info("Succesfully logged in to Qobuz as %s", + details["user"]["display_name"]) return details["user_auth_token"] - async def __get_all_items(self, endpoint, params={}, key="playlists", limit=0, offset=0, cache_checksum=None): + async def __get_all_items(self, endpoint, params=None, key='tracks'): ''' get all items from a paged list ''' - if not cache_checksum: - params["limit"] = 1 - params["offset"] = 0 - cache_checksum = await self.__get_data(endpoint, params, ignore_cache=True) - cache_checksum = cache_checksum[key]["total"] - if limit: - # partial listing + if not params: + params = {} + limit = 50 + offset = 0 + while True: params["limit"] = limit params["offset"] = offset - result = await self.__get_data(endpoint, params=params, cache_checksum=cache_checksum) - return result[key]["items"] - else: - # full listing - offset = 0 - total_items = 1 - count = 0 - items = [] - while count < total_items: - params["limit"] = 200 - params["offset"] = offset - result = await self.__get_data(endpoint, params=params, cache_checksum=cache_checksum) - if result and key in result: - total_items = result[key]["total"] - offset += 200 - count += len(result[key]["items"]) - items += result[key]["items"] - else: - LOGGER.error( - "failed to retrieve items for %s (%s) --> %s" % (endpoint, params, result)) - break - return items + result = await self.__get_data(endpoint, params=params) + offset += limit + if not result or not key in result or not "items" in result[key]: + break + for item in result[key]['items']: + yield item + if len(result[key]['items']) < limit: + break - @use_cache(7) - async def __get_data(self, endpoint, params={}, sign_request=False, ignore_cache=False, cache_checksum=None): + async def __get_data(self, endpoint, params=None, sign_request=False): ''' get data from api''' + if not params: + params = {} url = "http://www.qobuz.com/api.json/0.2/%s" % endpoint headers = {"X-App-Id": get_app_var(0)} if endpoint != 'user/login': @@ -557,7 +590,10 @@ class QobuzProvider(MusicProvider): params["app_id"] = get_app_var(0) params["user_auth_token"] = await self.__auth_token() async with self.throttler: - async with self.http_session.get(url, headers=headers, params=params, verify_ssl=False) as response: + async with self.http_session.get(url, + headers=headers, + params=params, + verify_ssl=False) as response: try: result = await response.json() if "error" in result: @@ -570,12 +606,19 @@ class QobuzProvider(MusicProvider): result = await response.text() LOGGER.error(result) - async def __post_data(self, endpoint, params={}, data={}): + async def __post_data(self, endpoint, params=None, data=None): ''' post data to api''' + if not params: + params = {} + if not data: + data = {} url = "http://www.qobuz.com/api.json/0.2/%s" % endpoint params["app_id"] = get_app_var(0) params["user_auth_token"] = await self.__auth_token() - async with self.http_session.post(url, params=params, json=data, verify_ssl=False) as response: + async with self.http_session.post(url, + params=params, + json=data, + verify_ssl=False) as response: try: result = await response.json() if "error" in result: diff --git a/music_assistant/musicproviders/spotify.py b/music_assistant/musicproviders/spotify.py index 43cd6a40..1aee3b1c 100644 --- a/music_assistant/musicproviders/spotify.py +++ b/music_assistant/musicproviders/spotify.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 # -*- coding:utf-8 -*- - import os from typing import List import time @@ -11,7 +10,6 @@ import asyncio from asyncio_throttle import Throttler import aiohttp -from ..cache import use_cache from ..utils import LOGGER, parse_title_and_version, json from ..app_vars import get_app_var from ..models import MusicProvider, MediaType, TrackQuality, \ @@ -28,10 +26,14 @@ CONFIG_ENTRIES = [(CONF_ENABLED, False, CONF_ENABLED), class SpotifyProvider(MusicProvider): + + throttler = None + http_session = None + sp_user = None + def __init__(self, mass, conf): ''' Support for streaming provider Spotify ''' - self.mass = mass - self.cache = mass.cache + super().__init__(mass) self.name = PROV_NAME self.prov_id = PROV_ID self._cur_user = None @@ -62,8 +64,7 @@ class SpotifyProvider(MusicProvider): searchtype = ",".join(searchtypes) params = {"q": searchstring, "type": searchtype, "limit": limit} searchresult = await self.__get_data("search", - params=params, - cache_checksum="bla") + params=params) if searchresult: if "artists" in searchresult: for item in searchresult["artists"]["items"]: @@ -99,22 +100,21 @@ class SpotifyProvider(MusicProvider): async def get_library_albums(self) -> List[Album]: ''' retrieve library albums from the provider ''' - for item in await self.__get_all_items("me/albums"): + async for item in self.__get_all_items("me/albums"): album = await self.__parse_album(item) if album: yield album async def get_library_tracks(self) -> List[Track]: ''' retrieve library tracks from the provider ''' - for item in await self.__get_all_items("me/tracks"): + async for item in self.__get_all_items("me/tracks"): track = await self.__parse_track(item) if track: yield track - async def get_playlists(self) -> List[Playlist]: + async def get_library_playlists(self) -> List[Playlist]: ''' retrieve playlists from the provider ''' - for item in await self.__get_all_items("me/playlists", - cache_checksum=time.time()): + async for item in self.__get_all_items("me/playlists"): playlist = await self.__parse_playlist(item) if playlist: yield playlist @@ -136,46 +136,34 @@ class SpotifyProvider(MusicProvider): async def get_playlist(self, prov_playlist_id) -> Playlist: ''' get full playlist details by id ''' - playlist_obj = await self.__get_data("playlists/%s" % prov_playlist_id, - ignore_cache=True) + playlist_obj = await self.__get_data(f'playlists/{prov_playlist_id}') return await self.__parse_playlist(playlist_obj) - async def get_album_tracks(self, prov_album_id, limit=50, offset=0) -> List[Track]: - ''' get album tracks for given album id ''' - track_objs = await self.__get_all_items( - f"albums/{prov_album_id}/tracks", limit=limit, offset=offset) - for track_obj in track_objs: + async def get_album_tracks(self, prov_album_id) -> List[Track]: + ''' get all album tracks for given album id ''' + endpoint = f"albums/{prov_album_id}/tracks" + async for track_obj in self.__get_all_items(endpoint): track = await self.__parse_track(track_obj) if track: yield track - async def get_playlist_tracks(self, prov_playlist_id, limit=50, - offset=0) -> List[Track]: - ''' get playlist tracks for given playlist id ''' - playlist_obj = await self.__get_data( - "playlists/%s?fields=snapshot_id,name" % prov_playlist_id, - ignore_cache=True) - cache_checksum = playlist_obj["snapshot_id"] - track_objs = await self.__get_all_items("playlists/%s/tracks" % - prov_playlist_id, - limit=limit, - offset=offset, - cache_checksum=cache_checksum) - for track_obj in track_objs: + async def get_playlist_tracks(self, prov_playlist_id) -> List[Track]: + ''' get all playlist tracks for given playlist id ''' + endpoint = f"playlists/{prov_playlist_id}/tracks" + async for track_obj in self.__get_all_items(endpoint): playlist_track = await self.__parse_track(track_obj) if playlist_track: - yield playlist_track + yield playlist_track else: - LOGGER.warning( - "Unavailable track found in playlist %s: %s", - playlist_obj['name'], track_obj['track']['name']) + LOGGER.warning("Unavailable track found in playlist %s: %s", + prov_playlist_id, + track_obj['track']['name']) - async def get_artist_albums(self, prov_artist_id, limit=25, offset=0) -> List[Album]: - ''' get a list of albums for the given artist ''' + async def get_artist_albums(self, prov_artist_id) -> List[Album]: + ''' get a list of all albums for the given artist ''' params = {'include_groups': 'album,single,compilation'} - items = await self.__get_all_items( - 'artists/%s/albums' % prov_artist_id, params, limit=limit, offset=offset) - for item in items: + endpoint = f'artists/{prov_artist_id}/albums' + async for item in self.__get_all_items(endpoint, params): album = await self.__parse_album(item) if album: yield album @@ -183,7 +171,8 @@ class SpotifyProvider(MusicProvider): async def get_artist_toptracks(self, prov_artist_id) -> List[Track]: ''' get a list of 10 most popular tracks for the given artist ''' artist = await self.get_artist(prov_artist_id) - items = await self.__get_data('artists/%s/top-tracks' % prov_artist_id) + endpoint = f'artists/{prov_artist_id}/top-tracks' + items = await self.__get_data(endpoint) for item in items['tracks']: track = await self.__parse_track(item) if track: @@ -206,8 +195,8 @@ class SpotifyProvider(MusicProvider): item = await self.track(prov_item_id) await self.mass.db.add_to_library(item.item_id, media_type, self.prov_id) - LOGGER.debug("added item %s to %s - %s", - prov_item_id, self.prov_id, result) + LOGGER.debug("added item %s to %s - %s", prov_item_id, self.prov_id, + result) async def remove_library(self, prov_item_id, media_type: MediaType): ''' remove item from library ''' @@ -243,36 +232,11 @@ class SpotifyProvider(MusicProvider): ''' remove track(s) from playlist ''' track_uris = [] for track_id in prov_track_ids: - track_uris.append("spotify:track:%s" % track_id) - data = {"tracks": track_uris} + track_uris.append({"uri": "spotify:track:%s" % track_id}) + data = { "tracks": track_uris } return await self.__delete_data(f'playlists/{prov_playlist_id}/tracks', data=data) - async def devices(self): - ''' list all available devices ''' - items = await self.__get_data('me/player/devices') - return items['devices'] - - async def play_media(self, - device_id, - uri, - offset_pos=None, - offset_uri=None): - ''' play uri on spotify device''' - opts = {} - if isinstance(uri, list): - opts['uris'] = uri - elif uri.startswith('spotify:track'): - opts['uris'] = [uri] - else: - opts['context_uri'] = uri - if offset_pos is not None: # only for playlists/albums! - opts["offset"] = {"position": offset_pos} - elif offset_uri is not None: # only for playlists/albums! - opts["offset"] = {"uri": offset_uri} - return await self.__put_data('me/player/play', - {"device_id": device_id}, opts) - async def get_stream_details(self, track_id): ''' return the content details for the given track when it will be streamed''' # make sure a valid track is requested @@ -423,6 +387,7 @@ class SpotifyProvider(MusicProvider): if playlist_obj.get('external_urls'): playlist.metadata["spotify_url"] = playlist_obj['external_urls'][ 'spotify'] + playlist.checksum = playlist_obj['snapshot_id'] return playlist async def get_token(self): @@ -440,7 +405,7 @@ class SpotifyProvider(MusicProvider): if tokeninfo: self.__auth_token = tokeninfo self.sp_user = await self.__get_data("me") - LOGGER.info("Succesfully logged in to Spotify as %s" % + LOGGER.info("Succesfully logged in to Spotify as %s", self.sp_user["id"]) self.__auth_token = tokeninfo else: @@ -478,63 +443,34 @@ class SpotifyProvider(MusicProvider): tokeninfo['expiresAt'] = tokeninfo['expiresIn'] + int(time.time()) return tokeninfo - async def __get_all_items(self, - endpoint, - params={}, - limit=0, - offset=0, - cache_checksum=None): + async def __get_all_items(self, endpoint, params=None, key='items'): ''' get all items from a paged list ''' - if not cache_checksum: - params["limit"] = 1 - params["offset"] = 0 - cache_checksum = await self.__get_data(endpoint, - params, - ignore_cache=True) - cache_checksum = cache_checksum["total"] - if limit: - # partial listing + if not params: + params = {} + limit = 50 + offset = 0 + while True: params["limit"] = limit params["offset"] = offset - result = await self.__get_data(endpoint, - params=params, - cache_checksum=cache_checksum) - if result and "items" in result: - return result["items"] - else: - LOGGER.error(f"Empty result for {endpoint} limit {limit} offset {offset}") - return [] - else: - # full listing - total_items = 1 - count = 0 - items = [] - while count < total_items: - params["limit"] = 50 - params["offset"] = offset - result = await self.__get_data(endpoint, - params=params, - cache_checksum=cache_checksum) - total_items = result["total"] - offset += 50 - count += len(result["items"]) - items += result["items"] - return items - - @use_cache(7) - async def __get_data(self, - endpoint, - params={}, - ignore_cache=False, - cache_checksum=None): + result = await self.__get_data(endpoint, params=params) + offset += limit + if not result or not key in result or not result[key]: + break + for item in result[key]: + yield item + if len(result[key]) < limit: + break + + async def __get_data(self, endpoint, params=None): ''' get data from api''' + if not params: + params = {} url = 'https://api.spotify.com/v1/%s' % endpoint params['market'] = 'from_token' params['country'] = 'from_token' token = await self.get_token() headers = {'Authorization': 'Bearer %s' % token["accessToken"]} async with self.throttler: - print("%s - %s" %(url, params)) async with self.http_session.get(url, headers=headers, params=params, @@ -546,8 +482,10 @@ class SpotifyProvider(MusicProvider): result = None return result - async def __delete_data(self, endpoint, params={}, data=None): + async def __delete_data(self, endpoint, params=None, data=None): ''' delete data from api''' + if not params: + params = {} url = 'https://api.spotify.com/v1/%s' % endpoint token = await self.get_token() headers = {'Authorization': 'Bearer %s' % token["accessToken"]} @@ -558,8 +496,10 @@ class SpotifyProvider(MusicProvider): verify_ssl=False) as response: return await response.text() - async def __put_data(self, endpoint, params={}, data=None): + async def __put_data(self, endpoint, params=None, data=None): ''' put data on api''' + if not params: + params = {} url = 'https://api.spotify.com/v1/%s' % endpoint token = await self.get_token() headers = {'Authorization': 'Bearer %s' % token["accessToken"]} @@ -570,8 +510,10 @@ class SpotifyProvider(MusicProvider): verify_ssl=False) as response: return await response.text() - async def __post_data(self, endpoint, params={}, data=None): + async def __post_data(self, endpoint, params=None, data=None): ''' post data on api''' + if not params: + params = {} url = 'https://api.spotify.com/v1/%s' % endpoint token = await self.get_token() headers = {'Authorization': 'Bearer %s' % token["accessToken"]} diff --git a/music_assistant/player_manager.py b/music_assistant/player_manager.py index 725f3741..a32eca8b 100755 --- a/music_assistant/player_manager.py +++ b/music_assistant/player_manager.py @@ -97,7 +97,7 @@ class PlayerManager(): provider=media_item.provider) elif media_item.media_type == MediaType.Playlist: tracks = await self.mass.music.playlist_tracks(media_item.item_id, - provider=media_item.provider, offset=0, limit=0) + provider=media_item.provider) else: tracks = [media_item] # single track for track in tracks: @@ -108,7 +108,7 @@ class PlayerManager(): queue_items.append(queue_item) # load items into the queue - if queue_opt == 'replace' or (queue_opt in ['next', 'play'] and len(queue_items) > 50): + if queue_opt == 'replace' or (queue_opt in ['next', 'play'] and len(queue_items) > 10): return await player.queue.load(queue_items) elif queue_opt == 'next': return await player.queue.insert(queue_items, 1) diff --git a/music_assistant/web.py b/music_assistant/web.py index 2b2cc860..abe7cbc8 100755 --- a/music_assistant/web.py +++ b/music_assistant/web.py @@ -28,7 +28,7 @@ else: ] class Web(): - ''' webserver and json/websocket api ''' + """ webserver and json/websocket api """ def __init__(self, mass): self.mass = mass @@ -60,7 +60,7 @@ class Web(): self._enable_ssl = enable_ssl async def setup(self): - ''' perform async setup ''' + """ perform async setup """ app = web.Application() app.add_routes([web.get('/jsonrpc.js', self.json_rpc)]) app.add_routes([web.post('/jsonrpc.js', self.json_rpc)]) @@ -84,7 +84,11 @@ class Web(): app.add_routes([web.get('/api/albums/{album_id}/tracks', self.album_tracks)]) app.add_routes([web.get('/api/{media_type}/{media_id}/image', self.get_image)]) app.add_routes([web.get('/api/{media_type}/{media_id}', self.get_item)]) - app.add_routes([web.get('/api/{media_type}', self.get_items)]) + app.add_routes([web.get('/api/artists', self.library_artists)]) + app.add_routes([web.get('/api/albums', self.library_albums)]) + app.add_routes([web.get('/api/tracks', self.library_tracks)]) + app.add_routes([web.get('/api/radios', self.library_radios)]) + app.add_routes([web.get('/api/playlists', self.library_playlists)]) app.add_routes([web.get('/', self.index)]) webdir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'web/') app.router.add_static("/", webdir) @@ -111,21 +115,43 @@ class Web(): await https_site.start() LOGGER.info("Started HTTPS webserver on port %s" % self.config['https_port']) - async def get_items(self, request): - ''' get multiple library items''' - media_type_str = request.match_info.get('media_type') - media_type = media_type_from_string(media_type_str) - limit = int(request.query.get('limit', 50)) - offset = int(request.query.get('offset', 0)) + async def library_artists(self, request): + """Get all library artists.""" orderby = request.query.get('orderby', 'name') provider_filter = request.rel_url.query.get('provider') - result = await self.mass.music.library_items(media_type, - limit=limit, offset=offset, - orderby=orderby, provider_filter=provider_filter) - return web.json_response(result, dumps=json_serializer) + iterator = self.mass.music.library_artists(orderby=orderby, provider_filter=provider_filter) + return await self.__stream_json(request, iterator) + + async def library_albums(self, request): + """Get all library albums.""" + orderby = request.query.get('orderby', 'name') + provider_filter = request.rel_url.query.get('provider') + iterator = self.mass.music.library_albums(orderby=orderby, provider_filter=provider_filter) + return await self.__stream_json(request, iterator) + + async def library_tracks(self, request): + """Get all library tracks.""" + orderby = request.query.get('orderby', 'name') + provider_filter = request.rel_url.query.get('provider') + iterator = self.mass.music.library_tracks(orderby=orderby, provider_filter=provider_filter) + return await self.__stream_json(request, iterator) + + async def library_radios(self, request): + """Get all library radios.""" + orderby = request.query.get('orderby', 'name') + provider_filter = request.rel_url.query.get('provider') + iterator = self.mass.music.library_radios(orderby=orderby, provider_filter=provider_filter) + return await self.__stream_json(request, iterator) + + async def library_playlists(self, request): + """Get all library playlists.""" + orderby = request.query.get('orderby', 'name') + provider_filter = request.rel_url.query.get('provider') + iterator = self.mass.music.library_playlists(orderby=orderby, provider_filter=provider_filter) + return await self.__stream_json(request, iterator) async def get_item(self, request): - ''' get item full details''' + """ get item full details""" media_type_str = request.match_info.get('media_type') media_type = media_type_from_string(media_type_str) media_id = request.match_info.get('media_id') @@ -141,7 +167,7 @@ class Web(): return web.json_response(result, dumps=json_serializer) async def get_image(self, request): - ''' get item image ''' + """ get item image """ media_type_str = request.match_info.get('media_type') media_type = media_type_from_string(media_type_str) media_id = request.match_info.get('media_id') @@ -156,37 +182,35 @@ class Web(): return web.FileResponse(img_file, headers=headers) async def artist_toptracks(self, request): - ''' get top tracks for given artist ''' + """ get top tracks for given artist """ artist_id = request.match_info.get('artist_id') provider = request.rel_url.query.get('provider', 'database') - result = await self.mass.music.artist_toptracks(artist_id, provider) - return web.json_response(result, dumps=json_serializer) + iterator = self.mass.music.artist_toptracks(artist_id, provider) + return await self.__stream_json(request, iterator) async def artist_albums(self, request): - ''' get (all) albums for given artist ''' + """ get (all) albums for given artist """ artist_id = request.match_info.get('artist_id') provider = request.rel_url.query.get('provider', 'database') - result = await self.mass.music.artist_albums(artist_id, provider) - return web.json_response(result, dumps=json_serializer) + iterator = self.mass.music.artist_albums(artist_id, provider) + return await self.__stream_json(request, iterator) async def playlist_tracks(self, request): - ''' get playlist tracks from provider''' + """ get playlist tracks from provider""" playlist_id = request.match_info.get('playlist_id') - limit = int(request.query.get('limit', 50)) - offset = int(request.query.get('offset', 0)) provider = request.rel_url.query.get('provider', 'database') - result = await self.mass.music.playlist_tracks(playlist_id, provider, offset=offset, limit=limit) - return web.json_response(result, dumps=json_serializer) + iterator = self.mass.music.playlist_tracks(playlist_id, provider) + return await self.__stream_json(request, iterator) async def album_tracks(self, request): - ''' get album tracks from provider''' + """ get album tracks from provider""" album_id = request.match_info.get('album_id') provider = request.rel_url.query.get('provider','database') - result = await self.mass.music.album_tracks(album_id, provider) - return web.json_response(result, dumps=json_serializer) + iterator = self.mass.music.album_tracks(album_id, provider) + return await self.__stream_json(request, iterator) async def search(self, request): - ''' search database or providers ''' + """ search database or providers """ searchquery = request.rel_url.query.get('query') media_types_query = request.rel_url.query.get('media_types') limit = request.rel_url.query.get('media_id', 5) @@ -207,19 +231,19 @@ class Web(): return web.json_response(result, dumps=json_serializer) async def players(self, request): - ''' get all players ''' + """ get all players """ players = list(self.mass.players.players) players.sort(key=lambda x: x.name, reverse=False) return web.json_response(players, dumps=json_serializer) async def player(self, request): - ''' get single player ''' + """ get single player """ player_id = request.match_info.get('player_id') player = await self.mass.players.get_player(player_id) return web.json_response(player, dumps=json_serializer) async def player_command(self, request): - ''' issue player command''' + """ issue player command""" result = False player_id = request.match_info.get('player_id') player = await self.mass.players.get_player(player_id) @@ -238,7 +262,7 @@ class Web(): return web.json_response(result, dumps=json_serializer) async def play_media(self, request): - ''' issue player play_media command''' + """ issue player play_media command""" player_id = request.match_info.get('player_id') media_type_str = request.match_info.get('media_type') media_type = media_type_from_string(media_type_str) @@ -250,15 +274,16 @@ class Web(): return web.json_response(result, dumps=json_serializer) async def player_queue(self, request): - ''' return the items in the player's queue ''' + """ return the items in the player's queue """ player_id = request.match_info.get('player_id') - limit = int(request.query.get('limit', 50)) - offset = int(request.query.get('offset', 0)) player = await self.mass.players.get_player(player_id) - return web.json_response(player.queue.items[offset:offset+limit], dumps=json_serializer) + async def queue_tracks_iter(): + for item in player.queue.items: + yield item + return await self.__stream_json(request, queue_tracks_iter()) async def player_queue_item(self, request): - ''' return item (by index or queue item id) from the player's queue ''' + """ return item (by index or queue item id) from the player's queue """ player_id = request.match_info.get('player_id') item_id = request.match_info.get('item_id') player = await self.mass.players.get_player(player_id) @@ -275,7 +300,7 @@ class Web(): return web.FileResponse(index_file) async def websocket_handler(self, request): - ''' websockets handler ''' + """ websockets handler """ cb_id = None ws = None try: @@ -326,11 +351,11 @@ class Web(): return ws async def get_config(self, request): - ''' get the config ''' + """ get the config """ return web.json_response(self.mass.config) async def save_config(self, request): - ''' save (partial) config ''' + """ save (partial) config """ conf_key = request.match_info.get('key') conf_subkey = request.match_info.get('subkey') new_values = await request.json() @@ -354,12 +379,33 @@ class Web(): async def headers_only(self, request): return web.Response(status=200) + async def __stream_json(self, request, iterator): + """ stream items from async iterator as json object """ + resp = web.StreamResponse(status=200, + reason='OK', + headers={'Content-Type': 'application/json'}) + await resp.prepare(request) + # write json open tag + json_response = '{ "items": [' + await resp.write(json_response.encode('utf-8')) + count = 0 + async for item in iterator: + # write each item into the items object of the json + json_response = json_serializer(item) + ',' + await resp.write(json_response.encode('utf-8')) + count += 1 + # write json close tag + json_response = '], "count": %s }' % count + await resp.write((json_response).encode('utf-8')) + await resp.write_eof() + return resp + async def json_rpc(self, request): - ''' + """ implement LMS jsonrpc interface for some compatability with tools that talk to lms only support for basic commands - ''' + """ data = await request.json() LOGGER.debug("jsonrpc: %s" % data) params = data['params'] diff --git a/music_assistant/web/css/itemdetails.66e507cb.css b/music_assistant/web/css/itemdetails.66e507cb.css deleted file mode 100644 index dfd1c4ce..00000000 --- a/music_assistant/web/css/itemdetails.66e507cb.css +++ /dev/null @@ -1 +0,0 @@ -.scroller[data-v-730dcdec]{height:100%} \ No newline at end of file diff --git a/music_assistant/web/css/itemdetails.742ba64e.css b/music_assistant/web/css/itemdetails.742ba64e.css new file mode 100644 index 00000000..147b569e --- /dev/null +++ b/music_assistant/web/css/itemdetails.742ba64e.css @@ -0,0 +1 @@ +.scroller[data-v-d414543e]{height:100%} \ No newline at end of file diff --git a/music_assistant/web/index.html b/music_assistant/web/index.html index da1a6ddb..686feb51 100644 --- a/music_assistant/web/index.html +++ b/music_assistant/web/index.html @@ -1 +1 @@ -Music Assistant
\ No newline at end of file +Music Assistant
\ No newline at end of file diff --git a/music_assistant/web/js/app.0ae1c192.js b/music_assistant/web/js/app.0ae1c192.js new file mode 100644 index 00000000..3c043056 --- /dev/null +++ b/music_assistant/web/js/app.0ae1c192.js @@ -0,0 +1,2 @@ +(function(e){function t(t){for(var a,i,o=t[0],l=t[1],c=t[2],u=0,p=[];u0?r("v-list",[r("v-subheader",{staticClass:"title"},[e._v(e._s(e.header))]),e._l(e.playlists,(function(t,a){return r("listviewItem",{key:t.item_id,attrs:{item:t,totalitems:e.playlists.length,index:a,hideavatar:!1,hidetracknum:!0,hideproviders:!1,hidelibrary:!0,hidemenu:!0,onclickHandler:e.playlistSelected}})}))],2):e._e()],1)],1)},M=[],E=(r("a4d3"),r("e01a"),r("d28b"),r("caad"),r("b0c0"),r("d3b7"),r("2532"),r("3ca3"),r("ddb0"),r("96cf"),r("89ba")),V=r("d3cc"),D=a["a"].extend({components:{ListviewItem:V["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)},beforeDestroy:function(){this.$server.$off("showContextMenu"),this.$server.$off("showPlayMenu")},computed:{},methods:{showContextMenu:function(e){if(this.playlists=[],e){this.curItem=e;var t=this.$store.topBarContextItem,r=[];r.push({label:"play",action:"playmenu",icon:"play_circle_outline"}),e!==t&&r.push({label:"show_info",action:"info",icon:"info"}),0===e.in_library.length&&r.push({label:"add_library",action:"add_library",icon:"favorite_border"}),e.in_library.length>0&&r.push({label:"remove_library",action:"remove_library",icon:"favorite"}),t&&4===t.media_type&&(this.curPlaylist=t,3===e.media_type&&t.is_editable&&r.push({label:"remove_playlist",action:"remove_playlist",icon:"remove_circle_outline"})),3===e.media_type&&r.push({label:"add_playlist",action:"add_playlist",icon:"add_circle_outline"}),this.menuItems=r,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=Object(E["a"])(regeneratorRuntime.mark((function e(){var t,r,a,i,n,s,o,l,c,u,p,d,m,h,v,f,y,g,A,b,k;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:for(t=[],r=!0,a=!1,i=void 0,e.prev=4,n=this.curItem.provider_ids[Symbol.iterator]();!(r=(s=n.next()).done);r=!0)o=s.value,t.push(o.provider);e.next=12;break;case 8:e.prev=8,e.t0=e["catch"](4),a=!0,i=e.t0;case 12:e.prev=12,e.prev=13,r||null==n.return||n.return();case 15:if(e.prev=15,!a){e.next=18;break}throw i;case 18:return e.finish(15);case 19:return e.finish(12);case 20:return e.next=22,this.$server.getData("playlists");case 22:l=e.sent,c=[],u=!0,p=!1,d=void 0,e.prev=27,m=l.items[Symbol.iterator]();case 29:if(u=(h=m.next()).done){e.next=62;break}if(v=h.value,!v.is_editable||this.curPlaylist&&v.item_id===this.curPlaylist.item_id){e.next=59;break}f=!0,y=!1,g=void 0,e.prev=35,A=v.provider_ids[Symbol.iterator]();case 37:if(f=(b=A.next()).done){e.next=45;break}if(k=b.value,!t.includes(k.provider)){e.next=42;break}return c.push(v),e.abrupt("break",45);case 42:f=!0,e.next=37;break;case 45:e.next=51;break;case 47:e.prev=47,e.t1=e["catch"](35),y=!0,g=e.t1;case 51:e.prev=51,e.prev=52,f||null==A.return||A.return();case 54:if(e.prev=54,!y){e.next=57;break}throw g;case 57:return e.finish(54);case 58:return e.finish(51);case 59:u=!0,e.next=29;break;case 62:e.next=68;break;case 64:e.prev=64,e.t2=e["catch"](27),p=!0,d=e.t2;case 68:e.prev=68,e.prev=69,u||null==m.return||m.return();case 71:if(e.prev=71,!p){e.next=74;break}throw d;case 74:return e.finish(71);case 75:return e.finish(68);case 76:this.playlists=c;case 77:case"end":return e.stop()}}),e,this,[[4,8,12,20],[13,,15,19],[27,64,68,76],[35,47,51,59],[52,,54,58],[69,,71,75]])})));function t(){return e.apply(this,arguments)}return t}(),itemCommand:function(e){if("info"===e)this.$router.push({path:"/"+this.curItem.media_type+"/"+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.playlistAddRemove(this.curItem,this.curPlaylist.item_id,"playlist_remove"),this.visible=!1):(this.$server.playItem(this.curItem,e),this.visible=!1)}},playlistSelected:function(e){this.playlistAddRemove(this.curItem,e.item_id,"playlist_add"),this.visible=!1},playlistAddRemove:function(e,t){var r=this,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"playlist_add",i="track/"+e.item_id,n={provider:e.provider,action:a,action_details:t};this.$server.getData(i,n).then((function(e){"playlist_remove"===a&&r.$server.$emit("refresh_listing")}))}}}),L=D,N=r("b0af"),F=r("169a"),T=r("ce7e"),z=r("8270"),J=r("e0c7"),H=Object(u["a"])(L,O,M,!1,null,null,null),Q=H.exports;d()(H,{VCard:N["a"],VDialog:F["a"],VDivider:T["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAvatar:z["a"],VListItemContent:g["a"],VListItemTitle:g["c"],VSubheader:J["a"]});var U=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-footer",{staticStyle:{"background-color":"black"},attrs:{app:"",fixed:"",padless:"",light:"",elevation:"10"}},[a("v-card",{staticStyle:{"margin-top":"1px"},attrs:{dense:"",flat:"",light:"",subheader:"",tile:"",width:"100%",color:"#E0E0E0"}},[a("v-list-item",{attrs:{"two-line":""}},[e.curQueueItem?a("v-list-item-avatar",{attrs:{tile:""}},[a("img",{staticStyle:{border:"1px solid rgba(0,0,0,.54)"},attrs:{src:e.$server.getImageUrl(e.curQueueItem),"lazy-src":r("71db")}})]):a("v-list-item-avatar",[a("v-icon",[e._v("speaker")])],1),a("v-list-item-content",[e.curQueueItem?a("v-list-item-title",[e._v(" "+e._s(e.curQueueItem.name))]):e.$server.activePlayer?a("v-list-item-title",[e._v(" "+e._s(e.$server.activePlayer.name))]):e._e(),e.curQueueItem?a("v-list-item-subtitle",{staticStyle:{color:"primary"}},e._l(e.curQueueItem.artists,(function(t,r){return a("span",{key:r},[a("a",{on:{click:[function(r){return e.artistClick(t)},function(e){e.stopPropagation()}]}},[e._v(e._s(t.name))]),r+11&&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}})}}}),te=ee,re=(r("7c4e"),r("0e8f")),ae=r("553a"),ie=r("e449"),ne=r("8e36"),se=Object(u["a"])(te,U,Y,!1,null,"7d07386a",null),oe=se.exports;d()(se,{VBtn:m["a"],VCard:N["a"],VFlex:re["a"],VFooter:ae["a"],VIcon:h["a"],VListItem:f["a"],VListItemAction:y["a"],VListItemAvatar:z["a"],VListItemContent:g["a"],VListItemSubtitle:g["b"],VListItemTitle:g["c"],VMenu:ie["a"],VProgressLinear:ne["a"]});var le=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("v-navigation-drawer",{attrs:{right:"",app:"",clipped:"",temporary:"",width:"300"},model:{value:e.visible,callback:function(t){e.visible=t},expression:"visible"}},[r("v-card-title",{staticClass:"headline"},[r("b",[e._v(e._s(e.$t("players")))])]),r("v-list",{attrs:{dense:""}},[r("v-divider"),e._l(e.filteredPlayerIds,(function(t){return r("div",{key:t,style:e.$server.activePlayerId==t?"background-color:rgba(50, 115, 220, 0.3);":""},[r("v-list-item",{staticStyle:{"margin-left":"-5px","margin-right":"-15px"},attrs:{ripple:"",dense:""},on:{click:function(r){return e.$server.switchPlayer(e.$server.players[t].player_id)}}},[r("v-list-item-avatar",[r("v-icon",{attrs:{size:"45"}},[e._v(e._s(e.$server.players[t].is_group?"speaker_group":"speaker"))])],1),r("v-list-item-content",{staticStyle:{"margin-left":"-15px"}},[r("v-list-item-title",{staticClass:"subtitle-1"},[e._v(e._s(e.$server.players[t].name))]),r("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?r("v-list-item-action",{staticStyle:{"padding-right":"10px"}},[r("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(a){var i=a.on;return[r("v-btn",e._g({staticStyle:{color:"rgba(0,0,0,.54)"},attrs:{icon:""}},i),[r("v-flex",{staticClass:"vertical-btn",attrs:{xs12:""}},[r("v-icon",[e._v("volume_up")]),r("span",{staticClass:"overline"},[e._v(e._s(Math.round(e.$server.players[t].volume_level)))])],1)],1)]}}],null,!0)},[r("VolumeControl",{attrs:{players:e.$server.players,player_id:t}})],1)],1):e._e()],1),r("v-divider")],1)}))],2)],1)},ce=[],ue=a["a"].extend({components:{VolumeControl:$},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()},beforeDestroy:function(){this.$server.$off("showPlayersMenu"),this.$server.$off("players changed")},methods:{show:function(){this.visible=!0},getAvailablePlayers:function(){for(var e in this.filteredPlayerIds=[],this.$server.players)this.$server.players[e].enabled&&0===this.$server.players[e].group_parents.length&&this.filteredPlayerIds.push(e)}}}),pe=ue,de=(r("60ce"),r("99d9")),me=Object(u["a"])(pe,le,ce,!1,null,"71935334",null),he=me.exports;d()(me,{VBtn:m["a"],VCardTitle:de["c"],VDivider:T["a"],VFlex:re["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAction:y["a"],VListItemAvatar:z["a"],VListItemContent:g["a"],VListItemSubtitle:g["b"],VListItemTitle:g["c"],VMenu:ie["a"],VNavigationDrawer:A["a"]});var ve=a["a"].extend({name:"App",components:{NavigationMenu:k,TopBar:R,ContextMenu:Q,PlayerOSD:oe,PlayerSelect:he},data:function(){return{showPlayerSelect:!1}},created:function(){var e="",t=window.location;e=t.origin+t.pathname,this.$server.connect(e)}}),fe=ve,ye=(r("034f"),r("7496")),ge=r("a75b"),Ae=r("a797"),be=r("490a"),ke=Object(u["a"])(fe,i,n,!1,null,null,null),we=ke.exports;d()(ke,{VApp:ye["a"],VContent:ge["a"],VOverlay:Ae["a"],VProgressCircular:be["a"]});var _e=r("9483");Object(_e["a"])("".concat("","service-worker.js"),{ready:function(){},registered:function(){},cached:function(){},updatefound:function(){},updated:function(){},offline:function(){},error:function(e){}});r("4de4"),r("4160"),r("e439"),r("dbb4"),r("b64b"),r("159b");var Ie=r("2fa7"),xe=r("8c4f"),Pe=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("section",[r("v-list",{attrs:{tile:""}},e._l(e.items,(function(t){return r("v-list-item",{key:t.title,attrs:{tile:""},on:{click:function(r){return e.$router.push(t.path)}}},[r("v-list-item-icon",{staticStyle:{"margin-left":"15px"}},[r("v-icon",[e._v(e._s(t.icon))])],1),r("v-list-item-content",[r("v-list-item-title",{domProps:{textContent:e._s(t.title)}})],1)],1)})),1)],1)},Se=[],Ce={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")}},Be=Ce,Re=r("34c3"),Oe=Object(u["a"])(Be,Pe,Se,!1,null,null,null),Me=Oe.exports;d()(Oe,{VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemContent:g["a"],VListItemIcon:Re["a"],VListItemTitle:g["c"]});var Ee=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("section",[r("v-list",{attrs:{"two-line":""}},[r("RecycleScroller",{staticClass:"scroller",attrs:{items:e.items,"item-size":72,"key-field":"item_id","page-mode":""},scopedSlots:e._u([{key:"default",fn:function(t){var a=t.item;return[r("ListviewItem",{attrs:{item:a,hideavatar:3==a.media_type&&e.$store.isMobile,hidetracknum:!0,hideproviders:a.media_type<4&&e.$store.isMobile,hidelibrary:!0,hidemenu:3==a.media_type&&e.$store.isMobile,hideduration:5==a.media_type}})]}}])})],1)],1)},Ve=[],De={name:"browse",components:{ListviewItem:V["a"]},props:{mediatype:String,provider:String},data:function(){return{selected:[2],items:[]}},created:function(){this.$store.windowtitle=this.$t(this.mediatype),this.getItems()},methods:{getItems:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.abrupt("return",this.$server.getAllItems(this.mediatype,this.items));case 1:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()}},Le=De,Ne=Object(u["a"])(Le,Ee,Ve,!1,null,null,null),Fe=Ne.exports;function Te(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function ze(e){for(var t=1;t1){var i=a[1];t[i]=e(r)}})),t}a["a"].use(Ue["a"]);var je=new Ue["a"]({locale:navigator.language.split("-")[0],fallbackLocale:"en",messages:Ye()}),Xe=(r("d5e8"),r("d1e78"),r("e508")),We=(r("a899"),r("f309"));r("bf40");a["a"].use(We["a"]);var qe=new We["a"]({icons:{iconfont:"md"}}),Ze=new a["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}}}),Ke={globalStore:Ze,install:function(e,t){e.prototype.$store=Ze}},Ge=(r("99af"),r("fb6a"),r("8a79"),r("5319"),r("2b3d"),r("bc3a")),$e=r.n(Ge),et=r("3667"),tt=r.n(et),rt={timeout:6e4},at=$e.a.create(rt),it=new a["a"]({_address:"",_ws:null,data:function(){return{connected:!1,players:{},activePlayerId:null,syncStatus:[]}},methods:{connect:function(e){e.endsWith("/")||(e+="/"),this._address=e;var t=e.replace("http","ws")+"ws";this._ws=new WebSocket(t),this._ws.onopen=this._onWsConnect,this._ws.onmessage=this._onWsMessage,this._ws.onclose=this._onWsClose,this._ws.onerror=this._onWsError},toggleLibrary:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(t){var r,a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return r=t.media_type+"/"+t.item_id,a="library_remove",0===t.in_library.length&&(a="library_add"),e.next=5,this.getData(r,{provider:t.provider,action:a});case 5:t.in_library="/library_remove"===a?[]:[t.provider];case 6:case"end":return e.stop()}}),e,this)})));function t(t){return e.apply(this,arguments)}return t}(),getImageUrl:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"image",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return e&&e.media_type?"database"===e.provider?"".concat(this._address,"api/").concat(e.media_type,"/").concat(e.item_id,"/image?type=").concat(t,"&provider=").concat(e.provider,"&size=").concat(r):e.metadata&&e.metadata["image"]?e.metadata["image"]:e.album&&e.album.metadata&&e.album.metadata["image"]?e.album.metadata["image"]:e.artist&&e.artist.metadata&&e.artist.metadata["image"]?e.artist.metadata["image"]:"":""},getData:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(t){var r,a,i,n=arguments;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return r=n.length>1&&void 0!==n[1]?n[1]:{},a=this._address+"api/"+t,e.next=4,at.get(a,{params:r});case 4:return i=e.sent,e.abrupt("return",i.data);case 6:case"end":return e.stop()}}),e,this)})));function t(t){return e.apply(this,arguments)}return t}(),postData:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(t,r){var a,i;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return a=this._address+"api/"+t,e.next=3,at.post(a,r);case 3:return i=e.sent,e.abrupt("return",i.data);case 5:case"end":return e.stop()}}),e,this)})));function t(t,r){return e.apply(this,arguments)}return t}(),getAllItems:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(t,r){var i,n,s,o,l=arguments;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:i=l.length>2&&void 0!==l[2]?l[2]:{},n=this._address+"api/"+t,i&&(s=new URLSearchParams(i),n+="?"+s.toString()),o=0,tt()(n).node("items.*",(function(e){a["a"].set(r,o,e),o+=1})).done((function(e){0===r.length?r=[]:r.length>o&&(r=r.slice(0,o))}));case 5:case"end":return e.stop()}}),e,this)})));function t(t,r){return e.apply(this,arguments)}return t}(),playerCommand:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.activePlayerId,a={player_id:r,cmd:e,cmd_args:t};this._ws.send(JSON.stringify({message:"player command",message_details:a}))},playItem:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(t,r){var a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return this.$store.loading=!0,a="players/"+this.activePlayerId+"/play_media/"+t.media_type+"/"+t.item_id+"/"+r,e.next=4,this.getData(a);case 4:this.$store.loading=!1;case 5:case"end":return e.stop()}}),e,this)})));function t(t,r){return e.apply(this,arguments)}return t}(),switchPlayer:function(e){this.activePlayerId=e,localStorage.setItem("activePlayerId",e),this.$emit("new player selected",e)},_onWsConnect:function(){this.connected=!0;var e=JSON.stringify({message:"players",message_details:null});this._ws.send(e)},_onWsMessage:function(e){var t=JSON.parse(e.data);if("player changed"===t.message)a["a"].set(this.players,t.message_details.player_id,t.message_details);else if("player added"===t.message)a["a"].set(this.players,t.message_details.player_id,t.message_details),this._selectActivePlayer(),this.$emit("players changed");else if("player removed"===t.message)a["a"].delete(this.players,t.message_details.player_id),this._selectActivePlayer(),this.$emit("players changed");else if("players"===t.message){var r=!0,i=!1,n=void 0;try{for(var s,o=t.message_details[Symbol.iterator]();!(r=(s=o.next()).done);r=!0){var l=s.value;a["a"].set(this.players,l.player_id,l)}}catch(c){i=!0,n=c}finally{try{r||null==o.return||o.return()}finally{if(i)throw n}}this._selectActivePlayer(),this.$emit("players changed")}else"music sync status"===t.message?this.syncStatus=t.message_details:this.$emit(t.message,t.message_details)},_onWsClose:function(e){this.connected=!1,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 r in this.players)if(this.players[r].enabled&&0===this.players[r].group_parents.length){this.switchPlayer(r);break}}}}},computed:{activePlayer:function(){return this.activePlayerId?this.players[this.activePlayerId]:null}}}),nt={server:it,install:function(e,t){e.prototype.$server=it}};a["a"].config.productionTip=!1,a["a"].use(Xe["a"]),a["a"].use(Ke),a["a"].use(nt),String.prototype.formatDuration=function(){var e=parseInt(this,10),t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=e-3600*t-60*r;return t<10&&(t="0"+t),r<10&&(r="0"+r),a<10&&(a="0"+a),"00"===t?r+":"+a:t+":"+r+":"+a},new a["a"]({router:Qe,i18n:je,vuetify:qe,render:function(e){return e(we)}}).$mount("#app")},"57d1":function(e,t){e.exports="data:image/png;base64,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"},"60ce":function(e,t,r){"use strict";var a=r("1c3f"),i=r.n(a);i.a},"71db":function(e,t,r){e.exports=r.p+"img/file.813f9dad.png"},"7c4e":function(e,t,r){"use strict";var a=r("d597"),i=r.n(a);i.a},"82f5":function(e,t,r){e.exports=r.p+"img/sonos.72e2fecb.png"},"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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"},"9e01":function(e,t,r){var a={"./aac.png":"9a36","./chromecast.png":"57d1","./default_artist.png":"4bfb","./file.png":"71db","./flac.png":"fb30","./hires.png":"f5e3","./homeassistant.png":"3232","./http_streamer.png":"2755","./logo.png":"cf05","./mp3.png":"f1d4","./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 i(e){var t=n(e);return r(t)}function n(e){if(!r.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}i.keys=function(){return Object.keys(a)},i.resolve=n,e.exports=i,i.id="9e01"},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!","conf":{"enabled":"Ingeschakeld","base":"Algemene instellingen","musicproviders":"Muziek providers","playerproviders":"Speler providers","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":"Publiceer spelers naar Home Assistant","hass_player_power":"Verbind speler aan/uit met homeassistant entity","hass_player_source":"Benodigde bron op de verbonden homeassistant entity (optioneel)","hass_player_volume":"Verbind volume van speler aan een homeassistant entity","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","player_group_with":"Groupeer deze speler met een andere (hoofd)speler","player_mute_power":"Gebruik mute als aan/uit","player_disable_vol":"Schakel volume bediening helemaal uit","player_group_vol":"Pas groep volume toe op onderliggende spelers (alleen groep spelers)","player_group_pow":"Pas groep aan/uit toe op onderliggende spelers (alleen groep spelers)","player_power_play":"Automatisch afspelen bij inschakelen","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)."},"players":"Spelers","play":"Afspelen","play_on":"Afspelen op:","play_now":"Nu afspelen","play_next":"Speel als volgende af","add_queue":"Voeg toe aan wachtrij","show_info":"Bekijk informatie","queue_next_tracks":"Aankomend","queue_previous_tracks":"Reeds afgespeeld","read_more":"meer lezen","state":{"playing":"afspelen","stopped":"gestopt","paused":"gepauzeerd","off":"uitgeschakeld"}}')},bd18:function(e,t,r){e.exports=r.p+"img/squeezebox.60631223.png"},cf05:function(e,t,r){e.exports=r.p+"img/logo.c079bd97.png"},d3cc:function(e,t,r){"use strict";var a=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("v-list-item",{attrs:{ripple:""},on:{click:function(t){return e.itemClicked(e.item)}}},[e.hideavatar?e._e():a("v-list-item-avatar",{attrs:{tile:"",color:"grey"}},[a("img",{staticStyle:{border:"1px solid rgba(0,0,0,.22)"},attrs:{src:e.$server.getImageUrl(e.item,"image",80),"lazy-src":r("71db")}})]),a("v-list-item-content",[a("v-list-item-title",[e._v(" "+e._s(e.item.name)+" "),e.item.version?a("span",[e._v("("+e._s(e.item.version)+")")]):e._e()]),e.item.artists?a("v-list-item-subtitle",[e._l(e.item.artists,(function(t,r){return a("span",{key:t.item_id},[a("a",{on:{click:[function(r){return e.itemClicked(t)},function(e){e.stopPropagation()}]}},[e._v(e._s(t.name))]),r+10?a("v-icon",{attrs:{height:"20"}},[e._v("favorite")]):e._e(),0==e.item.in_library.length?a("v-icon",{attrs:{height:"20"}},[e._v("favorite_border")]):e._e()],1)]}}],null,!1,993341054)},[e.item.in_library.length>0?a("span",[e._v(e._s(e.$t("remove_library")))]):e._e(),0==e.item.in_library.length?a("span",[e._v(e._s(e.$t("add_library")))]):e._e()])],1),!e.hideduration&&e.item.duration?a("v-list-item-action",[e._v(e._s(e.item.duration.toString().formatDuration()))]):e._e(),e.hidemenu?e._e():a("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),a("v-divider")],1)},i=[],n=(r("a4d3"),r("e01a"),r("d28b"),r("a9e3"),r("d3b7"),r("3ca3"),r("ddb0"),r("2b0e")),s=r("e00a"),o=n["a"].extend({components:{ProviderIcons:s["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{}},computed:{isHiRes:function(){var e=!0,t=!1,r=void 0;try{for(var a,i=this.item.provider_ids[Symbol.iterator]();!(e=(a=i.next()).done);e=!0){var n=a.value;if(n.quality>6)return!0}}catch(s){t=!0,r=s}finally{try{e||null==i.return||i.return()}finally{if(t)throw r}}return!1}},mounted:function(){},methods:{itemClicked:function(e){if(this.onclickHandler)return this.onclickHandler(e);var 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(e){this.$server.$emit("showContextMenu",e)},toggleLibrary:function(e){this.$server.toggleLibrary(e)}}}),l=o,c=r("2877"),u=r("6544"),p=r.n(u),d=r("8336"),m=r("ce7e"),h=r("132d"),v=r("da13"),f=r("1800"),y=r("8270"),g=r("5d23"),A=r("3a2f"),b=Object(c["a"])(l,a,i,!1,null,null,null);t["a"]=b.exports;p()(b,{VBtn:d["a"],VDivider:m["a"],VIcon:h["a"],VListItem:v["a"],VListItemAction:f["a"],VListItemAvatar:y["a"],VListItemContent:g["a"],VListItemSubtitle:g["b"],VListItemTitle:g["c"],VTooltip:A["a"]})},d597:function(e,t,r){},e00a:function(e,t,r){"use strict";var a=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",e._l(e.uniqueProviders,(function(t){return a("img",{key:t.provider,staticStyle:{"margin-right":"6px","margin-top":"6px"},attrs:{height:e.height,src:r("9e01")("./"+t.provider+".png")}})})),0)},i=[],n=(r("4160"),r("c975"),r("a9e3"),r("159b"),r("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(r){var a=r["provider"];-1===t.indexOf(a)&&(t.push(a),e.push(r))})),e):[]}},mounted:function(){},methods:{}}),o=s,l=r("2877"),c=Object(l["a"])(o,a,i,!1,null,null,null);t["a"]=c.exports},e428:function(e,t,r){e.exports=r.p+"img/tunein.ca1c1bb0.png"},edbf:function(e,t,r){e.exports=r.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!","conf":{"enabled":"Enabled","base":"Generic settings","musicproviders":"Music providers","playerproviders":"Player providers","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":"Publish players to Home Assistant","hass_player_power":"Attach player power to homeassistant entity","hass_player_source":"Source on the homeassistant entity (optional)","hass_player_volume":"Attach player volume to homeassistant entity","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","player_group_with":"Group this player to another (parent)player","player_mute_power":"Use muting as power control","player_disable_vol":"Disable volume controls","player_group_vol":"Apply group volume to childs (for group players only)","player_group_pow":"Apply group power based on childs (for group players only)","player_power_play":"Issue play command on power on","file_prov_music_path":"Path to music files","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)"},"players":"Players","play":"Play","play_on":"Play on:","play_now":"Play Now","play_next":"Play Next","add_queue":"Add to Queue","show_info":"Show info","queue_next_tracks":"Next tracks","queue_previous_tracks":"Played tracks","read_more":"read more","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,r){e.exports=r.p+"img/hires.e97b001e.png"},fb30:function(e,t){e.exports="data:image/png;base64,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"}}); +//# sourceMappingURL=app.0ae1c192.js.map \ No newline at end of file diff --git a/music_assistant/web/js/app.0ae1c192.js.map b/music_assistant/web/js/app.0ae1c192.js.map new file mode 100644 index 00000000..fff4fb43 --- /dev/null +++ b/music_assistant/web/js/app.0ae1c192.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?a9d7","webpack:///./src/assets/qobuz.png","webpack:///./src/assets/spotify.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/App.vue?49f1","webpack:///./src/components/NavigationMenu.vue?e9f2","webpack:///src/components/NavigationMenu.vue","webpack:///./src/components/NavigationMenu.vue?f679","webpack:///./src/components/NavigationMenu.vue","webpack:///./src/components/TopBar.vue?5bc5","webpack:///src/components/TopBar.vue","webpack:///./src/components/TopBar.vue?8cdd","webpack:///./src/components/TopBar.vue","webpack:///./src/components/ContextMenu.vue?823d","webpack:///src/components/ContextMenu.vue","webpack:///./src/components/ContextMenu.vue?03fa","webpack:///./src/components/ContextMenu.vue","webpack:///./src/components/PlayerOSD.vue?7cc2","webpack:///./src/components/VolumeControl.vue?67ce","webpack:///src/components/VolumeControl.vue","webpack:///./src/components/VolumeControl.vue?0e80","webpack:///./src/components/VolumeControl.vue","webpack:///src/components/PlayerOSD.vue","webpack:///./src/components/PlayerOSD.vue?1917","webpack:///./src/components/PlayerOSD.vue?3e15","webpack:///./src/components/PlayerSelect.vue?5280","webpack:///src/components/PlayerSelect.vue","webpack:///./src/components/PlayerSelect.vue?ed4c","webpack:///./src/components/PlayerSelect.vue?2bb5","webpack:///src/App.vue","webpack:///./src/App.vue?0bd2","webpack:///./src/App.vue?4f7e","webpack:///./src/registerServiceWorker.js","webpack:///./src/views/Home.vue?6ef4","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?f351","webpack:///./src/views/Home.vue","webpack:///./src/views/Browse.vue?dbb6","webpack:///src/views/Browse.vue","webpack:///./src/views/Browse.vue?0b2d","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/PlayerSelect.vue?1de5","webpack:///./src/assets/file.png","webpack:///./src/components/PlayerOSD.vue?a4df","webpack:///./src/assets/sonos.png","webpack:///./src/assets/vorbis.png","webpack:///./src/assets/aac.png","webpack:///./src/assets sync ^\\.\\/.*\\.png$","webpack:///./src/assets/squeezebox.png","webpack:///./src/assets/logo.png","webpack:///./src/components/ListviewItem.vue?dbe2","webpack:///src/components/ListviewItem.vue","webpack:///./src/components/ListviewItem.vue?6ea0","webpack:///./src/components/ListviewItem.vue","webpack:///./src/components/ProviderIcons.vue?793a","webpack:///src/components/ProviderIcons.vue","webpack:///./src/components/ProviderIcons.vue?97c3","webpack:///./src/components/ProviderIcons.vue","webpack:///./src/assets/tunein.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","map","webpackContext","req","id","webpackContextResolve","keys","_vm","this","_h","$createElement","_c","_self","$route","path","attrs","showPlayerSelect","$store","loading","staticRenderFns","model","callback","$$v","$set","expression","_l","item","title","on","$event","$router","_v","_s","icon","showNavigationMenu","props","items","mounted","methods","component","VBtn","VIcon","VList","VListItem","VListItemAction","VListItemContent","VListItemTitle","VNavigationDrawer","color","topBarTransparent","_e","staticClass","staticStyle","windowtitle","go","$server","$emit","topBarContextItem","computed","VAppBar","VLayout","VSpacer","visible","playlists","header","subheader","label","itemCommand","action","$t","index","item_id","playlistSelected","components","ListviewItem","watch","menuItems","curItem","curPlaylist","playerQueueItems","created","$on","showContextMenu","showPlayMenu","beforeDestroy","$off","mediaItem","curBrowseContext","in_library","media_type","is_editable","cmd","query","showPlaylistsMenu","playlistAddRemove","playItem","provider","track","action_details","playlistId","getData","endpoint","params","VCard","VDialog","VDivider","VListItemAvatar","VSubheader","getImageUrl","curQueueItem","activePlayer","artist","artistindex","artistClick","stopPropagation","artists","playerCurTimeStr","playerTotalTimeStr","style","progressBarWidth","progress","playerCommand","state","isMobile","nativeOn","preventDefault","scopedSlots","_u","fn","ref","_g","Math","round","volume_level","players","player_id","is_group","child_id","powered","togglePlayerPower","disable_volume","setPlayerVolume","volumePlayerIds","allIds","playerId","newVolume","VListItemSubtitle","VSlider","VolumeControl","curQueueItemId","val","cur_queue_item","totalSecs","duration","curSecs","cur_time","curPercent","toString","formatDuration","innerWidth","cmd_opt","activePlayerId","url","VFlex","VFooter","VMenu","VProgressLinear","switchPlayer","filteredPlayerIds","show","getAvailablePlayers","enabled","group_parents","VCardTitle","NavigationMenu","TopBar","ContextMenu","PlayerOSD","PlayerSelect","serverAddress","loc","origin","pathname","connect","VApp","VContent","VOverlay","VProgressCircular","register","process","ready","registered","cached","updatefound","updated","offline","domProps","VListItemIcon","mediatype","String","selected","getItems","Vue","use","VueRouter","routes","Home","route","Browse","router","loadLocaleMessages","locales","require","messages","forEach","matched","match","locale","VueI18n","navigator","language","split","fallbackLocale","Vuetify","icons","iconfont","globalStore","isInStandaloneMode","handleWindowOptions","addEventListener","destroyed","removeEventListener","body","clientWidth","standalone","matchMedia","matches","install","options","axiosConfig","_axios","axios","server","_address","_ws","connected","syncStatus","endsWith","wsAddress","replace","WebSocket","onopen","_onWsConnect","onmessage","_onWsMessage","onclose","_onWsClose","_onWsError","toggleLibrary","imageType","size","metadata","album","postData","post","getAllItems","list","urlParams","URLSearchParams","oboe","node","set","done","fullList","msgDetails","cmd_args","send","JSON","stringify","message_details","queueOpt","newPlayerId","localStorage","setItem","msg","parse","_selectActivePlayer","delete","close","lastPlayerId","getItem","config","productionTip","VueVirtualScroller","store","secNum","parseInt","hours","floor","minutes","seconds","i18n","vuetify","render","h","App","$mount","itemClicked","hideavatar","version","hidetracknum","track_number","disc_number","owner","hideproviders","provider_ids","hidelibrary","hideduration","hidemenu","menuClick","ProviderIcons","Number","totalitems","Boolean","onclickHandler","isHiRes","VTooltip","prov","height","providerIds","Array","uniqueProviders","output","indexOf"],"mappings":"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","file":"js/app.0ae1c192.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~search\":\"config~search\",\"config\":\"config\",\"itemdetails~playerqueue~search\":\"itemdetails~playerqueue~search\",\"search\":\"search\",\"itemdetails\":\"itemdetails\",\"playerqueue\":\"playerqueue\"}[chunkId]||chunkId) + \".\" + {\"config~search\":\"9f3e890b\",\"config\":\"ccaf05b8\",\"itemdetails~playerqueue~search\":\"1e2b2bfd\",\"search\":\"0b1a2f05\",\"itemdetails\":\"2785d492\",\"playerqueue\":\"215152f1\"}[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~search\":1,\"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~search\":\"config~search\",\"config\":\"config\",\"itemdetails~playerqueue~search\":\"itemdetails~playerqueue~search\",\"search\":\"search\",\"itemdetails\":\"itemdetails\",\"playerqueue\":\"playerqueue\"}[chunkId]||chunkId) + \".\" + {\"config~search\":\"af60f7e1\",\"config\":\"18def958\",\"itemdetails~playerqueue~search\":\"93e2919b\",\"search\":\"31d6cfe0\",\"itemdetails\":\"742ba64e\",\"playerqueue\":\"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/vuetify-loader/lib/loader.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=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/vuetify-loader/lib/loader.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=style&index=0&lang=css&\"","module.exports = __webpack_public_path__ + \"img/qobuz.c7eb9a76.png\";","module.exports = __webpack_public_path__ + \"img/spotify.1f3fb1af.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\";","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-content',[_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 }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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 }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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.playlistSelected}})})],2):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n\r\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=e53ca466&\"\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\"}},[_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)],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),_c('v-list-item',{staticStyle:{\"height\":\"44px\",\"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:{\"small\":\"\",\"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:\"overline\"},[_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:{\"small\":\"\",\"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.activePlayer.volume_level)))])],1)],1)]}}],null,false,1951340450)},[_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\":\"20px\",\"margin-right\":\"15px\"}},[_c('v-btn',{attrs:{\"small\":\"\",\"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:\"overline\"},[_vm._v(_vm._s(_vm.$server.activePlayer.name))]):_c('span',{staticClass:\"overline\"})],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\"}},[(!_vm.players[child_id].disable_volume)?_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')}}}):_vm._e()],1)],1),_c('v-divider')],1)})],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=65f7b2c2&\"\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","\n\n\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=7d07386a&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=7d07386a&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 \"7d07386a\",\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 { VFlex } from 'vuetify/lib/components/VGrid';\nimport { VFooter } from 'vuetify/lib/components/VFooter';\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 { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VProgressLinear } from 'vuetify/lib/components/VProgressLinear';\ninstallComponents(component, {VBtn,VCard,VFlex,VFooter,VIcon,VListItem,VListItemAction,VListItemAvatar,VListItemContent,VListItemSubtitle,VListItemTitle,VMenu,VProgressLinear})\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',[_c('v-icon',{attrs:{\"size\":\"45\"}},[_vm._v(_vm._s(_vm.$server.players[playerId].is_group ? '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 }","\n\n\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=71935334&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=71935334&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 \"71935334\",\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","\n\n\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=0c87dcf5&\"\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 { VContent } from 'vuetify/lib/components/VContent';\nimport { VOverlay } from 'vuetify/lib/components/VOverlay';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\ninstallComponents(component, {VApp,VContent,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 console.log('New content is available; please refresh.')\n },\n offline () {\n console.log('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 }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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('v-list',{attrs:{\"two-line\":\"\"}},[_c('RecycleScroller',{staticClass:\"scroller\",attrs:{\"items\":_vm.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}})]}}])})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=66d93c1a&\"\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\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VList } from 'vuetify/lib/components/VList';\ninstallComponents(component, {VList})\n","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'\n// import Vuetify from 'vuetify'\nimport Vuetify from 'vuetify/lib'\nimport 'vuetify/dist/vuetify.min.css'\n\nVue.use(Vuetify)\n\nexport default new Vuetify({\n icons: {\n iconfont: 'md'\n }\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 connect (serverAddress) {\n // Connect to the server\n if (!serverAddress.endsWith('/')) {\n serverAddress = serverAddress + '/'\n }\n this._address = serverAddress\n let 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 let endpoint = item.media_type + '/' + item.item_id\n let action = 'library_remove'\n if (item.in_library.length === 0) {\n action = 'library_add'\n }\n await this.getData(endpoint, { provider: item.provider, action: action })\n if (action === '/library_remove') {\n item.in_library = []\n } else {\n item.in_library = [item.provider]\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') {\n return `${this._address}api/${mediaItem.media_type}/${mediaItem.item_id}/image?type=${imageType}&provider=${mediaItem.provider}&size=${size}`\n } else if (mediaItem.metadata && mediaItem.metadata['image']) {\n return mediaItem.metadata['image']\n } else if (mediaItem.album && mediaItem.album.metadata && mediaItem.album.metadata['image']) {\n return mediaItem.album.metadata['image']\n } else if (mediaItem.artist && mediaItem.artist.metadata && mediaItem.artist.metadata['image']) {\n return mediaItem.artist.metadata['image']\n } else return ''\n },\n\n async getData (endpoint, params = {}) {\n // get data from the server\n let url = this._address + 'api/' + endpoint\n let result = await _axios.get(url, { params: params })\n return result.data\n },\n\n async postData (endpoint, data) {\n // post data to the server\n let url = this._address + 'api/' + endpoint\n let result = await _axios.post(url, data)\n return result.data\n },\n\n async getAllItems (endpoint, list, params = {}) {\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 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 === 0) {\n list = []\n } else if (list.length > index) {\n list = list.slice(0, index)\n }\n })\n },\n\n playerCommand (cmd, cmd_opt = null, playerId = this.activePlayerId) {\n let msgDetails = {\n player_id: playerId,\n cmd: cmd,\n cmd_args: cmd_opt\n }\n this._ws.send(JSON.stringify({ message: 'player command', message_details: msgDetails }))\n },\n\n async playItem (item, queueOpt) {\n this.$store.loading = true\n let endpoint = 'players/' + this.activePlayerId + '/play_media/' + item.media_type + '/' + item.item_id + '/' + queueOpt\n await this.getData(endpoint)\n this.$store.loading = false\n },\n\n switchPlayer (newPlayerId) {\n this.activePlayerId = newPlayerId\n localStorage.setItem('activePlayerId', newPlayerId)\n this.$emit('new player selected', newPlayerId)\n },\n\n _onWsConnect () {\n // Websockets connection established\n // console.log('Connected to server ' + this._address)\n this.connected = true\n // request all players\n let data = JSON.stringify({ message: 'players', message_details: null })\n this._ws.send(data)\n },\n\n _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 === 'players') {\n for (var item of msg.message_details) {\n Vue.set(this.players, item.player_id, item)\n }\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 // console.log('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 let 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 (let 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 (let 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'\n\nVue.config.productionTip = false\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/vuetify-loader/lib/loader.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=style&index=0&id=71935334&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/vuetify-loader/lib/loader.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=style&index=0&id=71935334&scoped=true&lang=css&\"","module.exports = __webpack_public_path__ + \"img/file.813f9dad.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/vuetify-loader/lib/loader.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=style&index=0&id=7d07386a&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/vuetify-loader/lib/loader.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=style&index=0&id=7d07386a&scoped=true&lang=css&\"","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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\"","var map = {\n\t\"./aac.png\": \"9a36\",\n\t\"./chromecast.png\": \"57d1\",\n\t\"./default_artist.png\": \"4bfb\",\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\"./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\";","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',{attrs:{\"ripple\":\"\"},on:{\"click\":function($event){return _vm.itemClicked(_vm.item)}}},[(!_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('img',{attrs:{\"src\":require('../assets/hires.png'),\"height\":\"20\"}})]):_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.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,993341054)},[(_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 }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=07f350ca&\"\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 }","\r\n\r\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=39dc952a&\"\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 = __webpack_public_path__ + \"img/web.798ba28f.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"img/hires.e97b001e.png\";","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""} \ No newline at end of file diff --git a/music_assistant/web/js/app.a7d20a64.js b/music_assistant/web/js/app.a7d20a64.js deleted file mode 100644 index 547afa99..00000000 --- a/music_assistant/web/js/app.a7d20a64.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(e){function t(t){for(var a,i,o=t[0],l=t[1],c=t[2],u=0,p=[];u0?r("v-list",[r("v-subheader",{staticClass:"title"},[e._v(e._s(e.header))]),e._l(e.playlists,(function(t,a){return r("listviewItem",{key:t.item_id,attrs:{item:t,totalitems:e.playlists.length,index:a,hideavatar:!1,hidetracknum:!0,hideproviders:!1,hidelibrary:!0,hidemenu:!0,onclickHandler:e.playlistSelected}})}))],2):e._e()],1)],1)},M=[],E=(r("a4d3"),r("e01a"),r("d28b"),r("caad"),r("b0c0"),r("d3b7"),r("2532"),r("3ca3"),r("ddb0"),r("96cf"),r("89ba")),D=r("d3cc"),V=a["a"].extend({components:{ListviewItem:D["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)},beforeDestroy:function(){this.$server.$off("showContextMenu"),this.$server.$off("showPlayMenu")},computed:{},methods:{showContextMenu:function(e){if(this.playlists=[],e){this.curItem=e;var t=this.$store.topBarContextItem,r=[];r.push({label:"play",action:"playmenu",icon:"play_circle_outline"}),e!==t&&r.push({label:"show_info",action:"info",icon:"info"}),0===e.in_library.length&&r.push({label:"add_library",action:"add_library",icon:"favorite_border"}),e.in_library.length>0&&r.push({label:"remove_library",action:"remove_library",icon:"favorite"}),t&&4===t.media_type&&(this.curPlaylist=t,3===e.media_type&&t.is_editable&&r.push({label:"remove_playlist",action:"remove_playlist",icon:"remove_circle_outline"})),3===e.media_type&&r.push({label:"add_playlist",action:"add_playlist",icon:"add_circle_outline"}),this.menuItems=r,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=Object(E["a"])(regeneratorRuntime.mark((function e(){var t,r,a,i,n,s,o,l,c,u,p,d,m,h,v,f,y,g,b,A,k;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:for(t=[],r=!0,a=!1,i=void 0,e.prev=4,n=this.curItem.provider_ids[Symbol.iterator]();!(r=(s=n.next()).done);r=!0)o=s.value,t.push(o.provider);e.next=12;break;case 8:e.prev=8,e.t0=e["catch"](4),a=!0,i=e.t0;case 12:e.prev=12,e.prev=13,r||null==n.return||n.return();case 15:if(e.prev=15,!a){e.next=18;break}throw i;case 18:return e.finish(15);case 19:return e.finish(12);case 20:return e.next=22,this.$server.getData("playlists");case 22:l=e.sent,c=[],u=!0,p=!1,d=void 0,e.prev=27,m=l[Symbol.iterator]();case 29:if(u=(h=m.next()).done){e.next=62;break}if(v=h.value,!v.is_editable||this.curPlaylist&&v.item_id===this.curPlaylist.item_id){e.next=59;break}f=!0,y=!1,g=void 0,e.prev=35,b=v.provider_ids[Symbol.iterator]();case 37:if(f=(A=b.next()).done){e.next=45;break}if(k=A.value,!t.includes(k.provider)){e.next=42;break}return c.push(v),e.abrupt("break",45);case 42:f=!0,e.next=37;break;case 45:e.next=51;break;case 47:e.prev=47,e.t1=e["catch"](35),y=!0,g=e.t1;case 51:e.prev=51,e.prev=52,f||null==b.return||b.return();case 54:if(e.prev=54,!y){e.next=57;break}throw g;case 57:return e.finish(54);case 58:return e.finish(51);case 59:u=!0,e.next=29;break;case 62:e.next=68;break;case 64:e.prev=64,e.t2=e["catch"](27),p=!0,d=e.t2;case 68:e.prev=68,e.prev=69,u||null==m.return||m.return();case 71:if(e.prev=71,!p){e.next=74;break}throw d;case 74:return e.finish(71);case 75:return e.finish(68);case 76:this.playlists=c;case 77:case"end":return e.stop()}}),e,this,[[4,8,12,20],[13,,15,19],[27,64,68,76],[35,47,51,59],[52,,54,58],[69,,71,75]])})));function t(){return e.apply(this,arguments)}return t}(),itemCommand:function(e){if("info"===e)this.$router.push({path:"/"+this.curItem.media_type+"/"+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.playlistAddRemove(this.curItem,this.curPlaylist.item_id,"playlist_remove"),this.visible=!1):(this.$server.playItem(this.curItem,e),this.visible=!1)}},playlistSelected:function(e){this.playlistAddRemove(this.curItem,e.item_id,"playlist_add"),this.visible=!1},playlistAddRemove:function(e,t){var r=this,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"playlist_add",i="track/"+e.item_id,n={provider:e.provider,action:a,action_details:t};this.$server.getData(i,n).then((function(e){"playlist_remove"===a&&r.$server.$emit("refresh_listing")}))}}}),L=V,N=r("b0af"),F=r("169a"),T=r("ce7e"),z=r("8270"),J=r("e0c7"),H=Object(u["a"])(L,R,M,!1,null,null,null),Q=H.exports;d()(H,{VCard:N["a"],VDialog:F["a"],VDivider:T["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAvatar:z["a"],VListItemContent:g["a"],VListItemTitle:g["c"],VSubheader:J["a"]});var j=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("v-footer",{staticStyle:{"background-color":"black"},attrs:{app:"",fixed:"",padless:"",light:"",elevation:"10"}},[a("v-card",{staticStyle:{"margin-top":"1px"},attrs:{dense:"",flat:"",light:"",subheader:"",tile:"",width:"100%",color:"#E0E0E0"}},[a("v-list-item",{attrs:{"two-line":""}},[e.curQueueItem?a("v-list-item-avatar",{attrs:{tile:""}},[a("img",{staticStyle:{border:"1px solid rgba(0,0,0,.54)"},attrs:{src:e.$server.getImageUrl(e.curQueueItem),"lazy-src":r("71db")}})]):a("v-list-item-avatar",[a("v-icon",[e._v("speaker")])],1),a("v-list-item-content",[e.curQueueItem?a("v-list-item-title",[e._v(" "+e._s(e.curQueueItem.name))]):e.$server.activePlayer?a("v-list-item-title",[e._v(" "+e._s(e.$server.activePlayer.name))]):e._e(),e.curQueueItem?a("v-list-item-subtitle",{staticStyle:{color:"primary"}},e._l(e.curQueueItem.artists,(function(t,r){return a("span",{key:r},[a("a",{on:{click:[function(r){return e.artistClick(t)},function(e){e.stopPropagation()}]}},[e._v(e._s(t.name))]),r+11&&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}})}}}),te=ee,re=(r("7c4e"),r("0e8f")),ae=r("553a"),ie=r("e449"),ne=r("8e36"),se=Object(u["a"])(te,j,U,!1,null,"7d07386a",null),oe=se.exports;d()(se,{VBtn:m["a"],VCard:N["a"],VFlex:re["a"],VFooter:ae["a"],VIcon:h["a"],VListItem:f["a"],VListItemAction:y["a"],VListItemAvatar:z["a"],VListItemContent:g["a"],VListItemSubtitle:g["b"],VListItemTitle:g["c"],VMenu:ie["a"],VProgressLinear:ne["a"]});var le=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("v-navigation-drawer",{attrs:{right:"",app:"",clipped:"",temporary:"",width:"300"},model:{value:e.visible,callback:function(t){e.visible=t},expression:"visible"}},[r("v-card-title",{staticClass:"headline"},[r("b",[e._v(e._s(e.$t("players")))])]),r("v-list",{attrs:{dense:""}},[r("v-divider"),e._l(e.filteredPlayerIds,(function(t){return r("div",{key:t,style:e.$server.activePlayerId==t?"background-color:rgba(50, 115, 220, 0.3);":""},[r("v-list-item",{staticStyle:{"margin-left":"-5px","margin-right":"-15px"},attrs:{ripple:"",dense:""},on:{click:function(r){return e.$server.switchPlayer(e.$server.players[t].player_id)}}},[r("v-list-item-avatar",[r("v-icon",{attrs:{size:"45"}},[e._v(e._s(e.$server.players[t].is_group?"speaker_group":"speaker"))])],1),r("v-list-item-content",{staticStyle:{"margin-left":"-15px"}},[r("v-list-item-title",{staticClass:"subtitle-1"},[e._v(e._s(e.$server.players[t].name))]),r("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?r("v-list-item-action",{staticStyle:{"padding-right":"10px"}},[r("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(a){var i=a.on;return[r("v-btn",e._g({staticStyle:{color:"rgba(0,0,0,.54)"},attrs:{icon:""}},i),[r("v-flex",{staticClass:"vertical-btn",attrs:{xs12:""}},[r("v-icon",[e._v("volume_up")]),r("span",{staticClass:"overline"},[e._v(e._s(Math.round(e.$server.players[t].volume_level)))])],1)],1)]}}],null,!0)},[r("VolumeControl",{attrs:{players:e.$server.players,player_id:t}})],1)],1):e._e()],1),r("v-divider")],1)}))],2)],1)},ce=[],ue=a["a"].extend({components:{VolumeControl:$},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()},beforeDestroy:function(){this.$server.$off("showPlayersMenu"),this.$server.$off("players changed")},methods:{show:function(){this.visible=!0},getAvailablePlayers:function(){for(var e in this.filteredPlayerIds=[],this.$server.players)this.$server.players[e].enabled&&0===this.$server.players[e].group_parents.length&&this.filteredPlayerIds.push(e)}}}),pe=ue,de=(r("60ce"),r("99d9")),me=Object(u["a"])(pe,le,ce,!1,null,"71935334",null),he=me.exports;d()(me,{VBtn:m["a"],VCardTitle:de["c"],VDivider:T["a"],VFlex:re["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAction:y["a"],VListItemAvatar:z["a"],VListItemContent:g["a"],VListItemSubtitle:g["b"],VListItemTitle:g["c"],VMenu:ie["a"],VNavigationDrawer:b["a"]});var ve=a["a"].extend({name:"App",components:{NavigationMenu:k,TopBar:B,ContextMenu:Q,PlayerOSD:oe,PlayerSelect:he},data:function(){return{showPlayerSelect:!1}},created:function(){var e="",t=window.location;e=t.origin+t.pathname,this.$server.connect(e)}}),fe=ve,ye=(r("034f"),r("7496")),ge=r("a75b"),be=r("a797"),Ae=r("490a"),ke=Object(u["a"])(fe,i,n,!1,null,null,null),we=ke.exports;d()(ke,{VApp:ye["a"],VContent:ge["a"],VOverlay:be["a"],VProgressCircular:Ae["a"]});var _e=r("9483");Object(_e["a"])("".concat("","service-worker.js"),{ready:function(){},registered:function(){},cached:function(){},updatefound:function(){},updated:function(){},offline:function(){},error:function(e){}});r("4de4"),r("4160"),r("e439"),r("dbb4"),r("b64b"),r("159b");var Ie=r("2fa7"),xe=r("8c4f"),Pe=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("section",[r("v-list",{attrs:{tile:""}},e._l(e.items,(function(t){return r("v-list-item",{key:t.title,attrs:{tile:""},on:{click:function(r){return e.$router.push(t.path)}}},[r("v-list-item-icon",{staticStyle:{"margin-left":"15px"}},[r("v-icon",[e._v(e._s(t.icon))])],1),r("v-list-item-content",[r("v-list-item-title",{domProps:{textContent:e._s(t.title)}})],1)],1)})),1)],1)},Se=[],Ce={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")}},Oe=Ce,Be=r("34c3"),Re=Object(u["a"])(Oe,Pe,Se,!1,null,null,null),Me=Re.exports;d()(Re,{VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemContent:g["a"],VListItemIcon:Be["a"],VListItemTitle:g["c"]});var Ee=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("section",[r("v-list",{attrs:{"two-line":""}},[r("RecycleScroller",{staticClass:"scroller",attrs:{items:e.items,"item-size":72,"key-field":"item_id","page-mode":""},scopedSlots:e._u([{key:"default",fn:function(t){var a=t.item;return[r("ListviewItem",{attrs:{item:a,hideavatar:3==a.media_type&&e.$store.isMobile,hidetracknum:!0,hideproviders:a.media_type<4&&e.$store.isMobile,hidelibrary:!0,hidemenu:3==a.media_type&&e.$store.isMobile,hideduration:5==a.media_type}})]}}])})],1)],1)},De=[],Ve={name:"browse",components:{ListviewItem:D["a"]},props:{mediatype:String,provider:String},data:function(){return{selected:[2],items:[]}},created:function(){this.$store.windowtitle=this.$t(this.mediatype),this.getItems()},methods:{getItems:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(){return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.abrupt("return",this.$server.getAllItems(this.mediatype,this.items,{provider:this.provider}));case 1:case"end":return e.stop()}}),e,this)})));function t(){return e.apply(this,arguments)}return t}()}},Le=Ve,Ne=Object(u["a"])(Le,Ee,De,!1,null,null,null),Fe=Ne.exports;function Te(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function ze(e){for(var t=1;t1){var i=a[1];t[i]=e(r)}})),t}a["a"].use(je["a"]);var Ye=new je["a"]({locale:navigator.language.split("-")[0],fallbackLocale:"en",messages:Ue()}),Xe=(r("d5e8"),r("d1e78"),r("e508")),We=(r("a899"),r("f309"));r("bf40");a["a"].use(We["a"]);var qe=new We["a"]({icons:{iconfont:"md"}}),Ze=new a["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}}}),Ke={globalStore:Ze,install:function(e,t){e.prototype.$store=Ze}},Ge=(r("99af"),r("fb6a"),r("8a79"),r("5319"),r("bc3a")),$e=r.n(Ge);function et(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function tt(e){for(var t=1;t1&&void 0!==arguments[1]?arguments[1]:"image",r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return e&&e.media_type?"database"===e.provider?"".concat(this._address,"api/").concat(e.media_type,"/").concat(e.item_id,"/image?type=").concat(t,"&provider=").concat(e.provider,"&size=").concat(r):e.metadata&&e.metadata["image"]?e.metadata["image"]:e.album&&e.album.metadata&&e.album.metadata["image"]?e.album.metadata["image"]:e.artist&&e.artist.metadata&&e.artist.metadata["image"]?e.artist.metadata["image"]:"":""},getData:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(t){var r,a,i,n=arguments;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return r=n.length>1&&void 0!==n[1]?n[1]:{},a=this._address+"api/"+t,e.next=4,at.get(a,{params:r});case 4:return i=e.sent,e.abrupt("return",i.data);case 6:case"end":return e.stop()}}),e,this)})));function t(t){return e.apply(this,arguments)}return t}(),postData:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(t,r){var a,i;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return a=this._address+"api/"+t,e.next=3,at.post(a,r);case 3:return i=e.sent,e.abrupt("return",i.data);case 5:case"end":return e.stop()}}),e,this)})));function t(t,r){return e.apply(this,arguments)}return t}(),getAllItems:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(t,r){var i,n,s,o,l,c,u,p,d,m,h,v=arguments;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:i=v.length>2&&void 0!==v[2]?v[2]:{},n=0,s=50,o=0;case 4:return e.next=7,this.$server.getData(t,tt({offset:n,limit:s},i));case 7:if(l=e.sent,l&&0!==l.length){e.next=10;break}return e.abrupt("break",32);case 10:for(c=!0,u=!1,p=void 0,e.prev=13,d=l[Symbol.iterator]();!(c=(m=d.next()).done);c=!0)h=m.value,r.length>=o?a["a"].set(r,o,h):r.push(h),o+=1;e.next=21;break;case 17:e.prev=17,e.t0=e["catch"](13),u=!0,p=e.t0;case 21:e.prev=21,e.prev=22,c||null==d.return||d.return();case 24:if(e.prev=24,!u){e.next=27;break}throw p;case 27:return e.finish(24);case 28:return e.finish(21);case 29:n+=s,e.next=4;break;case 32:r.length>o&&(r=r.slice(0,o));case 33:case"end":return e.stop()}}),e,this,[[13,17,21,29],[22,,24,28]])})));function t(t,r){return e.apply(this,arguments)}return t}(),playerCommand:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.activePlayerId,a={player_id:r,cmd:e,cmd_args:t};this._ws.send(JSON.stringify({message:"player command",message_details:a}))},playItem:function(){var e=Object(E["a"])(regeneratorRuntime.mark((function e(t,r){var a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return this.$store.loading=!0,a="players/"+this.activePlayerId+"/play_media/"+t.media_type+"/"+t.item_id+"/"+r,e.next=4,this.getData(a);case 4:this.$store.loading=!1;case 5:case"end":return e.stop()}}),e,this)})));function t(t,r){return e.apply(this,arguments)}return t}(),switchPlayer:function(e){this.activePlayerId=e,localStorage.setItem("activePlayerId",e),this.$emit("new player selected",e)},_onWsConnect:function(){this.connected=!0;var e=JSON.stringify({message:"players",message_details:null});this._ws.send(e)},_onWsMessage:function(e){var t=JSON.parse(e.data);if("player changed"===t.message)a["a"].set(this.players,t.message_details.player_id,t.message_details);else if("player added"===t.message)a["a"].set(this.players,t.message_details.player_id,t.message_details),this._selectActivePlayer(),this.$emit("players changed");else if("player removed"===t.message)a["a"].delete(this.players,t.message_details.player_id),this._selectActivePlayer(),this.$emit("players changed");else if("players"===t.message){var r=!0,i=!1,n=void 0;try{for(var s,o=t.message_details[Symbol.iterator]();!(r=(s=o.next()).done);r=!0){var l=s.value;a["a"].set(this.players,l.player_id,l)}}catch(c){i=!0,n=c}finally{try{r||null==o.return||o.return()}finally{if(i)throw n}}this._selectActivePlayer(),this.$emit("players changed")}else"music sync status"===t.message?this.syncStatus=t.message_details:this.$emit(t.message,t.message_details)},_onWsClose:function(e){this.connected=!1,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 r in this.players)if(this.players[r].enabled&&0===this.players[r].group_parents.length){this.switchPlayer(r);break}}}}},computed:{activePlayer:function(){return this.activePlayerId?this.players[this.activePlayerId]:null}}}),nt={server:it,install:function(e,t){e.prototype.$server=it}};a["a"].config.productionTip=!1,a["a"].use(Xe["a"]),a["a"].use(Ke),a["a"].use(nt),String.prototype.formatDuration=function(){var e=parseInt(this,10),t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=e-3600*t-60*r;return t<10&&(t="0"+t),r<10&&(r="0"+r),a<10&&(a="0"+a),"00"===t?r+":"+a:t+":"+r+":"+a},new a["a"]({router:Qe,i18n:Ye,vuetify:qe,render:function(e){return e(we)}}).$mount("#app")},"57d1":function(e,t){e.exports="data:image/png;base64,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"},"60ce":function(e,t,r){"use strict";var a=r("1c3f"),i=r.n(a);i.a},"71db":function(e,t,r){e.exports=r.p+"img/file.813f9dad.png"},"7c4e":function(e,t,r){"use strict";var a=r("d597"),i=r.n(a);i.a},"82f5":function(e,t,r){e.exports=r.p+"img/sonos.72e2fecb.png"},"94cc":function(e,t){e.exports="data:image/png;base64,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"},"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="},"9e01":function(e,t,r){var a={"./aac.png":"9a36","./chromecast.png":"57d1","./default_artist.png":"4bfb","./file.png":"71db","./flac.png":"fb30","./hires.png":"f5e3","./homeassistant.png":"3232","./http_streamer.png":"2755","./logo.png":"cf05","./mp3.png":"f1d4","./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 i(e){var t=n(e);return r(t)}function n(e){if(!r.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}i.keys=function(){return Object.keys(a)},i.resolve=n,e.exports=i,i.id="9e01"},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!","conf":{"enabled":"Ingeschakeld","base":"Algemene instellingen","musicproviders":"Muziek providers","playerproviders":"Speler providers","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":"Publiceer spelers naar Home Assistant","hass_player_power":"Verbind speler aan/uit met homeassistant entity","hass_player_source":"Benodigde bron op de verbonden homeassistant entity (optioneel)","hass_player_volume":"Verbind volume van speler aan een homeassistant entity","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","player_group_with":"Groupeer deze speler met een andere (hoofd)speler","player_mute_power":"Gebruik mute als aan/uit","player_disable_vol":"Schakel volume bediening helemaal uit","player_group_vol":"Pas groep volume toe op onderliggende spelers (alleen groep spelers)","player_group_pow":"Pas groep aan/uit toe op onderliggende spelers (alleen groep spelers)","player_power_play":"Automatisch afspelen bij inschakelen","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)."},"players":"Spelers","play":"Afspelen","play_on":"Afspelen op:","play_now":"Nu afspelen","play_next":"Speel als volgende af","add_queue":"Voeg toe aan wachtrij","show_info":"Bekijk informatie","queue_next_tracks":"Aankomend","queue_previous_tracks":"Reeds afgespeeld","read_more":"meer lezen","state":{"playing":"afspelen","stopped":"gestopt","paused":"gepauzeerd","off":"uitgeschakeld"}}')},bd18:function(e,t,r){e.exports=r.p+"img/squeezebox.60631223.png"},cf05:function(e,t,r){e.exports=r.p+"img/logo.c079bd97.png"},d3cc:function(e,t,r){"use strict";var a=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("v-list-item",{attrs:{ripple:""},on:{click:function(t){return e.itemClicked(e.item)}}},[e.hideavatar?e._e():a("v-list-item-avatar",{attrs:{tile:"",color:"grey"}},[a("img",{staticStyle:{border:"1px solid rgba(0,0,0,.22)"},attrs:{src:e.$server.getImageUrl(e.item,"image",80),"lazy-src":r("71db")}})]),a("v-list-item-content",[a("v-list-item-title",[e._v(" "+e._s(e.item.name)+" "),e.item.version?a("span",[e._v("("+e._s(e.item.version)+")")]):e._e()]),e.item.artists?a("v-list-item-subtitle",[e._l(e.item.artists,(function(t,r){return a("span",{key:t.item_id},[a("a",{on:{click:[function(r){return e.itemClicked(t)},function(e){e.stopPropagation()}]}},[e._v(e._s(t.name))]),r+10?a("v-icon",{attrs:{height:"20"}},[e._v("favorite")]):e._e(),0==e.item.in_library.length?a("v-icon",{attrs:{height:"20"}},[e._v("favorite_border")]):e._e()],1)]}}],null,!1,993341054)},[e.item.in_library.length>0?a("span",[e._v(e._s(e.$t("remove_library")))]):e._e(),0==e.item.in_library.length?a("span",[e._v(e._s(e.$t("add_library")))]):e._e()])],1),!e.hideduration&&e.item.duration?a("v-list-item-action",[e._v(e._s(e.item.duration.toString().formatDuration()))]):e._e(),e.hidemenu?e._e():a("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),a("v-divider")],1)},i=[],n=(r("a4d3"),r("e01a"),r("d28b"),r("a9e3"),r("d3b7"),r("3ca3"),r("ddb0"),r("2b0e")),s=r("e00a"),o=n["a"].extend({components:{ProviderIcons:s["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{}},computed:{isHiRes:function(){var e=!0,t=!1,r=void 0;try{for(var a,i=this.item.provider_ids[Symbol.iterator]();!(e=(a=i.next()).done);e=!0){var n=a.value;if(n.quality>6)return!0}}catch(s){t=!0,r=s}finally{try{e||null==i.return||i.return()}finally{if(t)throw r}}return!1}},mounted:function(){},methods:{itemClicked:function(e){if(this.onclickHandler)return this.onclickHandler(e);var 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(e){this.$server.$emit("showContextMenu",e)},toggleLibrary:function(e){this.$server.toggleLibrary(e)}}}),l=o,c=r("2877"),u=r("6544"),p=r.n(u),d=r("8336"),m=r("ce7e"),h=r("132d"),v=r("da13"),f=r("1800"),y=r("8270"),g=r("5d23"),b=r("3a2f"),A=Object(c["a"])(l,a,i,!1,null,null,null);t["a"]=A.exports;p()(A,{VBtn:d["a"],VDivider:m["a"],VIcon:h["a"],VListItem:v["a"],VListItemAction:f["a"],VListItemAvatar:y["a"],VListItemContent:g["a"],VListItemSubtitle:g["b"],VListItemTitle:g["c"],VTooltip:b["a"]})},d597:function(e,t,r){},e00a:function(e,t,r){"use strict";var a=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",e._l(e.uniqueProviders,(function(t){return a("img",{key:t.provider,staticStyle:{"margin-right":"6px","margin-top":"6px"},attrs:{height:e.height,src:r("9e01")("./"+t.provider+".png")}})})),0)},i=[],n=(r("4160"),r("c975"),r("a9e3"),r("159b"),r("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(r){var a=r["provider"];-1===t.indexOf(a)&&(t.push(a),e.push(r))})),e):[]}},mounted:function(){},methods:{}}),o=s,l=r("2877"),c=Object(l["a"])(o,a,i,!1,null,null,null);t["a"]=c.exports},e428:function(e,t,r){e.exports=r.p+"img/tunein.ca1c1bb0.png"},edbf:function(e,t,r){e.exports=r.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!","conf":{"enabled":"Enabled","base":"Generic settings","musicproviders":"Music providers","playerproviders":"Player providers","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":"Publish players to Home Assistant","hass_player_power":"Attach player power to homeassistant entity","hass_player_source":"Source on the homeassistant entity (optional)","hass_player_volume":"Attach player volume to homeassistant entity","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","player_group_with":"Group this player to another (parent)player","player_mute_power":"Use muting as power control","player_disable_vol":"Disable volume controls","player_group_vol":"Apply group volume to childs (for group players only)","player_group_pow":"Apply group power based on childs (for group players only)","player_power_play":"Issue play command on power on","file_prov_music_path":"Path to music files","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)"},"players":"Players","play":"Play","play_on":"Play on:","play_now":"Play Now","play_next":"Play Next","add_queue":"Add to Queue","show_info":"Show info","queue_next_tracks":"Next tracks","queue_previous_tracks":"Played tracks","read_more":"read more","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,r){e.exports=r.p+"img/hires.e97b001e.png"},fb30:function(e,t){e.exports="data:image/png;base64,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"}}); -//# sourceMappingURL=app.a7d20a64.js.map \ No newline at end of file diff --git a/music_assistant/web/js/app.a7d20a64.js.map b/music_assistant/web/js/app.a7d20a64.js.map deleted file mode 100644 index a3f3619d..00000000 --- a/music_assistant/web/js/app.a7d20a64.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?a9d7","webpack:///./src/assets/qobuz.png","webpack:///./src/assets/spotify.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/App.vue?e0d8","webpack:///./src/components/NavigationMenu.vue?94cd","webpack:///src/components/NavigationMenu.vue","webpack:///./src/components/NavigationMenu.vue?f679","webpack:///./src/components/NavigationMenu.vue","webpack:///./src/components/TopBar.vue?98df","webpack:///src/components/TopBar.vue","webpack:///./src/components/TopBar.vue?8cdd","webpack:///./src/components/TopBar.vue","webpack:///./src/components/ContextMenu.vue?b286","webpack:///src/components/ContextMenu.vue","webpack:///./src/components/ContextMenu.vue?03fa","webpack:///./src/components/ContextMenu.vue","webpack:///./src/components/PlayerOSD.vue?83ea","webpack:///./src/components/VolumeControl.vue?8ac7","webpack:///src/components/VolumeControl.vue","webpack:///./src/components/VolumeControl.vue?0e80","webpack:///./src/components/VolumeControl.vue","webpack:///src/components/PlayerOSD.vue","webpack:///./src/components/PlayerOSD.vue?1917","webpack:///./src/components/PlayerOSD.vue?3e15","webpack:///./src/components/PlayerSelect.vue?41c3","webpack:///src/components/PlayerSelect.vue","webpack:///./src/components/PlayerSelect.vue?ed4c","webpack:///./src/components/PlayerSelect.vue?2bb5","webpack:///src/App.vue","webpack:///./src/App.vue?0bd2","webpack:///./src/App.vue?4f7e","webpack:///./src/registerServiceWorker.js","webpack:///./src/views/Home.vue?d9f1","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?f351","webpack:///./src/views/Home.vue","webpack:///./src/views/Browse.vue?dd56","webpack:///src/views/Browse.vue","webpack:///./src/views/Browse.vue?0b2d","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/PlayerSelect.vue?1de5","webpack:///./src/assets/file.png","webpack:///./src/components/PlayerOSD.vue?a4df","webpack:///./src/assets/sonos.png","webpack:///./src/assets/vorbis.png","webpack:///./src/assets/aac.png","webpack:///./src/assets sync ^\\.\\/.*\\.png$","webpack:///./src/assets/squeezebox.png","webpack:///./src/assets/logo.png","webpack:///./src/components/ListviewItem.vue?d6ee","webpack:///src/components/ListviewItem.vue","webpack:///./src/components/ListviewItem.vue?6ea0","webpack:///./src/components/ListviewItem.vue","webpack:///./src/components/ProviderIcons.vue?b316","webpack:///src/components/ProviderIcons.vue","webpack:///./src/components/ProviderIcons.vue?97c3","webpack:///./src/components/ProviderIcons.vue","webpack:///./src/assets/tunein.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","map","webpackContext","req","id","webpackContextResolve","keys","_vm","this","_h","$createElement","_c","_self","$route","path","attrs","showPlayerSelect","$store","loading","staticRenderFns","model","callback","$$v","$set","expression","_l","item","title","on","$event","$router","_v","_s","icon","showNavigationMenu","props","items","mounted","methods","component","VBtn","VIcon","VList","VListItem","VListItemAction","VListItemContent","VListItemTitle","VNavigationDrawer","color","topBarTransparent","_e","staticClass","staticStyle","windowtitle","go","$server","$emit","topBarContextItem","computed","VAppBar","VLayout","VSpacer","visible","playlists","header","subheader","label","itemCommand","action","$t","index","item_id","playlistSelected","components","ListviewItem","watch","menuItems","curItem","curPlaylist","playerQueueItems","created","$on","showContextMenu","showPlayMenu","beforeDestroy","$off","mediaItem","curBrowseContext","in_library","media_type","is_editable","cmd","query","showPlaylistsMenu","playlistAddRemove","playItem","provider","track","action_details","playlistId","getData","endpoint","params","VCard","VDialog","VDivider","VListItemAvatar","VSubheader","getImageUrl","curQueueItem","activePlayer","artist","artistindex","artistClick","stopPropagation","artists","playerCurTimeStr","playerTotalTimeStr","style","progressBarWidth","progress","playerCommand","state","isMobile","nativeOn","preventDefault","scopedSlots","_u","fn","ref","_g","Math","round","volume_level","players","player_id","is_group","child_id","powered","togglePlayerPower","disable_volume","setPlayerVolume","volumePlayerIds","allIds","playerId","newVolume","VListItemSubtitle","VSlider","VolumeControl","curQueueItemId","val","cur_queue_item","totalSecs","duration","curSecs","cur_time","curPercent","toString","formatDuration","innerWidth","cmd_opt","activePlayerId","url","VFlex","VFooter","VMenu","VProgressLinear","switchPlayer","filteredPlayerIds","show","getAvailablePlayers","enabled","group_parents","VCardTitle","NavigationMenu","TopBar","ContextMenu","PlayerOSD","PlayerSelect","serverAddress","loc","origin","pathname","connect","VApp","VContent","VOverlay","VProgressCircular","register","process","ready","registered","cached","updatefound","updated","offline","domProps","VListItemIcon","mediatype","String","selected","getItems","Vue","use","VueRouter","routes","Home","route","Browse","router","loadLocaleMessages","locales","require","messages","forEach","matched","match","locale","VueI18n","navigator","language","split","fallbackLocale","Vuetify","icons","iconfont","globalStore","isInStandaloneMode","handleWindowOptions","addEventListener","destroyed","removeEventListener","body","clientWidth","standalone","matchMedia","matches","install","options","axiosConfig","_axios","axios","server","_address","_ws","connected","syncStatus","endsWith","wsAddress","replace","WebSocket","onopen","_onWsConnect","onmessage","_onWsMessage","onclose","_onWsClose","_onWsError","toggleLibrary","imageType","size","metadata","album","postData","post","getAllItems","list","offset","limit","set","msgDetails","cmd_args","send","JSON","stringify","message_details","queueOpt","newPlayerId","localStorage","setItem","msg","parse","_selectActivePlayer","delete","close","lastPlayerId","getItem","config","productionTip","VueVirtualScroller","store","secNum","parseInt","hours","floor","minutes","seconds","i18n","vuetify","render","h","App","$mount","itemClicked","hideavatar","version","hidetracknum","track_number","disc_number","owner","hideproviders","provider_ids","hidelibrary","hideduration","hidemenu","menuClick","ProviderIcons","Number","totalitems","Boolean","onclickHandler","isHiRes","VTooltip","prov","height","providerIds","Array","uniqueProviders","output","indexOf"],"mappings":"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","file":"js/app.a7d20a64.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~search\":\"config~search\",\"config\":\"config\",\"itemdetails~playerqueue~search\":\"itemdetails~playerqueue~search\",\"search\":\"search\",\"itemdetails\":\"itemdetails\",\"playerqueue\":\"playerqueue\"}[chunkId]||chunkId) + \".\" + {\"config~search\":\"9f3e890b\",\"config\":\"3af84ca2\",\"itemdetails~playerqueue~search\":\"1e2b2bfd\",\"search\":\"a47a53ec\",\"itemdetails\":\"66f74ea0\",\"playerqueue\":\"a3006395\"}[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~search\":1,\"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~search\":\"config~search\",\"config\":\"config\",\"itemdetails~playerqueue~search\":\"itemdetails~playerqueue~search\",\"search\":\"search\",\"itemdetails\":\"itemdetails\",\"playerqueue\":\"playerqueue\"}[chunkId]||chunkId) + \".\" + {\"config~search\":\"af60f7e1\",\"config\":\"18def958\",\"itemdetails~playerqueue~search\":\"93e2919b\",\"search\":\"31d6cfe0\",\"itemdetails\":\"66e507cb\",\"playerqueue\":\"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/vuetify-loader/lib/loader.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=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/vuetify-loader/lib/loader.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=style&index=0&lang=css&\"","module.exports = __webpack_public_path__ + \"img/qobuz.c7eb9a76.png\";","module.exports = __webpack_public_path__ + \"img/spotify.1f3fb1af.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\";","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-content',[_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 }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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 }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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.playlistSelected}})})],2):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n\r\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=19c89a7b&\"\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\"}},[_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)],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),_c('v-list-item',{staticStyle:{\"height\":\"44px\",\"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:{\"small\":\"\",\"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:\"overline\"},[_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:{\"small\":\"\",\"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.activePlayer.volume_level)))])],1)],1)]}}],null,false,1951340450)},[_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\":\"20px\",\"margin-right\":\"15px\"}},[_c('v-btn',{attrs:{\"small\":\"\",\"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:\"overline\"},[_vm._v(_vm._s(_vm.$server.activePlayer.name))]):_c('span',{staticClass:\"overline\"})],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\"}},[(!_vm.players[child_id].disable_volume)?_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')}}}):_vm._e()],1)],1),_c('v-divider')],1)})],2)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=65f7b2c2&\"\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","\n\n\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=7d07386a&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=7d07386a&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 \"7d07386a\",\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 { VFlex } from 'vuetify/lib/components/VGrid';\nimport { VFooter } from 'vuetify/lib/components/VFooter';\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 { VMenu } from 'vuetify/lib/components/VMenu';\nimport { VProgressLinear } from 'vuetify/lib/components/VProgressLinear';\ninstallComponents(component, {VBtn,VCard,VFlex,VFooter,VIcon,VListItem,VListItemAction,VListItemAvatar,VListItemContent,VListItemSubtitle,VListItemTitle,VMenu,VProgressLinear})\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',[_c('v-icon',{attrs:{\"size\":\"45\"}},[_vm._v(_vm._s(_vm.$server.players[playerId].is_group ? '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 }","\n\n\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=71935334&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=71935334&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 \"71935334\",\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","\n\n\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=0c87dcf5&\"\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 { VContent } from 'vuetify/lib/components/VContent';\nimport { VOverlay } from 'vuetify/lib/components/VOverlay';\nimport { VProgressCircular } from 'vuetify/lib/components/VProgressCircular';\ninstallComponents(component, {VApp,VContent,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 console.log('New content is available; please refresh.')\n },\n offline () {\n console.log('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 }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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('v-list',{attrs:{\"two-line\":\"\"}},[_c('RecycleScroller',{staticClass:\"scroller\",attrs:{\"items\":_vm.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}})]}}])})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=891f1150&\"\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\n\n/* vuetify-loader */\nimport installComponents from \"!../../node_modules/vuetify-loader/lib/runtime/installComponents.js\"\nimport { VList } from 'vuetify/lib/components/VList';\ninstallComponents(component, {VList})\n","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'\n// import Vuetify from 'vuetify'\nimport Vuetify from 'vuetify/lib'\nimport 'vuetify/dist/vuetify.min.css'\n\nVue.use(Vuetify)\n\nexport default new Vuetify({\n icons: {\n iconfont: 'md'\n }\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'\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 connect (serverAddress) {\n // Connect to the server\n if (!serverAddress.endsWith('/')) {\n serverAddress = serverAddress + '/'\n }\n this._address = serverAddress\n let 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 let endpoint = item.media_type + '/' + item.item_id\n let action = 'library_remove'\n if (item.in_library.length === 0) {\n action = 'library_add'\n }\n await this.getData(endpoint, { provider: item.provider, action: action })\n if (action === '/library_remove') {\n item.in_library = []\n } else {\n item.in_library = [item.provider]\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') {\n return `${this._address}api/${mediaItem.media_type}/${mediaItem.item_id}/image?type=${imageType}&provider=${mediaItem.provider}&size=${size}`\n } else if (mediaItem.metadata && mediaItem.metadata['image']) {\n return mediaItem.metadata['image']\n } else if (mediaItem.album && mediaItem.album.metadata && mediaItem.album.metadata['image']) {\n return mediaItem.album.metadata['image']\n } else if (mediaItem.artist && mediaItem.artist.metadata && mediaItem.artist.metadata['image']) {\n return mediaItem.artist.metadata['image']\n } else return ''\n },\n\n async getData (endpoint, params = {}) {\n // get data from the server\n let url = this._address + 'api/' + endpoint\n let result = await _axios.get(url, { params: params })\n return result.data\n },\n\n async postData (endpoint, data) {\n // post data to the server\n let url = this._address + 'api/' + endpoint\n let result = await _axios.post(url, data)\n return result.data\n },\n\n async getAllItems (endpoint, list, params = {}) {\n // retrieve all items and fill list\n var offset = 0\n var limit = 50\n var index = 0\n while (true) {\n let items = await this.$server.getData(endpoint, { offset: offset, limit: limit, ...params })\n if (!items || items.length === 0) break\n for (var item of items) {\n if (list.length >= index) {\n Vue.set(list, index, item)\n } else list.push(item)\n index += 1\n }\n offset += limit\n }\n // truncate list if needed\n if (list.length > index) {\n list = list.slice(0, index)\n }\n },\n\n playerCommand (cmd, cmd_opt = null, playerId = this.activePlayerId) {\n let msgDetails = {\n player_id: playerId,\n cmd: cmd,\n cmd_args: cmd_opt\n }\n this._ws.send(JSON.stringify({ message: 'player command', message_details: msgDetails }))\n },\n\n async playItem (item, queueOpt) {\n this.$store.loading = true\n let endpoint = 'players/' + this.activePlayerId + '/play_media/' + item.media_type + '/' + item.item_id + '/' + queueOpt\n await this.getData(endpoint)\n this.$store.loading = false\n },\n\n switchPlayer (newPlayerId) {\n this.activePlayerId = newPlayerId\n localStorage.setItem('activePlayerId', newPlayerId)\n this.$emit('new player selected', newPlayerId)\n },\n\n _onWsConnect () {\n // Websockets connection established\n // console.log('Connected to server ' + this._address)\n this.connected = true\n // request all players\n let data = JSON.stringify({ message: 'players', message_details: null })\n this._ws.send(data)\n },\n\n _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 === 'players') {\n for (var item of msg.message_details) {\n Vue.set(this.players, item.player_id, item)\n }\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 // console.log('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 let 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 (let 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 (let 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'\n\nVue.config.productionTip = false\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/vuetify-loader/lib/loader.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=style&index=0&id=71935334&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/vuetify-loader/lib/loader.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=style&index=0&id=71935334&scoped=true&lang=css&\"","module.exports = __webpack_public_path__ + \"img/file.813f9dad.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/vuetify-loader/lib/loader.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=style&index=0&id=7d07386a&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/vuetify-loader/lib/loader.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=style&index=0&id=7d07386a&scoped=true&lang=css&\"","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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\"","var map = {\n\t\"./aac.png\": \"9a36\",\n\t\"./chromecast.png\": \"57d1\",\n\t\"./default_artist.png\": \"4bfb\",\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\"./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\";","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',{attrs:{\"ripple\":\"\"},on:{\"click\":function($event){return _vm.itemClicked(_vm.item)}}},[(!_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('img',{attrs:{\"src\":require('../assets/hires.png'),\"height\":\"20\"}})]):_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.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,993341054)},[(_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 }","\n\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=07f350ca&\"\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 }","\r\n\r\n\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/vuetify-loader/lib/loader.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/vuetify-loader/lib/loader.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=39dc952a&\"\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 = __webpack_public_path__ + \"img/web.798ba28f.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"img/hires.e97b001e.png\";","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""} \ No newline at end of file diff --git a/music_assistant/web/js/chunk-vendors.a6d30324.js b/music_assistant/web/js/chunk-vendors.a6d30324.js new file mode 100644 index 00000000..156da06c --- /dev/null +++ b/music_assistant/web/js/chunk-vendors.a6d30324.js @@ -0,0 +1,30 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-vendors"],{"0273":function(t,e,n){var r=n("c1b2"),i=n("4180"),o=n("2c6c");t.exports=r?function(t,e,n){return i.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},"0363":function(t,e,n){var r=n("3ac6"),i=n("d659"),o=n("3e80"),a=n("1e63"),s=r.Symbol,c=i("wks");t.exports=function(t){return c[t]||(c[t]=a&&s[t]||(a?s:o)("Symbol."+t))}},"0481":function(t,e,n){"use strict";var r=n("23e7"),i=n("a2bf"),o=n("7b0b"),a=n("50c4"),s=n("a691"),c=n("65f0");r({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=o(this),n=a(e.length),r=c(e,0);return r.length=i(r,e,e,n,0,void 0===t?1:s(t)),r}})},"057f":function(t,e,n){var r=n("fc6a"),i=n("241c").f,o={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return i(t)}catch(e){return a.slice()}};t.exports.f=function(t){return a&&"[object Window]"==o.call(t)?s(t):i(r(t))}},"06cf":function(t,e,n){var r=n("83ab"),i=n("d1e7"),o=n("5c6c"),a=n("fc6a"),s=n("c04e"),c=n("5135"),u=n("0cfb"),l=Object.getOwnPropertyDescriptor;e.f=r?l:function(t,e){if(t=a(t),e=s(e,!0),u)try{return l(t,e)}catch(n){}if(c(t,e))return o(!i.f.call(t,e),t[e])}},"06fa":function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},"0789":function(t,e,n){"use strict";var r=n("80d2"),i=n("2fa7"),o=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e?"width":"height",o="offset".concat(Object(r["x"])(n));return{beforeEnter:function(t){t._parent=t.parentNode,t._initialStyle=Object(i["a"])({transition:t.style.transition,visibility:t.style.visibility,overflow:t.style.overflow},n,t.style[n])},enter:function(e){var r=e._initialStyle,i="".concat(e[o],"px");e.style.setProperty("transition","none","important"),e.style.visibility="hidden",e.style.visibility=r.visibility,e.style.overflow="hidden",e.style[n]="0",e.offsetHeight,e.style.transition=r.transition,t&&e._parent&&e._parent.classList.add(t),requestAnimationFrame((function(){e.style[n]=i}))},afterEnter:s,enterCancelled:s,leave:function(t){t._initialStyle=Object(i["a"])({transition:"",visibility:"",overflow:t.style.overflow},n,t.style[n]),t.style.overflow="hidden",t.style[n]="".concat(t[o],"px"),t.offsetHeight,requestAnimationFrame((function(){return t.style[n]="0"}))},afterLeave:a,leaveCancelled:a};function a(e){t&&e._parent&&e._parent.classList.remove(t),s(e)}function s(t){var e=t._initialStyle[n];t.style.overflow=t._initialStyle.overflow,null!=e&&(t.style[n]=e),delete t._initialStyle}};n.d(e,"c",(function(){return a})),n.d(e,"d",(function(){return s})),n.d(e,"e",(function(){return c})),n.d(e,"f",(function(){return u})),n.d(e,"a",(function(){return l})),n.d(e,"b",(function(){return f}));Object(r["i"])("carousel-transition"),Object(r["i"])("carousel-reverse-transition"),Object(r["i"])("tab-transition"),Object(r["i"])("tab-reverse-transition"),Object(r["i"])("menu-transition");var a=Object(r["i"])("fab-transition","center center","out-in"),s=(Object(r["i"])("dialog-transition"),Object(r["i"])("dialog-bottom-transition"),Object(r["i"])("fade-transition")),c=Object(r["i"])("scale-transition"),u=(Object(r["i"])("scroll-x-transition"),Object(r["i"])("scroll-x-reverse-transition"),Object(r["i"])("scroll-y-transition"),Object(r["i"])("scroll-y-reverse-transition"),Object(r["i"])("slide-x-transition")),l=(Object(r["i"])("slide-x-reverse-transition"),Object(r["i"])("slide-y-transition"),Object(r["i"])("slide-y-reverse-transition"),Object(r["f"])("expand-transition",o())),f=Object(r["f"])("expand-x-transition",o("",!0))},"07ac":function(t,e,n){var r=n("23e7"),i=n("6f53").values;r({target:"Object",stat:!0},{values:function(t){return i(t)}})},"09e1":function(t,e,n){t.exports=n("d339")},"0a06":function(t,e,n){"use strict";var r=n("2444"),i=n("c532"),o=n("f6b4"),a=n("5270");function s(t){this.defaults=t,this.interceptors={request:new o,response:new o}}s.prototype.request=function(t){"string"===typeof t&&(t=i.merge({url:arguments[0]},arguments[1])),t=i.merge(r,{method:"get"},this.defaults,t),t.method=t.method.toLowerCase();var e=[a,void 0],n=Promise.resolve(t);this.interceptors.request.forEach((function(t){e.unshift(t.fulfilled,t.rejected)})),this.interceptors.response.forEach((function(t){e.push(t.fulfilled,t.rejected)}));while(e.length)n=n.then(e.shift(),e.shift());return n},i.forEach(["delete","get","head","options"],(function(t){s.prototype[t]=function(e,n){return this.request(i.merge(n||{},{method:t,url:e}))}})),i.forEach(["post","put","patch"],(function(t){s.prototype[t]=function(e,n,r){return this.request(i.merge(r||{},{method:t,url:e,data:n}))}})),t.exports=s},"0aa1":function(t,e,n){var r=n("a5eb"),i=n("4fff"),o=n("a016"),a=n("06fa"),s=a((function(){o(1)}));r({target:"Object",stat:!0,forced:s},{keys:function(t){return o(i(t))}})},"0aea":function(t,e,n){var r=n("d666");t.exports=function(t,e,n){for(var i in e)n&&n.unsafe&&t[i]?t[i]=e[i]:r(t,i,e[i],n);return t}},"0afa":function(t,e,n){t.exports=n("2696")},"0b11":function(t,e,n){t.exports=n("2f74")},"0b7b":function(t,e,n){var r=n("8f95"),i=n("7463"),o=n("0363"),a=o("iterator");t.exports=function(t){if(void 0!=t)return t[a]||t["@@iterator"]||i[r(t)]}},"0bc6":function(t,e,n){},"0c82":function(t,e,n){var r=n("9bfb");r("asyncDispose")},"0cf0":function(t,e,n){var r=n("b323"),i=n("9e57"),o=i.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},"0cfb":function(t,e,n){var r=n("83ab"),i=n("d039"),o=n("cc12");t.exports=!r&&!i((function(){return 7!=Object.defineProperty(o("div"),"a",{get:function(){return 7}}).a}))},"0d03":function(t,e,n){var r=n("6eeb"),i=Date.prototype,o="Invalid Date",a="toString",s=i[a],c=i.getTime;new Date(NaN)+""!=o&&r(i,a,(function(){var t=c.call(this);return t===t?s.call(this):o}))},"0d3b":function(t,e,n){var r=n("d039"),i=n("b622"),o=n("c430"),a=i("iterator");t.exports=!r((function(){var t=new URL("b?a=1&b=2&c=3","http://a"),e=t.searchParams,n="";return t.pathname="c%20d",e.forEach((function(t,r){e["delete"]("b"),n+=r+t})),o&&!t.toJSON||!e.sort||"http://a/c%20d?a=1&c=3"!==t.href||"3"!==e.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!e[a]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host}))},"0df6":function(t,e,n){"use strict";t.exports=function(t){return function(e){return t.apply(null,e)}}},"0e67":function(t,e,n){var r=n("9bfb");r("iterator")},"0e8f":function(t,e,n){"use strict";n("20f6");var r=n("e8f2");e["a"]=Object(r["a"])("flex")},"10d2":function(t,e,n){"use strict";var r=n("8dd9");e["a"]=r["a"]},1148:function(t,e,n){"use strict";var r=n("a691"),i=n("1d80");t.exports="".repeat||function(t){var e=String(i(this)),n="",o=r(t);if(o<0||o==1/0)throw RangeError("Wrong number of repetitions");for(;o>0;(o>>>=1)&&(e+=e))1&o&&(n+=e);return n}},1276:function(t,e,n){"use strict";var r=n("d784"),i=n("44e7"),o=n("825a"),a=n("1d80"),s=n("4840"),c=n("8aa5"),u=n("50c4"),l=n("14c3"),f=n("9263"),h=n("d039"),d=[].push,p=Math.min,v=4294967295,m=!h((function(){return!RegExp(v,"y")}));r("split",2,(function(t,e,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var r=String(a(this)),o=void 0===n?v:n>>>0;if(0===o)return[];if(void 0===t)return[r];if(!i(t))return e.call(r,t,o);var s,c,u,l=[],h=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),p=0,m=new RegExp(t.source,h+"g");while(s=f.call(m,r)){if(c=m.lastIndex,c>p&&(l.push(r.slice(p,s.index)),s.length>1&&s.index=o))break;m.lastIndex===s.index&&m.lastIndex++}return p===r.length?!u&&m.test("")||l.push(""):l.push(r.slice(p)),l.length>o?l.slice(0,o):l}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var i=a(this),o=void 0==e?void 0:e[t];return void 0!==o?o.call(e,i,n):r.call(String(i),e,n)},function(t,i){var a=n(r,t,this,i,r!==e);if(a.done)return a.value;var f=o(t),h=String(this),d=s(f,RegExp),g=f.unicode,b=(f.ignoreCase?"i":"")+(f.multiline?"m":"")+(f.unicode?"u":"")+(m?"y":"g"),y=new d(m?f:"^(?:"+f.source+")",b),w=void 0===i?v:i>>>0;if(0===w)return[];if(0===h.length)return null===l(y,h)?[h]:[];var O=0,x=0,_=[];while(x4}(function(t){t["xSmall"]="12px",t["small"]="16px",t["default"]="24px",t["medium"]="28px",t["large"]="36px",t["xLarge"]="40px"})(r||(r={}));var m=Object(f["a"])(o["a"],a["a"],s["a"],c["a"]).extend({name:"v-icon",props:{dense:Boolean,disabled:Boolean,left:Boolean,right:Boolean,size:[Number,String],tag:{type:String,required:!1,default:"i"}},computed:{medium:function(){return!1}},methods:{getIcon:function(){var t="";return this.$slots.default&&(t=this.$slots.default[0].text.trim()),Object(u["w"])(this,t)},getSize:function(){var t={xSmall:this.xSmall,small:this.small,medium:this.medium,large:this.large,xLarge:this.xLarge},e=Object(u["t"])(t).find((function(e){return t[e]}));return e&&r[e]||Object(u["e"])(this.size)},getDefaultData:function(){var t=Boolean(this.listeners$.click||this.listeners$["!click"]),e={staticClass:"v-icon notranslate",class:{"v-icon--disabled":this.disabled,"v-icon--left":this.left,"v-icon--link":t,"v-icon--right":this.right,"v-icon--dense":this.dense},attrs:d({"aria-hidden":!t,role:t?"button":null},this.attrs$),on:this.listeners$};return e},applyColors:function(t){t.class=d({},t.class,{},this.themeClasses),this.setTextColor(this.color,t)},renderFontIcon:function(t,e){var n=[],r=this.getDefaultData(),i="material-icons",o=t.indexOf("-"),a=o<=-1;a?n.push(t):(i=t.slice(0,o),p(i)&&(i="")),r.class[i]=!0,r.class[t]=!a;var s=this.getSize();return s&&(r.style={fontSize:s}),this.applyColors(r),e(this.tag,r,n)},renderSvgIcon:function(t,e){var n=this.getDefaultData();n.class["v-icon--svg"]=!0,n.attrs={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",height:"24",width:"24",role:"img","aria-hidden":!this.attrs$["aria-label"],"aria-label":this.attrs$["aria-label"]};var r=this.getSize();return r&&(n.style={fontSize:r,height:r,width:r},n.attrs.height=r,n.attrs.width=r),this.applyColors(n),e("svg",n,[e("path",{attrs:{d:t}})])},renderSvgIconComponent:function(t,e){var n=this.getDefaultData();n.class["v-icon--is-component"]=!0;var r=this.getSize();r&&(n.style={fontSize:r,height:r}),this.applyColors(n);var i=t.component;return n.props=t.props,n.nativeOn=n.on,e(i,n)}},render:function(t){var e=this.getIcon();return"string"===typeof e?v(e)?this.renderSvgIcon(e,t):this.renderFontIcon(e,t):this.renderSvgIconComponent(e,t)}});e["a"]=l["a"].extend({name:"v-icon",$_wrapperFor:m,functional:!0,render:function(t,e){var n=e.data,r=e.children,i="";return n.domProps&&(i=n.domProps.textContent||n.domProps.innerHTML||i,delete n.domProps.textContent,delete n.domProps.innerHTML),t(m,n,i?[i]:r)}})},"13d5":function(t,e,n){"use strict";var r=n("23e7"),i=n("d58f").left,o=n("b301");r({target:"Array",proto:!0,forced:o("reduce")},{reduce:function(t){return i(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}})},"14c3":function(t,e,n){var r=n("c6b6"),i=n("9263");t.exports=function(t,e){var n=t.exec;if("function"===typeof n){var o=n.call(t,e);if("object"!==typeof o)throw TypeError("RegExp exec method returned something other than an Object or null");return o}if("RegExp"!==r(t))throw TypeError("RegExp#exec called on incompatible receiver");return i.call(t,e)}},1561:function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},"159b":function(t,e,n){var r=n("da84"),i=n("fdbc"),o=n("17c2"),a=n("9112");for(var s in i){var c=r[s],u=c&&c.prototype;if(u&&u.forEach!==o)try{a(u,"forEach",o)}catch(l){u.forEach=o}}},"166a":function(t,e,n){},"169a":function(t,e,n){"use strict";n("a4d3"),n("4de4"),n("4160"),n("caad"),n("45fc"),n("a9e3"),n("e439"),n("dbb4"),n("b64b"),n("2532"),n("498a"),n("159b");var r=n("2fa7"),i=(n("368e"),n("4ad4")),o=n("b848"),a=n("75eb"),s=n("e707"),c=n("e4d3"),u=n("21be"),l=n("f2e7"),f=n("a293"),h=n("80d2"),d=n("bfc5"),p=n("58df"),v=n("d9bd");function m(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function g(t){for(var e=1;e=this.getMaxZIndex())},hideScroll:function(){this.fullscreen?document.documentElement.classList.add("overflow-y-hidden"):s["a"].options.methods.hideScroll.call(this)},show:function(){var t=this;!this.fullscreen&&!this.hideOverlay&&this.genOverlay(),this.$nextTick((function(){t.$refs.content.focus(),t.bind()}))},bind:function(){window.addEventListener("focusin",this.onFocusin)},unbind:function(){window.removeEventListener("focusin",this.onFocusin)},onKeydown:function(t){if(t.keyCode===h["s"].esc&&!this.getOpenDependents().length)if(this.persistent)this.noClickAnimation||this.animateClick();else{this.isActive=!1;var e=this.getActivator();this.$nextTick((function(){return e&&e.focus()}))}this.$emit("keydown",t)},onFocusin:function(t){if(t&&t.target!==document.activeElement&&this.retainFocus){var e=t.target;if(e&&![document,this.$refs.content].includes(e)&&!this.$refs.content.contains(e)&&this.activeZIndex>=this.getMaxZIndex()&&!this.getOpenDependentElements().some((function(t){return t.contains(e)}))){var n=this.$refs.content.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');n.length&&n[0].focus()}}}},render:function(t){var e=this,n=[],r={class:this.classes,ref:"dialog",directives:[{name:"click-outside",value:function(){e.isActive=!1},args:{closeConditional:this.closeConditional,include:this.getOpenDependentElements}},{name:"show",value:this.isActive}],on:{click:function(t){t.stopPropagation()}},style:{}};this.fullscreen||(r.style={maxWidth:"none"===this.maxWidth?void 0:Object(h["e"])(this.maxWidth),width:"auto"===this.width?void 0:Object(h["e"])(this.width)}),n.push(this.genActivator());var i=t("div",r,this.showLazyContent(this.getContentSlot()));return this.transition&&(i=t("transition",{props:{name:this.transition,origin:this.origin}},[i])),n.push(t("div",{class:this.contentClasses,attrs:g({role:"document",tabindex:this.isActive?0:void 0},this.getScopeIdAttrs()),on:{keydown:this.onKeydown},style:{zIndex:this.activeZIndex},ref:"content"},[this.$createElement(d["a"],{props:{root:!0,light:this.light,dark:this.dark}},[i])])),t("div",{staticClass:"v-dialog__container",class:{"v-dialog__container--attached":""===this.attach||!0===this.attach||"attach"===this.attach},attrs:{role:"dialog"}},n)}})},"16b7":function(t,e,n){"use strict";n("a9e3"),n("e25e");var r=n("2b0e");e["a"]=r["a"].extend().extend({name:"delayable",props:{openDelay:{type:[Number,String],default:0},closeDelay:{type:[Number,String],default:0}},data:function(){return{openTimeout:void 0,closeTimeout:void 0}},methods:{clearDelay:function(){clearTimeout(this.openTimeout),clearTimeout(this.closeTimeout)},runDelay:function(t,e){var n=this;this.clearDelay();var r=parseInt(this["".concat(t,"Delay")],10);this["".concat(t,"Timeout")]=setTimeout(e||function(){n.isActive={open:!0,close:!1}[t]},r)}}})},"16f1":function(t,e,n){n("5145"),n("3e47"),t.exports=n("d9f3")},"17c2":function(t,e,n){"use strict";var r=n("b727").forEach,i=n("b301");t.exports=i("forEach")?function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}:[].forEach},1800:function(t,e,n){"use strict";n("4de4");var r=n("2b0e");e["a"]=r["a"].extend({name:"v-list-item-action",functional:!0,render:function(t,e){var n=e.data,r=e.children,i=void 0===r?[]:r;n.staticClass=n.staticClass?"v-list-item__action ".concat(n.staticClass):"v-list-item__action";var o=i.filter((function(t){return!1===t.isComment&&" "!==t.text}));return o.length>1&&(n.staticClass+=" v-list-item__action--stack"),t("div",n,i)}})},1875:function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"18a5":function(t,e,n){"use strict";var r=n("23e7"),i=n("857a"),o=n("eae9");r({target:"String",proto:!0,forced:o("anchor")},{anchor:function(t){return i(this,"a","name",t)}})},"194a":function(t,e,n){var r=n("cc94");t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},"19aa":function(t,e){t.exports=function(t,e,n){if(!(t instanceof e))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return t}},"1abc":function(t,e,n){"use strict";var r=n("a797");e["a"]=r["a"]},"1b2c":function(t,e,n){},"1be4":function(t,e,n){var r=n("d066");t.exports=r("document","documentElement")},"1c0a":function(t,e,n){"use strict";var r=n("8f95"),i=n("0363"),o=i("toStringTag"),a={};a[o]="z",t.exports="[object z]"!==String(a)?function(){return"[object "+r(this)+"]"}:a.toString},"1c0b":function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},"1c29":function(t,e,n){n("fc93"),n("6f89"),n("8b7b"),n("e363"),n("64db"),n("22a9"),n("9080"),n("0e67"),n("e699"),n("e7cc"),n("2e85"),n("980e"),n("9ac4"),n("274e"),n("8d05"),n("ef09"),n("aa1b"),n("8176"),n("522d");var r=n("764b");t.exports=r.Symbol},"1c7e":function(t,e,n){var r=n("b622"),i=r("iterator"),o=!1;try{var a=0,s={next:function(){return{done:!!a++}},return:function(){o=!0}};s[i]=function(){return this},Array.from(s,(function(){throw 2}))}catch(c){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var r={};r[i]=function(){return{next:function(){return{done:n=!0}}}},t(r)}catch(c){}return n}},"1c87":function(t,e,n){"use strict";n("a4d3"),n("99af"),n("4de4"),n("4160"),n("e439"),n("dbb4"),n("b64b"),n("ac1f"),n("5319"),n("498a"),n("9911"),n("159b");var r=n("2fa7"),i=n("2b0e"),o=n("5607"),a=n("80d2");function s(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function c(t){for(var e=1;e=51||!r((function(){var e=[],n=e.constructor={};return n[a]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},"1e63":function(t,e,n){var r=n("06fa");t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},"20f6":function(t,e,n){},"21be":function(t,e,n){"use strict";n("99af"),n("caad"),n("e25e"),n("2532");var r=n("284c"),i=n("2b0e"),o=n("80d2");e["a"]=i["a"].extend().extend({name:"stackable",data:function(){return{stackElement:null,stackExclude:null,stackMinZIndex:0,isActive:!1}},computed:{activeZIndex:function(){if("undefined"===typeof window)return 0;var t=this.stackElement||this.$refs.content,e=this.isActive?this.getMaxZIndex(this.stackExclude||[t])+2:Object(o["q"])(t);return null==e?e:parseInt(e)}},methods:{getMaxZIndex:function(){for(var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=this.$el,n=[this.stackMinZIndex,Object(o["q"])(e)],i=[].concat(Object(r["a"])(document.getElementsByClassName("v-menu__content--active")),Object(r["a"])(document.getElementsByClassName("v-dialog__content--active"))),a=0;ap;p++)if(m=l?y(r(b=t[p])[0],b[1]):y(t[p]),m&&m instanceof u)return m;return new u(!1)}h=d.call(t)}g=h.next;while(!(b=g.call(h)).done)if(m=c(h,y,b.value,l),"object"==typeof m&&m&&m instanceof u)return m;return new u(!1)};l.stop=function(t){return new u(!0,t)}},"22a9":function(t,e,n){var r=n("9bfb");r("hasInstance")},"22da":function(t,e,n){"use strict";var r=n("490a");e["a"]=r["a"]},2364:function(t,e,n){n("0e67"),n("3e47"),n("5145");var r=n("fbcc");t.exports=r.f("iterator")},"23cb":function(t,e,n){var r=n("a691"),i=Math.max,o=Math.min;t.exports=function(t,e){var n=r(t);return n<0?i(n+e,0):o(n,e)}},"23e7":function(t,e,n){var r=n("da84"),i=n("06cf").f,o=n("9112"),a=n("6eeb"),s=n("ce4e"),c=n("e893"),u=n("94ca");t.exports=function(t,e){var n,l,f,h,d,p,v=t.target,m=t.global,g=t.stat;if(l=m?r:g?r[v]||s(v,{}):(r[v]||{}).prototype,l)for(f in e){if(d=e[f],t.noTargetGet?(p=i(l,f),h=p&&p.value):h=l[f],n=u(m?f:v+(g?".":"#")+f,t.forced),!n&&void 0!==h){if(typeof d===typeof h)continue;c(d,h)}(t.sham||h&&h.sham)&&o(d,"sham",!0),a(l,f,d,t)}}},"241c":function(t,e,n){var r=n("ca84"),i=n("7839"),o=i.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},2444:function(t,e,n){"use strict";(function(e){var r=n("c532"),i=n("c8af"),o={"Content-Type":"application/x-www-form-urlencoded"};function a(t,e){!r.isUndefined(t)&&r.isUndefined(t["Content-Type"])&&(t["Content-Type"]=e)}function s(){var t;return"undefined"!==typeof XMLHttpRequest?t=n("b50d"):"undefined"!==typeof e&&(t=n("b50d")),t}var c={adapter:s(),transformRequest:[function(t,e){return i(e,"Content-Type"),r.isFormData(t)||r.isArrayBuffer(t)||r.isBuffer(t)||r.isStream(t)||r.isFile(t)||r.isBlob(t)?t:r.isArrayBufferView(t)?t.buffer:r.isURLSearchParams(t)?(a(e,"application/x-www-form-urlencoded;charset=utf-8"),t.toString()):r.isObject(t)?(a(e,"application/json;charset=utf-8"),JSON.stringify(t)):t}],transformResponse:[function(t){if("string"===typeof t)try{t=JSON.parse(t)}catch(e){}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],(function(t){c.headers[t]={}})),r.forEach(["post","put","patch"],(function(t){c.headers[t]=r.merge(o)})),t.exports=c}).call(this,n("4362"))},"24b2":function(t,e,n){"use strict";n("a9e3");var r=n("80d2"),i=n("2b0e");e["a"]=i["a"].extend({name:"measurable",props:{height:[Number,String],maxHeight:[Number,String],maxWidth:[Number,String],minHeight:[Number,String],minWidth:[Number,String],width:[Number,String]},computed:{measurableStyles:function(){var t={},e=Object(r["e"])(this.height),n=Object(r["e"])(this.minHeight),i=Object(r["e"])(this.minWidth),o=Object(r["e"])(this.maxHeight),a=Object(r["e"])(this.maxWidth),s=Object(r["e"])(this.width);return e&&(t.height=e),n&&(t.minHeight=n),i&&(t.minWidth=i),o&&(t.maxHeight=o),a&&(t.maxWidth=a),s&&(t.width=s),t}}})},2532:function(t,e,n){"use strict";var r=n("23e7"),i=n("5a34"),o=n("1d80"),a=n("ab13");r({target:"String",proto:!0,forced:!a("includes")},{includes:function(t){return!!~String(o(this)).indexOf(i(t),arguments.length>1?arguments[1]:void 0)}})},"25a8":function(t,e,n){},"25f0":function(t,e,n){"use strict";var r=n("6eeb"),i=n("825a"),o=n("d039"),a=n("ad6d"),s="toString",c=RegExp.prototype,u=c[s],l=o((function(){return"/a/b"!=u.call({source:"a",flags:"b"})})),f=u.name!=s;(l||f)&&r(RegExp.prototype,s,(function(){var t=i(this),e=String(t.source),n=t.flags,r=String(void 0===n&&t instanceof RegExp&&!("flags"in c)?a.call(t):n);return"/"+e+"/"+r}),{unsafe:!0})},2616:function(t,e,n){var r=n("0363"),i=n("7463"),o=r("iterator"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(i.Array===t||a[o]===t)}},2626:function(t,e,n){"use strict";var r=n("d066"),i=n("9bf2"),o=n("b622"),a=n("83ab"),s=o("species");t.exports=function(t){var e=r(t),n=i.f;a&&e&&!e[s]&&n(e,s,{configurable:!0,get:function(){return this}})}},"266f":function(t,e,n){var r=n("9bfb");r("patternMatch")},2696:function(t,e,n){t.exports=n("801c")},"26e9":function(t,e,n){"use strict";var r=n("23e7"),i=n("e8b5"),o=[].reverse,a=[1,2];r({target:"Array",proto:!0,forced:String(a)===String(a.reverse())},{reverse:function(){return i(this)&&(this.length=this.length),o.call(this)}})},"274e":function(t,e,n){var r=n("9bfb");r("split")},"284c":function(t,e,n){"use strict";var r=n("1316"),i=n.n(r);function o(t){if(i()(t)){for(var e=0,n=new Array(t.length);e=0&&Math.floor(e)===e&&isFinite(t)}function d(t){return i(t)&&"function"===typeof t.then&&"function"===typeof t.catch}function p(t){return null==t?"":Array.isArray(t)||l(t)&&t.toString===u?JSON.stringify(t,null,2):String(t)}function v(t){var e=parseFloat(t);return isNaN(e)?t:e}function m(t,e){for(var n=Object.create(null),r=t.split(","),i=0;i-1)return t.splice(n,1)}}var y=Object.prototype.hasOwnProperty;function w(t,e){return y.call(t,e)}function O(t){var e=Object.create(null);return function(n){var r=e[n];return r||(e[n]=t(n))}}var x=/-(\w)/g,_=O((function(t){return t.replace(x,(function(t,e){return e?e.toUpperCase():""}))})),j=O((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),S=/\B([A-Z])/g,k=O((function(t){return t.replace(S,"-$1").toLowerCase()}));function C(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n}function A(t,e){return t.bind(e)}var $=Function.prototype.bind?A:C;function E(t,e){e=e||0;var n=t.length-e,r=new Array(n);while(n--)r[n]=t[n+e];return r}function L(t,e){for(var n in e)t[n]=e[n];return t}function P(t){for(var e={},n=0;n0,nt=Q&&Q.indexOf("edge/")>0,rt=(Q&&Q.indexOf("android"),Q&&/iphone|ipad|ipod|ios/.test(Q)||"ios"===J),it=(Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q),Q&&Q.match(/firefox\/(\d+)/)),ot={}.watch,at=!1;if(Z)try{var st={};Object.defineProperty(st,"passive",{get:function(){at=!0}}),window.addEventListener("test-passive",null,st)}catch(_a){}var ct=function(){return void 0===X&&(X=!Z&&!K&&"undefined"!==typeof t&&(t["process"]&&"server"===t["process"].env.VUE_ENV)),X},ut=Z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function lt(t){return"function"===typeof t&&/native code/.test(t.toString())}var ft,ht="undefined"!==typeof Symbol&<(Symbol)&&"undefined"!==typeof Reflect&<(Reflect.ownKeys);ft="undefined"!==typeof Set&<(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var dt=T,pt=0,vt=function(){this.id=pt++,this.subs=[]};vt.prototype.addSub=function(t){this.subs.push(t)},vt.prototype.removeSub=function(t){b(this.subs,t)},vt.prototype.depend=function(){vt.target&&vt.target.addDep(this)},vt.prototype.notify=function(){var t=this.subs.slice();for(var e=0,n=t.length;e-1)if(o&&!w(i,"default"))a=!1;else if(""===a||a===k(t)){var c=te(String,i.type);(c<0||s0&&(a=Ce(a,(e||"")+"_"+n),ke(a[0])&&ke(u)&&(l[c]=xt(u.text+a[0].text),a.shift()),l.push.apply(l,a)):s(a)?ke(u)?l[c]=xt(u.text+a):""!==a&&l.push(xt(a)):ke(a)&&ke(u)?l[c]=xt(u.text+a.text):(o(t._isVList)&&i(a.tag)&&r(a.key)&&i(e)&&(a.key="__vlist"+e+"_"+n+"__"),l.push(a)));return l}function Ae(t){var e=t.$options.provide;e&&(t._provided="function"===typeof e?e.call(t):e)}function $e(t){var e=Ee(t.$options.inject,t);e&&($t(!1),Object.keys(e).forEach((function(n){It(t,n,e[n])})),$t(!0))}function Ee(t,e){if(t){for(var n=Object.create(null),r=ht?Reflect.ownKeys(t):Object.keys(t),i=0;i0,a=t?!!t.$stable:!o,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==n&&s===r.$key&&!o&&!r.$hasNormal)return r;for(var c in i={},t)t[c]&&"$"!==c[0]&&(i[c]=Ie(e,c,t[c]))}else i={};for(var u in e)u in i||(i[u]=Me(e,u));return t&&Object.isExtensible(t)&&(t._normalized=i),U(i,"$stable",a),U(i,"$key",s),U(i,"$hasNormal",o),i}function Ie(t,e,n){var r=function(){var t=arguments.length?n.apply(null,arguments):n({});return t=t&&"object"===typeof t&&!Array.isArray(t)?[t]:Se(t),t&&(0===t.length||1===t.length&&t[0].isComment)?void 0:t};return n.proxy&&Object.defineProperty(t,e,{get:r,enumerable:!0,configurable:!0}),r}function Me(t,e){return function(){return t[e]}}function De(t,e){var n,r,o,a,s;if(Array.isArray(t)||"string"===typeof t)for(n=new Array(t.length),r=0,o=t.length;r1?E(n):n;for(var r=E(arguments,1),i='event handler for "'+t+'"',o=0,a=n.length;odocument.createEvent("Event").timeStamp&&(Xn=function(){return Gn.now()})}function Zn(){var t,e;for(Yn=Xn(),Wn=!0,Fn.sort((function(t,e){return t.id-e.id})),Un=0;UnUn&&Fn[n].id>t.id)n--;Fn.splice(n+1,0,t)}else Fn.push(t);Hn||(Hn=!0,pe(Zn))}}var er=0,nr=function(t,e,n,r,i){this.vm=t,i&&(t._watcher=this),t._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.before=r.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++er,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new ft,this.newDepIds=new ft,this.expression="","function"===typeof e?this.getter=e:(this.getter=Y(e),this.getter||(this.getter=T)),this.value=this.lazy?void 0:this.get()};nr.prototype.get=function(){var t;gt(this);var e=this.vm;try{t=this.getter.call(e,e)}catch(_a){if(!this.user)throw _a;ee(_a,e,'getter for watcher "'+this.expression+'"')}finally{this.deep&&me(t),bt(),this.cleanupDeps()}return t},nr.prototype.addDep=function(t){var e=t.id;this.newDepIds.has(e)||(this.newDepIds.add(e),this.newDeps.push(t),this.depIds.has(e)||t.addSub(this))},nr.prototype.cleanupDeps=function(){var t=this.deps.length;while(t--){var e=this.deps[t];this.newDepIds.has(e.id)||e.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},nr.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():tr(this)},nr.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||c(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}catch(_a){ee(_a,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,t,e)}}},nr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},nr.prototype.depend=function(){var t=this.deps.length;while(t--)this.deps[t].depend()},nr.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||b(this.vm._watchers,this);var t=this.deps.length;while(t--)this.deps[t].removeSub(this);this.active=!1}};var rr={enumerable:!0,configurable:!0,get:T,set:T};function ir(t,e,n){rr.get=function(){return this[e][n]},rr.set=function(t){this[e][n]=t},Object.defineProperty(t,n,rr)}function or(t){t._watchers=[];var e=t.$options;e.props&&ar(t,e.props),e.methods&&pr(t,e.methods),e.data?sr(t):Tt(t._data={},!0),e.computed&&lr(t,e.computed),e.watch&&e.watch!==ot&&vr(t,e.watch)}function ar(t,e){var n=t.$options.propsData||{},r=t._props={},i=t.$options._propKeys=[],o=!t.$parent;o||$t(!1);var a=function(o){i.push(o);var a=Zt(o,e,n,t);It(r,o,a),o in t||ir(t,"_props",o)};for(var s in e)a(s);$t(!0)}function sr(t){var e=t.$options.data;e=t._data="function"===typeof e?cr(e,t):e||{},l(e)||(e={});var n=Object.keys(e),r=t.$options.props,i=(t.$options.methods,n.length);while(i--){var o=n[i];0,r&&w(r,o)||W(o)||ir(t,"_data",o)}Tt(e,!0)}function cr(t,e){gt();try{return t.call(e,e)}catch(_a){return ee(_a,e,"data()"),{}}finally{bt()}}var ur={lazy:!0};function lr(t,e){var n=t._computedWatchers=Object.create(null),r=ct();for(var i in e){var o=e[i],a="function"===typeof o?o:o.get;0,r||(n[i]=new nr(t,a||T,T,ur)),i in t||fr(t,i,o)}}function fr(t,e,n){var r=!ct();"function"===typeof n?(rr.get=r?hr(e):dr(n),rr.set=T):(rr.get=n.get?r&&!1!==n.cache?hr(e):dr(n.get):T,rr.set=n.set||T),Object.defineProperty(t,e,rr)}function hr(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),vt.target&&e.depend(),e.value}}function dr(t){return function(){return t.call(this,this)}}function pr(t,e){t.$options.props;for(var n in e)t[n]="function"!==typeof e[n]?T:$(e[n],t)}function vr(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var i=0;i-1)return this;var n=E(arguments,1);return n.unshift(this),"function"===typeof t.install?t.install.apply(t,n):"function"===typeof t&&t.apply(null,n),e.push(t),this}}function Sr(t){t.mixin=function(t){return this.options=Xt(this.options,t),this}}function kr(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,r=n.cid,i=t._Ctor||(t._Ctor={});if(i[r])return i[r];var o=t.name||n.options.name;var a=function(t){this._init(t)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=e++,a.options=Xt(n.options,t),a["super"]=n,a.options.props&&Cr(a),a.options.computed&&Ar(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,F.forEach((function(t){a[t]=n[t]})),o&&(a.options.components[o]=a),a.superOptions=n.options,a.extendOptions=t,a.sealedOptions=L({},a.options),i[r]=a,a}}function Cr(t){var e=t.options.props;for(var n in e)ir(t.prototype,"_props",n)}function Ar(t){var e=t.options.computed;for(var n in e)fr(t.prototype,n,e[n])}function $r(t){F.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&l(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"===typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}function Er(t){return t&&(t.Ctor.options.name||t.tag)}function Lr(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"===typeof t?t.split(",").indexOf(e)>-1:!!f(t)&&t.test(e)}function Pr(t,e){var n=t.cache,r=t.keys,i=t._vnode;for(var o in n){var a=n[o];if(a){var s=Er(a.componentOptions);s&&!e(s)&&Tr(n,o,r,i)}}}function Tr(t,e,n,r){var i=t[e];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),t[e]=null,b(n,e)}yr(_r),gr(_r),$n(_r),Tn(_r),bn(_r);var Ir=[String,RegExp,Array],Mr={name:"keep-alive",abstract:!0,props:{include:Ir,exclude:Ir,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Tr(this.cache,t,this.keys)},mounted:function(){var t=this;this.$watch("include",(function(e){Pr(t,(function(t){return Lr(e,t)}))})),this.$watch("exclude",(function(e){Pr(t,(function(t){return!Lr(e,t)}))}))},render:function(){var t=this.$slots.default,e=_n(t),n=e&&e.componentOptions;if(n){var r=Er(n),i=this,o=i.include,a=i.exclude;if(o&&(!r||!Lr(o,r))||a&&r&&Lr(a,r))return e;var s=this,c=s.cache,u=s.keys,l=null==e.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):e.key;c[l]?(e.componentInstance=c[l].componentInstance,b(u,l),u.push(l)):(c[l]=e,u.push(l),this.max&&u.length>parseInt(this.max)&&Tr(c,u[0],u,this._vnode)),e.data.keepAlive=!0}return e||t&&t[0]}},Dr={KeepAlive:Mr};function Br(t){var e={get:function(){return z}};Object.defineProperty(t,"config",e),t.util={warn:dt,extend:L,mergeOptions:Xt,defineReactive:It},t.set=Mt,t.delete=Dt,t.nextTick=pe,t.observable=function(t){return Tt(t),t},t.options=Object.create(null),F.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,L(t.options.components,Dr),jr(t),Sr(t),kr(t),$r(t)}Br(_r),Object.defineProperty(_r.prototype,"$isServer",{get:ct}),Object.defineProperty(_r.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(_r,"FunctionalRenderContext",{value:Ke}),_r.version="2.6.10";var Nr=m("style,class"),Rr=m("input,textarea,option,select,progress"),Fr=function(t,e,n){return"value"===n&&Rr(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},Vr=m("contenteditable,draggable,spellcheck"),zr=m("events,caret,typing,plaintext-only"),Hr=function(t,e){return Xr(e)||"false"===e?"false":"contenteditable"===t&&zr(e)?e:"true"},Wr=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Ur="http://www.w3.org/1999/xlink",qr=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Yr=function(t){return qr(t)?t.slice(6,t.length):""},Xr=function(t){return null==t||!1===t};function Gr(t){var e=t.data,n=t,r=t;while(i(r.componentInstance))r=r.componentInstance._vnode,r&&r.data&&(e=Zr(r.data,e));while(i(n=n.parent))n&&n.data&&(e=Zr(e,n.data));return Kr(e.staticClass,e.class)}function Zr(t,e){return{staticClass:Jr(t.staticClass,e.staticClass),class:i(t.class)?[t.class,e.class]:e.class}}function Kr(t,e){return i(t)||i(e)?Jr(t,Qr(e)):""}function Jr(t,e){return t?e?t+" "+e:t:e||""}function Qr(t){return Array.isArray(t)?ti(t):c(t)?ei(t):"string"===typeof t?t:""}function ti(t){for(var e,n="",r=0,o=t.length;r-1?si[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:si[t]=/HTMLUnknownElement/.test(e.toString())}var ui=m("text,number,password,search,email,tel,url");function li(t){if("string"===typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}function fi(t,e){var n=document.createElement(t);return"select"!==t?n:(e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n)}function hi(t,e){return document.createElementNS(ni[t],e)}function di(t){return document.createTextNode(t)}function pi(t){return document.createComment(t)}function vi(t,e,n){t.insertBefore(e,n)}function mi(t,e){t.removeChild(e)}function gi(t,e){t.appendChild(e)}function bi(t){return t.parentNode}function yi(t){return t.nextSibling}function wi(t){return t.tagName}function Oi(t,e){t.textContent=e}function xi(t,e){t.setAttribute(e,"")}var _i=Object.freeze({createElement:fi,createElementNS:hi,createTextNode:di,createComment:pi,insertBefore:vi,removeChild:mi,appendChild:gi,parentNode:bi,nextSibling:yi,tagName:wi,setTextContent:Oi,setStyleScope:xi}),ji={create:function(t,e){Si(e)},update:function(t,e){t.data.ref!==e.data.ref&&(Si(t,!0),Si(e))},destroy:function(t){Si(t,!0)}};function Si(t,e){var n=t.data.ref;if(i(n)){var r=t.context,o=t.componentInstance||t.elm,a=r.$refs;e?Array.isArray(a[n])?b(a[n],o):a[n]===o&&(a[n]=void 0):t.data.refInFor?Array.isArray(a[n])?a[n].indexOf(o)<0&&a[n].push(o):a[n]=[o]:a[n]=o}}var ki=new yt("",{},[]),Ci=["create","activate","update","remove","destroy"];function Ai(t,e){return t.key===e.key&&(t.tag===e.tag&&t.isComment===e.isComment&&i(t.data)===i(e.data)&&$i(t,e)||o(t.isAsyncPlaceholder)&&t.asyncFactory===e.asyncFactory&&r(e.asyncFactory.error))}function $i(t,e){if("input"!==t.tag)return!0;var n,r=i(n=t.data)&&i(n=n.attrs)&&n.type,o=i(n=e.data)&&i(n=n.attrs)&&n.type;return r===o||ui(r)&&ui(o)}function Ei(t,e,n){var r,o,a={};for(r=e;r<=n;++r)o=t[r].key,i(o)&&(a[o]=r);return a}function Li(t){var e,n,a={},c=t.modules,u=t.nodeOps;for(e=0;ev?(f=r(n[b+1])?null:n[b+1].elm,_(t,f,n,p,b,o)):p>b&&S(t,e,h,v)}function A(t,e,n,r){for(var o=n;o-1?zi(t,e,n):Wr(e)?Xr(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Vr(e)?t.setAttribute(e,Hr(e,n)):qr(e)?Xr(n)?t.removeAttributeNS(Ur,Yr(e)):t.setAttributeNS(Ur,e,n):zi(t,e,n)}function zi(t,e,n){if(Xr(n))t.removeAttribute(e);else{if(tt&&!et&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}var Hi={create:Fi,update:Fi};function Wi(t,e){var n=e.elm,o=e.data,a=t.data;if(!(r(o.staticClass)&&r(o.class)&&(r(a)||r(a.staticClass)&&r(a.class)))){var s=Gr(e),c=n._transitionClasses;i(c)&&(s=Jr(s,Qr(c))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var Ui,qi={create:Wi,update:Wi},Yi="__r",Xi="__c";function Gi(t){if(i(t[Yi])){var e=tt?"change":"input";t[e]=[].concat(t[Yi],t[e]||[]),delete t[Yi]}i(t[Xi])&&(t.change=[].concat(t[Xi],t.change||[]),delete t[Xi])}function Zi(t,e,n){var r=Ui;return function i(){var o=e.apply(null,arguments);null!==o&&Qi(t,i,n,r)}}var Ki=ae&&!(it&&Number(it[1])<=53);function Ji(t,e,n,r){if(Ki){var i=Yn,o=e;e=o._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=i||t.timeStamp<=0||t.target.ownerDocument!==document)return o.apply(this,arguments)}}Ui.addEventListener(t,e,at?{capture:n,passive:r}:n)}function Qi(t,e,n,r){(r||Ui).removeEventListener(t,e._wrapper||e,n)}function to(t,e){if(!r(t.data.on)||!r(e.data.on)){var n=e.data.on||{},i=t.data.on||{};Ui=e.elm,Gi(n),we(n,i,Ji,Qi,Zi,e.context),Ui=void 0}}var eo,no={create:to,update:to};function ro(t,e){if(!r(t.data.domProps)||!r(e.data.domProps)){var n,o,a=e.elm,s=t.data.domProps||{},c=e.data.domProps||{};for(n in i(c.__ob__)&&(c=e.data.domProps=L({},c)),s)n in c||(a[n]="");for(n in c){if(o=c[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),o===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=o;var u=r(o)?"":String(o);io(a,u)&&(a.value=u)}else if("innerHTML"===n&&ii(a.tagName)&&r(a.innerHTML)){eo=eo||document.createElement("div"),eo.innerHTML=""+o+"";var l=eo.firstChild;while(a.firstChild)a.removeChild(a.firstChild);while(l.firstChild)a.appendChild(l.firstChild)}else if(o!==s[n])try{a[n]=o}catch(_a){}}}}function io(t,e){return!t.composing&&("OPTION"===t.tagName||oo(t,e)||ao(t,e))}function oo(t,e){var n=!0;try{n=document.activeElement!==t}catch(_a){}return n&&t.value!==e}function ao(t,e){var n=t.value,r=t._vModifiers;if(i(r)){if(r.number)return v(n)!==v(e);if(r.trim)return n.trim()!==e.trim()}return n!==e}var so={create:ro,update:ro},co=O((function(t){var e={},n=/;(?![^(]*\))/g,r=/:(.+)/;return t.split(n).forEach((function(t){if(t){var n=t.split(r);n.length>1&&(e[n[0].trim()]=n[1].trim())}})),e}));function uo(t){var e=lo(t.style);return t.staticStyle?L(t.staticStyle,e):e}function lo(t){return Array.isArray(t)?P(t):"string"===typeof t?co(t):t}function fo(t,e){var n,r={};if(e){var i=t;while(i.componentInstance)i=i.componentInstance._vnode,i&&i.data&&(n=uo(i.data))&&L(r,n)}(n=uo(t.data))&&L(r,n);var o=t;while(o=o.parent)o.data&&(n=uo(o.data))&&L(r,n);return r}var ho,po=/^--/,vo=/\s*!important$/,mo=function(t,e,n){if(po.test(e))t.style.setProperty(e,n);else if(vo.test(n))t.style.setProperty(k(e),n.replace(vo,""),"important");else{var r=bo(e);if(Array.isArray(n))for(var i=0,o=n.length;i-1?e.split(Oo).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function _o(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(Oo).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";while(n.indexOf(r)>=0)n=n.replace(r," ");n=n.trim(),n?t.setAttribute("class",n):t.removeAttribute("class")}}function jo(t){if(t){if("object"===typeof t){var e={};return!1!==t.css&&L(e,So(t.name||"v")),L(e,t),e}return"string"===typeof t?So(t):void 0}}var So=O((function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}})),ko=Z&&!et,Co="transition",Ao="animation",$o="transition",Eo="transitionend",Lo="animation",Po="animationend";ko&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&($o="WebkitTransition",Eo="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Lo="WebkitAnimation",Po="webkitAnimationEnd"));var To=Z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Io(t){To((function(){To(t)}))}function Mo(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),xo(t,e))}function Do(t,e){t._transitionClasses&&b(t._transitionClasses,e),_o(t,e)}function Bo(t,e,n){var r=Ro(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Co?Eo:Po,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout((function(){c0&&(n=Co,l=a,f=o.length):e===Ao?u>0&&(n=Ao,l=u,f=c.length):(l=Math.max(a,u),n=l>0?a>u?Co:Ao:null,f=n?n===Co?o.length:c.length:0);var h=n===Co&&No.test(r[$o+"Property"]);return{type:n,timeout:l,propCount:f,hasTransform:h}}function Fo(t,e){while(t.length1}function qo(t,e){!0!==e.data.show&&zo(e)}var Yo=Z?{create:qo,activate:qo,remove:function(t,e){!0!==t.data.show?Ho(t,e):e()}}:{},Xo=[Hi,qi,no,so,wo,Yo],Go=Xo.concat(Ri),Zo=Li({nodeOps:_i,modules:Go});et&&document.addEventListener("selectionchange",(function(){var t=document.activeElement;t&&t.vmodel&&ia(t,"input")}));var Ko={inserted:function(t,e,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?Oe(n,"postpatch",(function(){Ko.componentUpdated(t,e,n)})):Jo(t,e,n.context),t._vOptions=[].map.call(t.options,ea)):("textarea"===n.tag||ui(t.type))&&(t._vModifiers=e.modifiers,e.modifiers.lazy||(t.addEventListener("compositionstart",na),t.addEventListener("compositionend",ra),t.addEventListener("change",ra),et&&(t.vmodel=!0)))},componentUpdated:function(t,e,n){if("select"===n.tag){Jo(t,e,n.context);var r=t._vOptions,i=t._vOptions=[].map.call(t.options,ea);if(i.some((function(t,e){return!D(t,r[e])}))){var o=t.multiple?e.value.some((function(t){return ta(t,i)})):e.value!==e.oldValue&&ta(e.value,i);o&&ia(t,"change")}}}};function Jo(t,e,n){Qo(t,e,n),(tt||nt)&&setTimeout((function(){Qo(t,e,n)}),0)}function Qo(t,e,n){var r=e.value,i=t.multiple;if(!i||Array.isArray(r)){for(var o,a,s=0,c=t.options.length;s-1,a.selected!==o&&(a.selected=o);else if(D(ea(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));i||(t.selectedIndex=-1)}}function ta(t,e){return e.every((function(e){return!D(e,t)}))}function ea(t){return"_value"in t?t._value:t.value}function na(t){t.target.composing=!0}function ra(t){t.target.composing&&(t.target.composing=!1,ia(t.target,"input"))}function ia(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function oa(t){return!t.componentInstance||t.data&&t.data.transition?t:oa(t.componentInstance._vnode)}var aa={bind:function(t,e,n){var r=e.value;n=oa(n);var i=n.data&&n.data.transition,o=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&i?(n.data.show=!0,zo(n,(function(){t.style.display=o}))):t.style.display=r?o:"none"},update:function(t,e,n){var r=e.value,i=e.oldValue;if(!r!==!i){n=oa(n);var o=n.data&&n.data.transition;o?(n.data.show=!0,r?zo(n,(function(){t.style.display=t.__vOriginalDisplay})):Ho(n,(function(){t.style.display="none"}))):t.style.display=r?t.__vOriginalDisplay:"none"}},unbind:function(t,e,n,r,i){i||(t.style.display=t.__vOriginalDisplay)}},sa={model:Ko,show:aa},ca={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function ua(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?ua(_n(e.children)):t}function la(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var i=n._parentListeners;for(var o in i)e[_(o)]=i[o];return e}function fa(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}function ha(t){while(t=t.parent)if(t.data.transition)return!0}function da(t,e){return e.key===t.key&&e.tag===t.tag}var pa=function(t){return t.tag||xn(t)},va=function(t){return"show"===t.name},ma={name:"transition",props:ca,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(pa),n.length)){0;var r=this.mode;0;var i=n[0];if(ha(this.$vnode))return i;var o=ua(i);if(!o)return i;if(this._leaving)return fa(t,i);var a="__transition-"+this._uid+"-";o.key=null==o.key?o.isComment?a+"comment":a+o.tag:s(o.key)?0===String(o.key).indexOf(a)?o.key:a+o.key:o.key;var c=(o.data||(o.data={})).transition=la(this),u=this._vnode,l=ua(u);if(o.data.directives&&o.data.directives.some(va)&&(o.data.show=!0),l&&l.data&&!da(o,l)&&!xn(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=L({},c);if("out-in"===r)return this._leaving=!0,Oe(f,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),fa(t,i);if("in-out"===r){if(xn(o))return u;var h,d=function(){h()};Oe(c,"afterEnter",d),Oe(c,"enterCancelled",d),Oe(f,"delayLeave",(function(t){h=t}))}}return i}}},ga=L({tag:String,moveClass:String},ca);delete ga.mode;var ba={props:ga,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var i=Ln(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,i(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=la(this),s=0;s4)return t;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(o=T.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)a=0;else{if(!(10==o?M:8==o?I:D).test(i))return t;a=parseInt(i,o)}n.push(a)}for(r=0;r=S(256,5-e))return null}else if(a>255)return null;for(s=n.pop(),r=0;r6)return;r=0;while(h()){if(i=null,r>0){if(!("."==h()&&r<4))return;f++}if(!P.test(h()))return;while(P.test(h())){if(o=parseInt(h(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,r++,2!=r&&4!=r||u++}if(4!=r)return;break}if(":"==h()){if(f++,!h())return}else if(h())return;c[u++]=e}else{if(null!==l)return;f++,u++,l=u}}if(null!==l){a=u-l,u=7;while(0!=u&&a>0)s=c[u],c[u--]=c[l+a-1],c[l+--a]=s}else if(8!=u)return;return c},W=function(t){for(var e=null,n=1,r=null,i=0,o=0;o<8;o++)0!==t[o]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(e=r,n=i),e},U=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=j(t/256);return e.join(".")}if("object"==typeof t){for(e="",r=W(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},q={},Y=h({},q,{" ":1,'"':1,"<":1,">":1,"`":1}),X=h({},Y,{"#":1,"?":1,"{":1,"}":1}),G=h({},X,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Z=function(t,e){var n=p(t,0);return n>32&&n<127&&!f(e,t)?t:encodeURIComponent(t)},K={ftp:21,file:null,http:80,https:443,ws:80,wss:443},J=function(t){return f(K,t.scheme)},Q=function(t){return""!=t.username||""!=t.password},tt=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},et=function(t,e){var n;return 2==t.length&&E.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},nt=function(t){var e;return t.length>1&&et(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},rt=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&et(e[0],!0)||e.pop()},it=function(t){return"."===t||"%2e"===t.toLowerCase()},ot=function(t){return t=t.toLowerCase(),".."===t||"%2e."===t||".%2e"===t||"%2e%2e"===t},at={},st={},ct={},ut={},lt={},ft={},ht={},dt={},pt={},vt={},mt={},gt={},bt={},yt={},wt={},Ot={},xt={},_t={},jt={},St={},kt={},Ct=function(t,e,n,i){var o,a,s,c,u=n||at,l=0,h="",p=!1,v=!1,m=!1;n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(R,"")),e=e.replace(F,""),o=d(e);while(l<=o.length){switch(a=o[l],u){case at:if(!a||!E.test(a)){if(n)return C;u=ct;continue}h+=a.toLowerCase(),u=st;break;case st:if(a&&(L.test(a)||"+"==a||"-"==a||"."==a))h+=a.toLowerCase();else{if(":"!=a){if(n)return C;h="",u=ct,l=0;continue}if(n&&(J(t)!=f(K,h)||"file"==h&&(Q(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=h,n)return void(J(t)&&K[t.scheme]==t.port&&(t.port=null));h="","file"==t.scheme?u=yt:J(t)&&i&&i.scheme==t.scheme?u=ut:J(t)?u=dt:"/"==o[l+1]?(u=lt,l++):(t.cannotBeABaseURL=!0,t.path.push(""),u=jt)}break;case ct:if(!i||i.cannotBeABaseURL&&"#"!=a)return C;if(i.cannotBeABaseURL&&"#"==a){t.scheme=i.scheme,t.path=i.path.slice(),t.query=i.query,t.fragment="",t.cannotBeABaseURL=!0,u=kt;break}u="file"==i.scheme?yt:ft;continue;case ut:if("/"!=a||"/"!=o[l+1]){u=ft;continue}u=pt,l++;break;case lt:if("/"==a){u=vt;break}u=_t;continue;case ft:if(t.scheme=i.scheme,a==r)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query;else if("/"==a||"\\"==a&&J(t))u=ht;else if("?"==a)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query="",u=St;else{if("#"!=a){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.path.pop(),u=_t;continue}t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query,t.fragment="",u=kt}break;case ht:if(!J(t)||"/"!=a&&"\\"!=a){if("/"!=a){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,u=_t;continue}u=vt}else u=pt;break;case dt:if(u=pt,"/"!=a||"/"!=h.charAt(l+1))continue;l++;break;case pt:if("/"!=a&&"\\"!=a){u=vt;continue}break;case vt:if("@"==a){p&&(h="%40"+h),p=!0,s=d(h);for(var g=0;g65535)return $;t.port=J(t)&&w===K[t.scheme]?null:w,h=""}if(n)return;u=xt;continue}return $}h+=a;break;case yt:if(t.scheme="file","/"==a||"\\"==a)u=wt;else{if(!i||"file"!=i.scheme){u=_t;continue}if(a==r)t.host=i.host,t.path=i.path.slice(),t.query=i.query;else if("?"==a)t.host=i.host,t.path=i.path.slice(),t.query="",u=St;else{if("#"!=a){nt(o.slice(l).join(""))||(t.host=i.host,t.path=i.path.slice(),rt(t)),u=_t;continue}t.host=i.host,t.path=i.path.slice(),t.query=i.query,t.fragment="",u=kt}}break;case wt:if("/"==a||"\\"==a){u=Ot;break}i&&"file"==i.scheme&&!nt(o.slice(l).join(""))&&(et(i.path[0],!0)?t.path.push(i.path[0]):t.host=i.host),u=_t;continue;case Ot:if(a==r||"/"==a||"\\"==a||"?"==a||"#"==a){if(!n&&et(h))u=_t;else if(""==h){if(t.host="",n)return;u=xt}else{if(c=V(t,h),c)return c;if("localhost"==t.host&&(t.host=""),n)return;h="",u=xt}continue}h+=a;break;case xt:if(J(t)){if(u=_t,"/"!=a&&"\\"!=a)continue}else if(n||"?"!=a)if(n||"#"!=a){if(a!=r&&(u=_t,"/"!=a))continue}else t.fragment="",u=kt;else t.query="",u=St;break;case _t:if(a==r||"/"==a||"\\"==a&&J(t)||!n&&("?"==a||"#"==a)){if(ot(h)?(rt(t),"/"==a||"\\"==a&&J(t)||t.path.push("")):it(h)?"/"==a||"\\"==a&&J(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&et(h)&&(t.host&&(t.host=""),h=h.charAt(0)+":"),t.path.push(h)),h="","file"==t.scheme&&(a==r||"?"==a||"#"==a))while(t.path.length>1&&""===t.path[0])t.path.shift();"?"==a?(t.query="",u=St):"#"==a&&(t.fragment="",u=kt)}else h+=Z(a,X);break;case jt:"?"==a?(t.query="",u=St):"#"==a?(t.fragment="",u=kt):a!=r&&(t.path[0]+=Z(a,q));break;case St:n||"#"!=a?a!=r&&("'"==a&&J(t)?t.query+="%27":t.query+="#"==a?"%23":Z(a,q)):(t.fragment="",u=kt);break;case kt:a!=r&&(t.fragment+=Z(a,Y));break}l++}},At=function(t){var e,n,r=l(this,At,"URL"),i=arguments.length>1?arguments[1]:void 0,a=String(t),s=x(r,{type:"URL"});if(void 0!==i)if(i instanceof At)e=_(i);else if(n=Ct(e={},String(i)),n)throw TypeError(n);if(n=Ct(s,a,null,e),n)throw TypeError(n);var c=s.searchParams=new w,u=O(c);u.updateSearchParams(s.query),u.updateURL=function(){s.query=String(c)||null},o||(r.href=Et.call(r),r.origin=Lt.call(r),r.protocol=Pt.call(r),r.username=Tt.call(r),r.password=It.call(r),r.host=Mt.call(r),r.hostname=Dt.call(r),r.port=Bt.call(r),r.pathname=Nt.call(r),r.search=Rt.call(r),r.searchParams=Ft.call(r),r.hash=Vt.call(r))},$t=At.prototype,Et=function(){var t=_(this),e=t.scheme,n=t.username,r=t.password,i=t.host,o=t.port,a=t.path,s=t.query,c=t.fragment,u=e+":";return null!==i?(u+="//",Q(t)&&(u+=n+(r?":"+r:"")+"@"),u+=U(i),null!==o&&(u+=":"+o)):"file"==e&&(u+="//"),u+=t.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==s&&(u+="?"+s),null!==c&&(u+="#"+c),u},Lt=function(){var t=_(this),e=t.scheme,n=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(r){return"null"}return"file"!=e&&J(t)?e+"://"+U(t.host)+(null!==n?":"+n:""):"null"},Pt=function(){return _(this).scheme+":"},Tt=function(){return _(this).username},It=function(){return _(this).password},Mt=function(){var t=_(this),e=t.host,n=t.port;return null===e?"":null===n?U(e):U(e)+":"+n},Dt=function(){var t=_(this).host;return null===t?"":U(t)},Bt=function(){var t=_(this).port;return null===t?"":String(t)},Nt=function(){var t=_(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Rt=function(){var t=_(this).query;return t?"?"+t:""},Ft=function(){return _(this).searchParams},Vt=function(){var t=_(this).fragment;return t?"#"+t:""},zt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(o&&c($t,{href:zt(Et,(function(t){var e=_(this),n=String(t),r=Ct(e,n);if(r)throw TypeError(r);O(e.searchParams).updateSearchParams(e.query)})),origin:zt(Lt),protocol:zt(Pt,(function(t){var e=_(this);Ct(e,String(t)+":",at)})),username:zt(Tt,(function(t){var e=_(this),n=d(String(t));if(!tt(e)){e.username="";for(var r=0;r1?arguments[1]:void 0,e.length)),r=String(t);return c?c.call(e,r,n):e.slice(n,n+r.length)===r}})},"2cf4":function(t,e,n){var r,i,o,a=n("da84"),s=n("d039"),c=n("c6b6"),u=n("f8c2"),l=n("1be4"),f=n("cc12"),h=n("b39a"),d=a.location,p=a.setImmediate,v=a.clearImmediate,m=a.process,g=a.MessageChannel,b=a.Dispatch,y=0,w={},O="onreadystatechange",x=function(t){if(w.hasOwnProperty(t)){var e=w[t];delete w[t],e()}},_=function(t){return function(){x(t)}},j=function(t){x(t.data)},S=function(t){a.postMessage(t+"",d.protocol+"//"+d.host)};p&&v||(p=function(t){var e=[],n=1;while(arguments.length>n)e.push(arguments[n++]);return w[++y]=function(){("function"==typeof t?t:Function(t)).apply(void 0,e)},r(y),y},v=function(t){delete w[t]},"process"==c(m)?r=function(t){m.nextTick(_(t))}:b&&b.now?r=function(t){b.now(_(t))}:g&&!/(iphone|ipod|ipad).*applewebkit/i.test(h)?(i=new g,o=i.port2,i.port1.onmessage=j,r=u(o.postMessage,o,1)):!a.addEventListener||"function"!=typeof postMessage||a.importScripts||s(S)?r=O in f("script")?function(t){l.appendChild(f("script"))[O]=function(){l.removeChild(this),x(t)}}:function(t){setTimeout(_(t),0)}:(r=S,a.addEventListener("message",j,!1))),t.exports={set:p,clear:v}},"2d83":function(t,e,n){"use strict";var r=n("387f");t.exports=function(t,e,n,i,o){var a=new Error(t);return r(a,e,n,i,o)}},"2dc0":function(t,e,n){t.exports=n("588c")},"2e67":function(t,e,n){"use strict";t.exports=function(t){return!(!t||!t.__CANCEL__)}},"2e85":function(t,e,n){var r=n("9bfb");r("replace")},"2f5a":function(t,e,n){var r,i,o,a=n("96e9"),s=n("3ac6"),c=n("dfdb"),u=n("0273"),l=n("78e7"),f=n("b2ed"),h=n("6e9a"),d=s.WeakMap,p=function(t){return o(t)?i(t):r(t,{})},v=function(t){return function(e){var n;if(!c(e)||(n=i(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}};if(a){var m=new d,g=m.get,b=m.has,y=m.set;r=function(t,e){return y.call(m,t,e),e},i=function(t){return g.call(m,t)||{}},o=function(t){return b.call(m,t)}}else{var w=f("state");h[w]=!0,r=function(t,e){return u(t,w,e),e},i=function(t){return l(t,w)?t[w]:{}},o=function(t){return l(t,w)}}t.exports={set:r,get:i,has:o,enforce:p,getterFor:v}},"2f74":function(t,e,n){t.exports=n("68ec")},"2f97":function(t,e,n){var r=n("dfdb");t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},"2fa4":function(t,e,n){"use strict";n("20f6");var r=n("80d2");e["a"]=Object(r["h"])("spacer","div","v-spacer")},"2fa7":function(t,e,n){"use strict";n.d(e,"a",(function(){return o}));var r=n("85d3"),i=n.n(r);function o(t,e,n){return e in t?i()(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}},"30b5":function(t,e,n){"use strict";var r=n("c532");function i(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}t.exports=function(t,e,n){if(!e)return t;var o;if(n)o=n(e);else if(r.isURLSearchParams(e))o=e.toString();else{var a=[];r.forEach(e,(function(t,e){null!==t&&"undefined"!==typeof t&&(r.isArray(t)?e+="[]":t=[t],r.forEach(t,(function(t){r.isDate(t)?t=t.toISOString():r.isObject(t)&&(t=JSON.stringify(t)),a.push(i(e)+"="+i(t))})))})),o=a.join("&")}return o&&(t+=(-1===t.indexOf("?")?"?":"&")+o),t}},3206:function(t,e,n){"use strict";n.d(e,"a",(function(){return s}));n("99af");var r=n("2fa7"),i=n("2b0e"),o=n("d9bd");function a(t,e){return function(){return Object(o["c"])("The ".concat(t," component must be used inside a ").concat(e))}}function s(t,e,n){var o=e&&n?{register:a(e,n),unregister:a(e,n)}:null;return i["a"].extend({name:"registrable-inject",inject:Object(r["a"])({},t,{default:o})})}},3397:function(t,e,n){"use strict";var r=n("06fa");t.exports=function(t,e){var n=[][t];return!n||!r((function(){n.call(null,e||function(){throw 1},1)}))}},3408:function(t,e,n){},"34c3":function(t,e,n){"use strict";n("498a");var r=n("2b0e");e["a"]=r["a"].extend({name:"v-list-item-icon",functional:!0,render:function(t,e){var n=e.data,r=e.children;return n.staticClass="v-list-item__icon ".concat(n.staticClass||"").trim(),t("div",n,r)}})},"35a1":function(t,e,n){var r=n("f5df"),i=n("3f8c"),o=n("b622"),a=o("iterator");t.exports=function(t){if(void 0!=t)return t[a]||t["@@iterator"]||i[r(t)]}},"362a":function(t,e,n){"use strict";var r=n("a5eb"),i=n("7042"),o=n("f354"),a=n("9883"),s=n("b0ea"),c=n("7ef9"),u=n("d666");r({target:"Promise",proto:!0,real:!0},{finally:function(t){var e=s(this,a("Promise")),n="function"==typeof t;return this.then(n?function(n){return c(e,t()).then((function(){return n}))}:t,n?function(n){return c(e,t()).then((function(){throw n}))}:t)}}),i||"function"!=typeof o||o.prototype["finally"]||u(o.prototype,"finally",a("Promise").prototype["finally"])},3667:function(t,e,n){ +/*! + * v2.1.4-104-gc868b3a + * + */ +(function(e,n){t.exports=n()})("undefined"!==typeof self&&self,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=7)}([function(t,e,n){"use strict";n.d(e,"j",(function(){return i})),n.d(e,"d",(function(){return o})),n.d(e,"c",(function(){return a})),n.d(e,"h",(function(){return s})),n.d(e,"b",(function(){return c})),n.d(e,"k",(function(){return u})),n.d(e,"e",(function(){return l})),n.d(e,"g",(function(){return f})),n.d(e,"i",(function(){return h})),n.d(e,"a",(function(){return d})),n.d(e,"f",(function(){return p}));var r=n(1),i=u((function(t,e){var n=e.length;return u((function(r){for(var i=0;il&&(Y("Max buffer length exceeded: textNode"),t=Math.max(t,o.length)),M.length>l&&(Y("Max buffer length exceeded: numberNode"),t=Math.max(t,M.length)),I=l-t+H}function Y(t){void 0!==o&&(s(o),c(),o=void 0),e=Error(t+"\nLn: "+U+"\nCol: "+W+"\nChr: "+n),u(Object(r["o"])(void 0,void 0,e))}function X(){if(N===d)return s({}),c(),void(B=!0);N===p&&0===z||Y("Unexpected end"),void 0!==o&&(s(o),c(),o=void 0),B=!0}function G(t){return"\r"===t||"\n"===t||" "===t||"\t"===t}function Z(t){if(!e){if(B)return Y("Cannot write after close");var r=0;n=t[0];while(n){if(r>0&&(i=n),n=t[r++],!n)break;switch(H++,"\n"===n?(U++,W=0):W++,N){case d:if("{"===n)N=v;else if("["===n)N=g;else if(!G(n))return Y("Non-whitespace before {[.");continue;case w:case v:if(G(n))continue;if(N===w)R.push(O);else{if("}"===n){s({}),c(),N=R.pop()||p;continue}R.push(m)}if('"'!==n)return Y('Malformed object key should start with " ');N=y;continue;case O:case m:if(G(n))continue;if(":"===n)N===m?(R.push(m),void 0!==o&&(s({}),a(o),o=void 0),z++):void 0!==o&&(a(o),o=void 0),N=p;else if("}"===n)void 0!==o&&(s(o),c(),o=void 0),c(),z--,N=R.pop()||p;else{if(","!==n)return Y("Bad object");N===m&&R.push(m),void 0!==o&&(s(o),c(),o=void 0),N=w}continue;case g:case p:if(G(n))continue;if(N===g){if(s([]),z++,N=p,"]"===n){c(),z--,N=R.pop()||p;continue}R.push(b)}if('"'===n)N=y;else if("{"===n)N=v;else if("["===n)N=g;else if("t"===n)N=x;else if("f"===n)N=S;else if("n"===n)N=$;else if("-"===n)M+=n;else if("0"===n)M+=n,N=T;else{if(-1==="123456789".indexOf(n))return Y("Bad value");M+=n,N=T}continue;case b:if(","===n)R.push(b),void 0!==o&&(s(o),c(),o=void 0),N=p;else{if("]"!==n){if(G(n))continue;return Y("Bad array")}void 0!==o&&(s(o),c(),o=void 0),c(),z--,N=R.pop()||p}continue;case y:void 0===o&&(o="");var u=r-1;t:while(1){while(V>0)if(F+=n,n=t.charAt(r++),4===V?(o+=String.fromCharCode(parseInt(F,16)),V=0,u=r-1):V++,!n)break t;if('"'===n&&!D){N=R.pop()||p,o+=t.substring(u,r-1);break}if("\\"===n&&!D&&(D=!0,o+=t.substring(u,r-1),n=t.charAt(r++),!n))break;if(D){if(D=!1,"n"===n?o+="\n":"r"===n?o+="\r":"t"===n?o+="\t":"f"===n?o+="\f":"b"===n?o+="\b":"u"===n?(V=1,F=""):o+=n,n=t.charAt(r++),u=r-1,n)continue;break}f.lastIndex=r;var l=f.exec(t);if(!l){r=t.length+1,o+=t.substring(u,r-1);break}if(r=l.index+1,n=t.charAt(l.index),!n){o+=t.substring(u,r-1);break}}continue;case x:if(!n)continue;if("r"!==n)return Y("Invalid true started with t"+n);N=_;continue;case _:if(!n)continue;if("u"!==n)return Y("Invalid true started with tr"+n);N=j;continue;case j:if(!n)continue;if("e"!==n)return Y("Invalid true started with tru"+n);s(!0),c(),N=R.pop()||p;continue;case S:if(!n)continue;if("a"!==n)return Y("Invalid false started with f"+n);N=k;continue;case k:if(!n)continue;if("l"!==n)return Y("Invalid false started with fa"+n);N=C;continue;case C:if(!n)continue;if("s"!==n)return Y("Invalid false started with fal"+n);N=A;continue;case A:if(!n)continue;if("e"!==n)return Y("Invalid false started with fals"+n);s(!1),c(),N=R.pop()||p;continue;case $:if(!n)continue;if("u"!==n)return Y("Invalid null started with n"+n);N=E;continue;case E:if(!n)continue;if("l"!==n)return Y("Invalid null started with nu"+n);N=L;continue;case L:if(!n)continue;if("l"!==n)return Y("Invalid null started with nul"+n);s(null),c(),N=R.pop()||p;continue;case P:if("."!==n)return Y("Leading zero not followed by .");M+=n,N=T;continue;case T:if(-1!=="0123456789".indexOf(n))M+=n;else if("."===n){if(-1!==M.indexOf("."))return Y("Invalid number has two dots");M+=n}else if("e"===n||"E"===n){if(-1!==M.indexOf("e")||-1!==M.indexOf("E"))return Y("Invalid number has two exponential");M+=n}else if("+"===n||"-"===n){if("e"!==i&&"E"!==i)return Y("Invalid symbol in number");M+=n}else M&&(s(parseFloat(M)),c(),M=""),r--,N=R.pop()||p;continue;default:return Y("Unknown state: "+N)}}H>=I&&q()}}t(r["m"]).on(Z),t(r["n"]).on(X)}},function(t,e,n){"use strict";n.d(e,"a",(function(){return c})),n.d(e,"b",(function(){return u}));var r=n(19),i=n(3),o=n(2),a=n(20),s=n(0);function c(){return new XMLHttpRequest}function u(t,e,n,c,u,l,f){var h=t(i["m"]).emit,d=t(i["b"]).emit,p=0,v=!0;function m(){if("2"===String(e.status)[0]){var t=e.responseText,n=(" "+t.substr(p)).substr(1);n&&h(n),p=Object(o["e"])(t)}}function g(e){try{v&&t(i["c"]).emit(e.status,Object(a["a"])(e.getAllResponseHeaders())),v=!1}catch(n){}}t(i["a"]).on((function(){e.onreadystatechange=null,e.abort()})),"onprogress"in e&&(e.onprogress=m),e.onreadystatechange=function(){switch(e.readyState){case 2:case 3:return g(e);case 4:g(e);var n="2"===String(e.status)[0];n?(m(),t(i["n"]).emit()):d(Object(i["o"])(e.status,e.responseText))}};try{for(var b in e.open(n,c,!0),l)e.setRequestHeader(b,l[b]);Object(r["a"])(window.location,Object(r["b"])(c))||e.setRequestHeader("X-Requested-With","XMLHttpRequest"),e.withCredentials=f,e.send(u)}catch(y){window.setTimeout(Object(s["j"])(d,Object(i["o"])(void 0,void 0,y)),0)}}},function(t,e,n){"use strict";function r(t,e){function n(t){return{"http:":80,"https:":443}[t]}function r(e){return String(e.port||n(e.protocol||t.protocol))}return!!(e.protocol&&e.protocol!==t.protocol||e.host&&e.host!==t.host||e.host&&r(e)!==r(t))}function i(t){var e=/(\w+:)?(?:\/\/)([\w.-]+)?(?::(\d+))?\/?/,n=e.exec(t)||[];return{protocol:n[1]||"",host:n[2]||"",port:n[3]||""}}n.d(e,"a",(function(){return r})),n.d(e,"b",(function(){return i}))},function(t,e,n){"use strict";function r(t){var e={};return t&&t.split("\r\n").forEach((function(t){var n=t.indexOf(": ");e[t.substring(0,n)]=t.substring(n+2)})),e}n.d(e,"a",(function(){return r}))}])["default"]}))},"368e":function(t,e,n){},"36a7":function(t,e,n){},"373a":function(t,e,n){t.exports=n("2364")},"37c6":function(t,e,n){"use strict";var r=n("8e36");e["a"]=r["a"]},"37e8":function(t,e,n){var r=n("83ab"),i=n("9bf2"),o=n("825a"),a=n("df75");t.exports=r?Object.defineProperties:function(t,e){o(t);var n,r=a(e),s=r.length,c=0;while(s>c)i.f(t,n=r[c++],e[n]);return t}},"387f":function(t,e,n){"use strict";t.exports=function(t,e,n,r,i){return t.config=e,n&&(t.code=n),t.request=r,t.response=i,t}},"38cf":function(t,e,n){var r=n("23e7"),i=n("1148");r({target:"String",proto:!0},{repeat:i})},3934:function(t,e,n){"use strict";var r=n("c532");t.exports=r.isStandardBrowserEnv()?function(){var t,e=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function i(t){var r=t;return e&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return t=i(window.location.href),function(e){var n=r.isString(e)?i(e):e;return n.protocol===t.protocol&&n.host===t.host}}():function(){return function(){return!0}}()},"3a2f":function(t,e,n){"use strict";n("a9e3"),n("e25e");var r=n("2fa7"),i=(n("9734"),n("4ad4")),o=n("a9ad"),a=n("16b7"),s=n("b848"),c=n("75eb"),u=n("f573"),l=n("f2e7"),f=n("80d2"),h=n("d9bd"),d=n("58df");e["a"]=Object(d["a"])(o["a"],a["a"],s["a"],c["a"],u["a"],l["a"]).extend({name:"v-tooltip",props:{closeDelay:{type:[Number,String],default:0},disabled:Boolean,fixed:{type:Boolean,default:!0},openDelay:{type:[Number,String],default:0},openOnHover:{type:Boolean,default:!0},tag:{type:String,default:"span"},transition:String,zIndex:{default:null}},data:function(){return{calculatedMinWidth:0,closeDependents:!1}},computed:{calculatedLeft:function(){var t=this.dimensions,e=t.activator,n=t.content,r=!this.bottom&&!this.left&&!this.top&&!this.right,i=!1!==this.attach?e.offsetLeft:e.left,o=0;return this.top||this.bottom||r?o=i+e.width/2-n.width/2:(this.left||this.right)&&(o=i+(this.right?e.width:-n.width)+(this.right?10:-10)),this.nudgeLeft&&(o-=parseInt(this.nudgeLeft)),this.nudgeRight&&(o+=parseInt(this.nudgeRight)),"".concat(this.calcXOverflow(o,this.dimensions.content.width),"px")},calculatedTop:function(){var t=this.dimensions,e=t.activator,n=t.content,r=!1!==this.attach?e.offsetTop:e.top,i=0;return this.top||this.bottom?i=r+(this.bottom?e.height:-n.height)+(this.bottom?10:-10):(this.left||this.right)&&(i=r+e.height/2-n.height/2),this.nudgeTop&&(i-=parseInt(this.nudgeTop)),this.nudgeBottom&&(i+=parseInt(this.nudgeBottom)),"".concat(this.calcYOverflow(i+this.pageYOffset),"px")},classes:function(){return{"v-tooltip--top":this.top,"v-tooltip--right":this.right,"v-tooltip--bottom":this.bottom,"v-tooltip--left":this.left,"v-tooltip--attached":""===this.attach||!0===this.attach||"attach"===this.attach}},computedTransition:function(){return this.transition?this.transition:this.isActive?"scale-transition":"fade-transition"},offsetY:function(){return this.top||this.bottom},offsetX:function(){return this.left||this.right},styles:function(){return{left:this.calculatedLeft,maxWidth:Object(f["e"])(this.maxWidth),minWidth:Object(f["e"])(this.minWidth),opacity:this.isActive?.9:0,top:this.calculatedTop,zIndex:this.zIndex||this.activeZIndex}}},beforeMount:function(){var t=this;this.$nextTick((function(){t.value&&t.callActivate()}))},mounted:function(){"v-slot"===Object(f["p"])(this,"activator",!0)&&Object(h["b"])("v-tooltip's activator slot must be bound, try '