87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
"""
|
|
다운로드 큐 모델 정의
|
|
"""
|
|
from plugin import ModelBase, db
|
|
from framework import F
|
|
import os
|
|
|
|
# 패키지 이름 동적 처리 (폴더명 기준)
|
|
package_name = os.path.split(os.path.dirname(__file__))[-1]
|
|
|
|
class ModelDownloadItem(ModelBase):
|
|
"""다운로드 아이템 DB 모델"""
|
|
__tablename__ = f'{package_name}_download_item'
|
|
__table_args__ = {'mysql_collate': 'utf8_general_ci'}
|
|
__bind_key__ = package_name
|
|
|
|
id: int = db.Column(db.Integer, primary_key=True)
|
|
created_time: datetime = db.Column(db.DateTime)
|
|
|
|
# 다운로드 정보
|
|
url: str = db.Column(db.String)
|
|
filename: str = db.Column(db.String)
|
|
save_path: str = db.Column(db.String)
|
|
source_type: str = db.Column(db.String) # youtube, ani24, linkkf, anilife, http
|
|
|
|
# 상태
|
|
status: str = db.Column(db.String) # pending, downloading, paused, completed, error
|
|
progress: int = db.Column(db.Integer, default=0)
|
|
speed: str = db.Column(db.String)
|
|
eta: str = db.Column(db.String)
|
|
|
|
# 메타데이터
|
|
title: str = db.Column(db.String)
|
|
thumbnail: str = db.Column(db.String)
|
|
duration: int = db.Column(db.Integer)
|
|
filesize: int = db.Column(db.Integer)
|
|
|
|
# 호출자 정보
|
|
caller_plugin: str = db.Column(db.String)
|
|
callback_id: str = db.Column(db.String)
|
|
|
|
# 에러 정보
|
|
error_message: str = db.Column(db.Text)
|
|
retry_count: int = db.Column(db.Integer, default=0)
|
|
|
|
# 추가 메타데이터 (JSON 형태의 텍스트 저장)
|
|
meta: str = db.Column(db.Text)
|
|
|
|
def as_dict(self):
|
|
ret = super(ModelDownloadItem, self).as_dict()
|
|
import json
|
|
if self.meta:
|
|
try:
|
|
ret['meta'] = json.loads(self.meta)
|
|
except:
|
|
ret['meta'] = {}
|
|
else:
|
|
ret['meta'] = {}
|
|
return ret
|
|
|
|
@classmethod
|
|
def check_migration(cls):
|
|
"""DB 컬럼 누락 체크 및 추가"""
|
|
try:
|
|
from .setup import P
|
|
import sqlite3
|
|
db_file = F.app.config['SQLALCHEMY_BINDS'][package_name].replace('sqlite:///', '').split('?')[0]
|
|
conn = sqlite3.connect(db_file)
|
|
cursor = conn.cursor()
|
|
|
|
# meta 컬럼 확인
|
|
cursor.execute(f"PRAGMA table_info({cls.__tablename__})")
|
|
columns = [info[1] for info in cursor.fetchall()]
|
|
|
|
if 'meta' not in columns:
|
|
P.logger.info(f"Adding 'meta' column to {cls.__tablename__}")
|
|
cursor.execute(f"ALTER TABLE {cls.__tablename__} ADD COLUMN meta TEXT")
|
|
conn.commit()
|
|
|
|
conn.close()
|
|
except Exception as e:
|
|
from .setup import P
|
|
P.logger.error(f"Migration Error: {e}")
|
|
import traceback
|
|
P.logger.error(traceback.format_exc())
|
|
|