diff --git a/client/components/modals/changelog/ViewModal.vue b/client/components/modals/changelog/ViewModal.vue
index a61cc951..6ff0e067 100644
--- a/client/components/modals/changelog/ViewModal.vue
+++ b/client/components/modals/changelog/ViewModal.vue
@@ -6,10 +6,15 @@
@@ -37,24 +42,15 @@ export default {
dateFormat() {
return this.$store.state.serverSettings.dateFormat
},
- changelog() {
- return this.versionData?.currentVersionChangelog || 'No Changelog Available'
- },
- compiledMarkedown() {
- return marked.parse(this.changelog, { gfm: true, breaks: true })
- },
- currentVersionPubDate() {
- if (!this.versionData?.currentVersionPubDate) return 'Unknown release date'
- return `${this.$formatDate(this.versionData.currentVersionPubDate, this.dateFormat)}`
- },
- currentTagUrl() {
- return this.versionData?.currentTagUrl
- },
- currentVersionNumber() {
- return this.$config.version
+ releasesToShow() {
+ return this.versionData?.releasesToShow || []
+ }
+ },
+ methods: {
+ getChangelog(release) {
+ return marked.parse(release.changelog || 'No Changelog Available', { gfm: true, breaks: true })
}
},
- methods: {},
mounted() {}
}
diff --git a/client/plugins/version.js b/client/plugins/version.js
index 593b29a5..f515ea11 100644
--- a/client/plugins/version.js
+++ b/client/plugins/version.js
@@ -11,6 +11,7 @@ function parseSemver(ver) {
return null
}
return {
+ name: ver,
total,
version: groups[2],
major: Number(groups[3]),
@@ -24,49 +25,60 @@ function parseSemver(ver) {
return null
}
+function getReleases() {
+ return axios
+ .get(`https://api.github.com/repos/advplyr/audiobookshelf/releases`)
+ .then((res) => {
+ return res.data
+ .map((release) => {
+ const tagName = release.tag_name
+ const verObj = parseSemver(tagName)
+ if (verObj) {
+ verObj.pubdate = new Date(release.published_at)
+ verObj.changelog = release.body
+ return verObj
+ }
+ return null
+ })
+ .filter((verObj) => verObj)
+ })
+ .catch((error) => {
+ console.error('Failed to get releases', error)
+ return []
+ })
+}
+
export const currentVersion = packagejson.version
export async function checkForUpdate() {
if (!packagejson.version) {
return null
}
- var currVerObj = parseSemver('v' + packagejson.version)
- if (!currVerObj) {
- console.error('Invalid version', packagejson.version)
- return null
- }
- var largestVer = null
- await axios.get(`https://api.github.com/repos/advplyr/audiobookshelf/releases`).then((res) => {
- var releases = res.data
- if (releases && releases.length) {
- releases.forEach((release) => {
- var tagName = release.tag_name
- var verObj = parseSemver(tagName)
- if (verObj) {
- if (!largestVer || largestVer.total < verObj.total) {
- largestVer = verObj
- }
- }
- if (verObj.version == currVerObj.version) {
- currVerObj.pubdate = new Date(release.published_at)
- currVerObj.changelog = release.body
- }
- })
- }
- })
- if (!largestVer) {
- console.error('No valid version tags to compare with')
+ const releases = await getReleases()
+ if (!releases.length) {
+ console.error('No releases found')
return null
}
+ const currentVersion = releases.find((release) => release.version == packagejson.version)
+ if (!currentVersion) {
+ console.error('Current version not found in releases')
+ return null
+ }
+
+ const latestVersion = releases[0]
+ const currentVersionMinor = currentVersion.minor
+ // Show all releases with the same minor version and lower or equal total version
+ const releasesToShow = releases.filter((release) => {
+ return release.minor == currentVersionMinor && release.total <= currentVersion.total
+ })
+
return {
- hasUpdate: largestVer.total > currVerObj.total,
- latestVersion: largestVer.version,
- githubTagUrl: `https://github.com/advplyr/audiobookshelf/releases/tag/v${largestVer.version}`,
- currentVersion: currVerObj.version,
- currentTagUrl: `https://github.com/advplyr/audiobookshelf/releases/tag/v${currVerObj.version}`,
- currentVersionPubDate: currVerObj.pubdate,
- currentVersionChangelog: currVerObj.changelog
+ hasUpdate: latestVersion.total > currentVersion.total,
+ latestVersion: latestVersion.version,
+ githubTagUrl: `https://github.com/advplyr/audiobookshelf/releases/tag/v${latestVersion.version}`,
+ currentVersion: currentVersion.version,
+ releasesToShow
}
}
diff --git a/client/store/index.js b/client/store/index.js
index ed7c35b6..acd03eb4 100644
--- a/client/store/index.js
+++ b/client/store/index.js
@@ -32,33 +32,33 @@ export const state = () => ({
})
export const getters = {
- getServerSetting: state => key => {
+ getServerSetting: (state) => (key) => {
if (!state.serverSettings) return null
return state.serverSettings[key]
},
- getLibraryItemIdStreaming: state => {
+ getLibraryItemIdStreaming: (state) => {
return state.streamLibraryItem?.id || null
},
getIsStreamingFromDifferentLibrary: (state, getters, rootState) => {
if (!state.streamLibraryItem) return false
return state.streamLibraryItem.libraryId !== rootState.libraries.currentLibraryId
},
- getIsMediaStreaming: state => (libraryItemId, episodeId) => {
+ getIsMediaStreaming: (state) => (libraryItemId, episodeId) => {
if (!state.streamLibraryItem) return null
if (!episodeId) return state.streamLibraryItem.id == libraryItemId
return state.streamLibraryItem.id == libraryItemId && state.streamEpisodeId == episodeId
},
- getIsMediaQueued: state => (libraryItemId, episodeId) => {
- return state.playerQueueItems.some(i => {
+ getIsMediaQueued: (state) => (libraryItemId, episodeId) => {
+ return state.playerQueueItems.some((i) => {
if (!episodeId) return i.libraryItemId === libraryItemId
return i.libraryItemId === libraryItemId && i.episodeId === episodeId
})
},
- getBookshelfView: state => {
+ getBookshelfView: (state) => {
if (!state.serverSettings || isNaN(state.serverSettings.bookshelfView)) return Constants.BookshelfView.STANDARD
return state.serverSettings.bookshelfView
},
- getHomeBookshelfView: state => {
+ getHomeBookshelfView: (state) => {
if (!state.serverSettings || isNaN(state.serverSettings.homeBookshelfView)) return Constants.BookshelfView.STANDARD
return state.serverSettings.homeBookshelfView
}
@@ -69,17 +69,20 @@ export const actions = {
const updatePayload = {
...payload
}
- return this.$axios.$patch('/api/settings', updatePayload).then((result) => {
- if (result.success) {
- commit('setServerSettings', result.serverSettings)
- return true
- } else {
+ return this.$axios
+ .$patch('/api/settings', updatePayload)
+ .then((result) => {
+ if (result.success) {
+ commit('setServerSettings', result.serverSettings)
+ return true
+ } else {
+ return false
+ }
+ })
+ .catch((error) => {
+ console.error('Failed to update server settings', error)
return false
- }
- }).catch((error) => {
- console.error('Failed to update server settings', error)
- return false
- })
+ })
},
checkForUpdate({ commit }) {
const VERSION_CHECK_BUFF = 1000 * 60 * 5 // 5 minutes
@@ -96,7 +99,7 @@ export const actions = {
}
var shouldCheckForUpdate = Date.now() - Number(lastVerCheck) > VERSION_CHECK_BUFF
- if (!shouldCheckForUpdate && savedVersionData && savedVersionData.version !== currentVersion) {
+ if (!shouldCheckForUpdate && savedVersionData && (savedVersionData.version !== currentVersion || !savedVersionData.releasesToShow)) {
// Version mismatch between saved data so check for update anyway
shouldCheckForUpdate = true
}
@@ -180,7 +183,7 @@ export const mutations = {
})
},
addItemToQueue(state, item) {
- const exists = state.playerQueueItems.some(i => {
+ const exists = state.playerQueueItems.some((i) => {
if (!i.episodeId) return i.libraryItemId === item.libraryItemId
return i.libraryItemId === item.libraryItemId && i.episodeId === item.episodeId
})