openmedialibrary-linux-package

This commit is contained in:
j 2016-01-27 23:39:58 +05:30
commit b7c6c44cd1
16 changed files with 477 additions and 0 deletions

6
.gitignore vendored Normal file
View file

@ -0,0 +1,6 @@
debian/debhelper-build-stamp
debian/files
debian/openmedialibrary.debhelper.log
debian/openmedialibrary.substvars
debian/openmedialibrary/
debian/stamp-makefile-build

32
Makefile Normal file
View file

@ -0,0 +1,32 @@
VERSION=0.1
PROG = bin/openmedialibrary
PREFIX ?= /usr
BINDIR ?= ${DESTDIR}${PREFIX}/bin
SHAREDIR ?= ${DESTDIR}${PREFIX}/share
INSTALL = install
all: ${PROG} ${DESKTOP}
install: ${PROG}
@mkdir -p "${SHAREDIR}/applications"
@mkdir -p "${BINDIR}"
${INSTALL} -m 555 -o root -g root ${PROG} ${BINDIR}
${INSTALL} -m 755 -o root -g root -d ${SHAREDIR}/openmedialibrary
${INSTALL} -m 444 -o root openmedialibrary.desktop ${SHAREDIR}/applications/openmedialibrary.desktop
@cp -r openmedialibrary ${SHAREDIR}
@chown -R root:root ${SHAREDIR}/openmedialibrary
clean:
uninstall:
@rm -rf ${BINDIR}/${PROG} ${SHAREDIR}/openmedialibrary ${SHAREDIR}/applications/openmedialibrary.desktop
dist:
git archive --format=tar --prefix=openmedialibrary-${VERSION}/ master | xz >openmedialibrary-${VERSION}.tar.xz
PKGBUILD: PKGBUILD.in dist
sed -e "s/VERSION/${VERSION}/g" -e "s/SHA1SUM/`sha1sum openmedialibrary-${VERSION}.tar.xz | cut -f1 -d' '`/g" PKGBUILD.in > PKGBUILD
.PHONY: all install uninstall dist

163
bin/openmedialibrary Executable file
View file

