Skip to content

Commit f1e9448

Browse files
author
OnlyFart
committed
1 parent 4774f0b commit f1e9448

7 files changed

Lines changed: 85 additions & 29 deletions

File tree

Core/Configs/Options.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ public Options(IEnumerable<string> url) {
7171

7272
[Option("additional-types", Required = false, HelpText = "Типы дополнительных файлов. Допустимые значения: books, audio, images", Separator = ',')]
7373
public IEnumerable<AdditionalTypeEnum> AdditionalTypes { get; set; }
74-
74+
7575
[Option("book-name-pattern", Required = false, HelpText = "Шаблон имени файла.", Default = "{Author.Name} - {Book.Title}")]
76-
public string BookNamePattern { get; set; }
76+
public string BookNamePattern { get; set; } = "{Author.Name} - {Book.Title}";
7777

7878
public bool HasAdditionalType(AdditionalTypeEnum type) => Additional && (AdditionalTypes == default || !AdditionalTypes.Any() || AdditionalTypes.Contains(type));
7979

Core/Core.csproj

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44
<TargetFramework>net9.0</TargetFramework>
55
<LangVersion>latestmajor</LangVersion>
66
<PackageId>Core</PackageId>
7-
<Version>2.7.3</Version>
7+
<Version>2.7.4</Version>
88
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
99
</PropertyGroup>
1010

1111
<ItemGroup>
12-
<PackageReference Include="AngleSharp" Version="1.1.2" />
12+
<PackageReference Include="AngleSharp" Version="1.3.0" />
1313
<PackageReference Include="CommandLineParser" Version="2.9.1" />
1414
<PackageReference Include="FlareSolverrSharp" Version="3.0.7" />
15-
<PackageReference Include="HtmlAgilityPack" Version="1.11.71" />
15+
<PackageReference Include="HtmlAgilityPack" Version="1.12.4" />
1616
<PackageReference Include="HtmlAgilityPack.CssSelectors.NetCore" Version="1.2.1" />
17-
<PackageReference Include="Microsoft.Extensions.FileProviders.Composite" Version="9.0.0" />
18-
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="9.0.0" />
19-
<PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="9.0.0" />
20-
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.0" />
17+
<PackageReference Include="Microsoft.Extensions.FileProviders.Composite" Version="9.0.9" />
18+
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="9.0.9" />
19+
<PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="9.0.9" />
20+
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.9" />
2121
<PackageReference Include="OAuth.DotNetCore" Version="3.0.1" />
2222
<PackageReference Include="StringTokenFormatter" Version="9.0.1" />
2323
</ItemGroup>

Core/Logic/Getters/StrokiMtsGetter.cs

Lines changed: 62 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Concurrent;
23
using System.Collections.Generic;
34
using System.Linq;
45
using System.Net;
@@ -38,10 +39,11 @@ public override async Task<Book> Get(Uri url) {
3839
var id = GetId(url);
3940

4041
var details = await GetBook(id);
41-
var detailBook = details.Items.FirstOrDefault(d => d.TextBook != default)?.TextBook ??
42-
details.Items.FirstOrDefault(d => d.AudioBook != default)?.AudioBook ??
43-
details.Items.FirstOrDefault(d => d.ComicBook != default)?.ComicBook ??
44-
details.Items.FirstOrDefault(d => d.PressBook != default)?.PressBook;
42+
var detailBook = details?.Items.FirstOrDefault(d => d.TextBook != default)?.TextBook ??
43+
details?.Items.FirstOrDefault(d => d.AudioBook != default)?.AudioBook ??
44+
details?.Items.FirstOrDefault(d => d.ComicBook != default)?.ComicBook ??
45+
details?.Items.FirstOrDefault(d => d.PressBook != default)?.PressBook ??
46+
await GetSerial(id);
4547

4648
if (detailBook == default) {
4749
throw new Exception("Не удалось получить книгу");
@@ -55,15 +57,27 @@ public override async Task<Book> Get(Uri url) {
5557
Annotation = detailBook.Annotation,
5658
};
5759

58-
var origBook = await GetOriginalFile(id);
59-
if (origBook.Extension == ".epub") {
60-
book.Chapters = await FillChaptersFromEpub(origBook);
60+
if (Config.Options.NoChapters) {
61+
return book;
62+
}
63+
64+
var origBooks = await GetOriginalFiles(id);
65+
if (origBooks.Count == 1) {
66+
if (detailBook.ContentInfo.FileType == "EPUB") {
67+
book.Chapters = await FillChaptersFromEpub(origBooks[0]);
68+
} else {
69+
Config.Logger.LogInformation("Эта книга не в формате epub. Получить главы невозможно");
70+
}
6171
} else {
62-
Config.Logger.LogInformation("Эта книга не в формате epub. Получить главы невозможно");
72+
if (detailBook.ContentInfo.FileType == "JPG") {
73+
book.Chapters = FillChaptersFromImages(detailBook, origBooks);
74+
}
6375
}
64-
76+
6577
if (Config.Options.HasAdditionalType(AdditionalTypeEnum.Books)) {
66-
book.AdditionalFiles.Add(AdditionalTypeEnum.Books, origBook);
78+
foreach (var origBook in origBooks) {
79+
book.AdditionalFiles.Add(AdditionalTypeEnum.Books, origBook);
80+
}
6781
}
6882

6983
if (Config.Options.HasAdditionalType(AdditionalTypeEnum.Audio)) {
@@ -73,18 +87,43 @@ public override async Task<Book> Get(Uri url) {
7387
return book;
7488
}
7589

76-
private async Task<TempFile> GetOriginalFile(string bookId) {
77-
var fileMeta = await GetFileMeta(bookId);
78-
var fileUrl = await GetFileUrl(fileMeta.FirstOrDefault());
79-
var response = await Config.Client.GetWithTriesAsync(fileUrl.Url.AsUri());
80-
Config.Logger.LogInformation($"Оригинальный файл доступен по ссылке {fileUrl.Url.AsUri()}");
81-
return await TempFile.Create(fileUrl.Url.AsUri(), Config.TempFolder.Path, fileUrl.Url.AsUri().GetFileName(), await response.Content.ReadAsStreamAsync());
90+
private static IEnumerable<Chapter> FillChaptersFromImages(StrokiMtsBookItem book, IEnumerable<TempFile> images) {
91+
var sb = new StringBuilder();
92+
foreach (var image in images) {
93+
sb.Append($"<img src=\"{image.FullName}\" />");
94+
}
95+
96+
var chapter = new Chapter {
97+
Images = images,
98+
Content = sb.ToString(),
99+
Title = book.Title,
100+
};
101+
102+
return new List<Chapter>{chapter};
103+
}
104+
105+
private async Task<List<TempFile>> GetOriginalFiles(string bookId) {
106+
var fileMetas = await GetFileMeta(bookId);
107+
var result = new ConcurrentBag<Tuple<TempFile, int>>();
108+
109+
var tuples = fileMetas.Select((file, i) => Tuple.Create(file, i));
110+
await Parallel.ForEachAsync(tuples, async (t, _) => {
111+
var fileUrl = await GetFileUrl(t.Item1);
112+
var response = await Config.Client.GetWithTriesAsync(fileUrl.Url.AsUri());
113+
Config.Logger.LogInformation($"Оригинальный файл доступен по ссылке {fileUrl.Url.AsUri()}");
114+
var tempFile = await TempFile.Create(fileUrl.Url.AsUri(), Config.TempFolder.Path, fileUrl.Url.AsUri().GetFileName(), await response.Content.ReadAsStreamAsync(_));
115+
116+
result.Add(Tuple.Create(tempFile, t.Item2));
117+
});
118+
119+
120+
return result.OrderBy(t => t.Item2).Select(t => t.Item1).ToList();
82121
}
83122

84123
private async Task<List<TempFile>> GetAudio(StrokiMtsApiMultiResponse details) {
85124
var result = new List<TempFile>();
86125

87-
var detail = details.Items.FirstOrDefault(d => d.AudioBook != default);
126+
var detail = details?.Items.FirstOrDefault(d => d.AudioBook != default);
88127
if (detail == default) {
89128
return result;
90129
}
@@ -131,7 +170,12 @@ private async Task<StrokiMtsFileUrl> GetFileUrl(StrokiMtsFile file) {
131170
}
132171

133172
private async Task<StrokiMtsApiMultiResponse> GetBook(string id) {
134-
var json = await SendAsync<StrokiMtsApiResponse<StrokiMtsApiMultiResponse>>(() => GetMessage(SystemUrl.MakeRelativeUri($"/api/books/multi/{id}"), "5.38.0", "5.3"));
173+
var json = await SendAsync<StrokiMtsApiResponse<StrokiMtsApiMultiResponse>>(() => GetMessage(SystemUrl.MakeRelativeUri($"/api/books/multi/{id}"), "5.53", "7.0"));
174+
return json.Data;
175+
}
176+
177+
private async Task<StrokiMtsBookItem> GetSerial(string id) {
178+
var json = await SendAsync<StrokiMtsApiResponse<StrokiMtsBookItem>>(() => GetMessage(SystemUrl.MakeRelativeUri($"/api/serials/episodes/{id} "), "5.53", "7.0"));
135179
return json.Data;
136180
}
137181

Core/Types/StrokiMts/StrokiMtsBookItem.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,7 @@ public class StrokiMtsBookItem {
1818

1919
[JsonPropertyName("authors")]
2020
public List<StrokiMtsAuthor> Authors { get; set; }
21+
22+
[JsonPropertyName("contentInfo")]
23+
public StrokiMtsContentInfo ContentInfo { get; set; }
2124
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using System.Text.Json.Serialization;
2+
3+
namespace Core.Types.StrokiMts;
4+
5+
public class StrokiMtsContentInfo {
6+
[JsonPropertyName("fileType")]
7+
public string FileType { get; set; }
8+
}

Elib2EbookWeb/Components/BookForm.razor

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
@using Core.Configs
2+
@using Core.Extensions
23
@using Elib2EbookWeb.Misc
34
@inject IJSRuntime JsRuntime
45
@inject ISnackbar Snackbar
@@ -112,7 +113,7 @@
112113

113114
_onGenerate = true;
114115
_logger = new ActionLogger(str => {
115-
_log = str;
116+
_log = str.Crop(300);
116117
InvokeAsync(StateHasChanged);
117118
});
118119

Elib2EbookWeb/Elib2EbookWeb.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="MudBlazor" Version="7.15.0" />
11+
<PackageReference Include="MudBlazor" Version="7.16.0" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

0 commit comments

Comments
 (0)