Добавлены страницы вики для GenAudioBookInfo: Home, Installation, Makefile, OpenRouter, Output Structure, TorrAPI и Sidebar.

Создана структура документации, описывающая функциональность, установку, использование CLI, архитектуру и интеграции с TorrAPI и OpenRouter.
Добавлены примеры конфигурации и метаданных, а также описание структуры выходных данных.
This commit is contained in:
Dmitriy Fofanov
2026-02-23 13:19:39 +03:00
parent 107f57d2cc
commit 41fb62f62e
31 changed files with 4181 additions and 1376 deletions
+15 -22
View File
@@ -14,6 +14,7 @@ import (
"github.com/dhowden/tag"
"github.com/fofanov/genaudiobookinfo/internal/domain"
"github.com/fofanov/genaudiobookinfo/internal/nameparser"
)
// TagMetadataExtractor реализует domain.MetadataExtractor.
@@ -82,7 +83,7 @@ func (e *TagMetadataExtractor) Extract(ctx context.Context, folderPath string) (
info := &domain.AudioBookInfo{
FolderPath: folderPath,
Title: titleFromTag(title, filepath.Base(folderPath)),
Author: reorderAuthorName(artist),
Author: nameparser.ReorderAuthorName(artist),
Album: album,
Genre: genre,
Year: metadata.Year(),
@@ -116,34 +117,26 @@ func coalesceInt(values ...int) int {
return 0
}
// reorderAuthorName удаляет отчество (если есть) и переставляет:
// "Имя Отчество Фамилия" → "Фамилия Имя", "Имя Фамилия" → "Фамилия Имя".
func reorderAuthorName(name string) string {
name = strings.TrimSpace(name)
if name == "" {
return name
}
parts := strings.Fields(name)
if len(parts) >= 3 {
parts = []string{parts[0], parts[len(parts)-1]}
}
if len(parts) == 2 {
return parts[1] + " " + parts[0]
}
return name
}
// titleFromTag возвращает title из MP3 тега, если он содержит кириллицу.
// Если title из тега пуст или не содержит кириллических символов —
// используется имя папки как fallback.
// titleFromTag возвращает title из MP3 тега, если он содержит хотя бы один буквенный символ.
// Если title из тега пуст — используется имя папки как fallback.
func titleFromTag(tagTitle, folderName string) string {
tagTitle = strings.TrimSpace(tagTitle)
if tagTitle != "" && containsCyrillic(tagTitle) {
if tagTitle != "" && hasPrintableText(tagTitle) {
return tagTitle
}
return folderName
}
// hasPrintableText проверяет, содержит ли строка хотя бы одну букву или цифру.
func hasPrintableText(s string) bool {
for _, r := range s {
if unicode.IsLetter(r) || unicode.IsDigit(r) {
return true
}
}
return false
}
// containsCyrillic проверяет, содержит ли строка хотя бы один кириллический символ.
func containsCyrillic(s string) bool {
for _, r := range s {