refactor: Update player seek functionality to use consistent position field across schemas and services
All checks were successful
Backend CI / test (push) Successful in 4m5s

This commit is contained in:
JSC
2025-07-31 21:33:00 +02:00
parent 3405d817d5
commit e69098d633
5 changed files with 25 additions and 26 deletions

View File

@@ -137,10 +137,10 @@ async def seek(
"""Seek to specific position in current track.""" """Seek to specific position in current track."""
try: try:
player = get_player_service() player = get_player_service()
await player.seek(request.position_ms) await player.seek(request.position)
return MessageResponse(message=f"Seeked to position {request.position_ms}ms") return MessageResponse(message=f"Seeked to position {request.position}ms")
except Exception as e: except Exception as e:
logger.exception("Error seeking to position %s", request.position_ms) logger.exception("Error seeking to position %s", request.position)
raise HTTPException( raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to seek", detail="Failed to seek",

View File

@@ -10,7 +10,7 @@ from app.services.player import PlayerMode
class PlayerSeekRequest(BaseModel): class PlayerSeekRequest(BaseModel):
"""Request model for seek operation.""" """Request model for seek operation."""
position_ms: int = Field(ge=0, description="Position in milliseconds") position: int = Field(ge=0, description="Position in milliseconds")
class PlayerVolumeRequest(BaseModel): class PlayerVolumeRequest(BaseModel):
@@ -35,8 +35,8 @@ class PlayerStateResponse(BaseModel):
playlist: dict[str, Any] | None = Field( playlist: dict[str, Any] | None = Field(
None, description="Current playlist information" None, description="Current playlist information"
) )
position_ms: int = Field(description="Current position in milliseconds") position: int = Field(description="Current position in milliseconds")
duration_ms: int | None = Field( duration: int | None = Field(
None, description="Total duration in milliseconds", None, description="Total duration in milliseconds",
) )
volume: int = Field(description="Current volume (0-100)") volume: int = Field(description="Current volume (0-100)")

View File

@@ -64,8 +64,8 @@ class PlayerState:
"status": self.status.value, "status": self.status.value,
"mode": self.mode.value, "mode": self.mode.value,
"volume": self.volume, "volume": self.volume,
"position_ms": self.current_sound_position or 0, "position": self.current_sound_position or 0,
"duration_ms": self.current_sound_duration, "duration": self.current_sound_duration,
"index": self.current_sound_index, "index": self.current_sound_index,
"current_sound": self._serialize_sound(self.current_sound), "current_sound": self._serialize_sound(self.current_sound),
"playlist": { "playlist": {

View File

@@ -278,17 +278,17 @@ class TestPlayerEndpoints:
mock_player_service, mock_player_service,
): ):
"""Test seeking to position successfully.""" """Test seeking to position successfully."""
position_ms = 5000 position = 5000
response = await authenticated_client.post( response = await authenticated_client.post(
"/api/v1/player/seek", "/api/v1/player/seek",
json={"position_ms": position_ms}, json={"position": position},
) )
assert response.status_code == 200 assert response.status_code == 200
data = response.json() data = response.json()
assert data["message"] == f"Seeked to position {position_ms}ms" assert data["message"] == f"Seeked to position {position}ms"
mock_player_service.seek.assert_called_once_with(position_ms) mock_player_service.seek.assert_called_once_with(position)
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_seek_invalid_position( async def test_seek_invalid_position(
@@ -300,7 +300,7 @@ class TestPlayerEndpoints:
"""Test seeking with invalid position.""" """Test seeking with invalid position."""
response = await authenticated_client.post( response = await authenticated_client.post(
"/api/v1/player/seek", "/api/v1/player/seek",
json={"position_ms": -1000}, # Negative position json={"position": -1000}, # Negative position
) )
assert response.status_code == 422 # Validation error assert response.status_code == 422 # Validation error
@@ -310,7 +310,7 @@ class TestPlayerEndpoints:
"""Test seeking without authentication.""" """Test seeking without authentication."""
response = await client.post( response = await client.post(
"/api/v1/player/seek", "/api/v1/player/seek",
json={"position_ms": 5000}, json={"position": 5000},
) )
assert response.status_code == 401 assert response.status_code == 401
@@ -326,7 +326,7 @@ class TestPlayerEndpoints:
response = await authenticated_client.post( response = await authenticated_client.post(
"/api/v1/player/seek", "/api/v1/player/seek",
json={"position_ms": 5000}, json={"position": 5000},
) )
assert response.status_code == 500 assert response.status_code == 500
@@ -516,8 +516,8 @@ class TestPlayerEndpoints:
"status": PlayerStatus.PLAYING.value, "status": PlayerStatus.PLAYING.value,
"mode": PlayerMode.CONTINUOUS.value, "mode": PlayerMode.CONTINUOUS.value,
"volume": 50, "volume": 50,
"position_ms": 5000, "position": 5000,
"duration_ms": 30000, "duration": 30000,
"index": 0, "index": 0,
"current_sound": { "current_sound": {
"id": 1, "id": 1,
@@ -625,7 +625,7 @@ class TestPlayerEndpoints:
"""Test seeking to position zero.""" """Test seeking to position zero."""
response = await authenticated_client.post( response = await authenticated_client.post(
"/api/v1/player/seek", "/api/v1/player/seek",
json={"position_ms": 0}, json={"position": 0},
) )
assert response.status_code == 200 assert response.status_code == 200

View File

@@ -65,14 +65,13 @@ class TestPlayerState:
assert result["status"] == "playing" assert result["status"] == "playing"
assert result["mode"] == "loop" assert result["mode"] == "loop"
assert result["volume"] == 75 assert result["volume"] == 75
assert result["current_sound_id"] == 1 assert result["position"] == 5000
assert result["current_sound_index"] == 0 assert result["duration"] == 30000
assert result["current_sound_position"] == 5000 assert result["index"] == 0
assert result["current_sound_duration"] == 30000 assert result["playlist"]["id"] == 1
assert result["playlist_id"] == 1 assert result["playlist"]["name"] == "Test Playlist"
assert result["playlist_name"] == "Test Playlist" assert result["playlist"]["length"] == 5
assert result["playlist_length"] == 5 assert result["playlist"]["duration"] == 150000
assert result["playlist_duration"] == 150000
def test_serialize_sound_with_sound_object(self): def test_serialize_sound_with_sound_object(self):
"""Test serializing a sound object.""" """Test serializing a sound object."""