stream.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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"
  12. )
  13. func streamSong(l *logger.Logger, rdb redis.Cmdable, 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. songs, err := repository.SelectSong(db, []int{songId})
  23. if err != nil {
  24. return err
  25. }
  26. if len(*songs) == 0 {
  27. w.WriteHeader(404)
  28. w.Write([]byte("No such song"))
  29. return nil
  30. }
  31. song := (*songs)[0]
  32. fullFilePath := fmt.Sprintf("%s/%s", song.BasePath, song.RelativePath)
  33. l.Debug("Streaming to client: %s\n", fullFilePath)
  34. file, err := os.Open(fullFilePath)
  35. if err != nil {
  36. return err
  37. }
  38. defer file.Close()
  39. w.Header().Set("Cache-Control", "no-cache")
  40. http.ServeContent(w, r, song.Title, time.Unix(song.ModifiedDate, 0), file)
  41. return nil
  42. }