def save_torrent(self, infohash, metadata, source='BC', extra_info={}): if not self.initialized: return None self.check_overflow() if self.min_free_space != 0 and ( self.free_space - len(metadata) < self.min_free_space or self.num_collected_torrents % 10 == 0): self.free_space = self.get_free_space() if self.free_space - len(metadata) < self.min_free_space: self.warn_disk_full() return None file_name = get_collected_torrent_filename(infohash) if DEBUG: print >> sys.stderr, 'metadata: Storing torrent', sha( infohash).hexdigest(), 'in', file_name save_path = self.write_torrent(metadata, self.torrent_dir, file_name) if save_path: self.num_collected_torrents += 1 self.free_space -= len(metadata) self.addTorrentToDB(save_path, infohash, metadata, source=source, extra_info=extra_info) return file_name
def torrent_exists(self, infohash): file_name = get_collected_torrent_filename(infohash) torrent_path = os.path.join(self.torrent_dir, file_name) if not os.path.exists(torrent_path): return (None, None) else: metadata = self.read_torrent(torrent_path) if not self.valid_metadata(infohash, metadata): return (None, None) self.addTorrentToDB(torrent_path, infohash, metadata, source='BC', extra_info={}) return (file_name, metadata)
def tqueue_save_collected_torrent(self, metatype, metadata): if metatype == URL_MIME_TYPE: tdef = TorrentDef.load_from_url(metadata) else: metainfo = bdecode(metadata) tdef = TorrentDef.load_from_dict(metainfo) infohash = tdef.get_infohash() colldir = self.session.get_torrent_collecting_dir() filename = get_collected_torrent_filename(infohash) torrentpath = os.path.join(colldir, filename) print >> sys.stderr, 'bg: search: saving remotehit', torrentpath tdef.save(torrentpath) return torrentpath
def __torrentdef_retrieved(self, tdef): infohash = tdef.get_infohash() if DEBUG: print >> sys.stderr, 'magnetrequester: received torrent', bin2str(infohash) if infohash in self.requestedInfohashes: self.requestedInfohashes.remove(infohash) torrent = self.torrent_db.getTorrent(infohash, ['torrent_file_name'], include_mypref=False) if torrent.get('torrent_file_name', False): torrent_filename = os.path.join(self.metadatahandler.torrent_dir, torrent['torrent_file_name']) else: torrent_filename = os.path.join(self.metadatahandler.torrent_dir, get_collected_torrent_filename(infohash)) tdef.save(torrent_filename) self.torrent_db.addExternalTorrent(tdef) self.remoteTorrentHandler.metadatahandler_got_torrent(infohash, tdef, torrent_filename) self.overlay_bridge.add_task(self.__requestMagnet, self.REQUEST_INTERVAL)
def save_torrent(self, infohash, metadata, source = 'BC', extra_info = {}): if not self.initialized: return None self.check_overflow() if self.min_free_space != 0 and (self.free_space - len(metadata) < self.min_free_space or self.num_collected_torrents % 10 == 0): self.free_space = self.get_free_space() if self.free_space - len(metadata) < self.min_free_space: self.warn_disk_full() return None file_name = get_collected_torrent_filename(infohash) if DEBUG: print >> sys.stderr, 'metadata: Storing torrent', sha(infohash).hexdigest(), 'in', file_name save_path = self.write_torrent(metadata, self.torrent_dir, file_name) if save_path: self.num_collected_torrents += 1 self.free_space -= len(metadata) self.addTorrentToDB(save_path, infohash, metadata, source=source, extra_info=extra_info) return file_name
def __requestMagnet(self): try: if len(self.requestedInfohashes) < self.MAX_CONCURRENT: while True: if len(self.list) == 0: return prio, infohash = self.list.pop(0) if infohash in self.requestedInfohashes: if DEBUG: print >> sys.stderr, 'magnetrequester: magnet already requested', bin2str(infohash) continue torrent = self.torrent_db.getTorrent(infohash, ['torrent_file_name'], include_mypref=False) if torrent.get('torrent_file_name', False): torrent_filename = os.path.join(self.metadatahandler.torrent_dir, torrent['torrent_file_name']) else: torrent_filename = None torrent_alt_filename = os.path.join(self.metadatahandler.torrent_dir, get_collected_torrent_filename(infohash)) if os.path.isfile(torrent_filename) or os.path.isfile(torrent_alt_filename): if DEBUG: print >> sys.stderr, 'magnetrequester: magnet already on disk', bin2str(infohash) else: break else: return except: print_exc() magnetlink = 'magnet:?xt=urn:btih:' + hexlify(infohash) if DEBUG: print >> sys.stderr, 'magnetrequester: requesting magnet', bin2str(infohash), prio, magnetlink self.requestedInfohashes.add(infohash) TorrentDef.retrieve_from_magnet(magnetlink, self.__torrentdef_retrieved, self.MAGNET_RETRIEVE_TIMEOUT) self.overlay_bridge.add_task(lambda : self.__torrentdef_failed(infohash), self.MAGNET_RETRIEVE_TIMEOUT, infohash) if len(self.requestedInfohashes) < self.MAX_CONCURRENT: self.overlay_bridge.add_task(self.__requestMagnet, self.REQUEST_INTERVAL)