vodular/templates/text.go

108 lines
2.5 KiB
Go

package templates
import (
"context"
"fmt"
"log/slog"
"os"
"path"
"strings"
"text/template"
"time"
"arimelody.space/melody-vod-manager/scanner"
)
type (
TextTemplates struct {
Title *template.Template
Description *template.Template
DefaultTags []string
}
TextTemplateData struct {
Title string
Part uint
Date time.Time
Category *scanner.Category
}
)
const DefaultTitleTemplate =
"{{.Title}} - {{FormatTime .Date \"02 Jan 2006\"}}"
const DefaultDescriptionTemplate =
"Streamed on {{FormatTime .Date \"02 January 2006\"}}"
func FetchTemplates(ctx context.Context, templateDir string) (*TextTemplates, error) {
tmpl := TextTemplates{}
logger := slog.Default().WithGroup("TEMPLATE")
var tagsPath = path.Join(templateDir, "tags.txt")
var titlePath = path.Join(templateDir, "title.txt")
var descriptionPath = path.Join(templateDir, "description.txt")
// tags
if tagsFile, err := os.ReadFile(tagsPath); err == nil {
tmpl.DefaultTags = strings.Split(string(tagsFile), "\n")
} else {
if !os.IsNotExist(err) { return nil, err }
logger.Info(fmt.Sprintf(
"%s not found. No default tags will be used.",
tagsPath,
))
tmpl.DefaultTags = []string{}
}
// title
titleTemplate := template.New("title").Funcs(templateFuncs)
if titleFile, err := os.ReadFile(titlePath); err == nil {
tmpl.Title, err = titleTemplate.Parse(string(titleFile))
if err != nil {
return nil, fmt.Errorf("failed to parse title template: %v", err)
}
} else {
if !os.IsNotExist(err) { return nil, err }
logger.Info(
fmt.Sprintf(
"%s not found. Falling back to default template:",
titlePath,
),
"template",
DefaultTitleTemplate,
)
tmpl.Title, err = titleTemplate.Parse(DefaultTitleTemplate)
if err != nil { panic(err) }
os.WriteFile(titlePath, []byte(DefaultTitleTemplate), 0644)
}
// description
descriptionTemplate := template.New("description").Funcs(templateFuncs)
if descriptionFile, err := os.ReadFile(descriptionPath); err == nil {
tmpl.Description, err = descriptionTemplate.Parse(string(descriptionFile))
if err != nil {
return nil, fmt.Errorf("failed to parse description template: %v", err)
}
} else {
if !os.IsNotExist(err) { return nil, err }
logger.Info(
fmt.Sprintf(
"%s not found. Falling back to default template:",
descriptionPath,
),
"template",
DefaultDescriptionTemplate,
)
tmpl.Description, err = descriptionTemplate.Parse(DefaultDescriptionTemplate)
if err != nil { panic(err) }
os.WriteFile(descriptionPath, []byte(DefaultDescriptionTemplate), 0644)
}
return &tmpl, nil
}