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 @@
-

- Changelog v{{ currentVersionNumber }} ({{ currentVersionPubDate }}) -

-
+
@@ -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 })