@ -0,0 +1,163 @@
#!/usr/bin/python3
# GPL3 2016 j
from __future__ import division, with_statement
from contextlib import closing
import json
import os
import sys
import time
import tarfile
from urllib.request import urlopen
import http.server
import socketserver
from threading import Thread
import subprocess
import webbrowser
PORT = 9841
static_dir = os.path.normpath(os.path.join(os.path.abspath(os.path.dirname(__file__)), '..', 'openmedialibrary'))
if not os.path.exists(static_dir):
static_dir = '/usr/share/openmedialibrary'
def makedirs(dirname):
if not os.path.exists(dirname):
os.makedirs(dirname)
def get_platform():
name = sys.platform
if name.startswith('darwin'):
name = 'darwin64'
elif name.startswith('linux'):
import platform
if platform.architecture()[0] == '64bit':
name = 'linux64'
else:
name = 'linux32'
return name
class Handler(http.server.SimpleHTTPRequestHandler):
def do_OPTIONS(self):
self.send_response(200, 'OK')
self.send_header('Allow', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Headers', 'X-Requested-With')
self.send_header('Content-Length', '0')
self.end_headers()
def do_GET(self):
if self.path == '/status':
content = json.dumps(self.server.install.status).encode()
self.send_response(200, 'OK')
else:
path = os.path.join(static_dir, 'index.html' if self.path == '/' else self.path[1:])
if os.path.exists(path):
with open(path, 'rb') 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 = b'404 not found'
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Content-Length', str(len(content)))
self.end_headers()
self.wfile.write(content)
class Install(Thread):
release_url = "http://downloads.openmedialibrary.com/release.json"
status = {
'step': 'Downloading...'
}
def __init__(self, target, httpd):
target = os.path.normpath(os.path.join(os.path.abspath(target)))
self.target = target
self.httpd = httpd
Thread.__init__(self)
self.daemon = True
self.start()
def run(self):
webbrowser.open('http://127.0.0.1:%s'%PORT)
target = self.target
makedirs(target)
os.chdir(target)
self.status["step"] = 'Downloading...'
release = self.get_release()
self.status["release"] = release
self.status["progress"] = 0
platform = get_platform()
for module in sorted(release['modules']):
if release['modules'][module].get('platform', platform) == platform:
package_tar = release['modules'][module]['name']
url = self.release_url.replace('release.json', package_tar)
self.download(url, package_tar)
self.status["step"] = 'Installing...'
for module in sorted(release['modules']):
if release['modules'][module].get('platform', platform) == platform:
package_tar = release['modules'][module]['name']
tar = tarfile.open(package_tar)
tar.extractall()
tar.close()
os.unlink(package_tar)
os.symlink('openmedialibrary/ctl', 'ctl')
makedirs('data')
with open('data/release.json', 'w') as fd:
json.dump(release, fd, indent=2)
self.status = {"relaunch": True}
os.system("./ctl start &")
time.sleep(5)
self.httpd.shutdown()
def download(self, url, filename):
dirname = os.path.dirname(filename)
if dirname:
makedirs(dirname)
with open(filename, 'wb') as f:
with closing(urlopen(url)) as u:
size = int(u.headers.get('content-length', 0))
self.status["size"] = size
available = 0
data = u.read(4096)
while data:
if size:
available += len(data)
f.write(data)
data = u.read(4096)
def get_release(self):
with closing(urlopen(self.release_url)) as u:
data = json.loads(u.read().decode())
return data
class Server(socketserver.ThreadingMixIn, socketserver.TCPServer):
allow_reuse_address = True
def run(target):
httpd = Server(("", PORT), Handler)
install = Install(target, httpd)
httpd.install = install
httpd.serve_forever()
if __name__ == '__main__':
if len(sys.argv) == 1:
target = os.path.expanduser('~/.local/share/openmedialibrary')
elif len(sys.argv) != 2:
print('usage: %s [target]' % sys.argv[0])
sys.exit(1)
else:
target = sys.argv[1]
if os.path.exists(target):
subprocess.Popen([os.path.join(target, 'ctl'), 'open'])
else:
run(target)

5
debian/changelog vendored Normal file
View file

@ -0,0 +1,5 @@
openmedialibrary (0.1) unstable; urgency=medium
* Initial release.
-- Jan Gerber <j@mailb.org> Wed, 27 Jan 2016 22:07:26 +0530

1
debian/compat vendored Normal file
View file

@ -0,0 +1 @@
9

14
debian/control vendored Normal file
View file

@ -0,0 +1,14 @@
Source: openmedialibrary
Maintainer: Jan Gerber <j@mailb.org>
Section: text
Priority: optional
Build-Depends: debhelper (>= 9)
Standards-Version: 3.9.6
Package: openmedialibrary
Architecture: all
Depends: ${misc:Depends}, python3,
python3-pil, python3-lxml, python3-openssl (>= 0.15), python3-crypto,
poppler-utils, gir1.2-gtk-3.0
Description: Open Media Library
manage and sync your digital media collections

12
debian/copyright vendored Normal file
View file

@ -0,0 +1,12 @@
This package was debianized by Jan Gerber <j@mailb.org> on
Wed Jan 27 23:54:31 IST 2016
It was downloaded with git clone https://git.0x2620.org/openmedialibrary-linux-package
Upstream Authors: 0x2620 <0x2620@0x2620.org>
Copyright: GPL3
You can find the mentioned GNU General Public License 3 (GPL3) (on a
Debian system) in the file /usr/share/common-licenses/GPL-3.

2
debian/openmedialibrary.dirs vendored Normal file
View file

@ -0,0 +1,2 @@
usr/bin
usr/share/applications

6
debian/rules vendored Executable file
View file

@ -0,0 +1,6 @@
#!/usr/bin/make -f
%:
dh $@
override_dh_auto_install:
$(MAKE) DESTDIR=$$(pwd)/debian/openmedialibrary PREFIX=/usr install

1
debian/source/format vendored Normal file
View file

@ -0,0 +1 @@
3.0 (native)

9
openmedialibrary.desktop Normal file
View file

@ -0,0 +1,9 @@
[Desktop Entry]
Type=Application
Name=Open Media Library
Keywords=OpenMediaLibrary OML
Comment=manage and sync your digital media collections
Exec=/usr/bin/openmedialibrary
Icon=/usr/share/openmedialibrary/svg/oml.svg
Terminal=false
Categories=Network;FileTransfer;P2P;

View file

@ -0,0 +1,11 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Open Media Library</title>
<meta charset="UTF-8"/>
<link href="/png/oml.png" rel="icon" type="image/png">
<script src="/js/install.js" type="text/javascript"></script>
<meta name="google" value="notranslate"/>
</head>
<body></body>
</html>

View file

@ -0,0 +1,148 @@
'use strict';
(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);
update.status.innerHTML = '';
updateStatus();
}
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();
}
}());

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View file

