108 lines
2.5 KiB
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
|
|
}
|