libfreemkv 0.3.1

Open source raw disc access library for optical drives
Documentation
//! libfreemkv — Open source optical drive library for 4K UHD / Blu-ray / DVD.
//!
//! Handles drive access, disc structure parsing, AACS decryption, and raw
//! sector reading. 206 bundled drive profiles. No external files needed.
//!
//! # Quick Start
//!
//! ```no_run
//! use libfreemkv::{DriveSession, Disc, ScanOptions};
//! use std::path::Path;
//!
//! let mut session = DriveSession::open(Path::new("/dev/sr0")).unwrap();
//! let disc = Disc::scan(&mut session, &ScanOptions::default()).unwrap();
//!
//! for title in &disc.titles {
//!     println!("{} — {} streams", title.duration_display(), title.streams.len());
//! }
//!
//! // Read content (decrypted automatically if AACS keys available)
//! let mut reader = disc.open_title(&mut session, 0).unwrap();
//! while let Some(unit) = reader.read_unit().unwrap() {
//!     // 6144 bytes of decrypted content per unit
//! }
//! ```
//!
//! # Architecture
//!
//! ```text
//! DriveSession           — open, identify, unlock, read sectors
//!   ├── ScsiTransport    — SG_IO (Linux), IOKit (macOS)
//!   ├── DriveProfile     — per-drive unlock parameters (206 bundled)
//!   ├── DriveId          — INQUIRY + GET_CONFIG identification
//!   └── Platform
//!       └── Mt1959       — MediaTek unlock/read (Renesas planned)
//!
//! Disc                   — scan titles, streams, AACS state
//!   ├── UDF reader       — Blu-ray UDF 2.50 with metadata partitions
//!   ├── MPLS parser      — playlists → titles + clips + STN streams
//!   ├── CLPI parser      — clip info → EP map → sector extents
//!   ├── JAR parser       — BD-J audio track labels
//!   └── AACS             — encryption: key resolution + content decrypt
//!       ├── aacs         — KEYDB, VUK, MKB, unit decrypt
//!       └── handshake    — SCSI auth, ECDH, bus key
//! ```
//!
//! # AACS Encryption
//!
//! Disc scanning automatically detects and handles AACS encryption.
//! If a KEYDB.cfg is available (via `ScanOptions` or standard paths),
//! the library resolves keys and decrypts content transparently.
//!
//! Supports AACS 1.0 (Blu-ray) and AACS 2.0 (UHD, with fallback).
//!
//! # Error Codes
//!
//! All errors are structured with numeric codes. No user-facing English
//! text — applications format their own messages.
//!
//! | Range | Category |
//! |-------|----------|
//! | E1xxx | Device errors (not found, permission) |
//! | E2xxx | Profile errors (unsupported drive) |
//! | E3xxx | Unlock errors (failed, signature) |
//! | E4xxx | SCSI errors (command failed, timeout) |
//! | E5xxx | I/O errors |
//! | E6xxx | Disc format errors |
//! | E7xxx | AACS errors |

pub mod error;
pub mod scsi;
pub mod profile;
pub mod platform;
pub mod drive;
pub mod identity;
pub mod speed;
pub mod udf;
pub mod mpls;
pub mod clpi;
pub mod disc;
pub mod jar;
pub mod aacs;

pub use error::{Error, Result};
pub use drive::DriveSession;
pub use identity::DriveId;
pub use profile::{DriveProfile, Chipset};
pub use platform::{Platform, DriveStatus};
pub use scsi::ScsiTransport;
pub use speed::DriveSpeed;
pub use disc::{Disc, Title, Stream, StreamKind, Codec, HdrFormat, ColorSpace,
               Extent, ContentReader, AacsState, KeySource, ScanOptions};