hugo-medialog/internal/music/controller.go

115 lines
3.0 KiB
Go

package music
import (
"fmt"
"hugo-medialog/utils"
"os"
"path/filepath"
"gopkg.in/yaml.v2"
)
func LoadAlbums() ([]Album, error) {
albumsFile := os.Getenv("OBSIDIAN_MUSIC_FILE")
fileData, err := os.ReadFile(albumsFile)
if err != nil {
return nil, err
}
var albums []Album
err = yaml.Unmarshal(fileData, &albums)
if err != nil {
return nil, err
}
return albums, nil
}
func ProcessAlbum(albumList []Album, update bool) error {
utils.Sep()
fmt.Printf(" M U S I C\n")
utils.Sep()
for _, album := range albumList {
fmt.Printf("Title: %s\n", album.Title)
// If we're updating, the process is a bit different
if update || !album.New {
outputDir := os.Getenv("MARKDOWN_OUTPUT_MUSIC_DIR")
mdFilePath := filepath.Join(outputDir, fmt.Sprintf("%s.md", utils.Sluggify(album.Title)))
frontmatter, content, err := utils.LoadMarkdown(mdFilePath)
if err != nil {
fmt.Printf(" ! Error loading markdown frontmatter for album %s: %v\n", album.Title, err)
continue
}
updatedFrontmatter := updateFrontmatterWithYAML(frontmatter, album)
err = utils.SaveUpdatedMarkdown(mdFilePath, updatedFrontmatter, content)
if err != nil {
fmt.Printf(" ! Error saving updated markdown for album %s: %v\n", album.Title, err)
continue
}
// We want to continue the loop here, in update's cases we don't
// want to do any api calls for info nor for images
continue
}
// If we dont have ID, search album by Title and get the ID
if album.ID == "" {
err := SearchAlbumByTitle(album.Title, &album)
if err != nil {
fmt.Printf(" ! Error searching album by title %s: %s\n", album.Title, err)
continue
}
}
album.Slug = utils.Sluggify(album.Title)
// Now we need to get the image
if album.Image != "" {
err := DownloadImage(album.Image, album.Slug)
if err != nil {
fmt.Printf(" ! Error downloading %s: %s\n", album.Image, err)
}
}
album.Image = fmt.Sprintf("%s.jpg", album.Slug)
err := generateAlbumMarkdown(album)
if err != nil {
return err
}
utils.Sep()
}
return nil
}
func generateAlbumMarkdown(album Album) error {
templatePath := filepath.Join(os.Getenv("TEMPLATES_DIR"), "music.md.tpl")
outputDir := os.Getenv("MARKDOWN_OUTPUT_MUSIC_DIR")
if err := utils.CreateDirIfNotExists(outputDir); err != nil {
return err
}
outputPath := filepath.Join(outputDir, fmt.Sprintf("%s.md", album.Slug))
data := map[string]interface{}{
"Title": album.Title,
"Artist": album.Artist,
"Link": album.Link,
"Subtitle": album.Year,
"Year": album.Year,
"Rate": album.Rate,
"Tracks": album.Tracks,
"Image": album.Image,
"Date": album.Date,
"ReleaseDate": album.ReleaseDate,
"Tags": "listening",
}
return utils.GenerateMarkdown(templatePath, outputPath, data)
}
// Helper function to update only YAML fields that exist in both the frontmatter and YAML data
func updateFrontmatterWithYAML(frontmatter utils.FrontMatter, album Album) utils.FrontMatter {
frontmatter.Date = album.Date
frontmatter.Rate = album.Rate
return frontmatter
}