Files
Barış Keser 2a1eecf1e0 Derleme betiklerini onar ve bağımlılıkları ayır
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).
2026-08-03 10:12:54 +03:00

69 lines
1.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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())