waifu_gallery/gallery.go

152 lines
3.2 KiB
Go

package main
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
"text/template"
"time"
"waifu_gallery/openrouter"
"waifu_gallery/s3"
_ "embed"
"github.com/mochi-co/kana-tools"
)
//go:embed display.html
var displayTmpl string
// used for label size showing
var PPI = 96
// This is what the image generation code returns, S3metadataprefix + {input}
type ImageMetadata struct {
Title string `json:"title"`
Date time.Time `json:"date"`
Description string `json:"description"`
Prompt string `json:"prompt"`
Width int `json:"width"`
Height int `json:"height"`
SDseed string `json:"sd_seed"`
SDquery FooocusTxt2Img `json:"sd_query"`
LLLPromptCfg openrouter.ChatCompletions `json:"llm_prompt_cfg"`
LLLDescriptionCfg openrouter.ChatCompletions `json:"llm_description_cfg"`
}
// Used to serve the display page
type GalleryPageContent struct {
URL string
FullURL string
Label Label
JpnTitle string
Metadata ImageMetadata
}
type Label struct {
Title string
TitleJpn string
TitleJpnIsKatakana bool
Date string
Size string
Technique string
Description string
}
func serveGallery(w http.ResponseWriter, r *http.Request) {
// Check that the root got called
if r.RequestURI != "/" {
return
}
// Validate user key
key, err := handleSubdomain(w, r)
if err != nil {
InfoLogger.Println(err)
return
}
_, err = s3.GetMetadata(S3MetadataPrefix + key)
if err != nil {
switch s3.ToErrorResponse(err).Code {
case "NoSuchKey":
// Display loading page and finish
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Refresh", "25")
writeWaitingPage(w, key)
return
default:
serveInternalError(w)
ErrorLogger.Println(err)
return
}
}
// unmarshal image metadata
obj, err := s3.Download(S3MetadataPrefix + key)
if err != nil {
serveInternalError(w)
ErrorLogger.Println(err)
return
}
var metadata ImageMetadata
err = json.NewDecoder(obj).Decode(&metadata)
if err != nil {
serveInternalError(w)
ErrorLogger.Println(err)
return
}
// Picture exists, let's show it
err = writeDisplayPage(w, r, metadata)
if err != nil {
serveInternalError(w)
ErrorLogger.Println(err)
return
}
}
func writeDisplayPage(w http.ResponseWriter, r *http.Request, m ImageMetadata) (err error) {
// tmpl, err := template.New("display").Parse(displayTmpl)
// if err != nil {
// ErrorLogger.Println(err)
// return
// }
// DEBUG
tmpl, _ := template.ParseFiles("display.html")
// Dimensions
convToCm := func(px int, ppi int) string {
return strconv.FormatFloat(float64(px)/(float64(ppi)/float64(2.54)), 'f', 1, 64)
}
widthCm := convToCm(m.Width, PPI)
heightCm := convToCm(m.Height, PPI)
titleKatakana := kana.ToKatakana(m.Title)
// Template building
tmplData := GalleryPageContent{
URL: "img.png",
FullURL: r.Host + "/img.png",
Label: Label{
Title: m.Title,
TitleJpn: titleKatakana,
TitleJpnIsKatakana: kana.IsKatakana(titleKatakana),
Date: fmt.Sprintf("%d", m.Date.Year()),
Size: fmt.Sprintf("%s x %s cm", widthCm, heightCm),
Technique: "Digital Art",
Description: m.Description,
},
}
err = tmpl.Execute(w, tmplData)
return
}