From fd0af6b2dddce3f951f5a27da8e9568baaaeb59c Mon Sep 17 00:00:00 2001 From: Jaffar Ashoor Date: Sun, 23 Mar 2025 02:59:40 +0300 Subject: [PATCH 001/305] Reduce final docker image size this adds a third stage to the build, copying the required files only from the previos stages, this reduces the final image size from 600MB+ down to ~320MB --- Dockerfile | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4e110a61..3eea9cd5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,12 @@ ### STAGE 0: Build client ### -FROM node:20-alpine AS build +FROM node:20-alpine AS build-client WORKDIR /client COPY /client /client RUN npm ci && npm cache clean --force RUN npm run generate ### STAGE 1: Build server ### -FROM node:20-alpine +FROM node:20-alpine AS build-server ENV NODE_ENV=production @@ -21,9 +21,9 @@ RUN apk update && \ tini \ unzip -COPY --from=build /client/dist /client/dist -COPY index.js package* / -COPY server server +WORKDIR /server +COPY index.js package* /server +COPY /server /server/server ARG TARGETPLATFORM @@ -42,7 +42,20 @@ RUN case "$TARGETPLATFORM" in \ RUN npm ci --only=production -RUN apk del make python3 g++ +### STAGE 2: Create minimal runtime image ### +FROM node:20-alpine + +# Install only runtime dependencies +RUN apk add --no-cache \ + tzdata \ + ffmpeg \ + tini + +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 EXPOSE 80 From 13fac2d5bcf58c7a2225b7ff7adde9ff1318f459 Mon Sep 17 00:00:00 2001 From: Balki Date: Tue, 18 Mar 2025 18:20:05 +0000 Subject: [PATCH 002/305] Support http server listening on unix socket --- server/Server.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/server/Server.js b/server/Server.js index c3e73aec..fde5343e 100644 --- a/server/Server.js +++ b/server/Server.js @@ -395,10 +395,19 @@ class Server { }) router.get('/healthcheck', (req, res) => res.sendStatus(200)) - this.server.listen(this.Port, this.Host, () => { - if (this.Host) Logger.info(`Listening on http://${this.Host}:${this.Port}`) - else Logger.info(`Listening on port :${this.Port}`) - }) + const unixSocketPrefix = "unix/" + if(this.Host.startsWith(unixSocketPrefix)) { + const sockPath = this.Host.slice(unixSocketPrefix.length) + this.server.listen(sockPath, () => { + fs.chmodSync(sockPath, 0o666) + Logger.info(`Listening on unix socket ${sockPath}`) + }) + } else { + this.server.listen(this.Port, this.Host, () => { + if (this.Host) Logger.info(`Listening on http://${this.Host}:${this.Port}`) + else Logger.info(`Listening on port :${this.Port}`) + }) + } // Start listening for socket connections SocketAuthority.initialize(this) From a2dc76e1902c8664dcfb836a1a13ef5aed38d5ea Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Sun, 27 Apr 2025 19:21:37 +0200 Subject: [PATCH 003/305] remove brading --- client/pages/audiobook/_id/chapters.vue | 51 +++++++++++++++++++++---- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/client/pages/audiobook/_id/chapters.vue b/client/pages/audiobook/_id/chapters.vue index 55f74b5c..659e4e58 100644 --- a/client/pages/audiobook/_id/chapters.vue +++ b/client/pages/audiobook/_id/chapters.vue @@ -144,18 +144,20 @@
- - - {{ $strings.ButtonSearch }} + + + {{ $strings.ButtonSearch }} +
+
+
-

{{ asinError }}

{{ $strings.MessageAsinCheck }}

