Skip to content

Commit

Permalink
https://github.com/OnlyFart/Elib2Ebook/issues/123
Browse files Browse the repository at this point in the history
  • Loading branch information
OnlyFart committed Oct 19, 2024
1 parent a5daacb commit 2a96f80
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 26 deletions.
5 changes: 5 additions & 0 deletions Core/Configs/Options.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices.JavaScript;
using CommandLine;
using Core.Logic;
using Core.Misc;

namespace Core.Configs;
Expand Down Expand Up @@ -69,6 +71,9 @@ public Options(IEnumerable<string> url) {
[Option("additional-types", Required = false, HelpText = "Типы дополнительных файлов. Допустимые значения: books, audio, images", Separator = ',')]
public IEnumerable<AdditionalTypeEnum> AdditionalTypes { get; set; }

[Option("book-name-pattern", Required = false, HelpText = "Шаблон имени файла. Допустимые значения: {author}, {title}, {seria}, {seria_number}", Default = "{" + BookNameBuilder.AUTHOR_PATTERN + "} - {" + BookNameBuilder.TITLE_PATTERN + "}")]
public string BookNamePattern { get; set; }

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

public string ResourcesPath => "Patterns";
Expand Down
30 changes: 30 additions & 0 deletions Core/Logic/BookNameBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System.Collections.Generic;
using Core.Extensions;
using Core.Types.Book;

namespace Core.Logic;

public class BookNameBuilder {
public const string TITLE_PATTERN = "title";

public const string AUTHOR_PATTERN = "author";

public const string SERIA_PATTERN = "seria";

public const string SERIA_NUMBER_PATTERN = "seria_number";

public static string Build(string pattern, Book book) {
var map = new Dictionary<string, string> {
{ TITLE_PATTERN, book.Title },
{ AUTHOR_PATTERN, book.Author.Name },
{ SERIA_PATTERN, book.Seria?.Name },
{ SERIA_NUMBER_PATTERN, book.Seria?.Number },
};

foreach (var (key, value) in map) {
pattern = pattern.Replace("{" + key + "}", value.RemoveInvalidChars());
}

return pattern.RemoveInvalidChars().Crop(100);
}
}
2 changes: 1 addition & 1 deletion Core/Logic/Builders/AdditionaFileBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ private void CreateDirectory(string directory) {
}

public async Task Build(Book book) {
var additionalPath = $"{book.Author.Name} - {book.Title}".Crop(100).RemoveInvalidChars();
var additionalPath = BookNameBuilder.Build(_options.BookNamePattern, book);
if (!string.IsNullOrWhiteSpace(_options.SavePath)) {
additionalPath = Path.Combine(_options.SavePath, additionalPath);
}
Expand Down
6 changes: 3 additions & 3 deletions Core/Logic/Builders/BuilderBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,14 @@ protected BuilderBase(Options options, ILogger logger) {
/// </summary>
/// <param name="book"></param>
/// <returns></returns>
protected virtual string GetFileName(Book book) => $"{GetTitle(book)}.{Extension}".RemoveInvalidChars();
protected virtual string GetFileName(Book book) => $"{GetTitle(book)}.{Extension}";

/// <summary>
/// Получение полного названия книги
/// </summary>
/// <param name="book"></param>
/// <returns></returns>
protected virtual string GetTitle(Book book) => $"{book.Author.Name.RemoveInvalidChars()} - {book.Title.RemoveInvalidChars()}".Crop(100);
protected virtual string GetTitle(Book book) => BookNameBuilder.Build(Options.BookNamePattern, book);

/// <summary>
/// Создание файла
Expand Down Expand Up @@ -76,7 +76,7 @@ private async Task SaveCover(string directory, TempFile cover, string name) {
return;
}

var fileName = $"{name}_cover{cover.Extension}".RemoveInvalidChars();
var fileName = $"{name}_cover{cover.Extension}";

if (!string.IsNullOrWhiteSpace(directory)) {
if (!Directory.Exists(directory)) {
Expand Down
12 changes: 11 additions & 1 deletion Elib2EbookCli/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,23 @@ private static async Task Main(string[] args) {
Console.OutputEncoding = Encoding.UTF8;

var logger = new ConsoleLogger();

var parserResult = new Parser(with => with.CaseInsensitiveEnumValues = true).ParseArguments<Options>(args);

await new Parser(with => with.CaseInsensitiveEnumValues = true).ParseArguments<Options>(args)
await parserResult
.WithNotParsed(errors => {
var sentenceBuilder = SentenceBuilder.Create();
foreach (var error in errors) {
logger.LogInformation(sentenceBuilder.FormatError(error));
}

var helpText = HelpText.AutoBuild(parserResult, h => {
h.Heading = string.Empty; //change header
h.Copyright = string.Empty; //change copyright text
return h;
}, e => e);

logger.LogInformation(helpText);
})
.WithParsedAsync(async options => {
using var getterConfig = BookGetterConfig.GetDefault(options, logger);
Expand Down
43 changes: 22 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,24 +153,25 @@ docker run --rm -p 8080:8080 onlyfart/elib2ebookweb


## Полный список опций
| Команда | Описание |
|--------------------|----------------------------------------------------------------------------------------------|
| -u, --url | Обязательное. Ссылка на книгу |
| -f, --format | Обязательное. Формат для сохранения книги. Допустимые значения: epub, fb2, cbz, json, txt |
| -l, --login | Логин от системы |
| -p, --password | Пароль от системы |
| --proxy | Прокси в формате (http or socks4 or socks5)://host:port/ |
| -s, --save | Директория для сохранения книги |
| -c, --cover | Сохранить обложку книги в отдельный файл |
| -t, --timeout | (По-умолчанию: 120) Timeout для запросов в секундах |
| -d, --delay | (По-умолчанию: 0) Задержка между запросами в секундах |
| --no-image | Не загружать картинки |
| --temp | Директория для хранения временных файлов |
| --save-temp | Не удалять временную директорию |
| --start | Стартовый номер главы |
| --end | Конечный номер главы |
| --start-name | Стартовое имя главы |
| --end-name | Конечное имя главы |
| --no-chapters | Не загружать главы |
| --additional | Сохранить дополнительные файлы (оригинальные файлы книг, аудиоверсии и т.д.) |
| --additional-types | Типы дополнительных файлов. Допустимые значения: books, audio, images |
| Команда | Описание |
|----------------------|------------------------------------------------------------------------------------------------------------------------|
| -u, --url | Обязательное. Ссылка на книгу |
| -f, --format | Обязательное. Формат для сохранения книги. Допустимые значения: epub, fb2, cbz, json, txt |
| -l, --login | Логин от системы |
| -p, --password | Пароль от системы |
| --proxy | Прокси в формате (http or socks4 or socks5)://host:port/ |
| -s, --save | Директория для сохранения книги |
| -c, --cover | Сохранить обложку книги в отдельный файл |
| -t, --timeout | (По-умолчанию: 120) Timeout для запросов в секундах |
| -d, --delay | (По-умолчанию: 0) Задержка между запросами в секундах |
| --no-image | Не загружать картинки |
| --temp | Директория для хранения временных файлов |
| --save-temp | Не удалять временную директорию |
| --start | Стартовый номер главы |
| --end | Конечный номер главы |
| --start-name | Стартовое имя главы |
| --end-name | Конечное имя главы |
| --no-chapters | Не загружать главы |
| --additional | Сохранить дополнительные файлы (оригинальные файлы книг, аудиоверсии и т.д.) |
| --additional-types | Типы дополнительных файлов. Допустимые значения: books, audio, images |
| --book-name-pattern | (По-умолчанию: {author} - {title}) Шаблон для имени файла. Допустимые значение {author},{title},{seria},{seria_number} |

0 comments on commit 2a96f80

Please sign in to comment.