package caddyhugo import ( "bytes" "fmt" "io" "net/http" "net/url" "path" "github.com/PuerkitoBio/goquery" "github.com/gohugoio/hugo/hugolib" "git.stephensearles.com/stephen/caddy-hugo2/media" ) func (ch *CaddyHugo) ReferencedMedia() map[string]map[*hugolib.Page]struct{} { found := map[string]map[*hugolib.Page]struct{}{} for _, page := range ch.HugoSites.Pages() { r := bytes.NewBufferString(string(page.Render())) doc, err := goquery.NewDocumentFromReader(r) if err != nil { continue } doc.Find("img,video").Map(func(i int, s *goquery.Selection) string { u, ok := s.Attr("src") if ok { u = path.Base(u) if ud, err := url.QueryUnescape(u); err == nil { u = ud } if m := found[u]; m == nil { found[u] = make(map[*hugolib.Page]struct{}) } found[u][page] = struct{}{} } return "" }) } return found } func (ch *CaddyHugo) uploadMedia(w http.ResponseWriter, r *http.Request) (int, error) { if ch.Media == nil { http.NotFound(w, r) return 404, nil } mr, err := r.MultipartReader() if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return 400, nil } for { part, err := mr.NextPart() if err == io.EOF { break } if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return 400, nil } name := part.FileName() if name != "" { err = ch.Media.ReceiveNewMedia(name, part) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return 500, nil } } } return 200, nil } func (ch *CaddyHugo) serveMediaPage(w http.ResponseWriter, r *http.Request) (int, error) { if ch.Media == nil { http.NotFound(w, r) return 404, nil } referenced := ch.ReferencedMedia() io.WriteString(w, `