#!/usr/bin/env python3
"""cd_probe.py —— 用 READ CD(0xBE) 原始读取若干个 LBA，判断介质是否存在、可读、盘类型
用法: sudo python3 cd_probe.py [/dev/sr0]
"""
import os, sys
sys.path.insert(0, "/home/zyw/Downloads/vcd-rip")
from sgio import read_cd, sense_str

DEV = sys.argv[1] if len(sys.argv) > 1 else "/dev/sr0"
fd = os.open(DEV, os.O_RDONLY | os.O_NONBLOCK)
try:
    probes = [0, 16, 32, 100, 1000, 5000, 20000, 50000, 100000]
    print(f"{'LBA':>8}  {'结果':<28}{'前 16 字节 hex':<40}判读")
    ok = 0
    for lba in probes:
        try:
            data, info = read_cd(fd, lba, 1, flags=0xF8)
        except OSError as e:
            print(f"{lba:>8}  OSError: {e}")
            continue
        if info["status"] == 0 and data and len(data) >= 2352:
            head = data[:16]
            # Mode 1 数据扇区: 00 FF*10 00 + MSF + mode(1)；Mode2: ... mode(2)
            mode = data[15]
            cmd = data[24:28]  # XA subheader 第 4 字节附近
            kind = {1: "Mode1 数据", 2: "Mode2（VCD/XA）"}.get(mode, f"mode={mode}")
            sync_ok = data[0] == 0 and data[1:11] == b"\xff" * 10
            print(f"{lba:>8}  OK {info['got']}B                 {head.hex():<40}{kind}{'' if sync_ok else ' ⚠️同步头异常'}")
            ok += 1
        else:
            print(f"{lba:>8}  FAIL status={info['status']} {info['sense']}")
    print(f"\n可读扇区: {ok}/{len(probes)}")
    if ok == 0:
        print("→ 介质不可读或不在位")
    else:
        print("→ 介质在位且可用 READ CD(0xBE) 读取（内核 READ(10) 会报 Illegal mode）")
finally:
    os.close(fd)
