parent
934b54f011
commit
29859a4747
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "sonist",
|
"name": "sonist",
|
||||||
"version": "0.9.2",
|
"version": "0.9.3",
|
||||||
"description": "Music Player",
|
"description": "Music Player",
|
||||||
"main": "src/main.js",
|
"main": "src/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -294,6 +294,27 @@ table {overflow:auto;display:table;width:100%;line-height:2.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.loading {position:fixed;left:0;top:0;z-index:65536;display:flex;justify-content:center;align-items:center;width:100%;height:100%;
|
||||||
|
|
||||||
|
.box {position:relative;display:flex;justify-content:center;align-items:center;width:8rem;height:8rem;
|
||||||
|
|
||||||
|
i {position:absolute;width:8rem;height:8rem;border:3px solid nth($ct, 1);border-radius:50%;opacity:.5;
|
||||||
|
&:nth-child(1) {animation:load 2.5s ease-in-out infinite;}
|
||||||
|
&:nth-child(2) {animation:load 2.5s .5s ease-in-out infinite;}
|
||||||
|
&:nth-child(3) {animation:load 2.5s 1s ease-in-out infinite;}
|
||||||
|
&:nth-child(4) {animation:load 2.5s 1.5s ease-in-out infinite;}
|
||||||
|
&:nth-child(5) {animation:load 2.5s 2s ease-in-out infinite;}
|
||||||
|
}
|
||||||
|
span {position:absolute;width:8rem;height:8rem;background:url(/images/load1.png) no-repeat center center;background-size:cover;
|
||||||
|
|
||||||
|
&:nth-child(6) {animation:play 1.5s linear infinite;}
|
||||||
|
&:nth-child(7) {background-image:url(/images/load2.png);animation:load2 2.5s linear infinite;}
|
||||||
|
}
|
||||||
|
cite {font-size:2.4rem}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -320,7 +341,15 @@ table {overflow:auto;display:table;width:100%;line-height:2.5rem;
|
||||||
.do-layer .layer-box.do-mod-contextmenu__fixed {padding:0}
|
.do-layer .layer-box.do-mod-contextmenu__fixed {padding:0}
|
||||||
|
|
||||||
|
|
||||||
|
@keyframes load {
|
||||||
|
from {opacity: .5; transform: scale(1)}
|
||||||
|
to {opacity: 0; transform: scale(1.5)}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes load2 {
|
||||||
|
from {transform:rotate(360deg)}
|
||||||
|
to {transform:rotate(0deg)}
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes play {
|
@keyframes play {
|
||||||
from {transform:rotate(0deg)}
|
from {transform:rotate(0deg)}
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 4.3 KiB |
Binary file not shown.
After Width: | Height: | Size: 9.8 KiB |
|
@ -163,6 +163,16 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="loading" :if="loading">
|
||||||
|
<div class="box">
|
||||||
|
<i></i><i></i><i></i><i></i><i></i>
|
||||||
|
<span></span>
|
||||||
|
<span></span>
|
||||||
|
<cite>{{progress}}%</cite>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -81,7 +81,6 @@ const LRC_WIN = new remote.BrowserWindow({
|
||||||
hasShadow: false,
|
hasShadow: false,
|
||||||
thickFrame: false,
|
thickFrame: false,
|
||||||
transparent: true,
|
transparent: true,
|
||||||
// focusable: false,
|
|
||||||
show: false
|
show: false
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -109,7 +108,9 @@ Anot({
|
||||||
duration: 0
|
duration: 0
|
||||||
},
|
},
|
||||||
ctrlLrc: '暂无歌词...',
|
ctrlLrc: '暂无歌词...',
|
||||||
...KTV.data
|
...KTV.data,
|
||||||
|
loading: false,
|
||||||
|
progress: 0
|
||||||
},
|
},
|
||||||
skip: [],
|
skip: [],
|
||||||
computed: {
|
computed: {
|
||||||
|
|
|
@ -70,7 +70,6 @@ export default {
|
||||||
hash: it.FileHash
|
hash: it.FileHash
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
log(list, this.lrcForm.result)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -129,35 +129,38 @@ export default Anot({
|
||||||
__checkSong__(el) {
|
__checkSong__(el) {
|
||||||
let song = this.__LIST__.pop()
|
let song = this.__LIST__.pop()
|
||||||
|
|
||||||
|
let scaned = this.__WAIT_FOR_SCAN__ - this.__LIST__.length
|
||||||
|
this.__APP__.progress = ((100 * scaned) / this.__WAIT_FOR_SCAN__) >>> 0
|
||||||
|
|
||||||
if (!song) {
|
if (!song) {
|
||||||
el.textContent = '重新扫描'
|
el.textContent = '重新扫描'
|
||||||
el = null
|
el = null
|
||||||
if (this.__NEW_NUM__ > 0) {
|
|
||||||
LS.sort('artist', true)
|
|
||||||
dbCache = LS.getAll()
|
|
||||||
this.list.clear()
|
|
||||||
this.list.pushArray(dbCache)
|
|
||||||
|
|
||||||
SONIST.clear()
|
LS.sort('artist', true)
|
||||||
SONIST.push(dbCache)
|
dbCache = LS.getAll()
|
||||||
|
this.list.clear()
|
||||||
|
this.list.pushArray(dbCache)
|
||||||
|
|
||||||
fs.echo(JSON.stringify(dbCache, '', 2), MUSIC_DB_PATH)
|
SONIST.clear()
|
||||||
dbCache = null
|
SONIST.push(dbCache)
|
||||||
}
|
|
||||||
|
fs.echo(JSON.stringify(dbCache, '', 2), MUSIC_DB_PATH)
|
||||||
|
dbCache = null
|
||||||
|
|
||||||
layer.close(this.__load__)
|
|
||||||
layer.toast(`刷新缓存完成,新增${this.__NEW_NUM__}首`)
|
layer.toast(`刷新缓存完成,新增${this.__NEW_NUM__}首`)
|
||||||
delete this.__load__
|
|
||||||
|
this.__APP__.loading = false
|
||||||
|
this.__APP__.progress = 0
|
||||||
|
delete this.__NEW_NUM__
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
Anot.nextTick(() => {
|
Anot.nextTick(() => {
|
||||||
let name = path.basename(song)
|
|
||||||
if (name.startsWith('.')) {
|
|
||||||
return this.__checkSong__(el)
|
|
||||||
}
|
|
||||||
let hash = crypto.md5Sign(song)
|
let hash = crypto.md5Sign(song)
|
||||||
if (LS.get(hash)) {
|
let item = LS.get(hash)
|
||||||
|
if (item) {
|
||||||
|
item.path = `file://${song}`
|
||||||
|
LS.update(hash, item)
|
||||||
return this.__checkSong__(el)
|
return this.__checkSong__(el)
|
||||||
}
|
}
|
||||||
this.__NEW_NUM__++
|
this.__NEW_NUM__++
|
||||||
|
@ -175,25 +178,25 @@ export default Anot({
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
refresh(ev) {
|
refresh(ev) {
|
||||||
if (this.__load__) {
|
if (this.__APP__.loading) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (appInit.musicPath) {
|
if (appInit.musicPath) {
|
||||||
if (fs.isdir(appInit.musicPath)) {
|
if (fs.isdir(appInit.musicPath)) {
|
||||||
this.__load__ = layer.load(4)
|
this.__APP__.loading = true
|
||||||
|
|
||||||
this.__LIST__ = fs.ls(appInit.musicPath, true).filter(_ => {
|
this.__LIST__ = fs.ls(appInit.musicPath, true).filter(_ => {
|
||||||
if (fs.isdir(_)) {
|
if (fs.isdir(_)) {
|
||||||
return false
|
return false
|
||||||
} else {
|
} else {
|
||||||
let { ext, name } = path.parse(song)
|
let { ext, name } = path.parse(_)
|
||||||
if (!ext || name.startsWith('.')) {
|
if (!ext || name.startsWith('.')) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return SUPPORTED_EXTS.includes(ext)
|
return SUPPORTED_EXTS.includes(ext)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
this.__WAIT_FOR_SCAN__ = this.__LIST__.length
|
||||||
this.__NEW_NUM__ = 0
|
this.__NEW_NUM__ = 0
|
||||||
ev.target.textContent = '正在扫描, 请稍候...'
|
ev.target.textContent = '正在扫描, 请稍候...'
|
||||||
this.__checkSong__(ev.target)
|
this.__checkSong__(ev.target)
|
||||||
|
@ -204,6 +207,11 @@ export default Anot({
|
||||||
layer.toast('请先设置音乐目录', 'error')
|
layer.toast('请先设置音乐目录', 'error')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
closeEditByEnter(ev) {
|
||||||
|
if (ev.keyCode === 13 && ev.ctrlKey) {
|
||||||
|
this.closeEdit()
|
||||||
|
}
|
||||||
|
},
|
||||||
closeEdit() {
|
closeEdit() {
|
||||||
this.editMode = false
|
this.editMode = false
|
||||||
let song = this.list[this.__idx__].$model
|
let song = this.list[this.__idx__].$model
|
||||||
|
|
|
@ -199,7 +199,7 @@ export const ID3 = song => {
|
||||||
title: format.tags.TITLE || format.tags.title || name,
|
title: format.tags.TITLE || format.tags.title || name,
|
||||||
album: format.tags.ALBUM || format.tags.album || '',
|
album: format.tags.ALBUM || format.tags.album || '',
|
||||||
artist: format.tags.ARTIST || format.tags.artist || '',
|
artist: format.tags.ARTIST || format.tags.artist || '',
|
||||||
duration: +format.duration,
|
duration: Math.ceil(format.duration),
|
||||||
size: +(format.size / 1024 / 1024).toFixed(2)
|
size: +(format.size / 1024 / 1024).toFixed(2)
|
||||||
})
|
})
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|
|
@ -128,6 +128,9 @@ class Lyrics {
|
||||||
if (!this.curr.length && this.tmpLib.length) {
|
if (!this.curr.length && this.tmpLib.length) {
|
||||||
this.curr = this.tmpLib.splice(0, 2)
|
this.curr = this.tmpLib.splice(0, 2)
|
||||||
}
|
}
|
||||||
|
if (this.curr.length < 2) {
|
||||||
|
this.curr.push(this.curr[0])
|
||||||
|
}
|
||||||
let stat = 0
|
let stat = 0
|
||||||
|
|
||||||
// 当前时间小于第1句的结束时间
|
// 当前时间小于第1句的结束时间
|
||||||
|
|
14
src/main.js
14
src/main.js
|
@ -57,6 +57,18 @@ const TRAYMENU_TMPL = [
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
const MENUBAR_TMPL = [
|
const MENUBAR_TMPL = [
|
||||||
|
{
|
||||||
|
label: 'Edit',
|
||||||
|
submenu: [
|
||||||
|
{ role: 'undo' },
|
||||||
|
{ role: 'redo' },
|
||||||
|
{ type: 'separator' },
|
||||||
|
{ role: 'cut' },
|
||||||
|
{ role: 'copy' },
|
||||||
|
{ role: 'paste' },
|
||||||
|
{ role: 'selectall' }
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: 'View',
|
label: 'View',
|
||||||
submenu: [{ role: 'zoomin' }, { role: 'zoomout' }]
|
submenu: [{ role: 'zoomin' }, { role: 'zoomout' }]
|
||||||
|
@ -74,7 +86,7 @@ if (process.platform === 'darwin') {
|
||||||
})
|
})
|
||||||
|
|
||||||
// Window menu
|
// Window menu
|
||||||
MENUBAR_TMPL[2].submenu = [{ role: 'minimize' }]
|
MENUBAR_TMPL[3].submenu = [{ role: 'minimize' }]
|
||||||
}
|
}
|
||||||
|
|
||||||
let traymenuList = Menu.buildFromTemplate(TRAYMENU_TMPL)
|
let traymenuList = Menu.buildFromTemplate(TRAYMENU_TMPL)
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="edit-form" :if="editMode">
|
<div class="edit-form" :if="editMode">
|
||||||
<div class="form">
|
<div class="form" :keyup="closeEditByEnter">
|
||||||
<section class="section title">
|
<section class="section title">
|
||||||
歌曲信息编辑
|
歌曲信息编辑
|
||||||
<i class="do-icon-close" :click="closeEdit"></i>
|
<i class="do-icon-close" :click="closeEdit"></i>
|
||||||
|
@ -58,4 +58,5 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
Reference in New Issue