Static site generator for making web mixtapes in 2020.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
1.8 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. cmdGenerate = cli.Command{
  18. Name: "burn",
  19. Usage: "generate the static mixtape site",
  20. Action: generateAction,
  21. }
  22. )
  23. func newMixtape(wd string) (*cdr.Mixtape, error) {
  24. m := &cdr.Mixtape{Tracks: []cdr.Track{}}
  25. c := 1
  26. filepath.Walk(wd, func(path string, i os.FileInfo, err error) error {
  27. if !i.IsDir() && !strings.HasPrefix(i.Name(), ".") && i.Name() != "index.html" {
  28. t, err := cdr.NewTrack(i.Name())
  29. if err != nil {
  30. log.Printf("Skipping track %s: %v", i.Name(), err)
  31. return nil
  32. }
  33. t.Num = c
  34. c++
  35. log.Println("Adding track", t.Title)
  36. m.Tracks = append(m.Tracks, *t)
  37. }
  38. return nil
  39. })
  40. return m, nil
  41. }
  42. func generateAction(c *cli.Context) error {
  43. f, err := os.Create("index.html")
  44. if err != nil {
  45. return err
  46. }
  47. defer f.Close()
  48. wd, err := os.Getwd()
  49. if err != nil {
  50. return err
  51. }
  52. m, err := newMixtape(wd)
  53. if err != nil {
  54. return err
  55. }
  56. err = cdr.Render(m, f)
  57. if err != nil {
  58. return err
  59. }
  60. return nil
  61. }
  62. func serveAction(c *cli.Context) error {
  63. wd, err := os.Getwd()
  64. if err != nil {
  65. return err
  66. }
  67. m, err := newMixtape(wd)
  68. if err != nil {
  69. return err
  70. }
  71. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  72. if r.RequestURI != "/" {
  73. log.Printf("GET %s", r.RequestURI)
  74. http.ServeFile(w, r, filepath.Join(wd, r.RequestURI))
  75. return
  76. }
  77. err := cdr.Render(m, w)
  78. if err != nil {
  79. log.Printf("[ERROR] Render failed! %s", err)
  80. }
  81. log.Printf("GET /")
  82. })
  83. port := os.Getenv("PORT")
  84. if port == "" {
  85. port = "9991"
  86. }
  87. log.Printf("Serving on http://localhost:%s", port)
  88. return http.ListenAndServe(":"+port, nil)
  89. }