diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 2403b07bd..45fd93f17 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.9.1rc4 +current_version = 0.9.1 commit = True tag = True parse = (?P\d+)\.(?P\d+)\.(?P\d+)((?P[a-z]+)(?P\d+))? diff --git a/CHANGELOG.md b/CHANGELOG.md index 927899060..f41a29a2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,19 +9,35 @@ at anytime. ## [Unreleased] ### Added - * publish API command can take metadata fields as arguments + * Add `wallet_list` command * * ### Changed - * + * Dont add expected payment to wallet when payment rate is 0 * * ### Fixed + * Fixed descriptor_get * Fixed jsonrpc_reflect() * Fixed api help return * Fixed API command descriptor_get + * + * + * + +## [0.9.1] - 2017-03-17 +### Fixed + * Fix wallet_public_key API command + +## [0.9.1rc5] - 2017-03-16 +### Added + * publish API command can take metadata fields as arguments + * Added `reflect_uploads` config to disable reflecting on upload +### Fixed + * Fixed jsonrpc_reflect() + * Fixed api help return ## [0.9.1rc2] - 2017-03-15 ### Added diff --git a/docs/index.md b/docs/index.md index bc7d73f05..50a0978a3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -633,8 +633,9 @@ Returns: Get public key from wallet address Args: - 'wallet': (str) wallet address in base58 + 'address': (str) wallet address in base58 Returns: - (str) Public key in hex encoding + (list) list of public keys associated with address. + Could contain more than one public key if multisig. ``` diff --git a/lbrynet/__init__.py b/lbrynet/__init__.py index d50eb6e41..3d613ea02 100644 --- a/lbrynet/__init__.py +++ b/lbrynet/__init__.py @@ -1,6 +1,6 @@ import logging -__version__ = "0.9.1rc4" +__version__ = "0.9.1" version = tuple(__version__.split('.')) logging.getLogger(__name__).addHandler(logging.NullHandler()) diff --git a/lbrynet/analytics/api.py b/lbrynet/analytics/api.py index 546f93b30..67381c8e4 100644 --- a/lbrynet/analytics/api.py +++ b/lbrynet/analytics/api.py @@ -19,9 +19,10 @@ def log_response(fn): elif future.exception(): exc, traceback = future.exception_info() log.warning('Failed to send an analytics event', exc_info=(type(exc), exc, traceback)) - else: - response = future.result() - log.debug('Response (%s): %s', response.status_code, response.content) + # GRIN TURNED THIS OFF. Segment only has one response: {"success": true} + # else: + # response = future.result() + # log.debug('Response (%s): %s', response.status_code, response.content) @functools.wraps(fn) def wrapper(*args, **kwargs): diff --git a/lbrynet/conf.py b/lbrynet/conf.py index 76ac1623a..1dc2b6b3c 100644 --- a/lbrynet/conf.py +++ b/lbrynet/conf.py @@ -192,7 +192,7 @@ ADJUSTABLE_SETTINGS = { 'peer_port': (int, 3333), 'pointtrader_server': (str, 'http://127.0.0.1:2424'), 'reflector_port': (int, 5566), - 'reflector_reupload': (bool, True), + 'reflect_uploads': (bool, True), 'reflector_servers': (list, [('reflector.lbry.io', 5566)], server_port), 'run_on_startup': (bool, False), 'run_reflector_server': (bool, False), diff --git a/lbrynet/core/Wallet.py b/lbrynet/core/Wallet.py index 0937498f4..11a30a05f 100644 --- a/lbrynet/core/Wallet.py +++ b/lbrynet/core/Wallet.py @@ -1101,8 +1101,13 @@ class LBRYumWallet(Wallet): def _address_is_mine(self, address): return self._run_cmd_as_defer_succeed('ismine', address) - def get_pub_keys(self, wallet): - return self._run_cmd_as_defer_succeed('getpubkyes', wallet) + # returns a list of public keys associated with address + # (could be multiple public keys if a multisig address) + def get_pub_keys(self, address): + return self._run_cmd_as_defer_succeed('getpubkeys', address) + + def list_addresses(self): + return self._run_cmd_as_defer_succeed('listaddresses') def _save_wallet(self, val): self.wallet.storage.write() diff --git a/lbrynet/core/server/BlobRequestHandler.py b/lbrynet/core/server/BlobRequestHandler.py index a47985bd8..4cce9fb59 100644 --- a/lbrynet/core/server/BlobRequestHandler.py +++ b/lbrynet/core/server/BlobRequestHandler.py @@ -5,12 +5,10 @@ from twisted.protocols.basic import FileSender from twisted.python.failure import Failure from zope.interface import implements - from lbrynet.core.Offer import Offer from lbrynet import analytics from lbrynet.interfaces import IQueryHandlerFactory, IQueryHandler, IBlobSender - log = logging.getLogger(__name__) @@ -212,11 +210,14 @@ class BlobRequestHandler(object): def set_expected_payment(): log.debug("Setting expected payment") - if self.blob_bytes_uploaded != 0 and self.blob_data_payment_rate is not None: + if ( + self.blob_bytes_uploaded != 0 and self.blob_data_payment_rate is not None + and self.blob_data_payment_rate > 0 + ): # TODO: explain why 2**20 self.wallet.add_expected_payment(self.peer, self.currently_uploading.length * 1.0 * - self.blob_data_payment_rate / 2**20) + self.blob_data_payment_rate / 2 ** 20) self.blob_bytes_uploaded = 0 self.peer.update_stats('blobs_uploaded', 1) return None diff --git a/lbrynet/lbryfilemanager/EncryptedFileManager.py b/lbrynet/lbryfilemanager/EncryptedFileManager.py index a6a68a11c..4cba9d80d 100644 --- a/lbrynet/lbryfilemanager/EncryptedFileManager.py +++ b/lbrynet/lbryfilemanager/EncryptedFileManager.py @@ -17,6 +17,7 @@ from lbrynet.lbryfile.StreamDescriptor import EncryptedFileStreamType from lbrynet.cryptstream.client.CryptStreamDownloader import AlreadyStoppedError from lbrynet.cryptstream.client.CryptStreamDownloader import CurrentlyStoppingError from lbrynet.core.sqlite_helpers import rerun_if_locked +from lbrynet import conf log = logging.getLogger(__name__) @@ -57,7 +58,8 @@ class EncryptedFileManager(object): yield self._open_db() yield self._add_to_sd_identifier() yield self._start_lbry_files() - safe_start_looping_call(self.lbry_file_reflector) + if conf.settings['reflect_uploads']: + safe_start_looping_call(self.lbry_file_reflector) def get_lbry_file_status(self, lbry_file): return self._get_lbry_file_status(lbry_file.rowid) diff --git a/lbrynet/lbrynet_daemon/Daemon.py b/lbrynet/lbrynet_daemon/Daemon.py index 908153fcf..2365f54c0 100644 --- a/lbrynet/lbrynet_daemon/Daemon.py +++ b/lbrynet/lbrynet_daemon/Daemon.py @@ -774,9 +774,10 @@ class Daemon(AuthJSONRPCServer): claim_out = yield publisher.update_stream(name, bid, metadata) else: claim_out = yield publisher.publish_stream(name, file_path, bid, metadata) - d = reupload.reflect_stream(publisher.lbry_file) - d.addCallbacks(lambda _: log.info("Reflected new publication to lbry://%s", name), - log.exception) + if conf.settings['reflect_uploads']: + d = reupload.reflect_stream(publisher.lbry_file) + d.addCallbacks(lambda _: log.info("Reflected new publication to lbry://%s", name), + log.exception) log.info("Success! Published to lbry://%s txid: %s nout: %d", name, claim_out['txid'], claim_out['nout']) yield self._add_to_pending_claims(claim_out, name) @@ -1217,29 +1218,11 @@ class Daemon(AuthJSONRPCServer): """ Get daemon settings - Args: - None Returns: (dict) Dictionary of daemon settings - { - 'run_on_startup': (bool) currently not supported - 'data_rate': (float) data rate - 'max_key_fee': (float) maximum key fee - 'download_directory': (str) path of where files are downloaded - 'max_upload': (float), currently not supported - 'max_download': (float), currently not supported - 'download_timeout': (int) download timeout in seconds - 'max_search_results': (int) max search results - 'wallet_type': (str) wallet type - 'delete_blobs_on_remove': (bool) delete blobs on removal - 'peer_port': (int) peer port - 'dht_node_port': (int) dht node port - 'use_upnp': (bool) use upnp if true - } + See ADJUSTABLE_SETTINGS in lbrynet/conf.py for full list of settings """ - - log.info("Get daemon settings") - return self._render_response(conf.settings.get_current_settings_dict()) + return self._render_response(conf.settings.get_adjustable_settings_dict()) @AuthJSONRPCServer.auth_required def jsonrpc_set_settings(self, **kwargs): @@ -1249,6 +1232,7 @@ class Daemon(AuthJSONRPCServer): return self.jsonrpc_settings_set(**kwargs) @AuthJSONRPCServer.auth_required + @defer.inlineCallbacks def jsonrpc_settings_set(self, **kwargs): """ Set daemon settings @@ -1261,22 +1245,14 @@ class Daemon(AuthJSONRPCServer): 'max_upload': (float), currently not supported 'max_download': (float), currently not supported 'download_timeout': (int) download timeout in seconds + 'search_timeout': (float) search timeout in seconds + 'cache_time': (int) cache timeout in seconds Returns: - (dict) settings dict + (dict) Updated dictionary of daemon settings """ - def _log_settings_change(): - log.info( - "Set daemon settings to %s", - json.dumps(conf.settings.get_adjustable_settings_dict())) - - d = self._update_settings(kwargs) - d.addErrback(lambda err: log.info(err.getTraceback())) - d.addCallback(lambda _: _log_settings_change()) - d.addCallback( - lambda _: self._render_response(conf.settings.get_adjustable_settings_dict())) - - return d + yield self._update_settings(kwargs) + defer.returnValue(conf.settings.get_adjustable_settings_dict()) def jsonrpc_help(self, command=None): """ @@ -2005,18 +1981,36 @@ class Daemon(AuthJSONRPCServer): return self.jsonrpc_wallet_public_key(wallet) @AuthJSONRPCServer.auth_required - def jsonrpc_wallet_public_key(self, wallet): + def jsonrpc_wallet_public_key(self, address): """ Get public key from wallet address Args: - 'wallet': (str) wallet address in base58 + 'address': (str) wallet address in base58 Returns: - (str) Public key in hex encoding + (list) list of public keys associated with address. + Could contain more than one public key if multisig. """ - d = self.session.wallet.get_pub_keys(wallet) + d = self.session.wallet.get_pub_keys(address) d.addCallback(lambda r: self._render_response(r)) + return d + + @AuthJSONRPCServer.auth_required + @defer.inlineCallbacks + def jsonrpc_wallet_list(self): + """ + List wallet addresses + + Args: + None + Returns: + List of wallet addresses + """ + + addresses = yield self.session.wallet.list_addresses() + response = yield self._render_response(addresses) + defer.returnValue(response) @AuthJSONRPCServer.auth_required def jsonrpc_get_new_address(self): diff --git a/lbrynet/lbrynet_daemon/DaemonCLI.py b/lbrynet/lbrynet_daemon/DaemonCLI.py index 18b7682bd..fd3bd9ad4 100644 --- a/lbrynet/lbrynet_daemon/DaemonCLI.py +++ b/lbrynet/lbrynet_daemon/DaemonCLI.py @@ -64,8 +64,7 @@ def main(): os.path.basename(sys.argv[0])) ) else: - help_response = api.call('help', params) - print help_response['help'] if 'help' in help_response else help_response + print_help_response(api.call('help', params)) elif method not in api.commands(): print_error("'" + method + "' is not a valid command.") @@ -84,13 +83,16 @@ def main(): # instead of this generic message. # https://app.asana.com/0/158602294500137/200173944358192 print "Something went wrong, here's the usage for %s:" % method - print api.call('help', {'command': method}) + print_help_response(api.call('help', {'command': method})) if hasattr(err, 'msg'): print "Here's the traceback for the error you encountered:" print err.msg return 1 +def print_help_response(help_response): + print help_response['help'] if 'help' in help_response else help_response + def guess_type(x): if '.' in x: try: diff --git a/scripts/encrypt_blob.py b/scripts/encrypt_blob.py index 3408f9023..440ea7a8d 100644 --- a/scripts/encrypt_blob.py +++ b/scripts/encrypt_blob.py @@ -2,7 +2,6 @@ import argparse import binascii import logging -import os import StringIO import sys @@ -11,7 +10,6 @@ from twisted.internet import reactor from lbrynet import conf from lbrynet.cryptstream import CryptBlob -from lbrynet.core import HashBlob from lbrynet.core import log_support from lbrynet.core import cryptoutils diff --git a/scripts/query_available_blobs.py b/scripts/query_available_blobs.py index 61445f4ba..727c019c8 100644 --- a/scripts/query_available_blobs.py +++ b/scripts/query_available_blobs.py @@ -3,7 +3,6 @@ from lbrynet.core import log_support import argparse import collections -import itertools import logging import os import random @@ -11,25 +10,15 @@ import shutil import sys import tempfile -import appdirs from twisted.internet import defer from twisted.internet import reactor -from twisted.internet import protocol -from twisted.internet import endpoints from lbrynet import analytics from lbrynet import conf -from lbrynet.core import Error from lbrynet.core import Wallet from lbrynet.core import BlobAvailability -from lbrynet.core import HashAnnouncer -from lbrynet.core import PeerManager from lbrynet.core import Session from lbrynet.core import utils -from lbrynet.core.client import DHTPeerFinder -from lbrynet.dht import node -from lbrynet.metadata import Metadata -from lbrynet.core import StreamDescriptor as sd import common import name