Merge pull request #144 from lbryio/pr/141

Add windows URI Handling
This commit is contained in:
Jack Robison 2016-08-28 01:28:12 -04:00 committed by GitHub
commit 4bfe4450b1
7 changed files with 145 additions and 19 deletions

View file

@ -56,4 +56,6 @@ artifacts:
- path: dist/*.msi - path: dist/*.msi
name: msi name: msi
- path: build/exe.win32-2.7/ - path: build/exe.win32-2.7/
name: lbry-portable name: lbry-portable
- path: packaging/windows/lbry-win32-app/LBRY-URI.reg
name: LBRY-URI

0
packaging/__init__.py Normal file
View file

View file

@ -0,0 +1,90 @@
import os
import webbrowser
import subprocess
import sys
from time import sleep
from jsonrpc.proxy import JSONRPCProxy
from lbrynet.conf import UI_ADDRESS, API_CONNECTION_STRING
class LBRYURIHandler(object):
def __init__(self):
self.started_daemon = False
self.daemon = JSONRPCProxy.from_url(API_CONNECTION_STRING)
def handle_osx(self, lbry_name):
self.check_daemon()
if not self.started_daemon:
os.system("open /Applications/LBRY.app")
sleep(3)
lbry_name = self.parse_name(lbry_name)
self.open_address(lbry_name)
def handle_linux(self, lbry_name):
self.check_daemon()
if not self.started_daemon:
cmd = r'DIR = "$( cd "$(dirname "${BASH_SOURCE[0]}" )" && pwd )"' \
r'if [-z "$(pgrep lbrynet-daemon)"]; then' \
r'echo "running lbrynet-daemon..."' \
r'$DIR / lbrynet - daemon &' \
r'sleep 3 # let the daemon load before connecting' \
r'fi'
subprocess.Popen(cmd, shell=True)
lbry_name = self.parse_name(lbry_name)
self.open_address(lbry_name)
def handle_win32(self, lbry_name):
# Opening LBRY.exe with lbry_name as arg prevents the need to
# make a separate call to open_address()
self.check_daemon()
lbry_name = self.parse_name(lbry_name)
if self.started_daemon:
self.open_address(lbry_name)
else:
lbry_path = os.path.join(os.environ["PROGRAMFILES"], "LBRY", "LBRY.exe ")
subprocess.call(lbry_path + lbry_name)
def check_daemon(self):
try:
self.started_daemon = self.daemon.is_running()
except:
self.started_daemon = False
@staticmethod
def parse_name(lbry_name):
if lbry_name[:7].lower() == "lbry://":
if lbry_name[-1] == "/":
return lbry_name[7:-1]
else:
return lbry_name[7:]
else:
if lbry_name[-1] == "/":
return lbry_name[:-1]
else:
return lbry_name[:]
@staticmethod
def open_address(lbry_name):
if lbry_name == "lbry" or lbry_name == "" or lbry_name is None:
webbrowser.open(UI_ADDRESS)
else:
webbrowser.open(UI_ADDRESS + "/?show=" + lbry_name)
def main(args):
if len(args) != 1:
args = ["lbry://lbry"]
name = args[0][7:]
if sys.platform == "darwin":
LBRYURIHandler().handle_osx(lbry_name=name)
elif os.name == "nt":
LBRYURIHandler().handle_win32(lbry_name=name)
else:
LBRYURIHandler().handle_linux(lbry_name=name)
if __name__ == "__main__":
main(sys.argv[1:])

View file

View file

@ -0,0 +1,15 @@
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\lbry]
@="URL:LBRY Protocol"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\lbry\DefaultIcon]
@="LBRY.exe,1"
[HKEY_CLASSES_ROOT\lbry\shell]
[HKEY_CLASSES_ROOT\lbry\shell\open]
[HKEY_CLASSES_ROOT\lbry\shell\open\command]
@="\"C:\\Program Files (x86)\\LBRY\\LBRY.exe\" \"%1\""

View file

@ -5,11 +5,12 @@ import sys
import threading import threading
import webbrowser import webbrowser
from twisted.internet import reactor, error
from twisted.web import server
import win32api import win32api
import win32con import win32con
import win32gui_struct import win32gui_struct
from jsonrpc.proxy import JSONRPCProxy
from twisted.internet import reactor, error
from twisted.web import server
try: try:
import winxpgui as win32gui import winxpgui as win32gui
@ -18,7 +19,8 @@ except ImportError:
from lbrynet.lbrynet_daemon.LBRYDaemonServer import LBRYDaemonServer, LBRYDaemonRequest from lbrynet.lbrynet_daemon.LBRYDaemonServer import LBRYDaemonServer, LBRYDaemonRequest
from lbrynet.conf import API_PORT, API_INTERFACE, ICON_PATH, APP_NAME from lbrynet.conf import API_PORT, API_INTERFACE, ICON_PATH, APP_NAME
from lbrynet.conf import UI_ADDRESS from lbrynet.conf import UI_ADDRESS, API_CONNECTION_STRING
from packaging.uri_handler.LBRYURIHandler import LBRYURIHandler
if getattr(sys, 'frozen', False) and os.name == "nt": if getattr(sys, 'frozen', False) and os.name == "nt":
@ -243,7 +245,7 @@ class SysTrayIcon(object):
win32gui.DestroyWindow(self.hwnd) win32gui.DestroyWindow(self.hwnd)
def main(): def main(lbry_name=None):
def LBRYApp(): def LBRYApp():
return SysTrayIcon(icon, hover_text, menu_options, on_quit=stop) return SysTrayIcon(icon, hover_text, menu_options, on_quit=stop)
@ -277,11 +279,26 @@ def main():
lbry = LBRYDaemonServer() lbry = LBRYDaemonServer()
d = lbry.start() d = lbry.start()
d.addCallback(lambda _: webbrowser.open(UI_ADDRESS)) d.addCallback(lambda _: LBRYURIHandler.open_address(lbry_name))
lbrynet_server = server.Site(lbry.root) lbrynet_server = server.Site(lbry.root)
lbrynet_server.requestFactory = LBRYDaemonRequest lbrynet_server.requestFactory = LBRYDaemonRequest
reactor.listenTCP(API_PORT, lbrynet_server, interface=API_INTERFACE) reactor.listenTCP(API_PORT, lbrynet_server, interface=API_INTERFACE)
reactor.run() reactor.run()
if __name__ == '__main__': if __name__ == '__main__':
main() lbry_daemon = JSONRPCProxy.from_url(API_CONNECTION_STRING)
try:
started_daemon = lbry_daemon.is_running()
except:
started_daemon = False
try:
lbry_name = LBRYURIHandler.parse_name(sys.argv[1])
except IndexError:
lbry_name = None
if started_daemon:
LBRYURIHandler.open_address(lbry_name)
else:
main(lbry_name)

View file

@ -13,6 +13,8 @@ import requests.certs
from lbrynet import __version__ from lbrynet import __version__
name = 'LBRY'
description = 'A decentralized media library and marketplace'
win_icon = os.path.join('packaging', 'windows', 'lbry-win32-app', 'icons', 'lbry256.ico') win_icon = os.path.join('packaging', 'windows', 'lbry-win32-app', 'icons', 'lbry256.ico')
wordlist_path = pkg_resources.resource_filename('lbryum', 'wordlist') wordlist_path = pkg_resources.resource_filename('lbryum', 'wordlist')
@ -47,27 +49,27 @@ console_scripts = ['lbrynet-stdin-uploader = lbrynet.lbrynet_console.LBRYStdinUp
# shortcut_table = [ # shortcut_table = [
# ('DesktopShortcut', # Shortcut # ('DesktopShortcut', # Shortcut
# 'DesktopFolder', # Directory # 'DesktopFolder', # Directory
# 'LBRY 1', # Name # name, # Name
# 'TARGETDIR', # Component # 'TARGETDIR', # Component
# '[TARGETDIR]\LBRY.exe', # Target # '[TARGETDIR]\{0}.exe'.format(name), # Target
# None, # Arguments # None, # Arguments
# None, # Description # description, # Description
# None, # Hotkey # None, # Hotkey
# win_icon, # Icon # win_icon, # Icon (doesn't work for some reason?)
# None, # IconIndex # None, # IconIndex
# None, # ShowCmd # None, # ShowCmd
# 'TARGETDIR', # WkDir # 'TARGETDIR', # WkDir
# ), # ),
# ] # ]
# #
# # Now create the table dictionary
# msi_data = {'Shortcut': shortcut_table} # msi_data = {'Shortcut': shortcut_table}
bdist_msi_options = { bdist_msi_options = {
# 'upgrade_code': '{66620F3A-DC3A-11E2-B341-002219E9B01F}', 'upgrade_code': '{18c0e933-ad08-44e8-a413-1d0ed624c100}',
'add_to_path': False, 'add_to_path': False,
'initial_target_dir': r'[LocalAppDataFolder]\LBRY', # Default install path is 'C:\Program Files\' for 32-bit or 'C:\Program Files (x86)\' for 64-bit
# 'data': msi_data, # 'initial_target_dir': r'[LocalAppDataFolder]\{0}'.format(name),
# 'data': msi_data
} }
build_exe_options = { build_exe_options = {
@ -129,16 +131,16 @@ exe = Executable(
base='Win32GUI', base='Win32GUI',
icon=win_icon, icon=win_icon,
compress=True, compress=True,
shortcutName='LBRY', shortcutName=name,
shortcutDir='DesktopFolder', shortcutDir='DesktopFolder',
targetName='LBRY.exe' targetName='{0}.exe'.format(name)
# targetDir="LocalAppDataFolder" # targetDir="LocalAppDataFolder"
) )
setup( setup(
name='LBRY', name=name,
version=__version__, version=__version__,
description='A decentralized media library and marketplace', description=name + ": " + description,
url='lbry.io', url='lbry.io',
author='LBRY, Inc.', author='LBRY, Inc.',
keywords='LBRY', keywords='LBRY',