AddSongToQueue.vue 4.4 KB

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