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)
Exemple #3
0
 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 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 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 __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)