using CloudBuilder.AI.Data; using CloudBuilder.AI.Entity; using CloudBuilder.AI.Policy; using CloudBuilder.AI.Service; using CloudBuilder.Core.DatabaseAccessor.Entity; using CloudBuilder.Core.DependencyInjection.Task; using CloudBuilder.Topshelf.Task.Novel.Process; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Transactions; using static System.Runtime.InteropServices.JavaScript.JSType; namespace CloudBuilder.Topshelf.Task.Novel { //task:ImportBookTask encoding:GB2312 pattern: @"第([^】]+)章" input:D:\NET8\AI\仙侠\凡人修仙传_忘语.txt //input可以是文件名:D:\NET8\AI\仙侠\书名_作者.txt //input也可以是目錄名:D:\NET8\AI\仙侠,必须是小说类型为结尾 //output輸出目錄 //pattern可能自定義分割表達式 public class ImportBookTask : IScheduleTask { private readonly IApplicationService service; public ImportBookTask(IApplicationService service) { this.service = service; } public void Run(Dictionary bodyDict) { if (!bodyDict.ContainsKey("input") || string.IsNullOrEmpty(bodyDict["input"])) return; string input = bodyDict["input"]; string pattern = @"第([^】]+)章"; if (bodyDict.ContainsKey("pattern") && !string.IsNullOrEmpty(bodyDict["pattern"])) pattern = bodyDict["pattern"]; string encoding = "UTF-8"; if (bodyDict.ContainsKey("encoding") && !string.IsNullOrEmpty(bodyDict["encoding"])) encoding = bodyDict["encoding"]; List files = PackFiles(input); foreach (string file in files) { ProcessBook(file, encoding, pattern); } } public void ProcessBook(string file, string encoding, string pattern) { AiBookData data = new AiBookData(); AiBookEntity book = new AiBookEntity(); book.Guid = Guid.NewGuid().ToString(); string[] temps = Path.GetFileNameWithoutExtension(file).Split('_'); if (temps == null || temps.Length != 2) { Console.WriteLine("文件格式要求:书名_作者.txt"); return; } book.Title = temps[0]; book.Author = temps[1]; temps = file.Split('\\'); book.BookType = temps[temps.Length - 2]; //book.FilePath = file; book.Status = BookStatusPolicy.SUBMIT;//S-待提交 ChapterSplitter chapterSplitter = new ChapterSplitter(); data.AiBook = book; System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); string context = File.ReadAllText(file, Encoding.GetEncoding(encoding)); List aiChapterEntities = chapterSplitter.SplitNovelIntoChapters(context, pattern); if (aiChapterEntities == null || aiChapterEntities.Count() == 0) return; aiChapterEntities.ToLookup(x => x.BookGuid = book.Guid); aiChapterEntities.ToLookup(x => x.Status = ChapterStatusPolicy.PROCESS); data.AiChapters = aiChapterEntities.ToArray(); var transactionOptions = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted, Timeout = TimeSpan.FromSeconds(60 * 10) }; using (TransactionScope _transactionScope = new TransactionScope( TransactionScopeOption.Required, transactionOptions, TransactionScopeAsyncFlowOption.Enabled)) { if (data.AiBook != null) service.ServiceProvider.GetService().Insert(data); _transactionScope.Complete(); } } private List PackFiles(string input) { List files = new List(); if (Path.HasExtension(input) && !string.IsNullOrEmpty(input)) { if (File.Exists(input)) { files.Add(input); } } else if (!string.IsNullOrEmpty(input)) { if (Directory.Exists(input)) { string[] tempFiles = Directory.GetFiles(input); if (tempFiles != null && tempFiles.Length > 0) { files.AddRange(tempFiles); } } } return files; } } }