from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey, Float,JSON from sqlalchemy.orm import relationship from datetime import datetime from database import Base import random def get_random_album_art(): number = random.randint(1, 30) return f"https://storage.googleapis.com/mippia-userfile-bucket/userfiles/default_albumart/thumbnail_240_{number:02}.png" class Result(Base): # 한글 path, 영어 path, data_pkl # 3개가 result가 있음 1통합 -> migration을하면 지금 돌고있는 사이트에도 영향이감 __tablename__ = "files" id = Column(Integer, primary_key=True, index=True) path = Column(String, index=True, default = None) # deprecated music_id = Column(Integer, ForeignKey("musics.id")) rank = Column(Integer) requested_at = Column(DateTime, default=datetime.utcnow) title = Column(String, index=True) music = relationship("Music", back_populates="results") plagiarism_rate = Column(Float) data_pkl = Column(String) def __repr__(self): return f"" class Visual_Result(Base): # 한글 path, 영어 path, data_pkl # 3개가 result가 있음 1통합 -> migration을하면 지금 돌고있는 사이트에도 영향이감 __tablename__ = "visual_results" id = Column(Integer, primary_key=True) ko_path = Column(String, default = None) # default = None en_path = Column(String, default = None) # default = None, path2개는 거의 deprecated된 상태일듯? music_id = Column(Integer, ForeignKey("musics.id"), index=True) rank = Column(Integer) requested_at = Column(DateTime, default=datetime.utcnow) title = Column(String, index=True) music = relationship("Music", back_populates="visual_results") plagiarism_rate = Column(Float) data_pkl = Column(String) # data json인데 ㅋㅋ.. column name 바꾸려다가 터질 수 있어서.. opened = Column(Boolean, default = False) share_token = Column(String, default = None) def __repr__(self): return f"" class Monitoring_Visual_Result(Base): __tablename__ = "monitoring_visual_results" id = Column(Integer, primary_key=True) music_id = Column(Integer, ForeignKey("musics.id"), index=True) rank = Column(Integer) requested_at = Column(DateTime, default=datetime.utcnow) title = Column(String, index=True) primary_artist = Column(String, index=True) other_artist = Column(String) distributor = Column(String, index=True) release_date = Column(String) additional_info = Column(JSON) copyright_owner = Column(String) music = relationship("Music", back_populates="monitoring_visual_results") plagiarism_rate = Column(Float) data_pkl = Column(String) opened = Column(Boolean, default = False) share_token = Column(String, default = None) inst = Column(String) def __repr__(self): return f"" class Music(Base): # 신청 받은 곡 __tablename__ = "musics" id = Column(Integer, primary_key=True, index=True) music_path = Column(String) preview_music_path = Column(String) title = Column(String) # 이거 아마 업뎃해야할듯? 아마 다운 이후에 구해질거임. 물론 곡을 업로드한경우에는 바로 업뎃도 가능할듯 user_input = Column(String) # 이게 곡이면 music_path랑 똑같고, 링크면, 이거는 링크인데 music_path는 여기 로컬 path임 user_id = Column(Integer, ForeignKey("users.id")) user = relationship("User", back_populates="musics") results = relationship("Result", back_populates="music", cascade="all, delete-orphan") visual_results = relationship("Visual_Result", back_populates="music", cascade="all, delete-orphan") key_change = Column(Integer, default=0) key = Column(String, nullable=True) status = Column(String) inst = Column(String) requested_at = Column(DateTime, default=datetime.utcnow) bpm = Column(Integer, nullable=True) language = Column(String) processed_in_aibackend = Column(Boolean) is_monitoring = Column(Boolean, default=False) # 새로운 속성 추가 monitoring_music = relationship("Monitoring_Music", back_populates="music") monitoring_visual_results = relationship("Monitoring_Visual_Result", back_populates="music", cascade="all, delete-orphan") ai_detection_musics = relationship("AI_Detection_Music", back_populates="music", cascade="all, delete-orphan") deleted = Column(Boolean, default=False) info_link = Column(String) new_info_link = Column(String) duration = Column(Float) new_version = Column(Boolean, default = True) credit = Column(Integer) music_task = Column(String) #['monitoring', 'analysis', 'plagiarism_check','ai_detector',...] # 이거로 monitoring, 1v1, 1대다 등등 구분할 수 있도록. 엥간하면 Admin확인용으로!. 알고리즘으로 써도 되긴할건데 enum형태는 아니라 까다로울거임 opened = Column(Boolean, default = False) def __repr__(self): return f"" @property def user_name(self): return self.user.user_info.name if self.user and self.user.user_info else None class Monitoring_Music(Base): __tablename__ = "monitoring_musics" id = Column(Integer, primary_key=True, index=True) music_id = Column(Integer, ForeignKey("musics.id")) music = relationship("Music", back_populates="monitoring_music") title = Column(String) artist = Column(String) requested_at = Column(DateTime, default=datetime.utcnow) release_date = Column(DateTime) album_art = Column(String, default=get_random_album_art) detected_count = Column(Integer, default=0) find_count = Column(Integer, default=0) criteria = Column(Integer) mail_agree = Column(Boolean, default=False) deleted = Column(Boolean, default=False) deleted_reason = Column(String, nullable=True, default=None) is_monitoring = Column(Boolean, default=True) # 앨범과의 관계. 여기서 앨범은 모니터링에서만 사용되는 기능이라고 가정합니다 album_id = Column(Integer, ForeignKey("albums.id"), nullable=True) # 앨범 ID (옵션) album = relationship("Album", back_populates="monitoring_musics") # 앨범에 대한 역참조\ track_number = Column(Integer, nullable=True) def __repr__(self): return f"" def to_dict(self): music_dict = {"id": self.id, "title": self.title, "artist": self.artist, "requested_at": self.requested_at, "release_date": self.release_date, "album_art": self.album_art, "detected_count": self.detected_count} return music_dict class Album(Base): __tablename__ = "albums" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) # 앨범 소유자 user = relationship("User", back_populates="albums") title = Column(String, nullable=False) # 앨범 제목 artist = Column(String) album_art = Column(String, default=get_random_album_art) created_at = Column(DateTime, default=datetime.utcnow) deleted = Column(Boolean, default=False) music_number = Column(Integer, default=0) # 모니터링 곡과의 관계 monitoring_musics = relationship("Monitoring_Music", back_populates="album") def __repr__(self): return f"" class Now_Monitoring(Base): __tablename__ = "now_monitoring" id = Column(Integer, primary_key=True, index=True) music_title = Column(String) primary_artist = Column(String, index=True) other_artist = Column(String) distributor = Column(String, index=True) release_date = Column(String) additional_info = Column(JSON) copyright_owner = Column(String) now_index = Column(Integer, default=0) class AI_Detection_Music(Base): __tablename__ = "ai_detection_musics" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id")) music_id = Column(Integer, ForeignKey("musics.id")) music = relationship("Music", back_populates="ai_detection_musics") title = Column(String) ai_percentage = Column(Float) processed_in_ai_backend = Column(Boolean, default=False) requested_at = Column(DateTime, default=datetime.utcnow) vocal_percentage = Column(Float) inst_percentage = Column(Float) opened = Column(Boolean, default = False) link = Column(String, default = None) status = Column(String, default = None) deleted = Column(Boolean, default=False) user = relationship("User", back_populates="ai_detection_musics") def to_dict(self): return { "id": self.id, "music_id": self.music_id, "title": self.title, "ai_percentage": self.ai_percentage, "processed_in_ai_backend": self.processed_in_ai_backend, "requested_at": self.requested_at.isoformat() if self.requested_at else None, "vocal_percentage": self.vocal_percentage, "inst_percentage": self.inst_percentage }