diff --git a/build/linuxpackager b/build/linuxpackager
index a43d4ed1..5f03a2e8 100755
--- a/build/linuxpackager
+++ b/build/linuxpackager
@@ -50,9 +50,8 @@ echo "$controlfile" > dist/debian/DEBIAN/control;
# Package debian
pkg -t node18-linux-x64 -o dist/debian/usr/share/audiobookshelf/audiobookshelf .
-fakeroot dpkg-deb --build dist/debian
+fakeroot dpkg-deb -Zxz --build dist/debian
mv dist/debian.deb "dist/$OUTPUT_FILE"
-chmod +x "dist/$OUTPUT_FILE"
echo "Finished! Filename: $OUTPUT_FILE"
diff --git a/client/assets/app.css b/client/assets/app.css
index 1a83dc1c..2e0714f9 100644
--- a/client/assets/app.css
+++ b/client/assets/app.css
@@ -217,36 +217,6 @@ Bookshelf Label
filter: blur(20px);
}
-
-.episode-subtitle {
- word-break: break-word;
- overflow: hidden;
- text-overflow: ellipsis;
- display: -webkit-box;
- line-height: 16px;
- /* fallback */
- max-height: 32px;
- /* fallback */
- -webkit-line-clamp: 2;
- /* number of lines to show */
- -webkit-box-orient: vertical;
-}
-
-.episode-subtitle-long {
- word-break: break-word;
- overflow: hidden;
- text-overflow: ellipsis;
- display: -webkit-box;
- line-height: 16px;
- /* fallback */
- max-height: 72px;
- /* fallback */
- -webkit-line-clamp: 6;
- /* number of lines to show */
- -webkit-box-orient: vertical;
-}
-
-
/* Padding for toastification toasts in the top right to not cover appbar/toolbar */
.app-bar-and-toolbar .Vue-Toastification__container.top-right {
padding-top: 104px;
diff --git a/client/components/app/StreamContainer.vue b/client/components/app/MediaPlayerContainer.vue
similarity index 95%
rename from client/components/app/StreamContainer.vue
rename to client/components/app/MediaPlayerContainer.vue
index 0cae1421..120231dc 100644
--- a/client/components/app/StreamContainer.vue
+++ b/client/components/app/MediaPlayerContainer.vue
@@ -1,5 +1,5 @@
-
+
diff --git a/client/components/app/SettingsContent.vue b/client/components/app/SettingsContent.vue
index c78873e3..ec129ebc 100644
--- a/client/components/app/SettingsContent.vue
+++ b/client/components/app/SettingsContent.vue
@@ -1,6 +1,7 @@
+
{{ headerText }}
diff --git a/client/components/controls/GlobalSearch.vue b/client/components/controls/GlobalSearch.vue
index 0c5ba41b..9716ba49 100644
--- a/client/components/controls/GlobalSearch.vue
+++ b/client/components/controls/GlobalSearch.vue
@@ -1,13 +1,15 @@
-
-
-
-
search
-
close
+
+
-
+
-
+
Max new episodes to download per check
@@ -129,9 +129,12 @@ export default {
return
}
}
- if (this.$refs.maxEpisodesInput && this.$refs.maxEpisodesInput.isFocused) {
+
+ if (this.$refs.maxEpisodesInput?.isFocused) {
this.$refs.maxEpisodesInput.blur()
- return
+ }
+ if (this.$refs.maxEpisodesToDownloadInput?.isFocused) {
+ this.$refs.maxEpisodesToDownloadInput.blur()
}
const updatePayload = {
@@ -140,9 +143,11 @@ export default {
if (this.enableAutoDownloadEpisodes) {
updatePayload.autoDownloadSchedule = this.cronExpression
}
+ this.newMaxEpisodesToKeep = Number(this.newMaxEpisodesToKeep)
if (this.newMaxEpisodesToKeep !== this.maxEpisodesToKeep) {
updatePayload.maxEpisodesToKeep = this.newMaxEpisodesToKeep
}
+ this.newMaxNewEpisodesToDownload = Number(this.newMaxNewEpisodesToDownload)
if (this.newMaxNewEpisodesToDownload !== this.maxNewEpisodesToDownload) {
updatePayload.maxNewEpisodesToDownload = this.newMaxNewEpisodesToDownload
}
diff --git a/client/components/modals/libraries/LibrarySettings.vue b/client/components/modals/libraries/LibrarySettings.vue
index 53eb2650..4712d6a2 100644
--- a/client/components/modals/libraries/LibrarySettings.vue
+++ b/client/components/modals/libraries/LibrarySettings.vue
@@ -49,6 +49,9 @@
+
+
+
@@ -69,7 +72,8 @@ export default {
skipMatchingMediaWithAsin: false,
skipMatchingMediaWithIsbn: false,
audiobooksOnly: false,
- hideSingleBookSeries: false
+ hideSingleBookSeries: false,
+ podcastSearchRegion: 'us'
}
},
computed: {
@@ -85,6 +89,9 @@ export default {
isBookLibrary() {
return this.mediaType === 'book'
},
+ isPodcastLibrary() {
+ return this.mediaType === 'podcast'
+ },
providers() {
if (this.mediaType === 'podcast') return this.$store.state.scanners.podcastProviders
return this.$store.state.scanners.providers
@@ -99,7 +106,8 @@ export default {
skipMatchingMediaWithAsin: !!this.skipMatchingMediaWithAsin,
skipMatchingMediaWithIsbn: !!this.skipMatchingMediaWithIsbn,
audiobooksOnly: !!this.audiobooksOnly,
- hideSingleBookSeries: !!this.hideSingleBookSeries
+ hideSingleBookSeries: !!this.hideSingleBookSeries,
+ podcastSearchRegion: this.podcastSearchRegion
}
}
},
@@ -113,6 +121,7 @@ export default {
this.skipMatchingMediaWithIsbn = !!this.librarySettings.skipMatchingMediaWithIsbn
this.audiobooksOnly = !!this.librarySettings.audiobooksOnly
this.hideSingleBookSeries = !!this.librarySettings.hideSingleBookSeries
+ this.podcastSearchRegion = this.librarySettings.podcastSearchRegion || 'us'
}
},
mounted() {
diff --git a/client/components/modals/podcast/EpisodeFeed.vue b/client/components/modals/podcast/EpisodeFeed.vue
index b5d98a25..8e4c1826 100644
--- a/client/components/modals/podcast/EpisodeFeed.vue
+++ b/client/components/modals/podcast/EpisodeFeed.vue
@@ -33,7 +33,7 @@
{{ episode.title }}
-
{{ episode.subtitle }}
+
{{ episode.subtitle }}
Published {{ episode.publishedAt ? $dateDistanceFromNow(episode.publishedAt) : 'Unknown' }}
diff --git a/client/components/modals/podcast/tabs/EpisodeMatch.vue b/client/components/modals/podcast/tabs/EpisodeMatch.vue
index 0603a9a8..640ec547 100644
--- a/client/components/modals/podcast/tabs/EpisodeMatch.vue
+++ b/client/components/modals/podcast/tabs/EpisodeMatch.vue
@@ -18,7 +18,7 @@
#{{ episode.episode }}
{{ episode.title }}
-
{{ episode.subtitle }}
+
{{ episode.subtitle }}
Published {{ episode.publishedAt ? $dateDistanceFromNow(episode.publishedAt) : 'Unknown' }}
diff --git a/client/components/player/PlayerPlaybackControls.vue b/client/components/player/PlayerPlaybackControls.vue
index a66e40d6..91bc3be3 100644
--- a/client/components/player/PlayerPlaybackControls.vue
+++ b/client/components/player/PlayerPlaybackControls.vue
@@ -2,21 +2,21 @@
-
+
-
+
+
-
+
+
-
+
+
-
+
+
+
diff --git a/client/components/player/PlayerTrackBar.vue b/client/components/player/PlayerTrackBar.vue
index 2f832785..3afc5d06 100644
--- a/client/components/player/PlayerTrackBar.vue
+++ b/client/components/player/PlayerTrackBar.vue
@@ -57,7 +57,6 @@ export default {
},
watch: {
duration: {
- immediate: true,
handler() {
this.setChapterTicks()
}
@@ -205,10 +204,14 @@ export default {
},
windowResize() {
this.setTrackWidth()
+ this.setChapterTicks()
+ this.updatePlayedTrackWidth()
+ this.updateBufferTrack()
}
},
mounted() {
this.setTrackWidth()
+ this.setChapterTicks()
window.addEventListener('resize', this.windowResize)
},
beforeDestroy() {
diff --git a/client/components/player/PlayerUi.vue b/client/components/player/PlayerUi.vue
index e1b0f96d..8d26dd99 100644
--- a/client/components/player/PlayerUi.vue
+++ b/client/components/player/PlayerUi.vue
@@ -9,37 +9,37 @@
-
+
+
-
+
+
-
+
+
-
-
+
timelapse
-
+
diff --git a/client/components/stats/YearInReviewBanner.vue b/client/components/stats/YearInReviewBanner.vue
index f7736078..993443b5 100644
--- a/client/components/stats/YearInReviewBanner.vue
+++ b/client/components/stats/YearInReviewBanner.vue
@@ -7,9 +7,10 @@
-
{{ yearInReviewYear }} Year in Review
+
{{ $getString('HeaderYearReview', [yearInReviewYear]) }}
-
{{ showYearInReview ? 'Hide Year in Review' : 'See Year in Review' }}
+
{{ showYearInReview ? $strings.LabelYearReviewHide :
+ $strings.LabelYearReviewShow }}
@@ -20,24 +21,27 @@
chevron_left
- Previous
+ {{ $strings.ButtonPrevious }}
- Share
+ {{
+ $strings.ButtonShare }}
+
- Your Year in Review ({{ yearInReviewVariant + 1 }})
+ {{ $getString('LabelPersonalYearReview', [yearInReviewVariant + 1]) }}
+
{{ yearInReviewVariant + 1 }}
- Refresh
+ {{ $strings.ButtonRefresh }}
refresh
- Next
+ {{ $strings.ButtonNext }}
chevron_right
@@ -46,7 +50,7 @@
- Share
+ {{ $strings.ButtonShare }}
@@ -56,24 +60,25 @@
chevron_left
- Previous
+ {{ $strings.ButtonPrevious }}
- Share
+ {{ $strings.ButtonShare }}
+
- Server Year in Review ({{ yearInReviewServerVariant + 1 }})
+ {{ $getString('LabelServerYearReview', [yearInReviewServerVariant + 1]) }}
{{ yearInReviewServerVariant + 1 }}
- Refresh
+ {{ $strings.ButtonRefresh }}
refresh
- Next
+ {{ $strings.ButtonNext }}
chevron_right
diff --git a/client/components/tables/CustomMetadataProviderTable.vue b/client/components/tables/CustomMetadataProviderTable.vue
new file mode 100644
index 00000000..13414471
--- /dev/null
+++ b/client/components/tables/CustomMetadataProviderTable.vue
@@ -0,0 +1,127 @@
+
+
+
+
+ {{ $strings.LabelName }} |
+ URL |
+ Authorization Header Value |
+ |
+
+
+ {{ provider.name }} |
+ {{ provider.url }} |
+
+ {{ provider.authHeaderValue }}
+ |
+
+
+ delete
+
+ |
+
+
+
+
No custom metadata providers
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/components/tables/podcast/LazyEpisodeRow.vue b/client/components/tables/podcast/LazyEpisodeRow.vue
index fecf7758..18576340 100644
--- a/client/components/tables/podcast/LazyEpisodeRow.vue
+++ b/client/components/tables/podcast/LazyEpisodeRow.vue
@@ -7,8 +7,8 @@
-
-
+
diff --git a/client/components/ui/MultiSelect.vue b/client/components/ui/MultiSelect.vue
index 2009b28d..3644f4ab 100644
--- a/client/components/ui/MultiSelect.vue
+++ b/client/components/ui/MultiSelect.vue
@@ -11,7 +11,7 @@
{{ item }}
-
+
@@ -110,15 +110,6 @@ export default {
this.typingTimeout = setTimeout(() => {
this.currentSearch = this.textInput
}, 100)
- this.setInputWidth()
- },
- setInputWidth() {
- setTimeout(() => {
- var value = this.$refs.input.value
- var len = value.length * 7 + 24
- this.$refs.input.style.width = len + 'px'
- this.recalcMenuPos()
- }, 50)
},
recalcMenuPos() {
if (!this.menu || !this.$refs.inputWrapper) return
diff --git a/client/components/ui/MultiSelectQueryInput.vue b/client/components/ui/MultiSelectQueryInput.vue
index c86d3228..54de7584 100644
--- a/client/components/ui/MultiSelectQueryInput.vue
+++ b/client/components/ui/MultiSelectQueryInput.vue
@@ -14,7 +14,7 @@
add
-
+
@@ -127,15 +127,6 @@ export default {
this.typingTimeout = setTimeout(() => {
this.search()
}, 250)
- this.setInputWidth()
- },
- setInputWidth() {
- setTimeout(() => {
- var value = this.$refs.input.value
- var len = value.length * 7 + 24
- this.$refs.input.style.width = len + 'px'
- this.recalcMenuPos()
- }, 50)
},
recalcMenuPos() {
if (!this.menu || !this.$refs.inputWrapper) return
diff --git a/client/layouts/default.vue b/client/layouts/default.vue
index c3cc3484..6d5e0230 100644
--- a/client/layouts/default.vue
+++ b/client/layouts/default.vue
@@ -7,7 +7,7 @@
-
+
@@ -129,23 +129,23 @@ export default {
this.$eventBus.$emit('socket_init')
},
streamOpen(stream) {
- if (this.$refs.streamContainer) this.$refs.streamContainer.streamOpen(stream)
+ if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.streamOpen(stream)
},
streamClosed(streamId) {
- if (this.$refs.streamContainer) this.$refs.streamContainer.streamClosed(streamId)
+ if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.streamClosed(streamId)
},
streamProgress(data) {
- if (this.$refs.streamContainer) this.$refs.streamContainer.streamProgress(data)
+ if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.streamProgress(data)
},
streamReady() {
- if (this.$refs.streamContainer) this.$refs.streamContainer.streamReady()
+ if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.streamReady()
},
streamReset(payload) {
- if (this.$refs.streamContainer) this.$refs.streamContainer.streamReset(payload)
+ if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.streamReset(payload)
},
streamError({ id, errorMessage }) {
this.$toast.error(`Stream Failed: ${errorMessage}`)
- if (this.$refs.streamContainer) this.$refs.streamContainer.streamError(id)
+ if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.streamError(id)
},
libraryAdded(library) {
this.$store.commit('libraries/addUpdate', library)
@@ -247,7 +247,7 @@ export default {
this.multiSessionCurrentSessionId = null
this.$toast.dismiss('multiple-sessions')
}
- if (this.$refs.streamContainer) this.$refs.streamContainer.sessionClosedEvent(sessionId)
+ if (this.$refs.mediaPlayerContainer) this.$refs.mediaPlayerContainer.sessionClosedEvent(sessionId)
},
userMediaProgressUpdate(payload) {
this.$store.commit('user/updateMediaProgress', payload)
@@ -328,6 +328,14 @@ export default {
this.$store.commit('libraries/setEReaderDevices', data.ereaderDevices)
},
+ customMetadataProviderAdded(provider) {
+ if (!provider?.id) return
+ this.$store.commit('scanners/addCustomMetadataProvider', provider)
+ },
+ customMetadataProviderRemoved(provider) {
+ if (!provider?.id) return
+ this.$store.commit('scanners/removeCustomMetadataProvider', provider)
+ },
initializeSocket() {
this.socket = this.$nuxtSocket({
name: process.env.NODE_ENV === 'development' ? 'dev' : 'prod',
@@ -406,6 +414,10 @@ export default {
this.socket.on('batch_quickmatch_complete', this.batchQuickMatchComplete)
this.socket.on('admin_message', this.adminMessageEvt)
+
+ // Custom metadata provider Listeners
+ this.socket.on('custom_metadata_provider_added', this.customMetadataProviderAdded)
+ this.socket.on('custom_metadata_provider_removed', this.customMetadataProviderRemoved)
},
showUpdateToast(versionData) {
var ignoreVersion = localStorage.getItem('ignoreVersion')
diff --git a/client/nuxt.config.js b/client/nuxt.config.js
index 1736e3f6..6a347c23 100644
--- a/client/nuxt.config.js
+++ b/client/nuxt.config.js
@@ -29,7 +29,8 @@ module.exports = {
],
script: [],
link: [
- { rel: 'icon', type: 'image/x-icon', href: (process.env.ROUTER_BASE_PATH || '') + '/favicon.ico' }
+ { rel: 'icon', type: 'image/x-icon', href: (process.env.ROUTER_BASE_PATH || '') + '/favicon.ico' },
+ { rel: 'apple-touch-icon', href: (process.env.ROUTER_BASE_PATH || '') + '/ios_icon.png' }
]
},
@@ -95,7 +96,7 @@ module.exports = {
meta: {
appleStatusBarStyle: 'black',
name: 'Audiobookshelf',
- theme_color: '#373838',
+ theme_color: '#232323',
mobileAppIOS: true,
nativeUI: true
},
@@ -103,7 +104,7 @@ module.exports = {
name: 'Audiobookshelf',
short_name: 'Audiobookshelf',
display: 'standalone',
- background_color: '#373838',
+ background_color: '#232323',
icons: [
{
src: (process.env.ROUTER_BASE_PATH || '') + '/icon.svg',
diff --git a/client/package-lock.json b/client/package-lock.json
index b13fe9ee..a15762dc 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "audiobookshelf-client",
- "version": "2.7.2",
+ "version": "2.8.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "audiobookshelf-client",
- "version": "2.7.2",
+ "version": "2.8.0",
"license": "ISC",
"dependencies": {
"@nuxtjs/axios": "^5.13.6",
@@ -16976,4 +16976,4 @@
}
}
}
-}
+}
\ No newline at end of file
diff --git a/client/package.json b/client/package.json
index 6a852b03..d9f11c99 100644
--- a/client/package.json
+++ b/client/package.json
@@ -1,6 +1,6 @@
{
"name": "audiobookshelf-client",
- "version": "2.7.2",
+ "version": "2.8.0",
"buildNumber": 1,
"description": "Self-hosted audiobook and podcast client",
"main": "index.js",
@@ -36,4 +36,4 @@
"postcss": "^8.3.6",
"tailwindcss": "^3.4.1"
}
-}
+}
\ No newline at end of file
diff --git a/client/pages/account.vue b/client/pages/account.vue
index 4bb68727..f531a34d 100644
--- a/client/pages/account.vue
+++ b/client/pages/account.vue
@@ -82,19 +82,33 @@ export default {
this.$setLanguageCode(lang)
},
logout() {
- var rootSocket = this.$root.socket || {}
- const logoutPayload = {
- socketId: rootSocket.id
+ // Disconnect from socket
+ if (this.$root.socket) {
+ console.log('Disconnecting from socket', this.$root.socket.id)
+ this.$root.socket.removeAllListeners()
+ this.$root.socket.disconnect()
}
- this.$axios.$post('/logout', logoutPayload).catch((error) => {
- console.error(error)
- })
+
if (localStorage.getItem('token')) {
localStorage.removeItem('token')
}
this.$store.commit('libraries/setUserPlaylists', [])
this.$store.commit('libraries/setCollections', [])
- this.$router.push('/login')
+
+ this.$axios
+ .$post('/logout')
+ .then((logoutPayload) => {
+ const redirect_url = logoutPayload.redirect_url
+
+ if (redirect_url) {
+ window.location.href = redirect_url
+ } else {
+ this.$router.push('/login')
+ }
+ })
+ .catch((error) => {
+ console.error(error)
+ })
},
resetForm() {
this.password = null
diff --git a/client/pages/audiobook/_id/chapters.vue b/client/pages/audiobook/_id/chapters.vue
index cf48ab64..0f5db77a 100644
--- a/client/pages/audiobook/_id/chapters.vue
+++ b/client/pages/audiobook/_id/chapters.vue
@@ -142,7 +142,7 @@
-
+
{{ $strings.ButtonSearch }}
diff --git a/client/pages/author/_id.vue b/client/pages/author/_id.vue
index 5ef1bef2..4e72f061 100644
--- a/client/pages/author/_id.vue
+++ b/client/pages/author/_id.vue
@@ -17,7 +17,10 @@
{{ $strings.LabelDescription }}
- {{ author.description }}
+ {{ author.description }}
+
+ {{ showFullDescription ? 'Read less' : 'Read more' }} {{ showFullDescription ? 'expand_less' : 'expand_more' }}
+
@@ -62,7 +65,10 @@ export default {
}
},
data() {
- return {}
+ return {
+ isDescriptionClamped: false,
+ showFullDescription: false
+ }
},
computed: {
streamLibraryItem() {
@@ -82,6 +88,10 @@ export default {
}
},
methods: {
+ checkDescriptionClamped() {
+ if (!this.$refs.description) return
+ this.isDescriptionClamped = this.$refs.description.scrollHeight > this.$refs.description.clientHeight
+ },
editAuthor() {
this.$store.commit('globals/showEditAuthorModal', this.author)
},
@@ -93,6 +103,7 @@ export default {
series: this.authorSeries,
libraryItems: this.libraryItems
}
+ this.$nextTick(this.checkDescriptionClamped)
}
},
authorRemoved(author) {
@@ -104,6 +115,7 @@ export default {
},
mounted() {
if (!this.author) this.$router.replace('/')
+ this.checkDescriptionClamped()
this.$root.socket.on('author_updated', this.authorUpdated)
this.$root.socket.on('author_removed', this.authorRemoved)
@@ -113,4 +125,19 @@ export default {
this.$root.socket.off('author_removed', this.authorRemoved)
}
}
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/client/pages/batch/index.vue b/client/pages/batch/index.vue
index 15675fb8..e1687f0f 100644
--- a/client/pages/batch/index.vue
+++ b/client/pages/batch/index.vue
@@ -20,44 +20,44 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
{{ $strings.ButtonApply }}
@@ -139,7 +153,8 @@ export default {
narrators: [],
publisher: null,
language: null,
- explicit: false
+ explicit: false,
+ abridged: false
},
selectedBatchUsage: {
subtitle: false,
@@ -151,7 +166,8 @@ export default {
narrators: false,
publisher: false,
language: false,
- explicit: false
+ explicit: false,
+ abridged: false
},
appendableKeys: ['authors', 'genres', 'tags', 'narrators', 'series'],
openMapOptions: false
diff --git a/client/pages/config/authentication.vue b/client/pages/config/authentication.vue
index 199701b4..3373e287 100644
--- a/client/pages/config/authentication.vue
+++ b/client/pages/config/authentication.vue
@@ -206,7 +206,7 @@ export default {
function isValidRedirectURI(uri) {
// Check for somestring://someother/string
- const pattern = new RegExp('^\\w+://[\\w\\.-]+$', 'i')
+ const pattern = new RegExp('^\\w+://[\\w\\.-]+(/[\\w\\./-]*)*$', 'i')
return pattern.test(uri)
}
diff --git a/client/pages/config/item-metadata-utils/custom-metadata-providers.vue b/client/pages/config/item-metadata-utils/custom-metadata-providers.vue
new file mode 100644
index 00000000..dfaabca0
--- /dev/null
+++ b/client/pages/config/item-metadata-utils/custom-metadata-providers.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
+ arrow_back
+
+
+
+
+
+ help_outline
+
+
+
+
+ {{ $strings.ButtonAdd }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/client/pages/config/item-metadata-utils/index.vue b/client/pages/config/item-metadata-utils/index.vue
index 3a12261b..7d0ba068 100644
--- a/client/pages/config/item-metadata-utils/index.vue
+++ b/client/pages/config/item-metadata-utils/index.vue
@@ -13,6 +13,12 @@
arrow_forward
+
+
+
{{ $strings.HeaderCustomMetadataProviders }}
+
arrow_forward
+
+
diff --git a/client/pages/config/log.vue b/client/pages/config/log.vue
index a5939852..756261b7 100644
--- a/client/pages/config/log.vue
+++ b/client/pages/config/log.vue
@@ -8,7 +8,7 @@
-
+
{{ log.timestamp }}
@@ -136,7 +136,15 @@ export default {
this.loadedLogs = this.loadedLogs.slice(-5000)
}
},
- init(attempts = 0) {
+ async loadLoggerData() {
+ const loggerData = await this.$axios.$get('/api/logger-data').catch((error) => {
+ console.error('Failed to load logger data', error)
+ this.$toast.error('Failed to load logger data')
+ })
+
+ this.loadedLogs = loggerData?.currentDailyLogs || []
+ },
+ async init(attempts = 0) {
if (!this.$root.socket) {
if (attempts > 10) {
return console.error('Failed to setup socket listeners')
@@ -147,14 +155,11 @@ export default {
return
}
+ await this.loadLoggerData()
+
this.newServerSettings = this.serverSettings ? { ...this.serverSettings } : {}
- this.$root.socket.on('daily_logs', this.dailyLogsLoaded)
this.$root.socket.on('log', this.logEvtReceived)
this.$root.socket.emit('set_log_listener', this.newServerSettings.logLevel)
- this.$root.socket.emit('fetch_daily_logs')
- },
- dailyLogsLoaded(lines) {
- this.loadedLogs = lines
}
},
updated() {
@@ -166,13 +171,15 @@ export default {
beforeDestroy() {
if (!this.$root.socket) return
this.$root.socket.emit('remove_log_listener')
- this.$root.socket.off('daily_logs', this.dailyLogsLoaded)
this.$root.socket.off('log', this.logEvtReceived)
}
}
\ No newline at end of file
diff --git a/client/pages/library/_library/podcast/latest.vue b/client/pages/library/_library/podcast/latest.vue
index 8d95203f..3fc47dfd 100644
--- a/client/pages/library/_library/podcast/latest.vue
+++ b/client/pages/library/_library/podcast/latest.vue
@@ -8,11 +8,11 @@
{{ $strings.MessageNoEpisodes }}
-
+
-
+
@@ -45,7 +45,7 @@
-
+
diff --git a/client/pages/library/_library/podcast/search.vue b/client/pages/library/_library/podcast/search.vue
index 3be851ce..4ca3fe7d 100644
--- a/client/pages/library/_library/podcast/search.vue
+++ b/client/pages/library/_library/podcast/search.vue
@@ -86,6 +86,9 @@ export default {
},
streamLibraryItem() {
return this.$store.state.streamLibraryItem
+ },
+ librarySettings() {
+ return this.$store.getters['libraries/getCurrentLibrarySettings']
}
},
methods: {
@@ -151,7 +154,12 @@ export default {
async submitSearch(term) {
this.processing = true
this.termSearched = ''
- let results = await this.$axios.$get(`/api/search/podcast?term=${encodeURIComponent(term)}`).catch((error) => {
+
+ const searchParams = new URLSearchParams({
+ term,
+ country: this.librarySettings?.podcastSearchRegion || 'us'
+ })
+ let results = await this.$axios.$get(`/api/search/podcast?${searchParams.toString()}`).catch((error) => {
console.error('Search request failed', error)
return []
})
diff --git a/client/pages/login.vue b/client/pages/login.vue
index c7efa0d0..9b7758d8 100644
--- a/client/pages/login.vue
+++ b/client/pages/login.vue
@@ -10,9 +10,9 @@