Static site generator for making web mixtapes in 2020.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

105 Zeilen
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. }