From a2c7d645445683cda3e8d683d69dcde4fde74f2a Mon Sep 17 00:00:00 2001 From: tagmeh Date: Wed, 6 Aug 2025 02:16:40 -0500 Subject: [PATCH 1/9] Working 1.0. Removed duplicate api calls per image. Attempted testing, removed, unable to figure out either testing option. --- client/components/covers/DisplayCover.vue | 113 +++++++++++++++++++ client/components/covers/SortedCovers.vue | 97 ++++++++++++++++ client/components/modals/item/tabs/Cover.vue | 86 ++++---------- 3 files changed, 229 insertions(+), 67 deletions(-) create mode 100644 client/components/covers/DisplayCover.vue create mode 100644 client/components/covers/SortedCovers.vue diff --git a/client/components/covers/DisplayCover.vue b/client/components/covers/DisplayCover.vue new file mode 100644 index 000000000..c7c721a5f --- /dev/null +++ b/client/components/covers/DisplayCover.vue @@ -0,0 +1,113 @@ +// Displays a book cover, given a cover image object with url, width, and height properties. +// It supports showing the cover in a specific aspect ratio, displaying resolution, +// and providing an option to open the cover in a new tab. +// This component exists in order to avoid a second api call per image. Since the images are being queried and sorted on a parent component (Cover.vue). + + + + diff --git a/client/components/covers/SortedCovers.vue b/client/components/covers/SortedCovers.vue new file mode 100644 index 000000000..4f75df7bb --- /dev/null +++ b/client/components/covers/SortedCovers.vue @@ -0,0 +1,97 @@ +// This component sorts and displays book covers based on their aspect ratio. +// It separates covers into primary (preferred aspect ratio) and secondary (opposite aspect ratio) sections. +// Covers are displayed with options to select, view resolution, and open in a new tab. + + + + + + diff --git a/client/components/modals/item/tabs/Cover.vue b/client/components/modals/item/tabs/Cover.vue index 3cbc63a7e..c0a1c2918 100644 --- a/client/components/modals/item/tabs/Cover.vue +++ b/client/components/modals/item/tabs/Cover.vue @@ -70,63 +70,9 @@ -
-

{{ $strings.MessageNoCoversFound }}

- - - - - +
+

{{ $strings.MessageNoCoversFound }}

+
@@ -391,26 +337,32 @@ export default { }) }, async resolveImages() { + console.log(this.coversFound) const resolvedImages = await Promise.all( this.coversFound.map((cover) => { return new Promise((resolve) => { const img = new Image() img.src = cover img.onload = () => { - resolve({ src: cover, width: img.width, height: img.height }) + resolve({ + url: cover, + width: img.width, + height: img.height + }) + } + img.onerror = () => { + // Resolve with default dimensions if image fails to load + resolve({ + url: cover, + width: 400, + height: 600 + }) } }) }) ) - // Sort images: squares first, then rectangles by area - this.sortedCovers = resolvedImages.sort((a, b) => { - // Prioritize square images (-1 for square, 1 for non-square) - const squareComparison = (b.width === b.height) - (a.width === a.height) - if (squareComparison !== 0) return squareComparison - - // Sub-sort by width (ascending order) - return a.width - b.width - }) + this.sortedCovers = resolvedImages + console.log('Resolved covers:', this.sortedCovers) return this.sortedCovers } } From fc655bc0e29cacabbf6f264d4b50a82969a3e170 Mon Sep 17 00:00:00 2001 From: tagmeh Date: Wed, 6 Aug 2025 02:19:14 -0500 Subject: [PATCH 2/9] Removed Cover.cy.js file. Wasn't able to figure out cypress testing. --- .../cypress/tests/components/modals/item/tabs/Cover.cy.js | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 client/cypress/tests/components/modals/item/tabs/Cover.cy.js diff --git a/client/cypress/tests/components/modals/item/tabs/Cover.cy.js b/client/cypress/tests/components/modals/item/tabs/Cover.cy.js deleted file mode 100644 index c6c29ff7e..000000000 --- a/client/cypress/tests/components/modals/item/tabs/Cover.cy.js +++ /dev/null @@ -1,8 +0,0 @@ -import Cover from '@/components/modals/item/tabs/Cover.vu' - -describe('Cover', () => { - it('should render', () => { - // Still working the tests out. - cy.mount(Cover) - }) -}) From faa0a833e2c254efc84780ac7933a07102569f9a Mon Sep 17 00:00:00 2001 From: tagmeh Date: Wed, 6 Aug 2025 02:20:26 -0500 Subject: [PATCH 3/9] Removed console logs. --- client/components/modals/item/tabs/Cover.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/components/modals/item/tabs/Cover.vue b/client/components/modals/item/tabs/Cover.vue index c0a1c2918..db0336a84 100644 --- a/client/components/modals/item/tabs/Cover.vue +++ b/client/components/modals/item/tabs/Cover.vue @@ -337,7 +337,6 @@ export default { }) }, async resolveImages() { - console.log(this.coversFound) const resolvedImages = await Promise.all( this.coversFound.map((cover) => { return new Promise((resolve) => { @@ -362,7 +361,6 @@ export default { }) ) this.sortedCovers = resolvedImages - console.log('Resolved covers:', this.sortedCovers) return this.sortedCovers } } From 43ca263eac95d63a57e7fb5ba83f6c7f52945cce Mon Sep 17 00:00:00 2001 From: tagmeh Date: Wed, 6 Aug 2025 18:14:35 -0500 Subject: [PATCH 4/9] Fixed rectangle book cover sub-sorting and conditional divider display. --- client/components/covers/SortedCovers.vue | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/client/components/covers/SortedCovers.vue b/client/components/covers/SortedCovers.vue index 4f75df7bb..9cb02fdb8 100644 --- a/client/components/covers/SortedCovers.vue +++ b/client/components/covers/SortedCovers.vue @@ -15,8 +15,8 @@
- -
+ +
@@ -57,9 +57,10 @@ export default { computed: { // Sort covers by dimension and size sortedCovers() { + // sort by height, then sub-sort by width return [...this.covers].sort((a, b) => { - // Sort by area (width * height) - return a.width * a.height - b.width * b.height + // Sort by height first, then by width + return a.height - b.height || a.width - b.width }) }, // Get square covers (width === height) @@ -77,6 +78,10 @@ export default { // Determine secondary covers (opposite of primary) secondaryCovers() { return this.bookCoverAspectRatio === 1 ? this.rectangleCovers : this.squareCovers + }, + // Check if we have both types of covers to show the divider + hasBothCoverTypes() { + return this.primaryCovers.length > 0 && this.secondaryCovers.length > 0 } } } From 794f0ef42a12f30d300c03662e82318266d301d7 Mon Sep 17 00:00:00 2001 From: advplyr Date: Thu, 7 Aug 2025 17:21:05 -0500 Subject: [PATCH 5/9] Fix server crash when transcode requests are made to the direct play endpoint #4555 --- server/controllers/SessionController.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/server/controllers/SessionController.js b/server/controllers/SessionController.js index ed662ee8d..872f635de 100644 --- a/server/controllers/SessionController.js +++ b/server/controllers/SessionController.js @@ -4,6 +4,7 @@ const Logger = require('../Logger') const Database = require('../Database') const { toNumber, isUUID } = require('../utils/index') const { getAudioMimeTypeFromExtname, encodeUriPath } = require('../utils/fileUtils') +const { PlayMethod } = require('../utils/constants') const ShareManager = require('../managers/ShareManager') @@ -299,6 +300,18 @@ class SessionController { return res.sendStatus(404) } + // Redirect transcode requests to the HLS router + // Handles bug introduced in android v0.10.0-beta where transcode requests are made to this endpoint + if (playbackSession.playMethod === PlayMethod.TRANSCODE && audioTrack.contentUrl) { + Logger.debug(`[SessionController] Redirecting transcode request to "${audioTrack.contentUrl}"`) + return res.redirect(audioTrack.contentUrl) + } + + if (!audioTrack.metadata?.path) { + Logger.error(`[SessionController] Invalid audio track "${audioTrack.index}" for session "${req.params.id}"`) + return res.sendStatus(500) + } + const user = await Database.userModel.getUserById(playbackSession.userId) Logger.debug(`[SessionController] Serving audio track ${audioTrack.index} for session "${req.params.id}" belonging to user "${user.username}"`) From 34c4e7b08457bfa53ca4d0e7bfe4429007a1ce7d Mon Sep 17 00:00:00 2001 From: tagmeh Date: Fri, 8 Aug 2025 00:38:27 -0500 Subject: [PATCH 6/9] Added cy-ids to divs for testing purposes. Added a basic test for Cover.vue, and actual logic tests for SortedCovers.vue. All tests are passing. --- client/components/covers/SortedCovers.vue | 6 +- client/components/modals/item/tabs/Cover.vue | 39 ++--- .../components/covers/SortedCovers.cy.js | 144 ++++++++++++++++++ .../components/modals/item/tab/Cover.cy.js | 131 ++++++++++++++++ 4 files changed, 298 insertions(+), 22 deletions(-) create mode 100644 client/cypress/tests/components/covers/SortedCovers.cy.js create mode 100644 client/cypress/tests/components/modals/item/tab/Cover.cy.js diff --git a/client/components/covers/SortedCovers.vue b/client/components/covers/SortedCovers.vue index 9cb02fdb8..edc84db34 100644 --- a/client/components/covers/SortedCovers.vue +++ b/client/components/covers/SortedCovers.vue @@ -5,7 +5,7 @@