@ -0,0 +1,51 @@
<svg xmlns="http://www.w3.org/2000/svg" height="600" width="600">
<g transform="translate(134 -64) rotate(-45 300 300)">
<g transform="translate(115.47005383792516 66.66666666666667)">
<path d="M 86.60254037844388,50.0 L 173.20508075688775,0 173.20508075688775,100 86.60254037844388,150.0 86.60254037844388,50.0" fill="rgb(140,131,114)"/>
</g>
<g transform="translate(230.94010767585033 133.33333333333334)">
<path d="M 0,0 L 86.60254037844388,-50.0 173.20508075688775,0 86.60254037844388,50.0 0,0" fill="rgb(156,163,142)"/>
<path d="M 86.60254037844388,50.0 L 173.20508075688775,0 173.20508075688775,100 86.60254037844388,150.0 86.60254037844388,50.0" fill="rgb(131,140,114)"/>
<path d="M 0,0 L 86.60254037844388,50.0 86.60254037844388,150.0 0,100 0,0" fill="rgb(105,112,91)"/>
</g>
<g transform="translate(346.4101615137755 200.0)">
<path d="M 0,0 L 86.60254037844388,-50.0 173.20508075688775,0 86.60254037844388,50.0 0,0" fill="rgb(142,163,142)"/>
<path d="M 86.60254037844388,50.0 L 173.20508075688775,0 173.20508075688775,100 86.60254037844388,150.0 86.60254037844388,50.0" fill="rgb(114,140,114)"/>
<path d="M 0,0 L 86.60254037844388,50.0 86.60254037844388,150.0 0,100 0,0" fill="rgb(91,112,91)"/>
</g>
<g transform="translate(230.94010767585033 266.6666666666667)">
<path d="M 0,0 L 86.60254037844388,-50.0 173.20508075688775,0 86.60254037844388,50.0 0,0" fill="rgb(142,163,156)"/>
<path d="M 86.60254037844388,50.0 L 173.20508075688775,0 173.20508075688775,100 86.60254037844388,150.0 86.60254037844388,50.0" fill="rgb(114,140,131)"/>
<path d="M 0,0 L 86.60254037844388,50.0 86.60254037844388,150.0 0,100 0,0" fill="rgb(91,112,105)"/>
</g>
<g transform="translate(115.47005383792516 333.33333333333337)">
<path d="M 0,0 L 86.60254037844388,-50.0 173.20508075688775,0 86.60254037844388,50.0 0,0" fill="rgb(142,156,163)"/>
<path d="M 86.60254037844388,50.0 L 173.20508075688775,0 173.20508075688775,100 86.60254037844388,150.0 86.60254037844388,50.0" fill="rgb(114,131,140)"/>
<path d="M 0,0 L 86.60254037844388,50.0 86.60254037844388,150.0 0,100 0,0" fill="rgb(91,105,112)"/>
</g>
<g transform="translate(0 400.0)">
<path d="M 0,0 L 86.60254037844388,-50.0 173.20508075688775,0 86.60254037844388,50.0 0,0" fill="rgb(142,142,163)"/>
<path d="M 86.60254037844388,50.0 L 173.20508075688775,0 173.20508075688775,100 86.60254037844388,150.0 86.60254037844388,50.0" fill="rgb(114,114,140)"/>
<path d="M 0,0 L 86.60254037844388,50.0 86.60254037844388,150.0 0,100 0,0" fill="rgb(91,91,112)"/>
</g>
<g transform="translate(0 266.6666666666667)">
<path d="M 0,0 L 86.60254037844388,-50.0 173.20508075688775,0 86.60254037844388,50.0 0,0" fill="rgb(156,142,163)"/>
<path d="M 86.60254037844388,50.0 L 173.20508075688775,0 173.20508075688775,100 86.60254037844388,150.0 86.60254037844388,50.0" fill="rgb(131,114,140)"/>
<path d="M 0,0 L 86.60254037844388,50.0 86.60254037844388,150.0 0,100 0,0" fill="rgb(105,91,112)"/>
</g>
<g transform="translate(0 133.33333333333334)">
<path d="M 0,0 L 86.60254037844388,-50.0 173.20508075688775,0 86.60254037844388,50.0 0,0" fill="rgb(163,142,156)"/>
<path d="M 86.60254037844388,50.0 L 173.20508075688775,0 173.20508075688775,100 86.60254037844388,150.0 86.60254037844388,50.0" fill="rgb(140,114,131)"/>
<path d="M 0,0 L 86.60254037844388,50.0 86.60254037844388,150.0 0,100 0,0" fill="rgb(112,91,105)"/>
</g>
<g transform="translate(0 0)">
<path d="M 0,0 L 86.60254037844388,-50.0 173.20508075688775,0 86.60254037844388,50.0 0,0" fill="rgb(163,142,142)"/>
<path d="M 86.60254037844388,50.0 L 173.20508075688775,0 173.20508075688775,100 86.60254037844388,150.0 86.60254037844388,50.0" fill="rgb(140,114,114)"/>
<path d="M 0,0 L 86.60254037844388,50.0 86.60254037844388,150.0 0,100 0,0" fill="rgb(112,91,91)"/>
</g>
<g transform="translate(115.47005383792516 66.66666666666667)">
<path d="M 0,0 L 86.60254037844388,-50.0 173.20508075688775,0 86.60254037844388,50.0 0,0" fill="rgb(163,156,142)"/>
<path d="M 0,0 L 86.60254037844388,50.0 86.60254037844388,150.0 0,100 0,0" fill="rgb(112,105,91)"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -0,0 +1,16 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256">
<g transform="translate(128, 128)" stroke="#808080" stroke-linecap="round" stroke-width="28">
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(0)" opacity="1"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(30)" opacity="0.083333"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(60)" opacity="0.166667"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(90)" opacity="0.25"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(120)" opacity="0.333333"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(150)" opacity="0.416667"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(180)" opacity="0.5"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(210)" opacity="0.583333"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(240)" opacity="0.666667"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(270)" opacity="0.75"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(300)" opacity="0.833333"/>
<line x1="0" y1="-114" x2="0" y2="-70" transform="rotate(330)" opacity="0.916667"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB