Player.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <template>
  2. <f7-toolbar style='position: fixed; height: 80px;' bottom v-if="status != 'empty'">
  3. <!--
  4. il player avra' due stati aperto e chiuso? non so quanto mi piace, mi sembra che
  5. le informazioni utili possano stare benissimo in questa toolbar.
  6. nel caso cmq bisogna fare una classe css per questi stati con l'altezza che varia.
  7. -->
  8. <f7-block>
  9. <f7-icon class='cursor-pointer' to='#' size='52px' f7='play_circle' @click="onPlay" v-if="!loading && status == 'pause'" />
  10. <f7-icon class='cursor-pointer' size='52px' f7='pause_circle' @click="onPause" v-if="!loading && status == 'playing'" />
  11. <f7-preloader size='42px' color='white' v-if='loading'/>
  12. </f7-block>
  13. <f7-block>
  14. <f7-link v-if='!loading'>{{title}}</f7-link>
  15. </f7-block>
  16. </f7-toolbar>
  17. </template>
  18. <script>
  19. import eventBus from '../js/eventBus'
  20. import { Howl } from 'howler'
  21. export default {
  22. components: { },
  23. data () {
  24. return {
  25. loading: true,
  26. status: 'empty',
  27. volume: 100,
  28. title: 'RadioBlackout > DIRETTA',
  29. subtitle: '',
  30. live: true,
  31. player: null
  32. }
  33. },
  34. destroyed () {
  35. eventBus.$off('play:now')
  36. },
  37. mounted () {
  38. const t = this
  39. eventBus.$on('play:now', function (url, metadata) {
  40. t.play(url, metadata)
  41. })
  42. eventBus.$on('play:pause', function() {
  43. if(t.player) {
  44. t.player.pause()
  45. }
  46. })
  47. eventBus.$on('play:resume', function() {
  48. if(t.player) {
  49. t.player.play()
  50. }
  51. })
  52. },
  53. methods: {
  54. onPlay() {
  55. eventBus.$emit('play:resume')
  56. },
  57. onPause() {
  58. eventBus.$emit('play:pause')
  59. },
  60. updateStatusFromPlayer () {
  61. this.status = this.player.playing() ? 'playing' : 'pause'
  62. },
  63. play (url, metadata) {
  64. this.loading = true
  65. let newPlayer = new Howl({
  66. autoSuspend: false,
  67. html5: true,
  68. preload: true,
  69. src: Array.isArray(url) ? url : [url],
  70. })
  71. const t = this
  72. for(const eventName of ['pause', 'play', 'end']) {
  73. newPlayer.on(eventName, this.updateStatusFromPlayer)
  74. }
  75. newPlayer.once('play', function setProperData() {
  76. if(t.player) {
  77. t.player.stop()
  78. t.player.unload()
  79. }
  80. t.player = newPlayer
  81. if(metadata !== undefined) {
  82. t.title = metadata.title
  83. t.live = metadata.live
  84. }
  85. t.loading = false
  86. t.updateStatusFromPlayer()
  87. })
  88. newPlayer.play()
  89. },
  90. stop () {
  91. if (this.player) {
  92. this.player.stop()
  93. }
  94. this.$refs.button.stop()
  95. },
  96. }
  97. }
  98. </script>