Compare commits
8 commits
a576de8a82
...
7220fb4cdd
| Author | SHA1 | Date | |
|---|---|---|---|
| 7220fb4cdd | |||
| 8da17a33d3 | |||
| c602aab915 | |||
| ff671141f5 | |||
| 8fcaca2862 | |||
| 54492489b9 | |||
| cffffbde1c | |||
| 820190d9e6 |
14 changed files with 106 additions and 10 deletions
|
|
@ -10,7 +10,7 @@ Install
|
||||||
|
|
||||||
on Mac OS X download this:
|
on Mac OS X download this:
|
||||||
|
|
||||||
http://downloads.openmedialibrary.com/Open%20Media%20Library.dmg
|
https://downloads.openmedialibrary.com/Open%20Media%20Library.dmg
|
||||||
|
|
||||||
Networking
|
Networking
|
||||||
----------
|
----------
|
||||||
|
|
|
||||||
1
ctl
1
ctl
|
|
@ -78,6 +78,7 @@ if [ $SYSTEM == "Darwin" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PYTHONPATH="${PLATFORM_ENV}/lib/python${PLATFORM_PYTHON}/site-packages"
|
PYTHONPATH="${PLATFORM_ENV}/lib/python${PLATFORM_PYTHON}/site-packages"
|
||||||
|
PYTHONPATH="${PYTHONPATH}:${SHARED_ENV}/lib/python${PLATFORM_PYTHON}/site-packages"
|
||||||
PYTHONPATH="${PYTHONPATH}:${SHARED_ENV}/lib/python${SHARED_PYTHON}/site-packages"
|
PYTHONPATH="${PYTHONPATH}:${SHARED_ENV}/lib/python${SHARED_PYTHON}/site-packages"
|
||||||
PYTHONPATH="${PYTHONPATH}:${BASE}/${NAME}"
|
PYTHONPATH="${PYTHONPATH}:${BASE}/${NAME}"
|
||||||
export PYTHONPATH
|
export PYTHONPATH
|
||||||
|
|
|
||||||
2
install
2
install
|
|
@ -33,7 +33,7 @@ def get_platform():
|
||||||
|
|
||||||
class Install(Thread):
|
class Install(Thread):
|
||||||
|
|
||||||
base_url = 'http://downloads.openmedialibrary.com/'
|
base_url = 'https://downloads.openmedialibrary.com/'
|
||||||
status = {}
|
status = {}
|
||||||
failed = False
|
failed = False
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ if sys.platform == 'win32':
|
||||||
for site_packages in (
|
for site_packages in (
|
||||||
join(base, 'openmedialibrary'),
|
join(base, 'openmedialibrary'),
|
||||||
join(base, 'platform', 'Shared', 'lib', 'python3.4', 'site-packages'),
|
join(base, 'platform', 'Shared', 'lib', 'python3.4', 'site-packages'),
|
||||||
|
join(base, 'platform', 'Shared', 'lib', 'python3.7', 'site-packages'),
|
||||||
join(base, 'platform_win32', 'Lib', 'site-packages'),
|
join(base, 'platform_win32', 'Lib', 'site-packages'),
|
||||||
):
|
):
|
||||||
site.addsitedir(site_packages)
|
site.addsitedir(site_packages)
|
||||||
|
|
|
||||||
16
oml/api.py
16
oml/api.py
|
|
@ -2,9 +2,11 @@
|
||||||
# vi:si:et:sw=4:sts=4:ts=4
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
|
|
||||||
|
|
||||||
import subprocess
|
from os.path import normpath, dirname, abspath, join
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
import ox
|
import ox
|
||||||
from oxtornado import actions
|
from oxtornado import actions
|
||||||
|
|
@ -16,6 +18,14 @@ import update
|
||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
def win32_ui(type):
|
||||||
|
base = normpath(dirname(dirname(dirname(abspath(__file__)))))
|
||||||
|
cmd = [
|
||||||
|
join(base, 'platform_win32', 'python.exe'),
|
||||||
|
join(base, 'openmediablirary', 'oml', 'ui.py'), type
|
||||||
|
]
|
||||||
|
return cmd
|
||||||
|
|
||||||
def selectFolder(data):
|
def selectFolder(data):
|
||||||
'''
|
'''
|
||||||
returns {
|
returns {
|
||||||
|
|
@ -23,6 +33,8 @@ def selectFolder(data):
|
||||||
}
|
}
|
||||||
'''
|
'''
|
||||||
cmd = ['./ctl', 'ui', 'folder']
|
cmd = ['./ctl', 'ui', 'folder']
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
cmd = win32_ui('folder')
|
||||||
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, close_fds=True)
|
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, close_fds=True)
|
||||||
stdout, stderr = p.communicate()
|
stdout, stderr = p.communicate()
|
||||||
path = stdout.decode('utf-8').strip()
|
path = stdout.decode('utf-8').strip()
|
||||||
|
|
@ -39,6 +51,8 @@ def selectFile(data):
|
||||||
}
|
}
|
||||||
'''
|
'''
|
||||||
cmd = ['./ctl', 'ui', 'file']
|
cmd = ['./ctl', 'ui', 'file']
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
cmd = win32_ui('file')
|
||||||
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
|
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
|
||||||
stdout, stderr = p.communicate()
|
stdout, stderr = p.communicate()
|
||||||
path = stdout.decode('utf-8').strip()
|
path = stdout.decode('utf-8').strip()
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import setup
|
||||||
import state
|
import state
|
||||||
import tasks
|
import tasks
|
||||||
import websocket
|
import websocket
|
||||||
|
import ui_websocket
|
||||||
import update
|
import update
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
@ -130,6 +131,7 @@ def run():
|
||||||
handlers = common_handlers + [
|
handlers = common_handlers + [
|
||||||
(r'/api/upload/', UploadHandler, dict(context=db.session)),
|
(r'/api/upload/', UploadHandler, dict(context=db.session)),
|
||||||
(r'/api/', oxtornado.ApiHandler, dict(context=db.session)),
|
(r'/api/', oxtornado.ApiHandler, dict(context=db.session)),
|
||||||
|
(r'/ui_socket', ui_websocket.Handler),
|
||||||
(r'/ws', websocket.Handler),
|
(r'/ws', websocket.Handler),
|
||||||
(r"(.*)", MainHandler),
|
(r"(.*)", MainHandler),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ server_defaults = {
|
||||||
'node_address': '',
|
'node_address': '',
|
||||||
'extract_text': True,
|
'extract_text': True,
|
||||||
'localnode_discovery': True,
|
'localnode_discovery': True,
|
||||||
'release_url': 'http://downloads.openmedialibrary.com/release.json',
|
'release_url': 'https://downloads.openmedialibrary.com/release.json',
|
||||||
'pull_interval': 60000
|
'pull_interval': 60000
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ tor = False
|
||||||
update = False
|
update = False
|
||||||
shutdown = False
|
shutdown = False
|
||||||
websockets = []
|
websockets = []
|
||||||
|
uisockets = []
|
||||||
peers = {}
|
peers = {}
|
||||||
|
|
||||||
changelog_size = None
|
changelog_size = None
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ logger = logging.getLogger(__name__)
|
||||||
class TorDaemon(Thread):
|
class TorDaemon(Thread):
|
||||||
installing = False
|
installing = False
|
||||||
running = True
|
running = True
|
||||||
|
p = None
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._status = []
|
self._status = []
|
||||||
|
|
@ -48,7 +49,7 @@ CookieAuthentication 1
|
||||||
'''.strip())
|
'''.strip())
|
||||||
tor_data = os.path.join(settings.data_path, 'TorData')
|
tor_data = os.path.join(settings.data_path, 'TorData')
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
tor_data = os.path.normpath(tor_data).replace(os.SEP, '/')
|
tor_data = os.path.normpath(tor_data).replace('\\', '/')
|
||||||
if not os.path.exists(torrc):
|
if not os.path.exists(torrc):
|
||||||
with open(torrc, 'w') as fd:
|
with open(torrc, 'w') as fd:
|
||||||
fd.write('''
|
fd.write('''
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
# vi:si:et:sw=4:sts=4:ts=4
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
DEBUG = False
|
import sys
|
||||||
try:
|
try:
|
||||||
from gi.repository import Gtk, GObject
|
from gi.repository import Gtk, GObject
|
||||||
GObject.threads_init()
|
GObject.threads_init()
|
||||||
|
|
@ -10,6 +10,8 @@ except:
|
||||||
import tkinter.filedialog
|
import tkinter.filedialog
|
||||||
use_Gtk = False
|
use_Gtk = False
|
||||||
|
|
||||||
|
DEBUG = False
|
||||||
|
|
||||||
class GtkUI:
|
class GtkUI:
|
||||||
def selectFolder(self, data):
|
def selectFolder(self, data):
|
||||||
dialog = Gtk.FileChooserDialog(data.get("title", "Select Folder"),
|
dialog = Gtk.FileChooserDialog(data.get("title", "Select Folder"),
|
||||||
|
|
@ -62,6 +64,11 @@ class GtkUI:
|
||||||
class TkUI:
|
class TkUI:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.root = Tk()
|
self.root = Tk()
|
||||||
|
if sys.platform == 'darwin':
|
||||||
|
self.root.lift()
|
||||||
|
self.root.call('wm', 'attributes', '.', '-topmost', True)
|
||||||
|
self.root.update()
|
||||||
|
self.root.after_idle(self.root.call, 'wm', 'attributes', '.', '-topmost', False)
|
||||||
self.root.withdraw() # hiding tkinter window
|
self.root.withdraw() # hiding tkinter window
|
||||||
|
|
||||||
def selectFolder(self, data):
|
def selectFolder(self, data):
|
||||||
|
|
|
||||||
67
oml/ui_websocket.py
Normal file
67
oml/ui_websocket.py
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
from tornado.websocket import WebSocketHandler
|
||||||
|
from tornado.ioloop import IOLoop
|
||||||
|
|
||||||
|
from oxtornado import json_dumps
|
||||||
|
|
||||||
|
import state
|
||||||
|
import settings
|
||||||
|
from websocket import trigger_event
|
||||||
|
|
||||||
|
import logging
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Handler(WebSocketHandler):
|
||||||
|
|
||||||
|
queue = []
|
||||||
|
|
||||||
|
def initialize(self, public=False):
|
||||||
|
self._public = public
|
||||||
|
|
||||||
|
def check_origin(self, origin):
|
||||||
|
# allow access to websocket from site, installer and loader (local file)
|
||||||
|
return self.request.host in origin or \
|
||||||
|
origin in (
|
||||||
|
'http://127.0.0.1:9841',
|
||||||
|
'http://127.0.0.1:9842',
|
||||||
|
'file://',
|
||||||
|
'null'
|
||||||
|
)
|
||||||
|
|
||||||
|
def open(self):
|
||||||
|
if self.request.headers['origin'] not in ('null', 'file://', 'http://127.0.0.1:9842') \
|
||||||
|
and self.request.host not in self.request.headers['origin']:
|
||||||
|
logger.debug('reject cross site attempt to open websocket %s', self.request)
|
||||||
|
self.close()
|
||||||
|
if self not in state.uisockets:
|
||||||
|
state.uisockets.append(self)
|
||||||
|
|
||||||
|
#websocket calls
|
||||||
|
def on_message(self, message):
|
||||||
|
if self.queue:
|
||||||
|
action = self.queue.pop(0)
|
||||||
|
trigger_event(action, {'path': message})
|
||||||
|
else:
|
||||||
|
print('no queue got:', message)
|
||||||
|
|
||||||
|
def on_close(self):
|
||||||
|
if self in state.uisockets:
|
||||||
|
state.uisockets.remove(self)
|
||||||
|
|
||||||
|
def post(self, message):
|
||||||
|
if self.ws_connection is None:
|
||||||
|
self.on_close()
|
||||||
|
else:
|
||||||
|
state.main.add_callback(lambda: self.write_message(message))
|
||||||
|
|
||||||
|
def trigger_ui(message):
|
||||||
|
for ws in state.uisockets:
|
||||||
|
try:
|
||||||
|
ws.post(message)
|
||||||
|
except:
|
||||||
|
logger.debug('failed to send to UI ws %s %s', ws, message, exc_info=True)
|
||||||
|
|
@ -82,7 +82,7 @@ def get(url, filename=None):
|
||||||
def check():
|
def check():
|
||||||
if settings.release:
|
if settings.release:
|
||||||
release_data = get(settings.server.get('release_url',
|
release_data = get(settings.server.get('release_url',
|
||||||
'http://downloads.openmedialibrary.com/release.json'))
|
'https://downloads.openmedialibrary.com/release.json'))
|
||||||
release = json.loads(release_data.decode('utf-8'))
|
release = json.loads(release_data.decode('utf-8'))
|
||||||
old = current_version('openmedialibrary')
|
old = current_version('openmedialibrary')
|
||||||
new = release['modules']['openmedialibrary']['version']
|
new = release['modules']['openmedialibrary']['version']
|
||||||
|
|
|
||||||
|
|
@ -309,10 +309,12 @@ def addListItems(data):
|
||||||
i = Item.get(item_id)
|
i = Item.get(item_id)
|
||||||
i.queue_download()
|
i.queue_download()
|
||||||
i.update()
|
i.update()
|
||||||
elif data['list'] and (data['list'].startswith(':') or data['list'].endswith(':Public')):
|
elif data['list'] and (data['list'].startswith(':') or
|
||||||
|
data['list'].endswith(':Public') or
|
||||||
|
data['list'].enswtih(':')):
|
||||||
l = models.List.get_or_create(data['list'])
|
l = models.List.get_or_create(data['list'])
|
||||||
if l:
|
if l:
|
||||||
if l.name == 'Public' and l.user_id != settings.USER_ID:
|
if l.name in ('Public', '') and l.user_id != settings.USER_ID:
|
||||||
state.tasks.queue('upload', {
|
state.tasks.queue('upload', {
|
||||||
'user': l.user_id,
|
'user': l.user_id,
|
||||||
'items': data['items']
|
'items': data['items']
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@
|
||||||
stopAnimation();
|
stopAnimation();
|
||||||
document.getElementById('loadingIcon').style.display = 'none';
|
document.getElementById('loadingIcon').style.display = 'none';
|
||||||
document.getElementById('error').style.display = 'block';
|
document.getElementById('error').style.display = 'block';
|
||||||
}, 20000);
|
}, 60000);
|
||||||
}());
|
}());
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue