player.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package repository
  2. import (
  3. "database/sql"
  4. "github.com/felamaslen/gmus-backend/pkg/read"
  5. "github.com/jmoiron/sqlx"
  6. )
  7. func GetNextSong(db *sqlx.DB, prevSongId int) (nextSong *read.Song, err error) {
  8. nextSong = &read.Song{}
  9. err = db.QueryRowx(
  10. `
  11. select
  12. s1.id
  13. ,s1.track_number
  14. ,s1.title
  15. ,s1.artist
  16. ,s1.album
  17. ,s1.duration
  18. from (
  19. select * from songs where id = $1
  20. ) s0
  21. left join songs s1 on (
  22. s1.artist > s0.artist
  23. or (s1.artist = s0.artist
  24. and s1.album > s0.album
  25. )
  26. or (s1.artist = s0.artist
  27. and s1.album = s0.album
  28. and s1.track_number > s0.track_number
  29. )
  30. or (s1.artist = s0.artist
  31. and s1.album = s0.album
  32. and s1.track_number = s0.track_number
  33. and s1.title > s0.title
  34. )
  35. or (s1.artist = s0.artist
  36. and s1.album = s0.album
  37. and s1.track_number = s0.track_number
  38. and s1.title = s0.title
  39. and s1.id > s0.id
  40. )
  41. )
  42. order by
  43. s1.artist
  44. ,s1.album
  45. ,s1.track_number
  46. ,s1.title
  47. ,s1.id
  48. limit 1
  49. `,
  50. prevSongId,
  51. ).StructScan(nextSong)
  52. if err != nil && err == sql.ErrNoRows {
  53. err = nil
  54. nextSong = &read.Song{Id: 0}
  55. }
  56. return
  57. }
  58. func GetPrevSong(db *sqlx.DB, nextSongId int) (prevSong *read.Song, err error) {
  59. prevSong = &read.Song{}
  60. err = db.QueryRowx(
  61. `
  62. select
  63. s1.id
  64. ,s1.track_number
  65. ,s1.title
  66. ,s1.artist
  67. ,s1.album
  68. ,s1.duration
  69. from (
  70. select * from songs where id = $1
  71. ) s0
  72. left join songs s1 on (
  73. s1.artist < s0.artist
  74. or (s1.artist = s0.artist
  75. and s1.album < s0.album
  76. )
  77. or (s1.artist = s0.artist
  78. and s1.album = s0.album
  79. and s1.track_number < s0.track_number
  80. )
  81. or (s1.artist = s0.artist
  82. and s1.album = s0.album
  83. and s1.track_number = s0.track_number
  84. and s1.title < s0.title
  85. )
  86. or (s1.artist = s0.artist
  87. and s1.album = s0.album
  88. and s1.track_number = s0.track_number
  89. and s1.title = s0.title
  90. and s1.id < s0.id
  91. )
  92. )
  93. order by
  94. s1.artist desc
  95. ,s1.album desc
  96. ,s1.track_number desc
  97. ,s1.title desc
  98. ,s1.id desc
  99. limit 1
  100. `,
  101. nextSongId,
  102. ).StructScan(prevSong)
  103. if err != nil && err == sql.ErrNoRows {
  104. err = nil
  105. prevSong = &read.Song{Id: 0}
  106. }
  107. return
  108. }