using Microsoft.Extensions.Configuration; using System.Xml.Linq; using Transmission.API.RPC; namespace MassTorrentAdd { internal class Program { static String watchFolder, transmissionHost, transmissionUsername, transmissionPassword, transmissionDownloadFolder, destinationFolder; static Transmission.API.RPC.Client transmissionClient; static void Main(string[] args) { if(args.Length == 0) { Console.WriteLine("Please provide the nyaa URL to target for download."); return; } String url = args[0]; if (!url.Contains("rss")) url = url + "&page=rss"; var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appSettings.json", optional: false, reloadOnChange: true); IConfigurationRoot configuration = builder.Build(); transmissionHost = configuration.GetValue("transmissionURI"); transmissionUsername = configuration.GetValue("transmissionUsername"); transmissionPassword = configuration.GetValue("transmissionPassword"); destinationFolder = configuration.GetValue("destinationFolder"); Console.WriteLine($"Using transmission server {transmissionHost}"); transmissionClient = new Transmission.API.RPC.Client(transmissionHost, null, transmissionUsername, transmissionPassword); var sessionInformation = transmissionClient.GetSessionInformation(); if (sessionInformation == null || String.IsNullOrEmpty(sessionInformation.Version)) { Console.WriteLine("An error occurred while receiving session information from the rpc server"); return; } HttpClient httpClient = new HttpClient(); var response = httpClient.GetStringAsync(url).Result; if(response == null) { Console.WriteLine("An error occurred while contacting Nyaa for a response"); return; } XDocument doc = XDocument.Parse(response); XNamespace nyaaNS = doc.Root.GetNamespaceOfPrefix("nyaa"); var items = from item in doc.Descendants("channel").Elements("item") select new { Title = item.Element("title").Value, Published = item.Element("pubDate").Value, Category = item.Element(nyaaNS + "category").Value, CategoryID = item.Element(nyaaNS + "categoryId").Value, Size = item.Element(nyaaNS + "size").Value, Link = item.Element("link").Value, Description = item.Element("description").Value, PostID = item.Element("guid").Value, }; Console.WriteLine("Downloading .."); foreach ( var item in items ) { Console.WriteLine($"{item.Title}"); } String transmissionDirectoryName = items.First().Title.Trim(); transmissionDirectoryName = System.Text.RegularExpressions.Regex.Replace(transmissionDirectoryName, @"E\d{2,3}.*?(\d{3,4}p)", " $1"); transmissionDirectoryName = System.Text.RegularExpressions.Regex.Replace(transmissionDirectoryName, @"\s\(.*?\)$", ""); transmissionDirectoryName = destinationFolder + (destinationFolder.EndsWith("/") ? String.Empty : "/") + transmissionDirectoryName.Replace(" ", "."); Console.WriteLine($"{items.Count()} item(s) to {transmissionDirectoryName}"); Console.WriteLine("Continue?"); if(Console.ReadKey().KeyChar != 'y') { Console.WriteLine("Exiting"); return; } foreach (var item in items) { var torrentData = httpClient.GetByteArrayAsync(item.Link).Result; AddNewTorrentFileToServer(torrentData, transmissionDirectoryName); } Console.WriteLine("Completed"); } private static void AddNewTorrentFileToServer(byte[] torrentFileData, String saveLocation) { Transmission.API.RPC.Entity.NewTorrent newTorrent = new() { DownloadDirectory = saveLocation, Paused = true, Metainfo = Convert.ToBase64String(torrentFileData) }; var torrentInfo = transmissionClient.TorrentAdd(newTorrent); var seedSettings = new Transmission.API.RPC.Arguments.TorrentSettings() { SeedRatioLimit = 1.0, SeedRatioMode = 1, IDs = [torrentInfo.ID] }; transmissionClient.TorrentSet(seedSettings); //transmissionClient.TorrentVerify(new object[] { torrentInfo.ID }); } } }