diff --git a/client/components/modals/libraries/LibrarySettings.vue b/client/components/modals/libraries/LibrarySettings.vue index d3b40de9..67a52c9e 100644 --- a/client/components/modals/libraries/LibrarySettings.vue +++ b/client/components/modals/libraries/LibrarySettings.vue @@ -72,6 +72,17 @@ +
+
+ + +

+ {{ $strings.LabelListenAgainOrdered }} + info +

+
+
+
@@ -115,7 +126,8 @@ export default { onlyShowLaterBooksInContinueSeries: false, podcastSearchRegion: 'us', markAsFinishedWhen: 'timeRemaining', - markAsFinishedValue: 10 + markAsFinishedValue: 10, + listenAgainOrdered: false } }, computed: { @@ -177,7 +189,8 @@ export default { onlyShowLaterBooksInContinueSeries: !!this.onlyShowLaterBooksInContinueSeries, podcastSearchRegion: this.podcastSearchRegion, markAsFinishedTimeRemaining: markAsFinishedTimeRemaining, - markAsFinishedPercentComplete: markAsFinishedPercentComplete + markAsFinishedPercentComplete: markAsFinishedPercentComplete, + listenAgainOrdered: !!this.listenAgainOrdered } } }, @@ -199,6 +212,7 @@ export default { this.markAsFinishedWhen = 'timeRemaining' } this.markAsFinishedValue = this.librarySettings.markAsFinishedTimeRemaining || this.librarySettings.markAsFinishedPercentComplete || 10 + this.listenAgainOrdered = !!this.librarySettings.listenAgainOrdered } }, mounted() { diff --git a/client/strings/en-us.json b/client/strings/en-us.json index 2bf70b53..f0ffe533 100644 --- a/client/strings/en-us.json +++ b/client/strings/en-us.json @@ -419,6 +419,8 @@ "LabelLimit": "Limit", "LabelLineSpacing": "Line spacing", "LabelListenAgain": "Listen Again", + "LabelListenAgainOrdered": "Sort listen again by finish date", + "LabelListenAgainOrderedHelp": "If enabled, the listen again section in the shelf view will be sorted by the finish date instead of random order.", "LabelLogLevelDebug": "Debug", "LabelLogLevelInfo": "Info", "LabelLogLevelWarn": "Warn", diff --git a/server/models/Library.js b/server/models/Library.js index 708880aa..a7027da3 100644 --- a/server/models/Library.js +++ b/server/models/Library.js @@ -14,6 +14,7 @@ const Logger = require('../Logger') * @property {string[]} metadataPrecedence * @property {number} markAsFinishedTimeRemaining Time remaining in seconds to mark as finished. (defaults to 10s) * @property {number} markAsFinishedPercentComplete Percent complete to mark as finished (0-100). If this is set it will be used over markAsFinishedTimeRemaining. + * @property {boolean} listenAgainOrdered Order listen again items by progress or random */ class Library extends Model { @@ -61,7 +62,8 @@ class Library extends Model { autoScanCronExpression: null, podcastSearchRegion: 'us', markAsFinishedPercentComplete: null, - markAsFinishedTimeRemaining: 10 + markAsFinishedTimeRemaining: 10, + listenAgainOrdered: false } } else { return { @@ -76,7 +78,8 @@ class Library extends Model { onlyShowLaterBooksInContinueSeries: false, metadataPrecedence: this.defaultMetadataPrecedence, markAsFinishedPercentComplete: null, - markAsFinishedTimeRemaining: 10 + markAsFinishedTimeRemaining: 10, + listenAgainOrdered: false } } } diff --git a/server/utils/queries/libraryFilters.js b/server/utils/queries/libraryFilters.js index 7312b9d5..734204f0 100644 --- a/server/utils/queries/libraryFilters.js +++ b/server/utils/queries/libraryFilters.js @@ -163,8 +163,9 @@ module.exports = { * @returns {Promise<{ items:oldLibraryItem[], count:number }>} */ async getMediaFinished(library, user, include, limit) { + const sortBy = library.settings.listenAgainOrdered ? 'progress' : 'random' if (library.isBook) { - const { libraryItems, count } = await libraryItemsBookFilters.getFilteredLibraryItems(library.id, user, 'progress', 'finished', 'progress', true, false, include, limit, 0) + const { libraryItems, count } = await libraryItemsBookFilters.getFilteredLibraryItems(library.id, user, 'progress', 'finished', sortBy, true, false, include, limit, 0) return { items: libraryItems.map((li) => { const oldLibraryItem = li.toOldJSONMinified() @@ -179,7 +180,7 @@ module.exports = { count } } else { - const { libraryItems, count } = await libraryItemsPodcastFilters.getFilteredPodcastEpisodes(library.id, user, 'progress', 'finished', 'progress', true, limit, 0) + const { libraryItems, count } = await libraryItemsPodcastFilters.getFilteredPodcastEpisodes(library.id, user, 'progress', 'finished', sortBy, true, limit, 0) return { count, items: libraryItems.map((li) => {