This repository has been archived on 2023-08-30. You can view files and clone it, but cannot push or open issues/pull-requests.
appcat
/
sonist
Archived
1
0
Fork 0
sonist/src/js/app.js

270 lines
5.7 KiB
JavaScript

/**
*
* @author yutent<yutent.io@gmail.com>
* @date 2020/11/16 16:21:52
*/
import Anot from '/js/lib/anot.js'
import '/js/lib/scroll/index.js'
import Keyboard from '/js/lib/keyboard/index.js'
// import app from '/js/lib/socket.js'
import fetch from '/js/lib/fetch/index.js'
import Api from '/js/api.js'
import Player from '/js/lib/audio/index.js'
// const id3 = require('music-metadata')
const MODE_DICT = { 1: 'all', 2: 'single', 3: 'random' }
var kb = new Keyboard()
var player = new Player()
window.fetch = fetch
window.player = player
Anot({
$id: 'app',
state: {
defaultCover: '/images/disk.png',
isplaying: false,
playmode: +Anot.ls('app_mode') || 1,
mute: false,
volume: +Anot.ls('app_volume') || 50,
preview: {
name: '',
album: '',
artist: '',
cover: ''
},
song: {
name: '',
artist: '',
src: '',
time: 0,
duration: 0
},
progress: 0,
curr: -1,
list: []
},
async mounted() {
var list = app.dispatch('get-all-songs')
// var list = app.dispatch('scan-dir', { dir: '/Volumes/ooc/music' })
app.on('tray-play', ev => {
this.play(0)
})
app.on('tray-prev', ev => {
this.play(-1)
})
app.on('tray-next', ev => {
this.play(1)
})
kb.on(['left'], ev => {
var time = this.song.time - 5
if (time < 0) {
time = 0
}
this.song.time = time
})
kb.on(['right'], ev => {
var time = this.song.time + 5
if (time > this.song.duration) {
time = this.song.duration
}
this.song.time = time
})
kb.on(['down'], ev => {
var vol = +this.volume - 5
if (vol < 0) {
vol = 0
}
this.volume = vol
})
kb.on(['up'], ev => {
var vol = +this.volume + 5
if (vol > 100) {
vol = 100
}
this.volume = vol
})
// for (let it of list) {
// let { album, artist, title, duration } = await this.getID3(it.file_path)
// it.name = title || it.name
// it.artist = artist
// it.album = album
// it.duration = duration
// app.dispatch('add-song', {
// name: it.name,
// artist,
// album,
// duration,
// file_path: it.file_path
// })
// }
// console.log(list)
this.list = list
player.volume = this.volume / 100
player.load(list.map(it => `sonist://${it.file_path}`))
player.on('play', time => {
this.song.time = time
})
player.on('stop', _ => {
var idx = this.curr
var repeat = false
switch (this.playmode) {
case 1: // all
idx++
if (idx >= this.list.length) {
idx = 0
}
break
case 2: // single
repeat = true
break
case 3: // random
idx = ~~(Math.random() * this.list.length)
break
}
this.playSong(idx, repeat)
})
window.foo = _ => {
var n = 128,
t
t = setInterval(() => {
n--
this.play(1)
if (n < 0) {
clearInterval(t)
}
}, 100)
}
// foo()
},
watch: {
volume(v) {
Anot.ls('app_volume', v)
player.volume = v / 100
},
playmode(v) {
Anot.ls('app_mode', v)
},
progress(v) {
var t = +(this.song.duration * (v / 712)).toFixed(2)
player.seek(t)
}
},
methods: {
play(act) {
var idx = this.curr
var repeat = false
switch (act) {
case 0:
if (idx > -1) {
player.play(-1)
this.isplaying = !this.isplaying
} else {
this.playSong(0)
}
break
default:
switch (this.playmode) {
case 1: // all
idx += act
if (idx < 0) {
idx = this.list.length - 1
}
if (idx >= this.list.length) {
idx = 0
}
break
case 2: // single
if (idx === -1) {
idx = ~~(Math.random() * this.list.length)
}
repeat = true
break
case 3: // random
idx = ~~(Math.random() * this.list.length)
break
}
this.playSong(idx, repeat)
break
}
},
switchMode() {
var n = this.playmode + 1
if (n > 3) {
n = 1
}
this.playmode = n
},
toggleMute() {
this.mute = !this.mute
},
getID3(file) {
return id3.parseFile(file).then(res => {
let {
common: { album, artist, title },
format: { duration }
} = res
return { album, artist, title, duration: ~~duration }
})
},
previewSong(it) {
var { album, artist, name, cover } = it
Object.assign(this.preview, { album, artist, name, cover })
},
playSong(i, repeat) {
//
var it = this.list[i]
if (this.curr === i) {
if (repeat) {
this.song.time = 0
player.play(-1, repeat)
}
return
}
// player.stop()
this.curr = i
this.song.name = it.name
this.song.artist = it.artist
this.song.duration = it.duration
this.song.src = `file://${it.file_path}`
this.song.time = 0
this.isplaying = true
this.previewSong(it)
player.play(i)
this.$refs.list.scrollTop = (i - 3) * 26
app.dispatch('update-lrc', { lrc: '正在播放: ' + it.name })
// if (!it.lrc) {
// Api.searchLrc(it.name, it.duration).then(list => {
// var { id, accesskey } = list[0]
// Api.downloadLrc(id, accesskey).then(lrc => {
// console.log(lrc)
// })
// })
// }
}
}
})
一个音乐播放器, 主打本地音乐播放。支持 自动歌词/自动封面/均衡器等常见功能。
JavaScript 60.1%
SCSS 19.2%
HTML 16.9%
CSS 3.8%