From f29596104edef96e4618841429e22b2872f72868 Mon Sep 17 00:00:00 2001 From: d13forme Date: Mon, 12 May 2025 01:36:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D1=8C=D1=82?= =?UTF-8?q?=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MagnetExtractor.sln | 25 +++++ MagnetExtractor/MagnetExtractor.csproj | 14 +++ MagnetExtractor/Program.cs | 134 +++++++++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 MagnetExtractor.sln create mode 100644 MagnetExtractor/MagnetExtractor.csproj create mode 100644 MagnetExtractor/Program.cs diff --git a/MagnetExtractor.sln b/MagnetExtractor.sln new file mode 100644 index 0000000..3e1d9a0 --- /dev/null +++ b/MagnetExtractor.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.13.35931.197 d17.13 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MagnetExtractor", "MagnetExtractor\MagnetExtractor.csproj", "{911B8CAF-FF6E-4433-98D9-5068BBE3F37F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {911B8CAF-FF6E-4433-98D9-5068BBE3F37F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {911B8CAF-FF6E-4433-98D9-5068BBE3F37F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {911B8CAF-FF6E-4433-98D9-5068BBE3F37F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {911B8CAF-FF6E-4433-98D9-5068BBE3F37F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {99C83323-E6A2-4DCC-BCF8-BF7BFB0A0D49} + EndGlobalSection +EndGlobal diff --git a/MagnetExtractor/MagnetExtractor.csproj b/MagnetExtractor/MagnetExtractor.csproj new file mode 100644 index 0000000..35159cc --- /dev/null +++ b/MagnetExtractor/MagnetExtractor.csproj @@ -0,0 +1,14 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + diff --git a/MagnetExtractor/Program.cs b/MagnetExtractor/Program.cs new file mode 100644 index 0000000..821b134 --- /dev/null +++ b/MagnetExtractor/Program.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using BencodeNET.Objects; +using BencodeNET.Parsing; +using BencodeNET.Torrents; + +namespace TorrentToMagnet +{ + class Program + { + static void Main(string[] args) + { + if (args.Length != 1) + { + Console.WriteLine("Usage: TorrentToMagnet "); + return; + } + + string torrentFilePath = args[0]; + + if (!File.Exists(torrentFilePath)) + { + Console.WriteLine("File not found."); + return; + } + + try + { + // Загружаем .torrent файл + var torrentData = File.ReadAllBytes(torrentFilePath); + var parser = new BencodeParser(); + var torrent = parser.Parse(torrentData); + + // Извлекаем информацию для magnet-ссылки + var infoHash = GetInfoHash(torrent); + var name = GetName(torrent); + var trackers = GetTrackers(torrent); + + // Формируем magnet-ссылку + string magnetLink = $"magnet:?xt=urn:btih:{infoHash}&dn={Uri.EscapeDataString(name)}"; + + // Добавляем трекеры в magnet-ссылку + foreach (var tracker in trackers) + { + magnetLink += $"&tr={Uri.EscapeDataString(tracker)}"; + } + + Console.WriteLine("Magnet Link:"); + Console.WriteLine(magnetLink); + + // Спрашиваем пользователя, хочет ли он сохранить трекеры в файл + Console.WriteLine("Do you want to save the trackers to a file? (yes/no)"); + string response = Console.ReadLine().Trim().ToLower(); + + if (response == "yes" || response == "y") + { + Console.WriteLine("Enter the file name to save the trackers:"); + string fileName = Console.ReadLine().Trim(); + + // Сохраняем трекеры в файл + SaveTrackersToFile(trackers, fileName); + } + } + catch (Exception ex) + { + Console.WriteLine("Error: " + ex.Message); + } + } + + static string GetInfoHash(BDictionary torrent) + { + var info = torrent["info"] as BDictionary; + var infoBytes = info.EncodeAsBytes(); + var sha1 = System.Security.Cryptography.SHA1.Create(); + var hashBytes = sha1.ComputeHash(infoBytes); + return BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); + } + + static string GetName(BDictionary torrent) + { + var info = torrent["info"] as BDictionary; + return info["name"].ToString(); + } + + static List GetTrackers(BDictionary torrent) + { + var trackers = new List(); + + // Извлекаем трекеры из announce + if (torrent.ContainsKey("announce")) + { + var announce = torrent["announce"].ToString(); + trackers.Add(announce); + } + + // Извлекаем трекеры из announce-list + if (torrent.ContainsKey("announce-list")) + { + var announceList = torrent["announce-list"] as BList; + foreach (var item in announceList) + { + if (item is BList subList) + { + foreach (var subItem in subList) + { + trackers.Add(subItem.ToString()); + } + } + else + { + trackers.Add(item.ToString()); + } + } + } + + return trackers; + } + + static void SaveTrackersToFile(List trackers, string filePath) + { + try + { + File.WriteAllLines(filePath, trackers); + Console.WriteLine($"Trackers saved to {filePath}"); + } + catch (Exception ex) + { + Console.WriteLine($"Error saving trackers to file: {ex.Message}"); + } + } + } +} \ No newline at end of file