Static site generator for making web mixtapes in 2020.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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