Задать вопрос
@King_Of_Demons
Junior C# Developer

Как правильно использовать библиотеку MonoTorrent?

Может быть сам вопрос плохо сформулирован, но суть проблемы в следующем:
Начал делать свою библиотеку для разных типов загрузчиков чтобы использовать в WPF приложений, в пойсках библиотек набрел на MonoTorrent, вроде бы в ней все есть, она подерживается и все прекрасно. Полез в примеры использования и начал тестировать, скачивание идет, пора стягивать логику к себе. Сделал пару классов:
public class StandardTorrentDownloader : ITorrentDownloader
    {
        private readonly ClientEngine _clientEngine;
        private TorrentManager? _currentManager;

        public StandardTorrentDownloader(ClientEngine clientEngine)
        {
            _clientEngine = clientEngine;
        }

        public async Task DownloadFileWithProgressAsync(string torrentFile, string destinationPath,
            IProgress<DownloadReport> progress, CancellationToken cancellationToken = default)
        {
            if (!Directory.Exists(destinationPath))
                Directory.CreateDirectory(destinationPath);

            string? fileName =
                await UrlHelper.ExtractFileNameFromUrlAsync(torrentFile, new HttpClient(), cancellationToken);
            if (string.IsNullOrEmpty(fileName))
            {
                fileName = Path.GetFileName(torrentFile);
            }

            try
            {
                TorrentSettingsBuilder settingsBuilder = new()
                {
                    MaximumConnections = 60,
                    CreateContainingDirectory = true
                };

                _currentManager =
                    await _clientEngine.AddAsync(torrentFile, destinationPath, settingsBuilder.ToSettings());
                await _currentManager.StartAsync();

                while (_clientEngine.IsRunning)
                {
                    if (cancellationToken.IsCancellationRequested)
                    {
                        await _currentManager.StopAsync();
                        break;
                    }

                    TorrentMonitor? details = await _clientEngine.GatherTorrentDataAsync(cancellationToken);
                    details.ClientEngine = _clientEngine;
                    details.TorrentManager = _currentManager;

                    DownloadReport report = new DownloadReport(torrentFile, destinationPath)
                    {
                        DownloadSpeed = _currentManager.Monitor.DownloadRate,
                        ETA = CalculateETA(_currentManager.Torrent.Size - _currentManager.Monitor.DataBytesReceived,
                            _currentManager.Monitor.DownloadRate / 1024.0),
                        FileSize = _currentManager.Torrent.Size,
                        TorrentMonitor = details,
                        FileName = fileName,
                        CurrentState = DownloadState.Downloading
                    };

                    progress.Report(report);

                    // Throttle UI updates (e.g., every 500ms)
                    await Task.Delay(500, cancellationToken);
                }
            }
            catch (Exception e)
            {
                throw new Exception($"Couldn't decode {torrentFile}", e);
            }
        }
}

public TorrentFileDownloader()
        {
            const int httpListeningPort = 55125;
            EngineSettingsBuilder settingsBuilder = new()
            {
                AllowPortForwarding = true,
                AutoSaveLoadDhtCache = true,
                AutoSaveLoadFastResume = true,
                AutoSaveLoadMagnetLinkMetadata = true,
                HttpStreamingPrefix = $"http://127.0.0.1:{httpListeningPort}/",
                AllowLocalPeerDiscovery = true,
            };

            ClientEngine clientEngine = new ClientEngine(settingsBuilder.ToSettings());
            _torrentDownloaderFactory = new TorrentDownloaderFactory(clientEngine);
}

и решил все это опробовать и уже вынести управление и визуальную часть что бы посмотреть что получилось. В итоге ничего не пройсходит, пытается что то запустить, но результате все по нулям, никаких изменений в скорости или прогрессе скачивания не пройсходит. Переписывал их пример в другой консольный проект, та же самая хрень, ничего нормально не работает. Может ктонибудь ее удачно у себя интегрировал и может поделится решением или хотя бы советом как ее правильно надо настрайвать. Искал примеры, но они или старые или не рабочие. Документация дает только структуру всей этой библиотеки но особо не помогает.
  • Вопрос задан
  • 78 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы