Static site generator for making web mixtapes in 2020.
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

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