Browse Source

feat: added options to disallow autorequesting recently played songs

Kristian Vos 1 year ago
parent
commit
6f8e77f4ae

+ 1 - 1
backend/logic/actions/stations.js

@@ -1035,7 +1035,7 @@ export default {
 					const response = await StationsModule.stationHistoryModel
 						.find({ stationId }, { documentVersion: 0, __v: 0 })
 						.sort({ "payload.skippedAt": -1 })
-						.limit(50);
+						.limit(250);
 
 					return response;
 				}

+ 2 - 0
backend/logic/db/schemas/station.js

@@ -46,6 +46,8 @@ export default {
 		limit: { type: Number, min: 1, max: 50, default: 5 },
 		allowAutorequest: { type: Boolean, default: true, required: true },
 		autorequestLimit: { type: Number, min: 1, max: 50, default: 3, required: true },
+		autorequestDisallowRecentlyPlayedEnabled: { type: Boolean, default: true, required: true },
+		autorequestDisallowRecentlyPlayedNumber: { type: Number, min: 1, max: 250, default: 50, required: true }
 	},
 	autofill: {
 		enabled: { type: Boolean, default: true },

+ 53 - 1
frontend/src/components/modals/ManageStation/Settings.vue

@@ -66,6 +66,10 @@ const { inputs, save, setOriginalValue } = useForm(
 		requestsLimit: station.value.requests.limit,
 		requestsAllowAutorequest: station.value.requests.allowAutorequest,
 		requestsAutorequestLimit: station.value.requests.autorequestLimit,
+		requestsAutorequestDisallowRecentlyPlayedEnabled:
+			station.value.requests.autorequestDisallowRecentlyPlayedEnabled,
+		requestsAutorequestDisallowRecentlyPlayedNumber:
+			station.value.requests.autorequestDisallowRecentlyPlayedNumber,
 		autofillEnabled: station.value.autofill.enabled,
 		autofillLimit: station.value.autofill.limit,
 		autofillMode: station.value.autofill.mode
@@ -87,7 +91,11 @@ const { inputs, save, setOriginalValue } = useForm(
 					access: values.requestsAccess,
 					limit: values.requestsLimit,
 					allowAutorequest: values.requestsAllowAutorequest,
-					autorequestLimit: values.requestsAutorequestLimit
+					autorequestLimit: values.requestsAutorequestLimit,
+					autorequestDisallowRecentlyPlayedEnabled:
+						values.requestsAutorequestDisallowRecentlyPlayedEnabled,
+					autorequestDisallowRecentlyPlayedNumber:
+						values.requestsAutorequestDisallowRecentlyPlayedNumber
 				},
 				autofill: {
 					...oldStation.autofill,
@@ -133,6 +141,10 @@ watch(station, value => {
 		requestsLimit: value.requests.limit,
 		requestsAllowAutorequest: value.requests.allowAutorequest,
 		requestsAutorequestLimit: value.requests.autorequestLimit,
+		requestsAutorequestDisallowRecentlyPlayedEnabled:
+			value.requests.autorequestDisallowRecentlyPlayedEnabled,
+		requestsAutorequestDisallowRecentlyPlayedNumber:
+			value.requests.autorequestDisallowRecentlyPlayedNumber,
 		autofillEnabled: value.autofill.enabled,
 		autofillLimit: value.autofill.limit,
 		autofillMode: value.autofill.mode
@@ -303,6 +315,46 @@ watch(station, value => {
 						/>
 					</div>
 				</div>
+
+				<div
+					v-if="inputs['requestsEnabled'].value"
+					class="small-section"
+				>
+					<label class="label">Autorequest disallow recent</label>
+					<p class="is-expanded checkbox-control">
+						<label class="switch">
+							<input
+								type="checkbox"
+								v-model="
+									inputs[
+										'requestsAutorequestDisallowRecentlyPlayedEnabled'
+									].value
+								"
+							/>
+							<span class="slider round"></span>
+						</label>
+					</p>
+				</div>
+
+				<div
+					v-if="inputs['requestsEnabled'].value"
+					class="small-section"
+				>
+					<label class="label">Autorequest disallow recent #</label>
+					<div class="control is-expanded">
+						<input
+							class="input"
+							type="number"
+							min="1"
+							max="250"
+							v-model="
+								inputs[
+									'requestsAutorequestDisallowRecentlyPlayedNumber'
+								].value
+							"
+						/>
+					</div>
+				</div>
 			</div>
 
 			<div

+ 28 - 5
frontend/src/pages/Station/index.vue

@@ -120,7 +120,8 @@ const {
 	localPaused,
 	noSong,
 	autoRequest,
-	autoRequestLock
+	autoRequestLock,
+	history
 } = storeToRefs(stationStore);
 
 const skipVotesLoaded = computed(
@@ -184,6 +185,16 @@ const {
 // const stopVideo = payload =>
 // 	store.dispatch("modals/editSong/stopVideo", payload);
 
+const recentlyPlayedYoutubeIds = (max: number) => {
+	const youtubeIds = new Set();
+
+	history.value.forEach((historyItem, index) => {
+		if (index < max) youtubeIds.add(historyItem.payload.song.youtubeId);
+	});
+
+	return Array.from(youtubeIds);
+};
+
 const updateMediaSessionData = song => {
 	if (song) {
 		ms.setMediaSessionData(
@@ -198,8 +209,13 @@ const updateMediaSessionData = song => {
 	} else ms.removeMediaSessionData(0);
 };
 const autoRequestSong = () => {
-	const { limit, allowAutorequest, autorequestLimit } =
-		station.value.requests;
+	const {
+		limit,
+		allowAutorequest,
+		autorequestLimit,
+		autorequestDisallowRecentlyPlayedEnabled,
+		autorequestDisallowRecentlyPlayedNumber
+	} = station.value.requests;
 
 	if (autoRequestLock.value) return;
 	if (!allowAutorequest) return;
@@ -211,11 +227,19 @@ const autoRequestSong = () => {
 	if (currentUserQueueSongs.value >= autorequestLimit) return;
 	if (songsList.value.length >= 50) return;
 
+	let excludedYoutubeIds = [];
+	if (autorequestDisallowRecentlyPlayedEnabled) {
+		excludedYoutubeIds = recentlyPlayedYoutubeIds(
+			autorequestDisallowRecentlyPlayedNumber
+		);
+	}
+
 	const uniqueYoutubeIds = new Set();
 
 	autoRequest.value.forEach(playlist => {
 		playlist.songs.forEach(song => {
-			uniqueYoutubeIds.add(song.youtubeId);
+			if (excludedYoutubeIds.indexOf(song.youtubeId) === -1)
+				uniqueYoutubeIds.add(song.youtubeId);
 		});
 	});
 
@@ -1467,7 +1491,6 @@ onMounted(async () => {
 	});
 
 	socket.on("event:station.history.new", res => {
-		console.log(1111, res.data.historyItem);
 		addHistoryItem(res.data.historyItem);
 	});