Добавлены страницы вики для GenAudioBookInfo: Home, Installation, Makefile, OpenRouter, Output Structure, TorrAPI и Sidebar.
Создана структура документации, описывающая функциональность, установку, использование CLI, архитектуру и интеграции с TorrAPI и OpenRouter. Добавлены примеры конфигурации и метаданных, а также описание структуры выходных данных.
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user