artemis-model 0.1.114__py3-none-any.whl → 0.1.116__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,16 +6,19 @@ from artemis_model.base import AuditMixin, TimeStampMixin, CustomSyncBase, Custo
6
6
 
7
7
 
8
8
  class BannedTracksMixin(TimeStampMixin, AuditMixin):
9
- """Banned Tracks per Zone Model"""
9
+ """Banned Tracks per Zone Model"""
10
+
10
11
  zone_id: Mapped[int] = mapped_column(Integer, primary_key=True)
11
12
  track_id: Mapped[UUID] = mapped_column(UUID(as_uuid=True), primary_key=True)
12
13
 
13
14
 
14
15
  class BannedTracksSync(CustomSyncBase, BannedTracksMixin):
15
16
  """Banned Tracks per Zone Model"""
17
+
16
18
  pass
17
19
 
18
20
 
19
21
  class BannedTracks(CustomBase, BannedTracksMixin):
20
22
  """Banned Tracks per Zone Model"""
23
+
21
24
  pass
@@ -1,25 +1,16 @@
1
1
  """Redis track buckets"""
2
- import json
2
+
3
3
  from pydantic import BaseModel, Field, ConfigDict
4
4
  from typing import Annotated
5
5
  from datetime import datetime, timezone
6
6
  import uuid
7
7
 
8
8
 
9
- TrackId = Annotated[
10
- uuid.UUID,
11
- Field(description="Track ID (UUID)")
12
- ]
9
+ TrackId = Annotated[uuid.UUID, Field(description="Track ID (UUID)")]
13
10
 
14
- PlaylistId = Annotated[
15
- int,
16
- Field(description="Playlist ID (integer)")
17
- ]
11
+ PlaylistId = Annotated[int, Field(description="Playlist ID (integer)")]
18
12
 
19
- Timestamp = Annotated[
20
- int,
21
- Field(description="Unix timestamp")
22
- ]
13
+ Timestamp = Annotated[int, Field(description="Unix timestamp")]
23
14
 
24
15
 
25
16
  class RedisTrackBucketItem(BaseModel):
@@ -34,10 +25,7 @@ class RedisTrackBucketItem(BaseModel):
34
25
  playlist_id: PlaylistId
35
26
  ts: Timestamp = Field(default_factory=lambda: int(datetime.now(timezone.utc).timestamp()))
36
27
 
37
- model_config = ConfigDict(
38
- json_encoders={uuid.UUID: str},
39
- populate_by_name=True
40
- )
28
+ model_config = ConfigDict(json_encoders={uuid.UUID: str}, populate_by_name=True)
41
29
 
42
30
  def as_redis_entry(self) -> dict[str, int]:
43
31
  """
@@ -46,8 +34,7 @@ class RedisTrackBucketItem(BaseModel):
46
34
  """
47
35
  key = self.model_dump_json(include={"track_id", "playlist_id"})
48
36
  return {key: self.ts}
49
-
50
-
37
+
51
38
  @classmethod
52
39
  def from_redis_entry(cls, entry: dict[str, int]) -> "RedisTrackBucketItem":
53
40
  """
@@ -58,5 +45,6 @@ class RedisTrackBucketItem(BaseModel):
58
45
 
59
46
  class RedisTrackBucketItemValue(BaseModel):
60
47
  """JSON string format for Redis keys: '{"track_id": "...", "playlist_id": ...}'"""
48
+
61
49
  track_id: TrackId
62
50
  playlist_id: PlaylistId
@@ -5,15 +5,9 @@ from typing import Annotated
5
5
  from datetime import datetime, timezone
6
6
 
7
7
 
8
- TrackId = Annotated[
9
- str,
10
- Field(description="Track ID (UUID or string)")
11
- ]
8
+ TrackId = Annotated[str, Field(description="Track ID (UUID or string)")]
12
9
 
13
- Timestamp = Annotated[
14
- int,
15
- Field(description="Unix timestamp")
16
- ]
10
+ Timestamp = Annotated[int, Field(description="Unix timestamp")]
17
11
 
18
12
 
19
13
  class RedisTrackPlayHistoryItem(BaseModel):
@@ -21,6 +15,7 @@ class RedisTrackPlayHistoryItem(BaseModel):
21
15
  Represents the value stored in Redis sorted set:
22
16
  A string like "track_id#timestamp"
23
17
  """
18
+
24
19
  track_id: TrackId
25
20
  ts: Timestamp = Field(default_factory=lambda: int(datetime.now(timezone.utc).timestamp()))
26
21
 
@@ -27,6 +27,50 @@ BucketId = Annotated[
27
27
  ]
28
28
 
29
29
 
