diff --git a/lbry/lbry/extras/daemon/Daemon.py b/lbry/lbry/extras/daemon/Daemon.py index 77ac647ff..aee2c6089 100644 --- a/lbry/lbry/extras/daemon/Daemon.py +++ b/lbry/lbry/extras/daemon/Daemon.py @@ -2011,7 +2011,7 @@ class Daemon(metaclass=JSONRPCServerType): [--allow_duplicate_purchase] [--override_max_key_fee] [--preview] [--blocking] Options: - --claim_id= : (str) id of claim to purchase + --claim_id= : (str) claim id of claim to purchase --url= : (str) lookup claim to purchase by url --wallet_id= : (str) restrict operation to specific wallet --funding_account_ids=: (list) ids of accounts to fund this transaction @@ -3574,20 +3574,20 @@ class Daemon(metaclass=JSONRPCServerType): return await self.jsonrpc_stream_abandon(*args, **kwargs) @requires(WALLET_COMPONENT) - def jsonrpc_collection_list(self, resolve_claims=False, account_id=None, wallet_id=None, page=None, page_size=None): + def jsonrpc_collection_list(self, resolve_claims=0, account_id=None, wallet_id=None, page=None, page_size=None): """ List my collection claims. Usage: - collection_list [--resolve_claims] [ | --account_id=] [--wallet_id=] + collection_list [--resolve_claims=] [ | --account_id=] [--wallet_id=] [--page=] [--page_size=] Options: - --resolve_claims : (bool) resolve every claim - --account_id= : (str) id of the account to use - --wallet_id= : (str) restrict results to specific wallet - --page= : (int) page to return during paginating - --page_size= : (int) number of items on page during pagination + --resolve_claims= : (int) resolve every claim + --account_id= : (str) id of the account to use + --wallet_id= : (str) restrict results to specific wallet + --page= : (int) page to return during paginating + --page_size= : (int) number of items on page during pagination Returns: {Paginated[Output]} """ @@ -3599,8 +3599,45 @@ class Daemon(metaclass=JSONRPCServerType): else: collections = partial(self.ledger.get_collections, wallet=wallet, accounts=wallet.accounts) collection_count = partial(self.ledger.get_collection_count, wallet=wallet, accounts=wallet.accounts) - return paginate_rows(collections, collection_count, page, page_size, resolve=resolve_claims) + return paginate_rows(collections, collection_count, page, page_size, resolve_claims=resolve_claims) + async def jsonrpc_collection_resolve( + self, claim_id=None, url=None, wallet_id=None, page=1, page_size=DEFAULT_PAGE_SIZE): + """ + Resolve claims in the collection. + + Usage: + collection_resolve (--claim_id= | --url=) + [--wallet_id=] [--page=] [--page_size=] + + Options: + --claim_id= : (str) claim id of the collection + --url= : (str) url of the collection + --wallet_id= : (str) restrict results to specific wallet + --page= : (int) page to return during paginating + --page_size= : (int) number of items on page during pagination + + Returns: {Paginated[Output]} + """ + wallet = self.wallet_manager.get_wallet_or_default(wallet_id) + + if claim_id: + txo = await self.ledger.get_claim_by_claim_id(wallet.accounts, claim_id) + if not isinstance(txo, Output) or not txo.is_claim: + raise Exception(f"Could not find collection with claim_id '{claim_id}'. ") + elif url: + txo = (await self.ledger.resolve(wallet.accounts, [url]))[url] + if not isinstance(txo, Output) or not txo.is_claim: + raise Exception(f"Could not find collection with url '{url}'. ") + else: + raise Exception(f"Missing argument claim_id or url. ") + + page_num, page_size = abs(page), min(abs(page_size), 50) + items = await self.ledger.resolve_collection(txo, page_size * (page_num - 1), page_size) + total_items = len(txo.claim.collection.claims.ids) + + return {"items": items, 'total_pages': int((total_items + (page_size - 1)) / page_size), + 'total_items': total_items, 'page_size': page_size, 'page': page_num} SUPPORT_DOC = """ Create, list and abandon all types of supports. diff --git a/lbry/lbry/wallet/ledger.py b/lbry/lbry/wallet/ledger.py index d913f4da5..8101bbe3e 100644 --- a/lbry/lbry/wallet/ledger.py +++ b/lbry/lbry/wallet/ledger.py @@ -186,29 +186,33 @@ class MainNetLedger(BaseLedger): def get_channel_count(self, **constraints): return self.db.get_channel_count(**constraints) - async def get_collections(self, resolve=False, **constraints): + async def resolve_collection(self, collection, offset=0, page_size=1): + claim_ids = collection.claim.collection.claims.ids[offset:page_size+offset] + try: + resolve_results, _, _ = await self.claim_search([], claim_ids=claim_ids) + except: + log.exception("Resolve failed while looking up collection claim ids:") + return [] + claims = [] + for claim_id in claim_ids: + found = False + for txo in resolve_results: + if txo.claim_id == claim_id: + claims.append(txo) + found = True + break + if not found: + claims.append(None) + return claims + + async def get_collections(self, resolve_claims=0, **constraints): collections = await self.db.get_collections(**constraints) - if resolve: + if resolve_claims > 0: for collection in collections: - claim_ids = collection.claim.collection.claims.ids; - try: - resolve_results, _, _ = await self.claim_search([], claim_ids=collection.claim.collection.claims.ids) - except: - log.exception("Resolve failed while looking up collection claim ids:") - claims = [] - for claim_id in claim_ids: - found = False - for txo in resolve_results: - if txo.claim_id == claim_id: - claims.append(txo) - found = True - break - if not found: - claims.append(None) - collection.claims = claims + collection.claims = await self.resolve_collection(collection, page_size=resolve_claims) return collections - def get_collection_count(self, resolve=False, **constraints): + def get_collection_count(self, resolve_claims=0, **constraints): return self.db.get_collection_count(**constraints) def get_supports(self, **constraints): diff --git a/lbry/tests/integration/test_claim_commands.py b/lbry/tests/integration/test_claim_commands.py index 6136cb097..7009a4e12 100644 --- a/lbry/tests/integration/test_claim_commands.py +++ b/lbry/tests/integration/test_claim_commands.py @@ -1293,13 +1293,18 @@ class CollectionCommands(CommandTestCase): self.assertEqual(collections['items'][0]['value']['claims'], claim_ids) self.assertNotIn('claims', collections['items'][0]) - await self.collection_create('radjingles', claims=claim_ids, allow_duplicate_name=True) + tx = await self.collection_create('radjingles', claims=claim_ids, allow_duplicate_name=True) + claim_id2 = self.get_claim_id(tx) self.assertItemCount(await self.daemon.jsonrpc_collection_list(), 2) await self.collection_abandon(claim_id) self.assertItemCount(await self.daemon.jsonrpc_collection_list(), 1) - collections = await self.out(self.daemon.jsonrpc_collection_list(resolve_claims=True)) + collections = await self.out(self.daemon.jsonrpc_collection_list(resolve_claims=2)) + self.assertEquals(len(collections['items'][0]['claims']), 2) + + collections = await self.out(self.daemon.jsonrpc_collection_list(resolve_claims=10)) + self.assertEqual(len(collections['items'][0]['claims']), 4) self.assertEqual(collections['items'][0]['claims'][0]['name'], 'stream-one') self.assertEqual(collections['items'][0]['claims'][1]['name'], 'stream-two') self.assertEqual(collections['items'][0]['claims'][2]['name'], 'stream-one') @@ -1309,3 +1314,8 @@ class CollectionCommands(CommandTestCase): self.assertEqual(claims['items'][0]['name'], 'radjingles') self.assertEqual(claims['items'][1]['name'], 'stream-two') self.assertEqual(claims['items'][2]['name'], 'stream-one') + + claims = await self.out(self.daemon.jsonrpc_collection_resolve(claim_id2)) + self.assertEqual(claims['items'][0]['name'], 'stream-one') + self.assertEqual(claims['items'][1]['name'], 'stream-two') + self.assertEqual(claims['items'][2]['name'], 'stream-one') \ No newline at end of file