feat(music-lab): 파일 해시 기반 라이브러리 동기화 — rename 시 태그 보존
- music_library에 file_hash(MD5) 컬럼 추가 - _sync_library_with_disk를 3단계로 변경: 1. 파일명 매칭 (빠른 경로) 2. 해시 비교로 rename 감지 → 기존 레코드 업데이트 (태그 보존) 3. 나머지 → 삭제/추가 - 파일명 변경 시 audio_url 업데이트 → 다운로드도 새 이름 적용 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -72,6 +72,7 @@ def init_db() -> None:
|
||||
for col, default in [
|
||||
("provider", "'local'"), ("lyrics", "''"),
|
||||
("image_url", "''"), ("suno_id", "''"),
|
||||
("file_hash", "''"),
|
||||
]:
|
||||
try:
|
||||
conn.execute(f"ALTER TABLE music_library ADD COLUMN {col} TEXT NOT NULL DEFAULT {default}")
|
||||
@@ -159,6 +160,7 @@ def _track_row_to_dict(r) -> Dict[str, Any]:
|
||||
"lyrics": r["lyrics"] if "lyrics" in keys else "",
|
||||
"image_url": r["image_url"] if "image_url" in keys else "",
|
||||
"suno_id": r["suno_id"] if "suno_id" in keys else "",
|
||||
"file_hash": r["file_hash"] if "file_hash" in keys else "",
|
||||
"created_at": r["created_at"],
|
||||
}
|
||||
|
||||
@@ -176,8 +178,8 @@ def add_track(data: Dict[str, Any]) -> Dict[str, Any]:
|
||||
INSERT INTO music_library
|
||||
(title, genre, moods, instruments, duration_sec, bpm, key, scale,
|
||||
prompt, audio_url, file_path, task_id, tags,
|
||||
provider, lyrics, image_url, suno_id)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
provider, lyrics, image_url, suno_id, file_hash)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
""",
|
||||
(
|
||||
data.get("title", ""),
|
||||
@@ -197,6 +199,7 @@ def add_track(data: Dict[str, Any]) -> Dict[str, Any]:
|
||||
data.get("lyrics", ""),
|
||||
data.get("image_url", ""),
|
||||
data.get("suno_id", ""),
|
||||
data.get("file_hash", ""),
|
||||
),
|
||||
)
|
||||
row = conn.execute("SELECT * FROM music_library WHERE rowid = last_insert_rowid()").fetchone()
|
||||
@@ -227,6 +230,24 @@ def update_track_duration(track_id: int, duration_sec: int) -> None:
|
||||
)
|
||||
|
||||
|
||||
def update_track_file_info(track_id: int, title: str, audio_url: str, file_path: str) -> None:
|
||||
"""파일 rename 시 파일 관련 정보만 업데이트 (태그 등 메타데이터 보존)."""
|
||||
with _conn() as conn:
|
||||
conn.execute(
|
||||
"UPDATE music_library SET title=?, audio_url=?, file_path=? WHERE id=?",
|
||||
(title, audio_url, file_path, track_id),
|
||||
)
|
||||
|
||||
|
||||
def update_track_hash(track_id: int, file_hash: str) -> None:
|
||||
"""트랙의 file_hash를 업데이트."""
|
||||
with _conn() as conn:
|
||||
conn.execute(
|
||||
"UPDATE music_library SET file_hash=? WHERE id=?",
|
||||
(file_hash, track_id),
|
||||
)
|
||||
|
||||
|
||||
def get_track_file_path(track_id: int) -> Optional[str]:
|
||||
with _conn() as conn:
|
||||
row = conn.execute("SELECT file_path FROM music_library WHERE id = ?", (track_id,)).fetchone()
|
||||
|
||||
Reference in New Issue
Block a user