From 72e5cbd0ece5759c5877017be7100d4fc69bb217 Mon Sep 17 00:00:00 2001 From: j Date: Thu, 21 Jan 2016 14:02:26 +0530 Subject: [PATCH] use update ui for installer --- Open Media Library/Resources/index.html | 11 +- Open Media Library/Resources/install.py | 29 +-- Open Media Library/Resources/js/install.js | 184 ++++++++++++++---- Open Media Library/Resources/png/oml.png | Bin 0 -> 33650 bytes .../Resources/svg/symbolLoading.svg | 16 ++ 5 files changed, 181 insertions(+), 59 deletions(-) create mode 100644 Open Media Library/Resources/png/oml.png create mode 100644 Open Media Library/Resources/svg/symbolLoading.svg 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 0000000000000000000000000000000000000000..9bf0dc766725c13c49351bdc9f497c08059b1a0b GIT binary patch literal 33650 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 literal 0 HcmV?d00001 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