From: marcelveldt Date: Thu, 7 Nov 2019 02:00:27 +0000 (+0100) Subject: speed improvements X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=3c9735d0e67d02309f281707bc6d36b63eda1587;p=music-assistant-server.git speed improvements --- diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..cc67606f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "python.linting.pylintEnabled": true, + "python.linting.enabled": true +} \ No newline at end of file diff --git a/frontend/src/components/InfoHeader.vue b/frontend/src/components/InfoHeader.vue index e7b11e17..c9232039 100644 --- a/frontend/src/components/InfoHeader.vue +++ b/frontend/src/components/InfoHeader.vue @@ -27,21 +27,12 @@ height="220px" style="border: 4px solid rgba(0,0,0,.33);border-radius: 6px;" > - - -
- -
{{ itemDetails.name }} @@ -178,18 +169,18 @@
- -
+ +
+ +
%s' %(artistname, album_upc, mb_artist_id)) if not mb_artist_id and track_isrc: mb_artist_id = await self.musicbrainz.search_artist_by_track(artistname, None, track_isrc) + if mb_artist_id: LOGGER.debug('Got MusicbrainzArtistId for %s after search on isrc %s --> %s' %(artistname, track_isrc, mb_artist_id)) if not mb_artist_id and albumname: mb_artist_id = await self.musicbrainz.search_artist_by_album(artistname, albumname) + if mb_artist_id: LOGGER.debug('Got MusicbrainzArtistId for %s after search on albumname %s --> %s' %(artistname, albumname, mb_artist_id)) if not mb_artist_id and trackname: mb_artist_id = await self.musicbrainz.search_artist_by_track(artistname, trackname) - LOGGER.debug('Got musicbrainz artist id for artist %s --> %s' %(artistname, mb_artist_id)) + if mb_artist_id: LOGGER.debug('Got MusicbrainzArtistId for %s after search on trackname %s --> %s' %(artistname, trackname, mb_artist_id)) return mb_artist_id @staticmethod @@ -73,26 +72,25 @@ class MusicBrainz(): async def search_artist_by_album(self, artistname, albumname=None, album_upc=None): ''' retrieve musicbrainz artist id by providing the artist name and albumname or upc ''' + searchartist = re.sub(LUCENE_SPECIAL, r'\\\1', artistname) + #searchartist = searchartist.replace('/','').replace('\\','').replace('-', '') if album_upc: endpoint = 'release' params = {'query': 'barcode:%s' % album_upc} else: - searchartist = re.sub(LUCENE_SPECIAL, r'\\\1', artistname) - searchartist = searchartist.replace('/','').replace('\\','') searchalbum = re.sub(LUCENE_SPECIAL, r'\\\1', albumname) endpoint = 'release' params = {'query': 'artist:"%s" AND release:"%s"' % (searchartist, searchalbum)} result = await self.get_data(endpoint, params) - if result and result.get('releases'): - for strictness in [1, 0.95, 0.9]: + if result and 'releases' in result: + for strictness in [True, False]: for item in result['releases']: - if album_upc or Matcher(None, item['title'].lower(), albumname.lower()).ratio() >= strictness: + if album_upc or compare_strings(item['title'], albumname, strictness): for artist in item['artist-credit']: - artist = artist['artist'] - if Matcher(None, artist['name'].lower(), artistname.lower()).ratio() >= strictness: - return artist['id'] + if compare_strings(artist['artist']['name'], artistname, strictness): + return artist['artist']['id'] for item in artist.get('aliases',[]): - if item['name'].lower() == artistname.lower(): + if compare_strings(item['name'], artistname, strictness): return artist['id'] return '' @@ -100,7 +98,7 @@ class MusicBrainz(): ''' retrieve artist id by providing the artist name and trackname or track isrc ''' endpoint = 'recording' searchartist = re.sub(LUCENE_SPECIAL, r'\\\1', artistname) - searchartist = searchartist.replace('/','').replace('\\','') + #searchartist = searchartist.replace('/','').replace('\\','').replace('-', '') if track_isrc: endpoint = 'isrc/%s' % track_isrc params = {'inc': 'artist-credits'} @@ -109,20 +107,19 @@ class MusicBrainz(): endpoint = 'recording' params = {'query': '"%s" AND artist:"%s"' % (searchtrack, searchartist)} result = await self.get_data(endpoint, params) - if result and result.get('recordings'): - for strictness in [1, 0.95]: + if result and 'recordings' in result: + for strictness in [True, False]: for item in result['recordings']: - if track_isrc or Matcher(None, item['title'].lower(), trackname.lower()).ratio() >= strictness: + if track_isrc or compare_strings(item['title'], trackname, strictness): for artist in item['artist-credit']: - artist = artist['artist'] - if Matcher(None, artist['name'].lower(), artistname.lower()).ratio() >= strictness: - return artist['id'] + if compare_strings(artist['artist']['name'], artistname, strictness): + return artist['artist']['id'] for item in artist.get('aliases',[]): - if item['name'].lower() == artistname.lower(): + if compare_strings(item['name'], artistname, strictness): return artist['id'] return '' - @use_cache(30) + @use_cache(2) async def get_data(self, endpoint, params={}): ''' get data from api''' url = 'http://musicbrainz.org/ws/2/%s' % endpoint @@ -148,7 +145,7 @@ class FanartTv(): ''' perform async setup ''' self.http_session = aiohttp.ClientSession( loop=self.mass.event_loop, connector=aiohttp.TCPConnector()) - self.throttler = Throttler(rate_limit=1, period=1) + self.throttler = Throttler(rate_limit=1, period=2) async def artist_images(self, mb_artist_id): ''' retrieve images by musicbrainz artist id ''' diff --git a/music_assistant/models/musicprovider.py b/music_assistant/models/musicprovider.py index e3484913..066fa0eb 100755 --- a/music_assistant/models/musicprovider.py +++ b/music_assistant/models/musicprovider.py @@ -3,7 +3,7 @@ import asyncio from typing import List -from ..utils import run_periodic, LOGGER, parse_track_title +from ..utils import run_periodic, LOGGER, compare_strings from ..cache import use_cache from ..constants import CONF_ENABLED from .media_types import Album, Artist, Track, Playlist, MediaType, Radio @@ -17,8 +17,8 @@ class MusicProvider(): 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 + name = 'My great Music provider' # display name + prov_id = 'my_provider' # used as id icon = '' def __init__(self, mass, conf): @@ -31,7 +31,7 @@ class MusicProvider(): ### Common methods and properties #### - async def artist(self, prov_item_id, lazy=True) -> 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: @@ -40,43 +40,58 @@ class MusicProvider(): 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) + 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) -> int: + 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) + musicbrainz_id = await self.get_artist_musicbrainz_id( + 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) + artist_details.metadata = await self.mass.metadata.get_artist_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) - new_artist_toptracks = await self.get_artist_toptracks(artist_details.item_id) - if new_artist_toptracks: - item_provider_keys = [item['provider'] for item in new_artist.provider_ids] + 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)] + 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)] + if new_artist_toptracks or new_artist_albums: + 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: - await provider.match_artist(new_artist, new_artist_toptracks) + self.mass.event_loop.create_task( + provider.match_artist(new_artist, new_artist_albums, new_artist_toptracks)) return item_id - async def get_artist_musicbrainz_id(self, artist_details:Artist): + 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 - lookup_albums = await self.get_artist_albums(artist_details.item_id) - for lookup_album in lookup_albums[:5]: + if ref_album: + lookup_albums = [ref_album] + else: + 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: continue @@ -84,14 +99,17 @@ 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 if not musicbrainz_id: - lookup_tracks = await self.get_artist_toptracks(artist_details.item_id) - for lookup_track in lookup_tracks: + if ref_track: + lookup_tracks = [ref_track] + else: + 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 lookup_track_isrc = None @@ -99,25 +117,28 @@ 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: + 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 - album_details = await self.get_album(prov_item_id) + if not album_details: + album_details = await self.get_album(prov_item_id) 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) @@ -126,28 +147,31 @@ class MusicProvider(): async def add_album(self, album_details) -> int: ''' 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) + 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: - await provider.match_album(new_album) + self.mass.event_loop.create_task( + 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) if not item_id: - # album not yet in local database so fetch details + # track not yet in local database so fetch details if not track_details: track_details = await self.get_track(prov_item_id) 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) @@ -158,7 +182,7 @@ class MusicProvider(): 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) + 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 @@ -168,10 +192,14 @@ 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] for prov_id, provider in self.mass.music.providers.items(): - await provider.match_track(new_track) + if not prov_id in item_provider_keys: + self.mass.event_loop.create_task( + 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) @@ -192,94 +220,120 @@ class MusicProvider(): async def album_tracks(self, prov_album_id) -> List[Track]: ''' return album tracks for the given provider album id''' - items = [] album = await self.get_album(prov_album_id) - for prov_track in await self.get_album_tracks(prov_album_id): - db_id = await self.mass.db.get_database_id(self.prov_id, prov_track.item_id, MediaType.Track) - if db_id: - items.append( await self.mass.db.track(db_id) ) - else: - prov_track.album = album - items.append(prov_track) - return items + 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''' - items = [] - for prov_track in await self.get_playlist_tracks(prov_playlist_id, limit=limit, offset=offset): - for prov_mapping in prov_track.provider_ids: - item_prov_id = prov_mapping["provider"] - prov_item_id = prov_mapping["item_id"] - db_id = await self.mass.db.get_database_id(item_prov_id, prov_item_id, MediaType.Track) - if db_id: - items.append( await self.mass.db.track(db_id) ) - else: - items.append(prov_track) - return items - + 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) + 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 + pos += 1 + yield prov_track + async def artist_toptracks(self, prov_item_id) -> List[Track]: ''' return top tracks for an artist ''' - items = [] - for prov_track in await self.get_artist_toptracks(prov_item_id): + 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) + db_id = await self.mass.db.get_database_id(self.prov_id, prov_track.item_id, MediaType.Track) if db_id: - items.append( await self.mass.db.track(db_id) ) + # return database track instead if we have a match + yield self.mass.db.track(db_id) else: - items.append(prov_track) - return items + yield prov_track async def artist_albums(self, prov_item_id) -> List[Track]: ''' return (all) albums for an artist ''' - items = [] - for prov_album in await 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) + 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) if db_id: - items.append( await self.mass.db.album(db_id) ) + # return database album instead if we have a match + yield await self.mass.db.album(db_id) else: - items.append(prov_album) - return items - - async def match_artist(self, searchartist:Artist, searchtracks:List[Track]): + yield prov_album + + 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) + for strictness in [True, False]: + for item in search_results["albums"]: + 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): + # just load this item in the database where it will be strictly matched + await self.artist(item.artist.item_id, lazy=strictness) + return for searchtrack in searchtracks: - searchstr = "%s - %s" %(searchartist.name, searchtrack.name) + searchstr = "%s - %s" % (searchartist.name, searchtrack.name) search_results = await self.search(searchstr, [MediaType.Track], limit=5) - for item in search_results["tracks"]: - if (item and item.name == searchtrack.name and - item.version == searchtrack.version): - # double safety check - artist must match exactly ! - for artist in item.artists: - if artist.name.lower() == searchartist.name.lower(): - # just load this item in the database, it will be matched automagically ;-) - return await self.artist(artist.item_id, lazy=False) - - async def match_album(self, searchalbum:Album): + for strictness in [True, False]: + for item in search_results["tracks"]: + 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): + # 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 %s" %(searchalbum.artist.name, searchalbum.name, searchalbum.version) + searchstr = "%s - %s" % (searchalbum.artist.name, + searchalbum.name) + if searchalbum.version: + searchstr += ' ' + searchalbum.version search_results = await self.search(searchstr, [MediaType.Album], limit=5) for item in search_results["albums"]: - if (item and item.name == searchalbum.name and - item.version == searchalbum.version and - item.artist.name == searchalbum.artist.name): - # just load this item in the database, it will be matched automagically ;-) - await self.album(item.item_id, lazy=False) - - async def match_track(self, searchtrack:Track): + 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): + item.name = searchalbum.name + item.version = searchalbum.version + # 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.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 ''' - searchstr = "%s - %s" %(searchtrack.artists[0].name, searchtrack.name) + 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) for item in search_results["tracks"]: - if (item and item.name == searchtrack.name and - item.version == searchtrack.version and - item.album and item.album.name == searchtrack.album.name and - item.album.version == searchtrack.album.version): + 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): + # 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): + item.name = searchtrack.name + item.version = searchtrack.version # double safety check - artist must match exactly ! for artist in item.artists: - if artist.name in searchartists: - # just load this item in the database, it will be matched automagically ;-) - await self.track(item.item_id, lazy=False) + for searchartist in searchartists: + 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) + break ### Provider specific implementation ##### @@ -291,26 +345,36 @@ class MusicProvider(): "tracks": [], "playlists": [] } - + async def get_library_artists(self) -> List[Artist]: ''' retrieve library artists from the provider ''' - return [] - + # iterator ! + return + yield + async def get_library_albums(self) -> List[Album]: ''' retrieve library albums from the provider ''' - return [] + # iterator ! + return + yield async def get_library_tracks(self) -> List[Track]: ''' retrieve library tracks from the provider ''' - return [] + # iterator ! + return + yield async def get_playlists(self) -> List[Playlist]: ''' retrieve library/subscribed playlists from the provider ''' - return [] + # iterator ! + return + yield async def get_radios(self) -> List[Radio]: ''' retrieve library/subscribed radio stations from the provider ''' - return [] + # iterator ! + return + yield async def get_artist(self, prov_item_id) -> Artist: ''' get full artist details by id ''' @@ -318,11 +382,15 @@ class MusicProvider(): async def get_artist_albums(self, prov_item_id) -> List[Album]: ''' get a list of albums for the given artist ''' - raise NotImplementedError - + # 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 ''' - raise NotImplementedError + # iterator ! + return + yield async def get_album(self, prov_item_id) -> Album: ''' get full album details by id ''' @@ -340,19 +408,23 @@ class MusicProvider(): ''' get full radio details by id ''' raise NotImplementedError - async def get_album_tracks(self, prov_item_id, limit=100, offset=0) -> List[Track]: + async def get_album_tracks(self, prov_album_id, limit=100, offset=0) -> List[Track]: ''' get album tracks for given album id ''' - raise NotImplementedError + # iterator ! + return + yield - async def get_playlist_tracks(self, prov_item_id, limit=100, offset=0) -> List[Track]: + async def get_playlist_tracks(self, prov_playlist_id, limit=100, offset=0) -> List[Track]: ''' get playlist tracks for given playlist id ''' - raise NotImplementedError + # iterator ! + return + yield - async def add_library(self, prov_item_id, media_type:MediaType): + async def add_library(self, prov_item_id, media_type: MediaType): ''' add item to library ''' raise NotImplementedError - async def remove_library(self, prov_item_id, media_type:MediaType): + async def remove_library(self, prov_item_id, media_type: MediaType): ''' remove item from library ''' raise NotImplementedError @@ -363,8 +435,7 @@ class MusicProvider(): async def remove_playlist_tracks(self, prov_playlist_id, prov_track_ids): ''' remove track(s) from playlist ''' raise NotImplementedError - + async def get_stream_details(self, track_id): ''' get streamdetails for a track ''' raise NotImplementedError - \ No newline at end of file diff --git a/music_assistant/models/player.py b/music_assistant/models/player.py index e8183d1c..feea1d9c 100755 --- a/music_assistant/models/player.py +++ b/music_assistant/models/player.py @@ -6,7 +6,7 @@ from enum import Enum from typing import List import operator import time -from ..utils import run_periodic, LOGGER, parse_track_title, try_parse_int, \ +from ..utils import run_periodic, LOGGER, try_parse_int, \ try_parse_bool, try_parse_float from ..constants import EVENT_PLAYER_CHANGED from ..cache import use_cache diff --git a/music_assistant/models/playerprovider.py b/music_assistant/models/playerprovider.py index a9357090..60fff45d 100755 --- a/music_assistant/models/playerprovider.py +++ b/music_assistant/models/playerprovider.py @@ -4,7 +4,7 @@ import asyncio from enum import Enum from typing import List -from ..utils import run_periodic, LOGGER, parse_track_title +from ..utils import run_periodic, LOGGER from ..constants import CONF_ENABLED from ..cache import use_cache from .player_queue import PlayerQueue diff --git a/music_assistant/music_manager.py b/music_assistant/music_manager.py index 4003d5a2..b3b2118d 100755 --- a/music_assistant/music_manager.py +++ b/music_assistant/music_manager.py @@ -1,25 +1,57 @@ #!/usr/bin/env python3 # -*- coding:utf-8 -*- -import asyncio -from typing import List -import toolz import operator import os import base64 +import functools +from typing import List +import toolz from PIL import Image import aiohttp from .utils import run_periodic, LOGGER, load_provider_modules from .models.media_types import MediaType, Track, Artist, Album, Playlist, Radio -from .constants import CONF_KEY_MUSICPROVIDERS, EVENT_MUSIC_SYNC_STARTED, EVENT_MUSIC_SYNC_COMPLETED +from .constants import CONF_KEY_MUSICPROVIDERS, EVENT_MUSIC_SYNC_STATUS + + +def sync_task(desc): + """ decorator to report a sync task """ + def wrapper(func): + @functools.wraps(func) + async def wrapped(*args): + method_class = args[0] + prov_id = args[1] + # check if this sync task is not already running + for sync_prov_id, sync_desc in method_class.running_sync_jobs: + if sync_prov_id == prov_id and sync_desc == desc: + LOGGER.warning( + "Syncjob %s for provider %s is already running!", desc, + prov_id) + return + sync_job = (prov_id, desc) + if not method_class.running_sync_jobs: + LOGGER.info("Music provider sync started") + method_class.running_sync_jobs.append(sync_job) + await method_class.mass.signal_event( + EVENT_MUSIC_SYNC_STATUS, method_class.running_sync_jobs) + await func(*args) + LOGGER.info("Finished syncing %s for provider %s", desc, prov_id) + method_class.running_sync_jobs.remove(sync_job) + await method_class.mass.signal_event( + EVENT_MUSIC_SYNC_STATUS, method_class.running_sync_jobs) + if not method_class.running_sync_jobs: + LOGGER.info("Music provider sync completed") + + return wrapped + + return wrapper class MusicManager(): ''' several helpers around the musicproviders ''' - def __init__(self, mass): - self.sync_running = False + self.running_sync_jobs = [] self.mass = mass # dynamically load musicprovider modules self.providers = load_provider_modules(mass, CONF_KEY_MUSICPROVIDERS) @@ -30,9 +62,13 @@ class MusicManager(): for prov in self.providers.values(): await prov.setup() # schedule sync task - self.mass.event_loop.create_task(self.sync_music_providers()) + self.mass.event_loop.create_task(self.__sync_music_providers()) - async def item(self, item_id, media_type:MediaType, provider='database', lazy=True): + async def item(self, + item_id, + media_type: MediaType, + provider='database', + lazy=True): ''' get single music item by id and media type''' if media_type == MediaType.Artist: return await self.artist(item_id, provider, lazy=lazy) @@ -47,38 +83,93 @@ 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, + limit=0, + offset=0, + 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 def library_albums(self, limit=0, offset=0, orderby='name', provider_filter=None) -> List[Album]: + return await self.mass.db.library_artists(provider=provider_filter, + limit=limit, + offset=offset, + orderby=orderby) + + 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 def library_tracks(self, limit=0, offset=0, orderby='name', provider_filter=None) -> List[Track]: + return await self.mass.db.library_albums(provider=provider_filter, + limit=limit, + offset=offset, + orderby=orderby) + + 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, orderby='name', provider_filter=None) -> List[Playlist]: + return await self.mass.db.library_tracks(provider=provider_filter, + limit=limit, + offset=offset, + orderby=orderby) + + async def playlists(self, + limit=0, + offset=0, + 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, orderby='name', provider_filter=None) -> List[Playlist]: + return await self.mass.db.playlists(provider=provider_filter, + limit=limit, + offset=offset, + orderby=orderby) + + async def radios(self, + limit=0, + offset=0, + 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]: + 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) + 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) + 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) + 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) + 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) + return await self.radios(limit=limit, + offset=offset, + orderby=orderby, + provider_filter=provider_filter) async def artist(self, item_id, provider='database', lazy=True) -> Artist: ''' get artist by id ''' @@ -123,8 +214,9 @@ class MusicManager(): if radio.name == name: return radio return None - - async def artist_toptracks(self, artist_id, provider='database') -> List[Track]: + + async def artist_toptracks(self, artist_id, + provider='database') -> List[Track]: ''' get top tracks for given artist ''' artist = await self.artist(artist_id, provider) # always append database tracks @@ -133,12 +225,13 @@ class MusicManager(): prov_id = prov_mapping['provider'] prov_item_id = prov_mapping['item_id'] prov_obj = self.providers[prov_id] - items += await prov_obj.artist_toptracks(prov_item_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) + #items.sort(key=lambda x: x.name, reverse=False) return items - async def artist_albums(self, artist_id, provider='database') -> List[Album]: + 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 @@ -147,52 +240,52 @@ class MusicManager(): prov_id = prov_mapping['provider'] prov_item_id = prov_mapping['item_id'] prov_obj = self.providers[prov_id] - items += await prov_obj.artist_albums(prov_item_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) + #items.sort(key=lambda x: x.name, reverse=False) 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) - # if provider == 'database' and album.in_library: - # # library albums are synced - # items = await self.mass.db.album_tracks(album_id) - # if items: - # return items # collect the tracks from the first provider - for prov in album.provider_ids: - prov_obj = self.providers[prov['provider']] - items = await prov_obj.album_tracks(prov['item_id']) - if items: - break - items = sorted(items, key=operator.attrgetter('track_number'), reverse=False) + 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 def playlist_tracks(self, + playlist_id, + provider='database', + offset=0, + limit=50) -> List[Track]: ''' get the tracks for given playlist ''' - playlist = None - if not provider or provider == 'database': - playlist = await self.mass.db.playlist(playlist_id) - if playlist: - # database synced playlist, return tracks from db... - return await self.mass.db.playlist_tracks( - playlist.item_id, offset=offset, limit=limit) - else: - # return playlist tracks from provider - playlist = await self.playlist(playlist_id, provider) - prov = playlist.provider_ids[0] - return await self.providers[prov['provider']].playlist_tracks( - prov['item_id'], offset=offset, limit=limit) - - async def search(self, searchquery, media_types:List[MediaType], limit=10, online=False) -> dict: + 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 def search(self, + searchquery, + media_types: List[MediaType], + limit=10, + online=False) -> dict: ''' search database or providers ''' # get results from database result = await self.mass.db.search(searchquery, media_types, limit) if online: # include results from music providers for prov in self.providers.values(): - prov_results = await prov.search(searchquery, media_types, limit) + prov_results = await prov.search(searchquery, media_types, + limit) for item_type, items in prov_results.items(): if not item_type in result: result[item_type] = items @@ -200,16 +293,22 @@ class MusicManager(): result[item_type] += items # filter out duplicates for item_type, items in result.items(): - items = list(toolz.unique(items, key=operator.attrgetter('item_id'))) + items = list( + toolz.unique(items, key=operator.attrgetter('item_id'))) return result - async def item_action(self, item_id, media_type, provider, action, action_details=None): + async def item_action(self, + item_id, + media_type, + provider, + action, + action_details=None): ''' perform action on item (such as library add/remove) ''' result = None item = await self.item(item_id, media_type, provider, lazy=False) if not item: return False - if action in ['library_add', 'library_remove']: + if 'library_' in action: # remove or add item to the library for prov_mapping in item.provider_ids: prov_id = prov_mapping['provider'] @@ -217,44 +316,60 @@ class MusicManager(): for prov in self.providers.values(): if prov.prov_id == prov_id: if action == 'library_add': - result = await prov.add_library(prov_item_id, media_type) - await self.mass.db.add_to_library(item.item_id, item.media_type, prov_id) + result = await prov.add_library( + prov_item_id, media_type) + await self.mass.db.add_to_library( + item.item_id, item.media_type, prov_id) elif action == 'library_remove': - result = await prov.remove_library(prov_item_id, media_type) - await self.mass.db.remove_from_library(item.item_id, item.media_type, prov_id) + result = await prov.remove_library( + prov_item_id, media_type) + await self.mass.db.remove_from_library( + item.item_id, item.media_type, prov_id) elif action == 'playlist_add': result = await self.add_playlist_tracks(action_details, [item]) elif action == 'playlist_remove': result = await self.remove_playlist_tracks(action_details, [item]) return result - - async def add_playlist_tracks(self, playlist_id, tracks:List[Track]): + + async def add_playlist_tracks(self, playlist_id, tracks: List[Track]): ''' add tracks to playlist - make sure we dont add dupes ''' # we can only edit playlists that are in the database (marked as editable) playlist = await self.playlist(playlist_id, 'database') if not playlist or not playlist.is_editable: - LOGGER.warning("Playlist %s is not editable - skip addition of tracks" %(playlist.name)) + LOGGER.warning( + "Playlist %s is not editable - skip addition of tracks" % + (playlist.name)) return False - playlist_prov = playlist.provider_ids[0] # playlist can only have one provider (for now) - cur_playlist_tracks = await self.mass.db.playlist_tracks(playlist_id, limit=0) + # playlist can only have one provider (for now) + playlist_prov = playlist.provider_ids[0] + cur_playlist_tracks = await self.mass.db.playlist_tracks(playlist_id, + limit=0) # grab all (database) track ids in the playlist so we can check for duplicates cur_playlist_track_ids = [item.item_id for item in cur_playlist_tracks] track_ids_to_add = [] for index, track in enumerate(tracks): if not track.provider == 'database': # make sure we have a database track - track = await self.track(track.item_id, track.provider, lazy=False) + track = await self.track(track.item_id, + track.provider, + lazy=False) if track.item_id in cur_playlist_track_ids: - LOGGER.warning("Track %s already in playlist %s - skip addition" %(track.name, playlist.name)) + LOGGER.warning( + "Track %s already in playlist %s - skip addition" % + (track.name, playlist.name)) continue # we can only add a track to a provider playlist if the track is available on that provider # exception is the file provider which does accept tracks from all providers in the m3u playlist # this should all be handled in the frontend but these checks are here just to be safe - track_playlist_provs = [item['provider'] for item in track.provider_ids] + track_playlist_provs = [ + item['provider'] for item in track.provider_ids + ] if playlist_prov['provider'] in track_playlist_provs: # a track can contain multiple versions on the same provider # simply sort by quality and just add the first one (assuming the track is still available) - track_versions = sorted(track.provider_ids, key=operator.itemgetter('quality'), reverse=True) + track_versions = sorted(track.provider_ids, + key=operator.itemgetter('quality'), + reverse=True) for track_version in track_versions: if track_version['provider'] == playlist_prov['provider']: track_ids_to_add.append(track_version['item_id']) @@ -263,187 +378,173 @@ class MusicManager(): # the file provider can handle uri's from all providers in the file so simply add the db id track_ids_to_add.append(track.item_id) else: - LOGGER.warning("Track %s not available on provider %s - skip addition to playlist %s" %(track.name, playlist_prov['provider'], playlist.name)) + LOGGER.warning( + "Track %s not available on provider %s - skip addition to playlist %s" + % (track.name, playlist_prov['provider'], playlist.name)) continue - # add track to db playlist - new_pos = len(cur_playlist_tracks) + index - await self.mass.db.add_playlist_track(playlist.item_id, track.item_id, new_pos) # actually add the tracks to the playlist on the provider if track_ids_to_add: - return await self.providers[playlist_prov['provider']].add_playlist_tracks(playlist_prov['item_id'], track_ids_to_add) + 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]): + async def remove_playlist_tracks(self, playlist_id, tracks: List[Track]): ''' remove tracks from playlist ''' # we can only edit playlists that are in the database (marked as editable) playlist = await self.playlist(playlist_id, 'database') if not playlist or not playlist.is_editable: - LOGGER.warning("Playlist %s is not editable - skip removal of tracks" %(playlist.name)) + LOGGER.warning( + "Playlist %s is not editable - skip removal of tracks" % + (playlist.name)) return False - prov_playlist = playlist.provider_ids[0] # playlist can only have one provider (for now) + # playlist can only have one provider (for now) + prov_playlist = playlist.provider_ids[0] prov_playlist_playlist_id = prov_playlist['item_id'] prov_playlist_provider_id = prov_playlist['provider'] track_ids_to_remove = [] for track in tracks: if not track.provider == 'database': # make sure we have a database track - track = await self.track(track.item_id, track.provider, lazy=False) + track = await self.track(track.item_id, + track.provider, + lazy=False) # a track can contain multiple versions on the same provider, remove all for track_provider in track.provider_ids: if track_provider['provider'] == prov_playlist_provider_id: track_ids_to_remove.append(track_provider['item_id']) - # remove track from db playlist - await self.mass.db.remove_playlist_track(playlist.item_id, track.item_id) # actually remove the tracks from the playlist on the provider if track_ids_to_remove: - return await self.providers[prov_playlist_provider_id].add_playlist_tracks(prov_playlist_playlist_id, track_ids_to_remove) + return await self.providers[prov_playlist_provider_id + ].remove_playlist_tracks( + prov_playlist_playlist_id, + track_ids_to_remove) @run_periodic(3600) - async def sync_music_providers(self): + async def __sync_music_providers(self): ''' periodic sync of all music providers ''' - if self.sync_running: - return - LOGGER.info("Music provider sync started") - for prov_id in self.providers.keys(): - self.sync_running = prov_id - await self.mass.signal_event(EVENT_MUSIC_SYNC_STARTED, prov_id) - # sync library items for each provider (if supported) - await self.sync_library_artists(prov_id) - await self.sync_library_albums(prov_id) - await self.sync_library_tracks(prov_id) - await self.sync_playlists(prov_id) - await self.sync_radios(prov_id) - LOGGER.info("Music provider sync completed") - await self.mass.signal_event(EVENT_MUSIC_SYNC_COMPLETED, None) - self.sync_running = None - + for prov_id in self.providers: + self.mass.event_loop.create_task(self.sync_music_provider(prov_id)) + + async def sync_music_provider(self, prov_id: str): + """ + Sync a music provider. + param prov_id: {string} -- provider id to sync + """ + 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) + + @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_db_ids = [item.item_id for item in prev_items] - cur_items = await music_provider.get_library_artists() cur_db_ids = [] - for item in cur_items: + async for item in music_provider.get_library_artists(): db_item = await music_provider.artist(item.item_id, lazy=False) cur_db_ids.append(db_item.item_id) if not db_item.item_id in prev_db_ids: - await self.mass.db.add_to_library(db_item.item_id, MediaType.Artist, prov_id) + await self.mass.db.add_to_library(db_item.item_id, + MediaType.Artist, prov_id) # process deletions for db_id in prev_db_ids: if db_id not in cur_db_ids: - await self.mass.db.remove_from_library(db_id, MediaType.Artist, prov_id) - LOGGER.info("Finished syncing Artists for provider %s" % prov_id) + await self.mass.db.remove_from_library(db_id, MediaType.Artist, + prov_id) + @sync_task('albums') 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_db_ids = [item.item_id for item in prev_items] - cur_items = await music_provider.get_library_albums() cur_db_ids = [] - for item in cur_items: - db_item = await music_provider.album(item.item_id, lazy=False) - cur_db_ids.append(db_item.item_id) - # precache album tracks... - for album_track in await music_provider.album_tracks(item.item_id): - await self.track(album_track.item_id, album_track.provider) - if not db_item.item_id in prev_db_ids: - await self.mass.db.add_to_library(db_item.item_id, MediaType.Album, prov_id) + async for item in music_provider.get_library_albums(): + db_album = await music_provider.album(item.item_id, lazy=False) + cur_db_ids.append(db_album.item_id) + if not db_album.item_id in prev_db_ids: + await self.mass.db.add_to_library(db_album.item_id, + MediaType.Album, prov_id) + # precache album tracks + [item async for item in music_provider.album_tracks(item.item_id)] # process deletions for db_id in prev_db_ids: if db_id not in cur_db_ids: - await self.mass.db.remove_from_library(db_id, MediaType.Album, prov_id) - LOGGER.info("Finished syncing Albums for provider %s" % prov_id) + await self.mass.db.remove_from_library(db_id, MediaType.Album, + prov_id) + @sync_task('tracks') 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_db_ids = [item.item_id for item in prev_items] - cur_items = await music_provider.get_library_tracks() cur_db_ids = [] - for item in cur_items: + async for item in music_provider.get_library_tracks(): db_item = await music_provider.track(item.item_id, lazy=False) cur_db_ids.append(db_item.item_id) if not db_item.item_id in prev_db_ids: - await self.mass.db.add_to_library(db_item.item_id, MediaType.Track, prov_id) + await self.mass.db.add_to_library(db_item.item_id, + MediaType.Track, prov_id) # process deletions for db_id in prev_db_ids: if db_id not in cur_db_ids: - await self.mass.db.remove_from_library(db_id, MediaType.Track, prov_id) - LOGGER.info("Finished syncing Tracks for provider %s" % prov_id) + await self.mass.db.remove_from_library(db_id, MediaType.Track, + prov_id) + @sync_task('playlists') async def sync_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_db_ids = [item.item_id for item in prev_items] - cur_items = await music_provider.get_playlists() cur_db_ids = [] - for item in cur_items: + async for item in music_provider.get_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) if not db_id in prev_db_ids: - await self.mass.db.add_to_library(db_id, MediaType.Playlist, prov_id) - # sync playlist tracks - await self.sync_playlist_tracks(db_id, prov_id, item.item_id) + await self.mass.db.add_to_library(db_id, MediaType.Playlist, + prov_id) # process playlist deletions for db_id in prev_db_ids: if db_id not in cur_db_ids: - await self.mass.db.remove_from_library(db_id, MediaType.Playlist, prov_id) - LOGGER.info("Finished syncing Playlists for provider %s" % prov_id) - - async def sync_playlist_tracks(self, db_playlist_id, prov_id, prov_playlist_id): - ''' sync library playlists tracks for given provider''' - playlist = await self.mass.db.playlist(db_playlist_id) - music_provider = self.providers[prov_id] - prev_items = await self.playlist_tracks(db_playlist_id) - prev_db_ids = [item.item_id for item in prev_items] - cur_items = await music_provider.get_playlist_tracks(prov_playlist_id, limit=0) - cur_db_ids = [] - pos = 0 - for item in cur_items: - # we need to do this the complicated way because the file provider can return tracks from other providers - for prov_mapping in item.provider_ids: - item_provider = prov_mapping['provider'] - prov_item_id = prov_mapping['item_id'] - db_item = await self.providers[item_provider].track(prov_item_id, lazy=False) - if not db_item.item_id in cur_db_ids: - cur_db_ids.append(db_item.item_id) - # always add/update because position could be changed - # note: we ignore duplicate tracks in the same playlist - await self.mass.db.add_playlist_track(db_playlist_id, db_item.item_id, pos) - else: - LOGGER.warning("SKIP duplicate track in playlist %s: %s" %(playlist.name, db_item.name)) - pos += 1 - # process playlist track deletions - for db_id in prev_db_ids: - if db_id not in cur_db_ids: - await self.mass.db.remove_playlist_track(db_playlist_id, db_id) - LOGGER.info("Finished syncing Playlist %s tracks for provider %s" % (playlist.name, prov_id)) + await self.mass.db.remove_from_library(db_id, + MediaType.Playlist, + prov_id) + @sync_task('radios') async def sync_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_db_ids = [item.item_id for item in prev_items] - cur_items = await music_provider.get_radios() cur_db_ids = [] - for item in cur_items: - db_id = await self.mass.db.get_database_id(prov_id, item.item_id, MediaType.Radio) + async for item in music_provider.get_radios(): + db_id = await self.mass.db.get_database_id(prov_id, item.item_id, + MediaType.Radio) if not db_id: db_id = await self.mass.db.add_radio(item) cur_db_ids.append(db_id) if not db_id in prev_db_ids: - await self.mass.db.add_to_library(db_id, MediaType.Radio, prov_id) + await self.mass.db.add_to_library(db_id, MediaType.Radio, + prov_id) # process deletions for db_id in prev_db_ids: if db_id not in cur_db_ids: - await self.mass.db.remove_from_library(db_id, MediaType.Radio, prov_id) - LOGGER.info("Finished syncing Radios for provider %s" % prov_id) - - async def get_image_path(self, item_id, media_type:MediaType, provider, size=50, key='image'): + await self.mass.db.remove_from_library(db_id, MediaType.Radio, + prov_id) + + async def get_image_path(self, + item_id, + media_type: MediaType, + provider, + size=50, + key='image'): ''' get path to (resized) thumb image for given media item ''' cache_folder = os.path.join(self.mass.datapath, '.thumbs') cache_id = f'{item_id}{media_type}{provider}{key}' @@ -455,19 +556,24 @@ class MusicManager(): return cache_file_sized # no file in cache so we should get it img_url = '' - item = await self.item(item_id, media_type, provider) + # we only retrieve items that we already have in cache + item = None + if await self.mass.db.get_database_id(provider, item_id, media_type): + item = await self.item(item_id, media_type, provider) if not item: return '' if item and item.metadata.get(key): img_url = item.metadata[key] elif media_type == MediaType.Track: # try album image instead for tracks - return await self.get_image_path( - item.album.item_id, MediaType.Album, item.album.provider, size, key) + return await self.get_image_path(item.album.item_id, + MediaType.Album, + item.album.provider, size, key) elif media_type == MediaType.Album: # try artist image instead for albums - return await self.get_image_path( - item.artist.item_id, MediaType.Artist, item.artist.provider, size, key) + return await self.get_image_path(item.artist.item_id, + MediaType.Artist, + item.artist.provider, size, key) if not img_url: return None # fetch image and store in cache @@ -485,9 +591,9 @@ class MusicManager(): # save resized image basewidth = size img = Image.open(cache_file_org) - wpercent = (basewidth/float(img.size[0])) - hsize = int((float(img.size[1])*float(wpercent))) - img = img.resize((basewidth,hsize), Image.ANTIALIAS) + wpercent = (basewidth / float(img.size[0])) + hsize = int((float(img.size[1]) * float(wpercent))) + img = img.resize((basewidth, hsize), Image.ANTIALIAS) img.save(cache_file_sized) # return file from cache return cache_file_sized diff --git a/music_assistant/musicproviders/file.py b/music_assistant/musicproviders/file.py index 506c596f..5cae841f 100644 --- a/music_assistant/musicproviders/file.py +++ b/music_assistant/musicproviders/file.py @@ -10,7 +10,7 @@ import base64 import taglib from ..cache import use_cache -from ..utils import run_periodic, LOGGER, parse_track_title +from ..utils import run_periodic, LOGGER, parse_title_and_version from ..models import MusicProvider, MediaType, TrackQuality, AlbumType, Artist, Album, Track, Playlist from ..constants import CONF_ENABLED @@ -62,43 +62,39 @@ class FileProvider(MusicProvider): ''' get artist folders in music directory ''' if not os.path.isdir(self._music_dir): LOGGER.error("music path does not exist: %s" % self._music_dir) - return [] - result = [] + return + yield for dirname in os.listdir(self._music_dir): dirpath = os.path.join(self._music_dir, dirname) if os.path.isdir(dirpath) and not dirpath.startswith('.'): artist = await self.get_artist(dirpath) if artist: - result.append(artist) - return result + yield artist async def get_library_albums(self) -> List[Album]: ''' get album folders recursively ''' - result = [] - for artist in await self.get_library_artists(): - result += await self.get_artist_albums(artist.item_id) - return result + async for artist in await self.get_library_artists(): + async for album in self.get_artist_albums(artist.item_id): + yield album async def get_library_tracks(self) -> List[Track]: ''' get all tracks recursively ''' #TODO: support disk subfolders - result = [] - for album in await self.get_library_albums(): - result += await self.get_album_tracks(album.item_id) - return result + async for album in await self.get_library_albums(): + async for track in self.get_album_tracks(album.item_id): + yield track async def get_playlists(self) -> List[Playlist]: ''' retrieve playlists from disk ''' if not self._playlists_dir: - return [] - result = [] + return + yield for filename in os.listdir(self._playlists_dir): filepath = os.path.join(self._playlists_dir, filename) if os.path.isfile(filepath) and not filename.startswith('.') and filename.lower().endswith('.m3u'): playlist = await self.get_playlist(filepath) if playlist: - result.append(playlist) - return result + yield playlist async def get_artist(self, prov_item_id) -> Artist: ''' get full artist details by id ''' @@ -136,7 +132,7 @@ class FileProvider(MusicProvider): album = Album() album.item_id = prov_item_id album.provider = self.prov_id - album.name, album.version = parse_track_title(name) + album.name, album.version = parse_title_and_version(name) album.artist = await self.get_artist(artistpath) if not album.artist: raise Exception("No album artist ! %s" % artistpath) @@ -181,14 +177,13 @@ class FileProvider(MusicProvider): async def get_album_tracks(self, prov_album_id) -> List[Track]: ''' get album tracks for given album id ''' - result = [] if not os.sep in prov_album_id: albumpath = base64.b64decode(prov_album_id).decode('utf-8') else: albumpath = prov_album_id if not os.path.isdir(albumpath): LOGGER.error("album path does not exist: %s" % albumpath) - return [] + return album = await self.get_album(albumpath) for filename in os.listdir(albumpath): filepath = os.path.join(albumpath, filename) @@ -196,20 +191,19 @@ class FileProvider(MusicProvider): track = await self.__parse_track(filepath) if track: track.album = album - result.append(track) - return result + yield track async def get_playlist_tracks(self, prov_playlist_id, limit=50, offset=0) -> List[Track]: ''' get playlist tracks for given playlist id ''' - tracks = [] if not os.sep in prov_playlist_id: itempath = base64.b64decode(prov_playlist_id).decode('utf-8') else: itempath = prov_playlist_id if not os.path.isfile(itempath): LOGGER.error("playlist path does not exist: %s" % itempath) - return [] + return counter = 0 + index = 0 with open(itempath) as f: for line in f.readlines(): line = line.strip() @@ -218,35 +212,32 @@ class FileProvider(MusicProvider): if counter > offset: track = await self.__parse_track_from_uri(line) if track: - tracks.append(track) - if limit and len(tracks) == limit: + yield track + index += 1 + if limit and index == limit: break - return tracks async def get_artist_albums(self, prov_artist_id) -> List[Album]: ''' get a list of albums for the given artist ''' - result = [] if not os.sep in prov_artist_id: artistpath = base64.b64decode(prov_artist_id).decode('utf-8') else: artistpath = prov_artist_id if not os.path.isdir(artistpath): LOGGER.error("artist path does not exist: %s" % artistpath) - return [] + return for dirname in os.listdir(artistpath): dirpath = os.path.join(artistpath, dirname) if os.path.isdir(dirpath) and not dirpath.startswith('.'): album = await self.get_album(dirpath) if album: - result.append(album) - return result + yield album async def get_artist_toptracks(self, prov_artist_id) -> List[Track]: - ''' get a list of 10 random tracks as we have no clue about preference ''' - tracks = [] - for album in await self.get_artist_albums(prov_artist_id): - tracks += await self.get_album_tracks(album.item_id) - return tracks[:10] + ''' get a list of random tracks as we have no clue about preference ''' + async for album in await self.get_artist_albums(prov_artist_id): + async for track in self.get_album_tracks(album.item_id): + yield track async def get_stream_details(self, track_id): ''' return the content details for the given track when it will be streamed''' @@ -275,7 +266,7 @@ class FileProvider(MusicProvider): track.item_id = prov_item_id track.provider = self.prov_id name = song.tags['TITLE'][0] - track.name, track.version = parse_track_title(name) + track.name, track.version = parse_title_and_version(name) albumpath = filename.rsplit(os.sep,1)[0] track.album = await self.get_album(albumpath) artists = [] diff --git a/music_assistant/musicproviders/qobuz.py b/music_assistant/musicproviders/qobuz.py index 68fd536b..2603230a 100644 --- a/music_assistant/musicproviders/qobuz.py +++ b/music_assistant/musicproviders/qobuz.py @@ -12,12 +12,12 @@ import hashlib from asyncio_throttle import Throttler from ..cache import use_cache -from ..utils import run_periodic, LOGGER, parse_track_title +from ..utils import run_periodic, LOGGER, parse_title_and_version from ..app_vars import get_app_var from ..models import MusicProvider, MediaType, TrackQuality, \ - AlbumType, Artist, Album, Track, Playlist + AlbumType, Artist, Album, Track, Playlist from ..constants import CONF_USERNAME, CONF_PASSWORD, CONF_ENABLED, \ - CONF_TYPE_PASSWORD, EVENT_STREAM_STARTED, EVENT_PLAYBACK_STOPPED + CONF_TYPE_PASSWORD, EVENT_STREAM_STARTED, EVENT_PLAYBACK_STOPPED PROV_ID = 'qobuz' PROV_NAME = 'Qobuz' @@ -25,13 +25,13 @@ PROV_CLASS = 'QobuzProvider' CONFIG_ENTRIES = [ (CONF_ENABLED, False, CONF_ENABLED), - (CONF_USERNAME, "", CONF_USERNAME), + (CONF_USERNAME, "", CONF_USERNAME), (CONF_PASSWORD, CONF_TYPE_PASSWORD, CONF_PASSWORD) - ] +] class QobuzProvider(MusicProvider): - + def __init__(self, mass, conf): ''' Support for streaming music provider Qobuz ''' self.name = PROV_NAME @@ -48,11 +48,11 @@ class QobuzProvider(MusicProvider): async def setup(self): ''' perform async setup ''' self.http_session = aiohttp.ClientSession( - loop=self.mass.event_loop, connector=aiohttp.TCPConnector()) - self.throttler = Throttler(rate_limit=2, period=1) + 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) - + async def search(self, searchstring, media_types=List[MediaType], limit=5): ''' perform search on the provider ''' result = { @@ -61,7 +61,7 @@ class QobuzProvider(MusicProvider): "tracks": [], "playlists": [] } - params = {"query": searchstring, "limit": limit } + params = {"query": searchstring, "limit": limit} if len(media_types) == 1: # qobuz does not support multiple searchtypes, falls back to all if no type given if media_types[0] == MediaType.Artist: @@ -93,45 +93,37 @@ class QobuzProvider(MusicProvider): for item in searchresult["playlists"]["items"]: result["playlists"].append(await self.__parse_playlist(item)) return result - + async def get_library_artists(self) -> List[Artist]: ''' retrieve library artists from qobuz ''' - result = [] params = {'type': 'artists'} for item in await self.__get_all_items("favorite/getUserFavorites", params, key='artists'): artist = await self.__parse_artist(item) if artist: - result.append(artist) - return result - + yield artist + async def get_library_albums(self) -> List[Album]: ''' retrieve library albums from qobuz ''' - result = [] params = {'type': 'albums'} for item in await self.__get_all_items("favorite/getUserFavorites", params, key='albums'): album = await self.__parse_album(item) if album: - result.append(album) - return result + yield album async def get_library_tracks(self) -> List[Track]: ''' retrieve library tracks from qobuz ''' - result = [] params = {'type': 'tracks'} for item in await self.__get_all_items("favorite/getUserFavorites", params, key='tracks'): track = await self.__parse_track(item) if track: - result.append(track) - return result + yield track async def get_playlists(self) -> List[Playlist]: ''' retrieve playlists from the provider ''' - result = [] for item in await self.__get_all_items("playlist/getUserPlaylists", key='playlists', cache_checksum=time.time()): playlist = await self.__parse_playlist(item) if playlist: - result.append(playlist) - return result + yield playlist async def get_artist(self, prov_artist_id) -> Artist: ''' get full artist details by id ''' @@ -157,63 +149,59 @@ 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) -> List[Track]: + async def get_album_tracks(self, prov_album_id, limit=25, offset=0) -> List[Track]: ''' get album tracks for given album id ''' params = {'album_id': prov_album_id} - track_objs = await self.__get_all_items("album/get", params, key='tracks') - tracks = [] + 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) if track: - tracks.append(track) + yield track else: - LOGGER.warning("Unavailable track found in album %s: %s" %(prov_album_id, track_obj['title'])) - return tracks + LOGGER.warning("Unavailable track found in album %s: %s", + prov_album_id, track_obj['title']) - async def get_playlist_tracks(self, prov_playlist_id, limit=100, offset=0) -> List[Track]: + 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"] 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) - tracks = [] for track_obj in track_objs: playlist_track = await self.__parse_track(track_obj) if playlist_track: - tracks.append(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" % ( + playlist_obj['name'], track_obj['title'])) # TODO: should we look for an alternative track version if the original is marked unavailable ? - return tracks - async def get_artist_albums(self, prov_artist_id, limit=100, offset=0) -> List[Album]: + async def get_artist_albums(self, prov_artist_id, limit=25, offset=0) -> List[Album]: ''' get a list of albums for the given artist ''' - params = {'artist_id': prov_artist_id, 'extra': 'albums', 'limit': limit, 'offset': offset} + params = {'artist_id': prov_artist_id, + 'extra': 'albums', 'limit': limit, 'offset': offset} result = await self.__get_data('artist/get', params) - albums = [] for item in result['albums']['items']: if str(item['artist']['id']) == str(prov_artist_id): album = await self.__parse_album(item) if album: - albums.append(album) - return albums + yield album async def get_artist_toptracks(self, prov_artist_id) -> List[Track]: ''' get a list of most popular tracks for the given artist ''' # artist toptracks not supported on Qobuz, so use search instead # assuming qobuz returns results sorted by popularity - items = [] artist = await self.get_artist(prov_artist_id) - params = {"query": artist.name, "limit": 25, "type": "tracks" } + 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): track = await self.__parse_track(item) if track: - items.append(track) - return items - - async def add_library(self, prov_item_id, media_type:MediaType): + yield track + + 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}) @@ -225,9 +213,10 @@ class QobuzProvider(MusicProvider): 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)) + 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): + 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}) @@ -239,8 +228,9 @@ class QobuzProvider(MusicProvider): 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)) - + 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 ''' params = { @@ -256,21 +246,24 @@ class QobuzProvider(MusicProvider): for track in await self.__get_all_items("playlist/get", params, key='tracks', limit=0): 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): ''' return the content details for the given track when it will be streamed''' streamdetails = None 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'} + 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) 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", @@ -278,7 +271,7 @@ class QobuzProvider(MusicProvider): "content_type": streamdetails['mime_type'].split('/')[1], "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): @@ -296,9 +289,9 @@ class QobuzProvider(MusicProvider): 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: # report streaming ended to qobuz @@ -307,9 +300,9 @@ class QobuzProvider(MusicProvider): 'user_id': user_id, 'track_id': msg_details["item_id"], 'duration': int(msg_details["seconds_played"]) - } + } await self.__get_data('/track/reportStreamingEnd', params, ignore_cache=True) - + async def __parse_artist(self, artist_obj): ''' parse qobuz artist object to generic layout ''' artist = Artist() @@ -329,7 +322,8 @@ class QobuzProvider(MusicProvider): artist.metadata["image"] = artist_obj['image'][key] break if artist_obj.get('biography'): - artist.metadata["biography"] = artist_obj['biography'].get('content','') + artist.metadata["biography"] = artist_obj['biography'].get( + 'content', '') if artist_obj.get('url'): artist.metadata["qobuz_url"] = artist_obj['url'] return artist @@ -350,7 +344,7 @@ class QobuzProvider(MusicProvider): quality = TrackQuality.FLAC_LOSSLESS_HI_RES_2 elif album_obj['maximum_bit_depth'] > 16: quality = TrackQuality.FLAC_LOSSLESS_HI_RES_1 - elif album_obj.get('format_id',0) == 5: + elif album_obj.get('format_id', 0) == 5: quality = TrackQuality.LOSSY_AAC else: quality = TrackQuality.FLAC_LOSSLESS @@ -358,15 +352,15 @@ class QobuzProvider(MusicProvider): "provider": self.prov_id, "item_id": album_obj['id'], "quality": quality, - "details": "%skHz %sbit" %(album_obj['maximum_sampling_rate'], album_obj['maximum_bit_depth']) + "details": "%skHz %sbit" % (album_obj['maximum_sampling_rate'], album_obj['maximum_bit_depth']) }) - album.name, album.version = parse_track_title(album_obj['title']) + 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': + 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 @@ -377,11 +371,17 @@ class QobuzProvider(MusicProvider): if album_obj['image'].get(key): album.metadata["image"] = album_obj['image'][key] break - album.external_ids.append({ "upc": album_obj['upc'] }) + if len(album_obj['upc']) == 13: + # qobuz writes ean as upc ?! + album.external_ids.append({"ean": album_obj['upc']}) + album.external_ids.append({"upc": album_obj['upc'][1:]}) + else: + album.external_ids.append({"upc": album_obj['upc']}) if 'label' in album_obj: album.labels = album_obj['label']['name'].split('/') if album_obj.get('released_at'): - album.year = datetime.datetime.fromtimestamp(album_obj['released_at']).year + album.year = datetime.datetime.fromtimestamp( + album_obj['released_at']).year if album_obj.get('copyright'): album.metadata["copyright"] = album_obj['copyright'] if album_obj.get('hires'): @@ -423,9 +423,7 @@ class QobuzProvider(MusicProvider): artist.item_id = name track.artists.append(artist) # TODO: fix grabbing composer from details - track.name, track.version = parse_track_title(track_obj['title']) - if not track.version and track_obj['version']: - track.version = track_obj['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']) @@ -454,7 +452,7 @@ class QobuzProvider(MusicProvider): quality = TrackQuality.FLAC_LOSSLESS_HI_RES_2 elif track_obj['maximum_bit_depth'] > 16: quality = TrackQuality.FLAC_LOSSLESS_HI_RES_1 - elif track_obj.get('format_id',0) == 5: + elif track_obj.get('format_id', 0) == 5: quality = TrackQuality.LOSSY_AAC else: quality = TrackQuality.FLAC_LOSSLESS @@ -462,7 +460,7 @@ class QobuzProvider(MusicProvider): "provider": self.prov_id, "item_id": track_obj['id'], "quality": quality, - "details": "%skHz %sbit" %(track_obj['maximum_sampling_rate'], track_obj['maximum_bit_depth']) + "details": "%skHz %sbit" % (track_obj['maximum_sampling_rate'], track_obj['maximum_bit_depth']) }) return track @@ -479,7 +477,8 @@ 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'): @@ -490,11 +489,13 @@ class QobuzProvider(MusicProvider): ''' 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"} + params = {"username": self.__username, "password": self.__password, + "device_manufacturer_id": "music_assistant"} details = await self.__get_data("user/login", params, ignore_cache=True) 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): @@ -526,7 +527,8 @@ class QobuzProvider(MusicProvider): count += len(result[key]["items"]) items += result[key]["items"] else: - LOGGER.error("failed to retrieve items for %s (%s) --> %s" %(endpoint, params, result)) + LOGGER.error( + "failed to retrieve items for %s (%s) --> %s" % (endpoint, params, result)) break return items @@ -546,7 +548,7 @@ class QobuzProvider(MusicProvider): keys = list(params.keys()) keys.sort() for key in keys: - signing_data += "%s%s" %(key, params[key]) + signing_data += "%s%s" % (key, params[key]) request_ts = str(time.time()) request_sig = signing_data + request_ts + get_app_var(1) request_sig = str(hashlib.md5(request_sig.encode()).hexdigest()) diff --git a/music_assistant/musicproviders/spotify.py b/music_assistant/musicproviders/spotify.py index d2464d63..43cd6a40 100644 --- a/music_assistant/musicproviders/spotify.py +++ b/music_assistant/musicproviders/spotify.py @@ -1,34 +1,33 @@ #!/usr/bin/env python3 # -*- coding:utf-8 -*- -import asyncio + import os from typing import List -import sys import time -import concurrent +import subprocess +import platform +import asyncio from asyncio_throttle import Throttler import aiohttp from ..cache import use_cache -from ..utils import run_periodic, LOGGER, parse_track_title, json +from ..utils import LOGGER, parse_title_and_version, json from ..app_vars import get_app_var -from ..models import MusicProvider, MediaType, TrackQuality, AlbumType, Artist, Album, Track, Playlist +from ..models import MusicProvider, MediaType, TrackQuality, \ + AlbumType, Artist, Album, Track, Playlist from ..constants import CONF_USERNAME, CONF_PASSWORD, CONF_ENABLED, CONF_TYPE_PASSWORD - PROV_ID = 'spotify' PROV_NAME = 'Spotify' PROV_CLASS = 'SpotifyProvider' -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 SpotifyProvider(MusicProvider): - def __init__(self, mass, conf): ''' Support for streaming provider Spotify ''' self.mass = mass @@ -42,21 +41,15 @@ class SpotifyProvider(MusicProvider): self._password = conf[CONF_PASSWORD] self.__auth_token = {} - async def setup(self): ''' perform async setup ''' - self.throttler = Throttler(rate_limit=1, period=1) + self.throttler = Throttler(rate_limit=4, period=1) self.http_session = aiohttp.ClientSession( - loop=self.mass.event_loop, connector=aiohttp.TCPConnector()) + loop=self.mass.event_loop, connector=aiohttp.TCPConnector()) 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": []} searchtypes = [] if MediaType.Artist in media_types: searchtypes.append("artist") @@ -67,8 +60,10 @@ class SpotifyProvider(MusicProvider): if MediaType.Playlist in media_types: searchtypes.append("playlist") searchtype = ",".join(searchtypes) - params = {"q": searchstring, "type": searchtype, "limit": limit } - searchresult = await self.__get_data("search", params=params, cache_checksum="bla") + params = {"q": searchstring, "type": searchtype, "limit": limit} + searchresult = await self.__get_data("search", + params=params, + cache_checksum="bla") if searchresult: if "artists" in searchresult: for item in searchresult["artists"]["items"]: @@ -91,44 +86,38 @@ class SpotifyProvider(MusicProvider): if playlist: result["playlists"].append(playlist) return result - + async def get_library_artists(self) -> List[Artist]: ''' retrieve library artists from spotify ''' - items = [] - spotify_artists = await self.__get_data("me/following?type=artist&limit=50") + spotify_artists = await self.__get_data( + "me/following?type=artist&limit=50") if spotify_artists: # TODO: use cursor method to retrieve more than 50 artists for artist_obj in spotify_artists['artists']['items']: prov_artist = await self.__parse_artist(artist_obj) - items.append(prov_artist) - return items - + yield prov_artist + async def get_library_albums(self) -> List[Album]: ''' retrieve library albums from the provider ''' - result = [] for item in await self.__get_all_items("me/albums"): album = await self.__parse_album(item) if album: - result.append(album) - return result + yield album async def get_library_tracks(self) -> List[Track]: ''' retrieve library tracks from the provider ''' - result = [] for item in await self.__get_all_items("me/tracks"): track = await self.__parse_track(item) if track: - result.append(track) - return result + yield track async def get_playlists(self) -> List[Playlist]: ''' retrieve playlists from the provider ''' - result = [] - for item in await self.__get_all_items("me/playlists", cache_checksum=time.time()): + for item in await self.__get_all_items("me/playlists", + cache_checksum=time.time()): playlist = await self.__parse_playlist(item) if playlist: - result.append(playlist) - return result + yield playlist async def get_artist(self, prov_artist_id) -> Artist: ''' get full artist details by id ''' @@ -147,60 +136,67 @@ 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("playlists/%s" % prov_playlist_id, + ignore_cache=True) return await self.__parse_playlist(playlist_obj) - async def get_album_tracks(self, prov_album_id) -> List[Track]: + 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("albums/%s/tracks" % prov_album_id) - tracks = [] + track_objs = await self.__get_all_items( + f"albums/{prov_album_id}/tracks", limit=limit, offset=offset) for track_obj in track_objs: track = await self.__parse_track(track_obj) if track: - tracks.append(track) - return tracks + yield track - async def get_playlist_tracks(self, prov_playlist_id, limit=50, offset=0) -> List[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) + 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) - tracks = [] + 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: playlist_track = await self.__parse_track(track_obj) if playlist_track: - tracks.append(playlist_track) + yield playlist_track else: - LOGGER.warning("Unavailable track found in playlist %s: %s" %(playlist_obj['name'], track_obj['track']['name'])) - return tracks + LOGGER.warning( + "Unavailable track found in playlist %s: %s", + playlist_obj['name'], track_obj['track']['name']) - async def get_artist_albums(self, prov_artist_id) -> List[Album]: + async def get_artist_albums(self, prov_artist_id, limit=25, offset=0) -> List[Album]: ''' get a list of albums for the given artist ''' params = {'include_groups': 'album,single,compilation'} - items = await self.__get_all_items('artists/%s/albums' % prov_artist_id, params) - albums = [] + items = await self.__get_all_items( + 'artists/%s/albums' % prov_artist_id, params, limit=limit, offset=offset) for item in items: album = await self.__parse_album(item) if album: - albums.append(album) - return albums + yield album 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) - tracks = [] for item in items['tracks']: track = await self.__parse_track(item) if track: track.artists = [artist] - tracks.append(track) - return tracks + yield track - async def add_library(self, prov_item_id, media_type:MediaType): + async def add_library(self, prov_item_id, media_type: MediaType): ''' add item to library ''' if media_type == MediaType.Artist: - result = await self.__put_data('me/following', {'ids': prov_item_id, 'type': 'artist'}) + result = await self.__put_data('me/following', { + 'ids': prov_item_id, + 'type': 'artist' + }) item = await self.artist(prov_item_id) elif media_type == MediaType.Album: result = await self.__put_data('me/albums', {'ids': prov_item_id}) @@ -208,22 +204,31 @@ class SpotifyProvider(MusicProvider): elif media_type == MediaType.Track: result = await self.__put_data('me/tracks', {'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): + async def remove_library(self, prov_item_id, media_type: MediaType): ''' remove item from library ''' if media_type == MediaType.Artist: - result = await self.__delete_data('me/following', {'ids': prov_item_id, 'type': 'artist'}) + result = await self.__delete_data('me/following', { + 'ids': prov_item_id, + 'type': 'artist' + }) item = await self.artist(prov_item_id) elif media_type == MediaType.Album: - result = await self.__delete_data('me/albums', {'ids': prov_item_id}) + result = await self.__delete_data('me/albums', + {'ids': prov_item_id}) item = await self.album(prov_item_id) elif media_type == MediaType.Track: - result = await self.__delete_data('me/tracks', {'ids': prov_item_id}) + result = await self.__delete_data('me/tracks', + {'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 ''' @@ -231,7 +236,8 @@ class SpotifyProvider(MusicProvider): for track_id in prov_track_ids: track_uris.append("spotify:track:%s" % track_id) data = {"uris": track_uris} - return await self.__post_data(f'playlists/{prov_playlist_id}/tracks', data=data) + return await self.__post_data(f'playlists/{prov_playlist_id}/tracks', + data=data) async def remove_playlist_tracks(self, prov_playlist_id, prov_track_ids): ''' remove track(s) from playlist ''' @@ -239,14 +245,19 @@ class SpotifyProvider(MusicProvider): for track_id in prov_track_ids: track_uris.append("spotify:track:%s" % track_id) data = {"tracks": track_uris} - return await self.__delete_data(f'playlists/{prov_playlist_id}/tracks', data=data) + 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): + async def play_media(self, + device_id, + uri, + offset_pos=None, + offset_uri=None): ''' play uri on spotify device''' opts = {} if isinstance(uri, list): @@ -255,11 +266,12 @@ class SpotifyProvider(MusicProvider): opts['uris'] = [uri] else: opts['context_uri'] = uri - if offset_pos != None: # only for playlists/albums! - opts["offset"] = {"position": offset_pos } - elif offset_uri != None: # only for playlists/albums! - opts["offset"] = {"uri": offset_uri } - return await self.__put_data('me/player/play', {"device_id": device_id}, opts) + 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''' @@ -270,7 +282,8 @@ class SpotifyProvider(MusicProvider): # make sure that the token is still valid by just requesting it await self.get_token() spotty = self.get_spotty_binary() - spotty_exec = '%s -n temp -c "%s" --pass-through --single-track %s' %(spotty, self.mass.datapath, track.item_id) + spotty_exec = '%s -n temp -c "%s" --pass-through --single-track %s' % ( + spotty, self.mass.datapath, track.item_id) return { "type": "executable", "path": spotty_exec, @@ -280,7 +293,7 @@ class SpotifyProvider(MusicProvider): "provider": PROV_ID, "item_id": track.item_id } - + async def __parse_artist(self, artist_obj): ''' parse spotify artist object to generic layout ''' artist = Artist() @@ -300,19 +313,20 @@ class SpotifyProvider(MusicProvider): artist.metadata["image"] = img_url break if artist_obj.get('external_urls'): - artist.metadata["spotify_url"] = artist_obj['external_urls']['spotify'] + artist.metadata["spotify_url"] = artist_obj['external_urls'][ + 'spotify'] return artist async def __parse_album(self, album_obj): ''' parse spotify album object to generic layout ''' if 'album' in album_obj: album_obj = album_obj['album'] - if not album_obj['id'] or album_obj.get('is_playable') == False: + if not album_obj['id'] or not album_obj.get('is_playable', True): return None album = Album() album.item_id = album_obj['id'] album.provider = self.prov_id - album.name, album.version = parse_track_title(album_obj['name']) + album.name, album.version = parse_title_and_version(album_obj['name']) for artist in album_obj['artists']: album.artist = await self.__parse_artist(artist) if album.artist: @@ -331,7 +345,7 @@ class SpotifyProvider(MusicProvider): album.metadata["image"] = album_obj['images'][0]['url'] if 'external_ids' in album_obj: for key, value in album_obj['external_ids'].items(): - album.external_ids.append( { key: value } ) + album.external_ids.append({key: value}) if 'label' in album_obj: album.labels = album_obj['label'].split('/') if album_obj.get('release_date'): @@ -339,7 +353,8 @@ class SpotifyProvider(MusicProvider): if album_obj.get('copyrights'): album.metadata["copyright"] = album_obj['copyrights'][0]['text'] if album_obj.get('external_urls'): - album.metadata["spotify_url"] = album_obj['external_urls']['spotify'] + album.metadata["spotify_url"] = album_obj['external_urls'][ + 'spotify'] if album_obj.get('explicit'): album.metadata['explicit'] = str(album_obj['explicit']).lower() album.provider_ids.append({ @@ -353,7 +368,8 @@ class SpotifyProvider(MusicProvider): ''' parse spotify track object to generic layout ''' if 'track' in track_obj: track_obj = track_obj['track'] - if track_obj['is_local'] or not track_obj['id'] or not track_obj['is_playable']: + if track_obj['is_local'] or not track_obj['id'] or not track_obj[ + 'is_playable']: # do not return unavailable items return None track = Track() @@ -363,22 +379,23 @@ class SpotifyProvider(MusicProvider): artist = await self.__parse_artist(track_artist) if artist: track.artists.append(artist) - track.name, track.version = parse_track_title(track_obj['name']) + track.name, track.version = parse_title_and_version(track_obj['name']) track.duration = track_obj['duration_ms'] / 1000 track.metadata['explicit'] = str(track_obj['explicit']).lower() - if not track.version and track_obj['explicit']: - track.version = 'Explicit' if 'external_ids' in track_obj: for key, value in track_obj['external_ids'].items(): - track.external_ids.append( { key: value } ) + track.external_ids.append({key: value}) if 'album' in track_obj: track.album = await self.__parse_album(track_obj['album']) if track_obj.get('copyright'): track.metadata["copyright"] = track_obj['copyright'] + if track_obj.get('explicit'): + track.metadata["explicit"] = True track.disc_number = track_obj['disc_number'] track.track_number = track_obj['track_number'] if track_obj.get('external_urls'): - track.metadata["spotify_url"] = track_obj['external_urls']['spotify'] + track.metadata["spotify_url"] = track_obj['external_urls'][ + 'spotify'] track.provider_ids.append({ "provider": self.prov_id, "item_id": track_obj['id'], @@ -399,62 +416,60 @@ class SpotifyProvider(MusicProvider): }) playlist.name = playlist_obj['name'] playlist.owner = playlist_obj['owner']['display_name'] - playlist.is_editable = playlist_obj['owner']['id'] == self.sp_user["id"] or playlist_obj['collaborative'] + playlist.is_editable = playlist_obj['owner']['id'] == self.sp_user[ + "id"] or playlist_obj['collaborative'] if playlist_obj.get('images'): playlist.metadata["image"] = playlist_obj['images'][0]['url'] if playlist_obj.get('external_urls'): - playlist.metadata["spotify_url"] = playlist_obj['external_urls']['spotify'] + playlist.metadata["spotify_url"] = playlist_obj['external_urls'][ + 'spotify'] return playlist async def get_token(self): ''' get auth token on spotify ''' # return existing token if we have one in memory - if self.__auth_token and (self.__auth_token['expiresAt'] > int(time.time()) + 20): + if self.__auth_token and (self.__auth_token['expiresAt'] > + int(time.time()) + 20): return self.__auth_token tokeninfo = {} if not self._username or not self._password: return tokeninfo # retrieve token with spotty - tokeninfo = await self.mass.event_loop.run_in_executor(None, self.__get_token) + tokeninfo = await self.mass.event_loop.run_in_executor( + None, self.__get_token) if tokeninfo: self.__auth_token = tokeninfo self.sp_user = await self.__get_data("me") - LOGGER.info("Succesfully logged in to Spotify as %s" % self.sp_user["id"]) + LOGGER.info("Succesfully logged in to Spotify as %s" % + self.sp_user["id"]) self.__auth_token = tokeninfo else: - raise Exception("Can't get Spotify token for user %s" % self._username) + raise Exception("Can't get Spotify token for user %s" % + self._username) return tokeninfo def __get_token(self): ''' get spotify auth token with spotty bin ''' # get token with spotty scopes = [ - "user-read-playback-state", - "user-read-currently-playing", - "user-modify-playback-state", - "playlist-read-private", - "playlist-read-collaborative", - "playlist-modify-public", - "playlist-modify-private", - "user-follow-modify", - "user-follow-read", - "user-library-read", - "user-library-modify", - "user-read-private", - "user-read-email", - "user-read-birthdate", - "user-top-read"] + "user-read-playback-state", "user-read-currently-playing", + "user-modify-playback-state", "playlist-read-private", + "playlist-read-collaborative", "playlist-modify-public", + "playlist-modify-private", "user-follow-modify", + "user-follow-read", "user-library-read", "user-library-modify", + "user-read-private", "user-read-email", "user-read-birthdate", + "user-top-read" + ] scope = ",".join(scopes) - args = [self.get_spotty_binary(), "-t", - "--client-id", get_app_var(2), - "--scope", scope, - "-n", "temp-spotty", - "-u", self._username, - "-p", self._password, - "-c", self.mass.datapath, - "--disable-discovery"] - import subprocess - spotty = subprocess.Popen(args, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.STDOUT) + args = [ + self.get_spotty_binary(), "-t", "--client-id", + get_app_var(2), "--scope", scope, "-n", "temp-spotty", "-u", + self._username, "-p", self._password, "-c", self.mass.datapath, + "--disable-discovery" + ] + spotty = subprocess.Popen(args, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.STDOUT) stdout, stderr = spotty.communicate() result = json.loads(stdout) # transform token info to spotipy compatible format @@ -463,19 +478,32 @@ 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={}, + limit=0, + offset=0, + cache_checksum=None): ''' 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 = await self.__get_data(endpoint, + params, + ignore_cache=True) cache_checksum = cache_checksum["total"] if limit: # partial listing params["limit"] = limit params["offset"] = offset - result = await self.__get_data(endpoint, params=params, cache_checksum=cache_checksum) - return result["items"] + 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 @@ -484,7 +512,9 @@ class SpotifyProvider(MusicProvider): while count < total_items: params["limit"] = 50 params["offset"] = offset - result = await self.__get_data(endpoint, params=params, cache_checksum=cache_checksum) + result = await self.__get_data(endpoint, + params=params, + cache_checksum=cache_checksum) total_items = result["total"] offset += 50 count += len(result["items"]) @@ -492,7 +522,11 @@ class SpotifyProvider(MusicProvider): return items @use_cache(7) - async def __get_data(self, endpoint, params={}, ignore_cache=False, cache_checksum=None): + async def __get_data(self, + endpoint, + params={}, + ignore_cache=False, + cache_checksum=None): ''' get data from api''' url = 'https://api.spotify.com/v1/%s' % endpoint params['market'] = 'from_token' @@ -500,7 +534,11 @@ class SpotifyProvider(MusicProvider): token = await self.get_token() headers = {'Authorization': 'Bearer %s' % token["accessToken"]} async with self.throttler: - async with self.http_session.get(url, headers=headers, params=params, verify_ssl=False) as response: + print("%s - %s" %(url, params)) + async with self.http_session.get(url, + headers=headers, + params=params, + verify_ssl=False) as response: result = await response.json() if not result or 'error' in result: LOGGER.error(url) @@ -513,7 +551,11 @@ class SpotifyProvider(MusicProvider): url = 'https://api.spotify.com/v1/%s' % endpoint token = await self.get_token() headers = {'Authorization': 'Bearer %s' % token["accessToken"]} - async with self.http_session.delete(url, headers=headers, params=params, json=data, verify_ssl=False) as response: + async with self.http_session.delete(url, + headers=headers, + params=params, + json=data, + verify_ssl=False) as response: return await response.text() async def __put_data(self, endpoint, params={}, data=None): @@ -521,7 +563,11 @@ class SpotifyProvider(MusicProvider): url = 'https://api.spotify.com/v1/%s' % endpoint token = await self.get_token() headers = {'Authorization': 'Bearer %s' % token["accessToken"]} - async with self.http_session.put(url, headers=headers, params=params, json=data, verify_ssl=False) as response: + async with self.http_session.put(url, + headers=headers, + params=params, + json=data, + verify_ssl=False) as response: return await response.text() async def __post_data(self, endpoint, params={}, data=None): @@ -529,27 +575,33 @@ class SpotifyProvider(MusicProvider): url = 'https://api.spotify.com/v1/%s' % endpoint token = await self.get_token() headers = {'Authorization': 'Bearer %s' % token["accessToken"]} - async with self.http_session.post(url, headers=headers, params=params, json=data, verify_ssl=False) as response: + async with self.http_session.post(url, + headers=headers, + params=params, + json=data, + verify_ssl=False) as response: return await response.text() @staticmethod def get_spotty_binary(): '''find the correct spotty binary belonging to the platform''' - import platform sp_binary = None if platform.system() == "Windows": - sp_binary = os.path.join(os.path.dirname(__file__), "spotty", "windows", "spotty.exe") + sp_binary = os.path.join(os.path.dirname(__file__), "spotty", + "windows", "spotty.exe") elif platform.system() == "Darwin": # macos binary is x86_64 intel - sp_binary = os.path.join(os.path.dirname(__file__), "spotty", "darwin", "spotty") + sp_binary = os.path.join(os.path.dirname(__file__), "spotty", + "darwin", "spotty") elif platform.system() == "Linux": # try to find out the correct architecture by trial and error architecture = platform.machine() - if architecture.startswith('AMD64') or architecture.startswith('x86_64'): + if architecture.startswith('AMD64') or architecture.startswith( + 'x86_64'): # generic linux x86_64 binary - sp_binary = os.path.join(os.path.dirname(__file__), "spotty", "x86-linux", "spotty-x86_64") + sp_binary = os.path.join(os.path.dirname(__file__), "spotty", + "x86-linux", "spotty-x86_64") else: - sp_binary = os.path.join(os.path.dirname(__file__), "spotty", "arm-linux", "spotty-muslhf") + sp_binary = os.path.join(os.path.dirname(__file__), "spotty", + "arm-linux", "spotty-muslhf") return sp_binary - - diff --git a/music_assistant/musicproviders/tunein.py b/music_assistant/musicproviders/tunein.py index db6398da..d54a2caf 100644 --- a/music_assistant/musicproviders/tunein.py +++ b/music_assistant/musicproviders/tunein.py @@ -11,7 +11,7 @@ import json import aiohttp from ..cache import use_cache -from ..utils import run_periodic, LOGGER, parse_track_title +from ..utils import run_periodic, LOGGER from ..models import MusicProvider, MediaType, TrackQuality, Radio from ..constants import CONF_USERNAME, CONF_PASSWORD, CONF_ENABLED, CONF_TYPE_PASSWORD @@ -59,7 +59,6 @@ class TuneInProvider(MusicProvider): async def get_radios(self): ''' get favorited/library radio stations ''' - items = [] params = {"c": "presets"} result = await self.__get_data("Browse.ashx", params, ignore_cache=True) if result and "body" in result: @@ -67,8 +66,7 @@ class TuneInProvider(MusicProvider): # TODO: expand folders if item["type"] == "audio": radio = await self.__parse_radio(item) - items.append(radio) - return items + yield radio async def get_radio(self, radio_id): ''' get radio station details ''' diff --git a/music_assistant/playerproviders/squeezebox.py b/music_assistant/playerproviders/squeezebox.py index c8fb27f9..7cd8b40b 100644 --- a/music_assistant/playerproviders/squeezebox.py +++ b/music_assistant/playerproviders/squeezebox.py @@ -11,7 +11,7 @@ from typing import List import random import sys import socket -from ..utils import run_periodic, LOGGER, parse_track_title, try_parse_int, get_ip, get_hostname +from ..utils import run_periodic, LOGGER, try_parse_int, get_ip, get_hostname from ..models import PlayerProvider, Player, PlayerState, MediaType, TrackQuality, AlbumType, Artist, Album, Track, Playlist from ..constants import CONF_ENABLED diff --git a/music_assistant/playerproviders/webplayer.py b/music_assistant/playerproviders/webplayer.py index 6af0fb7d..cc8c4057 100644 --- a/music_assistant/playerproviders/webplayer.py +++ b/music_assistant/playerproviders/webplayer.py @@ -11,7 +11,7 @@ from typing import List import random import sys import socket -from ..utils import run_periodic, LOGGER, parse_track_title, try_parse_int, get_ip, get_hostname +from ..utils import run_periodic, LOGGER, try_parse_int, get_ip, get_hostname from ..models import PlayerProvider, Player, PlayerState, MediaType, TrackQuality, AlbumType, Artist, Album, Track, Playlist from ..constants import CONF_ENABLED diff --git a/music_assistant/utils.py b/music_assistant/utils.py index 18232ef5..d1dd8361 100755 --- a/music_assistant/utils.py +++ b/music_assistant/utils.py @@ -7,6 +7,8 @@ from concurrent.futures import ThreadPoolExecutor import socket import importlib import os +import re +import unidecode try: import simplejson as json except ImportError: @@ -74,10 +76,9 @@ def try_parse_bool(possible_bool): else: return possible_bool in ['true', 'True', '1', 'on', 'ON', 1] -def parse_track_title(track_title): +def parse_title_and_version(track_title, track_version=None): ''' try to parse clean track title and version from the title ''' - track_title = track_title.lower() - title = track_title + title = track_title.lower() version = '' for splitter in [" (", " [", " - ", " (", " [", "-"]: if splitter in title: @@ -87,27 +88,39 @@ def parse_track_title(track_title): for end_splitter in [")", "]"]: if end_splitter in title_part: title_part = title_part.split(end_splitter)[0] - for ignore_str in ["feat.", "featuring", "ft.", "with ", " & "]: + for ignore_str in ["feat.", "featuring", "ft.", "with ", " & ", "explicit"]: if ignore_str in title_part: title = title.split(splitter+title_part)[0] for version_str in ["version", "live", "edit", "remix", "mix", - "acoustic", " instrumental", "karaoke", "remaster", "versie", "explicit", "radio", "unplugged", "disco"]: + "acoustic", " instrumental", "karaoke", "remaster", "versie", "radio", "unplugged", "disco"]: if version_str in title_part: version = title_part title = title.split(splitter+version)[0] title = title.strip().title() - # version substitutes - if "radio" in version: - version = "radio version" - elif "album" in version: - version = "album version" - elif "single" in version: - version = "single version" - elif "remaster" in version: - version = "remaster" - version = version.strip().title() + if not version and track_version: + version = track_version + version = get_version_substitute(version).title() return title, version +def get_version_substitute(version_str): + ''' transform provider version str to universal version type ''' + version_str = version_str.lower() + # substitute edit and edition with version + if 'edition' in version_str or 'edit' in version_str: + version_str = version_str.replace(' edition',' version') + version_str = version_str.replace(' edit ',' version') + if version_str.startswith('the '): + version_str = version_str.split('the ')[1] + if "radio mix" in version_str: + version_str = "radio version" + elif "video mix" in version_str: + version_str = "video version" + elif "spanglish" in version_str or "spanish" in version_str: + version_str = "spanish version" + elif version_str.endswith('remaster'): + version_str = 'remaster' + return version_str.strip() + def get_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: @@ -136,7 +149,7 @@ def get_folder_size(folderpath): def serialize_values(obj): ''' recursively create serializable values for custom data types ''' def get_val(val): - if isinstance(val, (int, str, bool, float)): + if isinstance(val, (int, str, bool, float, tuple)): return val elif isinstance(val, list): new_list = [] @@ -157,6 +170,17 @@ def serialize_values(obj): return new_dict return get_val(obj) +def get_compare_string(str): + ''' get clean lowered string for compare actions ''' + unaccented_string = unidecode.unidecode(str) + return re.sub(r"[^a-zA-Z0-9]","",unaccented_string).lower() + +def compare_strings(str1, str2, strict=False): + ''' compare strings and return True if we have an (almost) perfect match ''' + match = str1.lower() == str2.lower() + if not match and not strict: + match = get_compare_string(str1) == get_compare_string(str2) + return match def json_serializer(obj): ''' json serializer to recursively create serializable values for custom data types ''' diff --git a/music_assistant/web.py b/music_assistant/web.py index 1eb98655..2b2cc860 100755 --- a/music_assistant/web.py +++ b/music_assistant/web.py @@ -255,7 +255,6 @@ class Web(): limit = int(request.query.get('limit', 50)) offset = int(request.query.get('offset', 0)) player = await self.mass.players.get_player(player_id) - print("queue items - offset: %s - limit: %s" %(offset, limit)) return web.json_response(player.queue.items[offset:offset+limit], dumps=json_serializer) async def player_queue_item(self, request): diff --git a/music_assistant/web/css/app.286e99c8.css b/music_assistant/web/css/app.286e99c8.css new file mode 100644 index 00000000..2ec3dd6b --- /dev/null +++ b/music_assistant/web/css/app.286e99c8.css @@ -0,0 +1 @@ +.vertical-btn[data-v-7d07386a]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.divider[data-v-7d07386a]{height:1px;width:100%;background-color:#ccc}.right[data-v-7d07386a]{float:right}.left[data-v-7d07386a]{float:left}.vertical-btn[data-v-71935334]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.body{background-color:#000} \ No newline at end of file diff --git a/music_assistant/web/css/app.f7c6b061.css b/music_assistant/web/css/app.f7c6b061.css deleted file mode 100644 index 55a6fb10..00000000 --- a/music_assistant/web/css/app.f7c6b061.css +++ /dev/null @@ -1 +0,0 @@ -.vertical-btn[data-v-18f32adc]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.divider[data-v-18f32adc]{height:1px;width:100%;background-color:#ccc}.right[data-v-18f32adc]{float:right}.left[data-v-18f32adc]{float:left}.vertical-btn[data-v-71935334]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center} \ No newline at end of file diff --git a/music_assistant/web/css/itemdetails.66e507cb.css b/music_assistant/web/css/itemdetails.66e507cb.css new file mode 100644 index 00000000..dfd1c4ce --- /dev/null +++ b/music_assistant/web/css/itemdetails.66e507cb.css @@ -0,0 +1 @@ +.scroller[data-v-730dcdec]{height:100%} \ No newline at end of file diff --git a/music_assistant/web/css/itemdetails.bd2e4eb1.css b/music_assistant/web/css/itemdetails.bd2e4eb1.css deleted file mode 100644 index 8101e31f..00000000 --- a/music_assistant/web/css/itemdetails.bd2e4eb1.css +++ /dev/null @@ -1 +0,0 @@ -.scroller[data-v-2c27af9b]{height:100%} \ No newline at end of file diff --git a/music_assistant/web/index.html b/music_assistant/web/index.html index 07a04e48..da1a6ddb 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.164646f9.js b/music_assistant/web/js/app.164646f9.js deleted file mode 100644 index afd846a3..00000000 --- a/music_assistant/web/js/app.164646f9.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(e){function t(t){for(var i,a,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,i){return r("listviewItem",{key:t.item_id,attrs:{item:t,totalitems:e.playlists.length,index:i,hideavatar:!1,hidetracknum:!0,hideproviders:!1,hidelibrary:!0,hidemenu:!0},on:{click:e.playlistSelected}})}))],2):e._e()],1)],1)},E=[],V=(r("a4d3"),r("e01a"),r("d28b"),r("99af"),r("caad"),r("b0c0"),r("d3b7"),r("2532"),r("3ca3"),r("ddb0"),r("96cf"),r("89ba")),D=r("284c"),L=r("d3cc"),N=i["a"].extend({components:{ListviewItem:L["a"]},props:{},watch:{},data:function(){return{visible:!1,menuItems:[],header:"",subheader:"",curItem:null,curPlaylist:null,mediaPlayItems:[{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"}],showTrackInfoItem:{label:"show_info",action:"info",icon:"info"},addToPlaylistItem:{label:"add_playlist",action:"add_playlist",icon:"add_circle_outline"},removeFromPlaylistItem:{label:"remove_playlist",action:"remove_playlist",icon:"remove_circle_outline"},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){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(this.curItem=e,this.curPlaylist=t,e){if(3===e.media_type){var r=[];r.push.apply(r,Object(D["a"])(this.mediaPlayItems)),r.push(this.showTrackInfoItem),r.push(this.addToPlaylistItem),t&&t.is_editable&&r.push(this.removeFromPlaylistItem),this.menuItems=r}else this.menuItems=this.mediaPlayItems;this.header=e.name,this.subheader="",this.visible=!0}},showPlayMenu:function(e){this.curItem=e,e&&(this.menuItems=this.mediaPlayItems,this.header=e.name,this.subheader="",this.visible=!0)},itemCommand:function(e){if("info"===e)this.$router.push({path:"/tracks/"+this.curItem.item_id,query:{provider:this.curItem.provider}}),this.visible=!1;else{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,"playlist_add"),this.visible=!1},playlistAddRemove:function(e,t){var r=this,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"playlist_add",a="".concat(this.$store.server,"api/track/").concat(e.item_id);this.$axios.get(a,{params:{provider:e.provider,action:i,action_details:t.item_id}}).then((function(e){"playlist_remove"===i&&r.$router.go()}))},showPlaylistsMenu:function(){var e=Object(V["a"])(regeneratorRuntime.mark((function e(){var t,r,i,a,n,s,o,l,c,u,p,d,m,h,v,f,y,g,A,b,k,w;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:for(t=this.$store.apiAddress+"playlists",r=[],i=!0,a=!1,n=void 0,e.prev=5,s=this.curItem.provider_ids[Symbol.iterator]();!(i=(o=s.next()).done);i=!0)l=o.value,r.push(l.provider);e.next=13;break;case 9:e.prev=9,e.t0=e["catch"](5),a=!0,n=e.t0;case 13:e.prev=13,e.prev=14,i||null==s.return||s.return();case 16:if(e.prev=16,!a){e.next=19;break}throw n;case 19:return e.finish(16);case 20:return e.finish(13);case 21:return e.next=23,this.$axios.get(t,{});case 23:c=e.sent,u=[],p=!0,d=!1,m=void 0,e.prev=28,h=c.data[Symbol.iterator]();case 30:if(p=(v=h.next()).done){e.next=63;break}if(f=v.value,!f.is_editable||f.item_id===this.curPlaylist.item_id){e.next=60;break}y=!0,g=!1,A=void 0,e.prev=36,b=f.provider_ids[Symbol.iterator]();case 38:if(y=(k=b.next()).done){e.next=46;break}if(w=k.value,!r.includes(w.provider)){e.next=43;break}return u.push(f),e.abrupt("break",46);case 43:y=!0,e.next=38;break;case 46:e.next=52;break;case 48:e.prev=48,e.t1=e["catch"](36),g=!0,A=e.t1;case 52:e.prev=52,e.prev=53,y||null==b.return||b.return();case 55:if(e.prev=55,!g){e.next=58;break}throw A;case 58:return e.finish(55);case 59:return e.finish(52);case 60:p=!0,e.next=30;break;case 63:e.next=69;break;case 65:e.prev=65,e.t2=e["catch"](28),d=!0,m=e.t2;case 69:e.prev=69,e.prev=70,p||null==h.return||h.return();case 72:if(e.prev=72,!d){e.next=75;break}throw m;case 75:return e.finish(72);case 76:return e.finish(69);case 77:this.playlists=u;case 78:case"end":return e.stop()}}),e,this,[[5,9,13,21],[14,,16,20],[28,65,69,77],[36,48,52,60],[53,,55,59],[70,,72,76]])})));function t(){return e.apply(this,arguments)}return t}()}}),F=N,T=r("b0af"),z=r("169a"),J=r("ce7e"),H=r("8270"),Q=r("e0c7"),U=Object(u["a"])(F,M,E,!1,null,null,null),j=U.exports;d()(U,{VCard:T["a"],VDialog:z["a"],VDivider:J["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAvatar:H["a"],VListItemContent:g["a"],VListItemTitle:g["c"],VSubheader:Q["a"]});var Y=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("v-footer",{staticStyle:{"background-color":"#424242"},attrs:{app:"",fixed:"",padless:"",light:"",elevation:"10"}},[i("v-card",{staticStyle:{"margin-top":"1px"},attrs:{dense:"",flat:"",light:"",subheader:"",tile:"",width:"100%",color:"#E0E0E0"}},[i("v-list-item",{attrs:{"two-line":""}},[e.curQueueItem?i("v-list-item-avatar",{attrs:{tile:""}},[i("img",{staticStyle:{border:"1px solid rgba(0,0,0,.54)"},attrs:{src:e.$server.getImageUrl(e.curQueueItem),"lazy-src":r("71db")}})]):i("v-list-item-avatar",[i("v-icon",[e._v("speaker")])],1),i("v-list-item-content",[e.curQueueItem?i("v-list-item-title",[e._v(" "+e._s(e.curQueueItem.name))]):e.$server.activePlayer?i("v-list-item-title",[e._v(" "+e._s(e.$server.activePlayer.name))]):e._e(),e.curQueueItem?i("v-list-item-subtitle",{staticStyle:{color:"primary"}},e._l(e.curQueueItem.artists,(function(t,r){return i("span",{key:r},[i("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}})}}}),re=te,ie=(r("826c"),r("0e8f")),ae=r("553a"),ne=r("e449"),se=r("8e36"),oe=Object(u["a"])(re,Y,X,!1,null,"18f32adc",null),le=oe.exports;d()(oe,{VBtn:m["a"],VCard:T["a"],VFlex:ie["a"],VFooter:ae["a"],VIcon:h["a"],VListItem:f["a"],VListItemAction:y["a"],VListItemAvatar:H["a"],VListItemContent:g["a"],VListItemSubtitle:g["b"],VListItemTitle:g["c"],VMenu:ne["a"],VProgressLinear:se["a"]});var ce=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(i){var a=i.on;return[r("v-btn",e._g({staticStyle:{color:"rgba(0,0,0,.54)"},attrs:{icon:""}},a),[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)},ue=[],pe=i["a"].extend({components:{VolumeControl:ee},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)}}}),de=pe,me=(r("60ce"),r("99d9")),he=Object(u["a"])(de,ce,ue,!1,null,"71935334",null),ve=he.exports;d()(he,{VBtn:m["a"],VCardTitle:me["c"],VDivider:J["a"],VFlex:ie["a"],VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemAction:y["a"],VListItemAvatar:H["a"],VListItemContent:g["a"],VListItemSubtitle:g["b"],VListItemTitle:g["c"],VMenu:ne["a"],VNavigationDrawer:A["a"]});var fe=i["a"].extend({name:"App",components:{NavigationMenu:k,TopBar:O,ContextMenu:j,PlayerOSD:le,PlayerSelect:ve},data:function(){return{showPlayerSelect:!1}},created:function(){var e="",t=window.location;e=t.origin+t.pathname,this.$server.connect(e)}}),ye=fe,ge=r("7496"),Ae=r("a75b"),be=r("a797"),ke=r("490a"),we=Object(u["a"])(ye,a,n,!1,null,null,null),_e=we.exports;d()(we,{VApp:ge["a"],VContent:Ae["a"],VOverlay:be["a"],VProgressCircular:ke["a"]});var Ie=r("9483");Object(Ie["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 xe=r("2fa7"),Pe=r("8c4f"),Se=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)},Ce=[],Be={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")}},Re=Be,Oe=r("34c3"),Me=Object(u["a"])(Re,Se,Ce,!1,null,null,null),Ee=Me.exports;d()(Me,{VIcon:h["a"],VList:v["a"],VListItem:f["a"],VListItemContent:g["a"],VListItemIcon:Oe["a"],VListItemTitle:g["c"]});var Ve=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 i=t.item;return[r("ListviewItem",{attrs:{item:i,hideavatar:3==i.media_type&&e.$store.isMobile,hidetracknum:!0,hideproviders:i.media_type<4&&e.$store.isMobile,hidelibrary:!0,hidemenu:3==i.media_type&&e.$store.isMobile,hideduration:5==i.media_type},on:{click:e.itemClicked,menuClick:e.menuClick}})]}}])})],1)],1)},De=[],Le={name:"browse",components:{ListviewItem:L["a"]},props:{mediatype:String,provider:String},data:function(){return{selected:[2],items:[]}},created:function(){this.$store.windowtitle=this.$t(this.mediatype),this.getItems()},methods:{itemClicked:function(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("showContextMenu",e);t="/playlists/"+e.item_id}this.$router.push({path:t,query:{provider:e.provider}})},menuClick:function(e){this.$server.$emit("showContextMenu",e)},getItems:function(){var e=Object(V["a"])(regeneratorRuntime.mark((function e(){var t,r,i,a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:t=0,r=50;case 2:return e.next=5,this.$server.getData(this.mediatype,{offset:t,limit:r,provider:this.provider});case 5:if(a=e.sent,a&&0!==a.length){e.next=8;break}return e.abrupt("break",14);case 8:if((i=this.items).push.apply(i,Object(D["a"])(a)),t+=r,!(a.length1){var a=i[1];t[a]=e(r)}})),t}i["a"].use(je["a"]);var Xe=new je["a"]({locale:navigator.language.split("-")[0],fallbackLocale:"en",messages:Ye()}),qe=(r("d5e8"),r("d1e78"),r("e508")),We=(r("a899"),r("f309"));r("bf40");i["a"].use(We["a"]);var Ze=new We["a"]({icons:{iconfont:"md"}}),Ke=new i["a"]({data:function(){return{windowtitle:"Home",loading:!1,showNavigationMenu:!1,topBarColor:"#424242",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="standalone"in window.navigator&&window.navigator.standalone}}}),Ge={globalStore:Ke,install:function(e,t){e.prototype.$store=Ke}},$e=(r("8a79"),r("5319"),r("bc3a")),et=r.n($e),tt={timeout:6e4},rt=et.a.create(tt),it=new i["a"]({_address:"",_ws:null,data:function(){return{connected:!1,players:{},activePlayerId:null}},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(V["a"])(regeneratorRuntime.mark((function e(t){var r,i;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return r=t.media_type+"/"+t.item_id,i="library_remove",0===t.in_library.length&&(i="library_add"),e.next=5,this.getData(r,{provider:t.provider,action:i});case 5:t.in_library="/library_remove"===i?[]:[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?"".concat(this._address,"api/").concat(e.media_type,"/").concat(e.item_id,"/image?type=").concat(t,"&provider=").concat(e.provider,"&size=").concat(r):""},getData:function(){var e=Object(V["a"])(regeneratorRuntime.mark((function e(t){var r,i,a,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]:{},i=this._address+"api/"+t,e.next=4,rt.get(i,{params:r});case 4:return a=e.sent,e.abrupt("return",a.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(V["a"])(regeneratorRuntime.mark((function e(t,r){var i,a;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return i=this._address+"api/"+t,e.next=3,rt.post(i,r);case 3:return a=e.sent,e.abrupt("return",a.data);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,i={player_id:r,cmd:e,cmd_args:t};this._ws.send(JSON.stringify({message:"player command",message_details:i}))},playItem:function(){var e=Object(V["a"])(regeneratorRuntime.mark((function e(t,r){var i;return regeneratorRuntime.wrap((function(e){while(1)switch(e.prev=e.next){case 0:return this.$store.loading=!0,i="players/"+this.activePlayerId+"/play_media/"+t.media_type+"/"+t.item_id+"/"+r,e.next=4,this.getData(i);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)i["a"].set(this.players,t.message_details.player_id,t.message_details);else if("player added"===t.message)i["a"].set(this.players,t.message_details.player_id,t.message_details),this._selectActivePlayer(),this.$emit("players changed");else if("player removed"===t.message)i["a"].delete(this.players,t.message_details.player_id),this._selectActivePlayer(),this.$emit("players changed");else if("players"===t.message){var r=!0,a=!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;i["a"].set(this.players,l.player_id,l)}}catch(c){a=!0,n=c}finally{try{r||null==o.return||o.return()}finally{if(a)throw n}}this._selectActivePlayer(),this.$emit("players changed")}else 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}}}),at={server:it,install:function(e,t){e.prototype.$server=it}};i["a"].config.productionTip=!1,i["a"].use(qe["a"]),i["a"].use(Ge),i["a"].use(at),String.prototype.formatDuration=function(){var e=parseInt(this,10),t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),i=e-3600*t-60*r;return t<10&&(t="0"+t),r<10&&(r="0"+r),i<10&&(i="0"+i),"00"===t?r+":"+i:t+":"+r+":"+i},new i["a"]({router:Ue,i18n:Xe,vuetify:Ze,render:function(e){return e(_e)}}).$mount("#app")},"57d1":function(e,t){e.exports="data:image/png;base64,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"},"60ce":function(e,t,r){"use strict";var i=r("1c3f"),a=r.n(i);a.a},"71db":function(e,t,r){e.exports=r.p+"img/file.813f9dad.png"},"826c":function(e,t,r){"use strict";var i=r("1c27"),a=r.n(i);a.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 i={"./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 a(e){var t=n(e);return r(t)}function n(e){if(!r.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}a.keys=function(){return Object.keys(i)},a.resolve=n,e.exports=a,a.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 i=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",[i("v-list-item",{attrs:{ripple:""},on:{click:function(t){return e.$emit("click",e.item)}}},[e.hideavatar?e._e():i("v-list-item-avatar",{attrs:{tile:"",color:"grey"}},[i("img",{staticStyle:{border:"1px solid rgba(0,0,0,.22)"},attrs:{src:e.$server.getImageUrl(e.item,"image",80),"lazy-src":r("71db")}})]),i("v-list-item-content",[i("v-list-item-title",[e._v(" "+e._s(e.item.name)+" "),e.item.version?i("span",[e._v("("+e._s(e.item.version)+")")]):e._e()]),e.item.artists?i("v-list-item-subtitle",[e._l(e.item.artists,(function(t,r){return i("span",{key:t.item_id},[i("a",{on:{click:[function(r){return e.artistClick(t)},function(e){e.stopPropagation()}]}},[e._v(e._s(t.name))]),r+10?i("v-icon",{attrs:{height:"20"}},[e._v("favorite")]):e._e(),0==e.item.in_library.length?i("v-icon",{attrs:{height:"20"}},[e._v("favorite_border")]):e._e()],1)]}}],null,!1,993341054)},[e.item.in_library.length>0?i("span",[e._v(e._s(e.$t("remove_library")))]):e._e(),0==e.item.in_library.length?i("span",[e._v(e._s(e.$t("add_library")))]):e._e()])],1),!e.hideduration&&e.item.duration?i("v-list-item-action",[e._v(e._s(e.item.duration.toString().formatDuration()))]):e._e(),e.hidemenu?e._e():i("v-icon",{staticStyle:{"margin-right":"-10px","padding-left":"10px"},attrs:{color:"grey lighten-1"},on:{click:[function(t){return e.$emit("menuClick",e.item)},function(e){e.stopPropagation()}]}},[e._v("more_vert")])],1),i("v-divider")],1)},a=[],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},data:function(){return{}},computed:{isHiRes:function(){var e=!0,t=!1,r=void 0;try{for(var i,a=this.item.provider_ids[Symbol.iterator]();!(e=(i=a.next()).done);e=!0){var n=i.value;if(n.quality>6)return!0}}catch(s){t=!0,r=s}finally{try{e||null==a.return||a.return()}finally{if(t)throw r}}return!1}},mounted:function(){},methods:{artistClick:function(e){var t="/artists/"+e.item_id;this.$router.push({path:t,query:{provider:e.provider}})},albumClick:function(e){var t="/albums/"+e.item_id;this.$router.push({path:t,query:{provider:e.provider}})},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,i,a,!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"]})},e00a:function(e,t,r){"use strict";var i=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",e._l(e.uniqueProviders,(function(t){return i("img",{key:t.provider,staticStyle:{"margin-right":"6px","margin-top":"6px"},attrs:{height:e.height,src:r("9e01")("./"+t.provider+".png")}})})),0)},a=[],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 i=r["provider"];-1===t.indexOf(i)&&(t.push(i),e.push(r))})),e):[]}},mounted:function(){},methods:{}}),o=s,l=r("2877"),c=Object(l["a"])(o,i,a,!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.164646f9.js.map \ No newline at end of file diff --git a/music_assistant/web/js/app.164646f9.js.map b/music_assistant/web/js/app.164646f9.js.map deleted file mode 100644 index bc65bbe6..00000000 --- a/music_assistant/web/js/app.164646f9.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","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?bb07","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?0fbf","webpack:///src/components/TopBar.vue","webpack:///./src/components/TopBar.vue?8cdd","webpack:///./src/components/TopBar.vue","webpack:///./src/components/ContextMenu.vue?e0cb","webpack:///src/components/ContextMenu.vue","webpack:///./src/components/ContextMenu.vue?03fa","webpack:///./src/components/ContextMenu.vue","webpack:///./src/components/PlayerOSD.vue?e1d6","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","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?4aa8","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?6f88","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?38ac","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","attrs","$route","path","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","topBarColor","staticClass","staticStyle","windowtitle","_e","go","$server","$emit","String","default","Boolean","VAppBar","VLayout","VSpacer","VToolbarTitle","VToolbar","visible","playlists","header","subheader","label","itemCommand","action","$t","index","item_id","playlistSelected","components","ListviewItem","watch","menuItems","curItem","curPlaylist","mediaPlayItems","showTrackInfoItem","addToPlaylistItem","removeFromPlaylistItem","playerQueueItems","created","$on","showContextMenu","showPlayMenu","beforeDestroy","$off","computed","playlist","media_type","is_editable","cmd","query","showPlaylistsMenu","playlistAddRemove","playItem","url","$axios","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","getData","endpoint","cur_queue_item","totalSecs","duration","curSecs","cur_time","curPercent","toString","formatDuration","innerWidth","cmd_opt","activePlayerId","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","itemClicked","menuClick","mediatype","provider","selected","getItems","Vue","use","VueRouter","routes","Home","route","params","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","install","options","axiosConfig","_axios","axios","server","_address","_ws","connected","endsWith","wsAddress","replace","WebSocket","onopen","_onWsConnect","onmessage","_onWsMessage","onclose","_onWsClose","_onWsError","toggleLibrary","in_library","mediaItem","imageType","size","postData","post","msgDetails","cmd_args","send","JSON","stringify","message_details","queueOpt","newPlayerId","localStorage","setItem","msg","parse","set","_selectActivePlayer","delete","close","lastPlayerId","getItem","config","productionTip","VueVirtualScroller","store","secNum","parseInt","hours","floor","minutes","seconds","i18n","vuetify","render","h","App","$mount","hideavatar","version","album","hidetracknum","albumClick","track_number","disc_number","owner","hideproviders","provider_ids","hidelibrary","hideduration","hidemenu","ProviderIcons","Number","totalitems","isHiRes","VTooltip","prov","height","providerIds","Array","uniqueProviders","output","indexOf"],"mappings":"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","file":"js/app.164646f9.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\":\"56af5cc1\",\"itemdetails\":\"5c314dae\",\"playerqueue\":\"5fa460a7\"}[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\":\"bd2e4eb1\",\"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","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',{attrs:{\"light\":\"\"}},[_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\":\"\",\"scroll-off-screen\":\"\",\"flat\":\"\",\"dense\":\"\",\"dark\":\"\",\"color\":_vm.$store.topBarColor}},[_c('v-layout',[(_vm.$store.topBarColor != 'transparent')?_c('v-toolbar-title',{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'),_c('v-btn',{staticStyle:{\"margin-right\":\"-23px\"},attrs:{\"icon\":\"\"},on:{\"click\":function($event){return _vm.$server.$emit('showContextMenu')}}},[_c('v-icon',[_vm._v(\"more_vert\")])],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!./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=0825a588&\"\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';\nimport { VToolbarTitle } from 'vuetify/lib/components/VToolbar';\ninstallComponents(component, {VAppBar,VBtn,VIcon,VLayout,VSpacer,VToolbarTitle})\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},on:{\"click\":_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=05efa336&\"\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\":\"#424242\"},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\":\"#424242\"},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('div',{staticStyle:{\"height\":\"14px\"}}):_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=18f32adc&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=18f32adc&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 \"18f32adc\",\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","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=e71f20a2&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.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 { 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},on:{\"click\":_vm.itemClicked,\"menuClick\":_vm.menuClick}})]}}])})],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=79b8bda8&\"\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 topBarColor: '#424242',\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 = 'standalone' in window.navigator && window.navigator.standalone\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 }\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 return `${this._address}api/${mediaItem.media_type}/${mediaItem.item_id}/image?type=${imageType}&provider=${mediaItem.provider}&size=${size}`\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 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 {\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=18f32adc&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=18f32adc&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.$emit('click', _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.artistClick(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.albumClick(_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.artistClick(_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.$emit('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=7dd2252b&\"\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 new file mode 100644 index 00000000..547afa99 --- /dev/null +++ b/music_assistant/web/js/app.a7d20a64.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")),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,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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"),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 new file mode 100644 index 00000000..a3f3619d --- /dev/null +++ b/music_assistant/web/js/app.a7d20a64.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?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,iVBORw0KGgoAAAANSUhEUgAAAJEAAABfCAYAAADoOiXnAAALyUlEQVR4nO2debAcVRWHv5eQjRhIIIQEDFRIwCAYFmUTQxJ2TalIQGQRlE3WiBSFsQoiSwWECiIlm8oiSwBBFIMga8BYQFhFCQYhIYIBAoQALxsBkuMfvx6nX8/Sd+Z2z8x7735VXW96+m7T7zd3Oef0nTYzIxDwoUezGxDo/AQRBbwJIgp4E0QU8CaIKOBNEFHAmyCigDdBRAFvgogC3gQRBbwJIgp4E0QU8CaIKOBNEFHAmyCigDdBRAFvgogC3gQRBbwJIgp4s06zG1AnQ4HPAtsAnwdGRucDgH7AIOA94FPgHWA+MBf4O/Bv4M3GN7nr0tZJAvXbgB2BfYGvIfEMqrOsT4EngN8CtwPLM2hft6bVRTQE+DZwJPAlJKYkbwDzgGdQL/Nf1At9HF3vAQwGNkPi2w3YBegNvA1cClwJLMvrQ3R1WlVE2wDHA4cAGyeutaOh6a/An6PX7TWWPxTYG/geMAFYCBwHPFJ3i7sxrSaiMcCZwEFAn8S154DrgJmot8mKkcAU4Nio/JOBjzIsv8vTKiLqA5wN/AhYN3HtAeASYBaaz+TFROBa1CtNIAjJmVYQ0Z7ARWjOE+cR4DLgTw1syzDgNjSfOgBY0cC6Oy3NFFEb8HPgtMT7rwE/Bn7X8BaJNuAeYH1gHPn2fl2CZhkbNwDupFRAM4CdaZ6AAAw4EBgITG9iOzoNzeiJRgO3AtvH3luNep/LGt2YKmyB7El7Ay80uS0tTaNFtAXwKDA89t4i4HBgdiMb4siRwFFISE2fPLYqjRzORgD30lFAC4G9aE0BgYbXTYD9m92QVqZRItoYuAv4XOy9t4BJwMsNakM9rAEuB37Y7Ia0Mo0Yznqi5frY2Hvvo6X983lXngF9kVX8YOTAbVXakOF0u+jvpsghXWA1Wvm+gOZ6S7OquBFe/NPpKCBD7obOICCQ0fE0JPxWZAzwXTRvG41En8Yi4Bpkn/M2qubdE+2M5jtxF8Y04Kw8K+0m7Amcgiztvess417gCDy/IHmKqB/wNHKmFngBWaY/Lpsj4MJQ5AY6rMy114G7gSXAKOTAThttpqAeqW7yHM5+QEcBgXxjQUB+nE+pgNYCF0dHvFcZiHqqamzt26C8VmcDkfEwzi3AwznV1524llKf3s+An1A6LL3nUN4q3wblJaLvoG63wHLkpW8WvaKjXFBbOdaJ0ufZU7ehiIU+1PZ/mEPp8HN1mXS9gN0dyptbQ91lyeMm9URDWZzbgVczKHsAcCrVJ5JLgN8D41FIx44Uw0s+BhagCeWNFJ2rg5HRcw/UvRcC4QytZB5BPcCSCnXuhyImq7EC9cbjgX2Q22e9qA2rUIzUHGTgXJhS1hXImt4TOYvLLdcPREv9aixGgX1+mFnWxzgrZbeMyj6oTNnleNshzW1Ru640szcd0r9sZqPKtKmfmS10bNc7DmmWmNnxZepJHkPMrH+FayPM7HWHug5xqCf1yENENyYaOt/M+mRU9mMONyZPbrfSNh2TU10HlKnL5RhrZgtSyv7IzI6ts/ySI+s50QBk9IpzL7KW+jIO+HIG5fiwCx1tXj2ByTXkfxUtz19ySHtqDeUCbAWciyJBt6iSbh5asV1TY/kVyXpOtB2KDozzUEZlJ2OPKnEPmiyeREezfyXmonnBQci2Uo1P6BikNhFZjF14FLlOlqA5zLSU9CPRXG5lmWu9gAuADVFs1mZoLlfJWv0hEu4dwG+o/cGGqmQtor0S5+3AkxmUuwPwdYd0F1M0LRxBuohmReWuRN/eNBG9hpyyoNVV0oxRiX+icNsPo/MNHPK0UXnVNgE4w7FuQwbIo9GXIHOyHs52SpzPR0+g+jIZDR3VmAdMjV4fhhyQ1ViOequVyByxr0M7/hh7PRa34XUtcCJFAQHs6pBvMZUfrDzBIX+BNvSFmoGbX61msu6JtkycL8A/mGsEGmrSmEZx7vV9h/Qz0cOOAN9EBtJqrELzuwInOtQBMg08HjsfBXzRId+cKtduQr0LyNyxA1rSb1Qlz8HoYc1a51rpZDVDj45liVXAtAzK/GnKSsNMS/TCcnd7M/vEIc9eUfpeZvaiQ/pbYm3a1MzaHfK8b2bDrOPnOc8hn5nZV6y2+7SLma1KKXNV1PZM/+9ZD2fJZ8Z8wyf6oNDZNGZQdAVMJr2HfZbi0677o00hqrEW+EXs/DjcJu0zUfBdgb7ISJjGi9Q+l3yWdDdHXzp6EjIhaxEly1vsWd4kSofIJCspmv03R912GpciYbSheKc0ZgFPRa/XR0/LpmFoKItzTNTGNKZT+yR4U9S2anxEZat73eQdHlvvzh2g3uRMh3Qz0NwLNN5/JiX9POSGAbk5xjvUcXHs9TGkT9pBovtb7Lw/CrtI4zHg5uj1emhDi7RVI6jHTvvsT6BwkWzJeHxMcrZHWfunjO9mmvuMidIPNrkM0jg5VscdDumfNrOeUfq+ZvaKQx4zsynW8fOc6Jiv4CLa2szmRO+tMLNvWOV7NczMFjuUPbFKGXUfeYvoKo+yHnC4KXfH0p/hkH6RmQ2M0m9l6RNRM7PDY3Uc6pC+wIRYvtFm9q5DnnOi9EdY6RciXl78WMfM7nMo+zoza6tQRkuJaE2i4bPrLGd3h5tiJj8RJt/cqw7pL4zVcY5D+tdNvU8hz2zHdpmZ7RHl2cbMXnJIf75phTmjzLVPTT1T8j4NNrO7HMq+tUzelhXR0kTjPzB5m2st5zKHG/Mv07cQq33o62Vu/9hzY236grmZDgo8bmZXmJb5aRRMIftVSXOlmW1kZr3NbHPTsJzmaDXTkJ2VA7whInquzIeYVGMZQ8wtlGNyLM/9DulnxtJPdEi/1MyGxvJc55CnVhaZ2UmxOnqY2SVV0r9rEn/SHleON8zsVKvv/9hUEV1V5sM8WGMZFzncoLfMbECUfh+H9GYdY5oedkh/Xiy96/zJlTfM7CzTcFTuHkw0s6fqLPtJMzulStmZH1m7PWZR6tcZj56Hcgl/ABnnrk9J8xDFPRZ7oE08q7lXFqLlLSiicI+U8t9DT74WOAE3v9OdKBTjaORVXxd5/VegCMnngfuBB6lur7kH+Avy501EbpLhyMDZP0qzBvnWFgOvIDfJo8i00NB9A7J+ZGgw8kclvdQ3oo0RWoE/AN9KSXMOis0BbT76Ivps1ViDYpoLluaC8W818AEK//C52QOQKDeMzj9BYm+n2Xso5dC9VZo7HF5DGXkdkyqPAv/nAzPbMJZnqkMes47mhm515GGx/lWF9y8Hts2hPlc2oqPluRK/puiD6o0e+Xbhl3W0qUuQh4iepBimEGcgGkqG5FBnGoPQxlrVwkZBc6cLYud7olCUNJ4iuwjOTkdevrOplB//t0QPMKZ5zbNkGJrsJqMuy3ESmr9AbZGL1yOHbrckLxE9D9xQ4dq2KAzjgJzqjjMauI/SnWnLcXWUtsCuuDlnl6JVWbclTy/+FIre9SRDUKjpdDrunJYV66Fe5THcAulfprTXcQkRAW2g/q5707oeeW8tMwZtLVMtzmUpsvNchWKyfRiMYpBOR4/QuLAMzX2eib23E8X4obS8o+nmv1rUiJ3Svoo2NO+Vkq4dDSd3IcPgfxzLH4ZijA9GjzMnH1mqxlpkM5qZeH8q2sEkbZ5zE+6PMnVZGrV77FFo6ey6GdNyZLSch8T0FsXdKwZFxwjUC4wkPci+HKtRhOLNZa71p/S3RcrxIcVHiLotjdyCeB80bG3SqAqrsAw4FLkXAp40cgviB9Gj0M+kJcyZf6A5UBBQRjT6ZxnmIyFdgNsGTFmyElnNx9J8IXcpmvkDMcPRKupY0gPMfViO7DjTyWBDp0AprfBTVaPQzmqHkcH+gTHmIvfLDRSfdA3kQCuIqEA/ZFkeh0IqhqNVVz+HvO1oeFyANiyfjew84WemGkAriSjQSWnW750FuhBBRAFvgogC3gQRBbwJIgp4E0QU8CaIKOBNEFHAmyCigDdBRAFvgogC3gQRBbwJIgp4E0QU8CaIKOBNEFHAmyCigDdBRAFvgogC3vwPN7k7QTq1nHAAAAAASUVORK5CYII=\"","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.b98bba01.js b/music_assistant/web/js/chunk-vendors.b98bba01.js deleted file mode 100644 index c8a4039a..00000000 --- a/music_assistant/web/js/chunk-vendors.b98bba01.js +++ /dev/null @@ -1,25 +0,0 @@ -(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}))},"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():""}))})),S=O((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),j=/\B([A-Z])/g,k=O((function(t){return t.replace(j,"-$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 $(t,e){return t.bind(e)}var A=Function.prototype.bind?$: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 $e(t){var e=t.$options.provide;e&&(t._provided="function"===typeof e?e.call(t):e)}function Ae(t){var e=Ee(t.$options.inject,t);e&&(At(!1),Object.keys(e).forEach((function(n){Mt(t,n,e[n])})),At(!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]=Me(e,c,t[c]))}else i={};for(var u in e)u in i||(i[u]=Ie(e,u));return t&&Object.isExtensible(t)&&(t._normalized=i),U(i,"$stable",a),U(i,"$key",s),U(i,"$hasNormal",o),i}function Me(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]:je(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 Ie(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,Vn.sort((function(t,e){return t.id-e.id})),Un=0;UnUn&&Vn[n].id>t.id)n--;Vn.splice(n+1,0,t)}else Vn.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||At(!1);var a=function(o){i.push(o);var a=Zt(o,e,n,t);Mt(r,o,a),o in t||ir(t,"_props",o)};for(var s in e)a(s);At(!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:A(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 jr(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&&$r(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,V.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 $r(t){var e=t.options.computed;for(var n in e)fr(t.prototype,n,e[n])}function Ar(t){V.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),An(_r),Tn(_r),bn(_r);var Mr=[String,RegExp,Array],Ir={name:"keep-alive",abstract:!0,props:{include:Mr,exclude:Mr,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:Ir};function Br(t){var e={get:function(){return R}};Object.defineProperty(t,"config",e),t.util={warn:dt,extend:L,mergeOptions:Xt,defineReactive:Mt},t.set=It,t.delete=Dt,t.nextTick=pe,t.observable=function(t){return Tt(t),t},t.options=Object.create(null),V.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,L(t.options.components,Dr),Sr(t),jr(t),kr(t),Ar(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"),Fr=m("input,textarea,option,select,progress"),Vr=function(t,e,n){return"value"===n&&Fr(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},zr=m("contenteditable,draggable,spellcheck"),Rr=m("events,caret,typing,plaintext-only"),Hr=function(t,e){return Xr(e)||"false"===e?"false":"contenteditable"===t&&Rr(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}),Si={create:function(t,e){ji(e)},update:function(t,e){t.data.ref!==e.data.ref&&(ji(t,!0),ji(e))},destroy:function(t){ji(t,!0)}};function ji(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 $i(t,e){return t.key===e.key&&(t.tag===e.tag&&t.isComment===e.isComment&&i(t.data)===i(e.data)&&Ai(t,e)||o(t.isAsyncPlaceholder)&&t.asyncFactory===e.asyncFactory&&r(e.asyncFactory.error))}function Ai(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&&j(t,e,h,v)}function $(t,e,n,r){for(var o=n;o-1?Ri(t,e,n):Wr(e)?Xr(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):zr(e)?t.setAttribute(e,Hr(e,n)):qr(e)?Xr(n)?t.removeAttributeNS(Ur,Yr(e)):t.setAttributeNS(Ur,e,n):Ri(t,e,n)}function Ri(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:Vi,update:Vi};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 So(t){if(t){if("object"===typeof t){var e={};return!1!==t.css&&L(e,jo(t.name||"v")),L(e,t),e}return"string"===typeof t?jo(t):void 0}}var jo=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",$o="animation",Ao="transition",Eo="transitionend",Lo="animation",Po="animationend";ko&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Ao="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 Mo(t){To((function(){To(t)}))}function Io(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=Fo(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===$o?u>0&&(n=$o,l=u,f=c.length):(l=Math.max(a,u),n=l>0?a>u?Co:$o:null,f=n?n===Co?o.length:c.length:0);var h=n===Co&&No.test(r[Ao+"Property"]);return{type:n,timeout:l,propCount:f,hasTransform:h}}function Vo(t,e){while(t.length1}function qo(t,e){!0!==e.data.show&&Ro(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(Fi),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,Ro(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?Ro(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;s1?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)}},S=function(t){x(t.data)},j=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=S,r=u(o.postMessage,o,1)):!a.addEventListener||"function"!=typeof postMessage||a.importScripts||s(j)?r=O in f("script")?function(t){l.appendChild(f("script"))[O]=function(){l.removeChild(this),x(t)}}:function(t){setTimeout(_(t),0)}:(r=j,a.addEventListener("message",S,!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"])},"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 '