mirror of
https://github.com/gabehf/Koito.git
synced 2026-04-22 12:01:52 -07:00
wip: endpoint working
This commit is contained in:
parent
3b585f748a
commit
6b73f83484
19 changed files with 510 additions and 243 deletions
|
|
@ -1,54 +1,19 @@
|
|||
package summary
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"image"
|
||||
"image/color"
|
||||
"image/draw"
|
||||
_ "image/jpeg"
|
||||
"image/png"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
|
||||
"github.com/gabehf/koito/internal/cfg"
|
||||
"golang.org/x/image/font"
|
||||
"golang.org/x/image/font/opentype"
|
||||
"golang.org/x/image/math/fixed"
|
||||
_ "golang.org/x/image/webp"
|
||||
)
|
||||
|
||||
type Summary struct {
|
||||
Title string
|
||||
TopArtistImage string
|
||||
TopArtists []struct {
|
||||
Name string
|
||||
Plays int
|
||||
MinutesListened int
|
||||
}
|
||||
TopAlbumImage string
|
||||
TopAlbums []struct {
|
||||
Title string
|
||||
Plays int
|
||||
MinutesListened int
|
||||
}
|
||||
TopTrackImage string
|
||||
TopTracks []struct {
|
||||
Title string
|
||||
Plays int
|
||||
MinutesListened int
|
||||
}
|
||||
MinutesListened int
|
||||
Plays int
|
||||
AvgPlaysPerDay float32
|
||||
UniqueTracks int32
|
||||
UniqueAlbums int32
|
||||
UniqueArtists int32
|
||||
NewTracks int32
|
||||
NewAlbums int32
|
||||
NewArtists int32
|
||||
}
|
||||
|
||||
var (
|
||||
assetPath = path.Join("..", "..", "assets")
|
||||
titleFontPath = path.Join(assetPath, "LeagueSpartan-Medium.ttf")
|
||||
|
|
@ -63,69 +28,69 @@ var (
|
|||
)
|
||||
|
||||
// lots of code borrowed from https://medium.com/@daniel.ruizcamacho/how-to-create-an-image-in-golang-step-by-step-4416affe088f
|
||||
func GenerateImage(summary *Summary) error {
|
||||
base := image.NewRGBA(image.Rect(0, 0, 750, 1100))
|
||||
draw.Draw(base, base.Bounds(), image.NewUniform(color.Black), image.Pt(0, 0), draw.Over)
|
||||
// func GenerateImage(summary *Summary) error {
|
||||
// base := image.NewRGBA(image.Rect(0, 0, 750, 1100))
|
||||
// draw.Draw(base, base.Bounds(), image.NewUniform(color.Black), image.Pt(0, 0), draw.Over)
|
||||
|
||||
file, err := os.Create(path.Join(cfg.ConfigDir(), "summary.png"))
|
||||
if err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
defer file.Close()
|
||||
// file, err := os.Create(path.Join(cfg.ConfigDir(), "summary.png"))
|
||||
// if err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// defer file.Close()
|
||||
|
||||
// add title
|
||||
if err := addText(base, summary.Title, "", image.Pt(paddingLg, 60), titleFontPath, titleFontSize); err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
// add images
|
||||
if err := addImage(base, summary.TopArtistImage, image.Pt(-paddingLg, -120), featuredImageSize); err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
if err := addImage(base, summary.TopArtistImage, image.Pt(-paddingLg, -120-(featuredImageSize+paddingLg)), featuredImageSize); err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
if err := addImage(base, summary.TopArtistImage, image.Pt(-paddingLg, -120-(featuredImageSize+paddingLg)*2), featuredImageSize); err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
// top artists text
|
||||
if err := addText(base, "Top Artists", "", image.Pt(featureTextStart, 132), textFontPath, textFontSize); err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
for rank, artist := range summary.TopArtists {
|
||||
if rank == 0 {
|
||||
if err := addText(base, artist.Name, strconv.Itoa(artist.Plays)+" plays", image.Pt(featureTextStart, featuredImageSize+10), titleFontPath, titleFontSize); err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
} else {
|
||||
if err := addText(base, artist.Name, strconv.Itoa(artist.Plays)+" plays", image.Pt(featureTextStart, 210+(rank*(int(textFontSize)+paddingSm))), textFontPath, textFontSize); err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
// top albums text
|
||||
if err := addText(base, "Top Albums", "", image.Pt(featureTextStart, 132+featuredImageSize+paddingLg), textFontPath, textFontSize); err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
for rank, album := range summary.TopAlbums {
|
||||
if rank == 0 {
|
||||
if err := addText(base, album.Title, strconv.Itoa(album.Plays)+" plays", image.Pt(featureTextStart, featuredImageSize+10), titleFontPath, titleFontSize); err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
} else {
|
||||
if err := addText(base, album.Title, strconv.Itoa(album.Plays)+" plays", image.Pt(featureTextStart, 210+(rank*(int(textFontSize)+paddingSm))), textFontPath, textFontSize); err != nil {
|
||||
return fmt.Errorf("GenerateImage: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
// top tracks text
|
||||
// // add title
|
||||
// if err := addText(base, summary.Title, "", image.Pt(paddingLg, 60), titleFontPath, titleFontSize); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// // add images
|
||||
// if err := addImage(base, summary.TopArtistImage, image.Pt(-paddingLg, -120), featuredImageSize); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// if err := addImage(base, summary.TopArtistImage, image.Pt(-paddingLg, -120-(featuredImageSize+paddingLg)), featuredImageSize); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// if err := addImage(base, summary.TopArtistImage, image.Pt(-paddingLg, -120-(featuredImageSize+paddingLg)*2), featuredImageSize); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// // top artists text
|
||||
// if err := addText(base, "Top Artists", "", image.Pt(featureTextStart, 132), textFontPath, textFontSize); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// for rank, artist := range summary.TopArtists {
|
||||
// if rank == 0 {
|
||||
// if err := addText(base, artist.Name, strconv.Itoa(artist.Plays)+" plays", image.Pt(featureTextStart, featuredImageSize+10), titleFontPath, titleFontSize); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// } else {
|
||||
// if err := addText(base, artist.Name, strconv.Itoa(artist.Plays)+" plays", image.Pt(featureTextStart, 210+(rank*(int(textFontSize)+paddingSm))), textFontPath, textFontSize); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// // top albums text
|
||||
// if err := addText(base, "Top Albums", "", image.Pt(featureTextStart, 132+featuredImageSize+paddingLg), textFontPath, textFontSize); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// for rank, album := range summary.TopAlbums {
|
||||
// if rank == 0 {
|
||||
// if err := addText(base, album.Title, strconv.Itoa(album.Plays)+" plays", image.Pt(featureTextStart, featuredImageSize+10), titleFontPath, titleFontSize); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// } else {
|
||||
// if err := addText(base, album.Title, strconv.Itoa(album.Plays)+" plays", image.Pt(featureTextStart, 210+(rank*(int(textFontSize)+paddingSm))), textFontPath, textFontSize); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: %w", err)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// // top tracks text
|
||||
|
||||
// stats text
|
||||
// // stats text
|
||||
|
||||
if err := png.Encode(file, base); err != nil {
|
||||
return fmt.Errorf("GenerateImage: png.Encode: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// if err := png.Encode(file, base); err != nil {
|
||||
// return fmt.Errorf("GenerateImage: png.Encode: %w", err)
|
||||
// }
|
||||
// return nil
|
||||
// }
|
||||
|
||||
func addImage(baseImage *image.RGBA, path string, point image.Point, height int) error {
|
||||
templateFile, err := os.Open(path)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue