stream.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package server
  2. import (
  3. "fmt"
  4. "net/http"
  5. "os"
  6. "strconv"
  7. "time"
  8. "github.com/felamaslen/gmus-backend/pkg/database"
  9. "github.com/felamaslen/gmus-backend/pkg/logger"
  10. "github.com/felamaslen/gmus-backend/pkg/repository"
  11. "github.com/go-redis/redis/v7"
  12. )
  13. func streamSong(l *logger.Logger, rdb *redis.Client, w http.ResponseWriter, r *http.Request) error {
  14. songIdQuery := r.URL.Query().Get("songid")
  15. songId, err := strconv.Atoi(songIdQuery)
  16. if err != nil {
  17. w.WriteHeader(400)
  18. w.Write([]byte("Must set songid to an int"))
  19. return nil
  20. }
  21. db := database.GetConnection()
  22. song, err := repository.SelectSong(db, songId)
  23. if err != nil {
  24. if err.Error() == "No such ID" {
  25. w.WriteHeader(404)
  26. w.Write([]byte("No such song"))
  27. return nil
  28. }
  29. return err
  30. }
  31. fullFilePath := fmt.Sprintf("%s/%s", song.BasePath, song.RelativePath)
  32. l.Debug("Streaming to client: %s\n", fullFilePath)
  33. file, err := os.Open(fullFilePath)
  34. if err != nil {
  35. return err
  36. }
  37. defer file.Close()
  38. w.Header().Set("Cache-Control", "no-cache")
  39. http.ServeContent(w, r, song.Title, time.Unix(song.ModifiedDate, 0), file)
  40. return nil
  41. }