import logging from twisted.internet import defer from zope.interface import implements from lbrynet.interfaces import IQueryHandlerFactory, IQueryHandler log = logging.getLogger(__name__) class BlobAvailabilityHandlerFactory(object): implements(IQueryHandlerFactory) def __init__(self, blob_manager): self.blob_manager = blob_manager ######### IQueryHandlerFactory ######### def build_query_handler(self): q_h = BlobAvailabilityHandler(self.blob_manager) return q_h def get_primary_query_identifier(self): return 'requested_blobs' def get_description(self): return "Blob Availability - blobs that are available to be uploaded" class BlobAvailabilityHandler(object): implements(IQueryHandler) def __init__(self, blob_manager): self.blob_manager = blob_manager self.query_identifiers = ['requested_blobs'] ######### IQueryHandler ######### def register_with_request_handler(self, request_handler, peer): request_handler.register_query_handler(self, self.query_identifiers) def handle_queries(self, queries): if self.query_identifiers[0] in queries: log.info("Received the client's list of requested blobs") d = self._get_available_blobs(queries[self.query_identifiers[0]]) def set_field(available_blobs): log.debug("available blobs: %s", str(available_blobs)) return {'available_blobs': available_blobs} d.addCallback(set_field) return d return defer.succeed({}) ######### internal ######### def _get_available_blobs(self, requested_blobs): d = self.blob_manager.completed_blobs(requested_blobs) return d