4444from lbry .extras import system_info
4545from lbry .extras .daemon import analytics
4646from lbry .extras .daemon .components import WALLET_COMPONENT , DATABASE_COMPONENT , DHT_COMPONENT , BLOB_COMPONENT
47- from lbry .extras .daemon .components import FILE_MANAGER_COMPONENT , DISK_SPACE_COMPONENT
47+ from lbry .extras .daemon .components import FILE_MANAGER_COMPONENT , DISK_SPACE_COMPONENT , TRACKER_ANNOUNCER_COMPONENT
4848from lbry .extras .daemon .components import EXCHANGE_RATE_MANAGER_COMPONENT , UPNP_COMPONENT
4949from lbry .extras .daemon .componentmanager import RequiredCondition
5050from lbry .extras .daemon .componentmanager import ComponentManager
@@ -4996,7 +4996,6 @@ async def jsonrpc_blob_delete(self, blob_hash):
49964996 DHT / Blob Exchange peer commands.
49974997 """
49984998
4999- @requires (DHT_COMPONENT )
50004999 async def jsonrpc_peer_list (self , blob_hash , page = None , page_size = None ):
50015000 """
50025001 Get peers for blob hash
@@ -5018,21 +5017,29 @@ async def jsonrpc_peer_list(self, blob_hash, page=None, page_size=None):
50185017 if not is_valid_blobhash (blob_hash ):
50195018 # TODO: use error from lbry.error
50205019 raise Exception ("invalid blob hash" )
5021- peers = []
50225020 peer_q = asyncio .Queue (loop = self .component_manager .loop )
5023- await self .dht_node ._peers_for_value_producer (blob_hash , peer_q )
5021+ if self .component_manager .has_component (TRACKER_ANNOUNCER_COMPONENT ):
5022+ tracker = self .component_manager .get_component (TRACKER_ANNOUNCER_COMPONENT )
5023+ tracker_peers = await tracker .get_kademlia_peer_list (bytes .fromhex (blob_hash ))
5024+ log .info ("Found %d peers for %s from trackers." , len (tracker_peers ), blob_hash [:8 ])
5025+ peer_q .put_nowait (tracker_peers )
5026+ elif not self .component_manager .has_component (DHT_COMPONENT ):
5027+ raise Exception ("Peer list needs, at least, either a DHT component or a Tracker component for discovery." )
5028+ peers = []
5029+ if self .component_manager .has_component (DHT_COMPONENT ):
5030+ await self .dht_node ._peers_for_value_producer (blob_hash , peer_q )
50245031 while not peer_q .empty ():
50255032 peers .extend (peer_q .get_nowait ())
5026- results = [
5027- {
5028- "node_id" : hexlify (peer .node_id ).decode (),
5033+ results = {
5034+ ( peer . address , peer . tcp_port ): {
5035+ "node_id" : hexlify (peer .node_id ).decode () if peer . node_id else None ,
50295036 "address" : peer .address ,
50305037 "udp_port" : peer .udp_port ,
50315038 "tcp_port" : peer .tcp_port ,
50325039 }
50335040 for peer in peers
5034- ]
5035- return paginate_list (results , page , page_size )
5041+ }
5042+ return paginate_list (list ( results . values ()) , page , page_size )
50365043
50375044 @requires (DATABASE_COMPONENT )
50385045 async def jsonrpc_blob_announce (self , blob_hash = None , stream_hash = None , sd_hash = None ):
0 commit comments