30
+ class PushedPlaylist(BaseModel):
31
+ """Pushed playlist schema."""
32
+
33
+ id: int = Field(
34
+ description="The id of the pushed playlist. It's generated as a timestamp value of the current time."
35
+ )
36
+ name: str = Field(
37
+ description="The name of the pushed playlist",
38
+ )
39
+
40
+
41
+ class PushedPlaylistMetadata(BaseModel):
42
+ """Pushed playlist metadata schema."""
43
+
44
+ expire_at: int = Field(
45
+ description="The expire time of the pushed playlist. It's calculated in set_bucket_track as the timestamp value of the timeslot."
46
+ )
47
+ playlists: list[PushedPlaylist] = Field(
48
+ description="The playlists of the pushed playlist",
49
+ )
50
+
51
+
52
+ class PushedPlaylistDetails(BaseModel):
53
+ """Player details schema."""
54
+
55
+ redis_details: dict[SessionId, BucketId] | None = Field(
56
+ default_factory=dict,
57
+ description="""Pushed playlists does exist in Redis with a timestamp.
58
+ Example: zone_{zone_id}_pp_bucket_{ts}
59
+ Every pushplaylist action has a session id. Here we map these session ids to the bucket id.
60
+ """,
61
+ )
62
+ metadata: PushedPlaylistMetadata | None = Field(
63
+ default=None,
64
+ description="The metadata of the pushed playlist",
65
+ )
66
+
67
+ @field_validator("redis_details", mode="before")
68
+ @classmethod
69
+ def default_empty_dict_if_none(cls, v):
70
+ """Override none value to empty dict."""
71
+ return v or {}
72
+
73
+
30
74
  class ZoneState(BaseModel):
31
75
  """Zone state schema."""
32
76
 
@@ -42,16 +86,18 @@ class ZoneState(BaseModel):
42
86
  default=None,
43
87
  description="The currently playing track",
44
88
  )
