fix(available): loai iZotope VST2 legacy (Steinberg\VSTPlugins\iZotope\*.dll) trung ten VST3 FX da scan — block theo ten normalized (bo prefix iZ, lowercase alnum); giu VST2 that (DSK/Kong)
This commit is contained in:
+27
-2
@@ -195,25 +195,40 @@ async def list_plugins(current_user: dict = Depends(get_current_user)):
|
|||||||
# không xác định được loại → KHÔNG hiện trong nút Synth.
|
# không xác định được loại → KHÔNG hiện trong nút Synth.
|
||||||
fx_paths = set()
|
fx_paths = set()
|
||||||
unknown_paths = set()
|
unknown_paths = set()
|
||||||
|
fx_norm_names = set()
|
||||||
try:
|
try:
|
||||||
from app.core.vst_engine import get_plugin_manager
|
from app.core.vst_engine import get_plugin_manager
|
||||||
for e in get_plugin_manager().list_scan_all():
|
for e in get_plugin_manager().list_scan_all():
|
||||||
path = (e.get("path") or "").lower()
|
path = (e.get("path") or "").lower()
|
||||||
if e.get("is_fx"):
|
if e.get("is_fx"):
|
||||||
fx_paths.add(path)
|
fx_paths.add(path)
|
||||||
|
fx_norm_names.add(_norm_plugin_name(e.get("name") or ""))
|
||||||
elif e.get("is_unknown"):
|
elif e.get("is_unknown"):
|
||||||
unknown_paths.add(path)
|
unknown_paths.add(path)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
blocked = fx_paths | unknown_paths
|
blocked = fx_paths | unknown_paths
|
||||||
|
|
||||||
|
def _is_fx_dupe(v) -> bool:
|
||||||
|
# iZotope cài VST2 legacy vào Steinberg\VSTPlugins\iZotope\ (iZOzonePro.dll,
|
||||||
|
# iZNeutronProCompressor.dll...) TRÙNG với VST3 FX đã scan (Ozone Pro Dynamic
|
||||||
|
# EQ.vst3...) nhưng path .dll ≠ path .vst3 → block theo path KHÔNG trúng.
|
||||||
|
# Loại theo TÊN normalized (bỏ prefix iZ, lowercase alnum) — VST2 thật
|
||||||
|
# (DSK Asian DreamZ, Kong Audio...) không trùng tên FX → vẫn giữ.
|
||||||
|
if not fx_norm_names:
|
||||||
|
return False
|
||||||
|
return _norm_plugin_name(v.get("name") or "") in fx_norm_names
|
||||||
|
|
||||||
if blocked:
|
if blocked:
|
||||||
avail["vst_instruments"] = [v for v in avail["vst_instruments"]
|
avail["vst_instruments"] = [v for v in avail["vst_instruments"]
|
||||||
if (v.get("path") or "").lower() not in blocked]
|
if (v.get("path") or "").lower() not in blocked
|
||||||
|
and not _is_fx_dupe(v)]
|
||||||
# Gộp VST từ plugin_dirs user đã scan — list_available() CHỈ quét vst_dir
|
# Gộp VST từ plugin_dirs user đã scan — list_available() CHỈ quét vst_dir
|
||||||
# env (mặc định /opt/daw_engine/vst3) → Synth dropdown không thấy VSTi mà
|
# env (mặc định /opt/daw_engine/vst3) → Synth dropdown không thấy VSTi mà
|
||||||
# Plugin Manager đã scan trong thư mục user chọn (bug: nút Synth rỗng).
|
# Plugin Manager đã scan trong thư mục user chọn (bug: nút Synth rỗng).
|
||||||
extra = [v for v in _scan_vst_in_dirs(d["plugin_dirs"])
|
extra = [v for v in _scan_vst_in_dirs(d["plugin_dirs"])
|
||||||
if (v.get("path") or "").lower() not in blocked]
|
if (v.get("path") or "").lower() not in blocked
|
||||||
|
and not _is_fx_dupe(v)]
|
||||||
by_id = {v["id"]: v for v in avail["vst_instruments"]}
|
by_id = {v["id"]: v for v in avail["vst_instruments"]}
|
||||||
for v in extra:
|
for v in extra:
|
||||||
by_id.setdefault(v["id"], v)
|
by_id.setdefault(v["id"], v)
|
||||||
@@ -227,6 +242,16 @@ async def list_plugins(current_user: dict = Depends(get_current_user)):
|
|||||||
return avail
|
return avail
|
||||||
|
|
||||||
|
|
||||||
|
def _norm_plugin_name(name: str) -> str:
|
||||||
|
"""Tên plugin chuẩn hóa để so khớp FX trùng (iZotope VST2 legacy vs VST3):
|
||||||
|
bỏ prefix 'iZ' (iZOzonePro → OzonePro), lowercase, chỉ giữ alnum
|
||||||
|
(Ozone Pro Dynamic EQ → ozoneprodynamiceq)."""
|
||||||
|
s = "".join(ch for ch in (name or "").lower() if ch.isalnum())
|
||||||
|
if s.startswith("iz") and len(s) > 2:
|
||||||
|
s = s[2:]
|
||||||
|
return s
|
||||||
|
|
||||||
|
|
||||||
def _scan_soundfonts_in_dirs(dirs: list) -> list:
|
def _scan_soundfonts_in_dirs(dirs: list) -> list:
|
||||||
"""Walk các thư mục (plugin_dirs user) → danh sách soundfont .sf2/.sf3
|
"""Walk các thư mục (plugin_dirs user) → danh sách soundfont .sf2/.sf3
|
||||||
(id = tên file; name từ .meta nếu có — cùng format PluginManager)."""
|
(id = tên file; name từ .meta nếu có — cùng format PluginManager)."""
|
||||||
|
|||||||
Reference in New Issue
Block a user