152 lines
3.2 KiB
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
|
|
}
|