Compare commits

..

8 commits

Author SHA1 Message Date
j
7220fb4cdd bring to front 2019-01-21 10:39:41 +05:30
j
8da17a33d3 ui sockets 2019-01-21 10:28:08 +05:30
j
c602aab915 win32 select folder/file 2019-01-20 18:40:04 +05:30
j
ff671141f5 fix win32 tor launcher 2019-01-20 18:37:21 +05:30
j
8fcaca2862 longer timeout 2019-01-20 16:59:12 +05:30
j
54492489b9 use https 2019-01-20 16:46:58 +05:30
j
cffffbde1c also check for 3.7 2019-01-20 16:46:46 +05:30
j
820190d9e6 allow adding to user or user:Public 2019-01-20 15:53:42 +05:30
14 changed files with 106 additions and 10 deletions

View file

@ -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
View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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()

View file

@ -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),
] ]

View file

@ -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
} }

View file

@ -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

View file

@ -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('''

View file

@ -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
View 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)

View file

@ -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']

View file

@ -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']

View file

@ -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>