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
@@ -4949,7 +4949,6 @@ async def jsonrpc_blob_delete(self, blob_hash):
49494949 DHT / Blob Exchange peer commands.
49504950 """
49514951
4952- @requires (DHT_COMPONENT )
49534952 async def jsonrpc_peer_list (self , blob_hash , page = None , page_size = None ):
49544953 """
49554954 Get peers for blob hash
@@ -4971,21 +4970,29 @@ async def jsonrpc_peer_list(self, blob_hash, page=None, page_size=None):
49714970 if not is_valid_blobhash (blob_hash ):
49724971 # TODO: use error from lbry.error
49734972 raise Exception ("invalid blob hash" )
4974- peers = []
49754973 peer_q = asyncio .Queue (loop = self .component_manager .loop )
4976- await self .dht_node ._peers_for_value_producer (blob_hash , peer_q )
4974+ if self .component_manager .has_component (TRACKER_ANNOUNCER_COMPONENT ):
4975+ tracker = self .component_manager .get_component (TRACKER_ANNOUNCER_COMPONENT )
4976+ tracker_peers = await tracker .get_kademlia_peer_list (bytes .fromhex (blob_hash ))
4977+ log .info ("Found %d peers for %s from trackers." , len (tracker_peers ), blob_hash [:8 ])
4978+ peer_q .put_nowait (tracker_peers )
4979+ elif not self .component_manager .has_component (DHT_COMPONENT ):
4980+ raise Exception ("Peer list needs, at least, either a DHT component or a Tracker component for discovery." )
4981+ peers = []
4982+ if self .component_manager .has_component (DHT_COMPONENT ):
4983+ await self .dht_node ._peers_for_value_producer (blob_hash , peer_q )
49774984 while not peer_q .empty ():
49784985 peers .extend (peer_q .get_nowait ())
4979- results = [
4980- {
4981- "node_id" : hexlify (peer .node_id ).decode (),
4986+ results = {
4987+ ( peer . address , peer . tcp_port ): {
4988+ "node_id" : hexlify (peer .node_id ).decode () if peer . node_id else None ,
49824989 "address" : peer .address ,
49834990 "udp_port" : peer .udp_port ,
49844991 "tcp_port" : peer .tcp_port ,
49854992 }
49864993 for peer in peers
4987- ]
4988- return paginate_list (results , page , page_size )
4994+ }
4995+ return paginate_list (list ( results . values ()) , page , page_size )
49894996
49904997 @requires (DATABASE_COMPONENT )
49914998 async def jsonrpc_blob_announce (self , blob_hash = None , stream_hash = None , sd_hash = None ):
0 commit comments