initial commit
This commit is contained in:
+39
@@ -0,0 +1,39 @@
|
||||
import logging
|
||||
|
||||
from nicegui import background_tasks
|
||||
|
||||
from rooms.room import Room
|
||||
from rooms.utils import generate_uid
|
||||
|
||||
|
||||
class RoomsDB:
|
||||
def __init__(self):
|
||||
self.rooms = []
|
||||
self.by_uid: dict[str, Room] = {}
|
||||
|
||||
async def create_room(self, tmdb_id: int) -> Room:
|
||||
logging.info("Creating new room")
|
||||
|
||||
uid = generate_uid()
|
||||
while uid in self.by_uid.keys():
|
||||
uid = generate_uid()
|
||||
|
||||
room = Room(uid=uid, tmdb_id=tmdb_id)
|
||||
self.rooms.append(room)
|
||||
self.by_uid[uid] = room
|
||||
|
||||
background_tasks.create_lazy(room.update(), name=f"room_update_{uid}")
|
||||
|
||||
logging.info(f"Created new room {room.uid}")
|
||||
|
||||
return room
|
||||
|
||||
async def delete_room(self, uid: str):
|
||||
logging.info(f"Deleting room {uid}")
|
||||
|
||||
background_tasks.lazy_tasks_running.get(f"room_update_{uid}").cancel()
|
||||
room = self.by_uid[uid]
|
||||
del self.by_uid[uid]
|
||||
self.rooms.remove(room)
|
||||
|
||||
logging.info(f"Deleted room {uid}")
|
||||
@@ -0,0 +1,82 @@
|
||||
import asyncio
|
||||
import logging
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
|
||||
import config
|
||||
import globals
|
||||
from rooms.state import PlayerState
|
||||
|
||||
|
||||
@dataclass(frozen=False)
|
||||
class Room:
|
||||
uid: str
|
||||
tmdb_id: int
|
||||
|
||||
player_position: float = 0.0
|
||||
player_state: PlayerState = PlayerState.PAUSED
|
||||
|
||||
current_season: int | None = None
|
||||
current_episode: int | None = None
|
||||
|
||||
connected_users: list[str] = field(default_factory=list)
|
||||
|
||||
def __init__(self, uid: str, tmdb_id: int):
|
||||
self.uid = uid
|
||||
self.tmdb_id = tmdb_id
|
||||
|
||||
self.player_position = 0.0
|
||||
self.player_state = PlayerState.PAUSED
|
||||
|
||||
self.current_season = None
|
||||
self.current_episode = None
|
||||
|
||||
self.connected_users = []
|
||||
|
||||
content = globals.MOVIES_DATABASE.by_tmdb_id[tmdb_id]
|
||||
if content.type == "tv":
|
||||
self.current_season = 1
|
||||
self.current_episode = 1
|
||||
|
||||
self.last_update = datetime.now()
|
||||
|
||||
async def _delete(self):
|
||||
await globals.ROOMS_DATABASE.delete_room(self.uid)
|
||||
|
||||
async def _update(self):
|
||||
if not self.connected_users:
|
||||
for _ in range(100):
|
||||
await asyncio.sleep(0.1)
|
||||
if self.connected_users:
|
||||
break
|
||||
|
||||
if not self.connected_users:
|
||||
logging.info("No users connected to %s, deleting it", self.uid)
|
||||
await self._delete()
|
||||
|
||||
now = datetime.now()
|
||||
|
||||
if self.player_state == PlayerState.PLAYING:
|
||||
self.player_position += (now - self.last_update).total_seconds()
|
||||
|
||||
self.last_update = now
|
||||
|
||||
async def update(self):
|
||||
self.last_update = datetime.now()
|
||||
|
||||
while True:
|
||||
await asyncio.sleep(config.ROOMS_UPDATE_INTERVAL_SECONDS)
|
||||
await self._update()
|
||||
|
||||
def pause(self):
|
||||
self.player_state = PlayerState.PAUSED
|
||||
|
||||
def play(self):
|
||||
self.player_state = PlayerState.PLAYING
|
||||
|
||||
def stop(self):
|
||||
self.player_state = PlayerState.STOPPED
|
||||
|
||||
def seek(self, seconds: float):
|
||||
self.player_position = seconds
|
||||
self.last_update = datetime.now()
|
||||
@@ -0,0 +1,7 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class PlayerState(Enum):
|
||||
PLAYING = "playing"
|
||||
PAUSED = "paused"
|
||||
STOPPED = "stopped"
|
||||
@@ -0,0 +1,8 @@
|
||||
import random
|
||||
import string
|
||||
|
||||
CHARACTERS = string.ascii_letters
|
||||
|
||||
|
||||
def generate_uid(length: int = 6) -> str:
|
||||
return "".join(random.choice(CHARACTERS) for _ in range(length))
|
||||
Reference in New Issue
Block a user