/// <summary> /// 为指定的小说下载插件注册书籍输出器。 /// </summary> /// <param name="plugin">小说下载插件。</param> /// <param name="bookWriter">书籍输出器。</param> /// <exception cref="ArgumentNullException"><paramref name="plugin"/> 的值为 <see langword="null"/> 。</exception> /// <exception cref="ArgumentNullException"><paramref name="bookWriter"/> 的值为 <see langword="null"/> 。</exception> /// <exception cref="InvalidOperationException">已为插件注册了书籍输出器。</exception> /// <exception cref="InvalidOperationException">插件未加载。</exception> public void RegisterBookWriter(INovelDownloadPlugin plugin, IBookWriter bookWriter) { if (plugin == null) { throw new ArgumentNullException(nameof(plugin)); } if (bookWriter == null) { throw new ArgumentNullException(nameof(bookWriter)); } if (this.Plugins.ContainsKey(plugin.Guid)) { if (this.BookWriters.ContainsKey(plugin.Guid)) { throw new InvalidOperationException("已为插件注册了书籍输出器。"); } else { this.BookWriters.Add(plugin.Guid, bookWriter); } } else { throw new InvalidOperationException("插件未加载。"); } }
private static void download(INovelDownloadPlugin plugin, string url, NDTBook bookToken = null) { if (bookToken == null && !plugin.TryGetBookToken(new Uri(url, UriKind.RelativeOrAbsolute), out bookToken)) { return; } Console.WriteLine(); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(string.Format("{0}({1}) v{2}\n{3}", plugin.DisplayName, plugin.Name, plugin.Version, plugin.Description)); Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine(); if (bookToken is NovelDownloader.Plugin.luoqiu.com.BookToken || bookToken is NovelDownloader.Plugin._81zw.com.BookToken || bookToken is NovelDownloader.Plugin.顶点小说.BookToken) { downloadNormal(plugin, bookToken); } else if (bookToken is NovelDownloader.Plugin.wenku8.com.BookToken || bookToken is NovelDownloader.Plugin.qidian.com.BookToken) { downloadLight(plugin, bookToken); } else { Console.WriteLine("无法下载《{0]》", bookToken.Title); } }
private static void downloadNormal(INovelDownloadPlugin plugin, NDTBook bookToken) { new Thread(() => { using (StreamWriter writer = new StreamWriter(string.Format("{0}.txt", process(bookToken.Title)), false, Encoding.UTF8)) { //StringBuilder sb = new StringBuilder(); Console.WriteLine("{0} - {1}", bookToken.Type, bookToken.Title); writer.WriteLine(string.Format("书名:{0}", bookToken.Title)); writer.WriteLine(string.Format("作者:{0}", bookToken.Author)); writer.WriteLine(); writer.WriteLine(); bookToken.CreepStarted += (sender, e) => Console.WriteLine("\t开始下载书籍《{0}》", bookToken.Title); bookToken.CreepFetched += (sender, e) => Console.WriteLine("\t获取 【{0}】", e.Data); bookToken.CreepFinished += (sender, e) => Console.WriteLine("\t下载书籍《{0}》完成。", bookToken.Title); bookToken.StartCreep(); foreach (NDTChapter chapterToken in bookToken.Children) { chapterToken.CreepStarted += (sender, e) => { Console.WriteLine("\t开始下载章节【{0}】”", chapterToken.Title); writer.WriteLine("--------------------"); writer.WriteLine(); writer.WriteLine(chapterToken.Title); }; chapterToken.CreepFetched += (sender, e) => { //Console.WriteLine("{0}", e.Data); writer.WriteLine(string.Format(" {0}", e.Data)); }; chapterToken.CreepFinished += (sender, e) => { Console.WriteLine("\t下载章节【{0}】完成。\n", chapterToken.Title); writer.WriteLine(); }; chapterToken.StartCreep(); } //Console.WriteLine(sb.ToString()); } }).Start(); }
private static void downloadLight(INovelDownloadPlugin plugin, NDTBook bookToken) { new Thread(() => { Console.WriteLine("{0} - {1}", bookToken.Type, bookToken.Title); DirectoryInfo directory = new DirectoryInfo(process(bookToken.Title)); bookToken.CreepStarted += (sender, e) => { Console.WriteLine("\t开始下载书籍《{0}》", bookToken.Title); if (!directory.Exists) { directory.Create(); } }; bookToken.CreepFetched += (sender, e) => Console.WriteLine("\t获取 ({0})", e.Data); bookToken.CreepFinished += (sender, e) => Console.WriteLine("\t下载书籍《{0}》完成。", bookToken.Title); bookToken.StartCreep(); foreach (NDTVolume volumeToken in bookToken.Children) { FileInfo file = new FileInfo(Path.Combine(directory.FullName, process(volumeToken.Title) + ".txt")); StreamWriter writer = null; volumeToken.CreepStarted += (sender, e) => { Console.WriteLine("\t\t开始下载卷({0})", volumeToken.Title); writer = file.CreateText(); }; volumeToken.CreepFetched += (sender, e) => Console.WriteLine("\t\t获取 【{0}】", e.Data); volumeToken.CreepFinished += (sender, e) => Console.WriteLine("\t\t下载卷({0})完成。", volumeToken.Title); volumeToken.StartCreep(); writer.WriteLine("[{0}][{1}][{2}]", bookToken.Author, bookToken.Title, volumeToken.Title); writer.WriteLine(); writer.WriteLine("≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡"); writer.WriteLine(); writer.WriteLine(" 书名:{0}", bookToken.Title); writer.WriteLine(" 作者:{0}", bookToken.Author); writer.WriteLine(" 来源:{0}", bookToken.Uri.Host); writer.WriteLine(); writer.WriteLine(" 本资源由小说下载插件 {0}({1}) v{2} 【{3}】 扫描提供。", plugin.DisplayName, plugin.Name, plugin.Version, plugin.Description); writer.WriteLine(); writer.WriteLine("≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡"); writer.WriteLine(); writer.WriteLine(); writer.WriteLine(volumeToken.Title); writer.WriteLine(); writer.Flush(); foreach (NDTChapter chapterToken in volumeToken.Children) { chapterToken.CreepStarted += (sender, e) => { Console.WriteLine("\t\t\t开始下载章节【{0}】”", chapterToken.Title); writer.WriteLine(); writer.WriteLine(); writer.WriteLine(chapterToken.Title); writer.WriteLine(); }; chapterToken.CreepFetched += (sender, e) => { writer.WriteLine(" {0}", e.Data); }; chapterToken.CreepFinished += (sender, e) => { Console.WriteLine("\t\t\t下载章节【{0}】完成。\n", chapterToken.Title); writer.WriteLine(); }; chapterToken.StartCreep(); } writer.Flush(); writer.Close(); writer.Dispose(); } }).Start(); }