mirror of
https://github.com/owntone/owntone-server.git
synced 2025-07-13 02:51:09 -04:00
Merge pull request #1401 from chme/web-partial-scan
Web UI - Add support for updating a single library source
This commit is contained in:
commit
3caa6f5b1d
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -114,6 +114,7 @@ DATETAG : 'time_added'
|
|||||||
|
|
||||||
ENUMTAG : 'data_kind'
|
ENUMTAG : 'data_kind'
|
||||||
| 'media_kind'
|
| 'media_kind'
|
||||||
|
| 'scan_kind'
|
||||||
;
|
;
|
||||||
|
|
||||||
GROUPTAG : 'track_count'
|
GROUPTAG : 'track_count'
|
||||||
@ -205,6 +206,8 @@ ENUMVAL : 'music'
|
|||||||
| 'url'
|
| 'url'
|
||||||
| 'spotify'
|
| 'spotify'
|
||||||
| 'pipe'
|
| 'pipe'
|
||||||
|
| 'files'
|
||||||
|
| 'rss'
|
||||||
;
|
;
|
||||||
|
|
||||||
ORDERBY : 'order by'
|
ORDERBY : 'order by'
|
||||||
|
@ -304,6 +304,21 @@ expression returns [ pANTLR3_STRING result, pANTLR3_STRING orderby, pANTLR3_STRI
|
|||||||
sprintf(str, "f.data_kind = \%d", DATA_KIND_PIPE);
|
sprintf(str, "f.data_kind = \%d", DATA_KIND_PIPE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (strcmp((char *)tag, "scan_kind") == 0)
|
||||||
|
{
|
||||||
|
if (strcmp((char *)val, "files") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.scan_kind = \%d", SCAN_KIND_FILES);
|
||||||
|
}
|
||||||
|
else if (strcmp((char *)val, "spotify") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.scan_kind = \%d", SCAN_KIND_SPOTIFY);
|
||||||
|
}
|
||||||
|
else if (strcmp((char *)val, "rss") == 0)
|
||||||
|
{
|
||||||
|
sprintf(str, "f.scan_kind = \%d", SCAN_KIND_RSS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$result = $ENUMTAG.text->factory->newRaw($ENUMTAG.text->factory);
|
$result = $ENUMTAG.text->factory->newRaw($ENUMTAG.text->factory);
|
||||||
$result->append8($result, str);
|
$result->append8($result, str);
|
||||||
|
33
web-src/package-lock.json
generated
33
web-src/package-lock.json
generated
@ -9,11 +9,10 @@
|
|||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"license": "GPL-2.0",
|
"license": "GPL-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^0.24.0",
|
"axios": "^0.25.0",
|
||||||
"bulma": "^0.9.3",
|
"bulma": "^0.9.3",
|
||||||
"bulma-switch": "^2.0.0",
|
"bulma-switch": "^2.0.4",
|
||||||
"core-js": "^3.15.2",
|
"core-js": "^3.15.2",
|
||||||
"follow-redirects": "^1.14.7",
|
|
||||||
"mdi": "^2.2.43",
|
"mdi": "^2.2.43",
|
||||||
"moment": "^2.29.1",
|
"moment": "^2.29.1",
|
||||||
"moment-duration-format": "^2.3.2",
|
"moment-duration-format": "^2.3.2",
|
||||||
@ -4387,11 +4386,11 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/axios": {
|
"node_modules/axios": {
|
||||||
"version": "0.24.0",
|
"version": "0.25.0",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz",
|
||||||
"integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
|
"integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"follow-redirects": "^1.14.4"
|
"follow-redirects": "^1.14.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/babel-eslint": {
|
"node_modules/babel-eslint": {
|
||||||
@ -4946,9 +4945,9 @@
|
|||||||
"integrity": "sha512-0d7GNW1PY4ud8TWxdNcP6Cc8Bu7MxcntD/RRLGWuiw/s0a9P+XlH/6QoOIrmbj6o8WWJzJYhytiu9nFjTszk1g=="
|
"integrity": "sha512-0d7GNW1PY4ud8TWxdNcP6Cc8Bu7MxcntD/RRLGWuiw/s0a9P+XlH/6QoOIrmbj6o8WWJzJYhytiu9nFjTszk1g=="
|
||||||
},
|
},
|
||||||
"node_modules/bulma-switch": {
|
"node_modules/bulma-switch": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/bulma-switch/-/bulma-switch-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/bulma-switch/-/bulma-switch-2.0.4.tgz",
|
||||||
"integrity": "sha512-myD38zeUfjmdduq+pXabhJEe3x2hQP48l/OI+Y0fO3HdDynZUY/VJygucvEAJKRjr4HxD5DnEm4yx+oDOBXpAA=="
|
"integrity": "sha512-kMu4H0Pr0VjvfsnT6viRDCgptUq0Rvy7y7PX6q+IHg1xUynsjszPjhAdal5ysAlCG5HNO+5YXxeiu92qYGQolw=="
|
||||||
},
|
},
|
||||||
"node_modules/bytes": {
|
"node_modules/bytes": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
@ -23600,11 +23599,11 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"axios": {
|
"axios": {
|
||||||
"version": "0.24.0",
|
"version": "0.25.0",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz",
|
||||||
"integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
|
"integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"follow-redirects": "^1.14.4"
|
"follow-redirects": "^1.14.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"babel-eslint": {
|
"babel-eslint": {
|
||||||
@ -24082,9 +24081,9 @@
|
|||||||
"integrity": "sha512-0d7GNW1PY4ud8TWxdNcP6Cc8Bu7MxcntD/RRLGWuiw/s0a9P+XlH/6QoOIrmbj6o8WWJzJYhytiu9nFjTszk1g=="
|
"integrity": "sha512-0d7GNW1PY4ud8TWxdNcP6Cc8Bu7MxcntD/RRLGWuiw/s0a9P+XlH/6QoOIrmbj6o8WWJzJYhytiu9nFjTszk1g=="
|
||||||
},
|
},
|
||||||
"bulma-switch": {
|
"bulma-switch": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/bulma-switch/-/bulma-switch-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/bulma-switch/-/bulma-switch-2.0.4.tgz",
|
||||||
"integrity": "sha512-myD38zeUfjmdduq+pXabhJEe3x2hQP48l/OI+Y0fO3HdDynZUY/VJygucvEAJKRjr4HxD5DnEm4yx+oDOBXpAA=="
|
"integrity": "sha512-kMu4H0Pr0VjvfsnT6viRDCgptUq0Rvy7y7PX6q+IHg1xUynsjszPjhAdal5ysAlCG5HNO+5YXxeiu92qYGQolw=="
|
||||||
},
|
},
|
||||||
"bytes": {
|
"bytes": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
|
@ -11,11 +11,10 @@
|
|||||||
"dev": "vue-cli-service serve"
|
"dev": "vue-cli-service serve"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^0.24.0",
|
"axios": "^0.25.0",
|
||||||
"bulma": "^0.9.3",
|
"bulma": "^0.9.3",
|
||||||
"bulma-switch": "^2.0.0",
|
"bulma-switch": "^2.0.4",
|
||||||
"core-js": "^3.15.2",
|
"core-js": "^3.15.2",
|
||||||
"follow-redirects": "^1.14.7",
|
|
||||||
"mdi": "^2.2.43",
|
"mdi": "^2.2.43",
|
||||||
"moment": "^2.29.1",
|
"moment": "^2.29.1",
|
||||||
"moment-duration-format": "^2.3.2",
|
"moment-duration-format": "^2.3.2",
|
||||||
|
@ -7,6 +7,9 @@
|
|||||||
<router-view v-show="true" />
|
<router-view v-show="true" />
|
||||||
</transition>
|
</transition>
|
||||||
<modal-dialog-remote-pairing :show="pairing_active" @close="pairing_active = false" />
|
<modal-dialog-remote-pairing :show="pairing_active" @close="pairing_active = false" />
|
||||||
|
<modal-dialog-update
|
||||||
|
:show="show_update_dialog"
|
||||||
|
@close="show_update_dialog = false" />
|
||||||
<notifications v-show="!show_burger_menu" />
|
<notifications v-show="!show_burger_menu" />
|
||||||
<navbar-bottom />
|
<navbar-bottom />
|
||||||
<div class="fd-overlay-fullscreen" v-show="show_burger_menu || show_player_menu"
|
<div class="fd-overlay-fullscreen" v-show="show_burger_menu || show_player_menu"
|
||||||
@ -19,6 +22,7 @@ import NavbarTop from '@/components/NavbarTop'
|
|||||||
import NavbarBottom from '@/components/NavbarBottom'
|
import NavbarBottom from '@/components/NavbarBottom'
|
||||||
import Notifications from '@/components/Notifications'
|
import Notifications from '@/components/Notifications'
|
||||||
import ModalDialogRemotePairing from '@/components/ModalDialogRemotePairing'
|
import ModalDialogRemotePairing from '@/components/ModalDialogRemotePairing'
|
||||||
|
import ModalDialogUpdate from '@/components/ModalDialogUpdate'
|
||||||
import webapi from '@/webapi'
|
import webapi from '@/webapi'
|
||||||
import * as types from '@/store/mutation_types'
|
import * as types from '@/store/mutation_types'
|
||||||
import ReconnectingWebSocket from 'reconnectingwebsocket'
|
import ReconnectingWebSocket from 'reconnectingwebsocket'
|
||||||
@ -26,7 +30,7 @@ import moment from 'moment'
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'App',
|
||||||
components: { NavbarTop, NavbarBottom, Notifications, ModalDialogRemotePairing },
|
components: { NavbarTop, NavbarBottom, Notifications, ModalDialogRemotePairing, ModalDialogUpdate },
|
||||||
template: '<App/>',
|
template: '<App/>',
|
||||||
|
|
||||||
data () {
|
data () {
|
||||||
@ -53,6 +57,14 @@ export default {
|
|||||||
set (value) {
|
set (value) {
|
||||||
this.$store.commit(types.SHOW_PLAYER_MENU, value)
|
this.$store.commit(types.SHOW_PLAYER_MENU, value)
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
show_update_dialog: {
|
||||||
|
get () {
|
||||||
|
return this.$store.state.show_update_dialog
|
||||||
|
},
|
||||||
|
set (value) {
|
||||||
|
this.$store.commit(types.SHOW_UPDATE_DIALOG, value)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -181,6 +193,9 @@ export default {
|
|||||||
webapi.library_count('media_kind is podcast').then(({ data }) => {
|
webapi.library_count('media_kind is podcast').then(({ data }) => {
|
||||||
this.$store.commit(types.UPDATE_LIBRARY_PODCASTS_COUNT, data)
|
this.$store.commit(types.UPDATE_LIBRARY_PODCASTS_COUNT, data)
|
||||||
})
|
})
|
||||||
|
webapi.library_count('scan_kind is rss').then(({ data }) => {
|
||||||
|
this.$store.commit(types.UPDATE_LIBRARY_RSS_COUNT, data)
|
||||||
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
update_outputs: function () {
|
update_outputs: function () {
|
||||||
|
95
web-src/src/components/ModalDialogUpdate.vue
Normal file
95
web-src/src/components/ModalDialogUpdate.vue
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<template>
|
||||||
|
<modal-dialog
|
||||||
|
:show="show"
|
||||||
|
title="Update library"
|
||||||
|
:ok_action="library.updating ? '' : 'Rescan'"
|
||||||
|
close_action="Close"
|
||||||
|
@ok="update_library"
|
||||||
|
@close="close()">
|
||||||
|
<template slot="modal-content">
|
||||||
|
<div v-if="!library.updating">
|
||||||
|
<p class="mb-3">Scan for new, deleted and modified files</p>
|
||||||
|
<div class="field" v-if="spotify_enabled || rss.tracks > 0">
|
||||||
|
<div class="control">
|
||||||
|
<div class="select is-small">
|
||||||
|
<select v-model="update_dialog_scan_kind">
|
||||||
|
<option value="">Update everything</option>
|
||||||
|
<option value="files">Only update local library</option>
|
||||||
|
<option value="spotify" v-if="spotify_enabled">Only update Spotify</option>
|
||||||
|
<option value="rss" v-if="rss.tracks > 0">Only update RSS feeds</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="field">
|
||||||
|
<label class="checkbox is-size-7 is-small">
|
||||||
|
<input type="checkbox" v-model="rescan_metadata">
|
||||||
|
Rescan metadata for unmodified files
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<p class="mb-3">Library update in progress ...</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</modal-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import ModalDialog from '@/components/ModalDialog'
|
||||||
|
import * as types from '@/store/mutation_types'
|
||||||
|
import webapi from '@/webapi'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'ModalDialogUpdate',
|
||||||
|
components: { ModalDialog },
|
||||||
|
props: ['show'],
|
||||||
|
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
rescan_metadata: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
library () {
|
||||||
|
return this.$store.state.library
|
||||||
|
},
|
||||||
|
|
||||||
|
rss () {
|
||||||
|
return this.$store.state.rss_count
|
||||||
|
},
|
||||||
|
|
||||||
|
spotify_enabled () {
|
||||||
|
return this.$store.state.spotify.webapi_token_valid
|
||||||
|
},
|
||||||
|
|
||||||
|
update_dialog_scan_kind: {
|
||||||
|
get () {
|
||||||
|
return this.$store.state.update_dialog_scan_kind
|
||||||
|
},
|
||||||
|
set (value) {
|
||||||
|
this.$store.commit(types.UPDATE_DIALOG_SCAN_KIND, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
update_library () {
|
||||||
|
if (this.rescan_metadata) {
|
||||||
|
webapi.library_rescan(this.update_dialog_scan_kind)
|
||||||
|
} else {
|
||||||
|
webapi.library_update(this.update_dialog_scan_kind)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
close () {
|
||||||
|
this.update_dialog_scan_kind = ''
|
||||||
|
this.$emit('close')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
</style>
|
@ -61,7 +61,7 @@
|
|||||||
<hr class="fd-navbar-divider">
|
<hr class="fd-navbar-divider">
|
||||||
|
|
||||||
<navbar-item-link to="/settings/webinterface">Settings</navbar-item-link>
|
<navbar-item-link to="/settings/webinterface">Settings</navbar-item-link>
|
||||||
<a class="navbar-item" @click.stop.prevent="show_update_library = true; show_settings_menu = false; show_burger_menu = false">
|
<a class="navbar-item" @click.stop.prevent="show_update_dialog = true; show_settings_menu = false; show_burger_menu = false">
|
||||||
Update Library
|
Update Library
|
||||||
</a>
|
</a>
|
||||||
<navbar-item-link to="/about">About</navbar-item-link>
|
<navbar-item-link to="/about">About</navbar-item-link>
|
||||||
@ -72,29 +72,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<modal-dialog
|
|
||||||
:show="show_update_library"
|
|
||||||
title="Update library"
|
|
||||||
:ok_action="library.updating ? '' : 'Rescan'"
|
|
||||||
close_action="Close"
|
|
||||||
@ok="update_library"
|
|
||||||
@close="show_update_library = false">
|
|
||||||
<template slot="modal-content">
|
|
||||||
<div v-if="!library.updating">
|
|
||||||
<p class="mb-3">Scan for new, deleted and modified files</p>
|
|
||||||
<div class="field">
|
|
||||||
<label class="checkbox is-size-7 is-small">
|
|
||||||
<input type="checkbox" v-model="rescan_metadata">
|
|
||||||
Rescan metadata for unmodified files
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div v-else>
|
|
||||||
<p class="mb-3">Library update in progress ...</p>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</modal-dialog>
|
|
||||||
|
|
||||||
<div class="is-overlay" v-show="show_settings_menu"
|
<div class="is-overlay" v-show="show_settings_menu"
|
||||||
style="z-index:10; width: 100vw; height:100vh;"
|
style="z-index:10; width: 100vw; height:100vh;"
|
||||||
@click="show_settings_menu = false"></div>
|
@click="show_settings_menu = false"></div>
|
||||||
@ -103,19 +80,15 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import NavbarItemLink from './NavbarItemLink'
|
import NavbarItemLink from './NavbarItemLink'
|
||||||
import ModalDialog from '@/components/ModalDialog'
|
|
||||||
import * as types from '@/store/mutation_types'
|
import * as types from '@/store/mutation_types'
|
||||||
import webapi from '@/webapi'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'NavbarTop',
|
name: 'NavbarTop',
|
||||||
components: { NavbarItemLink, ModalDialog },
|
components: { NavbarItemLink },
|
||||||
|
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
show_settings_menu: false,
|
show_settings_menu: false
|
||||||
show_update_library: false,
|
|
||||||
rescan_metadata: false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -179,6 +152,15 @@ export default {
|
|||||||
return this.$store.state.show_player_menu
|
return this.$store.state.show_player_menu
|
||||||
},
|
},
|
||||||
|
|
||||||
|
show_update_dialog: {
|
||||||
|
get () {
|
||||||
|
return this.$store.state.show_update_dialog
|
||||||
|
},
|
||||||
|
set (value) {
|
||||||
|
this.$store.commit(types.SHOW_UPDATE_DIALOG, value)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
zindex () {
|
zindex () {
|
||||||
if (this.show_player_menu) {
|
if (this.show_player_menu) {
|
||||||
return 'z-index: 20'
|
return 'z-index: 20'
|
||||||
@ -190,14 +172,6 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
on_click_outside_settings () {
|
on_click_outside_settings () {
|
||||||
this.show_settings_menu = !this.show_settings_menu
|
this.show_settings_menu = !this.show_settings_menu
|
||||||
},
|
|
||||||
|
|
||||||
update_library () {
|
|
||||||
if (this.rescan_metadata) {
|
|
||||||
webapi.library_rescan()
|
|
||||||
} else {
|
|
||||||
webapi.library_update()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -26,33 +26,7 @@
|
|||||||
<!-- Right side -->
|
<!-- Right side -->
|
||||||
<div class="level-right">
|
<div class="level-right">
|
||||||
<div v-if="library.updating"><a class="button is-small is-loading">Update</a></div>
|
<div v-if="library.updating"><a class="button is-small is-loading">Update</a></div>
|
||||||
<div v-else class="dropdown is-right" :class="{ 'is-active': show_update_dropdown }" v-click-outside="onClickOutside">
|
<div v-else><a @click="showUpdateDialog()" class="button is-small">Update</a></div>
|
||||||
<div class="dropdown-trigger">
|
|
||||||
<div class="buttons has-addons">
|
|
||||||
<a @click="update" class="button is-small">Update</a>
|
|
||||||
<a @click="show_update_dropdown = !show_update_dropdown" class="button is-small">
|
|
||||||
<span class="icon"><i class="mdi" :class="{ 'mdi-chevron-down': !show_update_dropdown, 'mdi-chevron-up': show_update_dropdown }"></i></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="dropdown-menu" id="dropdown-menu" role="menu">
|
|
||||||
<div class="dropdown-content">
|
|
||||||
<div class="dropdown-item">
|
|
||||||
<a @click="update" class="has-text-dark">
|
|
||||||
<strong>Update</strong><br>
|
|
||||||
<span class="is-size-7">Adds new, removes deleted and updates modified files.</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<hr class="dropdown-divider">
|
|
||||||
<div class="dropdown-item">
|
|
||||||
<a @click="update_meta" class="has-text-dark">
|
|
||||||
<strong>Rescan metadata</strong><br>
|
|
||||||
<span class="is-size-7">Same as update, but also rescans unmodified files.</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
@ -105,14 +79,15 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import webapi from '@/webapi'
|
import * as types from '@/store/mutation_types'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'PageAbout',
|
name: 'PageAbout',
|
||||||
|
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
show_update_dropdown: false
|
show_update_dropdown: false,
|
||||||
|
show_update_library: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -129,15 +104,8 @@ export default {
|
|||||||
onClickOutside (event) {
|
onClickOutside (event) {
|
||||||
this.show_update_dropdown = false
|
this.show_update_dropdown = false
|
||||||
},
|
},
|
||||||
|
showUpdateDialog () {
|
||||||
update: function () {
|
this.$store.commit(types.SHOW_UPDATE_DIALOG, true)
|
||||||
this.show_update_dropdown = false
|
|
||||||
webapi.library_update()
|
|
||||||
},
|
|
||||||
|
|
||||||
update_meta: function () {
|
|
||||||
this.show_update_dropdown = false
|
|
||||||
webapi.library_rescan()
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -43,6 +43,12 @@
|
|||||||
</template>
|
</template>
|
||||||
<template slot="heading-right">
|
<template slot="heading-right">
|
||||||
<div class="buttons is-centered">
|
<div class="buttons is-centered">
|
||||||
|
<a v-if="rss.tracks > 0" class="button is-small" @click="update_rss">
|
||||||
|
<span class="icon">
|
||||||
|
<i class="mdi mdi-refresh"></i>
|
||||||
|
</span>
|
||||||
|
<span>Update</span>
|
||||||
|
</a>
|
||||||
<a class="button is-small" @click="open_add_podcast_dialog">
|
<a class="button is-small" @click="open_add_podcast_dialog">
|
||||||
<span class="icon">
|
<span class="icon">
|
||||||
<i class="mdi mdi-rss"></i>
|
<i class="mdi mdi-rss"></i>
|
||||||
@ -72,6 +78,7 @@ import ListItemTrack from '@/components/ListItemTrack'
|
|||||||
import ListAlbums from '@/components/ListAlbums'
|
import ListAlbums from '@/components/ListAlbums'
|
||||||
import ModalDialogTrack from '@/components/ModalDialogTrack'
|
import ModalDialogTrack from '@/components/ModalDialogTrack'
|
||||||
import ModalDialogAddRss from '@/components/ModalDialogAddRss'
|
import ModalDialogAddRss from '@/components/ModalDialogAddRss'
|
||||||
|
import * as types from '@/store/mutation_types'
|
||||||
import RangeSlider from 'vue-range-slider'
|
import RangeSlider from 'vue-range-slider'
|
||||||
import webapi from '@/webapi'
|
import webapi from '@/webapi'
|
||||||
|
|
||||||
@ -106,6 +113,12 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
rss () {
|
||||||
|
return this.$store.state.rss_count
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
play_track: function (track) {
|
play_track: function (track) {
|
||||||
webapi.player_play_uri(track.uri, false)
|
webapi.player_play_uri(track.uri, false)
|
||||||
@ -138,6 +151,11 @@ export default {
|
|||||||
this.albums = data
|
this.albums = data
|
||||||
this.reload_new_episodes()
|
this.reload_new_episodes()
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
update_rss: function () {
|
||||||
|
this.$store.commit(types.UPDATE_DIALOG_SCAN_KIND, 'rss')
|
||||||
|
this.$store.commit(types.SHOW_UPDATE_DIALOG, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ export default new Vuex.Store({
|
|||||||
},
|
},
|
||||||
audiobooks_count: { },
|
audiobooks_count: { },
|
||||||
podcasts_count: { },
|
podcasts_count: { },
|
||||||
|
rss_count: { },
|
||||||
outputs: [],
|
outputs: [],
|
||||||
player: {
|
player: {
|
||||||
state: 'stop',
|
state: 'stop',
|
||||||
@ -59,7 +60,9 @@ export default new Vuex.Store({
|
|||||||
albums_sort: 'Name',
|
albums_sort: 'Name',
|
||||||
show_only_next_items: false,
|
show_only_next_items: false,
|
||||||
show_burger_menu: false,
|
show_burger_menu: false,
|
||||||
show_player_menu: false
|
show_player_menu: false,
|
||||||
|
show_update_dialog: false,
|
||||||
|
update_dialog_scan_kind: ''
|
||||||
},
|
},
|
||||||
|
|
||||||
getters: {
|
getters: {
|
||||||
@ -141,6 +144,9 @@ export default new Vuex.Store({
|
|||||||
[types.UPDATE_LIBRARY_PODCASTS_COUNT] (state, count) {
|
[types.UPDATE_LIBRARY_PODCASTS_COUNT] (state, count) {
|
||||||
state.podcasts_count = count
|
state.podcasts_count = count
|
||||||
},
|
},
|
||||||
|
[types.UPDATE_LIBRARY_RSS_COUNT] (state, count) {
|
||||||
|
state.rss_count = count
|
||||||
|
},
|
||||||
[types.UPDATE_OUTPUTS] (state, outputs) {
|
[types.UPDATE_OUTPUTS] (state, outputs) {
|
||||||
state.outputs = outputs
|
state.outputs = outputs
|
||||||
},
|
},
|
||||||
@ -217,6 +223,12 @@ export default new Vuex.Store({
|
|||||||
},
|
},
|
||||||
[types.SHOW_PLAYER_MENU] (state, showPlayerMenu) {
|
[types.SHOW_PLAYER_MENU] (state, showPlayerMenu) {
|
||||||
state.show_player_menu = showPlayerMenu
|
state.show_player_menu = showPlayerMenu
|
||||||
|
},
|
||||||
|
[types.SHOW_UPDATE_DIALOG] (state, showUpdateDialog) {
|
||||||
|
state.show_update_dialog = showUpdateDialog
|
||||||
|
},
|
||||||
|
[types.UPDATE_DIALOG_SCAN_KIND] (state, scanKind) {
|
||||||
|
state.update_dialog_scan_kind = scanKind
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ export const UPDATE_SETTINGS_OPTION = 'UPDATE_SETTINGS_OPTION'
|
|||||||
export const UPDATE_LIBRARY_STATS = 'UPDATE_LIBRARY_STATS'
|
export const UPDATE_LIBRARY_STATS = 'UPDATE_LIBRARY_STATS'
|
||||||
export const UPDATE_LIBRARY_AUDIOBOOKS_COUNT = 'UPDATE_LIBRARY_AUDIOBOOKS_COUNT'
|
export const UPDATE_LIBRARY_AUDIOBOOKS_COUNT = 'UPDATE_LIBRARY_AUDIOBOOKS_COUNT'
|
||||||
export const UPDATE_LIBRARY_PODCASTS_COUNT = 'UPDATE_LIBRARY_PODCASTS_COUNT'
|
export const UPDATE_LIBRARY_PODCASTS_COUNT = 'UPDATE_LIBRARY_PODCASTS_COUNT'
|
||||||
|
export const UPDATE_LIBRARY_RSS_COUNT = 'UPDATE_LIBRARY_RSS_COUNT'
|
||||||
export const UPDATE_OUTPUTS = 'UPDATE_OUTPUTS'
|
export const UPDATE_OUTPUTS = 'UPDATE_OUTPUTS'
|
||||||
export const UPDATE_PLAYER_STATUS = 'UPDATE_PLAYER_STATUS'
|
export const UPDATE_PLAYER_STATUS = 'UPDATE_PLAYER_STATUS'
|
||||||
export const UPDATE_QUEUE = 'UPDATE_QUEUE'
|
export const UPDATE_QUEUE = 'UPDATE_QUEUE'
|
||||||
@ -26,3 +27,5 @@ export const ALBUMS_SORT = 'ALBUMS_SORT'
|
|||||||
export const SHOW_ONLY_NEXT_ITEMS = 'SHOW_ONLY_NEXT_ITEMS'
|
export const SHOW_ONLY_NEXT_ITEMS = 'SHOW_ONLY_NEXT_ITEMS'
|
||||||
export const SHOW_BURGER_MENU = 'SHOW_BURGER_MENU'
|
export const SHOW_BURGER_MENU = 'SHOW_BURGER_MENU'
|
||||||
export const SHOW_PLAYER_MENU = 'SHOW_PLAYER_MENU'
|
export const SHOW_PLAYER_MENU = 'SHOW_PLAYER_MENU'
|
||||||
|
export const SHOW_UPDATE_DIALOG = 'SHOW_UPDATE_DIALOG'
|
||||||
|
export const UPDATE_DIALOG_SCAN_KIND = 'UPDATE_DIALOG_SCAN_KIND'
|
||||||
|
@ -27,12 +27,20 @@ export default {
|
|||||||
return axios.get('./api/library')
|
return axios.get('./api/library')
|
||||||
},
|
},
|
||||||
|
|
||||||
library_update () {
|
library_update (scanKind) {
|
||||||
return axios.put('./api/update')
|
const params = {}
|
||||||
|
if (scanKind) {
|
||||||
|
params.scan_kind = scanKind
|
||||||
|
}
|
||||||
|
return axios.put('./api/update', undefined, { params: params })
|
||||||
},
|
},
|
||||||
|
|
||||||
library_rescan () {
|
library_rescan (scanKind) {
|
||||||
return axios.put('./api/rescan')
|
const params = {}
|
||||||
|
if (scanKind) {
|
||||||
|
params.scan_kind = scanKind
|
||||||
|
}
|
||||||
|
return axios.put('./api/rescan', undefined, { params: params })
|
||||||
},
|
},
|
||||||
|
|
||||||
library_count (expression) {
|
library_count (expression) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user