112 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import IndexedDB from './database.js'
 | |
| import { Button, List, ListItem } from './weigets.js'
 | |
| 
 | |
| export default class MusicList {
 | |
|     constructor() {
 | |
|         this.EventListeners = {}
 | |
|         this.ul = List({})
 | |
|         this.store = new IndexedDB('musicDatabase', 1, 'musicObjectStore')
 | |
|         this.store.open().then(() => {
 | |
|             this.store.getAll().then((data) => {
 | |
|                 data.forEach(item => this.__add(item))
 | |
|             })
 | |
|         })
 | |
|         document.body.appendChild(this.ul)
 | |
| 
 | |
|         // 添加音乐播放器
 | |
|         this.audio = new Audio()
 | |
|         this.audio.addEventListener('ended', () => {
 | |
|             this.next()
 | |
|         })
 | |
|         //this.audio.addEventListener('timeupdate', () => {
 | |
|         //    console.log(this.audio.currentTime)
 | |
|         //})
 | |
| 
 | |
|         // 添加音乐按钮
 | |
|         const input = document.createElement('input')
 | |
|         input.type = 'file'
 | |
|         input.multiple = true
 | |
|         input.accept = 'audio/*'
 | |
|         input.onchange = event => {
 | |
|             for (const file of event.target.files) {
 | |
|                 const id = 'music' + Date.now()
 | |
|                 const { name, size, type } = file
 | |
|                 const reader = new FileReader()
 | |
|                 reader.onload = async event => {
 | |
|                     const arrayBuffer = event.target.result
 | |
|                     this.add({ id, name, size, type, arrayBuffer })
 | |
|                 }
 | |
|                 reader.readAsArrayBuffer(file)
 | |
|             }
 | |
|         }
 | |
|         document.body.appendChild(input)
 | |
|     }
 | |
|     // 仅添加UI
 | |
|     __add(item) {
 | |
|         const li = ListItem({
 | |
|             id: item.id,
 | |
|             innerText: `${item.name} - ${item.size} - ${item.type} - ${item.id}`,
 | |
|             onclick: event => {
 | |
|                 event.stopPropagation()
 | |
|                 this.play(item)
 | |
|             },
 | |
|             children: [
 | |
|                 Button({
 | |
|                     innerText: '播放',
 | |
|                     onclick: event => {
 | |
|                         event.stopPropagation()
 | |
|                         this.play(item)
 | |
|                     }
 | |
|                 }),
 | |
|                 Button({
 | |
|                     innerText: '停止',
 | |
|                     onclick: event => {
 | |
|                         event.stopPropagation()
 | |
|                         this.stop(item.id)
 | |
|                     }
 | |
|                 }),
 | |
|                 Button({
 | |
|                     innerText: '移除',
 | |
|                     onclick: event => {
 | |
|                         event.stopPropagation()
 | |
|                         this.delete(item)
 | |
|                     }
 | |
|                 })
 | |
|             ]
 | |
|         })
 | |
|         this.ul.appendChild(li)
 | |
|     }
 | |
|     // 添加数据并添加UI
 | |
|     add(item) {
 | |
|         this.store.add(item)
 | |
|         this.__add(item)
 | |
|     }
 | |
|     delete(item) {
 | |
|         this.store.delete(item.id)
 | |
|         this.ul.removeChild(this.ul.querySelector(`#${item.id}`))
 | |
|         this.stop() // 停止播放
 | |
|     }
 | |
|     play(item) {
 | |
|         this.audio.src = URL.createObjectURL(new Blob([item.arrayBuffer], { type: item.type }))
 | |
|         this.audio.play()
 | |
|         this._on('play', item)
 | |
|     }
 | |
|     stop() {
 | |
|         this.audio.pause()
 | |
|         this.audio.src = ''
 | |
|         this._on('stop')
 | |
|     }
 | |
|     next() { }
 | |
|     prev() { }
 | |
|     // 添加回调函数
 | |
|     on(name, callback) {
 | |
|         this.EventListeners[name] = callback
 | |
|     }
 | |
|     // 执行回调函数
 | |
|     _on(name, ...args) {
 | |
|         if (this.EventListeners[name]) {
 | |
|             this.EventListeners[name](...args)
 | |
|         }
 | |
|     }
 | |
| }
 |