docs: public TorrentManager addTorrent(TorrentMetadataProvider metadataProvider,
                                     PieceStorage pieceStorage,
                                     List<TorrentListener> listeners) throws IOException {
      TorrentMetadata torrentMetadata = metadataProvider.getTorrentMetadata();
      EventDispatcher eventDispatcher = new EventDispatcher();
      for (TorrentListener listener : listeners) {
        eventDispatcher.addListener(listener);
      }
      final LoadedTorrentImpl loadedTorrent = new LoadedTorrentImpl(
              new TorrentStatistic(),
              metadataProvider,
              torrentMetadata,
              pieceStorage,
              eventDispatcher);
  
      if (pieceStorage.isFinished()) {
        loadedTorrent.getTorrentStatistic().setLeft(0);
      } else {
        long left = calculateLeft(pieceStorage, torrentMetadata);
        loadedTorrent.getTorrentStatistic().setLeft(left);
      }
      eventDispatcher.multicaster().validationComplete(pieceStorage.getAvailablePieces().cardinality(), torrentMetadata.getPiecesCount());
  
      this.torrentsStorage.addTorrent(loadedTorrent.getTorrentHash().getHexInfoHash(), loadedTorrent);
      forceAnnounceAndLogError(loadedTorrent, pieceStorage.isFinished() ? COMPLETED : STARTED);
      logger.debug(String.format("Added torrent %s (%s)", loadedTorrent, loadedTorrent.getTorrentHash().getHexInfoHash()));
      return new TorrentManagerImpl(eventDispatcher, loadedTorrent.getTorrentHash());
    }