waifu_gallery/gallery.go

137 lines
2.7 KiB
Go

package main
import (
"fmt"
"html/template"
"net/http"
"strconv"
"time"
"waifu_gallery/s3"
"golang.org/x/text/cases"
"golang.org/x/text/language"
"github.com/mochi-co/kana-tools"
_ "embed"
)
//go:embed display.html
var displayTmpl string
// used for label size showing
var PPI = 96
type FileData struct {
URL string
Name string
Size int64
Date time.Time
Metadata map[string]string
}
// Used to serve the display page
type Img struct {
URL string
FullURL string
Width int
Height int
}
type Label struct {
Title string
TitleJpn string
TitleJpnIsKatakana bool
Date string
Size string
Technique string
}
type GalleryPageContent struct {
Img Img
Label Label
}
func serveGallery(w http.ResponseWriter, r *http.Request) {
// Check that the root got called
if r.RequestURI != "/" {
return
}
// Validate user input
input, err := handleSubdomain(w, r)
if err != nil {
InfoLogger.Println(err)
return
}
metadata, err := s3.GetMetadata(input)
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", "20")
writeWaitingPage(w, input)
return
default:
serveInternalError(w)
ErrorLogger.Println(err)
return
}
}
// Picture exists, let's show it
err = writeDisplayPage(w, r, FileData{
URL: "img.png",
Name: metadata.Key,
Size: metadata.Size,
Date: metadata.LastModified,
Metadata: metadata.UserMetadata,
})
if err != nil {
serveInternalError(w)
ErrorLogger.Println(err)
}
}
func writeDisplayPage(w http.ResponseWriter, r *http.Request, m FileData) (err error) {
tmpl, err := template.New("display").Parse(displayTmpl)
if err != nil {
ErrorLogger.Println(err)
return
}
// Dimensions
width, _ := strconv.Atoi(m.Metadata["Width"])
height, _ := strconv.Atoi(m.Metadata["Height"])
convToCm := func(px int, ppi int) string {
return strconv.FormatFloat(float64(px)/(float64(ppi)/float64(2.54)), 'f', 1, 64)
}
widthCm := convToCm(width, PPI)
heightCm := convToCm(height, PPI)
titleKatakana := kana.ToKatakana(m.Name)
// Template building
tmplData := GalleryPageContent{
Img: Img{
URL: "img.png",
FullURL: r.Host + "/img.png",
Width: width,
Height: height,
},
Label: Label{
Title: cases.Title(language.English).String(m.Name),
TitleJpn: titleKatakana,
TitleJpnIsKatakana: kana.IsKatakana(titleKatakana),
Date: fmt.Sprintf("%d", m.Date.Year()),
Size: fmt.Sprintf("%s x %s cm", widthCm, heightCm),
Technique: m.Metadata["Technique"],
},
}
err = tmpl.Execute(w, tmplData)
return
}