From 42df2fe242b3a9e540bc78074026f619c5f1ebeb Mon Sep 17 00:00:00 2001 From: Jack Date: Mon, 14 Mar 2016 12:30:22 -0400 Subject: [PATCH 01/13] update daemon convert to jsonrpc, fix a few issues, remove hacky functions --- lbrynet/conf.py | 12 +- lbrynet/core/LBRYcrdWallet.py | 8 +- lbrynet/lbryfilemanager/LBRYFileManager.py | 19 +- lbrynet/lbrynet_daemon/LBRYDaemon.py | 606 +++++++++----------- lbrynet/lbrynet_daemon/LBRYDaemonControl.py | 51 ++ lbrynet/lbrynet_daemon/LBRYDownloader.py | 39 +- lbrynet/lbrynet_daemon/LBRYPublisher.py | 4 +- setup.py | 16 +- 8 files changed, 398 insertions(+), 357 deletions(-) create mode 100644 lbrynet/lbrynet_daemon/LBRYDaemonControl.py diff --git a/lbrynet/conf.py b/lbrynet/conf.py index c172884e6..8af383387 100644 --- a/lbrynet/conf.py +++ b/lbrynet/conf.py @@ -26,4 +26,14 @@ KNOWN_DHT_NODES = [('104.236.42.182', 4000)] POINTTRADER_SERVER = 'http://ec2-54-187-192-68.us-west-2.compute.amazonaws.com:2424' #POINTTRADER_SERVER = 'http://127.0.0.1:2424' -CRYPTSD_FILE_EXTENSION = ".cryptsd" \ No newline at end of file +CRYPTSD_FILE_EXTENSION = ".cryptsd" + +API_INTERFACE = "localhost" +API_ADDRESS = "lbryapi" +API_PORT = 5279 +ICON_PATH = "app.icns" +APP_NAME = "LBRY" +DEFAULT_WALLET = "lbryum" + +API_CONNECTION_STRING = "http://%s:%i/%s" % (API_INTERFACE, API_PORT, API_ADDRESS) +PROTOCOL_PREFIX = "lbry" \ No newline at end of file diff --git a/lbrynet/core/LBRYcrdWallet.py b/lbrynet/core/LBRYcrdWallet.py index 46279a2e4..543551c36 100644 --- a/lbrynet/core/LBRYcrdWallet.py +++ b/lbrynet/core/LBRYcrdWallet.py @@ -874,13 +874,15 @@ class LBRYumWallet(LBRYWallet): d = defer.Deferred() def check_stopped(): - if self.network.is_connected(): - return False + if self.network: + if self.network.is_connected(): + return False stop_check.stop() self.network = None d.callback(True) - self.network.stop() + if self.network: + self.network.stop() stop_check = task.LoopingCall(check_stopped) stop_check.start(.1) diff --git a/lbrynet/lbryfilemanager/LBRYFileManager.py b/lbrynet/lbryfilemanager/LBRYFileManager.py index fb14ec199..f741558dc 100644 --- a/lbrynet/lbryfilemanager/LBRYFileManager.py +++ b/lbrynet/lbryfilemanager/LBRYFileManager.py @@ -3,9 +3,9 @@ Keep track of which LBRY Files are downloading and store their LBRY File specifi """ import logging -import datetime import os import sys +from datetime import datetime from twisted.internet.task import LoopingCall from twisted.enterprise import adbapi @@ -28,12 +28,13 @@ class LBRYFileManager(object): Keeps track of currently opened LBRY Files, their options, and their LBRY File specific metadata. """ - def __init__(self, session, stream_info_manager, sd_identifier): + def __init__(self, session, stream_info_manager, sd_identifier, delete_data=False): self.session = session self.stream_info_manager = stream_info_manager self.sd_identifier = sd_identifier self.lbry_files = [] self.sql_db = None + self.delete_data = delete_data self.check_exists_loop = LoopingCall(self.check_files_exist) if sys.platform.startswith("darwin"): self.download_directory = os.path.join(os.path.expanduser("~"), 'Downloads') @@ -42,7 +43,7 @@ class LBRYFileManager(object): log.debug("Download directory for LBRYFileManager: %s", str(self.download_directory)) def setup(self): - self.check_exists_loop.start(1) + self.check_exists_loop.start(10) d = self._open_db() d.addCallback(lambda _: self._add_to_sd_identifier()) @@ -53,7 +54,14 @@ class LBRYFileManager(object): def _disp(deleted_files): if deleted_files[0][0]: for file in bad_files: - print "[" + str(datetime.datetime.now()) + "] Detected " + file.file_name + " was deleted, removing from file manager" + log.info("[" + str(datetime.now()) + "] Detected " + file.file_name + " was deleted, removing from file manager") + + def _delete_stream_data(lbry_file): + s_h = lbry_file.stream_hash + d = self.get_count_for_stream_hash(s_h) + # TODO: could possibly be a timing issue here + d.addCallback(lambda c: self.stream_info_manager.delete_stream(s_h) if c == 0 else True) + return d bad_files = [lbry_file for lbry_file in self.lbry_files if lbry_file.completed == True and @@ -61,6 +69,9 @@ class LBRYFileManager(object): d = defer.DeferredList([self.delete_lbry_file(lbry_file) for lbry_file in bad_files], consumeErrors=True) d.addCallback(lambda files: _disp(files) if len(files) else defer.succeed(None)) + if self.delete_data: + d2 = defer.DeferredList([_delete_stream_data(lbry_file) for lbry_file in bad_files], consumeErrors=True) + def get_lbry_file_status(self, lbry_file): return self._get_lbry_file_status(lbry_file.rowid) diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index 410da8a81..67b5c8c9b 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -1,23 +1,21 @@ import locale import os import sys -import json +import simplejson as json import binascii -import webbrowser -import xmlrpclib import subprocess import logging -import argparse -import pwd import requests -from twisted.web import xmlrpc, server -from twisted.internet import defer, threads, reactor, error +from twisted.web import server, resource, static +from twisted.internet import defer, threads, error, reactor +from txjsonrpc.web import jsonrpc from datetime import datetime from decimal import Decimal from StringIO import StringIO from zipfile import ZipFile from urllib import urlopen +from appdirs import user_data_dir from lbrynet.core.PaymentRateManager import PaymentRateManager from lbrynet.core.server.BlobAvailabilityHandler import BlobAvailabilityHandlerFactory @@ -33,6 +31,7 @@ from lbrynet.lbrynet_daemon.LBRYPublisher import Publisher from lbrynet.core.utils import generate_id from lbrynet.lbrynet_console.LBRYSettings import LBRYSettings from lbrynet.conf import MIN_BLOB_DATA_PAYMENT_RATE, DEFAULT_MAX_SEARCH_RESULTS, KNOWN_DHT_NODES, DEFAULT_MAX_KEY_FEE +from lbrynet.conf import API_CONNECTION_STRING, API_PORT, API_ADDRESS from lbrynet.core.StreamDescriptor import StreamDescriptorIdentifier, download_sd_blob from lbrynet.core.Session import LBRYSession from lbrynet.core.PTCWallet import PTCWallet @@ -41,28 +40,30 @@ from lbrynet.lbryfilemanager.LBRYFileManager import LBRYFileManager from lbrynet.lbryfile.LBRYFileMetadataManager import DBLBRYFileMetadataManager, TempLBRYFileMetadataManager log = logging.getLogger(__name__) -# logging.basicConfig(level=logging.DEBUG) +BAD_REQUEST = 400 +NOT_FOUND = 404 +OK_CODE = 200 # TODO add login credentials in a conf file -# functions to add: -# TODO send credits to address # TODO alert if your copy of a lbry file is out of date with the name record -BAD_REQUEST = (400, "Bad request") -NOT_FOUND = (404, "Not found") - -OK_CODE = 200 +class Bunch: + def __init__(self, params): + self.__dict__.update(params) -class LBRYDaemon(xmlrpc.XMLRPC): +class LBRYDaemon(jsonrpc.JSONRPC): """ - LBRYnet daemon + LBRYnet daemon, a jsonrpc interface to lbry functions """ + isLeaf = True def setup(self, wallet_type, check_for_updates): def _set_vars(wallet_type, check_for_updates): + reactor.addSystemEventTrigger('before', 'shutdown', self._shutdown) + self.fetcher = None self.current_db_revision = 1 self.run_server = True @@ -71,7 +72,8 @@ class LBRYDaemon(xmlrpc.XMLRPC): if sys.platform != "darwin": self.db_dir = os.path.join(os.path.expanduser("~"), ".lbrynet") else: - self.db_dir = os.path.join(os.path.expanduser("~"), "Library/Application Support/lbrynet") + self.db_dir = user_data_dir("LBRY") + # self.db_dir = os.path.join(os.path.expanduser("~"), "Library/Application Support/lbrynet") self.blobfile_dir = os.path.join(self.db_dir, "blobfiles") self.peer_port = 3333 self.dht_node_port = 4444 @@ -82,7 +84,8 @@ class LBRYDaemon(xmlrpc.XMLRPC): self.wallet_dir = os.path.join(get_path(FOLDERID.RoamingAppData, UserHandle.current), "lbrycrd") elif sys.platform == "darwin": self.download_directory = os.path.join(os.path.expanduser("~"), 'Downloads') - self.wallet_dir = os.path.join(os.path.expanduser("~"), "Library/Application Support/lbrycrd") + # self.wallet_dir = os.path.join(os.path.expanduser("~"), "Library/Application Support/lbrycrd") + self.wallet_dir = user_data_dir("LBRY") else: self.wallet_dir = os.path.join(os.path.expanduser("~"), ".lbrycrd") self.download_directory = os.path.join(os.path.expanduser("~"), 'Downloads') @@ -129,15 +132,13 @@ class LBRYDaemon(xmlrpc.XMLRPC): def _disp_startup(): if self.restart_message: - print self.restart_message + log.info(self.restart_message) else: - print "Started LBRYnet daemon" - print "The daemon can be shut down by running 'stop-lbrynet-daemon' in a terminal" - log.info('[' + str(datetime.now()) + '] Started lbrynet-daemon') + log.info("[" + str(datetime.now()) + "] Started lbrynet-daemon") return defer.succeed(None) - log.info('[' + str(datetime.now()) + '] Starting lbrynet-daemon') + log.info("[" + str(datetime.now()) + "] Starting lbrynet-daemon") d = defer.Deferred() d.addCallback(lambda _: _set_vars(wallet_type, check_for_updates)) @@ -160,6 +161,9 @@ class LBRYDaemon(xmlrpc.XMLRPC): return defer.succeed(None) + def _initial_setup(self): + return NotImplemented + def _update(self): def _check_for_updater(): if os.path.isdir("/Applications/LBRY Updater.app"): @@ -323,7 +327,7 @@ class LBRYDaemon(xmlrpc.XMLRPC): return dl def _shutdown(self): - print 'Closing lbrynet session' + log.info("Closing lbrynet session") d = self._stop_server() if self.session is not None: d.addCallback(lambda _: self.session.shut_down()) @@ -339,7 +343,7 @@ class LBRYDaemon(xmlrpc.XMLRPC): return defer.succeed(None) def _setup_data_directory(self): - print "Loading databases..." + log.info("Loading databases...") if self.created_data_dir: db_revision = open(os.path.join(self.db_dir, "db_revision"), mode='w') db_revision.write(str(self.current_db_revision)) @@ -356,7 +360,7 @@ class LBRYDaemon(xmlrpc.XMLRPC): old_revision = int(open(db_revision_file).read().strip()) if old_revision < self.current_db_revision: from lbrynet.db_migrator import dbmigrator - print "Upgrading your databases..." + log.info("Upgrading your databases...") d = threads.deferToThread(dbmigrator.migrate_db, self.db_dir, old_revision, self.current_db_revision) def print_success(old_dirs): @@ -367,7 +371,7 @@ class LBRYDaemon(xmlrpc.XMLRPC): success_string += old_dir if i + 1 < len(old_dir): success_string += ", " - print success_string + log.info(success_string) d.addCallback(print_success) return d @@ -396,7 +400,10 @@ class LBRYDaemon(xmlrpc.XMLRPC): d = self.lbry_file_metadata_manager.setup() def set_lbry_file_manager(): - self.lbry_file_manager = LBRYFileManager(self.session, self.lbry_file_metadata_manager, self.sd_identifier) + self.lbry_file_manager = LBRYFileManager(self.session, + self.lbry_file_metadata_manager, + self.sd_identifier, + delete_data=True) return self.lbry_file_manager.setup() d.addCallback(lambda _: set_lbry_file_manager()) @@ -407,12 +414,11 @@ class LBRYDaemon(xmlrpc.XMLRPC): def get_default_data_rate(): d = self.settings.get_default_data_payment_rate() d.addCallback(lambda rate: {"default_data_payment_rate": rate if rate is not None else - MIN_BLOB_DATA_PAYMENT_RATE}) + MIN_BLOB_DATA_PAYMENT_RATE}) return d def get_wallet(): if self.wallet_type == "lbrycrd": - print "Using lbrycrd wallet" log.info("Using lbrycrd wallet") lbrycrdd_path = None if self.start_lbrycrdd is True: @@ -422,11 +428,9 @@ class LBRYDaemon(xmlrpc.XMLRPC): d = defer.succeed(LBRYcrdWallet(self.db_dir, wallet_dir=self.wallet_dir, wallet_conf=self.lbrycrd_conf, lbrycrdd_path=lbrycrdd_path)) elif self.wallet_type == "lbryum": - print "Using lbryum wallet" log.info("Using lbryum wallet") d = defer.succeed(LBRYumWallet(self.db_dir)) elif self.wallet_type == "ptc": - print "Using PTC wallet" log.info("Using PTC wallet") d = defer.succeed(PTCWallet(self.db_dir)) else: @@ -509,7 +513,6 @@ class LBRYDaemon(xmlrpc.XMLRPC): for line in conf: if len(line.strip()) and line.strip()[0] != "#": self.lbrycrdd_path = line.strip() - print self.lbrycrdd_path d.addCallback(load_lbrycrdd_path) return d @@ -535,13 +538,13 @@ class LBRYDaemon(xmlrpc.XMLRPC): def _download_name(self, name): def _disp_file(file): - print '[' + str(datetime.now()) + ']' + ' Already downloaded: ' + str(file.stream_hash) + log.info("[" + str(datetime.now()) + "] Already downloaded: " + str(file.stream_hash)) d = self._path_from_lbry_file(file) return d def _get_stream(name): def _disp(stream): - print '[' + str(datetime.now()) + ']' + ' Start stream: ' + stream['stream_hash'] + log.info("[" + str(datetime.now()) + "] Start stream: " + stream['stream_hash']) return stream d = self.session.wallet.get_stream_info_for_name(name) @@ -556,12 +559,11 @@ class LBRYDaemon(xmlrpc.XMLRPC): d = self._check_history(name) d.addCallback(lambda lbry_file: _get_stream(name) if not lbry_file else _disp_file(lbry_file)) d.addCallback(lambda _: self._check_history(name)) - d.addCallback(lambda lbry_file: (OK_CODE, {'stream_hash': lbry_file.stream_hash, - 'path': os.path.join(self.download_directory, - lbry_file.file_name)}) - if lbry_file else NOT_FOUND) - d.addErrback(lambda _: NOT_FOUND) - + d.addCallback(lambda lbry_file: ({'stream_hash': lbry_file.stream_hash, + 'path': os.path.join(self.download_directory, + lbry_file.file_name)}) + if lbry_file else defer.fail(NOT_FOUND)) + d.addErrback(lambda err: defer.fail(NOT_FOUND)) return d def _resolve_name(self, name): @@ -595,11 +597,9 @@ class LBRYDaemon(xmlrpc.XMLRPC): stream_hash = info['stream_hash'] path = os.path.join(self.blobfile_dir, stream_hash) if os.path.isfile(path): - print "[" + str(datetime.now()) + "] Search for lbry_file, returning: " + stream_hash log.info("[" + str(datetime.now()) + "] Search for lbry_file, returning: " + stream_hash) return defer.succeed(_get_lbry_file(path)) else: - print "[" + str(datetime.now()) + "] Search for lbry_file didn't return anything" log.info("[" + str(datetime.now()) + "] Search for lbry_file didn't return anything") return defer.succeed(False) @@ -615,7 +615,6 @@ class LBRYDaemon(xmlrpc.XMLRPC): def finish_deletion(lbry_file): d = lbry_file.delete_data() d.addCallback(lambda _: _delete_stream_data(lbry_file)) - d.addCallback(lambda _: _delete_file(lbry_file)) return d def _delete_stream_data(lbry_file): @@ -623,11 +622,10 @@ class LBRYDaemon(xmlrpc.XMLRPC): d = self.lbry_file_manager.get_count_for_stream_hash(s_h) # TODO: could possibly be a timing issue here d.addCallback(lambda c: self.stream_info_manager.delete_stream(s_h) if c == 0 else True) + d.addCallback(lambda _: os.remove(os.path.join(self.download_directory, lbry_file.file_name)) if + os.path.isfile(os.path.join(self.download_directory, lbry_file.file_name)) else defer.succeed(None)) return d - def _delete_file(lbry_file): - os.remove(os.path.join(self.download_directory, lbry_file.file_name)) - d.addCallback(lambda _: finish_deletion(lbry_file)) return d @@ -649,11 +647,9 @@ class LBRYDaemon(xmlrpc.XMLRPC): def _get_est_cost(self, name): def _check_est(d, name): if type(d.result) is float: - print '[' + str(datetime.now()) + '] Cost est for lbry://' + name + ': ' + str(d.result) + 'LBC' - log.info('[' + str(datetime.now()) + '] Cost est for lbry://' + name + ': ' + str(d.result) + 'LBC') + log.info("[" + str(datetime.now()) + "] Cost est for lbry://" + name + ": " + str(d.result) + "LBC") else: - print '[' + str(datetime.now()) + '] Timeout estimating cost for lbry://' + name + ', using key fee' - log.info('[' + str(datetime.now()) + '] Timeout estimating cost for lbry://' + name + ', using key fee') + log.info("[" + str(datetime.now()) + "] Timeout estimating cost for lbry://" + name + ", using key fee") d.cancel() return defer.succeed(None) @@ -674,17 +670,23 @@ class LBRYDaemon(xmlrpc.XMLRPC): return d - def xmlrpc_is_running(self): - if self.startup_message != "" and self.announced_startup == False: - print "Startup message:", self.startup_message - self.announced_startup = True - return self.startup_message - elif self.announced_startup: - return True - else: - return False + def _render_response(self, result, code): + return json.dumps({'result': result, 'code': code}) - def xmlrpc_get_settings(self): + def jsonrpc_is_running(self): + """ + Returns a startup message when the daemon starts, after which it will return True + """ + + if self.startup_message != "" and self.announced_startup == False: + self.announced_startup = True + return self._render_response(self.startup_message, OK_CODE) + elif self.announced_startup: + return self._render_response(True, OK_CODE) + else: + return self._render_response(False, OK_CODE) + + def jsonrpc_get_settings(self): """ Get LBRY payment settings @@ -694,74 +696,82 @@ class LBRYDaemon(xmlrpc.XMLRPC): if not self.session_settings: self.session_settings = {'data_rate': self.data_rate, 'max_key_fee': self.max_key_fee} - print '[' + str(datetime.now()) + '] Get daemon settings' - return self.session_settings + log.info("[" + str(datetime.now()) + "] Get daemon settings") + return self._render_response(self.session_settings, OK_CODE) - def xmlrpc_set_settings(self, settings): + def jsonrpc_set_settings(self, p): """ Set LBRY payment settings - @param settings dict: {'data_rate': float, 'max_key_fee': float} + @param settings: {'settings': {'data_rate': float, 'max_key_fee': float}} """ + params = Bunch(p) - self.session_settings = settings + self.session_settings = params.settings self._update_settings() - print '[' + str(datetime.now()) + '] Set daemon settings' - return 'Set' + log.info("[" + str(datetime.now()) + "] Set daemon settings") + return self._render_response(True, OK_CODE) - def xmlrpc_start_fetcher(self): + def jsonrpc_start_fetcher(self): """ - Start autofetcher + Start automatically downloading new name claims as they happen + + @return: confirmation message """ self.fetcher.start() - print '[' + str(datetime.now()) + '] Start autofetcher' log.info('[' + str(datetime.now()) + '] Start autofetcher') - return 'Started autofetching' + return self._render_response("Started autofetching claims", OK_CODE) - def xmlrpc_stop_fetcher(self): + def jsonrpc_stop_fetcher(self): """ - Stop autofetcher + Stop automatically downloading new name claims as they happen + + @return: confirmation message """ self.fetcher.stop() - print '[' + str(datetime.now()) + '] Stop autofetcher' log.info('[' + str(datetime.now()) + '] Stop autofetcher') - return 'Stopped autofetching' + return self._render_response("Stopped autofetching claims", OK_CODE) - def xmlrpc_fetcher_status(self): + def jsonrpc_fetcher_status(self): """ - Start autofetcher + Get fetcher status + + @return: True/False """ - print '[' + str(datetime.now()) + '] Get fetcher status' - return str(self.fetcher.check_if_running()) + log.info("[" + str(datetime.now()) + "] Get fetcher status") + return self._render_response(self.fetcher.check_if_running(), OK_CODE) - def xmlrpc_get_balance(self): + def jsonrpc_get_balance(self): """ Get LBC balance + + @return: balance """ - print '[' + str(datetime.now()) + '] Get balance' - return str(self.session.wallet.wallet_balance) + log.info("[" + str(datetime.now()) + "] Get balance") + return self._render_response(self.session.wallet.wallet_balance, OK_CODE) - def xmlrpc_stop(self): + def jsonrpc_stop(self): """ Stop lbrynet-daemon + + @return: shutdown message """ def _disp_shutdown(): - log.info('Shutting down lbrynet daemon') - print 'Shutting down lbrynet daemon' + log.info("Shutting down lbrynet daemon") d = self._shutdown() d.addCallback(lambda _: _disp_shutdown()) d.addCallback(lambda _: reactor.callLater(1.0, reactor.stop)) - return defer.succeed('Shutting down') + return self._render_response("Shutting down", OK_CODE) - def xmlrpc_get_lbry_files(self): + def jsonrpc_get_lbry_files(self): """ Get LBRY files @@ -783,123 +793,83 @@ class LBRYDaemon(xmlrpc.XMLRPC): r.append(json.dumps(t)) - print '[' + str(datetime.now()) + '] Get LBRY files' - return r + log.info("[" + str(datetime.now()) + "] Get LBRY files") + return self._render_response(r, OK_CODE) - def xmlrpc_resolve_name(self, name): + def jsonrpc_resolve_name(self, p): """ Resolve stream info from a LBRY uri - @param: name + @param: {'name': name to look up} @return: info for name claim """ + params = Bunch(p) def _disp(info): - print '[' + str(datetime.now()) + ']' + ' Resolved info: ' + str(info['stream_hash']) - return info + log.info("[" + str(datetime.now()) + "] Resolved info: " + info['stream_hash']) + return self._render_response(info, OK_CODE) - d = self._resolve_name(name) - d.addCallbacks(_disp, lambda _: str('UnknownNameError')) + d = self._resolve_name(params.name) + d.addCallbacks(_disp, lambda _: self._render_response('error', NOT_FOUND)) d.callback(None) return d - def xmlrpc_get(self, name): + def jsonrpc_get(self, p): """ Download stream from a LBRY uri @param: name @return: {'stream_hash': hex string, 'path': path of download} """ + params = Bunch(p) - if name: - d = self._download_name(name) + if params.name: + d = self._download_name(params.name) + d.addCallbacks(lambda message: self._render_response(message, OK_CODE), + lambda err: self._render_response('error', NOT_FOUND)) else: - d = defer.succeed(BAD_REQUEST) + d = self._render_response('error', BAD_REQUEST) return d - def xmlrpc_stop_lbry_file(self, stream_hash): + def jsonrpc_stop_lbry_file(self, p): + params = Bunch(p) + try: - lbry_file = [f for f in self.lbry_file_manager.lbry_files if f.stream_hash == stream_hash][0] + lbry_file = [f for f in self.lbry_file_manager.lbry_files if f.stream_hash == params.stream_hash][0] except IndexError: return defer.fail(UnknownNameError) if not lbry_file.stopped: d = self.lbry_file_manager.toggle_lbry_file_running(lbry_file) - d.addCallback(lambda _: 'Stream has been stopped') - d.addErrback(lambda err: str(err)) + d.addCallback(lambda _: self._render_response("Stream has been stopped", OK_CODE)) + d.addErrback(lambda err: self._render_response(err.getTraceback(), )) return d else: - return defer.succeed('Stream was already stopped') + return json.dumps({'result': 'Stream was already stopped'}) + + def jsonrpc_start_lbry_file(self, p): + params = Bunch(p) - def xmlrpc_start_lbry_file(self, stream_hash): try: - lbry_file = [f for f in self.lbry_file_manager.lbry_files if f.stream_hash == stream_hash][0] + lbry_file = [f for f in self.lbry_file_manager.lbry_files if f.stream_hash == params.stream_hash][0] except IndexError: return defer.fail(UnknownNameError) if lbry_file.stopped: d = self.lbry_file_manager.toggle_lbry_file_running(lbry_file) d.callback(None) - return defer.succeed('Stream started') + return json.dumps({'result': 'Stream started'}) else: - return defer.succeed('Stream was already running') + return json.dumps({'result': 'Stream was already running'}) - def xmlrpc_render_html(self, html): - """ - Writes html to lbry.html in the downloads directory, then opens it with the browser - - @param html: - """ - - def _make_file(html, path): - f = open(path, 'w') - f.write(html) - f.close() - return defer.succeed(None) - - def _disp_err(err): - print str(err.getTraceback()) - return err - - path = os.path.join(self.download_directory, 'lbry.html') - - d = defer.Deferred() - d.addCallback(lambda _: _make_file(html, path)) - d.addCallback(lambda _: os.chown(path, pwd.getpwuid(os.getuid()).pw_uid, pwd.getpwuid(os.getuid()).pw_gid)) - d.addCallback(lambda _: webbrowser.open('file://' + path)) - d.addErrback(_disp_err) - d.callback(None) - - return d - - def xmlrpc_render_gui(self): - """ - Opens the lbry web ui in a browser - """ - - def _disp_err(err): - print str(err.getTraceback()) - return err - - d = defer.Deferred() - if sys.platform == 'darwin': - d.addCallback(lambda _: webbrowser.get('safari').open( - "file://" + str(os.path.join(self.download_directory, "lbryio/view/page/gui.html")))) - else: - d.addCallback(lambda _: webbrowser.open( - "file://" + str(os.path.join(self.download_directory, "lbryio/view/page/gui.html")))) - d.addErrback(_disp_err) - d.callback(None) - - return d - - def xmlrpc_search_nametrie(self, search): + def jsonrpc_search_nametrie(self, p): """ Search the nametrie for claims beginning with search - @param search: - @return: + @param {'search': search string} + @return: List of search results """ + params = Bunch(p) def _clean(n): t = [] @@ -910,26 +880,6 @@ class LBRYDaemon(xmlrpc.XMLRPC): t.append([i[1][0][1], i[1][1][1], i[1][2][1]]) return t - def _parse(results): - f = [] - for chain, meta, cost_est in results: - t = {} - if 'name' in chain.keys(): - t['name'] = chain['name'] - if 'thumbnail' in meta.keys(): - t['img'] = meta['thumbnail'] - else: - t['img'] = 'File://' + str( - os.path.join(self.download_directory, "lbryio/web/img/Free-speech-flag.svg")) - if 'name' in meta.keys(): - t['title'] = meta['name'] - if 'description' in meta.keys(): - t['description'] = meta['description'] - t['cost_est'] = cost_est - f.append(t) - - return f - def resolve_claims(claims): ds = [] for claim in claims: @@ -941,148 +891,140 @@ class LBRYDaemon(xmlrpc.XMLRPC): return defer.DeferredList(ds) def _disp(results): - print '[' + str(datetime.now()) + '] Found ' + str(len(results)) + ' results' log.info('[' + str(datetime.now()) + '] Search results: ') for r in results: log.info(str(r)) - return results + return self._render_response(results, OK_CODE) - print '[' + str(datetime.now()) + '] Search nametrie: ' + search - log.info('[' + str(datetime.now()) + '] Search nametrie: ' + search) + log.info('[' + str(datetime.now()) + '] Search nametrie: ' + params.search) d = self.session.wallet.get_nametrie() - d.addCallback(lambda trie: [claim for claim in trie if claim['name'].startswith(search) and 'txid' in claim]) + d.addCallback(lambda trie: [claim for claim in trie if claim['name'].startswith(params.search) and 'txid' in claim]) d.addCallback(lambda claims: claims[:self.max_search_results]) d.addCallback(resolve_claims) d.addCallback(_clean) - d.addCallback(_parse) d.addCallback(_disp) return d - def xmlrpc_delete_lbry_file(self, file_name): + def jsonrpc_delete_lbry_file(self, p): + """ + Delete a lbry file + + @param {'file_name': string} + @return: confirmation message + """ + + params = Bunch(p) + def _disp(file_name): - print '[' + str(datetime.now()) + '] Deleted: ' + file_name - return defer.succeed('Deleted: ' + file_name) + log.info("[" + str(datetime.now()) + "] Deleted: " + file_name) + return self._render_response("Deleted: " + file_name, OK_CODE) - lbry_files = [self._delete_lbry_file(f) for f in self.lbry_file_manager.lbry_files if file_name == f.file_name] + lbry_files = [self._delete_lbry_file(f) for f in self.lbry_file_manager.lbry_files if params.file_name == f.file_name] d = defer.DeferredList(lbry_files) - d.addCallback(lambda _: _disp(file_name)) + d.addCallback(lambda _: _disp(params.file_name)) return d - def xmlrpc_check(self, name): - d = self._check_history(name) - d.addCallback(lambda lbry_file: self._path_from_lbry_file(lbry_file) if lbry_file else 'Not found') - d.addErrback(lambda err: str(err)) + def jsonrpc_publish(self, p): + """ + Make a new name claim - return d + @param: + @return: + """ + params = Bunch(p) - def xmlrpc_publish(self, metadata): - try: - metadata = json.loads(metadata) - except: - return defer.succeed(BAD_REQUEST) + metadata_fields = {"name": str, "file_path": str, "bid": float, "author": str, "title": str, + "description": str, "thumbnail": str, "key_fee": float, "key_fee_address": str, + "content_license": str} + log.info(params) + log.info(params.__dict__) - required = ['name', 'file_path', 'bid'] + for k in metadata_fields.keys(): + if k in params.__dict__.keys(): + assert isinstance(params.__dict__[k], metadata_fields[k]) + metadata_fields[k] = params.__dict__[k] + else: + metadata_fields[k] = None - for r in required: - if not r in metadata.keys(): - return defer.succeed(BAD_REQUEST) - - # if not os.path.isfile(metadata['file_path']): - # return defer.fail() - - if not isinstance(metadata['bid'], float) and metadata['bid'] > 0.0: - return defer.fail() - - name = metadata['name'] - file_path = metadata['file_path'] - bid = metadata['bid'] - - if 'title' in metadata.keys(): - title = metadata['title'] - else: - title = None - - if 'description' in metadata.keys(): - description = metadata['description'] - else: - description = None - - if 'thumbnail' in metadata.keys(): - thumbnail = metadata['thumbnail'] - else: - thumbnail = None - - if 'key_fee' in metadata.keys(): - if not float(metadata['key_fee']) == 0.0: - if not 'key_fee_address' in metadata.keys(): - return defer.fail() - key_fee = metadata['key_fee'] - else: - key_fee = 0.0 - - if 'key_fee_address' in metadata.keys(): - key_fee_address = metadata['key_fee_address'] - else: - key_fee_address = None - - if 'content_license' in metadata.keys(): - content_license = metadata['content_license'] - else: - content_license = None - - log.info('[' + str(datetime.now()) + '] Publish: ', name, file_path, bid, title, description, thumbnail, - key_fee, key_fee_address, content_license) + log.info("[" + str(datetime.now()) + "] Publish: ", metadata_fields) p = Publisher(self.session, self.lbry_file_manager, self.session.wallet) - d = p.start(name, file_path, bid, title, description, thumbnail, key_fee, key_fee_address, content_license) - d.addCallback(lambda msg: (OK_CODE, msg)) + d = p.start(metadata_fields['name'], metadata_fields['file_path'], metadata_fields['bid'], + metadata_fields['title'], metadata_fields['description'], metadata_fields['thumbnail'], + metadata_fields['key_fee'], metadata_fields['key_fee_address'], metadata_fields['content_license']) + d.addCallbacks(lambda msg: self._render_response(msg, OK_CODE), + lambda err: self._render_response(err.getTraceback(), BAD_REQUEST)) return d - def xmlrpc_abandon_name(self, txid): + def jsonrpc_abandon_name(self, p): + """ + Abandon and reclaim credits from a name claim + + @param: {'txid': string} + @return: txid + """ + params = Bunch(p) + def _disp(txid, tx): - print '[' + str(datetime.now()) + '] Spent coins from claim tx ' + txid + ' --> ' + tx - return tx + log.info("[" + str(datetime.now()) + "] Abandoned name claim tx " + txid) + return self._render_response(txid, OK_CODE) d = defer.Deferred() - d.addCallback(lambda _: self.session.wallet.abandon_name(txid)) - d.addCallback(lambda tx: _disp(txid, tx)) - d.addErrback(lambda err: str(err.getTraceback())) + d.addCallback(lambda _: self.session.wallet.abandon_name(params.txid)) + d.addCallback(lambda tx: _disp(params.txid, tx)) + d.addErrback(lambda err: self._render_response(err.getTraceback(), BAD_REQUEST)) d.callback(None) return d - def xmlrpc_get_name_claims(self): + def jsonrpc_get_name_claims(self): + """ + Get name claims + + @return: list of name claims + """ def _clean(claims): for c in claims: for k in c.keys(): if isinstance(c[k], Decimal): c[k] = float(c[k]) - return claims + return self._render_response(claims, OK_CODE) d = self.session.wallet.get_name_claims() d.addCallback(_clean) return d - def xmlrpc_get_time_behind_blockchain(self): + def jsonrpc_get_time_behind_blockchain(self): + """ + Get time behind blockchain + + @return: time behind blockchain + """ d = self.session.wallet.get_most_recent_blocktime() - d.addCallback(get_time_behind_blockchain) + d.addCallbacks(lambda result: self._render_response(result, OK_CODE), + lambda result: self._render_response(result, BAD_REQUEST)) return d - def xmlrpc_get_new_address(self): + def jsonrpc_get_new_address(self): + """ + Generate a new wallet address + + @return: new wallet address + """ def _disp(address): - print "[" + str(datetime.now()) + "] Got new wallet address: " + address - return address + log.info("[" + str(datetime.now()) + "] Got new wallet address: " + address) + return json.dumps(self._render_response(address, OK_CODE)) d = self.session.wallet.get_new_address() d.addCallback(_disp) return d - # def xmlrpc_update_name(self, metadata): + # def jsonrpc_update_name(self, metadata): # def _disp(x): # print x # return x @@ -1102,15 +1044,15 @@ class LBRYDaemon(xmlrpc.XMLRPC): # # return d - def xmlrpc_toggle_fetcher_verbose(self): + def jsonrpc_toggle_fetcher_verbose(self): if self.fetcher.verbose: self.fetcher.verbose = False else: self.fetcher.verbose = True - return self.fetcher.verbose + return self._render_response(self.fetcher.verbose, OK_CODE) - def xmlrpc_check_for_new_version(self): + def jsonrpc_check_for_new_version(self): def _check_for_updates(package): git_version = subprocess.check_output("git ls-remote " + package['git'] + " | grep HEAD | cut -f 1", shell=True) up_to_date = False @@ -1147,64 +1089,90 @@ class LBRYDaemon(xmlrpc.XMLRPC): }, } - return [_check_for_updates(package_infos[p]) for p in package_infos.keys()] + r = [_check_for_updates(package_infos[p]) for p in package_infos.keys()] + log.info("[" + str(datetime.now()) + "] Check for new version: " + json.dumps(r)) + return self._render_response(r, OK_CODE) - def xmlrpc_start_status_bar_app(self): - if sys.platform == 'darwin': - if os.path.isdir("/Applications/LBRY.app"): - # subprocess.Popen("screen -dmS lbry-status bash -c 'lbrynet-daemon-status --startdaemon=False'", shell=True) - subprocess.Popen("screen -dmS lbry-status bash -c 'open /Applications/LBRY.app'") - return "Started" - else: - return "Couldn't find LBRY.app, try running the installer" - else: - return "Status bar not implemented on non OS X" - - def xmlrpc___dir__(self): + def jsonrpc___dir__(self): return ['is_running', 'get_settings', 'set_settings', 'start_fetcher', 'stop_fetcher', 'fetcher_status', 'get_balance', 'stop', 'get_lbry_files', 'resolve_name', 'get', 'search_nametrie', 'delete_lbry_file', 'check', 'publish', 'abandon_name', 'get_name_claims', 'get_time_behind_blockchain', 'get_new_address', 'toggle_fetcher_verbose', 'check_for_new_version'] -def stop(): - daemon = xmlrpclib.ServerProxy("http://localhost:7080/") - try: - status = daemon.is_running() - except: - status = False +class LBRYDaemonCommandHandler(object): + def __init__(self, command): + self._api = jsonrpc.Proxy(API_CONNECTION_STRING) + self.command = command - if status: - daemon.stop() - print "LBRYnet daemon stopped" - else: - print "LBRYnet daemon wasn't running" + def run(self, params=None): + if params: + d = self._api.callRemote(self.command, params) + else: + d = self._api.callRemote(self.command) + return d -def main(): - parser = argparse.ArgumentParser(description="Launch lbrynet-daemon") - parser.add_argument("--wallet", - help="lbrycrd or lbryum, default lbryum", - type=str, - default="lbryum") - parser.add_argument("--update", - help="True or false, default true", - type=str, - default="True") +class LBRYindex(resource.Resource): + isLeaf = False - args = parser.parse_args() - - try: - daemon = xmlrpclib.ServerProxy("http://localhost:7080") - daemon.stop() - except: - pass - - daemon = LBRYDaemon() - daemon.setup(args.wallet, args.update) - reactor.listenTCP(7080, server.Site(daemon), interface='localhost') - reactor.run() + def _delayed_render(self, request, results): + request.write(str(results)) + request.finish() -if __name__ == '__main__': - main() \ No newline at end of file + def render_GET(self, request): + def _disp(r): + log.info(r) + return "" + ''.join(r) + "" + + + d = LBRYDaemonCommandHandler('__dir__').run() + d.addCallback(lambda functions: ["" % (function, function) for function in functions]) + d.addCallback(_disp) + d.addCallbacks(lambda results: self._delayed_render(request, results), + lambda err: self._delayed_render(request, err.getTraceback())) + + return server.NOT_DONE_YET + + +class LBRYFilePage(resource.Resource): + isLeaf = False + + def _delayed_render(self, request, results): + request.write(str(results)) + request.finish() + + h = "" + + d = LBRYDaemonCommandHandler('get_lbry_files').run() + d.addCallback(lambda r: json.loads(r)['result']) + d.addCallback(lambda lbry_files: [h % (json.loads(lbry_file)['file_name'], json.loads(lbry_file)['file_name']) for lbry_file in lbry_files]) + d.addCallback(lambda r: "
%s
%s
" + ''.join(r) + "") + d.addCallbacks(lambda results: self._delayed_render(request, results), + lambda err: self._delayed_render(request, err.getTraceback())) + + return server.NOT_DONE_YET + + +class LBRYDaemonWeb(resource.Resource): + isLeaf = False + + def _delayed_render(self, request, results): + request.write(str(results)) + request.setResponseCode(json.loads(results)['code']) + request.finish() + + def render_GET(self, request): + func = request.args['function'][0] + del request.args['function'] + + p = {} + for k in request.args.keys(): + p[k] = request.args[k][0] + + d = LBRYDaemonCommandHandler(func).run(p) + d.addCallbacks(lambda results: self._delayed_render(request, results), + lambda err: self._delayed_render(request, json.dumps({'message': err.getTraceback(), 'code': BAD_REQUEST}))) + + return server.NOT_DONE_YET \ No newline at end of file diff --git a/lbrynet/lbrynet_daemon/LBRYDaemonControl.py b/lbrynet/lbrynet_daemon/LBRYDaemonControl.py new file mode 100644 index 000000000..4041993eb --- /dev/null +++ b/lbrynet/lbrynet_daemon/LBRYDaemonControl.py @@ -0,0 +1,51 @@ +import argparse +import logging + +from twisted.web import server +from twisted.internet import reactor, defer +from jsonrpc.proxy import JSONRPCProxy + +from lbrynet.lbrynet_daemon.LBRYDaemon import LBRYDaemon, LBRYindex, LBRYDaemonWeb, LBRYFilePage +from lbrynet.conf import API_CONNECTION_STRING, API_INTERFACE, API_ADDRESS, API_PORT, DEFAULT_WALLET + +log = logging.getLogger(__name__) +logging.basicConfig(level=logging.INFO) + + +def stop(): + def _disp_shutdown(): + log.info("Shutting down lbrynet-daemon from command line") + + def _disp_not_running(): + log.info("Attempt to shut down lbrynet-daemon from command line when daemon isn't running") + + d = defer.Deferred(None) + d.addCallback(lambda _: JSONRPCProxy.from_url(API_CONNECTION_STRING).stop()) + d.addCallbacks(lambda _: _disp_shutdown(), lambda _: _disp_not_running()) + d.callback(None) + + +def start(): + parser = argparse.ArgumentParser(description="Launch lbrynet-daemon") + parser.add_argument("--wallet", + help="lbrycrd or lbryum, default lbryum", + type=str, + default=DEFAULT_WALLET) + parser.add_argument("--update", + help="True or false, default true", + type=str, + default="True") + + log.info("Starting lbrynet-daemon from command line") + + args = parser.parse_args() + daemon = LBRYDaemon() + daemon.setup(args.wallet, args.update) + + root = LBRYindex() + root.putChild("", root) + root.putChild("webapi", LBRYDaemonWeb()) + root.putChild(API_ADDRESS, daemon) + root.putChild("myfiles", LBRYFilePage()) + reactor.listenTCP(API_PORT, server.Site(root), interface=API_INTERFACE) + reactor.run() diff --git a/lbrynet/lbrynet_daemon/LBRYDownloader.py b/lbrynet/lbrynet_daemon/LBRYDownloader.py index c5bfea81f..a4cb2a980 100644 --- a/lbrynet/lbrynet_daemon/LBRYDownloader.py +++ b/lbrynet/lbrynet_daemon/LBRYDownloader.py @@ -49,13 +49,13 @@ class GetStream(object): self.stream_hash = self.stream_info['stream_hash'] else: - print 'InvalidStreamInfoError' + log.error("InvalidStreamInfoError in autofetcher: ", stream_info) raise InvalidStreamInfoError(self.stream_info) if self.key_fee > self.max_key_fee: if self.pay_key: - print "Key fee (" + str(self.key_fee) + ") above limit of " + str( - self.max_key_fee) + ", didn't download lbry://" + str(self.resolved_name) + log.info("Key fee (" + str(self.key_fee) + ") above limit of " + str( + self.max_key_fee) + ", didn't download lbry://" + str(self.resolved_name)) return defer.fail(None) else: pass @@ -78,7 +78,7 @@ class GetStream(object): reserved_points = self.wallet.reserve_points(self.key_fee_address, self.key_fee) if reserved_points is None: return defer.fail(InsufficientFundsError()) - print 'Key fee: ' + str(self.key_fee) + ' | ' + str(self.key_fee_address) + log.info("Key fee: " + str(self.key_fee) + " | " + str(self.key_fee_address)) return self.wallet.send_points_to_address(reserved_points, self.key_fee) return defer.succeed(None) @@ -89,7 +89,7 @@ class GetStream(object): downloader.start() - print "Downloading", self.stream_hash, "-->", os.path.join(downloader.download_directory, downloader.file_name) + log.info("Downloading", self.stream_hash, "-->", os.path.join(downloader.download_directory, downloader.file_name)) return d @@ -117,15 +117,16 @@ class FetcherDaemon(object): self.is_running = True self.search = LoopingCall(self._looped_search) self.search.start(1) + log.info("Starting autofetcher") else: - print "Autofetcher is already running" + log.info("Autofetcher is already running") def stop(self): if self.is_running: self.search.stop() self.is_running = False else: - print "Autofetcher isn't running, there's nothing to stop" + log.info("Autofetcher isn't running, there's nothing to stop") def check_if_running(self): if self.is_running: @@ -157,19 +158,15 @@ class FetcherDaemon(object): return d def get_new_streams_in_tx(claims, t, blockhash): - #claims = self.wallet.get_claims_for_tx(t['txid']) - # if self.first_run: - # # claims = self.rpc_conn.getclaimsfortx("96aca2c60efded5806b7336430c5987b9092ffbea9c6ed444e3bf8e008993e11") - # # claims = self.rpc_conn.getclaimsfortx("cc9c7f5225ecb38877e6ca7574d110b23214ac3556b9d65784065ad3a85b4f74") - # self.first_run = False rtn = [] if claims: for claim in claims: if claim not in self.seen: msg = "[" + str(datetime.now()) + "] New claim | lbry://" + str(claim['name']) + \ " | stream hash: " + str(json.loads(claim['value'])['stream_hash']) - print msg - log.debug(msg) + log.info(msg) + if self.verbose: + print msg rtn.append((claim['name'], t)) self.seen.append(claim) else: @@ -179,8 +176,6 @@ class FetcherDaemon(object): d.addCallback(lambda streams: defer.DeferredList( [self.wallet.get_stream_info_from_txid(name, t) for name, t in streams])) - # if len(rtn): - # return defer.DeferredList([self.wallet.get_stream_info_for_name(name, txid=t) for name, t in rtn]) return d def _download_claims(self, claims): @@ -204,12 +199,12 @@ class FetcherDaemon(object): for l in conf: if l.startswith("maxkey="): settings["maxkey"] = float(l[7:].rstrip('\n')) - print "Autofetcher using max key price of", settings["maxkey"], ", to start call start_fetcher()" + conf.close() else: - print "Autofetcher using default max key price of 0.0" - print "To change this create the file:" - print str(self.autofetcher_conf) - print "Example contents of conf file:" - print "maxkey=1.0" + conf = open(self.autofetcher_conf, "w") + conf.write("maxkey=10.0") + conf.close() + settings["maxkey"] = 10.0 + log.info("No autofetcher conf file found, making one with max key fee of 10.0") self.max_key_fee = settings["maxkey"] diff --git a/lbrynet/lbrynet_daemon/LBRYPublisher.py b/lbrynet/lbrynet_daemon/LBRYPublisher.py index 54ade2274..391985522 100644 --- a/lbrynet/lbrynet_daemon/LBRYPublisher.py +++ b/lbrynet/lbrynet_daemon/LBRYPublisher.py @@ -40,7 +40,7 @@ class Publisher(object): def _show_result(): message = "[" + str(datetime.now()) + "] Published " + self.file_name + " --> lbry://" + \ str(self.publish_name) + " with txid: " + str(self.tx_hash) - print message + log.info(message) return defer.succeed(message) self.publish_name = name @@ -122,6 +122,6 @@ class Publisher(object): else: d = defer.succeed(True) error_message = err.getErrorMessage() - print message % (str(self.file_name), str(self.publish_name), error_message) + log.error(error_message) log.error(message, str(self.file_name), str(self.publish_name), err.getTraceback()) return d diff --git a/setup.py b/setup.py index 68d476243..577a83c81 100644 --- a/setup.py +++ b/setup.py @@ -1,9 +1,11 @@ #!/usr/bin/env python import ez_setup -ez_setup.use_setuptools() -from setuptools import setup, find_packages import sys +import os +from setuptools import setup, find_packages + +ez_setup.use_setuptools() console_scripts = ['lbrynet-console = lbrynet.lbrynet_console.LBRYConsole:launch_lbry_console', 'lbrynet-stdin-uploader = lbrynet.lbrynet_console.LBRYStdinUploader:launch_stdin_uploader', @@ -15,8 +17,8 @@ console_scripts = ['lbrynet-console = lbrynet.lbrynet_console.LBRYConsole:launch 'lbrynet-gui = lbrynet.lbrynet_gui.gui:start_gui', 'lbrynet-lookup-hosts-for-hash = lbrynet.dht_scripts:get_hosts_for_hash_in_dht', 'lbrynet-announce_hash_to_dht = lbrynet.dht_scripts:announce_hash_to_dht', - 'lbrynet-daemon = lbrynet.lbrynet_daemon.LBRYDaemon:main', - 'stop-lbrynet-daemon = lbrynet.lbrynet_daemon.LBRYDaemon:stop'] + 'lbrynet-daemon = lbrynet.lbrynet_daemon.LBRYDaemonControl:start', + 'stop-lbrynet-daemon = lbrynet.lbrynet_daemon.LBRYDaemonControl:stop'] if sys.platform == 'darwin': console_scripts.append('lbrynet-daemon-status = lbrynet.lbrynet_daemon.LBRYOSXStatusBar:main') @@ -25,7 +27,9 @@ if sys.platform == 'darwin': setup(name='lbrynet', version='0.0.4', packages=find_packages(), - install_requires=['six>=1.9.0', 'pycrypto', 'twisted', 'miniupnpc', 'yapsy', 'seccure', 'python-bitcoinrpc==0.1', 'txJSON-RPC', 'requests>=2.4.2', 'unqlite==0.2.0', 'leveldb', 'lbryum'], + install_requires=['six>=1.9.0', 'pycrypto', 'twisted', 'miniupnpc', 'yapsy', 'seccure', + 'python-bitcoinrpc==0.1', 'txJSON-RPC', 'requests>=2.4.2', 'unqlite==0.2.0', + 'leveldb', 'lbryum'], entry_points={'console_scripts': console_scripts}, data_files=[ ('lbrynet/lbrynet_console/plugins', @@ -47,4 +51,4 @@ setup(name='lbrynet', ) ], dependency_links=['https://github.com/lbryio/lbryum/tarball/master/#egg=lbryum'], - ) \ No newline at end of file + ) From 36e299b4cfd366aa7586dc0bc78ff76194b95e6c Mon Sep 17 00:00:00 2001 From: Jack Date: Thu, 17 Mar 2016 00:44:04 -0400 Subject: [PATCH 02/13] fix files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -don’t automatically remove files that can’t be found from LBRYFileManager -add timeout to GetStream --- lbrynet/core/LBRYcrdWallet.py | 10 ++- lbrynet/lbryfilemanager/LBRYFileManager.py | 50 +++++++------- lbrynet/lbrynet_daemon/LBRYDaemon.py | 80 +++++++++++++++------- lbrynet/lbrynet_daemon/LBRYDownloader.py | 47 +++++++++---- lbrynet/lbrynet_daemon/LBRYPublisher.py | 11 ++- 5 files changed, 127 insertions(+), 71 deletions(-) diff --git a/lbrynet/core/LBRYcrdWallet.py b/lbrynet/core/LBRYcrdWallet.py index 0d8e48a47..20cd5ffa2 100644 --- a/lbrynet/core/LBRYcrdWallet.py +++ b/lbrynet/core/LBRYcrdWallet.py @@ -297,8 +297,8 @@ class LBRYWallet(object): except (ValueError, TypeError): return Failure(InvalidStreamInfoError(name)) known_fields = ['stream_hash', 'name', 'description', 'key_fee', 'key_fee_address', 'thumbnail', - 'content_license', 'sources', 'fee'] - known_sources = ['lbry_sd_hash'] + 'content_license', 'sources', 'fee', 'author'] + known_sources = ['lbry_sd_hash', 'btih', 'url'] known_fee_types = {'LBC': ['amount', 'address']} for field in known_fields: if field in value_dict: @@ -334,7 +334,7 @@ class LBRYWallet(object): return Failure(UnknownNameError(name)) def claim_name(self, name, sd_hash, amount, description=None, key_fee=None, - key_fee_address=None, thumbnail=None, content_license=None): + key_fee_address=None, thumbnail=None, content_license=None, author=None, sources=None): value = {"sources": {'lbry_sd_hash': sd_hash}} if description is not None: value['description'] = description @@ -344,6 +344,10 @@ class LBRYWallet(object): value['thumbnail'] = thumbnail if content_license is not None: value['content_license'] = content_license + if author is not None: + value['author'] = author + if sources is not None: + value['sources'] = sources d = self._send_name_claim(name, json.dumps(value), amount) diff --git a/lbrynet/lbryfilemanager/LBRYFileManager.py b/lbrynet/lbryfilemanager/LBRYFileManager.py index f741558dc..59f972df3 100644 --- a/lbrynet/lbryfilemanager/LBRYFileManager.py +++ b/lbrynet/lbryfilemanager/LBRYFileManager.py @@ -34,8 +34,8 @@ class LBRYFileManager(object): self.sd_identifier = sd_identifier self.lbry_files = [] self.sql_db = None - self.delete_data = delete_data - self.check_exists_loop = LoopingCall(self.check_files_exist) + # self.delete_data = delete_data + # self.check_exists_loop = LoopingCall(self.check_files_exist) if sys.platform.startswith("darwin"): self.download_directory = os.path.join(os.path.expanduser("~"), 'Downloads') else: @@ -43,34 +43,34 @@ class LBRYFileManager(object): log.debug("Download directory for LBRYFileManager: %s", str(self.download_directory)) def setup(self): - self.check_exists_loop.start(10) + # self.check_exists_loop.start(10) d = self._open_db() d.addCallback(lambda _: self._add_to_sd_identifier()) d.addCallback(lambda _: self._start_lbry_files()) return d - def check_files_exist(self): - def _disp(deleted_files): - if deleted_files[0][0]: - for file in bad_files: - log.info("[" + str(datetime.now()) + "] Detected " + file.file_name + " was deleted, removing from file manager") - - def _delete_stream_data(lbry_file): - s_h = lbry_file.stream_hash - d = self.get_count_for_stream_hash(s_h) - # TODO: could possibly be a timing issue here - d.addCallback(lambda c: self.stream_info_manager.delete_stream(s_h) if c == 0 else True) - return d - - bad_files = [lbry_file for lbry_file in self.lbry_files - if lbry_file.completed == True and - os.path.isfile(os.path.join(self.download_directory, lbry_file.file_name)) == False] - d = defer.DeferredList([self.delete_lbry_file(lbry_file) for lbry_file in bad_files], consumeErrors=True) - d.addCallback(lambda files: _disp(files) if len(files) else defer.succeed(None)) - - if self.delete_data: - d2 = defer.DeferredList([_delete_stream_data(lbry_file) for lbry_file in bad_files], consumeErrors=True) + # def check_files_exist(self): + # def _disp(deleted_files): + # if deleted_files[0][0]: + # for file in bad_files: + # log.info("[" + str(datetime.now()) + "] Detected " + file.file_name + " was deleted, removing from file manager") + # + # def _delete_stream_data(lbry_file): + # s_h = lbry_file.stream_hash + # d = self.get_count_for_stream_hash(s_h) + # # TODO: could possibly be a timing issue here + # d.addCallback(lambda c: self.stream_info_manager.delete_stream(s_h) if c == 0 else True) + # return d + # + # bad_files = [lbry_file for lbry_file in self.lbry_files + # if lbry_file.completed == True and + # os.path.isfile(os.path.join(self.download_directory, lbry_file.file_name)) == False] + # d = defer.DeferredList([self.delete_lbry_file(lbry_file) for lbry_file in bad_files], consumeErrors=True) + # d.addCallback(lambda files: _disp(files) if len(files) else defer.succeed(None)) + # + # if self.delete_data: + # d2 = defer.DeferredList([_delete_stream_data(lbry_file) for lbry_file in bad_files], consumeErrors=True) def get_lbry_file_status(self, lbry_file): return self._get_lbry_file_status(lbry_file.rowid) @@ -180,7 +180,7 @@ class LBRYFileManager(object): return defer.fail(Failure(ValueError("Could not find that LBRY file"))) def stop(self): - self.check_exists_loop.stop() + # self.check_exists_loop.stop() ds = [] diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index 67b5c8c9b..a3ba38900 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -6,10 +6,14 @@ import binascii import subprocess import logging import requests +# import rumps +# import httplib2 from twisted.web import server, resource, static from twisted.internet import defer, threads, error, reactor from txjsonrpc.web import jsonrpc +from jsonrpc.proxy import JSONRPCProxy + from datetime import datetime from decimal import Decimal from StringIO import StringIO @@ -537,10 +541,10 @@ class LBRYDaemon(jsonrpc.JSONRPC): return defer.succeed(True) def _download_name(self, name): - def _disp_file(file): - log.info("[" + str(datetime.now()) + "] Already downloaded: " + str(file.stream_hash)) - d = self._path_from_lbry_file(file) - return d + def _disp_file(f): + file_path = os.path.join(self.download_directory, f.file_name) + log.info("[" + str(datetime.now()) + "] Already downloaded: " + str(f.stream_hash) + " --> " + file_path) + return defer.succeed(f) def _get_stream(name): def _disp(stream): @@ -558,12 +562,9 @@ class LBRYDaemon(jsonrpc.JSONRPC): d = self._check_history(name) d.addCallback(lambda lbry_file: _get_stream(name) if not lbry_file else _disp_file(lbry_file)) - d.addCallback(lambda _: self._check_history(name)) - d.addCallback(lambda lbry_file: ({'stream_hash': lbry_file.stream_hash, - 'path': os.path.join(self.download_directory, - lbry_file.file_name)}) - if lbry_file else defer.fail(NOT_FOUND)) + d.addCallback(lambda _: self._path_from_name(name)) d.addErrback(lambda err: defer.fail(NOT_FOUND)) + return d def _resolve_name(self, name): @@ -586,12 +587,19 @@ class LBRYDaemon(jsonrpc.JSONRPC): f = open(path, 'r') l = json.loads(f.read()) f.close() + file_name = l['stream_name'].decode('hex') - lbry_file = [file for file in self.lbry_file_manager.lbry_files if file.stream_name == file_name] - if lbry_file: - return lbry_file[0] + for lbry_file in self.lbry_file_manager.lbry_files: + if lbry_file.stream_name == file_name: + if sys.platform == "darwin": + if os.path.isfile(os.path.join(self.download_directory, lbry_file.stream_name)): + return lbry_file + else: + return False + else: + return lbry_file else: - return None + return False def _check(info): stream_hash = info['stream_hash'] @@ -604,7 +612,7 @@ class LBRYDaemon(jsonrpc.JSONRPC): return defer.succeed(False) d = self._resolve_name(name) - d.addCallbacks(_check, lambda _: False) + d.addCallback(_check) d.callback(None) return d @@ -633,7 +641,7 @@ class LBRYDaemon(jsonrpc.JSONRPC): d = self._check_history(name) d.addCallback(lambda lbry_file: {'stream_hash': lbry_file.stream_hash, 'path': os.path.join(self.download_directory, lbry_file.file_name)} - if lbry_file else defer.fail(UnknownNameError)) + if lbry_file else defer.fail(UnknownNameError)) return d def _path_from_lbry_file(self, lbry_file): @@ -673,6 +681,11 @@ class LBRYDaemon(jsonrpc.JSONRPC): def _render_response(self, result, code): return json.dumps({'result': result, 'code': code}) + # def _log_to_slack(self, msg): + # URL = "https://hooks.slack.com/services/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" + # h = httplib2.Http() + # h.request(URL, 'POST', json.dumps({"text": msg}), headers={'Content-Type': 'application/json'}) + def jsonrpc_is_running(self): """ Returns a startup message when the daemon starts, after which it will return True @@ -722,6 +735,7 @@ class LBRYDaemon(jsonrpc.JSONRPC): self.fetcher.start() log.info('[' + str(datetime.now()) + '] Start autofetcher') + # self._log_to_slack('[' + str(datetime.now()) + '] Start autofetcher') return self._render_response("Started autofetching claims", OK_CODE) def jsonrpc_stop_fetcher(self): @@ -829,6 +843,7 @@ class LBRYDaemon(jsonrpc.JSONRPC): lambda err: self._render_response('error', NOT_FOUND)) else: d = self._render_response('error', BAD_REQUEST) + return d def jsonrpc_stop_lbry_file(self, p): @@ -933,27 +948,40 @@ class LBRYDaemon(jsonrpc.JSONRPC): @param: @return: """ + params = Bunch(p) - metadata_fields = {"name": str, "file_path": str, "bid": float, "author": str, "title": str, - "description": str, "thumbnail": str, "key_fee": float, "key_fee_address": str, - "content_license": str} - log.info(params) - log.info(params.__dict__) + metadata_fields = {"name": unicode, "file_path": unicode, "bid": float, "author": unicode, "title": unicode, + "description": unicode, "thumbnail": unicode, "key_fee": float, "key_fee_address": unicode, + "content_license": unicode, "sources": dict} for k in metadata_fields.keys(): if k in params.__dict__.keys(): - assert isinstance(params.__dict__[k], metadata_fields[k]) - metadata_fields[k] = params.__dict__[k] + if isinstance(params.__dict__[k], metadata_fields[k]): + if type(params.__dict__[k]) == unicode: + metadata_fields[k] = str(params.__dict__[k]) + else: + metadata_fields[k] = params.__dict__[k] + else: + metadata_fields[k] = None else: metadata_fields[k] = None log.info("[" + str(datetime.now()) + "] Publish: ", metadata_fields) p = Publisher(self.session, self.lbry_file_manager, self.session.wallet) - d = p.start(metadata_fields['name'], metadata_fields['file_path'], metadata_fields['bid'], - metadata_fields['title'], metadata_fields['description'], metadata_fields['thumbnail'], - metadata_fields['key_fee'], metadata_fields['key_fee_address'], metadata_fields['content_license']) + d = p.start(name=metadata_fields['name'], + file_path=metadata_fields['file_path'], + bid=metadata_fields['bid'], + title=metadata_fields['title'], + description=metadata_fields['description'], + thumbnail=metadata_fields['thumbnail'], + key_fee=metadata_fields['key_fee'], + key_fee_address=metadata_fields['key_fee_address'], + content_license=metadata_fields['content_license'], + author=metadata_fields['author'], + sources=metadata_fields['sources']) + d.addCallbacks(lambda msg: self._render_response(msg, OK_CODE), lambda err: self._render_response(err.getTraceback(), BAD_REQUEST)) @@ -1175,4 +1203,4 @@ class LBRYDaemonWeb(resource.Resource): d.addCallbacks(lambda results: self._delayed_render(request, results), lambda err: self._delayed_render(request, json.dumps({'message': err.getTraceback(), 'code': BAD_REQUEST}))) - return server.NOT_DONE_YET \ No newline at end of file + return server.NOT_DONE_YET diff --git a/lbrynet/lbrynet_daemon/LBRYDownloader.py b/lbrynet/lbrynet_daemon/LBRYDownloader.py index a4cb2a980..fc1636d46 100644 --- a/lbrynet/lbrynet_daemon/LBRYDownloader.py +++ b/lbrynet/lbrynet_daemon/LBRYDownloader.py @@ -13,7 +13,8 @@ log = logging.getLogger(__name__) class GetStream(object): - def __init__(self, sd_identifier, session, wallet, lbry_file_manager, max_key_fee, pay_key=True, data_rate=0.5): + def __init__(self, sd_identifier, session, wallet, lbry_file_manager, max_key_fee, pay_key=True, data_rate=0.5, + timeout=30): self.wallet = wallet self.resolved_name = None self.description = None @@ -30,8 +31,25 @@ class GetStream(object): self.max_key_fee = max_key_fee self.stream_info = None self.stream_info_manager = None + self.d = defer.Deferred(None) + self.timeout = timeout + self.timeout_counter = 0 + self.download_path = None + self.checker = LoopingCall(self.check_status) + def check_status(self): + self.timeout_counter += 1 + + if self.download_path and os.path.isfile(self.download_path): + self.checker.stop() + return defer.succeed(True) + + elif self.timeout_counter >= self.timeout: + log.info("Timeout downloading " + str(self.stream_info)) + self.checker.stop() + self.d.cancel() + def start(self, stream_info): self.stream_info = stream_info if 'stream_hash' in self.stream_info.keys(): @@ -60,17 +78,18 @@ class GetStream(object): else: pass - d = defer.Deferred(None) - d.addCallback(lambda _: download_sd_blob(self.session, self.stream_hash, self.payment_rate_manager)) - d.addCallback(self.sd_identifier.get_metadata_for_sd_blob) - d.addCallback(lambda metadata: (next(factory for factory in metadata.factories if isinstance(factory, ManagedLBRYFileDownloaderFactory)), metadata)) - d.addCallback(lambda (factory, metadata): factory.make_downloader(metadata, [self.data_rate, True], self.payment_rate_manager)) - d.addErrback(lambda err: err.trap(defer.CancelledError)) - d.addErrback(lambda err: log.error("An exception occurred attempting to load the stream descriptor: %s", err.getTraceback())) - d.addCallback(self._start_download) - d.callback(None) + self.checker.start(1) - return d + self.d.addCallback(lambda _: download_sd_blob(self.session, self.stream_hash, self.payment_rate_manager)) + self.d.addCallback(self.sd_identifier.get_metadata_for_sd_blob) + self.d.addCallback(lambda metadata: (next(factory for factory in metadata.factories if isinstance(factory, ManagedLBRYFileDownloaderFactory)), metadata)) + self.d.addCallback(lambda (factory, metadata): factory.make_downloader(metadata, [self.data_rate, True], self.payment_rate_manager)) + self.d.addErrback(lambda err: err.trap(defer.CancelledError)) + self.d.addErrback(lambda err: log.error("An exception occurred attempting to load the stream descriptor: %s", err.getTraceback())) + self.d.addCallback(self._start_download) + self.d.callback(None) + + return self.d def _start_download(self, downloader): def _pay_key_fee(): @@ -87,9 +106,9 @@ class GetStream(object): else: d = defer.Deferred() - downloader.start() - - log.info("Downloading", self.stream_hash, "-->", os.path.join(downloader.download_directory, downloader.file_name)) + self.download_path = os.path.join(downloader.download_directory, downloader.file_name) + d.addCallback(lambda _: downloader.start()) + d.addCallback(lambda _: log.info("Downloading " + str(self.stream_hash) + " --> " + str(self.download_path))) return d diff --git a/lbrynet/lbrynet_daemon/LBRYPublisher.py b/lbrynet/lbrynet_daemon/LBRYPublisher.py index 391985522..ea7c015a3 100644 --- a/lbrynet/lbrynet_daemon/LBRYPublisher.py +++ b/lbrynet/lbrynet_daemon/LBRYPublisher.py @@ -33,9 +33,11 @@ class Publisher(object): self.sd_hash = None self.tx_hash = None self.content_license = None + self.author = None + self.sources = None def start(self, name, file_path, bid, title=None, description=None, thumbnail=None, - key_fee=None, key_fee_address=None, content_license=None): + key_fee=None, key_fee_address=None, content_license=None, author=None, sources=None): def _show_result(): message = "[" + str(datetime.now()) + "] Published " + self.file_name + " --> lbry://" + \ @@ -52,6 +54,8 @@ class Publisher(object): self.key_fee = key_fee self.key_fee_address = key_fee_address self.content_license = content_license + self.author = author + self.sources = sources d = self._check_file_path(self.file_path) d.addCallback(lambda _: create_lbry_file(self.session, self.lbry_file_manager, @@ -104,10 +108,11 @@ class Publisher(object): return d def _claim_name(self): - d = self.wallet.claim_name(self.publish_name, self.sd_hash, self.bid_amount, + d = self.wallet.claim_name(self.publish_name, {'sd_hash': self.sd_hash}, self.bid_amount, description=self.description, key_fee=self.key_fee, key_fee_address=self.key_fee_address, thumbnail=self.thumbnail, - content_license=self.content_license) + content_license=self.content_license, author=self.author, + sources=self.sources) def set_tx_hash(tx_hash): self.tx_hash = tx_hash From 02bde900d60a789a90a83f1e02b8140fb8ca6283 Mon Sep 17 00:00:00 2001 From: Jack Date: Thu, 17 Mar 2016 10:19:36 -0400 Subject: [PATCH 03/13] update daemon and console MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -don’t start console if daemon is running, display a message alerting user -move os x data directory to match app -add timeout parameter to get function --- lbrynet/conf.py | 4 +- lbrynet/lbrynet_console/LBRYConsole.py | 55 ++++++++++++++---------- lbrynet/lbrynet_daemon/LBRYDaemon.py | 11 +++-- lbrynet/lbrynet_daemon/LBRYDownloader.py | 8 +++- 4 files changed, 49 insertions(+), 29 deletions(-) diff --git a/lbrynet/conf.py b/lbrynet/conf.py index 8af383387..227589def 100644 --- a/lbrynet/conf.py +++ b/lbrynet/conf.py @@ -36,4 +36,6 @@ APP_NAME = "LBRY" DEFAULT_WALLET = "lbryum" API_CONNECTION_STRING = "http://%s:%i/%s" % (API_INTERFACE, API_PORT, API_ADDRESS) -PROTOCOL_PREFIX = "lbry" \ No newline at end of file +PROTOCOL_PREFIX = "lbry" + +DEFAULT_TIMEOUT = 30 \ No newline at end of file diff --git a/lbrynet/lbrynet_console/LBRYConsole.py b/lbrynet/lbrynet_console/LBRYConsole.py index d3fa39b2b..43325bc73 100644 --- a/lbrynet/lbrynet_console/LBRYConsole.py +++ b/lbrynet/lbrynet_console/LBRYConsole.py @@ -1,16 +1,21 @@ import logging -from lbrynet.core.Session import LBRYSession import os.path import argparse import requests import locale import sys + +if sys.platform == "darwin": + from appdirs import user_data_dir from yapsy.PluginManager import PluginManager from twisted.internet import defer, threads, stdio, task, error +from jsonrpc.proxy import JSONRPCProxy + +from lbrynet.core.Session import LBRYSession from lbrynet.lbrynet_console.ConsoleControl import ConsoleControl from lbrynet.lbrynet_console.LBRYSettings import LBRYSettings from lbrynet.lbryfilemanager.LBRYFileManager import LBRYFileManager -from lbrynet.conf import MIN_BLOB_DATA_PAYMENT_RATE # , MIN_BLOB_INFO_PAYMENT_RATE +from lbrynet.conf import MIN_BLOB_DATA_PAYMENT_RATE, API_CONNECTION_STRING # , MIN_BLOB_INFO_PAYMENT_RATE from lbrynet.core.utils import generate_id from lbrynet.core.StreamDescriptor import StreamDescriptorIdentifier from lbrynet.core.PaymentRateManager import PaymentRateManager @@ -461,7 +466,6 @@ class LBRYConsole(): def launch_lbry_console(): - from twisted.internet import reactor parser = argparse.ArgumentParser(description="Launch a lbrynet console") @@ -529,7 +533,7 @@ def launch_lbry_console(): created_data_dir = False if not args.data_dir: if sys.platform == "darwin": - data_dir = os.path.join(os.path.expanduser("~"), "Library/Application Support/lbrynet") + data_dir = user_data_dir("LBRY") else: data_dir = os.path.join(os.path.expanduser("~"), ".lbrynet") else: @@ -538,28 +542,35 @@ def launch_lbry_console(): os.mkdir(data_dir) created_data_dir = True + daemon = JSONRPCProxy.from_url(API_CONNECTION_STRING) + try: + daemon.is_running() + log.info("Attempt to start lbrynet-console while lbrynet-daemon is running") + print "lbrynet-daemon is running, you must turn it off before using lbrynet-console" + print "If you're running the app, quit before starting lbrynet-console" + print "If you're running lbrynet-daemon in a terminal, run 'stop-lbrynet-daemon' to turn it off" - log_format = "(%(asctime)s)[%(filename)s:%(lineno)s] %(funcName)s(): %(message)s" - formatter = logging.Formatter(log_format) + except: + log_format = "(%(asctime)s)[%(filename)s:%(lineno)s] %(funcName)s(): %(message)s" + formatter = logging.Formatter(log_format) - logger = logging.getLogger() - logger.setLevel(logging.DEBUG) - file_handler = logging.FileHandler(os.path.join(data_dir, "console.log")) - file_handler.setFormatter(formatter) - file_handler.addFilter(logging.Filter("lbrynet")) - logger.addHandler(file_handler) + logger = logging.getLogger() + logger.setLevel(logging.DEBUG) + file_handler = logging.FileHandler(os.path.join(data_dir, "console.log")) + file_handler.setFormatter(formatter) + file_handler.addFilter(logging.Filter("lbrynet")) + logger.addHandler(file_handler) - console = LBRYConsole(peer_port, dht_node_port, bootstrap_nodes, fake_wallet=args.fake_wallet, - lbrycrd_conf=args.lbrycrd_wallet_conf, lbrycrd_dir=args.lbrycrd_wallet_dir, - use_upnp=not args.disable_upnp, data_dir=data_dir, - created_data_dir=created_data_dir, lbrycrdd_path=args.lbrycrdd_path) - d = task.deferLater(reactor, 0, console.start) + console = LBRYConsole(peer_port, dht_node_port, bootstrap_nodes, fake_wallet=args.fake_wallet, + lbrycrd_conf=args.lbrycrd_wallet_conf, lbrycrd_dir=args.lbrycrd_wallet_dir, + use_upnp=not args.disable_upnp, data_dir=data_dir, + created_data_dir=created_data_dir, lbrycrdd_path=args.lbrycrdd_path) - d.addErrback(lambda _: reactor.stop()) - - reactor.addSystemEventTrigger('before', 'shutdown', console.shut_down) - reactor.run() + d = task.deferLater(reactor, 0, console.start) + d.addErrback(lambda _: reactor.stop()) + reactor.addSystemEventTrigger('before', 'shutdown', console.shut_down) + reactor.run() if __name__ == "__main__": - launch_lbry_console() \ No newline at end of file + launch_lbry_console() diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index a3ba38900..e3b9a437b 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -35,7 +35,7 @@ from lbrynet.lbrynet_daemon.LBRYPublisher import Publisher from lbrynet.core.utils import generate_id from lbrynet.lbrynet_console.LBRYSettings import LBRYSettings from lbrynet.conf import MIN_BLOB_DATA_PAYMENT_RATE, DEFAULT_MAX_SEARCH_RESULTS, KNOWN_DHT_NODES, DEFAULT_MAX_KEY_FEE -from lbrynet.conf import API_CONNECTION_STRING, API_PORT, API_ADDRESS +from lbrynet.conf import API_CONNECTION_STRING, API_PORT, API_ADDRESS, DEFAULT_TIMEOUT from lbrynet.core.StreamDescriptor import StreamDescriptorIdentifier, download_sd_blob from lbrynet.core.Session import LBRYSession from lbrynet.core.PTCWallet import PTCWallet @@ -540,7 +540,7 @@ class LBRYDaemon(jsonrpc.JSONRPC): self.sd_identifier.add_stream_downloader_factory(LBRYFileStreamType, downloader_factory) return defer.succeed(True) - def _download_name(self, name): + def _download_name(self, name, timeout=DEFAULT_TIMEOUT): def _disp_file(f): file_path = os.path.join(self.download_directory, f.file_name) log.info("[" + str(datetime.now()) + "] Already downloaded: " + str(f.stream_hash) + " --> " + file_path) @@ -553,7 +553,7 @@ class LBRYDaemon(jsonrpc.JSONRPC): d = self.session.wallet.get_stream_info_for_name(name) stream = GetStream(self.sd_identifier, self.session, self.session.wallet, self.lbry_file_manager, - max_key_fee=self.max_key_fee, data_rate=self.data_rate) + max_key_fee=self.max_key_fee, data_rate=self.data_rate, timeout=timeout) d.addCallback(_disp) d.addCallback(lambda stream_info: stream.start(stream_info)) d.addCallback(lambda _: self._path_from_name(name)) @@ -837,8 +837,11 @@ class LBRYDaemon(jsonrpc.JSONRPC): """ params = Bunch(p) + if 'timeout' not in p.keys(): + params.timeout = DEFAULT_TIMEOUT + if params.name: - d = self._download_name(params.name) + d = self._download_name(params.name, timeout=params.timeout) d.addCallbacks(lambda message: self._render_response(message, OK_CODE), lambda err: self._render_response('error', NOT_FOUND)) else: diff --git a/lbrynet/lbrynet_daemon/LBRYDownloader.py b/lbrynet/lbrynet_daemon/LBRYDownloader.py index fc1636d46..4552cd4af 100644 --- a/lbrynet/lbrynet_daemon/LBRYDownloader.py +++ b/lbrynet/lbrynet_daemon/LBRYDownloader.py @@ -1,20 +1,23 @@ import json import logging import os + from datetime import datetime from twisted.internet import defer from twisted.internet.task import LoopingCall + from lbrynet.core.Error import InvalidStreamInfoError, InsufficientFundsError from lbrynet.core.PaymentRateManager import PaymentRateManager from lbrynet.core.StreamDescriptor import download_sd_blob from lbrynet.lbryfilemanager.LBRYFileDownloader import ManagedLBRYFileDownloaderFactory +from lbrynet.conf import DEFAULT_TIMEOUT log = logging.getLogger(__name__) class GetStream(object): def __init__(self, sd_identifier, session, wallet, lbry_file_manager, max_key_fee, pay_key=True, data_rate=0.5, - timeout=30): + timeout=DEFAULT_TIMEOUT): self.wallet = wallet self.resolved_name = None self.description = None @@ -106,8 +109,9 @@ class GetStream(object): else: d = defer.Deferred() + downloader.start() + self.download_path = os.path.join(downloader.download_directory, downloader.file_name) - d.addCallback(lambda _: downloader.start()) d.addCallback(lambda _: log.info("Downloading " + str(self.stream_hash) + " --> " + str(self.download_path))) return d From 5072f503c467fbaf1bb4610025b430bd514eb6e4 Mon Sep 17 00:00:00 2001 From: Jack Date: Sun, 20 Mar 2016 22:53:01 -0400 Subject: [PATCH 04/13] fix cross scripting problem add access-control-allow-origin: http://localhost:5279 --- lbrynet/lbrynet_daemon/LBRYDaemon.py | 32 +++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index e3b9a437b..1d647a917 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -11,6 +11,7 @@ import requests from twisted.web import server, resource, static from twisted.internet import defer, threads, error, reactor +from txjsonrpc import jsonrpclib from txjsonrpc.web import jsonrpc from jsonrpc.proxy import JSONRPCProxy @@ -64,6 +65,35 @@ class LBRYDaemon(jsonrpc.JSONRPC): """ isLeaf = True + def render(self, request): + request.content.seek(0, 0) + # Unmarshal the JSON-RPC data. + content = request.content.read() + parsed = jsonrpclib.loads(content) + functionPath = parsed.get("method") + args = parsed.get('params') + id = parsed.get('id') + version = parsed.get('jsonrpc') + if version: + version = int(float(version)) + elif id and not version: + version = jsonrpclib.VERSION_1 + else: + version = jsonrpclib.VERSION_PRE1 + # XXX this all needs to be re-worked to support logic for multiple + # versions... + try: + function = self._getFunction(functionPath) + except jsonrpclib.Fault, f: + self._cbRender(f, request, id, version) + else: + request.setHeader('Access-Control-Allow-Origin', ('http://localhost' + ':' + str(API_PORT))) + request.setHeader("content-type", "text/json") + d = defer.maybeDeferred(function, *args) + d.addErrback(self._ebRender, id) + d.addCallback(self._cbRender, request, id, version) + return server.NOT_DONE_YET + def setup(self, wallet_type, check_for_updates): def _set_vars(wallet_type, check_for_updates): reactor.addSystemEventTrigger('before', 'shutdown', self._shutdown) @@ -1206,4 +1236,4 @@ class LBRYDaemonWeb(resource.Resource): d.addCallbacks(lambda results: self._delayed_render(request, results), lambda err: self._delayed_render(request, json.dumps({'message': err.getTraceback(), 'code': BAD_REQUEST}))) - return server.NOT_DONE_YET + return server.NOT_DONE_YET \ No newline at end of file From 34eaa822a01f1b28f1893b30451fb9489a87e0d8 Mon Sep 17 00:00:00 2001 From: Jack Date: Mon, 21 Mar 2016 10:12:01 -0400 Subject: [PATCH 05/13] handle null parameter --- lbrynet/lbrynet_daemon/LBRYDaemon.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index 1d647a917..5838b4945 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -89,7 +89,10 @@ class LBRYDaemon(jsonrpc.JSONRPC): else: request.setHeader('Access-Control-Allow-Origin', ('http://localhost' + ':' + str(API_PORT))) request.setHeader("content-type", "text/json") - d = defer.maybeDeferred(function, *args) + if args == [{}]: + d = defer.maybeDeferred(function) + else: + d = defer.maybeDeferred(function, *args) d.addErrback(self._ebRender, id) d.addCallback(self._cbRender, request, id, version) return server.NOT_DONE_YET @@ -917,6 +920,7 @@ class LBRYDaemon(jsonrpc.JSONRPC): @param {'search': search string} @return: List of search results """ + params = Bunch(p) def _clean(n): From 55f25c261380bbd1adec2929d15196c0aaeb8ccf Mon Sep 17 00:00:00 2001 From: Jack Date: Mon, 21 Mar 2016 12:06:19 -0400 Subject: [PATCH 06/13] consolidate search output consolidate search output into a list of dicts --- lbrynet/lbrynet_daemon/LBRYDaemon.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index 5838b4945..363ce87d1 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -943,10 +943,19 @@ class LBRYDaemon(jsonrpc.JSONRPC): return defer.DeferredList(ds) def _disp(results): - log.info('[' + str(datetime.now()) + '] Search results: ') + log.info('[' + str(datetime.now()) + '] Found ' + str(len(results)) + ' search results') + consolidated_results = [] for r in results: - log.info(str(r)) - return self._render_response(results, OK_CODE) + t = {} + t.update(r[0]) + if 'name' in r[1].keys(): + r[1]['stream_name'] = r[1]['name'] + del r[1]['name'] + t.update(r[1]) + t['cost_est'] = r[2] + consolidated_results.append(t) + # log.info(str(t)) + return self._render_response(consolidated_results, OK_CODE) log.info('[' + str(datetime.now()) + '] Search nametrie: ' + params.search) From ba991b47ea18e30ad62cec1578071703953750e5 Mon Sep 17 00:00:00 2001 From: Jack Date: Tue, 22 Mar 2016 00:03:17 -0400 Subject: [PATCH 07/13] add /view to dynamically generate a video containing page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -uses UI stored in Resources folder of app -going to /view?name= will download the corresponding stream and display the file in the browser -adds default daemon settings, currently they don’t do anything, to be added to -adds missing packages to setup.py --- lbrynet/lbrynet_daemon/LBRYDaemon.py | 106 ++++++++++++++------ lbrynet/lbrynet_daemon/LBRYDaemonControl.py | 14 ++- setup.py | 2 +- 3 files changed, 87 insertions(+), 35 deletions(-) diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index 363ce87d1..5dce85822 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -126,7 +126,7 @@ class LBRYDaemon(jsonrpc.JSONRPC): else: self.wallet_dir = os.path.join(os.path.expanduser("~"), ".lbrycrd") self.download_directory = os.path.join(os.path.expanduser("~"), 'Downloads') - + self.daemon_conf = os.path.join(self.wallet_dir, 'daemon_settings.conf') self.wallet_conf = os.path.join(self.wallet_dir, "lbrycrd.conf") self.wallet_user = None self.wallet_password = None @@ -164,6 +164,14 @@ class LBRYDaemon(jsonrpc.JSONRPC): self.announced_startup = False self.search_timeout = 3.0 self.query_handlers = {} + self.default_settings = { + 'run_on_startup': False, + 'data_rate': MIN_BLOB_DATA_PAYMENT_RATE, + 'max_key_fee': 10.0, + 'default_download_directory': self.download_directory, + 'max_upload': 0.0, + 'max_download': 0.0 + } return defer.succeed(None) @@ -178,7 +186,8 @@ class LBRYDaemon(jsonrpc.JSONRPC): log.info("[" + str(datetime.now()) + "] Starting lbrynet-daemon") d = defer.Deferred() - d.addCallback(lambda _: _set_vars(wallet_type, check_for_updates)) + d.addCallback(lambda _:_set_vars(wallet_type, check_for_updates)) + d.addCallback(lambda _: self._setup_daemon_settings()) d.addCallback(lambda _: threads.deferToThread(self._setup_data_directory)) d.addCallback(lambda _: self._check_db_migration()) d.addCallback(lambda _: self._get_settings()) @@ -201,6 +210,10 @@ class LBRYDaemon(jsonrpc.JSONRPC): def _initial_setup(self): return NotImplemented + def _setup_daemon_settings(self): + self.session_settings = self.default_settings + return defer.succeed(None) + def _update(self): def _check_for_updater(): if os.path.isdir("/Applications/LBRY Updater.app"): @@ -370,9 +383,28 @@ class LBRYDaemon(jsonrpc.JSONRPC): d.addCallback(lambda _: self.session.shut_down()) return d - def _update_settings(self): - self.data_rate = self.session_settings['data_rate'] - self.max_key_fee = self.session_settings['max_key_fee'] + def _update_settings(self, settings): + if not isinstance(settings['run_on_startup'], bool): + return defer.fail() + elif not isinstance(settings['data_rate'], float): + return defer.fail() + elif not isinstance(settings['max_key_fee'], float): + return defer.fail() + elif not isinstance(settings['default_download_directory'], unicode): + return defer.fail() + elif not isinstance(settings['max_upload'], float): + return defer.fail() + elif not isinstance(settings['max_download'], float): + return defer.fail() + + self.session_settings['run_on_startup'] = settings['run_on_startup'] + self.session_settings['data_rate'] = settings['data_rate'] + self.session_settings['max_key_fee'] = settings['max_key_fee'] + self.session_settings['default_download_directory'] = settings['default_download_directory'] + self.session_settings['max_upload'] = settings['max_upload'] + self.session_settings['max_download'] = settings['max_download'] + + return defer.succeed(True) def _setup_fetcher(self): self.fetcher = FetcherDaemon(self.session, self.lbry_file_manager, self.lbry_file_metadata_manager, @@ -739,9 +771,6 @@ class LBRYDaemon(jsonrpc.JSONRPC): @return {'data_rate': float, 'max_key_fee': float} """ - if not self.session_settings: - self.session_settings = {'data_rate': self.data_rate, 'max_key_fee': self.max_key_fee} - log.info("[" + str(datetime.now()) + "] Get daemon settings") return self._render_response(self.session_settings, OK_CODE) @@ -751,10 +780,8 @@ class LBRYDaemon(jsonrpc.JSONRPC): @param settings: {'settings': {'data_rate': float, 'max_key_fee': float}} """ - params = Bunch(p) - self.session_settings = params.settings - self._update_settings() + d = self._update_settings(p) log.info("[" + str(datetime.now()) + "] Set daemon settings") return self._render_response(True, OK_CODE) @@ -1194,39 +1221,60 @@ class LBRYindex(resource.Resource): request.write(str(results)) request.finish() + def getChild(self, name, request): + if name == '': + return self + return resource.Resource.getChild(self, name, request) def render_GET(self, request): def _disp(r): log.info(r) return "
" + ''.join(r) + "" - - d = LBRYDaemonCommandHandler('__dir__').run() - d.addCallback(lambda functions: ["" % (function, function) for function in functions]) - d.addCallback(_disp) - d.addCallbacks(lambda results: self._delayed_render(request, results), - lambda err: self._delayed_render(request, err.getTraceback())) - - return server.NOT_DONE_YET + return static.File("./dist/index.html").render_GET(request) -class LBRYFilePage(resource.Resource): +class LBRYFileRender(resource.Resource): isLeaf = False + def _render_path(self, path): + return r'
' + def _delayed_render(self, request, results): request.write(str(results)) request.finish() - h = "" + def render_GET(self, request): + if 'name' in request.args.keys(): + api = jsonrpc.Proxy(API_CONNECTION_STRING) + d = api.callRemote("get", {'name': request.args['name'][0]}) + d.addCallback(lambda response: self._delayed_render(request, self._render_path(json.loads(response)['result']['path'])) + if json.loads(response)['code'] == 200 + else self._delayed_render(request, "Error")) - d = LBRYDaemonCommandHandler('get_lbry_files').run() - d.addCallback(lambda r: json.loads(r)['result']) - d.addCallback(lambda lbry_files: [h % (json.loads(lbry_file)['file_name'], json.loads(lbry_file)['file_name']) for lbry_file in lbry_files]) - d.addCallback(lambda r: "
%s
%s
" + ''.join(r) + "") - d.addCallbacks(lambda results: self._delayed_render(request, results), - lambda err: self._delayed_render(request, err.getTraceback())) + return server.NOT_DONE_YET + else: + self._delayed_render(request, "Error") + return server.NOT_DONE_YET - return server.NOT_DONE_YET + +# class LBRYFilePage(resource.Resource): +# isLeaf = False +# +# def _delayed_render(self, request, results): +# request.write(str(results)) +# request.finish() +# +# h = "" +# +# d = LBRYDaemonCommandHandler('get_lbry_files').run() +# d.addCallback(lambda r: json.loads(r)['result']) +# d.addCallback(lambda lbry_files: [h % (json.loads(lbry_file)['file_name'], json.loads(lbry_file)['file_name']) for lbry_file in lbry_files]) +# d.addCallback(lambda r: "
%s
" + ''.join(r) + "") +# d.addCallbacks(lambda results: self._delayed_render(request, results), +# lambda err: self._delayed_render(request, err.getTraceback())) +# +# return server.NOT_DONE_YET class LBRYDaemonWeb(resource.Resource): @@ -1249,4 +1297,4 @@ class LBRYDaemonWeb(resource.Resource): d.addCallbacks(lambda results: self._delayed_render(request, results), lambda err: self._delayed_render(request, json.dumps({'message': err.getTraceback(), 'code': BAD_REQUEST}))) - return server.NOT_DONE_YET \ No newline at end of file + return server.NOT_DONE_YET diff --git a/lbrynet/lbrynet_daemon/LBRYDaemonControl.py b/lbrynet/lbrynet_daemon/LBRYDaemonControl.py index 4041993eb..89b678f68 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemonControl.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemonControl.py @@ -1,11 +1,11 @@ import argparse import logging -from twisted.web import server +from twisted.web import server, static from twisted.internet import reactor, defer from jsonrpc.proxy import JSONRPCProxy -from lbrynet.lbrynet_daemon.LBRYDaemon import LBRYDaemon, LBRYindex, LBRYDaemonWeb, LBRYFilePage +from lbrynet.lbrynet_daemon.LBRYDaemon import LBRYDaemon, LBRYindex, LBRYDaemonWeb, LBRYFileRender from lbrynet.conf import API_CONNECTION_STRING, API_INTERFACE, API_ADDRESS, API_PORT, DEFAULT_WALLET log = logging.getLogger(__name__) @@ -43,9 +43,13 @@ def start(): daemon.setup(args.wallet, args.update) root = LBRYindex() - root.putChild("", root) - root.putChild("webapi", LBRYDaemonWeb()) + root.putChild("css", static.File("./css")) + root.putChild("font", static.File("./font")) + root.putChild("img", static.File("./img")) + root.putChild("js", static.File("./js")) root.putChild(API_ADDRESS, daemon) - root.putChild("myfiles", LBRYFilePage()) + root.putChild("webapi", LBRYDaemonWeb()) + root.putChild("view", LBRYFileRender()) reactor.listenTCP(API_PORT, server.Site(root), interface=API_INTERFACE) + reactor.run() diff --git a/setup.py b/setup.py index 577a83c81..b032122fb 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ setup(name='lbrynet', packages=find_packages(), install_requires=['six>=1.9.0', 'pycrypto', 'twisted', 'miniupnpc', 'yapsy', 'seccure', 'python-bitcoinrpc==0.1', 'txJSON-RPC', 'requests>=2.4.2', 'unqlite==0.2.0', - 'leveldb', 'lbryum'], + 'leveldb', 'lbryum', 'jsonrpc', 'simplejson', 'appdirs'], entry_points={'console_scripts': console_scripts}, data_files=[ ('lbrynet/lbrynet_console/plugins', From 2486ae6d3f690b1164f031483e0ab381496e352c Mon Sep 17 00:00:00 2001 From: Jack Date: Tue, 22 Mar 2016 09:40:18 -0400 Subject: [PATCH 08/13] get rid of unused updater function updater function was hacky and not the most reliable, to be replaced by app version checking --- lbrynet/lbrynet_daemon/LBRYDaemon.py | 101 +---------- .../lbrynet_daemon/scripts/restart_daemon.sh | 4 - lbrynet/lbrynet_daemon/scripts/update_lbry.sh | 50 ------ .../lbrynet_daemon/scripts/update_lbrynet.sh | 163 ------------------ 4 files changed, 3 insertions(+), 315 deletions(-) delete mode 100644 lbrynet/lbrynet_daemon/scripts/restart_daemon.sh delete mode 100755 lbrynet/lbrynet_daemon/scripts/update_lbry.sh delete mode 100755 lbrynet/lbrynet_daemon/scripts/update_lbrynet.sh diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index 5dce85822..922f3be27 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -159,7 +159,6 @@ class LBRYDaemon(jsonrpc.JSONRPC): self.data_rate = MIN_BLOB_DATA_PAYMENT_RATE self.max_key_fee = DEFAULT_MAX_KEY_FEE self.max_search_results = DEFAULT_MAX_SEARCH_RESULTS - self.restart_message = "" self.startup_message = "" self.announced_startup = False self.search_timeout = 3.0 @@ -176,10 +175,7 @@ class LBRYDaemon(jsonrpc.JSONRPC): return defer.succeed(None) def _disp_startup(): - if self.restart_message: - log.info(self.restart_message) - else: - log.info("[" + str(datetime.now()) + "] Started lbrynet-daemon") + log.info("[" + str(datetime.now()) + "] Started lbrynet-daemon") return defer.succeed(None) @@ -199,8 +195,6 @@ class LBRYDaemon(jsonrpc.JSONRPC): d.addCallback(lambda _: self._setup_lbry_file_opener()) d.addCallback(lambda _: self._setup_query_handlers()) d.addCallback(lambda _: self._setup_server()) - # d.addCallback(lambda _: self._update() if self.check_for_updates == "True" and sys.platform == "darwin" - # else defer.succeed(None)) d.addCallback(lambda _: self._setup_fetcher()) d.addCallback(lambda _: _disp_startup()) d.callback(None) @@ -208,102 +202,12 @@ class LBRYDaemon(jsonrpc.JSONRPC): return defer.succeed(None) def _initial_setup(self): - return NotImplemented + return defer.fail(NotImplementedError()) def _setup_daemon_settings(self): self.session_settings = self.default_settings return defer.succeed(None) - def _update(self): - def _check_for_updater(): - if os.path.isdir("/Applications/LBRY Updater.app"): - print "Found LBRY updater" - return defer.succeed(None) - - print "LBRY updater not found, downloading and installing..." - url = urlopen("https://rawgit.com/jackrobison/lbrynet-app/master/LBRY%20Updater.app.zip") - zipped_app = ZipFile(StringIO(url.read())) - zipped_app.extractall("/Applications") - return defer.succeed(None) - - def _update_lbrynet(): - git_version = subprocess.check_output( - "git ls-remote https://github.com/lbryio/lbry.git | grep HEAD | cut -f 1", - shell=True) - if os.path.isfile(os.path.join(self.db_dir, "lbrynet_version.txt")): - f = open(os.path.join(self.db_dir, "lbrynet_version.txt"), 'r') - current_version = f.read() - f.close() - if git_version == current_version: - print "LBRYnet installation version " + current_version[:-1] + " is up to date" - return defer.succeed(None) - print "Update LBRYnet version " + current_version[:-1] + " --> " + git_version[:-1] - self.restart_message = "Updates available" - else: - print "Update LBRYnet to version " + git_version[:-1] - self.restart_message = "Updates available" - - return defer.succeed(None) - - def _update_lbrycrdd(): - git_version = subprocess.check_output( - "git ls-remote https://github.com/jackrobison/lbrynet-app.git | grep HEAD | cut -f 1", - shell=True) - if os.path.isfile(os.path.join(self.wallet_dir, "lbry_app_version.txt")): - f = open(os.path.join(self.wallet_dir, "lbry_app_version.txt"), 'r') - current_version = f.read() - f.close() - if git_version == current_version: - print "LBRY installation version " + current_version[:-1] + " is up to date" - return defer.succeed(None) - print "Update LBRY version " + current_version[:-1] + " --> " + git_version[:-1] - self.restart_message = "Updates available" - else: - print "Update LBRY to version " + git_version[:-1] - self.restart_message = "Updates available" - - return defer.succeed(None) - - def _update_lbryum(): - git_version = subprocess.check_output( - "git ls-remote https://github.com/lbryio/lbryum.git | grep HEAD | cut -f 1", - shell=True) - if os.path.isfile(os.path.join(self.db_dir, "lbryum_version.txt")): - f = open(os.path.join(self.db_dir, "lbryum_version.txt"), 'r') - current_version = f.read() - f.close() - if git_version == current_version: - print "LBRYum installation version " + current_version[:-1] + " is up to date" - return defer.succeed(None) - print "Update LBRYum version " + current_version[:-1] + " --> " + git_version[:-1] - self.restart_message = "Updates available" - else: - print "Update LBRYum to version " + git_version[:-1] - self.restart_message = "Updates available" - - return defer.succeed(None) - - d = _check_for_updater() - d.addCallback(lambda _: _update_lbrynet()) - d.addCallback(lambda _: _update_lbrycrdd() if self.wallet_type == 'lbrycrd' else _update_lbryum()) - d.addCallback(lambda _: os.system("open /Applications/LBRY\ Updater.app &>/dev/null") if self.restart_message - else defer.succeed(None)) - d.addCallbacks(lambda _: self._restart() if self.restart_message else defer.succeed(None)) - - return defer.succeed(None) - - def _restart(self): - def _disp_shutdown(): - print 'Restarting lbrynet daemon' - return defer.succeed(None) - - # LBRY Updater.app will restart the daemon - d = self._shutdown() - d.addCallback(lambda _: _disp_shutdown()) - d.addCallback(lambda _: reactor.callLater(1.0, reactor.stop)) - - return d - def _start_server(self): if self.peer_port is not None: @@ -1106,6 +1010,7 @@ class LBRYDaemon(jsonrpc.JSONRPC): @return: time behind blockchain """ d = self.session.wallet.get_most_recent_blocktime() + d.addCallback(get_time_behind_blockchain) d.addCallbacks(lambda result: self._render_response(result, OK_CODE), lambda result: self._render_response(result, BAD_REQUEST)) diff --git a/lbrynet/lbrynet_daemon/scripts/restart_daemon.sh b/lbrynet/lbrynet_daemon/scripts/restart_daemon.sh deleted file mode 100644 index 7353c0a20..000000000 --- a/lbrynet/lbrynet_daemon/scripts/restart_daemon.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -echo "Restarting lbrynet-daemon" -lbrynet-daemon \ No newline at end of file diff --git a/lbrynet/lbrynet_daemon/scripts/update_lbry.sh b/lbrynet/lbrynet_daemon/scripts/update_lbry.sh deleted file mode 100755 index 09177e79c..000000000 --- a/lbrynet/lbrynet_daemon/scripts/update_lbry.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/sh - -lbrycrd_directory="/Users/${SUDO_USER}/Library/Application Support/lbrycrd" - -current_version=$(git ls-remote https://github.com/jackrobison/lbrynet-app.git | grep HEAD | cut -f 1) - -if [ -d "$lbrycrd_directory" ]; then - if [ -f "${lbrycrd_directory}/lbry_app_version.txt" ]; then - if grep -Fxq "$current_version" "${lbrycrd_directory}/lbry_app_version.txt"; then - echo "LBRY version $current_version is up to date" - exit - fi - fi -fi - -if ! brew list berkeley-db4 &>/dev/null; then - echo "Installing berkeley-db4" - sudo -u ${SUDO_USER} brew install https://rawgit.com/jackrobison/homebrew/master/Library/Formula/berkeley-db4.rb &>/dev/null - sudo -u ${SUDO_USER} brew link --force berkeley-db4 &>/dev/null -else - echo "berkeley-db4 already installed" -fi - -tmp=$(mktemp -d) -cd $tmp - -echo "Downloading LBRY update" -git clone --depth 1 https://github.com/jackrobison/lbrynet-app.git &>/dev/null -cd lbrynet-app -unzip LBRY.app.zip &>/dev/null -unzip LBRYURIHandler.app.zip &>/dev/null -unzip LBRY\ Updater.app.zip &>/dev/null - -echo "Installing update" - -mkdir -p "$lbrycrd_directory" -echo $current_version > "${lbrycrd_directory}/lbry_app_version.txt" - -rm -rf /Applications/LBRY.app &>/dev/null -rm -rf /Applications/LBRYURIHandler.app &>/dev/null -rm -rf /Applications/LBRY\ Updater.app &>/dev/null - -mv -f LBRY.app /Applications -mv -f LBRYURIHandler.app /Applications -mv -f LBRY\ Updater.app /Applications - -echo "Cleaning up" - -cd ../../ -rm -rf $tmp \ No newline at end of file diff --git a/lbrynet/lbrynet_daemon/scripts/update_lbrynet.sh b/lbrynet/lbrynet_daemon/scripts/update_lbrynet.sh deleted file mode 100755 index fbb7d2b17..000000000 --- a/lbrynet/lbrynet_daemon/scripts/update_lbrynet.sh +++ /dev/null @@ -1,163 +0,0 @@ -#!/bin/sh - -if ! which brew &>/dev/null; then - echo "Installing brew..." - sudo -u ${SUDO_USER} ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null &>/dev/null -else - echo "Updating brew..." - sudo -u ${SUDO_USER} brew update &>/dev/null -fi - -if ! brew list mpfr &>/dev/null; then - echo "Installing mpfr..." - sudo -u ${SUDO_USER} brew install mpfr &>/dev/null -else - echo "mpfr already installed..." -fi - -if ! brew list libmpc &>/dev/null; then - echo "Installing libmpc..." - sudo -u ${SUDO_USER} brew install libmpc &>/dev/null -else - echo "libmpc already installed..." -fi - -if ! brew list openssl &>/dev/null; then - echo "Installing openssl..." - sudo -u ${SUDO_USER} brew install openssl &>/dev/null - sudo -u ${SUDO_USER} brew link --force openssl &>/dev/null -else - echo "openssl already installed..." -fi - -if ! which pip &>/dev/null; then - echo "Installing pip..." - sudo easy_install pip &>/dev/null -else - echo "pip already installed" -fi - -if ! python -c 'import gmpy' &>/dev/null; then - echo "Installing gmpy..." - sudo pip install gmpy &>/dev/null -else - echo "gmpy already installed..." -fi - -if ! python -c 'import service_identity' &>/dev/null; then - echo "Installing service_identity..." - sudo pip install service_identity &>/dev/null -else - echo "gmpy already installed..." -fi - -if ! python -c 'import rumps' &>/dev/null; then - echo "Installing rumps..." - sudo pip install rumps &>/dev/null -else - echo "rumps already installed..." -fi - -if ! python -c "import six; exit(0) if six.__version__ == '1.9.0' else exit(1)" &>/dev/null; then - echo "Installing six 1.9.0 for python..." - curl -O https://pypi.python.org/packages/source/s/six/six-1.9.0.tar.gz &>/dev/null - tar xf six-1.9.0.tar.gz &>/dev/null - cd six-1.9.0 - sudo python setup.py install &>/dev/null - cd .. - rm -rf six-1.9.0 - rm six-1.9.0.tar.gz -fi - -lbrynet_directory="/Users/${SUDO_USER}/Library/Application Support/lbrynet" -lbryum_current_version=$(git ls-remote https://github.com/lbryio/lbryum.git | grep HEAD | cut -f 1) - -if [ -d "$lbrynet_directory" ]; then - if [ -f "${lbrynet_directory}/lbryum_version.txt" ]; then - if grep -Fxq "$lbryum_current_version" "${lbrynet_directory}/lbryum_version.txt"; then - echo "LBRYum version $lbryum_current_version is up to date" - else - tmp=$(mktemp -d) - cd $tmp - - echo "Downloading LBRYum update..." - - git clone --depth 1 https://github.com/lbryio/lbryum.git &>/dev/null - cd lbryum - - echo "Installing update..." - sudo python setup.py install &>/dev/null - mkdir -p "$lbrynet_directory" - echo $lbryum_current_version > "${lbrynet_directory}/lbryum_version.txt" - - echo "Cleaning up..." - - cd ../../ - rm -rf $tmp - fi - else - tmp=$(mktemp -d) - cd $tmp - - echo "Downloading LBRYum..." - - git clone --depth 1 https://github.com/lbryio/lbryum.git &>/dev/null - cd lbryum - - echo "Installing..." - sudo python setup.py install &>/dev/null - mkdir -p "$lbrynet_directory" - echo $lbryum_current_version > "${lbrynet_directory}/lbryum_version.txt" - - echo "Cleaning up..." - - cd ../../ - rm -rf $tmp - fi -fi - -lbrynet_current_version=$(git ls-remote https://github.com/lbryio/lbry.git | grep HEAD | cut -f 1) - -if [ -d "$lbrynet_directory" ]; then - if [ -f "${lbrynet_directory}/lbrynet_version.txt" ]; then - if grep -Fxq "$lbrynet_current_version" "${lbrynet_directory}/lbrynet_version.txt"; then - echo "LBRYnet version $lbrynet_current_version is up to date" - else - tmp=$(mktemp -d) - cd $tmp - - echo "Downloading LBRYnet update" - - git clone --depth 1 https://github.com/lbryio/lbry.git &>/dev/null - cd lbry - - echo "Installing update..." - sudo python setup.py install &>/dev/null - mkdir -p "$lbrynet_directory" - echo $lbrynet_current_version > "${lbrynet_directory}/lbrynet_version.txt" - - echo "Cleaning up..." - - cd ../../ - rm -rf $tmp - fi - else - tmp=$(mktemp -d) - cd $tmp - - echo "Downloading LBRYnet..." - - git clone --depth 1 https://github.com/lbryio/lbry.git &>/dev/null - cd lbry - - echo "Installing..." - sudo python setup.py install &>/dev/null - mkdir -p "$lbrynet_directory" - echo $lbrynet_current_version > "${lbrynet_directory}/lbrynet_version.txt" - - echo "Cleaning up..." - - cd ../../ - rm -rf $tmp - fi -fi \ No newline at end of file From a55e3d8578c76b929417c16118a0a1d22d939e6e Mon Sep 17 00:00:00 2001 From: Jack Date: Tue, 22 Mar 2016 10:37:13 -0400 Subject: [PATCH 09/13] use UI downloaded to temp folder at startup --- lbrynet/lbrynet_daemon/LBRYDaemon.py | 8 +++++-- lbrynet/lbrynet_daemon/LBRYDaemonControl.py | 25 ++++++++++++++++----- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index 922f3be27..84ca4478b 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -1120,6 +1120,10 @@ class LBRYDaemonCommandHandler(object): class LBRYindex(resource.Resource): + def __init__(self, ui_dir): + resource.Resource.__init__(self) + self.ui_dir = ui_dir + isLeaf = False def _delayed_render(self, request, results): @@ -1136,7 +1140,7 @@ class LBRYindex(resource.Resource): log.info(r) return "
" + ''.join(r) + "" - return static.File("./dist/index.html").render_GET(request) + return static.File(os.path.join(self.ui_dir, "index.html")).render_GET(request) class LBRYFileRender(resource.Resource): @@ -1202,4 +1206,4 @@ class LBRYDaemonWeb(resource.Resource): d.addCallbacks(lambda results: self._delayed_render(request, results), lambda err: self._delayed_render(request, json.dumps({'message': err.getTraceback(), 'code': BAD_REQUEST}))) - return server.NOT_DONE_YET + return server.NOT_DONE_YET \ No newline at end of file diff --git a/lbrynet/lbrynet_daemon/LBRYDaemonControl.py b/lbrynet/lbrynet_daemon/LBRYDaemonControl.py index 89b678f68..ce6540d0c 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemonControl.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemonControl.py @@ -1,5 +1,12 @@ import argparse import logging +import tempfile +import os +import shutil + +from StringIO import StringIO +from zipfile import ZipFile +from urllib import urlopen from twisted.web import server, static from twisted.internet import reactor, defer @@ -38,18 +45,26 @@ def start(): log.info("Starting lbrynet-daemon from command line") + tmpdir = tempfile.mkdtemp() + url = urlopen("https://rawgit.com/lbryio/lbry-web-ui/master/dist.zip") + z = ZipFile(StringIO(url.read())) + z.extractall(tmpdir) + + args = parser.parse_args() daemon = LBRYDaemon() daemon.setup(args.wallet, args.update) - root = LBRYindex() - root.putChild("css", static.File("./css")) - root.putChild("font", static.File("./font")) - root.putChild("img", static.File("./img")) - root.putChild("js", static.File("./js")) + root = LBRYindex(tmpdir) + root.putChild("css", static.File(os.path.join(tmpdir, "css"))) + root.putChild("font", static.File(os.path.join(tmpdir, "font"))) + root.putChild("img", static.File(os.path.join(tmpdir, "img"))) + root.putChild("js", static.File(os.path.join(tmpdir, "js"))) root.putChild(API_ADDRESS, daemon) root.putChild("webapi", LBRYDaemonWeb()) root.putChild("view", LBRYFileRender()) reactor.listenTCP(API_PORT, server.Site(root), interface=API_INTERFACE) reactor.run() + + shutil.rmtree(tmpdir) \ No newline at end of file From 13acbfb64f6eee683d1df4de332418e52fbc096f Mon Sep 17 00:00:00 2001 From: Jack Date: Tue, 22 Mar 2016 11:51:27 -0400 Subject: [PATCH 10/13] update uri handler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -use new jsonrpc daemon, start app if it isn’t running on first lbry:// request --- lbrynet/conf.py | 2 + lbrynet/lbrynet_daemon/Apps/LBRYURIHandler.py | 83 ++++++++++--------- lbrynet/lbrynet_daemon/LBRYDaemon.py | 4 +- setup_uri_handler.py | 2 + 4 files changed, 52 insertions(+), 39 deletions(-) diff --git a/lbrynet/conf.py b/lbrynet/conf.py index 227589def..f3903ae6a 100644 --- a/lbrynet/conf.py +++ b/lbrynet/conf.py @@ -36,6 +36,8 @@ APP_NAME = "LBRY" DEFAULT_WALLET = "lbryum" API_CONNECTION_STRING = "http://%s:%i/%s" % (API_INTERFACE, API_PORT, API_ADDRESS) +UI_ADDRESS = "http://" + API_INTERFACE + ":" + str(API_PORT) + PROTOCOL_PREFIX = "lbry" DEFAULT_TIMEOUT = 30 \ No newline at end of file diff --git a/lbrynet/lbrynet_daemon/Apps/LBRYURIHandler.py b/lbrynet/lbrynet_daemon/Apps/LBRYURIHandler.py index 1cc1bf3f8..1bc8c3399 100644 --- a/lbrynet/lbrynet_daemon/Apps/LBRYURIHandler.py +++ b/lbrynet/lbrynet_daemon/Apps/LBRYURIHandler.py @@ -1,54 +1,61 @@ import os import json import webbrowser -import xmlrpclib, sys +import sys +from time import sleep -def render_video(path): - r = r'
' - return r +from jsonrpc.proxy import JSONRPCProxy +from lbrynet.conf import API_CONNECTION_STRING, UI_ADDRESS -def main(args): - if len(args) == 0: - args.append('lbry://wonderfullife') +class LBRYURIHandler(object): + def __init__(self): + self.started_daemon = False + self.start_timeout = 0 + self.daemon = JSONRPCProxy.from_url(API_CONNECTION_STRING) - daemon = xmlrpclib.ServerProxy('http://localhost:7080/') + def check_status(self): + try: + self.daemon.is_running() - try: - daemon.is_running() - - if len(args) > 1: - exit(1) - - if args[0][7:] == 'lbry': - daemon.render_gui() - - elif args[0][7:] == 'settings': - r = daemon.get_settings() - html = "" + json.dumps(r) + "" - daemon.render_html(html) - - else: - r = daemon.get(args[0][7:]) - if r[0] == 200: - path = r[1]['path'] - if path[0] != '/': - path = '/' + path - - filename = os.path.basename(path) - extension = os.path.splitext(filename)[1] - - if extension in ['mp4', 'flv', 'mov']: - html = render_video(path) - daemon.render_html(html) + except: + if self.started_daemon: + if self.start_timeout < 30: + sleep(1) + self.start_timeout += 1 + self.check_status() else: - webbrowser.get('safari').open('file://' + str(path)) + exit(1) + else: + os.system("open /Applications/LBRY.app") + self.started_daemon = True + self.start_timeout += 1 + self.check_status() + def handle(self, lbry_name): + self.check_status() + + if lbry_name == "lbry": + webbrowser.get('safari').open(UI_ADDRESS) + else: + r = json.loads(self.daemon.get({'name': lbry_name})) + if r['code'] == 200: + path = r['result']['path'].encode('utf-8') + extension = os.path.splitext(path)[1] + if extension in ['mp4', 'flv', 'mov', 'ogv']: + webbrowser.get('safari').open(UI_ADDRESS + "/view?name=" + lbry_name) + else: + webbrowser.get('safari').open('file://' + path) else: webbrowser.get('safari').open('http://lbry.io/get') - except: - webbrowser.get('safari').open('http://lbry.io/get') + +def main(args): + if len(args) != 1: + args = ['lbry://lbry'] + + name = args[0][7:] + LBRYURIHandler().handle(lbry_name=name) if __name__ == "__main__": diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index 84ca4478b..b3e37a1f7 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -1147,7 +1147,9 @@ class LBRYFileRender(resource.Resource): isLeaf = False def _render_path(self, path): - return r'
' + extension = os.path.splitext(path)[1] + if extension in ['mp4', 'flv', 'mov', 'ogv']: + return r'
' def _delayed_render(self, request, results): request.write(str(results)) diff --git a/setup_uri_handler.py b/setup_uri_handler.py index 37a38826e..02f437e64 100644 --- a/setup_uri_handler.py +++ b/setup_uri_handler.py @@ -4,7 +4,9 @@ import os APP = [os.path.join('lbrynet', 'lbrynet_daemon', 'Apps', 'LBRYURIHandler.py')] DATA_FILES = [] OPTIONS = {'argv_emulation': True, + 'packages': ['lbrynet', 'jsonrpc'], 'plist': { + 'LSUIElement': True, 'CFBundleURLTypes': [ { 'CFBundleURLTypes': 'LBRYURIHandler', From 94398071eb389b150e6c2e372c0370865cd94425 Mon Sep 17 00:00:00 2001 From: Jack Date: Wed, 23 Mar 2016 19:49:14 -0400 Subject: [PATCH 11/13] have uri handler check if app is running MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -checks if LBRY.app is running, starts it if it isn’t -delete unused function in LBRYDaemon --- lbrynet/lbrynet_daemon/Apps/LBRYURIHandler.py | 50 +++++++++++++------ lbrynet/lbrynet_daemon/LBRYDaemon.py | 4 -- setup_uri_handler.py | 2 +- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/lbrynet/lbrynet_daemon/Apps/LBRYURIHandler.py b/lbrynet/lbrynet_daemon/Apps/LBRYURIHandler.py index 1bc8c3399..ba62a78a4 100644 --- a/lbrynet/lbrynet_daemon/Apps/LBRYURIHandler.py +++ b/lbrynet/lbrynet_daemon/Apps/LBRYURIHandler.py @@ -3,9 +3,12 @@ import json import webbrowser import sys from time import sleep +import subprocess from jsonrpc.proxy import JSONRPCProxy -from lbrynet.conf import API_CONNECTION_STRING, UI_ADDRESS + +API_CONNECTION_STRING = "http://localhost:5279/lbryapi" +UI_ADDRESS = "http://localhost:5279" class LBRYURIHandler(object): @@ -15,27 +18,42 @@ class LBRYURIHandler(object): self.daemon = JSONRPCProxy.from_url(API_CONNECTION_STRING) def check_status(self): + status = None try: - self.daemon.is_running() - - except: - if self.started_daemon: - if self.start_timeout < 30: - sleep(1) - self.start_timeout += 1 - self.check_status() - else: - exit(1) - else: - os.system("open /Applications/LBRY.app") - self.started_daemon = True + status = json.loads(self.daemon.is_running())['result'] + if self.start_timeout < 30 and not status: + sleep(1) self.start_timeout += 1 self.check_status() + elif status: + return True + else: + exit(1) + except: + if self.start_timeout < 30: + sleep(1) + self.start_timeout += 1 + self.check_status() + else: + exit(1) def handle(self, lbry_name): - self.check_status() + lbry_process = [d for d in subprocess.Popen(['ps','aux'], stdout=subprocess.PIPE).stdout.readlines() + if 'LBRY.app' in d] + try: + status = json.loads(self.daemon.is_running())['result'] + except: + pass - if lbry_name == "lbry": + if lbry_process: + self.check_status() + started = False + else: + os.system("open /Applications/LBRY.app") + self.check_status() + started = True + + if lbry_name == "lbry" or lbry_name == "" and not started: webbrowser.get('safari').open(UI_ADDRESS) else: r = json.loads(self.daemon.get({'name': lbry_name})) diff --git a/lbrynet/lbrynet_daemon/LBRYDaemon.py b/lbrynet/lbrynet_daemon/LBRYDaemon.py index b3e37a1f7..3391e0dcb 100644 --- a/lbrynet/lbrynet_daemon/LBRYDaemon.py +++ b/lbrynet/lbrynet_daemon/LBRYDaemon.py @@ -1136,10 +1136,6 @@ class LBRYindex(resource.Resource): return resource.Resource.getChild(self, name, request) def render_GET(self, request): - def _disp(r): - log.info(r) - return "
" + ''.join(r) + "" - return static.File(os.path.join(self.ui_dir, "index.html")).render_GET(request) diff --git a/setup_uri_handler.py b/setup_uri_handler.py index 02f437e64..1a3c68700 100644 --- a/setup_uri_handler.py +++ b/setup_uri_handler.py @@ -4,7 +4,7 @@ import os APP = [os.path.join('lbrynet', 'lbrynet_daemon', 'Apps', 'LBRYURIHandler.py')] DATA_FILES = [] OPTIONS = {'argv_emulation': True, - 'packages': ['lbrynet', 'jsonrpc'], + 'packages': ['jsonrpc'], 'plist': { 'LSUIElement': True, 'CFBundleURLTypes': [ From 543b327d09696b808c694ff6d5884fa415f183c3 Mon Sep 17 00:00:00 2001 From: Jack Date: Wed, 23 Mar 2016 22:06:04 -0400 Subject: [PATCH 12/13] use only six 1.9 on os x --- setup.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index b032122fb..36000670b 100644 --- a/setup.py +++ b/setup.py @@ -23,13 +23,19 @@ console_scripts = ['lbrynet-console = lbrynet.lbrynet_console.LBRYConsole:launch if sys.platform == 'darwin': console_scripts.append('lbrynet-daemon-status = lbrynet.lbrynet_daemon.LBRYOSXStatusBar:main') +requires = ['pycrypto', 'twisted', 'miniupnpc', 'yapsy', 'seccure', + 'python-bitcoinrpc==0.1', 'txJSON-RPC', 'requests>=2.4.2', 'unqlite==0.2.0', + 'leveldb', 'lbryum', 'jsonrpc', 'simplejson', 'appdirs'] + +if sys.platform == 'darwin': + requires.append('six==1.9.0') +else: + requires.append('six>=1.9.0') setup(name='lbrynet', version='0.0.4', packages=find_packages(), - install_requires=['six>=1.9.0', 'pycrypto', 'twisted', 'miniupnpc', 'yapsy', 'seccure', - 'python-bitcoinrpc==0.1', 'txJSON-RPC', 'requests>=2.4.2', 'unqlite==0.2.0', - 'leveldb', 'lbryum', 'jsonrpc', 'simplejson', 'appdirs'], + install_requires=requires, entry_points={'console_scripts': console_scripts}, data_files=[ ('lbrynet/lbrynet_console/plugins', From e0b00c09ce02266c70f7132e1c170bc12c7b8d03 Mon Sep 17 00:00:00 2001 From: Jack Date: Wed, 23 Mar 2016 22:36:14 -0400 Subject: [PATCH 13/13] fix conflicts --- setup.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/setup.py b/setup.py index 0d34ca21e..d0c995765 100644 --- a/setup.py +++ b/setup.py @@ -7,11 +7,8 @@ import sys import os from setuptools import setup, find_packages -<<<<<<< HEAD -======= base_dir = os.path.abspath(os.path.dirname(__file__)) ->>>>>>> development ez_setup.use_setuptools() console_scripts = ['lbrynet-console = lbrynet.lbrynet_console.LBRYConsole:launch_lbry_console', @@ -26,20 +23,7 @@ console_scripts = ['lbrynet-console = lbrynet.lbrynet_console.LBRYConsole:launch 'lbrynet-announce_hash_to_dht = lbrynet.dht_scripts:announce_hash_to_dht', 'lbrynet-daemon = lbrynet.lbrynet_daemon.LBRYDaemonControl:start', 'stop-lbrynet-daemon = lbrynet.lbrynet_daemon.LBRYDaemonControl:stop'] -<<<<<<< HEAD -======= -requires = ['pycrypto', 'twisted', 'miniupnpc', 'yapsy', 'seccure', - 'python-bitcoinrpc==0.1', 'txJSON-RPC', 'requests>=2.4.2', 'unqlite==0.2.0', - 'leveldb', 'lbryum', 'jsonrpc', 'simplejson', 'appdirs'] ->>>>>>> development - -if sys.platform == 'darwin': - requires.append('six==1.9.0') -else: - requires.append('six>=1.9.0') - -<<<<<<< HEAD requires = ['pycrypto', 'twisted', 'miniupnpc', 'yapsy', 'seccure', 'python-bitcoinrpc==0.1', 'txJSON-RPC', 'requests>=2.4.2', 'unqlite==0.2.0', 'leveldb', 'lbryum', 'jsonrpc', 'simplejson', 'appdirs'] @@ -49,17 +33,12 @@ if sys.platform == 'darwin': else: requires.append('six>=1.9.0') -setup(name='lbrynet', - version='0.0.4', - packages=find_packages(), -======= gui_data_files = ['close2.gif', 'lbry-dark-242x80.gif', 'lbry-dark-icon.xbm', 'lbry-dark-icon.ico', 'drop_down.gif', 'show_options.gif', 'hide_options.gif', 'lbry.conf'] gui_data_paths = [os.path.join(base_dir, 'lbrynet', 'lbrynet_gui', f) for f in gui_data_files] setup(name='lbrynet', version='.'.join([str(x) for x in __version__]), packages=find_packages(base_dir), ->>>>>>> development install_requires=requires, entry_points={'console_scripts': console_scripts}, data_files=[