137 lines
2.7 KiB
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
|
|
}
|