45
- push_playlist_details: dict[SessionId, BucketId] | None = Field(
46
- default_factory=dict,
89
+ pp_details: PushedPlaylistDetails | None = Field(
90
+ default=None,
47
91
  description="The details of the pushed playlist",
48
92
  )
49
93
 
50
- @field_validator("push_playlist_details", mode="before")
51
- @classmethod
52
- def default_empty_dict_if_none(cls, v):
53
- """Override none value to empty dict."""
54
- return v or {}
55
-
56
94
 
57
- __all__ = ["ZoneState", "NowPlaying", "SessionId", "BucketId"]
95
+ __all__ = [
96
+ "ZoneState",
97
+ "NowPlaying",
98
+ "SessionId",
99
+ "BucketId",
100
+ "PushedPlaylist",
101
+ "PushedPlaylistMetadata",
102
+ "PushedPlaylistDetails",
103
+ ]
@@ -10,6 +10,8 @@ from artemis_model.redis.zone_state import SessionId
10
10
  from artemis_model.schedule import ScheduleItem
11
11
  from pydantic import BaseModel, Field
12
12
 
13
+ from artemis_model.zone_activity import ZoneActivityType
14
+
13
15
 
14
16
  class Action(str, Enum):
15
17
  """Message type enum."""
@@ -101,3 +103,12 @@ class BanTrackIn(BaseMessage):
101
103
  zone_id: int
102
104
  track_id: UUID
103
105
  playlist_id: int
106
+
107
+
108
+ class ZoneActivityIn(BaseMessage):
109
+ """Zone activity message schema."""
110
+
111
+ action: Action = Action.ZONE_ACTIVITY
112
+ zone_id: int
113
+ activity_type: ZoneActivityType
114
+ activity_data: dict
@@ -39,9 +39,11 @@ class PlayerActivityMixin(TimeStampMixin, AuditMixin):
39
39
 
40
40
  class PlayerActivitySync(CustomSyncBase, PlayerActivityMixin):
41
41
  """Sync model for Player Activity"""
42
+
42
43
  pass
43
44
 
44
45
 
45
46
  class PlayerActivity(CustomBase, PlayerActivityMixin):
46
47
  """Base model for Player Activity"""
48
+
47
49
  pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: artemis-model
3
- Version: 0.1.114
3
+ Version: 0.1.116
4
4
  Summary:
5
5
  Author: Jukeboxy
6
6
  Requires-Python: >=3.10.6,<4.0.0
@@ -2,7 +2,7 @@ artemis_model/__init__.py,sha256=zEeAUndIbJdp_M6pFlON_BEehnMaMcTvusijGktpnvk,792
2
2
  artemis_model/album.py,sha256=9uw9HVNHVBjl-0Dgv-o5MHXhUPwedvbnbzzY3A1cKQg,2077
3
3
  artemis_model/artist.py,sha256=vjXlFN2mOEidAzUzxmsAP5GnVTvJUuhFdhQaH214lgw,1563
4
4
  artemis_model/auth.py,sha256=0Yg_6N1nj4U31F86u1PE0leIa3D64QlYrsDlavulN6s,4033
5
- artemis_model/banned_tracks.py,sha256=L8w8scdu9GL0Qcuf65HNolhzbqSUXq9TCprUzNtX2AU,665
5
+ artemis_model/banned_tracks.py,sha256=uU-F-6DL2EshPAUwLTTHjYZ7UEz4vm0Wfcif2F0lSKw,664
6
6
  artemis_model/base.py,sha256=zC20m8a1Sa11oEY0ay1iIRQeybGYvXY5p3Vr-pxoKnQ,6802
7
7
  artemis_model/category.py,sha256=jhCZrK-LxPmc0pXmVifAZWdCENssBTzdTmC3nqqZc6s,1761
8
8
  artemis_model/dj_set.py,sha256=fOYnCu4n5TiqyiSojfdFnO7LuPe_mM2SUwBV5xHy2Kc,3782
@@ -14,19 +14,19 @@ artemis_model/otp.py,sha256=guIRGtyFlHUBthCAEsTh5_Hs-1yiGN_qfEO4uHNcv4s,1017
14
14
  artemis_model/permission.py,sha256=Bn1Bg1aCS4Z4_3tqEqvtrzqAYDCImsvmGyIEMoVycEk,1452
15
15
  artemis_model/playlist.py,sha256=L22KSJgTZmNEc9CqM3TFD4Wnx3TW77GQJ5EFLJCxZ20,6393
16
16
  artemis_model/redis/__init__.py,sha256=qwAtvh2NrxRsjk_MqdeTZDwoaGc1K4PZhCCdTDsSTvA,781
17
- artemis_model/redis/bucket.py,sha256=q3Fq_OBwqOEj3_H3CVQEKY8TPtVi86dvVUkIlN_W1JA,1608
17
+ artemis_model/redis/bucket.py,sha256=DlmIf6GxfKq9CzcXmMx5IcviaqOTvuWwIb6lAVcZQGs,1537
18
18
  artemis_model/redis/device.py,sha256=ZUiIyVmtWiEwayFIg9mktiFaVuHQ7Fg0rvSjjWyryCI,484
19
19
  artemis_model/redis/keys.py,sha256=bnlSaBCIakLCIlgTr8BlYJmKEtKKvtdr43QIJCLnc90,567
20
- artemis_model/redis/play_history.py,sha256=pLWDpDlqZCH2bXTW-H0RFddJjXXmvobvIBm9iTUVy4k,1278
21
- artemis_model/redis/zone_state.py,sha256=PgHiGUZ2WI3bqO-8CW2cwzLEQu3l4wJAzIABSWErfBM,1712
20
+ artemis_model/redis/play_history.py,sha256=Jm0guS0UZDxfCXeWJ8vqcjjl93W_EeC7XcBXcclKPiE,1259
21
+ artemis_model/redis/zone_state.py,sha256=F0-nAS6zGQ6-qy5AInG3AayYdaPHnk7jyax-Q2G-1sY,2993
22
22
  artemis_model/schedule.py,sha256=CkLHWz-BwvUY2EQCfoU4SymgCariPzoQdtRLITqBPmk,2451
23
23
  artemis_model/setting.py,sha256=EWzOmE31mLNWwmV_wmqttHPMycvQZW7SJUIozF2b8bo,1190
24
24
  artemis_model/sqs/__init__.py,sha256=nHpXQns64qQ5Cqjyo6w9fDGO_wWhprqn1bhKf3eWnio,17
25
- artemis_model/sqs/messages.py,sha256=8PcZYUsh85x3TikZ4hBvGl_xUl9onKUwSCxZWgToEgQ,2668
25
+ artemis_model/sqs/messages.py,sha256=mT8Q2OmrX5E3XUYIC-QBOAGPm4nuuWZa4CgFtCOOuwM,2923
26
26
  artemis_model/track.py,sha256=QwUF0QKVn1I64648B-NI75-IzGQvnLt9B0emD4GnS6E,3757
27
27
  artemis_model/user.py,sha256=eqIdCiBJRNLjCwPPCn-gQ6si0O5JUBGfp9oWJL5zVW4,2131
28
28
  artemis_model/zone.py,sha256=iGRUtzUwKh9LHT3MOfzzg1DnkPBts_ZBzZVTi2EmIgs,2282
29
- artemis_model/zone_activity.py,sha256=TgBIbVhU_aVvhPIe7eC4TSJayW8aMSJWoOiv6JduS4w,1598
30
- artemis_model-0.1.114.dist-info/METADATA,sha256=H3jVVmEerVNAXOgVSmOHaFeBVmJQzmXS9ZSu-wtPDaU,3445
31
- artemis_model-0.1.114.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
32
- artemis_model-0.1.114.dist-info/RECORD,,
29
+ artemis_model/zone_activity.py,sha256=IkB1Ggjb24-FXAd4pSOeyhngX54U9OtTdFTvm4DYL1A,1600
30
+ artemis_model-0.1.116.dist-info/METADATA,sha256=gYFeFvyzsboYhkLsE2cdfibl30rZlGyL1EPWvKO3E3M,3445
31
+ artemis_model-0.1.116.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
32
+ artemis_model-0.1.116.dist-info/RECORD,,