- - +
+
@@ -261,6 +263,7 @@ export default { showFindChaptersModal: false, chapterData: null, asinError: null, + removeBranding: false, showSecondInputs: false, audibleRegions: ['US', 'CA', 'UK', 'AU', 'FR', 'DE', 'JP', 'IT', 'IN', 'ES'], hasChanges: false @@ -322,6 +325,9 @@ export default { this.checkChapters() }, + toggleRemoveBranding() { + this.removeBranding = !this.removeBranding; + }, shiftChapterTimes() { if (!this.shiftAmount || isNaN(this.shiftAmount) || this.newChapters.length <= 1) { return @@ -568,7 +574,7 @@ export default { this.asinError = this.$getString(data.stringKey) } else { console.log('Chapter data', data) - this.chapterData = data + this.chapterData = this.removeBranding ? this.removeBrandingFromData(data) : data } }) .catch((error) => { @@ -578,6 +584,37 @@ export default { this.showFindChaptersModal = false }) }, + removeBrandingFromData(data) { + if (!data) return data + try { + const introDuration = data.brandIntroDurationMs + const outroDuration = data.brandOutroDurationMs + + for (let i = 0; i < data.chapters.length; i++) { + const chapter = data.chapters[i] + if (chapter.startOffsetMs < introDuration) { + // This should never happen, as the intro is not longer than the first chapter + // If this happens set to the next second + // Will be 0 for the first chapter anayways + chapter.startOffsetMs = i * 1000 + chapter.startOffsetSec = i + } else { + chapter.startOffsetMs -= introDuration + chapter.startOffsetSec = Math.floor(chapter.startOffsetMs / 1000) + } + } + + const lastChapter = data.chapters[data.chapters.length - 1] + // If there is an outro that's in the outro duration, remove it + if (lastChapter && lastChapter.lengthMs <= outroDuration) { + data.chapters.pop() + } + + } catch { + return data + } + return data + }, resetChapters() { const payload = { message: this.$strings.MessageResetChaptersConfirm, From 38957d4f323cceaad92d1751fe2116f426e763f7 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Sun, 27 Apr 2025 19:34:12 +0200 Subject: [PATCH 004/305] fix shift times not works when editing --- client/pages/audiobook/_id/chapters.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/pages/audiobook/_id/chapters.vue b/client/pages/audiobook/_id/chapters.vue index 659e4e58..94602e8d 100644 --- a/client/pages/audiobook/_id/chapters.vue +++ b/client/pages/audiobook/_id/chapters.vue @@ -341,8 +341,8 @@ export default { return } - if (this.newChapters[0].end + amount <= 0) { - this.$toast.error('Invalid shift amount. First chapter would have zero or negative length.') + if (this.newChapters[1].start + amount <= 0) { + this.$toast.error('Invalid shift amount. The first chapter would have zero or negative length and would be overwritten by the second chapter. Increase the start duration of second chapter. ') return } From 65aec6a0993f39481b958e02a81d5382f3d76184 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Sun, 27 Apr 2025 19:44:28 +0200 Subject: [PATCH 005/305] Adds locale --- client/pages/audiobook/_id/chapters.vue | 6 +++--- client/strings/en-us.json | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/client/pages/audiobook/_id/chapters.vue b/client/pages/audiobook/_id/chapters.vue index 94602e8d..3c6fe476 100644 --- a/client/pages/audiobook/_id/chapters.vue +++ b/client/pages/audiobook/_id/chapters.vue @@ -149,7 +149,7 @@ {{ $strings.ButtonSearch }}
- +

{{ asinError }}

@@ -337,12 +337,12 @@ export default { const lastChapter = this.newChapters[this.newChapters.length - 1] if (lastChapter.start + amount > this.mediaDurationRounded) { - this.$toast.error('Invalid shift amount. Last chapter start time would extend beyond the duration of this audiobook.') + this.$toast.error($strings.ToastInvalidShiftAmountLast) return } if (this.newChapters[1].start + amount <= 0) { - this.$toast.error('Invalid shift amount. The first chapter would have zero or negative length and would be overwritten by the second chapter. Increase the start duration of second chapter. ') + this.$toast.error($strings.ToastInvalidShiftAmountStart) return } diff --git a/client/strings/en-us.json b/client/strings/en-us.json index 2bf70b53..101ee161 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -530,6 +530,7 @@ "LabelReleaseDate": "Release Date", "LabelRemoveAllMetadataAbs": "Remove all metadata.abs files", "LabelRemoveAllMetadataJson": "Remove all metadata.json files", + "LabelRemoveAudibleBranding": "Remove Audible intro and outro from chapters", "LabelRemoveCover": "Remove cover", "LabelRemoveMetadataFile": "Remove metadata files in library item folders", "LabelRemoveMetadataFileHelp": "Remove all metadata.json and metadata.abs files in your {0} folders.", @@ -998,6 +999,8 @@ "ToastFailedToUpdate": "Failed to update", "ToastInvalidImageUrl": "Invalid image URL", "ToastInvalidMaxEpisodesToDownload": "Invalid max episodes to download", + "ToastInvalidShiftAmountLast": "Invalid shift amount. The last chapter start time would extend beyond the duration of this audiobook.", + "ToastInvalidShiftAmountStart": "Invalid shift amount. The first chapter would have zero or negative length and would be overwritten by the second chapter. Increase the start duration of second chapter.", "ToastInvalidUrl": "Invalid URL", "ToastItemCoverUpdateSuccess": "Item cover updated", "ToastItemDeletedFailed": "Failed to delete item", From a1074e69ac2addcfbb4ab3696587326fb2f20285 Mon Sep 17 00:00:00 2001 From: Vito0912 <86927734+Vito0912@users.noreply.github.com> Date: Sun, 27 Apr 2025 19:51:56 +0200 Subject: [PATCH 006/305] Fixed crash --- client/pages/audiobook/_id/chapters.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/pages/audiobook/_id/chapters.vue b/client/pages/audiobook/_id/chapters.vue index 3c6fe476..085b1584 100644 --- a/client/pages/audiobook/_id/chapters.vue +++ b/client/pages/audiobook/_id/chapters.vue @@ -337,12 +337,12 @@ export default { const lastChapter = this.newChapters[this.newChapters.length - 1] if (lastChapter.start + amount > this.mediaDurationRounded) { - this.$toast.error($strings.ToastInvalidShiftAmountLast) + this.$toast.error(this.$strings.ToastInvalidShiftAmountLast) return } if (this.newChapters[1].start + amount <= 0) { - this.$toast.error($strings.ToastInvalidShiftAmountStart) + this.$toast.error(this.$strings.ToastInvalidShiftAmountStart) return } From 5eaf9c69ad71342444211c24029140a997d55439 Mon Sep 17 00:00:00 2001 From: advplyr Date: Mon, 28 Apr 2025 16:40:06 -0500 Subject: [PATCH 007/305] Fix server crash when updating excluded prefixes #4221 --- server/controllers/MiscController.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/controllers/MiscController.js b/server/controllers/MiscController.js index 06cd4d84..0e5ad141 100644 --- a/server/controllers/MiscController.js +++ b/server/controllers/MiscController.js @@ -222,7 +222,7 @@ class MiscController { // Update nameIgnorePrefix column on series const allSeries = await Database.seriesModel.findAll({ - attributes: ['id', 'name', 'nameIgnorePrefix'] + attributes: ['id', 'name', 'nameIgnorePrefix', 'libraryId'] }) const bulkUpdateSeries = [] allSeries.forEach((series) => { @@ -230,6 +230,8 @@ class MiscController { if (nameIgnorePrefix !== series.nameIgnorePrefix) { bulkUpdateSeries.push({ id: series.id, + name: series.name, + libraryId: series.libraryId, nameIgnorePrefix }) } From 58cd751b43733ac4c53a2eb546224fd9d2ccd595 Mon Sep 17 00:00:00 2001 From: Josh Vincent Date: Mon, 28 Apr 2025 21:00:22 -0600 Subject: [PATCH 008/305] Improves Year in Review display logic --- client/components/stats/YearInReviewBanner.vue | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/components/stats/YearInReviewBanner.vue b/client/components/stats/YearInReviewBanner.vue index e3677538..62776bc6 100644 --- a/client/components/stats/YearInReviewBanner.vue +++ b/client/components/stats/YearInReviewBanner.vue @@ -164,14 +164,15 @@ export default { beforeMount() { this.yearInReviewYear = new Date().getFullYear() - // When not December show previous year - if (new Date().getMonth() < 11) { + this.availableYears = this.getAvailableYears() + const availableYearValues = this.availableYears.map((y) => y.value) + + // When not December show previous year if data is available + if (new Date().getMonth() < 11 && availableYearValues.includes(this.yearInReviewYear - 1)) { this.yearInReviewYear-- } }, mounted() { - this.availableYears = this.getAvailableYears() - if (typeof navigator.share !== 'undefined' && navigator.share) { this.showShareButton = true } else { From 6819c0b108c1830abbb590631b12fdf9d4e34c07 Mon Sep 17 00:00:00 2001 From: advplyr Date: Tue, 29 Apr 2025 17:46:54 -0500 Subject: [PATCH 009/305] Fix player track tooltip overflowing on share player --- client/components/player/PlayerTrackBar.vue | 7 +++++++ client/pages/share/_slug.vue | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/client/components/player/PlayerTrackBar.vue b/client/components/player/PlayerTrackBar.vue index cc581e25..6c96a6bf 100644 --- a/client/components/player/PlayerTrackBar.vue +++ b/client/components/player/PlayerTrackBar.vue @@ -74,6 +74,9 @@ export default { currentChapterStart() { if (!this.currentChapter) return 0 return this.currentChapter.start + }, + isMobile() { + return this.$store.state.globals.isMobile } }, methods: { @@ -145,6 +148,9 @@ export default { }) }, mousemoveTrack(e) { + if (this.isMobile) { + return + } const offsetX = e.offsetX const baseTime = this.useChapterTrack ? this.currentChapterStart : 0 @@ -198,6 +204,7 @@ export default { setTrackWidth() { if (this.$refs.track) { this.trackWidth = this.$refs.track.clientWidth + this.trackOffsetLeft = this.$refs.track.getBoundingClientRect().left } else { console.error('Track not loaded', this.$refs) } diff --git a/client/pages/share/_slug.vue b/client/pages/share/_slug.vue index bcc779d9..64c09963 100644 --- a/client/pages/share/_slug.vue +++ b/client/pages/share/_slug.vue @@ -1,5 +1,5 @@
-
+
{{ $strings.LabelChapterTitle }}
{{ $strings.LabelStart }}
@@ -146,19 +146,29 @@
#
{{ $strings.LabelFilename }}
+ + +
{{ $strings.LabelSize }}