add blurhash image preview
This commit is contained in:
parent
6f433a6f1a
commit
26d494a696
5
package-lock.json
generated
5
package-lock.json
generated
@ -11267,6 +11267,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
|
"resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
|
||||||
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
|
"integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
|
||||||
},
|
},
|
||||||
|
"vue-blurhash": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/vue-blurhash/-/vue-blurhash-0.1.2.tgz",
|
||||||
|
"integrity": "sha512-VfIiQW2+F1HsJktumGsEwCsp0CYLdnmTcCA3nMvZ8Bze8bkpp9tonIygzBnjUKN0WZyOxb22i9QQ+lqgngjedA=="
|
||||||
|
},
|
||||||
"vue-color": {
|
"vue-color": {
|
||||||
"version": "2.7.1",
|
"version": "2.7.1",
|
||||||
"resolved": "https://registry.npmjs.org/vue-color/-/vue-color-2.7.1.tgz",
|
"resolved": "https://registry.npmjs.org/vue-color/-/vue-color-2.7.1.tgz",
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
"jquery": "^3.5.1",
|
"jquery": "^3.5.1",
|
||||||
"music-metadata": "^7.4.1",
|
"music-metadata": "^7.4.1",
|
||||||
"vue": "^2.6.12",
|
"vue": "^2.6.12",
|
||||||
|
"vue-blurhash": "^0.1.2",
|
||||||
"vue-router": "^3.4.7",
|
"vue-router": "^3.4.7",
|
||||||
"vuex": "^3.5.1"
|
"vuex": "^3.5.1"
|
||||||
},
|
},
|
||||||
|
@ -33,7 +33,6 @@ import { Howl } from 'howler'
|
|||||||
import { generateUrl } from '@nextcloud/router'
|
import { generateUrl } from '@nextcloud/router'
|
||||||
import { showError } from '@nextcloud/dialogs'
|
import { showError } from '@nextcloud/dialogs'
|
||||||
import axios from '@nextcloud/axios'
|
import axios from '@nextcloud/axios'
|
||||||
import store from '../store'
|
|
||||||
|
|
||||||
let audioPlayer = null
|
let audioPlayer = null
|
||||||
|
|
||||||
@ -109,8 +108,6 @@ export default {
|
|||||||
* @param {Object} station Station object
|
* @param {Object} station Station object
|
||||||
*/
|
*/
|
||||||
doPlay(station) {
|
doPlay(station) {
|
||||||
this.player.isPlaying = true
|
|
||||||
|
|
||||||
if (audioPlayer !== null) {
|
if (audioPlayer !== null) {
|
||||||
audioPlayer.fade(1, 0, 500) // FIXME persistent volume state
|
audioPlayer.fade(1, 0, 500) // FIXME persistent volume state
|
||||||
// FIXME fade out
|
// FIXME fade out
|
||||||
@ -119,6 +116,7 @@ export default {
|
|||||||
{
|
{
|
||||||
'User-Agent': 'Nextcloud Radio/1.0.0', // FIXME global version, doesnt seem to work
|
'User-Agent': 'Nextcloud Radio/1.0.0', // FIXME global version, doesnt seem to work
|
||||||
})
|
})
|
||||||
|
const vm = this
|
||||||
audioPlayer = new Howl({
|
audioPlayer = new Howl({
|
||||||
src: [station.url_resolved],
|
src: [station.url_resolved],
|
||||||
volume: 0,
|
volume: 0,
|
||||||
@ -128,15 +126,16 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onplay() {
|
onplay() {
|
||||||
store.player.isPlaying = true
|
vm.$store.dispatch('isPlaying', true)
|
||||||
store.player.isBuffering = false
|
vm.$store.dispatch('isBuffering', false)
|
||||||
},
|
},
|
||||||
onpause() {
|
onpause() {
|
||||||
store.player.isPlaying = false
|
vm.$store.dispatch('isPlaying', false)
|
||||||
store.player.isBuffering = false
|
vm.$store.dispatch('isBuffering', false)
|
||||||
},
|
},
|
||||||
onload() {
|
onload() {
|
||||||
store.player.isBuffering = true
|
vm.$store.dispatch('isPlaying', true)
|
||||||
|
vm.$store.dispatch('isBuffering', true)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
audioPlayer.play()
|
audioPlayer.play()
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
value="this.volume"
|
value="this.volume"
|
||||||
@input="changeVolume">
|
@input="changeVolume">
|
||||||
<span class="stationMetadata" />
|
<span class="stationMetadata" />
|
||||||
{{ player.isPlaying }}
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -28,7 +27,11 @@ export default {
|
|||||||
data: () => ({
|
data: () => ({
|
||||||
sliderVal: 0,
|
sliderVal: 0,
|
||||||
}),
|
}),
|
||||||
inject: ['player'],
|
computed: {
|
||||||
|
player() {
|
||||||
|
return this.$store.state.player
|
||||||
|
},
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
changeVolume() {
|
changeVolume() {
|
||||||
this.$emit('changeVolume', this.sliderVal)
|
this.$emit('changeVolume', this.sliderVal)
|
||||||
|
@ -15,10 +15,14 @@
|
|||||||
:key="idx"
|
:key="idx"
|
||||||
:class="{ selected: idx === activeItem}">
|
:class="{ selected: idx === activeItem}">
|
||||||
<td @click="doPlay(idx, station)">
|
<td @click="doPlay(idx, station)">
|
||||||
<div class="stationIcon"
|
<blur-hash-image
|
||||||
:style="{ backgroundImage: `url('${ station.favicon }')` }">
|
class="stationIcon"
|
||||||
|
width="32"
|
||||||
|
height="32"
|
||||||
|
hash="LdHfL}oJR$WBKnfi%3ofT0kCM{ay"
|
||||||
|
:src="station.favicon">
|
||||||
<span :class="{ 'icon-starred': stationsFavored.includes(idx) }" />
|
<span :class="{ 'icon-starred': stationsFavored.includes(idx) }" />
|
||||||
</div>
|
</blur-hash-image>
|
||||||
</td>
|
</td>
|
||||||
<td class="nameColumn" @click="doPlay(idx, station)">
|
<td class="nameColumn" @click="doPlay(idx, station)">
|
||||||
<span class="innernametext">
|
<span class="innernametext">
|
||||||
@ -153,11 +157,6 @@ table {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.stationIcon {
|
.stationIcon {
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: contain;
|
|
||||||
background-position: center;
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,11 +28,16 @@ import { translate, translatePlural } from '@nextcloud/l10n'
|
|||||||
import App from './App'
|
import App from './App'
|
||||||
|
|
||||||
import jquery from 'jquery'
|
import jquery from 'jquery'
|
||||||
|
import VueBlurHash from 'vue-blurhash'
|
||||||
|
|
||||||
|
import 'vue-blurhash/dist/vue-blurhash.css'
|
||||||
|
|
||||||
Vue.prototype.t = translate
|
Vue.prototype.t = translate
|
||||||
Vue.prototype.n = translatePlural
|
Vue.prototype.n = translatePlural
|
||||||
Vue.prototype.$jquery = jquery
|
Vue.prototype.$jquery = jquery
|
||||||
|
|
||||||
|
Vue.use(VueBlurHash)
|
||||||
|
|
||||||
export default new Vue({
|
export default new Vue({
|
||||||
el: '#content',
|
el: '#content',
|
||||||
store,
|
store,
|
||||||
|
19
src/store.js
19
src/store.js
@ -3,16 +3,27 @@ import Vuex from 'vuex'
|
|||||||
Vue.use(Vuex)
|
Vue.use(Vuex)
|
||||||
|
|
||||||
export default new Vuex.Store({
|
export default new Vuex.Store({
|
||||||
|
state: {
|
||||||
player: {
|
player: {
|
||||||
isPlaying: false,
|
isPlaying: false,
|
||||||
isBuffering: false,
|
isBuffering: false,
|
||||||
volume: 0,
|
volume: 0,
|
||||||
count: 0,
|
},
|
||||||
},
|
},
|
||||||
mutations: {
|
mutations: {
|
||||||
increment(player) {
|
isPlaying(state, playerState) {
|
||||||
player.count++
|
state.player.isPlaying = playerState
|
||||||
|
},
|
||||||
|
isBuffering(state, bufferingState) {
|
||||||
|
state.player.isBuffering = bufferingState
|
||||||
|
},
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
isPlaying(context, playerState) {
|
||||||
|
context.commit('isPlaying', playerState)
|
||||||
|
},
|
||||||
|
isBuffering(context, bufferingState) {
|
||||||
|
context.commit('isBuffering', bufferingState)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
strict: true,
|
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user