artemis-model 0.1.95__py3-none-any.whl → 0.1.97__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.
@@ -2,6 +2,7 @@
2
2
 
3
3
  from .zone_state import ZoneState, NowPlaying, SessionId, BucketId
4
4
  from .device import ActiveDevice
5
+ from .bucket import RedisTrackBucketItem
5
6
  from .keys import (
6
7
  KEY_ZONE_PLAY_HISTORY_TEMPLATE,
7
8
  KEY_ZONE_PUSH_PLAYLIST_BUCKET_TEMPLATE,
@@ -21,4 +22,5 @@ __all__ = [
21
22
  "KEY_ZONE_SCHEDULE_BUCKET_TEMPLATE",
22
23
  "KEY_ZONE_STATE_TEMPLATE",
23
24
  "KEY_ZONE_ACTIVE_DEVICE_TEMPLATE",
25
+ "RedisTrackBucketItem",
24
26
  ]
@@ -0,0 +1,54 @@
1
+ """Redis track buckets"""
2
+ from pydantic import BaseModel, Field, ConfigDict
3
+ from typing import Annotated
4
+ from datetime import datetime, timezone
5
+ import uuid
6
+
7
+
8
+ TrackId = Annotated[
9
+ uuid.UUID,
10
+ Field(description="Track ID (UUID)")
11
+ ]
12
+
13
+ PlaylistId = Annotated[
14
+ int,
15
+ Field(description="Playlist ID (integer)")
16
+ ]
17
+
18
+ Timestamp = Annotated[
19
+ int,
20
+ Field(description="Unix timestamp")
21
+ ]
22
+
23
+
24
+ class RedisTrackBucketItem(BaseModel):
25
+ """
26
+ Represents a composite Redis key along with a timestamp.
27
+ The Redis entry will be:
28
+ { '{"track_id": "...", "playlist_id": ...}': ts }
29
+ ts is the timestamp of utc now.
30
+ """
31
+
32
+ track_id: TrackId
33
+ playlist_id: PlaylistId
34
+ ts: Timestamp = Field(default_factory=lambda: int(datetime.now(timezone.utc).timestamp()))
35
+
36
+ model_config = ConfigDict(
37
+ json_encoders={uuid.UUID: str},
38
+ populate_by_name=True
39
+ )
40
+
41
+ def as_redis_entry(self) -> dict[str, int]:
42
+ """
43
+ Generate a Redis-ready dictionary:
44
+ { '{"track_id": "...", "playlist_id": ...}': ts }
45
+ """
46
+ key = self.model_dump_json(include={"track_id", "playlist_id"})
47
+ return {key: self.ts}
48
+
49
+ @classmethod
50
+ def from_redis_entry(cls, entry: dict[str, int]) -> "RedisTrackBucketItem":
51
+ """
52
+ Parse a Redis entry into a RedisTrackBucketItem.
53
+ """
54
+ return cls.model_validate_json(list(entry.keys())[0])
@@ -6,6 +6,7 @@ KEY_ZONE_SCHEDULE_BUCKET_TEMPLATE = "zone_{zone_id}_sc_bucket_{timeslot_ts}"
6
6
  KEY_ZONE_STATE_TEMPLATE = "zone_{zone_id}_state"
7
7
  KEY_ZONE_ACTIVE_DEVICE_TEMPLATE = "zone_{zone_id}_active_devices"
8
8
 
9
+
9
10
  __all__ = [
10
11
  "KEY_ZONE_PLAY_HISTORY_TEMPLATE",
11
12
  "KEY_ZONE_PUSH_PLAYLIST_BUCKET_TEMPLATE",
@@ -0,0 +1,43 @@
1
+ """Redis play history"""
2
+
3
+ from pydantic import BaseModel, Field
4
+ from typing import Annotated
5
+ from datetime import datetime, timezone
6
+
7
+
8
+ TrackId = Annotated[
9
+ str,
10
+ Field(description="Track ID (UUID or string)")
11
+ ]
12
+
13
+ Timestamp = Annotated[
14
+ int,
15
+ Field(description="Unix timestamp")
16
+ ]
17
+
18
+
19
+ class TrackPlayHistoryValue(BaseModel):
20
+ """
21
+ Represents the value stored in Redis sorted set:
22
+ A string like "track_id#timestamp"
23
+ """
24
+ track_id: TrackId
25
+ ts: Timestamp = Field(default_factory=lambda: int(datetime.now(timezone.utc).timestamp()))
26
+
27
+ def as_redis_entry(self) -> str:
28
+ """
29
+ Generate a Redis-ready string:
30
+ "track_id#timestamp"
31
+ """
32
+ return f"{self.track_id}#{self.ts}"
33
+
34
+ @classmethod
35
+ def from_redis_entry(cls, value: str) -> "TrackPlayHistoryValue":
36
+ """
37
+ Parse a Redis entry into a TrackPlayHistoryValue.
38
+ """
39
+ try:
40
+ track_id, ts = value.rsplit("#", 1)
41
+ return cls(track_id=track_id, ts=int(ts))
42
+ except Exception as e:
43
+ raise ValueError(f"Invalid format for TrackPlayHistoryValue: {value}") from e
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: artemis-model
3
- Version: 0.1.95
3
+ Version: 0.1.97
4
4
  Summary:
5
5
  Author: Jukeboxy
6
6
  Requires-Python: >=3.10.6,<4.0.0
@@ -12,9 +12,11 @@ artemis_model/organization.py,sha256=yjGHJLTOtb9PUfxSPal782Rceb8xb8vftXX67tHRNqc
12
12
  artemis_model/otp.py,sha256=guIRGtyFlHUBthCAEsTh5_Hs-1yiGN_qfEO4uHNcv4s,1017
13
13
  artemis_model/permission.py,sha256=Bn1Bg1aCS4Z4_3tqEqvtrzqAYDCImsvmGyIEMoVycEk,1452
14
14
  artemis_model/playlist.py,sha256=L22KSJgTZmNEc9CqM3TFD4Wnx3TW77GQJ5EFLJCxZ20,6393
15
- artemis_model/redis/__init__.py,sha256=xJy7MwgKHE1-KVZJAP8g8mr9HAl1j469hRIqjZvV8nI,626
15
+ artemis_model/redis/__init__.py,sha256=uNxgdnhiYNEb5eTq4ZLbXyb-rlc8NXOcXncnCg6fJQc,695
16
+ artemis_model/redis/bucket.py,sha256=r3CEHSPeb8iFs1J0TMf3oZddnPSJkwvjjkWiemRUtdo,1408
16
17
  artemis_model/redis/device.py,sha256=ZUiIyVmtWiEwayFIg9mktiFaVuHQ7Fg0rvSjjWyryCI,484
17
- artemis_model/redis/keys.py,sha256=Eb4TgtS-M1j-KuHVeFzxpVzm_zsizrUCRgeAv9BnLF4,566
18
+ artemis_model/redis/keys.py,sha256=bnlSaBCIakLCIlgTr8BlYJmKEtKKvtdr43QIJCLnc90,567
19
+ artemis_model/redis/play_history,sha256=DZdSrY9Ji9i1H7b9Pcry8v0e_5Q0aUpkXWW6SNAO7FQ,1140
18
20
  artemis_model/redis/zone_state.py,sha256=PgHiGUZ2WI3bqO-8CW2cwzLEQu3l4wJAzIABSWErfBM,1712
19
21
  artemis_model/schedule.py,sha256=CkLHWz-BwvUY2EQCfoU4SymgCariPzoQdtRLITqBPmk,2451
20
22
  artemis_model/setting.py,sha256=EWzOmE31mLNWwmV_wmqttHPMycvQZW7SJUIozF2b8bo,1190
@@ -23,6 +25,6 @@ artemis_model/sqs/messages.py,sha256=98cWxrj48T1AcEnltqVGTts6rcmTYimeN8fC6wkdNQk
23
25
  artemis_model/track.py,sha256=QwUF0QKVn1I64648B-NI75-IzGQvnLt9B0emD4GnS6E,3757
24
26
  artemis_model/user.py,sha256=eqIdCiBJRNLjCwPPCn-gQ6si0O5JUBGfp9oWJL5zVW4,2131
25
27
  artemis_model/zone.py,sha256=iGRUtzUwKh9LHT3MOfzzg1DnkPBts_ZBzZVTi2EmIgs,2282
26
- artemis_model-0.1.95.dist-info/METADATA,sha256=VeBx7zfoktkLfk6E17yUkNUzI1iYmS6Dzrlk0PzjxGA,3444
27
- artemis_model-0.1.95.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
28
- artemis_model-0.1.95.dist-info/RECORD,,
28
+ artemis_model-0.1.97.dist-info/METADATA,sha256=iZK0-ssqYu48mjl0yZSlbQWgYeGiPHgLh9AoFI8dgEM,3444
29
+ artemis_model-0.1.97.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
30
+ artemis_model-0.1.97.dist-info/RECORD,,