114 lines
3.0 KiB
Go
114 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,
|
|
"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
|
|
}
|