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 }