Spaces:
Running
Running
File size: 3,029 Bytes
4f1c41c 200e714 4f1c41c 200e714 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Boolean, Text, Float
from sqlalchemy.orm import relationship
from datetime import datetime
from app.database import Base
from app.models.user import User
from app.models.lyrics import task_groups
class Task(Base):
__tablename__ = "tasks"
id = Column(Integer, primary_key=True, index=True)
task_id = Column(String, unique=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"))
device_id = Column(String)
song_name = Column(String)
artist = Column(String, nullable=True, default=None)
album = Column(String, nullable=True, default=None)
cover_url = Column(String, nullable=True, default=None)
stems = Column(Integer)
status = Column(String, default="PENDING")
created_at = Column(DateTime, default=datetime.utcnow)
# Fecha en que el cliente confirmó que descargó todos los stems.
downloaded_at = Column(DateTime, nullable=True, default=None)
cloud_url = Column(Text, nullable=True, default=None)
# JSON: {"vocals": "BQACAgIA...", "bass": "BQACAgIB..."} - file_ids de Telegram por stem
telegram_file_ids = Column(Text, nullable=True, default=None)
# JSON: {"vocals": 12345, "bass": 12346} - message_ids de Telegram (para borrar si el usuario elimina)
telegram_message_ids = Column(Text, nullable=True, default=None)
group_id = Column(Integer, ForeignKey("groups.id"), nullable=True)
# JSON string con lista de acordes editados por el usuario [{"t": 0.5, "ch": "Am"}, ...]
chords = Column(Text, nullable=True, default=None)
# Fecha en que los archivos de Tebi (stems + voces corales) serán eliminados automáticamente
# Normal: 3 días, Premium: 7 días desde la subida. NULL = ya expirado o tarea anterior al feature.
cloud_expires_at = Column(DateTime, nullable=True, default=None)
bpm = Column(Float, nullable=True, default=None)
beats = Column(Text, nullable=True, default=None) # JSON array of beat timestamps in seconds
user = relationship("User", back_populates="tasks")
group = relationship("Group", foreign_keys=[group_id])
groups_shared = relationship("Group", secondary=task_groups, back_populates="tasks_shared")
@property
def group_ids(self):
return [g.id for g in self.groups_shared]
class Worker(Base):
__tablename__ = "workers"
id = Column(Integer, primary_key=True, index=True)
hostname = Column(String, unique=True, index=True)
name = Column(String, nullable=True) # User-friendly custom name
status = Column(String, default="offline") # online | offline | busy
last_seen = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# BYOK / Local Worker
user_id = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"), nullable=True, unique=True)
token = Column(String, unique=True, index=True, nullable=True)
command = Column(String, default="none") # start | stop | none
is_active = Column(Boolean, default=False)
|