mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2024-12-20 19:06:06 +01:00
Add version checker
This commit is contained in:
parent
a56b3a8096
commit
bd0e8518be
@ -11,6 +11,11 @@
|
|||||||
<controls-global-search />
|
<controls-global-search />
|
||||||
<div class="flex-grow" />
|
<div class="flex-grow" />
|
||||||
|
|
||||||
|
<!-- <a v-if="isUpdateAvailable" :href="githubTagUrl" target="_blank" class="flex items-center rounded-full bg-warning p-2 text-sm">
|
||||||
|
<span class="material-icons">notification_important</span>
|
||||||
|
<span class="pl-2">Update is available! Check release notes for v{{ latestVersion }}</span>
|
||||||
|
</a> -->
|
||||||
|
|
||||||
<nuxt-link v-if="isRootUser" to="/upload" class="outline-none hover:text-gray-200 cursor-pointer w-8 h-8 flex items-center justify-center mr-4">
|
<nuxt-link v-if="isRootUser" to="/upload" class="outline-none hover:text-gray-200 cursor-pointer w-8 h-8 flex items-center justify-center mr-4">
|
||||||
<span class="material-icons">upload</span>
|
<span class="material-icons">upload</span>
|
||||||
</nuxt-link>
|
</nuxt-link>
|
||||||
|
@ -232,10 +232,40 @@ export default {
|
|||||||
this.socket.on('download_failed', this.downloadFailed)
|
this.socket.on('download_failed', this.downloadFailed)
|
||||||
this.socket.on('download_killed', this.downloadKilled)
|
this.socket.on('download_killed', this.downloadKilled)
|
||||||
this.socket.on('download_expired', this.downloadExpired)
|
this.socket.on('download_expired', this.downloadExpired)
|
||||||
|
},
|
||||||
|
showUpdateToast(versionData) {
|
||||||
|
var ignoreVersion = localStorage.getItem('ignoreVersion')
|
||||||
|
var latestVersion = versionData.latestVersion
|
||||||
|
|
||||||
|
if (!ignoreVersion || ignoreVersion !== latestVersion) {
|
||||||
|
this.$toast.info(`Update is available!\nCheck release notes for v${versionData.latestVersion}`, {
|
||||||
|
position: 'top-center',
|
||||||
|
toastClassName: 'cursor-pointer',
|
||||||
|
bodyClassName: 'custom-class-1',
|
||||||
|
timeout: 20000,
|
||||||
|
closeOnClick: false,
|
||||||
|
draggable: false,
|
||||||
|
hideProgressBar: false,
|
||||||
|
onClick: () => {
|
||||||
|
window.open(versionData.githubTagUrl, '_blank')
|
||||||
|
},
|
||||||
|
onClose: () => {
|
||||||
|
localStorage.setItem('ignoreVersion', versionData.latestVersion)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
console.warn(`Update is available but user chose to dismiss it! v${versionData.latestVersion}`)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.initializeSocket()
|
this.initializeSocket()
|
||||||
|
this.$store
|
||||||
|
.dispatch('checkForUpdate')
|
||||||
|
.then((res) => {
|
||||||
|
if (res && res.hasUpdate) this.showUpdateToast(res)
|
||||||
|
})
|
||||||
|
.catch((err) => console.error(err))
|
||||||
|
|
||||||
if (this.$route.query.error) {
|
if (this.$route.query.error) {
|
||||||
this.$toast.error(this.$route.query.error)
|
this.$toast.error(this.$route.query.error)
|
||||||
@ -243,4 +273,10 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.Vue-Toastification__toast-body.custom-class-1 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "audiobookshelf-client",
|
"name": "audiobookshelf-client",
|
||||||
"version": "1.1.8",
|
"version": "1.1.9",
|
||||||
"description": "Audiobook manager and player",
|
"description": "Audiobook manager and player",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -7,4 +7,4 @@ const options = {
|
|||||||
draggable: false
|
draggable: false
|
||||||
}
|
}
|
||||||
|
|
||||||
Vue.use(Toast, options)
|
Vue.use(Toast, options)
|
||||||
|
59
client/plugins/version.js
Normal file
59
client/plugins/version.js
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import packagejson from '../package.json'
|
||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
|
function parseSemver(ver) {
|
||||||
|
if (!ver) return null
|
||||||
|
var groups = ver.match(/^v((([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)$/)
|
||||||
|
if (groups && groups.length > 6) {
|
||||||
|
var total = Number(groups[3]) * 100 + Number(groups[4]) * 10 + Number(groups[5])
|
||||||
|
if (isNaN(total)) {
|
||||||
|
console.warn('Invalid version total', groups[3], groups[4], groups[5])
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
total,
|
||||||
|
version: groups[2],
|
||||||
|
major: Number(groups[3]),
|
||||||
|
minor: Number(groups[4]),
|
||||||
|
patch: Number(groups[5]),
|
||||||
|
preRelease: groups[6] || null
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.warn('Invalid semver string', ver)
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
export async function checkForUpdate() {
|
||||||
|
if (!packagejson.version) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var currVerObj = parseSemver('v' + packagejson.version)
|
||||||
|
if (!currVerObj) {
|
||||||
|
console.error('Invalid version', packagejson.version)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var largestVer = null
|
||||||
|
await axios.get(`https://api.github.com/repos/advplyr/audiobookshelf/tags`).then((res) => {
|
||||||
|
var tags = res.data
|
||||||
|
if (tags && tags.length) {
|
||||||
|
tags.forEach((tag) => {
|
||||||
|
var verObj = parseSemver(tag.name)
|
||||||
|
if (verObj) {
|
||||||
|
if (!largestVer || largestVer.total < verObj.total) {
|
||||||
|
largestVer = verObj
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (!largestVer) {
|
||||||
|
console.error('No valid version tags to compare with')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
hasUpdate: largestVer.total > currVerObj.total,
|
||||||
|
latestVersion: largestVer.version,
|
||||||
|
githubTagUrl: `https://github.com/advplyr/audiobookshelf/releases/tag/v${largestVer.version}`,
|
||||||
|
currentVersion: currVerObj.version
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
import Vue from 'vue'
|
import { checkForUpdate } from '@/plugins/version'
|
||||||
|
|
||||||
export const state = () => ({
|
export const state = () => ({
|
||||||
|
versionData: null,
|
||||||
serverSettings: null,
|
serverSettings: null,
|
||||||
streamAudiobook: null,
|
streamAudiobook: null,
|
||||||
editModalTab: 'details',
|
editModalTab: 'details',
|
||||||
@ -39,10 +40,24 @@ export const actions = {
|
|||||||
console.error('Failed to update server settings', error)
|
console.error('Failed to update server settings', error)
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
checkForUpdate({ commit }) {
|
||||||
|
return checkForUpdate()
|
||||||
|
.then((res) => {
|
||||||
|
commit('setVersionData', res)
|
||||||
|
return res
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('Update check failed', error)
|
||||||
|
return false
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const mutations = {
|
export const mutations = {
|
||||||
|
setVersionData(state, versionData) {
|
||||||
|
state.versionData = versionData
|
||||||
|
},
|
||||||
setServerSettings(state, settings) {
|
setServerSettings(state, settings) {
|
||||||
state.serverSettings = settings
|
state.serverSettings = settings
|
||||||
},
|
},
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "audiobookshelf",
|
"name": "audiobookshelf",
|
||||||
"version": "1.1.8",
|
"version": "1.1.9",
|
||||||
"description": "Self-hosted audiobook server for managing and playing audiobooks.",
|
"description": "Self-hosted audiobook server for managing and playing audiobooks.",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
Loading…
Reference in New Issue
Block a user