diff --git a/package-lock.json b/package-lock.json index 0643954..b0686a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1992,6 +1992,16 @@ } } }, + "aplayer": { + "version": "1.10.1", + "resolved": "https://registry.npm.taobao.org/aplayer/download/aplayer-1.10.1.tgz", + "integrity": "sha1-MYKJIGEHRSzDno9VL6bMbLRZqQw=", + "requires": { + "balloon-css": "^0.5.0", + "promise-polyfill": "7.1.0", + "smoothscroll": "0.4.0" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz", @@ -2334,6 +2344,11 @@ "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, + "balloon-css": { + "version": "0.5.2", + "resolved": "https://registry.npm.taobao.org/balloon-css/download/balloon-css-0.5.2.tgz", + "integrity": "sha1-niFjVloTbJ1Kog6EAHcs47c40/8=" + }, "base": { "version": "0.11.2", "resolved": "http://registry.npm.taobao.org/base/download/base-0.11.2.tgz", @@ -9903,6 +9918,11 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "promise-polyfill": { + "version": "7.1.0", + "resolved": "https://registry.npm.taobao.org/promise-polyfill/download/promise-polyfill-7.1.0.tgz", + "integrity": "sha1-TXSUhbRFd8FBN1kcbzbl1+LdM3g=" + }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.6.tgz?cache=0&sync_timestamp=1582556112011&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fproxy-addr%2Fdownload%2Fproxy-addr-2.0.6.tgz", @@ -11025,6 +11045,11 @@ } } }, + "smoothscroll": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/smoothscroll/download/smoothscroll-0.4.0.tgz", + "integrity": "sha1-QOUHtGRhQIuht4fQCB4eiDxBJKU=" + }, "snapdragon": { "version": "0.8.2", "resolved": "http://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz", diff --git a/package.json b/package.json index 2b3bddd..158a405 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'" }, "dependencies": { + "aplayer": "^1.10.1", "axios": "^0.19.2", "bulma": "^0.8.2", "bulma-divider": "^0.2.0", diff --git a/public/setting.js b/public/setting.js index cbc8032..91ef5e3 100644 --- a/public/setting.js +++ b/public/setting.js @@ -32,6 +32,9 @@ var themeOptions = { api: "", autoplay: true, }, + audio: { + autoplay: false, + }, }; window.gdconfig = JSON.parse( JSON.stringify({ version: authConfig.version, themeOptions: themeOptions }) diff --git a/src/assets/style/theme/acrou/index.scss b/src/assets/style/theme/acrou/index.scss index 61fc82b..3707b70 100644 --- a/src/assets/style/theme/acrou/index.scss +++ b/src/assets/style/theme/acrou/index.scss @@ -202,3 +202,13 @@ body { padding-bottom: 0; padding-top: 0; } + +// APlayer +.aplayer.aplayer-fixed.aplayer-narrow { + .aplayer-body { + left: -66px !important; + } + .aplayer-body:hover { + left: 0px !important; + } +} diff --git a/src/store/modules/acrou/modules/aplayer.js b/src/store/modules/acrou/modules/aplayer.js new file mode 100644 index 0000000..10c8ff8 --- /dev/null +++ b/src/store/modules/acrou/modules/aplayer.js @@ -0,0 +1,55 @@ +export default { + namespaced: true, + state: { + player: null, + audios: [], + }, + actions: { + set({ state }, player) { + state.player = player; + }, + add({ state, dispatch }, { audio, play }) { + return new Promise((resolve) => { + for (var i = 0; i < state.audios.length; i++) { + var s = state.audios[i]; + if (s.id === audio.id) { + state.audios.splice(i, 1); + state.player.list.remove(i); + i--; + } + } + state.player.list.add(audio); + state.audios.push(audio); + if (play) { + var index = state.audios.length; + state.player.list.switch(index - 1); + state.player.play(); + } + dispatch( + "acrou/db/set", + { + path: "audio.list", + value: state.audios, + }, + { root: true } + ); + resolve(); + }); + }, + load({ state, dispatch }) { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve) => { + var audio = await dispatch( + "acrou/db/get", + { + path: "audio.list", + defaultValue: [], + }, + { root: true } + ); + state.audios = audio; + resolve(); + }); + }, + }, +}; diff --git a/src/views/Layout.vue b/src/views/Layout.vue index d329288..4704aa2 100644 --- a/src/views/Layout.vue +++ b/src/views/Layout.vue @@ -9,12 +9,14 @@ + diff --git a/src/views/page/GoList.vue b/src/views/page/GoList.vue index ec333fc..e4ab061 100644 --- a/src/views/page/GoList.vue +++ b/src/views/page/GoList.vue @@ -75,7 +75,7 @@ import { checkView, checkExtends, } from "@utils/AcrouUtil"; -import { mapState } from "vuex"; +import { mapState, mapActions } from "vuex"; import BreadCrumb from "../common/BreadCrumb"; import ListView from "./components/list"; import GridView from "./components/grid"; @@ -110,6 +110,11 @@ export default { "video/x-flv": "icon-video", "application/x-mpegURL": "icon-video", "audio/mpegurl": "icon-video", + "audio/mp3": "icon-audio", + "audio/flac": "icon-audio", + "audio/x-m4a": "icon-audio", + "audio/wav": "icon-audio", + "audio/ogg": "icon-audio", "text/plain": "icon-txt", "text/markdown": "icon-markdown", "text/x-ssa": "icon-ass", @@ -155,6 +160,7 @@ export default { this.render(); }, methods: { + ...mapActions("acrou/aplayer", ["add"]), infiniteHandler($state) { // 首次进入页面不执行滚动事件 if (!this.page.page_token) { @@ -273,6 +279,20 @@ export default { }); return; } + if (file.mimeType.startsWith("audio/") && target === "view") { + if (window.aplayer) { + this.add({ + audio: { + id: file.id, + name: file.name, + artist: "none", + url: file.path, + }, + play: true, + }); + } + return; + } let cmd = this.$route.params.cmd; if (cmd && cmd === "search") { this.goSearchResult(file, target);