Преглед на файлове

feat: improved user station state: added SoundCloud play state, added unavailable state, don't count participating users in vote to skip users

Kristian Vos преди 1 година
родител
ревизия
38b8e178b7
променени са 4 файла, в които са добавени 41 реда и са изтрити 27 реда
  1. 4 1
      backend/logic/stations.js
  2. 3 2
      backend/logic/tasks.js
  3. 7 0
      frontend/src/pages/Station/Sidebar/Users.vue
  4. 27 24
      frontend/src/pages/Station/index.vue

+ 4 - 1
backend/logic/stations.js

@@ -938,7 +938,10 @@ class _StationsModule extends CoreClass {
 								WSModule.runJob("SOCKET_FROM_SOCKET_ID", { socketId }, this)
 									.then(socket => {
 										if (socket && socket.session && socket.session.userId) {
-											if (!users.includes(socket.session.userId))
+											if (
+												!users.includes(socket.session.userId) &&
+												socket.session.stationState !== "participate"
+											)
 												users.push(socket.session.userId);
 										}
 										return next();

+ 3 - 2
backend/logic/tasks.js

@@ -22,8 +22,9 @@ const stationStateWorth = {
 	participate: 3,
 	local_paused: 4,
 	muted: 5,
-	buffering: 6,
-	playing: 7
+	unavailable: 6,
+	buffering: 7,
+	playing: 8
 };
 
 class _TasksModule extends CoreClass {

+ 7 - 0
frontend/src/pages/Station/Sidebar/Users.vue

@@ -287,6 +287,13 @@ onMounted(() => {
 										content="Listening to music"
 										>play_arrow</i
 									>
+									<i
+										class="material-icons"
+										v-if="user.state === 'unavailable'"
+										v-tippy
+										content="Unavailable"
+										>warning</i
+									>
 									<i
 										class="material-icons"
 										v-if="user.state === 'buffering'"

+ 27 - 24
frontend/src/pages/Station/index.vue

@@ -67,6 +67,7 @@ const {
 	soundcloudPause,
 	soundcloudSetVolume,
 	soundcloudGetPosition,
+	soundcloudGetTrackState,
 	soundcloudBindListener,
 	soundcloudOnTrackStateChange,
 	soundcloudDestroy,
@@ -176,23 +177,6 @@ const currentUserQueueSongs = computed(
 		).length
 );
 
-const stationState = computed(() => {
-	if (noSong.value) return "no_song";
-	if (stationPaused.value) return "station_paused";
-	if (
-		experimentalChangableListenModeEnabled.value &&
-		experimentalChangableListenMode.value === "participate"
-	)
-		return "participate";
-	if (localPaused.value || autoPaused.value) return "local_paused";
-	if (volumeSliderValue.value === 0 || muted.value) return "muted";
-	if (youtubePlayerReady.value && youtubePlayerState.value === "PLAYING")
-		return "playing";
-	if (youtubePlayerReady.value && youtubePlayerState.value === "BUFFERING")
-		return "buffering";
-	return "unknown";
-});
-
 const currentSongMediaType = computed(() => {
 	if (
 		!currentSong.value ||
@@ -221,6 +205,29 @@ const currentYoutubeId = computed(() => {
 	return currentSong.value.mediaSource.split(":")[1];
 });
 
+const stationState = computed(() => {
+	if (noSong.value) return "no_song";
+	if (stationPaused.value) return "station_paused";
+	if (
+		experimentalChangableListenModeEnabled.value &&
+		experimentalChangableListenMode.value === "participate"
+	)
+		return "participate";
+	if (localPaused.value) return "local_paused";
+	if (volumeSliderValue.value === 0 || muted.value) return "muted";
+	if (currentSongMediaType.value === "youtube" && youtubePlayerReady.value) {
+		if (youtubePlayerState.value === "PLAYING") return "playing";
+		if (youtubePlayerState.value === "BUFFERING") return "buffering";
+	}
+	if (
+		currentSongMediaType.value === "soundcloud" &&
+		soundcloudGetTrackState() === "playing"
+	)
+		return "playing";
+	if (autoPaused.value) return "unavailable";
+	return "unknown";
+});
+
 const {
 	joinStation,
 	leaveStation,
@@ -623,8 +630,6 @@ const playerStop = () => {
 		youtubePlayer.value.stopVideo();
 	}
 
-	autoPaused.value = false;
-
 	soundcloudDestroy();
 };
 const toggleSkipVote = (message?) => {
@@ -650,7 +655,7 @@ const autoSkipVote = () => {
 	// persistent message while song is playing
 	const persistentToast = new Toast({
 		content:
-			"This song is unavailable for you, but is playing for everyone else.",
+			"This song is unavailable for you, but may be working fine for everyone else.",
 		persistent: true
 	});
 
@@ -684,7 +689,6 @@ const resumeLocalPlayer = () => {
 };
 const resumeLocalStation = () => {
 	updateLocalPaused(false);
-	autoPaused.value = false;
 	if (!stationPaused.value) resumeLocalPlayer();
 };
 const pauseLocalPlayer = () => {
@@ -746,11 +750,12 @@ const youtubeReady = () => {
 				onError: err => {
 					console.log("error with youtube video", err);
 
-					if (err.data === 150 && loggedIn.value) autoSkipVote();
+					if (err.data >= 100 && loggedIn.value) autoSkipVote();
 					else
 						new Toast(
 							"There has been an error with the YouTube Embed"
 						);
+
 					autoPaused.value = true;
 				},
 				onStateChange: event => {
@@ -1170,8 +1175,6 @@ const experimentalChangableListenModeChange = newMode => {
 			youtubePlayerState.value = null;
 		}
 
-		autoPaused.value = false;
-
 		soundcloudDestroy();
 	} else {
 		// Recreate the YouTube player