package caddyhugo import ( "bytes" "fmt" "io" "net/http" "net/url" "path" "github.com/PuerkitoBio/goquery" "github.com/gohugoio/hugo/resources/page" "git.stephensearles.com/stephen/caddy-hugo2/media" ) func (ch *CaddyHugo) ReferencedMedia() map[string]map[page.Page]struct{} { found := map[string]map[page.Page]struct{}{} for _, pg := range ch.HugoSites.Pages() { renderOutput, err := pg.Render() if err != nil { continue } r := bytes.NewBufferString(string(renderOutput)) 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[page.Page]struct{}) } found[u][pg] = struct{}{} } return "" }) } return found } func (ch *CaddyHugo) uploadMedia(w http.ResponseWriter, r *http.Request) error { if ch.Media == nil { http.NotFound(w, r) return nil } mr, err := r.MultipartReader() if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return nil } for { part, err := mr.NextPart() if err == io.EOF { break } if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return err } name := part.FileName() if name != "" { err = ch.Media.ReceiveNewMedia(name, part) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return nil } } } return nil } func (ch *CaddyHugo) serveMediaPage(w http.ResponseWriter, r *http.Request) error { if ch.Media == nil { http.NotFound(w, r) return nil } referenced := ch.ReferencedMedia() io.WriteString(w, `
`) io.WriteString(w, UploadPage("media")) io.WriteString(w, `
`) if ch.Media != nil { mm, err := ch.Media.Walk() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return err } for _, m := range media.Set(mm).ByDate() { size, err := ch.Media.ThumbMax(*m, 100) if err != nil { fmt.Fprintf(w, `
error rendering %q: %v
`, m.Name, err) continue } refs := len(referenced[m.Name]) plural := "s" if refs == 1 { plural = "" } refLine := fmt.Sprintf("included on %d page%s", refs, plural) switch m.Type { case media.TypeImage: fmt.Fprintf(w, `

📋
%s
`, size.Dx(), size.Dy(), m.ThumbPath(size), m.Name, m.ThumbPath(size), refLine) case media.TypeVideo: // TODO: onmouseover sucks for mobile fmt.Fprintf(w, `

📋
%s
`, size.Dx(), size.Dy(), m.ThumbPath(size), m.Name, m.ThumbPath(size), refLine) } } } io.WriteString(w, ``) return nil } func (ch *CaddyHugo) serveMedia(w http.ResponseWriter, r *http.Request) error { if ch.Media == nil { http.NotFound(w, r) return nil } ch.Media.ServeHTTP(w, r) return nil }