Static site generator for making web mixtapes in 2020.
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

67 строки
1.2 KiB

  1. package main
  2. import (
  3. "log"
  4. "net/http"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "github.com/thebaer/cdr"
  9. "github.com/urfave/cli"
  10. )
  11. var (
  12. cmdServe = cli.Command{
  13. Name: "preview",
  14. Usage: "serve the mixtape site",
  15. Action: serveAction,
  16. }
  17. )
  18. func newMixtape(wd string) (*cdr.Mixtape, error) {
  19. m := &cdr.Mixtape{Tracks: []cdr.Track{}}
  20. filepath.Walk(wd, func(path string, i os.FileInfo, err error) error {
  21. if !i.IsDir() && !strings.HasPrefix(i.Name(), ".") && i.Name() != "index.html" {
  22. t, err := cdr.NewTrack(i.Name())
  23. if err == nil {
  24. log.Printf("Skipping track %s: %v", i.Name(), err)
  25. return nil
  26. }
  27. log.Println("Adding track", t.Title)
  28. m.Tracks = append(m.Tracks, *t)
  29. }
  30. return nil
  31. })
  32. return m, nil
  33. }
  34. func serveAction(c *cli.Context) error {
  35. wd, err := os.Getwd()
  36. if err != nil {
  37. return err
  38. }
  39. m, err := newMixtape(wd)
  40. if err != nil {
  41. return err
  42. }
  43. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  44. if r.RequestURI != "/" {
  45. log.Printf("GET %s", r.RequestURI)
  46. http.ServeFile(w, r, filepath.Join(wd, r.RequestURI))
  47. return
  48. }
  49. err := cdr.Render(m, w)
  50. if err != nil {
  51. log.Printf("[ERROR] Render failed! %s", err)
  52. }
  53. log.Printf("GET /")
  54. })
  55. return http.ListenAndServe(":9991", nil)
  56. }