apis.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import config from "config";
  2. import async from "async";
  3. import request from "request";
  4. import { isAdminRequired } from "./hooks";
  5. // const moduleManager = require("../../index");
  6. import utils from "../utils";
  7. // const logger = moduleManager.modules["logger"];
  8. export default {
  9. /**
  10. * Fetches a list of songs from Youtubes API
  11. *
  12. * @param {object} session - user session
  13. * @param {string} query - the query we'll pass to youtubes api
  14. * @param {Function} cb - callback
  15. * @returns {{status: string, data: object}} - returns an object
  16. */
  17. searchYoutube: (session, query, cb) => {
  18. const params = [
  19. "part=snippet",
  20. `q=${encodeURIComponent(query)}`,
  21. `key=${config.get("apis.youtube.key")}`,
  22. "type=video",
  23. "maxResults=15"
  24. ].join("&");
  25. return async.waterfall(
  26. [
  27. next => {
  28. request(`https://www.googleapis.com/youtube/v3/search?${params}`, next);
  29. },
  30. (res, body, next) => {
  31. next(null, JSON.parse(body));
  32. }
  33. ],
  34. async (err, data) => {
  35. console.log(data.error);
  36. if (err || data.error) {
  37. if (!err) err = data.error.message;
  38. err = await utils.runJob("GET_ERROR", { error: err });
  39. console.log(
  40. "ERROR",
  41. "APIS_SEARCH_YOUTUBE",
  42. `Searching youtube failed with query "${query}". "${err}"`
  43. );
  44. return cb({ status: "failure", message: err });
  45. }
  46. console.log("SUCCESS", "APIS_SEARCH_YOUTUBE", `Searching YouTube successful with query "${query}".`);
  47. return cb({ status: "success", data });
  48. }
  49. );
  50. },
  51. /**
  52. * Gets Spotify data
  53. *
  54. * @param session
  55. * @param title - the title of the song
  56. * @param artist - an artist for that song
  57. * @param cb
  58. */
  59. getSpotifySongs: isAdminRequired((session, title, artist, cb) => {
  60. async.waterfall(
  61. [
  62. next => {
  63. utils
  64. .runJob("GET_SONGS_FROM_SPOTIFY", { title, artist })
  65. .then(songs => {
  66. next(null, songs);
  67. })
  68. .catch(next);
  69. }
  70. ],
  71. songs => {
  72. console.log(
  73. "SUCCESS",
  74. "APIS_GET_SPOTIFY_SONGS",
  75. `User "${session.userId}" got Spotify songs for title "${title}" successfully.`
  76. );
  77. cb({ status: "success", songs });
  78. }
  79. );
  80. }),
  81. /**
  82. * Gets Discogs data
  83. *
  84. * @param session
  85. * @param query - the query
  86. * @param {Function} cb
  87. */
  88. searchDiscogs: isAdminRequired((session, query, page, cb) => {
  89. async.waterfall(
  90. [
  91. next => {
  92. const params = [`q=${encodeURIComponent(query)}`, `per_page=20`, `page=${page}`].join("&");
  93. const options = {
  94. url: `https://api.discogs.com/database/search?${params}`,
  95. headers: {
  96. "User-Agent": "Request",
  97. Authorization: `Discogs key=${config.get("apis.discogs.client")}, secret=${config.get(
  98. "apis.discogs.secret"
  99. )}`
  100. }
  101. };
  102. request(options, (err, res, body) => {
  103. if (err) next(err);
  104. body = JSON.parse(body);
  105. next(null, body);
  106. if (body.error) next(body.error);
  107. });
  108. }
  109. ],
  110. async (err, body) => {
  111. if (err) {
  112. err = await utils.runJob("GET_ERROR", { error: err });
  113. console.log(
  114. "ERROR",
  115. "APIS_SEARCH_DISCOGS",
  116. `Searching discogs failed with query "${query}". "${err}"`
  117. );
  118. return cb({ status: "failure", message: err });
  119. }
  120. console.log(
  121. "SUCCESS",
  122. "APIS_SEARCH_DISCOGS",
  123. `User "${session.userId}" searched Discogs succesfully for query "${query}".`
  124. );
  125. return cb({
  126. status: "success",
  127. results: body.results,
  128. pages: body.pagination.pages
  129. });
  130. }
  131. );
  132. }),
  133. /**
  134. * Joins a room
  135. *
  136. * @param {object} session - user session
  137. * @param {string} page - the room to join
  138. * @param {Function} cb - callback
  139. */
  140. joinRoom: (session, page, cb) => {
  141. if (page === "home") {
  142. utils.runJob("SOCKET_JOIN_ROOM", {
  143. socketId: session.socketId,
  144. room: page
  145. });
  146. }
  147. cb({});
  148. },
  149. /**
  150. * Joins an admin room
  151. *
  152. * @param {object} session - user session
  153. * @param {string} page - the admin room to join
  154. * @param {Function} cb - callback
  155. */
  156. joinAdminRoom: isAdminRequired((session, page, cb) => {
  157. if (
  158. page === "queue" ||
  159. page === "songs" ||
  160. page === "stations" ||
  161. page === "reports" ||
  162. page === "news" ||
  163. page === "users" ||
  164. page === "statistics" ||
  165. page === "punishments"
  166. ) {
  167. utils.runJob("SOCKET_JOIN_ROOM", {
  168. socketId: session.socketId,
  169. room: `admin.${page}`
  170. });
  171. }
  172. cb({});
  173. }),
  174. /**
  175. * Returns current date
  176. *
  177. * @param {object} session - user session
  178. * @param {Function} cb - callback
  179. */
  180. ping: (session, cb) => {
  181. cb({ date: Date.now() });
  182. }
  183. };