self.addEventListener('install', e => {
    // init
});

self.addEventListener('activate', event => {
    event.waitUntil(self.clients.claim());
});

const CACHE_NAME = "v1";

self.addEventListener('fetch', function (event) {
	// SKIP cachecheck if it's the streaming path
	if (event.request.url.indexOf('/listen') !== -1 || event.request.url.indexOf('file://') !== -1) {
		// nothing to see here, carry on
	} else {
		event.respondWith(
			caches.match(event.request).then(function (response) {
				// Cache hit - return response
				if (response) {
					return response;
				}

				// IMPORTANT: Clone the request. A request is a stream and
				// can only be consumed once. Since we are consuming this
				// once by cache and once by the browser for fetch, we need
				// to clone the response.
				var fetchRequest = event.request.clone();

				return fetch(fetchRequest).then(
					function (response) {
						// Check if we received a valid response
						if (!response) {
							return response;
						}
						if (fetchRequest.url.indexOf('/data/') === -1 && fetchRequest.url.indexOf('lastfm-img2') === -1) {
							return response;
						}

						// IMPORTANT: Clone the response. A response is a stream
						// and because we want the browser to consume the response
						// as well as the cache consuming the response, we need
						// to clone it so we have two streams.
						var responseToCache = response.clone();

						caches.open(CACHE_NAME)
							.then(function (cache) {
								cache.put(event.request, responseToCache);
							});

						return response;
					}
				);
			})
		)
	}
});

@@ -400,16 +400,527 @@
 arry on%0A
+%09%7D else if (event.request.url.indexOf('music.json') !== -1) %7B%0A%09%09// send back from the cache but always update the cache with the networks version.%0A%09%09event.respondWith(%0A%09%09%09caches.open(CACHE_NAME).then(function(cache) %7B%0A%09%09%09%09return cache.match(event.request).then(function (response) %7B%0A%09%09%09%09%09var fetchPromise = fetch(event.request).then(function(networkResponse) %7B%0A%09%09%09%09%09%09cache.put(event.request, networkResponse.clone());%0A%09%09%09%09%09%09return networkResponse;%0A%09%09%09%09%09%7D)%0A%09%09%09%09%09return response %7C%7C fetchPromise;%0A%09%09%09%09%7D)%0A%09%09%09%7D)%0A%09%09)%0A
 %09%7D else 

Update music.json on startup but serving cached version.