Source: lib/similar.js

  1. var Artist = require('./artist')
  2. var Queue = require('./queue')
  3. var SpotifyRequestHandler = require('./spotify')
  4. var Top = require('./top')
  5. /**
  6. * Similar entry.
  7. * @constructor
  8. * @param {string} entry - The artist to search for.
  9. * @param {string} [id] - The Spotify ID, if known.
  10. */
  11. function Similar (spotify, entry, id, trackLimit, artistLimit) {
  12. /**
  13. * Array of related artists.
  14. */
  15. this.artists = []
  16. /**
  17. * Number of artists to fetch.
  18. */
  19. this.artistLimit = 20
  20. /**
  21. * Entry string.
  22. */
  23. this.entry = null
  24. /**
  25. * Spotify ID.
  26. */
  27. this.id = ''
  28. /**
  29. * Number of tracks to fetch per artist.
  30. */
  31. this.trackLimit = 5
  32. /**
  33. * Spotify request handler.
  34. */
  35. this.spotify = null
  36. this.entry = entry.trim()
  37. this.id = id
  38. this.spotify = spotify || new SpotifyRequestHandler()
  39. this.trackLimit = trackLimit || this.trackLimit
  40. this.artistLimit = artistLimit || this.artistLimit
  41. }
  42. /**
  43. * Create a queue of tracks.
  44. * @return {Promise | Queue} A queue of tracks.
  45. */
  46. Similar.prototype.createQueue = function () {
  47. var self = this
  48. var artists = this.artists.map(function (artist) {
  49. return new Top(self.spotify, self.entry, artist.id, self.limit)
  50. })
  51. var queue = new Queue(artists)
  52. queue = queue.slice(0, self.artistLimit)
  53. return queue.dispatch().then(function (result) {
  54. return result.interleave()
  55. })
  56. }
  57. /**
  58. * Dispatch entry.
  59. * @return {Promise | Queue} A queue of tracks.
  60. */
  61. Similar.prototype.dispatch = function () {
  62. var self = this
  63. return this.searchForArtist().then(function () {
  64. return self.searchForRelatedArtists()
  65. }).then(function () {
  66. return self.createQueue()
  67. })
  68. }
  69. /**
  70. * Search for artist.
  71. * @return {Promise} A Promise to perform the action.
  72. */
  73. Similar.prototype.searchForArtist = function () {
  74. var self = this
  75. var artist = new Artist(this.spotify, this.entry)
  76. return artist.searchForArtist().then(function (artist) {
  77. self.id = artist.id
  78. })
  79. }
  80. /**
  81. * Search for related artists.
  82. * @return {Promise} A Promise to perform the action.
  83. */
  84. Similar.prototype.searchForRelatedArtists = function () {
  85. var self = this
  86. return this.spotify.searchForRelatedArtists(this.id).then(function (response) {
  87. self.artists = response.artists
  88. return self
  89. })
  90. }
  91. module.exports = Similar