diff --git a/Open Media Library/Resources/index.html b/Open Media Library/Resources/index.html index cb02249..dcda6dc 100644 --- a/Open Media Library/Resources/index.html +++ b/Open Media Library/Resources/index.html @@ -1,10 +1,11 @@ + Open Media Library + + + + - - Installing Open Media Library...
-
- - + diff --git a/Open Media Library/Resources/install.py b/Open Media Library/Resources/install.py index 32a379d..02122d1 100755 --- a/Open Media Library/Resources/install.py +++ b/Open Media Library/Resources/install.py @@ -40,6 +40,13 @@ class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler): with open(path) as fd: content = fd.read() self.send_response(200, 'OK') + content_type = { + 'html': 'text/html', + 'png': 'image/png', + 'svg': 'image/svg+xml', + 'txt': 'text/plain', + }.get(path.split('.')[-1], 'txt') + self.send_header('Content-Type', content_type) else: self.send_response(404, 'not found') content = '404 not found' @@ -68,33 +75,28 @@ class Install(Thread): os.chdir(target) release = self.get_release() self.status["release"] = release - for module in release['modules']: - self.status["step"] = 'downloading %s' % module - self.status["progress"] = 0 - self.status["size"] = 0 + self.status["step"] = 'Downloading...' + self.status["progress"] = 0 + for module in sorted(release['modules']): package_tar = release['modules'][module]['name'] url = self.release_url.replace('release.json', package_tar) self.download(url, package_tar) - self.status["step"] = 'extracting %s' % module - self.status["progress"] = 0 + self.status["step"] = 'Installing...' + for module in sorted(release['modules']): + package_tar = release['modules'][module]['name'] tar = tarfile.open(package_tar) tar.extractall() tar.close() os.unlink(package_tar) os.symlink('openmedialibrary/ctl', 'ctl') - self.status["progress"] = 0 - self.status["step"] = "setup" - os.system("./ctl setup") - self.status["progress"] = 1 makedirs('data') with open('data/release.json', 'w') as fd: json.dump(release, fd, indent=2) - self.status = {"installation finished. starting...": True} + self.status = {"relaunch": True} os.system("./ctl start &") - time.sleep(1) + time.sleep(5) self.httpd.shutdown() - def download(self, url, filename): dirname = os.path.dirname(filename) if dirname: @@ -118,7 +120,6 @@ class Install(Thread): return data - if __name__ == '__main__': if len(sys.argv) == 1: target = os.path.expanduser("~/Library/Application Support/Open Media Library") diff --git a/Open Media Library/Resources/js/install.js b/Open Media Library/Resources/js/install.js index 257ab47..08d6a50 100644 --- a/Open Media Library/Resources/js/install.js +++ b/Open Media Library/Resources/js/install.js @@ -1,43 +1,147 @@ -function load() { - var base = '//127.0.0.1:9842', - ws = new WebSocket('ws:' + base + '/ws'); - ws.onopen = function(event) { - document.location.href = 'http:' + base; - }; - ws.onerror = function(event) { - ws.close(); - setTimeout(load, 500); - }; - ws.onclose = function(event) { - setTimeout(load, 500); - }; -} +'use strict'; -function update() { - var xhr = new XMLHttpRequest(); - xhr.onload = function() { - var response = JSON.parse(this.responseText); - if (response.step) { - var status = response.step; - if (response.progress) { - status = parseInt(response.progress * 100) + '% ' + status; - } - document.getElementById('status').innerHTML = status; - setTimeout(update, 1000); - } else { - document.getElementById('status').innerHTML = 'done'; - setTimeout(load, 500); - } - }; - xhr.onerror = function() { - var status = document.getElementById('status').innerHTML; - if (['done', 'setup'].indexOf(status) == -1) { - document.getElementById('status').innerHTML = 'error'; - } - load(); +(function() { + + loadImages(function(images) { + loadScreen(images); + initUpdate(); + }); + + function initUpdate(browserSupported) { + window.update = {}; + update.status = document.createElement('div'); + update.status.className = 'OxElement'; + update.status.style.position = 'absolute'; + update.status.style.left = '16px'; + update.status.style.top = '336px'; + update.status.style.right = 0; + update.status.style.bottom = 0; + update.status.style.width = '512px'; + update.status.style.height = '16px'; + update.status.style.margin = 'auto'; + update.status.style.textAlign = 'center'; + update.status.style.color = 'rgb(16, 16, 16)'; + update.status.style.fontFamily = 'Lucida Grande, Segoe UI, DejaVu Sans, Lucida Sans Unicode, Helvetica, Arial, sans-serif'; + update.status.style.fontSize = '11px'; + document.querySelector('#loadingScreen').appendChild(update.status); + updateStatus(); } - xhr.open('get', '/status'); - xhr.send(); -} -update(); + function load() { + var base = '//127.0.0.1:9842', + ws = new WebSocket('ws:' + base + '/ws'); + ws.onopen = function(event) { + document.location.href = 'http:' + base; + }; + ws.onerror = function(event) { + ws.close(); + setTimeout(load, 500); + }; + ws.onclose = function(event) { + setTimeout(load, 500); + }; + } + + function loadImages(callback) { + var images = {}; + images.logo = document.createElement('img'); + images.logo.onload = function() { + images.logo.style.position = 'absolute'; + images.logo.style.left = 0; + images.logo.style.top = 0; + images.logo.style.right = 0; + images.logo.style.bottom = '96px'; + images.logo.style.width = '256px'; + images.logo.style.height = '256px'; + images.logo.style.margin = 'auto'; + images.logo.style.MozUserSelect = 'none'; + images.logo.style.MSUserSelect = 'none'; + images.logo.style.OUserSelect = 'none'; + images.logo.style.WebkitUserSelect = 'none'; + images.loadingIcon = document.createElement('img'); + images.loadingIcon.setAttribute('id', 'loadingIcon'); + images.loadingIcon.style.position = 'absolute'; + images.loadingIcon.style.left = '16px'; + images.loadingIcon.style.top = '256px' + images.loadingIcon.style.right = 0; + images.loadingIcon.style.bottom = 0; + images.loadingIcon.style.width = '32px'; + images.loadingIcon.style.height = '32px'; + images.loadingIcon.style.margin = 'auto'; + images.loadingIcon.style.MozUserSelect = 'none'; + images.loadingIcon.style.MSUserSelect = 'none'; + images.loadingIcon.style.OUserSelect = 'none'; + images.loadingIcon.style.WebkitUserSelect = 'none'; + images.loadingIcon.src = '/svg/symbolLoading.svg'; + callback(images); + }; + images.logo.src = '/png/oml.png'; + } + + function loadScreen(images) { + var loadingScreen = document.createElement('div'); + loadingScreen.setAttribute('id', 'loadingScreen'); + loadingScreen.className = 'OxScreen'; + loadingScreen.style.position = 'absolute'; + loadingScreen.style.width = '100%'; + loadingScreen.style.height = '100%'; + loadingScreen.style.backgroundColor = 'rgb(224, 224, 224)'; + loadingScreen.style.zIndex = '1002'; + loadingScreen.appendChild(images.logo); + loadingScreen.appendChild(images.loadingIcon); + // FF3.6 document.body can be undefined here + window.onload = function() { + document.body.style.margin = 0; + document.body.appendChild(loadingScreen); + startAnimation(); + }; + // IE8 does not call onload if already loaded before set + document.body && window.onload(); + } + + + function startAnimation() { + var css, deg = 0, loadingIcon = document.getElementById('loadingIcon'), + previousTime = +new Date(); + var animationInterval = setInterval(function() { + var currentTime = +new Date(), + delta = (currentTime - previousTime) / 1000; + previousTime = currentTime; + deg = Math.round((deg + delta * 360) % 360 / 30) * 30; + css = 'rotate(' + deg + 'deg)'; + loadingIcon.style.MozTransform = css; + loadingIcon.style.MSTransform = css; + loadingIcon.style.OTransform = css; + loadingIcon.style.WebkitTransform = css; + loadingIcon.style.transform = css; + }, 83); + } + + function updateStatus() { + var xhr = new XMLHttpRequest(); + xhr.onload = function() { + var response = JSON.parse(this.responseText); + if (response.step) { + var status = response.step; + if (response.progress) { + status = parseInt(response.progress * 100) + '% ' + status; + } + update.status.innerHTML = status; + setTimeout(updateStatus, 1000); + } else { + update.status.innerHTML = 'Relaunching...'; + setTimeout(load, 500); + } + }; + xhr.onerror = function() { + var status = update.status.innerHTML; + if (['Relaunching...'].indexOf(status) == -1) { + update.status.innerHTML = 'Installation failed'; + } + load(); + } + xhr.open('get', '/status'); + xhr.send(); + } + +}()); diff --git a/Open Media Library/Resources/png/oml.png b/Open Media Library/Resources/png/oml.png new file mode 100644 index 0000000..9bf0dc7 Binary files /dev/null and b/Open Media Library/Resources/png/oml.png differ diff --git a/Open Media Library/Resources/svg/symbolLoading.svg b/Open Media Library/Resources/svg/symbolLoading.svg new file mode 100644 index 0000000..eca747e --- /dev/null +++ b/Open Media Library/Resources/svg/symbolLoading.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file