diff --git a/client/components/app/SideRail.vue b/client/components/app/SideRail.vue index f67383bac..0fbe56787 100644 --- a/client/components/app/SideRail.vue +++ b/client/components/app/SideRail.vue @@ -63,7 +63,7 @@
- + connect_without_contact

Social

@@ -148,14 +148,15 @@ export default { filterBy() { return this.$store.getters['user/getUserSetting']('filterBy') }, + isGlobalSharing() { + return this.$store.getters['getServerSetting']('sharedListeningStats') + }, async socialTrue() { let listeningStats = await this.$axios.$get(`/api/social`).catch((err) => { console.error('Failed to load shared user listening sesions', err) return false }) - if (listeningStats != null) { - return true - } else {return false} + return listeningStats != null ? true : false }, showingIssues() { if (!this.$route.query) return false diff --git a/client/pages/account.vue b/client/pages/account.vue index cff547e50..5a52a80fa 100644 --- a/client/pages/account.vue +++ b/client/pages/account.vue @@ -15,7 +15,7 @@
-
+

@@ -25,7 +25,7 @@

-
+

Change Password

@@ -78,6 +78,9 @@ export default { }, isSharingActivity() { return this.$store.getters['user/getUserSetting']('shareListeningActivity') + }, + isGlobalSharing() { + return this.$store.getters['getServerSetting']('sharedListeningStats') } }, methods: { @@ -128,8 +131,6 @@ export default { }) }, changeSharingSetting() { - console.log('test') - console.log(String(!this.isSharingActivity)) this.$store.dispatch('user/updateUserSettings', { shareListeningActivity: !this.isSharingActivity }) } }, diff --git a/client/pages/config/index.vue b/client/pages/config/index.vue index 24d3d68d2..7e4b1b17f 100644 --- a/client/pages/config/index.vue +++ b/client/pages/config/index.vue @@ -48,6 +48,16 @@

Chromecast support

+
+ + +

+ Shared Listening Stats + info_outlined +

+
+
+

Display

@@ -268,7 +278,8 @@ export default { storeMetadataWithItem: 'By default metadata files are stored in /metadata/items, enabling this setting will store metadata files in your library item folders. Uses .abs file extension', coverAspectRatio: 'Prefer to use square covers over standard 1.6:1 book covers', enableEReader: 'E-reader is still a work in progress, but use this setting to open it up to all your users (or use the "Experimental Features" toggle just for use by you)', - scannerPreferOverdriveMediaMarker: 'MP3 files from Overdrive come with chapter timings embedded as custom metadata. Enabling this will use these tags for chapter timings automatically' + scannerPreferOverdriveMediaMarker: 'MP3 files from Overdrive come with chapter timings embedded as custom metadata. Enabling this will use these tags for chapter timings automatically', + shareStats: 'Allow users to share latest listening activity with other users on an opt-in basis' }, showConfirmPurgeCache: false } diff --git a/client/pages/social.vue b/client/pages/social.vue index 9baf91a72..85e54fae8 100644 --- a/client/pages/social.vue +++ b/client/pages/social.vue @@ -24,12 +24,10 @@

{{ user.username }} 

-
-

{{user.latest.lastUpdate != null ? "Last listened " + $dateDistanceFromNow(user.latest.lastUpdate) : "Never listened" }}

-
+

{{ "Last listened " + $dateDistanceFromNow(user.latest.lastUpdate) }}

-
-

{{ user.minutesListened > 0 ? "Has listened for " + $elapsedPrettyExtended(user.minutesListened) : "No listening time" }}

+
+

{{ "Has listened for " + $elapsedPrettyExtended(user.minutesListened) }}

@@ -64,7 +62,7 @@ export default { }, users() { if (!this.listeningStats) return [] - return this.listeningStats.filter(c => c.latest) + return this.listeningStats.sort(function(a, b) {return b.latest.lastUpdate - a.latest.lastUpdate}) }, userMediaProgress() { return this.user.mediaProgress || [] @@ -109,7 +107,6 @@ export default { }) } } - console.log('Loaded users shared listening data', listeningStats) this.listeningStats = listeningStats }, async getLibraryItem(user) { @@ -121,8 +118,6 @@ export default { }) }, changeSharingSetting() { - console.log('test') - console.log(String(!this.isSharingActivity)) this.$store.dispatch('user/updateUserSettings', { shareListeningActivity: !this.isSharingActivity }) this.init() } diff --git a/server/controllers/MiscController.js b/server/controllers/MiscController.js index e51e7d12b..adb211973 100644 --- a/server/controllers/MiscController.js +++ b/server/controllers/MiscController.js @@ -265,6 +265,10 @@ class MiscController { } // GET: api/social async getSocialStats(req, res) { + if (this.db.serverSettings.sharedListeningStats == false) { + return res.sendStatus(404) + } + Logger.error(this.db.serverSettings.sharedListeningStats) var filteredUsers = this.db.users.filter(c => c.settings.shareListeningActivity == true) var userData = [] for (let i = 0; i < filteredUsers.length; i++) { @@ -281,7 +285,9 @@ class MiscController { minutesListened: listeningStats.totalTime || 0, daysListened: totalDays| 0, } - userData.push(session) + if (session.minutesListened && session.latest) { + userData.push(session) + } } res.json(userData) } diff --git a/server/objects/settings/ServerSettings.js b/server/objects/settings/ServerSettings.js index 71c478282..d77f6622a 100644 --- a/server/objects/settings/ServerSettings.js +++ b/server/objects/settings/ServerSettings.js @@ -47,6 +47,7 @@ class ServerSettings { // Misc Flags this.chromecastEnabled = false + this.sharedListeningStats = false this.enableEReader = false this.dateFormat = 'MM/dd/yyyy' @@ -95,6 +96,7 @@ class ServerSettings { this.sortingIgnorePrefix = !!settings.sortingIgnorePrefix this.sortingPrefixes = settings.sortingPrefixes || ['the', 'a'] this.chromecastEnabled = !!settings.chromecastEnabled + this.sharedListeningStats = !!settings.sharedListeningStats this.enableEReader = !!settings.enableEReader this.dateFormat = settings.dateFormat || 'MM/dd/yyyy' this.logLevel = settings.logLevel || Logger.logLevel @@ -131,6 +133,7 @@ class ServerSettings { sortingIgnorePrefix: this.sortingIgnorePrefix, sortingPrefixes: [...this.sortingPrefixes], chromecastEnabled: this.chromecastEnabled, + sharedListeningStats: this.sharedListeningStats, enableEReader: this.enableEReader, dateFormat: this.dateFormat, logLevel: this.logLevel,