diff --git a/Dockerfile b/Dockerfile
index f9c46117..816bdd3c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -57,7 +57,7 @@ WORKDIR /app
# Copy compiled frontend and server from build stages
COPY --from=build-client /client/dist /app/client/dist
COPY --from=build-server /server /app
-COPY --from=build-server /usr/local/lib/nusqlite3 /usr/local/lib/nusqlite3
+COPY --from=build-server ${NUSQLITE3_PATH} ${NUSQLITE3_PATH}
EXPOSE 80
diff --git a/client/components/app/ConfigSideNav.vue b/client/components/app/ConfigSideNav.vue
index 50fa7a06..32e7e694 100644
--- a/client/components/app/ConfigSideNav.vue
+++ b/client/components/app/ConfigSideNav.vue
@@ -70,6 +70,11 @@ export default {
title: this.$strings.HeaderUsers,
path: '/config/users'
},
+ {
+ id: 'config-api-keys',
+ title: this.$strings.HeaderApiKeys,
+ path: '/config/api-keys'
+ },
{
id: 'config-sessions',
title: this.$strings.HeaderListeningSessions,
diff --git a/client/components/app/LazyBookshelf.vue b/client/components/app/LazyBookshelf.vue
index 61331fb9..854b61b2 100644
--- a/client/components/app/LazyBookshelf.vue
+++ b/client/components/app/LazyBookshelf.vue
@@ -778,10 +778,6 @@ export default {
windowResize() {
this.executeRebuild()
},
- socketInit() {
- // Server settings are set on socket init
- this.executeRebuild()
- },
initListeners() {
window.addEventListener('resize', this.windowResize)
@@ -794,7 +790,6 @@ export default {
})
this.$eventBus.$on('bookshelf_clear_selection', this.clearSelectedEntities)
- this.$eventBus.$on('socket_init', this.socketInit)
this.$eventBus.$on('user-settings', this.settingsUpdated)
if (this.$root.socket) {
@@ -826,7 +821,6 @@ export default {
}
this.$eventBus.$off('bookshelf_clear_selection', this.clearSelectedEntities)
- this.$eventBus.$off('socket_init', this.socketInit)
this.$eventBus.$off('user-settings', this.settingsUpdated)
if (this.$root.socket) {
diff --git a/client/components/cards/AuthorCard.vue b/client/components/cards/AuthorCard.vue
index 82645c57..05347393 100644
--- a/client/components/cards/AuthorCard.vue
+++ b/client/components/cards/AuthorCard.vue
@@ -71,9 +71,6 @@ export default {
coverHeight() {
return this.cardHeight
},
- userToken() {
- return this.store.getters['user/getToken']
- },
_author() {
return this.author || {}
},
diff --git a/client/components/cards/LazyBookCard.vue b/client/components/cards/LazyBookCard.vue
index 35c959fa..41b73310 100644
--- a/client/components/cards/LazyBookCard.vue
+++ b/client/components/cards/LazyBookCard.vue
@@ -198,7 +198,7 @@ export default {
return this.store.getters['user/getSizeMultiplier']
},
dateFormat() {
- return this.store.state.serverSettings.dateFormat
+ return this.store.getters['getServerSetting']('dateFormat')
},
_libraryItem() {
return this.libraryItem || {}
diff --git a/client/components/cards/LazySeriesCard.vue b/client/components/cards/LazySeriesCard.vue
index 3532095b..34cea7e2 100644
--- a/client/components/cards/LazySeriesCard.vue
+++ b/client/components/cards/LazySeriesCard.vue
@@ -71,7 +71,7 @@ export default {
return this.height * this.sizeMultiplier
},
dateFormat() {
- return this.store.state.serverSettings.dateFormat
+ return this.store.getters['getServerSetting']('dateFormat')
},
labelFontSize() {
if (this.width < 160) return 0.75
diff --git a/client/components/controls/LibraryFilterSelect.vue b/client/components/controls/LibraryFilterSelect.vue
index f5eec41a..62a9b803 100644
--- a/client/components/controls/LibraryFilterSelect.vue
+++ b/client/components/controls/LibraryFilterSelect.vue
@@ -94,6 +94,9 @@ export default {
userIsAdminOrUp() {
return this.$store.getters['user/getIsAdminOrUp']
},
+ userCanAccessExplicitContent() {
+ return this.$store.getters['user/getUserCanAccessExplicitContent']
+ },
libraryMediaType() {
return this.$store.getters['libraries/getCurrentLibraryMediaType']
},
@@ -239,6 +242,15 @@ export default {
sublist: false
}
]
+
+ if (this.userCanAccessExplicitContent) {
+ items.push({
+ text: this.$strings.LabelExplicit,
+ value: 'explicit',
+ sublist: false
+ })
+ }
+
if (this.userIsAdminOrUp) {
items.push({
text: this.$strings.LabelShareOpen,
@@ -249,7 +261,7 @@ export default {
return items
},
podcastItems() {
- return [
+ const items = [
{
text: this.$strings.LabelAll,
value: 'all'
@@ -283,6 +295,16 @@ export default {
sublist: false
}
]
+
+ if (this.userCanAccessExplicitContent) {
+ items.push({
+ text: this.$strings.LabelExplicit,
+ value: 'explicit',
+ sublist: false
+ })
+ }
+
+ return items
},
selectItems() {
if (this.isSeries) return this.seriesItems
diff --git a/client/components/covers/AuthorImage.vue b/client/components/covers/AuthorImage.vue
index e320e552..084492b0 100644
--- a/client/components/covers/AuthorImage.vue
+++ b/client/components/covers/AuthorImage.vue
@@ -39,9 +39,6 @@ export default {
}
},
computed: {
- userToken() {
- return this.$store.getters['user/getToken']
- },
_author() {
return this.author || {}
},
diff --git a/client/components/modals/AccountModal.vue b/client/components/modals/AccountModal.vue
index 71ac8155..6f4b7b67 100644
--- a/client/components/modals/AccountModal.vue
+++ b/client/components/modals/AccountModal.vue
@@ -309,9 +309,9 @@ export default {
} else {
console.log('Account updated', data.user)
- if (data.user.id === this.user.id && data.user.token !== this.user.token) {
- console.log('Current user token was updated')
- this.$store.commit('user/setUserToken', data.user.token)
+ if (data.user.id === this.user.id && data.user.accessToken !== this.user.accessToken) {
+ console.log('Current user access token was updated')
+ this.$store.commit('user/setAccessToken', data.user.accessToken)
}
this.$toast.success(this.$strings.ToastAccountUpdateSuccess)
@@ -351,9 +351,6 @@ export default {
this.$toast.error(errMsg || 'Failed to create account')
})
},
- toggleActive() {
- this.newUser.isActive = !this.newUser.isActive
- },
userTypeUpdated(type) {
this.newUser.permissions = {
download: type !== 'guest',
diff --git a/client/components/modals/ApiKeyCreatedModal.vue b/client/components/modals/ApiKeyCreatedModal.vue
new file mode 100644
index 00000000..96442a17
--- /dev/null
+++ b/client/components/modals/ApiKeyCreatedModal.vue
@@ -0,0 +1,60 @@
+
+ {{ title }} {{ title }}
{{ episode.subtitle }}
-Published {{ episode.publishedAt ? $dateDistanceFromNow(episode.publishedAt) : 'Unknown' }}
+Published {{ episode.publishedAt ? $dateDistanceFromNow(episode.publishedAt) : 'Unknown' }}
+ +{{ $strings.LabelDuration }}: {{ $elapsedPretty(episode.durationSeconds) }}
+ +{{ $strings.LabelSize }}: {{ $bytesPretty(Number(episode.enclosure.length)) }}
+{{ $getString('MessageConfirmRemoveEpisodes', [episodes.length]) }}
-Note: This does not delete the audio file unless toggling "Hard delete file"
+{{ $strings.MessageConfirmRemoveEpisodeNote }}
{{ title }}
- +{{ $strings.MessageNoDescription }}
@@ -34,6 +34,12 @@ {{ audioFileSize }} +{{ $strings.LabelDuration }}
++ {{ audioFileDuration }} +
+{{ $strings.LabelName }} | +{{ $strings.LabelApiKeyUser }} | +{{ $strings.LabelExpiresAt }} | +{{ $strings.LabelCreatedAt }} | ++ |
---|---|---|---|---|
+
+
+ {{ apiKey.name }} + |
+
+ Error + |
+
+ {{ getExpiresAtText(apiKey) }} +{{ $strings.LabelExpiresNever }} + |
+
+ |
+
+
+
+
+
+
+
+
+
+ |
+
{{ $strings.LabelNoApiKeys }}
+{{ label }}
+{{ label }}
{{ $strings.MessageNoChapters }}
{{ $elapsedPretty(session.timeListening) }}
+{{ $elapsedPrettyLocalized(session.timeListening) }}
{{ $secondsToTimestamp(session.currentTime) }}
@@ -250,10 +250,10 @@ export default { return user?.username || null }, dateFormat() { - return this.$store.state.serverSettings.dateFormat + return this.$store.getters['getServerSetting']('dateFormat') }, timeFormat() { - return this.$store.state.serverSettings.timeFormat + return this.$store.getters['getServerSetting']('timeFormat') }, numSelected() { return this.listeningSessions.filter((s) => s.selected).length diff --git a/client/pages/config/users/_id/index.vue b/client/pages/config/users/_id/index.vue index e2f8e208..b48147d3 100644 --- a/client/pages/config/users/_id/index.vue +++ b/client/pages/config/users/_id/index.vue @@ -13,8 +13,8 @@{{ $elapsedPretty(session.timeListening) }}
+{{ $elapsedPrettyLocalized(session.timeListening) }}
{{ $secondsToTimestamp(session.currentTime) }}
@@ -98,10 +98,10 @@ export default { return this.$store.getters['users/getIsUserOnline'](this.user.id) }, dateFormat() { - return this.$store.state.serverSettings.dateFormat + return this.$store.getters['getServerSetting']('dateFormat') }, timeFormat() { - return this.$store.state.serverSettings.timeFormat + return this.$store.getters['getServerSetting']('timeFormat') } }, methods: { diff --git a/client/pages/item/_id/index.vue b/client/pages/item/_id/index.vue index 6042f92a..1d8f0f20 100644 --- a/client/pages/item/_id/index.vue +++ b/client/pages/item/_id/index.vue @@ -193,7 +193,7 @@ export default { return `${process.env.serverUrl}/api/items/${this.libraryItemId}/download?token=${this.userToken}` }, dateFormat() { - return this.$store.state.serverSettings.dateFormat + return this.$store.getters['getServerSetting']('dateFormat') }, userIsAdminOrUp() { return this.$store.getters['user/getIsAdminOrUp'] diff --git a/client/pages/library/_library/narrators.vue b/client/pages/library/_library/narrators.vue index 17160213..9e58bf14 100644 --- a/client/pages/library/_library/narrators.vue +++ b/client/pages/library/_library/narrators.vue @@ -10,7 +10,7 @@{{ narrator.name }}
+{{ error }}
+{{ $strings.MessageAuthenticationSecurityMessage }}
+ {{ $strings.LabelMoreInfo }} +