mirror of
https://github.com/barkeser2002/VMD-Motion-Optimizer.git
synced 2026-09-25 01:50:14 +03:00
build_exe.ps1 hiç çalışmıyordu. PowerShell, native bir çalıştırılabiliri çağırırken STRING değişkenleri kelime kelime ayırmaz; her değişken tek bir argüman olur. PyInstaller "--noconfirm --clean --name VMDOptimizer" ifadesini tek argüman olarak alıp "unrecognized arguments" ile çıkıyordu. Doğrulandı: eski biçim 2 argüman, dizi + @ splat 6 argüman gönderiyor. release.yml zaten doğru biçimi kullanıyordu; betik artık onunla aynı. Ayrıca $PSScriptRoot'a geçiliyor ve $LASTEXITCODE kontrol ediliyor. pyinstaller ve pytest requirements-dev.txt'ye taşındı - bir CLI kullanıcısı requirements.txt için ~30 MB derleme aracı indirmemeli. peek_bytes.py: argüman yoksa IndexError traceback'i yerine kullanım mesajı, ve VMD 1.0 dosyalarında doğru ofsetler (önceden v2 düzenini varsayıp yanlış bone_count yazdırıyordu).
69 lines
1.8 KiB
Python
69 lines
1.8 KiB
Python
# VMD Motion Optimizer by Barış Keser (barkeser2002)
|
||
# License: GNU General Public License v3.0 (GPL-3.0)
|
||
# See LICENSE for details.
|
||
|
||
"""VMD başlığını incelemek için küçük bir teşhis aracı.
|
||
|
||
Kullanım: python scripts/peek_bytes.py <dosya.vmd> [ofset] [uzunluk]
|
||
"""
|
||
|
||
import binascii
|
||
import struct
|
||
import sys
|
||
|
||
SIG_V2 = b"Vocaloid Motion Data 0002"
|
||
SIG_V1 = b"Vocaloid Motion Data file"
|
||
|
||
|
||
def main() -> int:
|
||
if len(sys.argv) < 2:
|
||
print(__doc__.strip(), file=sys.stderr)
|
||
return 2
|
||
|
||
path = sys.argv[1]
|
||
try:
|
||
start = int(sys.argv[2]) if len(sys.argv) > 2 else 0
|
||
n = int(sys.argv[3]) if len(sys.argv) > 3 else 256
|
||
except ValueError:
|
||
print("ofset ve uzunluk tam sayı olmalı", file=sys.stderr)
|
||
return 2
|
||
|
||
try:
|
||
with open(path, 'rb') as f:
|
||
f.seek(start)
|
||
data = f.read(n)
|
||
except OSError as e:
|
||
print(f"Okunamadı: {e}", file=sys.stderr)
|
||
return 1
|
||
|
||
print('offset', start, 'len', len(data))
|
||
print('hex', binascii.hexlify(data))
|
||
|
||
if start != 0:
|
||
return 0
|
||
|
||
if data.startswith(SIG_V2):
|
||
# v2: 30 bayt imza alanı + 20 bayt model adı -> kemik sayısı 50'de
|
||
name_len, name_off = 20, 30
|
||
print('version', 2)
|
||
elif data.startswith(SIG_V1):
|
||
# v1 model adı alanı 10 bayttır; her şey 10 bayt kayar
|
||
name_len, name_off = 10, 30
|
||
print('version', 1)
|
||
else:
|
||
print('bilinmeyen imza:', data[:30])
|
||
return 0
|
||
|
||
count_off = name_off + name_len
|
||
print('first30', data[:30])
|
||
print(f'name{name_len}', data[name_off:count_off])
|
||
if len(data) >= count_off + 4:
|
||
print('bone_count_le', struct.unpack('<I', data[count_off:count_off + 4])[0])
|
||
else:
|
||
print('bone_count_le okunamadı (yeterli bayt yok)')
|
||
return 0
|
||
|
||
|
||
if __name__ == '__main__':
|
||
sys.exit(main())
|