2016-03-03 00:32:48 +01:00
import locale
2016-02-29 19:25:47 +01:00
import os
import sys
import json
import binascii
import webbrowser
import xmlrpclib
import subprocess
import logging
import argparse
2016-03-02 08:00:45 +01:00
import pwd
2016-03-03 00:32:48 +01:00
import requests
2016-02-29 19:25:47 +01:00
from twisted . web import xmlrpc , server
from twisted . internet import defer , threads , reactor , error
from datetime import datetime
from decimal import Decimal
from StringIO import StringIO
from zipfile import ZipFile
from urllib import urlopen
2016-01-26 02:28:05 +01:00
from lbrynet . core . PaymentRateManager import PaymentRateManager
from lbrynet . core . server . BlobAvailabilityHandler import BlobAvailabilityHandlerFactory
from lbrynet . core . server . BlobRequestHandler import BlobRequestHandlerFactory
from lbrynet . core . server . ServerProtocol import ServerProtocolFactory
from lbrynet . lbrynet_console . ControlHandlers import get_time_behind_blockchain
2016-01-12 18:42:32 +01:00
from lbrynet . core . Error import UnknownNameError
2015-12-06 23:32:17 +01:00
from lbrynet . lbryfile . StreamDescriptor import LBRYFileStreamType
from lbrynet . lbryfile . client . LBRYFileDownloader import LBRYFileSaverFactory , LBRYFileOpenerFactory
from lbrynet . lbryfile . client . LBRYFileOptions import add_lbry_file_to_sd_identifier
2015-12-14 21:54:33 +01:00
from lbrynet . lbrynet_daemon . LBRYDownloader import GetStream , FetcherDaemon
2016-01-21 04:00:28 +01:00
from lbrynet . lbrynet_daemon . LBRYPublisher import Publisher
2015-12-06 23:32:17 +01:00
from lbrynet . core . utils import generate_id
from lbrynet . lbrynet_console . LBRYSettings import LBRYSettings
2016-02-15 16:12:49 +01:00
from lbrynet . conf import MIN_BLOB_DATA_PAYMENT_RATE , DEFAULT_MAX_SEARCH_RESULTS , KNOWN_DHT_NODES , DEFAULT_MAX_KEY_FEE
2016-01-24 06:10:22 +01:00
from lbrynet . core . StreamDescriptor import StreamDescriptorIdentifier , download_sd_blob
2015-12-06 23:32:17 +01:00
from lbrynet . core . Session import LBRYSession
from lbrynet . core . PTCWallet import PTCWallet
2016-02-23 04:32:07 +01:00
from lbrynet . core . LBRYcrdWallet import LBRYcrdWallet , LBRYumWallet
2015-12-06 23:32:17 +01:00
from lbrynet . lbryfilemanager . LBRYFileManager import LBRYFileManager
from lbrynet . lbryfile . LBRYFileMetadataManager import DBLBRYFileMetadataManager , TempLBRYFileMetadataManager
2016-02-23 04:32:07 +01:00
2015-12-14 16:22:52 +01:00
log = logging . getLogger ( __name__ )
2016-02-25 23:17:07 +01:00
# logging.basicConfig(level=logging.DEBUG)
2015-12-06 23:32:17 +01:00
2016-01-17 05:06:24 +01:00
2016-02-16 19:39:08 +01:00
# 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
2016-01-12 00:01:46 +01:00
2015-12-06 23:32:17 +01:00
2016-03-08 18:15:49 +01:00
BAD_REQUEST = ( 400 , " Bad request " )
NOT_FOUND = ( 404 , " Not found " )
OK_CODE = 200
2015-12-06 23:32:17 +01:00
class LBRYDaemon ( xmlrpc . XMLRPC ) :
"""
LBRYnet daemon
"""
2016-02-25 23:17:07 +01:00
def setup ( self , wallet_type , check_for_updates ) :
def _set_vars ( wallet_type , check_for_updates ) :
2015-12-14 18:59:44 +01:00
self . fetcher = None
2015-12-14 16:22:52 +01:00
self . current_db_revision = 1
2015-12-06 23:32:17 +01:00
self . run_server = True
self . session = None
2016-02-15 16:12:49 +01:00
self . known_dht_nodes = KNOWN_DHT_NODES
2016-02-16 19:39:08 +01:00
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 " )
2015-12-06 23:32:17 +01:00
self . blobfile_dir = os . path . join ( self . db_dir , " blobfiles " )
self . peer_port = 3333
self . dht_node_port = 4444
self . first_run = False
if os . name == " nt " :
from lbrynet . winhelpers . knownpaths import get_path , FOLDERID , UserHandle
self . download_directory = get_path ( FOLDERID . Downloads , UserHandle . current )
self . wallet_dir = os . path . join ( get_path ( FOLDERID . RoamingAppData , UserHandle . current ) , " lbrycrd " )
2016-01-07 16:24:55 +01:00
elif sys . platform == " darwin " :
2015-12-06 23:32:17 +01:00
self . download_directory = os . path . join ( os . path . expanduser ( " ~ " ) , ' Downloads ' )
2016-01-07 16:24:55 +01:00
self . wallet_dir = os . path . join ( os . path . expanduser ( " ~ " ) , " Library/Application Support/lbrycrd " )
else :
2015-12-06 23:32:17 +01:00
self . wallet_dir = os . path . join ( os . path . expanduser ( " ~ " ) , " .lbrycrd " )
2016-01-07 16:24:55 +01:00
self . download_directory = os . path . join ( os . path . expanduser ( " ~ " ) , ' Downloads ' )
2015-12-06 23:32:17 +01:00
self . wallet_conf = os . path . join ( self . wallet_dir , " lbrycrd.conf " )
self . wallet_user = None
self . wallet_password = None
self . sd_identifier = StreamDescriptorIdentifier ( )
self . stream_info_manager = TempLBRYFileMetadataManager ( )
self . wallet_rpc_port = 8332
2015-12-08 06:37:49 +01:00
self . downloads = [ ]
2015-12-06 23:32:17 +01:00
self . stream_frames = [ ]
self . default_blob_data_payment_rate = MIN_BLOB_DATA_PAYMENT_RATE
self . use_upnp = True
self . start_lbrycrdd = True
if os . name == " nt " :
self . lbrycrdd_path = " lbrycrdd.exe "
else :
self . lbrycrdd_path = " ./lbrycrdd "
self . delete_blobs_on_remove = True
self . blob_request_payment_rate_manager = None
self . lbry_file_metadata_manager = None
self . lbry_file_manager = None
self . settings = LBRYSettings ( self . db_dir )
2016-02-23 04:32:07 +01:00
self . wallet_type = wallet_type
2016-02-25 23:17:07 +01:00
self . check_for_updates = check_for_updates
2016-01-07 16:24:55 +01:00
self . lbrycrd_conf = os . path . join ( self . wallet_dir , " lbrycrd.conf " )
self . autofetcher_conf = os . path . join ( self . wallet_dir , " autofetcher.conf " )
2015-12-14 16:22:52 +01:00
self . created_data_dir = False
if not os . path . exists ( self . db_dir ) :
os . mkdir ( self . db_dir )
self . created_data_dir = True
2016-01-07 16:24:55 +01:00
self . session_settings = None
2016-02-11 14:32:48 +01:00
self . data_rate = MIN_BLOB_DATA_PAYMENT_RATE
2016-02-15 16:12:49 +01:00
self . max_key_fee = DEFAULT_MAX_KEY_FEE
self . max_search_results = DEFAULT_MAX_SEARCH_RESULTS
2016-02-16 19:39:08 +01:00
self . restart_message = " "
2016-03-03 00:32:48 +01:00
self . startup_message = " "
self . announced_startup = False
2016-02-15 16:12:49 +01:00
self . search_timeout = 3.0
2016-01-26 02:28:05 +01:00
self . query_handlers = { }
2015-12-06 23:32:17 +01:00
return defer . succeed ( None )
2016-01-11 21:52:38 +01:00
def _disp_startup ( ) :
2016-02-16 19:39:08 +01:00
if self . restart_message :
print self . restart_message
else :
print " Started LBRYnet daemon "
print " The daemon can be shut down by running ' stop-lbrynet-daemon ' in a terminal "
2016-02-25 23:17:07 +01:00
log . info ( ' [ ' + str ( datetime . now ( ) ) + ' ] Started lbrynet-daemon ' )
2016-02-16 19:39:08 +01:00
2016-01-11 21:52:38 +01:00
return defer . succeed ( None )
2016-02-25 23:17:07 +01:00
log . info ( ' [ ' + str ( datetime . now ( ) ) + ' ] Starting lbrynet-daemon ' )
2015-12-06 23:32:17 +01:00
d = defer . Deferred ( )
2016-02-25 23:17:07 +01:00
d . addCallback ( lambda _ : _set_vars ( wallet_type , check_for_updates ) )
2015-12-14 16:22:52 +01:00
d . addCallback ( lambda _ : threads . deferToThread ( self . _setup_data_directory ) )
d . addCallback ( lambda _ : self . _check_db_migration ( ) )
2015-12-06 23:32:17 +01:00
d . addCallback ( lambda _ : self . _get_settings ( ) )
2016-01-20 03:07:16 +01:00
d . addCallback ( lambda _ : self . _get_lbrycrdd_path ( ) )
2015-12-06 23:32:17 +01:00
d . addCallback ( lambda _ : self . _get_session ( ) )
d . addCallback ( lambda _ : add_lbry_file_to_sd_identifier ( self . sd_identifier ) )
d . addCallback ( lambda _ : self . _setup_stream_identifier ( ) )
d . addCallback ( lambda _ : self . _setup_lbry_file_manager ( ) )
d . addCallback ( lambda _ : self . _setup_lbry_file_opener ( ) )
2016-01-26 02:28:05 +01:00
d . addCallback ( lambda _ : self . _setup_query_handlers ( ) )
d . addCallback ( lambda _ : self . _setup_server ( ) )
2016-03-03 06:16:51 +01:00
# d.addCallback(lambda _: self._update() if self.check_for_updates == "True" and sys.platform == "darwin"
# else defer.succeed(None))
2015-12-14 18:59:44 +01:00
d . addCallback ( lambda _ : self . _setup_fetcher ( ) )
2016-01-11 21:52:38 +01:00
d . addCallback ( lambda _ : _disp_startup ( ) )
2015-12-06 23:32:17 +01:00
d . callback ( None )
return defer . succeed ( None )
2016-02-16 19:39:08 +01:00
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 )
2016-02-16 19:55:46 +01:00
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 "
2016-02-16 19:39:08 +01:00
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 )
2016-02-16 19:55:46 +01:00
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 "
2016-02-16 19:39:08 +01:00
return defer . succeed ( None )
2016-02-20 05:26:24 +01:00
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 )
2016-02-16 19:39:08 +01:00
d = _check_for_updater ( )
d . addCallback ( lambda _ : _update_lbrynet ( ) )
2016-02-29 19:25:47 +01:00
d . addCallback ( lambda _ : _update_lbrycrdd ( ) if self . wallet_type == ' lbrycrd ' else _update_lbryum ( ) )
2016-02-16 19:39:08 +01:00
d . addCallback ( lambda _ : os . system ( " open /Applications/LBRY \ Updater.app &>/dev/null " ) if self . restart_message
2016-03-03 00:32:48 +01:00
else defer . succeed ( None ) )
2016-02-16 19:39:08 +01:00
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
2016-01-26 02:28:05 +01:00
def _start_server ( self ) :
if self . peer_port is not None :
server_factory = ServerProtocolFactory ( self . session . rate_limiter ,
self . query_handlers ,
self . session . peer_manager )
try :
self . lbry_server_port = reactor . listenTCP ( self . peer_port , server_factory )
except error . CannotListenError as e :
import traceback
log . error ( " Couldn ' t bind to port %d . %s " , self . peer_port , traceback . format_exc ( ) )
raise ValueError ( " %s lbrynet may already be running on your computer. " , str ( e ) )
return defer . succeed ( True )
def _stop_server ( self ) :
if self . lbry_server_port is not None :
self . lbry_server_port , p = None , self . lbry_server_port
return defer . maybeDeferred ( p . stopListening )
else :
return defer . succeed ( True )
def _setup_server ( self ) :
def restore_running_status ( running ) :
if running is True :
return self . _start_server ( )
return defer . succeed ( True )
dl = self . settings . get_server_running_status ( )
dl . addCallback ( restore_running_status )
return dl
def _setup_query_handlers ( self ) :
handlers = [
2016-02-16 19:39:08 +01:00
# CryptBlobInfoQueryHandlerFactory(self.lbry_file_metadata_manager, self.session.wallet,
2016-01-26 02:28:05 +01:00
# self._server_payment_rate_manager),
BlobAvailabilityHandlerFactory ( self . session . blob_manager ) ,
2016-02-16 19:39:08 +01:00
# BlobRequestHandlerFactory(self.session.blob_manager, self.session.wallet,
2016-01-26 02:28:05 +01:00
# self._server_payment_rate_manager),
self . session . wallet . get_wallet_info_query_handler_factory ( ) ,
]
def get_blob_request_handler_factory ( rate ) :
self . blob_request_payment_rate_manager = PaymentRateManager (
self . session . base_payment_rate_manager , rate
)
handlers . append ( BlobRequestHandlerFactory ( self . session . blob_manager , self . session . wallet ,
self . blob_request_payment_rate_manager ) )
d1 = self . settings . get_server_data_payment_rate ( )
d1 . addCallback ( get_blob_request_handler_factory )
dl = defer . DeferredList ( [ d1 ] )
dl . addCallback ( lambda _ : self . _add_query_handlers ( handlers ) )
return dl
def _add_query_handlers ( self , query_handlers ) :
def _set_query_handlers ( statuses ) :
from future_builtins import zip
for handler , ( success , status ) in zip ( query_handlers , statuses ) :
if success is True :
self . query_handlers [ handler ] = status
ds = [ ]
for handler in query_handlers :
ds . append ( self . settings . get_query_handler_status ( handler . get_primary_query_identifier ( ) ) )
dl = defer . DeferredList ( ds )
dl . addCallback ( _set_query_handlers )
return dl
2016-01-11 21:52:38 +01:00
def _shutdown ( self ) :
print ' Closing lbrynet session '
2016-01-26 02:28:05 +01:00
d = self . _stop_server ( )
2016-01-11 21:52:38 +01:00
if self . session is not None :
2016-01-26 02:28:05 +01:00
d . addCallback ( lambda _ : self . session . shut_down ( ) )
2016-01-11 21:52:38 +01:00
return d
2016-01-07 16:24:55 +01:00
def _update_settings ( self ) :
self . data_rate = self . session_settings [ ' data_rate ' ]
self . max_key_fee = self . session_settings [ ' max_key_fee ' ]
2015-12-14 18:59:44 +01:00
def _setup_fetcher ( self ) :
self . fetcher = FetcherDaemon ( self . session , self . lbry_file_manager , self . lbry_file_metadata_manager ,
self . session . wallet , self . sd_identifier , self . autofetcher_conf )
return defer . succeed ( None )
2015-12-14 16:22:52 +01:00
def _setup_data_directory ( self ) :
print " 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 ) )
db_revision . close ( )
log . debug ( " Created the db revision file: %s " , str ( os . path . join ( self . db_dir , " db_revision " ) ) )
if not os . path . exists ( self . blobfile_dir ) :
os . mkdir ( self . blobfile_dir )
log . debug ( " Created the blobfile directory: %s " , str ( self . blobfile_dir ) )
def _check_db_migration ( self ) :
old_revision = 0
db_revision_file = os . path . join ( self . db_dir , " db_revision " )
if os . path . exists ( db_revision_file ) :
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... "
d = threads . deferToThread ( dbmigrator . migrate_db , self . db_dir , old_revision , self . current_db_revision )
def print_success ( old_dirs ) :
success_string = " Finished upgrading the databases. It is now safe to delete the "
success_string + = " following directories, if you feel like it. It won ' t make any "
success_string + = " difference. \n Anyway here they are: "
for i , old_dir in enumerate ( old_dirs ) :
success_string + = old_dir
if i + 1 < len ( old_dir ) :
success_string + = " , "
print success_string
d . addCallback ( print_success )
return d
return defer . succeed ( True )
2015-12-06 23:32:17 +01:00
def _get_settings ( self ) :
d = self . settings . start ( )
d . addCallback ( lambda _ : self . settings . get_lbryid ( ) )
2016-01-26 02:28:05 +01:00
d . addCallback ( self . _set_lbryid )
2016-01-20 03:07:16 +01:00
d . addCallback ( lambda _ : self . _get_lbrycrdd_path ( ) )
2015-12-06 23:32:17 +01:00
return d
2016-01-26 02:28:05 +01:00
def _set_lbryid ( self , lbryid ) :
2015-12-06 23:32:17 +01:00
if lbryid is None :
return self . _make_lbryid ( )
else :
self . lbryid = lbryid
def _make_lbryid ( self ) :
self . lbryid = generate_id ( )
d = self . settings . save_lbryid ( self . lbryid )
return d
def _setup_lbry_file_manager ( self ) :
self . lbry_file_metadata_manager = DBLBRYFileMetadataManager ( self . db_dir )
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 )
return self . lbry_file_manager . setup ( )
d . addCallback ( lambda _ : set_lbry_file_manager ( ) )
return d
def _get_session ( self ) :
def get_default_data_rate ( ) :
d = self . settings . get_default_data_payment_rate ( )
2016-02-16 19:39:08 +01:00
d . addCallback ( lambda rate : { " default_data_payment_rate " : rate if rate is not None else
MIN_BLOB_DATA_PAYMENT_RATE } )
2015-12-06 23:32:17 +01:00
return d
def get_wallet ( ) :
if self . wallet_type == " lbrycrd " :
2016-02-23 04:32:07 +01:00
print " Using lbrycrd wallet "
2016-02-25 23:17:07 +01:00
log . info ( " Using lbrycrd wallet " )
2015-12-06 23:32:17 +01:00
lbrycrdd_path = None
if self . start_lbrycrdd is True :
lbrycrdd_path = self . lbrycrdd_path
if not lbrycrdd_path :
lbrycrdd_path = self . default_lbrycrdd_path
2016-01-07 16:24:55 +01:00
d = defer . succeed ( LBRYcrdWallet ( self . db_dir , wallet_dir = self . wallet_dir , wallet_conf = self . lbrycrd_conf ,
2015-12-06 23:32:17 +01:00
lbrycrdd_path = lbrycrdd_path ) )
2016-02-23 04:32:07 +01:00
elif self . wallet_type == " lbryum " :
print " Using lbryum wallet "
2016-02-25 23:17:07 +01:00
log . info ( " Using lbryum wallet " )
2016-02-23 04:32:07 +01:00
d = defer . succeed ( LBRYumWallet ( self . db_dir ) )
elif self . wallet_type == " ptc " :
print " Using PTC wallet "
2016-02-25 23:17:07 +01:00
log . info ( " Using PTC wallet " )
2015-12-06 23:32:17 +01:00
d = defer . succeed ( PTCWallet ( self . db_dir ) )
2016-02-23 04:32:07 +01:00
else :
d = defer . fail ( )
2015-12-06 23:32:17 +01:00
d . addCallback ( lambda wallet : { " wallet " : wallet } )
return d
d1 = get_default_data_rate ( )
d2 = get_wallet ( )
def combine_results ( results ) :
r = { }
for success , result in results :
if success is True :
r . update ( result )
return r
def create_session ( results ) :
self . session = LBRYSession ( results [ ' default_data_payment_rate ' ] , db_dir = self . db_dir , lbryid = self . lbryid ,
blob_dir = self . blobfile_dir , dht_node_port = self . dht_node_port ,
known_dht_nodes = self . known_dht_nodes , peer_port = self . peer_port ,
use_upnp = self . use_upnp , wallet = results [ ' wallet ' ] )
dl = defer . DeferredList ( [ d1 , d2 ] , fireOnOneErrback = True )
dl . addCallback ( combine_results )
dl . addCallback ( create_session )
dl . addCallback ( lambda _ : self . session . setup ( ) )
2016-03-03 00:32:48 +01:00
dl . addCallback ( lambda _ : self . _check_first_run ( ) )
dl . addCallback ( self . _show_first_run_result )
2015-12-06 23:32:17 +01:00
return dl
2016-03-03 00:32:48 +01:00
def _check_first_run ( self ) :
d = self . session . wallet . check_first_run ( )
d . addCallback ( lambda is_first_run : self . _do_first_run ( ) if is_first_run else 0.0 )
return d
def _do_first_run ( self ) :
d = self . session . wallet . get_new_address ( )
def send_request ( url , data ) :
r = requests . post ( url , json = data )
if r . status_code == 200 :
return r . json ( ) [ ' credits_sent ' ]
return 0.0
def log_error ( err ) :
log . warning ( " unable to request free credits. %s " , err . getErrorMessage ( ) )
return 0.0
def request_credits ( address ) :
url = " http://credreq.lbry.io/requestcredits "
data = { " address " : address }
d = threads . deferToThread ( send_request , url , data )
d . addErrback ( log_error )
return d
d . addCallback ( request_credits )
return d
def _show_first_run_result ( self , credits_received ) :
if credits_received != 0.0 :
points_string = locale . format_string ( " %.2f LBC " , ( round ( credits_received , 2 ) , ) , grouping = True )
self . startup_message = " Thank you for testing the alpha version of LBRY! You have been given %s for free because we love you. Please give them a few minutes to show up while you catch up with our blockchain. " % points_string
else :
self . startup_message = " Connected to LBRYnet "
2016-01-20 03:07:16 +01:00
def _get_lbrycrdd_path ( self ) :
2015-12-06 23:32:17 +01:00
def get_lbrycrdd_path_conf_file ( ) :
lbrycrdd_path_conf_path = os . path . join ( os . path . expanduser ( " ~ " ) , " .lbrycrddpath.conf " )
if not os . path . exists ( lbrycrdd_path_conf_path ) :
return " "
lbrycrdd_path_conf = open ( lbrycrdd_path_conf_path )
lines = lbrycrdd_path_conf . readlines ( )
return lines
d = threads . deferToThread ( get_lbrycrdd_path_conf_file )
def load_lbrycrdd_path ( conf ) :
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
def _setup_stream_identifier ( self ) :
file_saver_factory = LBRYFileSaverFactory ( self . session . peer_finder , self . session . rate_limiter ,
self . session . blob_manager , self . stream_info_manager ,
self . session . wallet , self . download_directory )
self . sd_identifier . add_stream_downloader_factory ( LBRYFileStreamType , file_saver_factory )
file_opener_factory = LBRYFileOpenerFactory ( self . session . peer_finder , self . session . rate_limiter ,
self . session . blob_manager , self . stream_info_manager ,
self . session . wallet )
self . sd_identifier . add_stream_downloader_factory ( LBRYFileStreamType , file_opener_factory )
return defer . succeed ( None )
def _setup_lbry_file_opener ( self ) :
downloader_factory = LBRYFileOpenerFactory ( self . session . peer_finder , self . session . rate_limiter ,
self . session . blob_manager , self . stream_info_manager ,
self . session . wallet )
self . sd_identifier . add_stream_downloader_factory ( LBRYFileStreamType , downloader_factory )
return defer . succeed ( True )
2016-01-20 03:07:16 +01:00
def _download_name ( self , name ) :
def _disp_file ( file ) :
print ' [ ' + str ( datetime . now ( ) ) + ' ] ' + ' Already downloaded: ' + str ( file . stream_hash )
d = self . _path_from_lbry_file ( file )
return d
2015-12-15 03:49:01 +01:00
2016-01-20 03:07:16 +01:00
def _get_stream ( name ) :
def _disp ( stream ) :
print ' [ ' + str ( datetime . now ( ) ) + ' ] ' + ' Start stream: ' + stream [ ' stream_hash ' ]
return stream
2016-01-12 18:42:32 +01:00
2016-01-20 03:07:16 +01:00
d = self . session . wallet . get_stream_info_for_name ( name )
2016-01-12 00:01:46 +01:00
stream = GetStream ( self . sd_identifier , self . session , self . session . wallet , self . lbry_file_manager ,
2016-02-16 19:39:08 +01:00
max_key_fee = self . max_key_fee , data_rate = self . data_rate )
2016-01-20 03:07:16 +01:00
d . addCallback ( _disp )
2016-01-12 00:01:46 +01:00
d . addCallback ( lambda stream_info : stream . start ( stream_info ) )
2016-01-20 03:07:16 +01:00
d . addCallback ( lambda _ : self . _path_from_name ( name ) )
2016-01-12 00:01:46 +01:00
return d
2016-01-20 03:07:16 +01:00
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 ) )
2016-03-08 18:15:49 +01:00
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 )
2015-12-15 03:49:01 +01:00
return d
def _resolve_name ( self , name ) :
d = defer . Deferred ( )
d . addCallback ( lambda _ : self . session . wallet . get_stream_info_for_name ( name ) )
2016-01-20 03:07:16 +01:00
d . addErrback ( lambda _ : defer . fail ( UnknownNameError ) )
2015-12-15 03:49:01 +01:00
return d
2016-01-20 03:07:16 +01:00
def _resolve_name_wc ( self , name ) :
d = defer . Deferred ( )
d . addCallback ( lambda _ : self . session . wallet . get_stream_info_for_name ( name ) )
d . addErrback ( lambda _ : defer . fail ( UnknownNameError ) )
d . callback ( None )
return d
2016-01-12 00:01:46 +01:00
2016-01-20 03:07:16 +01:00
def _check_history ( self , name ) :
def _get_lbry_file ( path ) :
f = open ( path , ' r ' )
l = json . loads ( f . read ( ) )
f . close ( )
file_name = l [ ' stream_name ' ] . decode ( ' hex ' )
2016-02-11 14:32:48 +01:00
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 ]
else :
return None
2016-01-20 03:07:16 +01:00
def _check ( info ) :
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
2016-02-25 23:17:07 +01:00
log . info ( " [ " + str ( datetime . now ( ) ) + " ] Search for lbry_file, returning: " + stream_hash )
2016-01-20 03:07:16 +01:00
return defer . succeed ( _get_lbry_file ( path ) )
2016-01-12 00:01:46 +01:00
else :
2016-02-16 19:39:08 +01:00
print " [ " + str ( datetime . now ( ) ) + " ] Search for lbry_file didn ' t return anything "
2016-02-25 23:17:07 +01:00
log . info ( " [ " + str ( datetime . now ( ) ) + " ] Search for lbry_file didn ' t return anything " )
2016-01-20 03:07:16 +01:00
return defer . succeed ( False )
d = self . _resolve_name ( name )
d . addCallbacks ( _check , lambda _ : False )
d . callback ( None )
return d
def _delete_lbry_file ( self , lbry_file ) :
d = self . lbry_file_manager . delete_lbry_file ( lbry_file )
def finish_deletion ( lbry_file ) :
d = lbry_file . delete_data ( )
d . addCallback ( lambda _ : _delete_stream_data ( lbry_file ) )
2016-03-08 18:15:49 +01:00
d . addCallback ( lambda _ : _delete_file ( lbry_file ) )
2016-01-20 03:07:16 +01:00
return d
2016-01-12 18:42:32 +01:00
2016-01-20 03:07:16 +01:00
def _delete_stream_data ( lbry_file ) :
s_h = lbry_file . stream_hash
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 )
return d
2016-03-08 18:15:49 +01:00
def _delete_file ( lbry_file ) :
os . remove ( os . path . join ( self . download_directory , lbry_file . file_name ) )
2016-01-20 03:07:16 +01:00
d . addCallback ( lambda _ : finish_deletion ( lbry_file ) )
return d
def _path_from_name ( self , name ) :
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 ) }
2016-02-16 19:39:08 +01:00
if lbry_file else defer . fail ( UnknownNameError ) )
2016-01-20 03:07:16 +01:00
return d
def _path_from_lbry_file ( self , lbry_file ) :
if lbry_file :
r = { ' stream_hash ' : lbry_file . stream_hash ,
' path ' : os . path . join ( self . download_directory , lbry_file . file_name ) }
return defer . succeed ( r )
else :
return defer . fail ( UnknownNameError )
2016-01-12 00:01:46 +01:00
2016-01-24 06:10:22 +01:00
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 '
2016-02-25 23:17:07 +01:00
log . info ( ' [ ' + str ( datetime . now ( ) ) + ' ] Cost est for lbry:// ' + name + ' : ' + str ( d . result ) + ' LBC ' )
2016-01-24 06:10:22 +01:00
else :
print ' [ ' + str ( datetime . now ( ) ) + ' ] Timeout estimating cost for lbry:// ' + name + ' , using key fee '
2016-02-25 23:17:07 +01:00
log . info ( ' [ ' + str ( datetime . now ( ) ) + ' ] Timeout estimating cost for lbry:// ' + name + ' , using key fee ' )
2016-01-24 06:10:22 +01:00
d . cancel ( )
return defer . succeed ( None )
def _add_key_fee ( data_cost ) :
d = self . session . wallet . get_stream_info_for_name ( name )
2016-02-15 16:12:49 +01:00
d . addCallback ( lambda info : data_cost + info [ ' key_fee ' ] if ' key_fee ' in info . keys ( ) else data_cost )
2016-01-24 06:10:22 +01:00
return d
d = self . session . wallet . get_stream_info_for_name ( name )
2016-01-26 05:59:57 +01:00
d . addCallback ( lambda info : download_sd_blob ( self . session , info [ ' stream_hash ' ] ,
self . blob_request_payment_rate_manager ) )
2016-01-24 06:10:22 +01:00
d . addCallback ( self . sd_identifier . get_metadata_for_sd_blob )
d . addCallback ( lambda metadata : metadata . validator . info_to_show ( ) )
2016-02-19 02:41:23 +01:00
d . addCallback ( lambda info : int ( dict ( info ) [ ' stream_size ' ] ) / 1000000 * self . data_rate )
2016-01-24 06:10:22 +01:00
d . addCallback ( _add_key_fee )
d . addErrback ( lambda _ : _add_key_fee ( 0.0 ) )
2016-02-15 16:12:49 +01:00
reactor . callLater ( self . search_timeout , _check_est , d , name )
2016-01-24 06:10:22 +01:00
return d
2016-02-19 02:41:23 +01:00
def xmlrpc_is_running ( self ) :
2016-03-03 00:32:48 +01:00
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
2016-02-19 02:41:23 +01:00
2016-01-07 16:24:55 +01:00
def xmlrpc_get_settings ( self ) :
"""
Get LBRY payment settings
2016-01-24 06:10:22 +01:00
@return { ' data_rate ' : float , ' max_key_fee ' : float }
2016-01-07 16:24:55 +01:00
"""
2016-01-12 18:42:32 +01:00
2016-01-07 16:24:55 +01:00
if not self . session_settings :
self . session_settings = { ' data_rate ' : self . data_rate , ' max_key_fee ' : self . max_key_fee }
2016-01-13 15:42:30 +01:00
print ' [ ' + str ( datetime . now ( ) ) + ' ] Get daemon settings '
2016-01-07 16:24:55 +01:00
return self . session_settings
def xmlrpc_set_settings ( self , settings ) :
2016-01-24 06:10:22 +01:00
"""
Set LBRY payment settings
@param settings dict : { ' data_rate ' : float , ' max_key_fee ' : float }
"""
2016-01-07 16:24:55 +01:00
self . session_settings = settings
self . _update_settings ( )
2016-01-13 15:42:30 +01:00
print ' [ ' + str ( datetime . now ( ) ) + ' ] Set daemon settings '
2016-01-07 16:24:55 +01:00
return ' Set '
2015-12-14 18:59:44 +01:00
def xmlrpc_start_fetcher ( self ) :
"""
Start autofetcher
"""
self . fetcher . start ( )
2016-01-13 15:42:30 +01:00
print ' [ ' + str ( datetime . now ( ) ) + ' ] Start autofetcher '
2016-02-25 23:17:07 +01:00
log . info ( ' [ ' + str ( datetime . now ( ) ) + ' ] Start autofetcher ' )
2016-02-11 14:32:48 +01:00
return ' Started autofetching '
2015-12-14 18:59:44 +01:00
def xmlrpc_stop_fetcher ( self ) :
"""
2016-01-24 06:10:22 +01:00
Stop autofetcher
2015-12-14 18:59:44 +01:00
"""
self . fetcher . stop ( )
2016-01-13 15:42:30 +01:00
print ' [ ' + str ( datetime . now ( ) ) + ' ] Stop autofetcher '
2016-02-25 23:17:07 +01:00
log . info ( ' [ ' + str ( datetime . now ( ) ) + ' ] Stop autofetcher ' )
2016-02-11 14:32:48 +01:00
return ' Stopped autofetching '
2015-12-14 18:59:44 +01:00
def xmlrpc_fetcher_status ( self ) :
"""
Start autofetcher
"""
2016-01-13 15:42:30 +01:00
print ' [ ' + str ( datetime . now ( ) ) + ' ] Get fetcher status '
2015-12-14 18:59:44 +01:00
return str ( self . fetcher . check_if_running ( ) )
2015-12-08 06:37:49 +01:00
def xmlrpc_get_balance ( self ) :
2015-12-06 23:32:17 +01:00
"""
Get LBC balance
"""
2015-12-14 18:59:44 +01:00
2016-01-13 15:42:30 +01:00
print ' [ ' + str ( datetime . now ( ) ) + ' ] Get balance '
2015-12-06 23:32:17 +01:00
return str ( self . session . wallet . wallet_balance )
def xmlrpc_stop ( self ) :
"""
2016-01-24 06:10:22 +01:00
Stop lbrynet - daemon
2015-12-06 23:32:17 +01:00
"""
2016-01-11 21:52:38 +01:00
def _disp_shutdown ( ) :
2016-02-25 23:17:07 +01:00
log . info ( ' Shutting down lbrynet daemon ' )
2016-01-11 21:52:38 +01:00
print ' Shutting down lbrynet daemon '
d = self . _shutdown ( )
d . addCallback ( lambda _ : _disp_shutdown ( ) )
2016-01-26 02:28:05 +01:00
d . addCallback ( lambda _ : reactor . callLater ( 1.0 , reactor . stop ) )
2016-01-11 21:52:38 +01:00
2016-01-26 02:28:05 +01:00
return defer . succeed ( ' Shutting down ' )
2015-12-06 23:32:17 +01:00
2015-12-15 03:49:01 +01:00
def xmlrpc_get_lbry_files ( self ) :
"""
Get LBRY files
2016-01-24 06:10:22 +01:00
@return : List of managed LBRY files
2015-12-15 03:49:01 +01:00
"""
2016-01-13 15:42:30 +01:00
r = [ ]
for f in self . lbry_file_manager . lbry_files :
if f . key :
2016-01-17 07:49:17 +01:00
t = { ' completed ' : f . completed , ' file_name ' : f . file_name , ' key ' : binascii . b2a_hex ( f . key ) ,
' points_paid ' : f . points_paid , ' stopped ' : f . stopped , ' stream_hash ' : f . stream_hash ,
' stream_name ' : f . stream_name , ' suggested_file_name ' : f . suggested_file_name ,
' upload_allowed ' : f . upload_allowed }
2016-01-13 15:42:30 +01:00
else :
2016-01-17 07:49:17 +01:00
t = { ' completed ' : f . completed , ' file_name ' : f . file_name , ' key ' : None , ' points_paid ' : f . points_paid ,
' stopped ' : f . stopped , ' stream_hash ' : f . stream_hash , ' stream_name ' : f . stream_name ,
' suggested_file_name ' : f . suggested_file_name , ' upload_allowed ' : f . upload_allowed }
2016-01-13 15:42:30 +01:00
r . append ( json . dumps ( t ) )
print ' [ ' + str ( datetime . now ( ) ) + ' ] Get LBRY files '
return r
2015-12-15 03:49:01 +01:00
2015-12-06 23:32:17 +01:00
def xmlrpc_resolve_name ( self , name ) :
"""
Resolve stream info from a LBRY uri
2015-12-15 03:49:01 +01:00
@param : name
2016-01-24 06:10:22 +01:00
@return : info for name claim
2015-12-06 23:32:17 +01:00
"""
def _disp ( info ) :
2016-01-20 03:07:16 +01:00
print ' [ ' + str ( datetime . now ( ) ) + ' ] ' + ' Resolved info: ' + str ( info [ ' stream_hash ' ] )
2015-12-06 23:32:17 +01:00
return info
2016-01-20 03:07:16 +01:00
d = self . _resolve_name ( name )
2016-01-12 18:42:32 +01:00
d . addCallbacks ( _disp , lambda _ : str ( ' UnknownNameError ' ) )
2015-12-06 23:32:17 +01:00
d . callback ( None )
return d
2016-01-20 03:07:16 +01:00
def xmlrpc_get ( self , name ) :
2015-12-06 23:32:17 +01:00
"""
Download stream from a LBRY uri
2015-12-15 03:49:01 +01:00
@param : name
2016-01-24 06:10:22 +01:00
@return : { ' stream_hash ' : hex string , ' path ' : path of download }
2015-12-06 23:32:17 +01:00
"""
2016-01-24 06:26:41 +01:00
if name :
d = self . _download_name ( name )
else :
2016-03-08 18:15:49 +01:00
d = defer . succeed ( BAD_REQUEST )
2015-12-08 06:37:49 +01:00
return d
2016-01-20 03:07:16 +01:00
def xmlrpc_stop_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 ]
except IndexError :
return defer . fail ( UnknownNameError )
2015-12-15 03:49:01 +01:00
2016-01-20 03:07:16 +01:00
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 ) )
return d
else :
return defer . succeed ( ' Stream was already stopped ' )
2015-12-15 03:49:01 +01:00
2016-01-20 03:07:16 +01:00
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 ]
except IndexError :
return defer . fail ( UnknownNameError )
2015-12-15 03:49:01 +01:00
2016-01-20 03:07:16 +01:00
if lbry_file . stopped :
d = self . lbry_file_manager . toggle_lbry_file_running ( lbry_file )
d . callback ( None )
return defer . succeed ( ' Stream started ' )
else :
return defer . succeed ( ' Stream was already running ' )
2015-12-15 03:49:01 +01:00
2016-01-17 05:06:24 +01:00
def xmlrpc_render_html ( self , html ) :
2016-01-24 06:10:22 +01:00
"""
Writes html to lbry . html in the downloads directory , then opens it with the browser
@param html :
"""
2016-01-17 05:06:24 +01:00
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 ) )
2016-03-02 08:00:45 +01:00
d . addCallback ( lambda _ : os . chown ( path , pwd . getpwuid ( os . getuid ( ) ) . pw_uid , pwd . getpwuid ( os . getuid ( ) ) . pw_gid ) )
2016-01-17 05:06:24 +01:00
d . addCallback ( lambda _ : webbrowser . open ( ' file:// ' + path ) )
d . addErrback ( _disp_err )
d . callback ( None )
return d
def xmlrpc_render_gui ( self ) :
2016-01-24 06:10:22 +01:00
"""
Opens the lbry web ui in a browser
"""
2016-01-17 05:06:24 +01:00
def _disp_err ( err ) :
print str ( err . getTraceback ( ) )
return err
2016-02-16 19:39:08 +01:00
2016-01-17 05:06:24 +01:00
d = defer . Deferred ( )
2016-03-08 18:15:49 +01:00
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 " ) ) ) )
2016-01-17 05:06:24 +01:00
d . addErrback ( _disp_err )
d . callback ( None )
return d
def xmlrpc_search_nametrie ( self , search ) :
2016-01-24 06:10:22 +01:00
"""
Search the nametrie for claims beginning with search
@param search :
@return :
"""
2016-01-17 05:06:24 +01:00
def _clean ( n ) :
t = [ ]
for i in n :
if i [ 0 ] :
2016-01-24 06:10:22 +01:00
if i [ 1 ] [ 0 ] [ 0 ] and i [ 1 ] [ 1 ] [ 0 ] and i [ 1 ] [ 2 ] [ 0 ] :
2016-01-17 05:06:24 +01:00
i [ 1 ] [ 0 ] [ 1 ] [ ' value ' ] = str ( i [ 1 ] [ 0 ] [ 1 ] [ ' value ' ] )
2016-01-24 06:10:22 +01:00
t . append ( [ i [ 1 ] [ 0 ] [ 1 ] , i [ 1 ] [ 1 ] [ 1 ] , i [ 1 ] [ 2 ] [ 1 ] ] )
2016-01-17 05:06:24 +01:00
return t
def _parse ( results ) :
f = [ ]
2016-01-24 06:10:22 +01:00
for chain , meta , cost_est in results :
2016-01-17 05:06:24 +01:00
t = { }
if ' name ' in chain . keys ( ) :
t [ ' name ' ] = chain [ ' name ' ]
if ' thumbnail ' in meta . keys ( ) :
t [ ' img ' ] = meta [ ' thumbnail ' ]
2016-01-24 06:10:22 +01:00
else :
2016-02-16 19:39:08 +01:00
t [ ' img ' ] = ' File:// ' + str (
os . path . join ( self . download_directory , " lbryio/web/img/Free-speech-flag.svg " ) )
2016-01-17 05:06:24 +01:00
if ' name ' in meta . keys ( ) :
t [ ' title ' ] = meta [ ' name ' ]
if ' description ' in meta . keys ( ) :
t [ ' description ' ] = meta [ ' description ' ]
2016-01-24 06:10:22 +01:00
t [ ' cost_est ' ] = cost_est
2016-01-17 05:06:24 +01:00
f . append ( t )
return f
2016-02-17 05:10:26 +01:00
def resolve_claims ( claims ) :
ds = [ ]
for claim in claims :
d1 = defer . succeed ( claim )
d2 = self . _resolve_name_wc ( claim [ ' name ' ] )
d3 = self . _get_est_cost ( claim [ ' name ' ] )
dl = defer . DeferredList ( [ d1 , d2 , d3 ] , consumeErrors = True )
ds . append ( dl )
return defer . DeferredList ( ds )
2016-01-17 05:06:24 +01:00
def _disp ( results ) :
print ' [ ' + str ( datetime . now ( ) ) + ' ] Found ' + str ( len ( results ) ) + ' results '
2016-02-25 23:17:07 +01:00
log . info ( ' [ ' + str ( datetime . now ( ) ) + ' ] Search results: ' )
for r in results :
log . info ( str ( r ) )
2016-01-17 05:06:24 +01:00
return results
print ' [ ' + str ( datetime . now ( ) ) + ' ] Search nametrie: ' + search
2016-02-25 23:17:07 +01:00
log . info ( ' [ ' + str ( datetime . now ( ) ) + ' ] Search nametrie: ' + search )
2016-01-17 05:06:24 +01:00
2016-02-17 05:10:26 +01:00
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 claims : claims [ : self . max_search_results ] )
d . addCallback ( resolve_claims )
2016-01-17 05:06:24 +01:00
d . addCallback ( _clean )
d . addCallback ( _parse )
d . addCallback ( _disp )
return d
2016-01-20 03:07:16 +01:00
def xmlrpc_delete_lbry_file ( self , file_name ) :
def _disp ( file_name ) :
print ' [ ' + str ( datetime . now ( ) ) + ' ] Deleted: ' + file_name
2016-02-11 14:32:48 +01:00
return defer . succeed ( ' Deleted: ' + file_name )
2016-01-20 03:07:16 +01:00
lbry_files = [ self . _delete_lbry_file ( f ) for f in self . lbry_file_manager . lbry_files if file_name == f . file_name ]
d = defer . DeferredList ( lbry_files )
d . addCallback ( lambda _ : _disp ( 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 ) )
return d
2016-01-21 04:00:28 +01:00
def xmlrpc_publish ( self , metadata ) :
2016-03-08 18:15:49 +01:00
try :
metadata = json . loads ( metadata )
except :
return defer . succeed ( BAD_REQUEST )
2016-01-21 04:00:28 +01:00
required = [ ' name ' , ' file_path ' , ' bid ' ]
for r in required :
if not r in metadata . keys ( ) :
2016-03-08 18:15:49 +01:00
return defer . succeed ( BAD_REQUEST )
2016-01-21 04:00:28 +01:00
# if not os.path.isfile(metadata['file_path']):
# return defer.fail()
2016-01-27 17:02:57 +01:00
if not isinstance ( metadata [ ' bid ' ] , float ) and metadata [ ' bid ' ] > 0.0 :
2016-01-21 04:00:28 +01:00
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 ( ) :
2016-01-24 06:10:22 +01:00
if not float ( metadata [ ' key_fee ' ] ) == 0.0 :
if not ' key_fee_address ' in metadata . keys ( ) :
return defer . fail ( )
2016-01-21 04:00:28 +01:00
key_fee = metadata [ ' key_fee ' ]
else :
2016-01-24 06:10:22 +01:00
key_fee = 0.0
2016-01-21 04:00:28 +01:00
if ' key_fee_address ' in metadata . keys ( ) :
key_fee_address = metadata [ ' key_fee_address ' ]
else :
key_fee_address = None
2016-01-24 06:10:22 +01:00
if ' content_license ' in metadata . keys ( ) :
content_license = metadata [ ' content_license ' ]
else :
content_license = None
2016-02-25 23:17:07 +01:00
log . info ( ' [ ' + str ( datetime . now ( ) ) + ' ] Publish: ' , name , file_path , bid , title , description , thumbnail ,
2016-03-03 00:32:48 +01:00
key_fee , key_fee_address , content_license )
2016-02-25 23:17:07 +01:00
2016-01-21 04:00:28 +01:00
p = Publisher ( self . session , self . lbry_file_manager , self . session . wallet )
2016-01-24 06:10:22 +01:00
d = p . start ( name , file_path , bid , title , description , thumbnail , key_fee , key_fee_address , content_license )
2016-03-08 18:15:49 +01:00
d . addCallback ( lambda msg : ( OK_CODE , msg ) )
2016-01-21 04:00:28 +01:00
return d
2015-12-06 23:32:17 +01:00
2016-01-26 02:28:05 +01:00
def xmlrpc_abandon_name ( self , txid ) :
def _disp ( txid , tx ) :
print ' [ ' + str ( datetime . now ( ) ) + ' ] Spent coins from claim tx ' + txid + ' --> ' + tx
return tx
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 . callback ( None )
return d
def xmlrpc_get_name_claims ( self ) :
def _clean ( claims ) :
for c in claims :
for k in c . keys ( ) :
2016-02-11 14:32:48 +01:00
if isinstance ( c [ k ] , Decimal ) :
2016-01-26 02:28:05 +01:00
c [ k ] = float ( c [ k ] )
return claims
d = self . session . wallet . get_name_claims ( )
d . addCallback ( _clean )
return d
def xmlrpc_get_time_behind_blockchain ( self ) :
d = self . session . wallet . get_most_recent_blocktime ( )
d . addCallback ( get_time_behind_blockchain )
return d
2016-02-25 23:17:07 +01:00
def xmlrpc_get_new_address ( self ) :
def _disp ( address ) :
print " [ " + str ( datetime . now ( ) ) + " ] Got new wallet address: " + address
return address
d = self . session . wallet . get_new_address ( )
d . addCallback ( _disp )
return d
2016-02-11 14:32:48 +01:00
# def xmlrpc_update_name(self, metadata):
# def _disp(x):
# print x
# return x
#
# metadata = json.loads(metadata)
#
# required = ['name', 'file_path', 'bid']
#
# for r in required:
# if not r in metadata.keys():
# return defer.fail()
#
# d = defer.Deferred()
# d.addCallback(lambda _: self.session.wallet.update_name(metadata))
# d.addCallback(_disp)
# d.callback(None)
#
# return d
2016-01-27 17:02:57 +01:00
def xmlrpc_toggle_fetcher_verbose ( self ) :
if self . fetcher . verbose :
self . fetcher . verbose = False
else :
self . fetcher . verbose = True
return self . fetcher . verbose
2016-02-16 20:48:10 +01:00
def xmlrpc_check_for_new_version ( self ) :
2016-03-03 00:32:48 +01:00
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
if os . path . isfile ( package [ ' version_file ' ] ) :
f = open ( package [ ' version_file ' ] , ' r ' )
current_version = f . read ( )
f . close ( )
2016-02-16 20:48:10 +01:00
2016-03-03 00:32:48 +01:00
if git_version == current_version :
r = package [ ' name ' ] + " is up to date "
up_to_date = True
else :
r = package [ ' name ' ] + " version is out of date "
2016-02-16 20:48:10 +01:00
else :
2016-03-03 00:32:48 +01:00
r = " Unknown version of " + package [ ' name ' ]
return ( up_to_date , r )
package_infos = {
" lbrynet " : { " name " : " LBRYnet " ,
" git " : " https://github.com/lbryio/lbry.git " ,
" version_file " : os . path . join ( self . db_dir , " .lbrynet_version " ) ,
" clone " : " .lbrygit " ,
} ,
" lbryum " : { " name " : " lbryum " ,
" git " : " https://github.com/lbryio/lbryum.git " ,
" version_file " : os . path . join ( self . db_dir , " .lbryum_version " ) ,
" clone " : " .lbryumgit " ,
} ,
" lbry " : { " name " : " LBRY " ,
" git " : " https://github.com/jackrobison/lbrynet-app.git " ,
" version_file " : os . path . join ( self . db_dir , " .lbry_app_version " ) ,
" clone " : None ,
} ,
}
return [ _check_for_updates ( package_infos [ p ] ) for p in package_infos . keys ( ) ]
2016-01-24 06:10:22 +01:00
2016-02-29 19:25:47 +01:00
def xmlrpc_start_status_bar_app ( self ) :
if sys . platform == ' darwin ' :
2016-03-03 00:32:48 +01:00
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 "
2016-02-29 19:25:47 +01:00
else :
return " Status bar not implemented on non OS X "
2016-03-08 18:15:49 +01:00
def xmlrpc___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 ' ]
2016-02-29 19:25:47 +01:00
def stop ( ) :
daemon = xmlrpclib . ServerProxy ( " http://localhost:7080/ " )
try :
status = daemon . is_running ( )
except :
status = False
if status :
daemon . stop ( )
print " LBRYnet daemon stopped "
else :
print " LBRYnet daemon wasn ' t running "
2016-02-19 02:41:23 +01:00
2016-02-19 06:07:19 +01:00
def main ( ) :
2016-02-23 04:32:07 +01:00
parser = argparse . ArgumentParser ( description = " Launch lbrynet-daemon " )
parser . add_argument ( " --wallet " ,
2016-02-25 23:17:07 +01:00
help = " lbrycrd or lbryum, default lbryum " ,
2016-02-23 04:32:07 +01:00
type = str ,
default = " lbryum " )
2016-02-25 23:17:07 +01:00
parser . add_argument ( " --update " ,
help = " True or false, default true " ,
type = str ,
default = " True " )
2016-02-23 04:32:07 +01:00
args = parser . parse_args ( )
2016-02-19 06:07:19 +01:00
try :
2016-02-23 04:32:07 +01:00
daemon = xmlrpclib . ServerProxy ( " http://localhost:7080 " )
daemon . stop ( )
2016-02-19 06:07:19 +01:00
except :
pass
2015-12-06 23:32:17 +01:00
2016-02-19 06:07:19 +01:00
daemon = LBRYDaemon ( )
2016-02-25 23:17:07 +01:00
daemon . setup ( args . wallet , args . update )
2016-02-27 19:19:26 +01:00
reactor . listenTCP ( 7080 , server . Site ( daemon ) , interface = ' localhost ' )
2016-02-19 06:07:19 +01:00
reactor . run ( )
2016-02-19 02:45:16 +01:00
2016-02-29 19:25:47 +01:00
2015-12-06 23:32:17 +01:00
if __name__ == ' __main__ ' :
2016-02-23 04:32:07 +01:00
main ( )