Esempio n. 1
0
        public async Task StartAsync()
        {
            var engine = new ClientEngine();

            MonoTorrent.Torrent torrent = null;

            if (File.Exists(TorrentFileName))
            {
                torrent = await MonoTorrent.Torrent.LoadAsync(TorrentFileName);
            }
            else if (!Url.StartsWith("magnet"))
            {
                torrent = MonoTorrent.Torrent.Load(new Uri(Url), Path.Combine(torrentDir, Path.GetTempFileName() + ".torrent"));
            }

            manager = torrent is null ? await engine.AddStreamingAsync(MonoTorrent.MagnetLink.Parse(Url), DownloadFolder)
                 : await engine.AddStreamingAsync(torrent, DownloadFolder);

            await manager.StartAsync();

            if (!manager.HasMetadata)
            {
                await manager.WaitForMetadataAsync();
            }
        }
Esempio n. 2
0
        private static async Task <Stream> StartTorrenting(Options cliOptions)
        {
            var engine = new ClientEngine();

            WriteLine("MonoTorrent -> Loading torrent file...");
            var torrent = await Torrent.LoadAsync(new Uri(cliOptions.Torrent),
                                                  Path.Combine(Environment.CurrentDirectory, "video.torrent"));

            WriteLine("MonoTorrent -> Creating a new StreamProvider...");
            var manager = await engine.AddStreamingAsync(torrent, cliOptions.Path);

            if (cliOptions.Verbose)
            {
                manager.PeerConnected           += (o, e) => WriteLine($"MonoTorrent -> Connection succeeded: {e.Peer.Uri}");
                manager.ConnectionAttemptFailed += (o, e) => WriteLine($"MonoTorrent -> Connection failed: {e.Peer.ConnectionUri} - {e.Reason} - {e.Peer}");
            }

            WriteLine("MonoTorrent -> Starting the StreamProvider...");
            await manager.StartAsync();

            // As the TorrentManager was created using an actual torrent, the metadata will already exist.
            // This is future proofing in case a MagnetLink is used instead
            if (!manager.HasMetadata)
            {
                WriteLine("MonoTorrent -> Waiting for the metadata to be downloaded from a peer...");
                await manager.WaitForMetadataAsync();
            }

            var largestFile = manager.Files.OrderByDescending(t => t.Length).First();

            WriteLine($"MonoTorrent -> Creating a stream for the torrent file... {largestFile.Path}");
            var stream = await manager.StreamProvider.CreateStreamAsync(largestFile);

            return(stream);
        }
Esempio n. 3
0
        public async Task DownloadAsync(MagnetLink link)
        {
            var engine  = new ClientEngine();
            var manager = await engine.AddStreamingAsync(link, "downloads");

            var times = new List <(string message, TimeSpan time)> ();

            var overall            = Stopwatch.StartNew();
            var firstPeerFound     = Stopwatch.StartNew();
            var firstPeerConnected = Stopwatch.StartNew();

            manager.PeerConnected += (o, e) => {
                if (!firstPeerConnected.IsRunning)
                {
                    return;
                }

                firstPeerConnected.Stop();
                lock (times)
                    times.Add(("First peer connected. Time since torrent started: ", firstPeerConnected.Elapsed));
            };
            manager.PeersFound += (o, e) => {
                if (!firstPeerFound.IsRunning)
                {
                    return;
                }

                firstPeerFound.Stop();
                lock (times)
                    times.Add(($"First peers found via {e.GetType ().Name}. Time since torrent started: ", firstPeerFound.Elapsed));
            };
            manager.PieceHashed += (o, e) => {
                if (manager.State != TorrentState.Downloading)
                {
                    return;
                }

                lock (times)
                    times.Add(($"Piece {e.PieceIndex} hashed. Time since torrent started: ", overall.Elapsed));
            };

            await manager.StartAsync();

            await manager.WaitForMetadataAsync();

            var largestFile = manager.Files.OrderByDescending(t => t.Length).First();
            var stream      = await manager.StreamProvider.CreateStreamAsync(largestFile, false);


            // Read the middle
            await TimedRead(manager, stream, stream.Length / 2, times);

            // Then the start
            await TimedRead(manager, stream, 0, times);

            // Then the last piece
            await TimedRead(manager, stream, stream.Length - 2, times);

            // Then the 3rd last piece
            await TimedRead(manager, stream, stream.Length - manager.PieceLength * 3, times);

            // Then the 5th piece
            await TimedRead(manager, stream, manager.PieceLength * 5, times);

            // Then 1/3 of the way in
            await TimedRead(manager, stream, stream.Length / 3, times);

            // Then 2/3 of the way in
            await TimedRead(manager, stream, stream.Length / 3 * 2, times);

            // Then 1/5 of the way in
            await TimedRead(manager, stream, stream.Length / 5, times);

            // Then 4/5 of the way in
            await TimedRead(manager, stream, stream.Length / 5 * 4, times);

            lock (times) {
                foreach (var p in times)
                {
                    Console.WriteLine($"{p.message} {p.time.TotalSeconds:0.00} seconds");
                }
            }

            await manager.StopAsync();
        }