AddSongToQueue.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <template>
  2. <modal title="Add Song To Queue">
  3. <div slot="body">
  4. <aside class="menu" v-if="$parent.$parent.loggedIn && $parent.type === 'community'">
  5. <ul class="menu-list">
  6. <li v-for="(playlist, index) in playlists" :key="index">
  7. <a
  8. href="#"
  9. target="_blank"
  10. v-on:click="$parent.editPlaylist(playlist._id)"
  11. >{{ playlist.displayName }}</a>
  12. <div class="controls">
  13. <a
  14. href="#"
  15. v-on:click="selectPlaylist(playlist._id)"
  16. v-if="!isPlaylistSelected(playlist._id)"
  17. >
  18. <i class="material-icons">panorama_fish_eye</i>
  19. </a>
  20. <a href="#" v-on:click="unSelectPlaylist()" v-if="isPlaylistSelected(playlist._id)">
  21. <i class="material-icons">lens</i>
  22. </a>
  23. </div>
  24. </li>
  25. </ul>
  26. <br />
  27. </aside>
  28. <div class="control is-grouped">
  29. <p class="control is-expanded">
  30. <input
  31. class="input"
  32. type="text"
  33. placeholder="YouTube Query"
  34. v-model="querySearch"
  35. autofocus
  36. @keyup.enter="submitQuery()"
  37. />
  38. </p>
  39. <p class="control">
  40. <a class="button is-info" v-on:click="submitQuery()" href="#">Search</a>
  41. </p>
  42. </div>
  43. <table class="table">
  44. <tbody>
  45. <tr v-for="(result, index) in queryResults" :key="index">
  46. <td>
  47. <img :src="result.thumbnail" />
  48. </td>
  49. <td>{{ result.title }}</td>
  50. <td>
  51. <a class="button is-success" v-on:click="addSongToQueue(result.id)" href="#">Add</a>
  52. </td>
  53. </tr>
  54. </tbody>
  55. </table>
  56. </div>
  57. </modal>
  58. </template>
  59. <script>
  60. import { Toast } from "vue-roaster";
  61. import Modal from "./Modal.vue";
  62. import io from "../../io";
  63. import auth from "../../auth";
  64. export default {
  65. data() {
  66. return {
  67. querySearch: "",
  68. queryResults: [],
  69. playlists: [],
  70. privatePlaylistQueueSelected: null
  71. };
  72. },
  73. methods: {
  74. isPlaylistSelected: function(playlistId) {
  75. return this.privatePlaylistQueueSelected === playlistId;
  76. },
  77. selectPlaylist: function(playlistId) {
  78. let _this = this;
  79. if (_this.$parent.type === "community") {
  80. _this.privatePlaylistQueueSelected = playlistId;
  81. _this.$parent.privatePlaylistQueueSelected = playlistId;
  82. _this.$parent.addFirstPrivatePlaylistSongToQueue();
  83. }
  84. },
  85. unSelectPlaylist: function() {
  86. let _this = this;
  87. if (_this.$parent.type === "community") {
  88. _this.privatePlaylistQueueSelected = null;
  89. _this.$parent.privatePlaylistQueueSelected = null;
  90. }
  91. },
  92. addSongToQueue: function(songId) {
  93. let _this = this;
  94. if (_this.$parent.type === "community") {
  95. _this.socket.emit(
  96. "stations.addToQueue",
  97. _this.$parent.station._id,
  98. songId,
  99. data => {
  100. if (data.status !== "success")
  101. Toast.methods.addToast(`Error: ${data.message}`, 8000);
  102. else Toast.methods.addToast(`${data.message}`, 4000);
  103. }
  104. );
  105. } else {
  106. _this.socket.emit("queueSongs.add", songId, data => {
  107. if (data.status !== "success")
  108. Toast.methods.addToast(`Error: ${data.message}`, 8000);
  109. else Toast.methods.addToast(`${data.message}`, 4000);
  110. });
  111. }
  112. },
  113. submitQuery: function() {
  114. console.log("submit query");
  115. let _this = this;
  116. let query = _this.querySearch;
  117. if (query.indexOf("&index=") !== -1) {
  118. query = query.split("&index=");
  119. query.pop();
  120. query = query.join("");
  121. }
  122. if (query.indexOf("&list=") !== -1) {
  123. query = query.split("&list=");
  124. query.pop();
  125. query = query.join("");
  126. }
  127. _this.socket.emit("apis.searchYoutube", query, results => {
  128. // check for error
  129. results = results.data;
  130. _this.queryResults = [];
  131. for (let i = 0; i < results.items.length; i++) {
  132. _this.queryResults.push({
  133. id: results.items[i].id.videoId,
  134. url: `https://www.youtube.com/watch?v=${this.id}`,
  135. title: results.items[i].snippet.title,
  136. thumbnail: results.items[i].snippet.thumbnails.default.url
  137. });
  138. }
  139. });
  140. }
  141. },
  142. mounted: function() {
  143. let _this = this;
  144. io.getSocket(socket => {
  145. _this.socket = socket;
  146. _this.socket.emit("playlists.indexForUser", res => {
  147. if (res.status === "success") _this.playlists = res.data;
  148. });
  149. _this.privatePlaylistQueueSelected =
  150. _this.$parent.privatePlaylistQueueSelected;
  151. });
  152. },
  153. events: {
  154. closeModal: function() {
  155. this.$parent.modals.addSongToQueue = !this.$parent.modals.addSongToQueue;
  156. }
  157. },
  158. components: { Modal }
  159. };
  160. </script>
  161. <style lang='scss' scoped>
  162. tr td {
  163. vertical-align: middle;
  164. img {
  165. width: 55px;
  166. }
  167. }
  168. </style>