Skip to content

indy2kro/php-iso

Folders and files

NameName
Last commit message
Last commit date

Latest commit

e070ac4 · Jan 17, 2025

History

51 Commits
Jan 15, 2025
Jan 17, 2025
Jan 16, 2025
Jan 17, 2025
Jan 16, 2025
Jan 12, 2025
Jan 12, 2025
Jan 13, 2025
Jan 12, 2025
Jan 17, 2025
Jan 13, 2025
Jan 17, 2025
Jan 17, 2025
Jan 12, 2025
Jan 12, 2025
Jan 15, 2025
Jan 12, 2025
Jan 12, 2025

Repository files navigation

PHP ISO Library

codecov Tests

PHP Library used to read metadata from ISO files based on php-iso-file

This library follows the ISO 9660 / ECMA-119 standard.

Basic concepts

  • IsoFile - main ISO file object, contains one more descriptors
  • Descriptor - descriptor object which can have one of the following types defined in Type class:
    • BOOT_RECORD_DESC : Boot object
    • PRIMARY_VOLUME_DESC : PrimaryVolume object
    • SUPPLEMENTARY_VOLUME_DESC : SupplementaryVolume object
    • PARTITION_VOLUME_DESC : Partition object
    • TERMINATOR_DESC : Terminator object
    • upon initialization of the IsoFile object, the descriptors will be populated automatically
  • Volume descriptors contain path table inside which can be loaded using loadTable
    • PathTableRecord - object which contains the record information for a file/directory
  • Each class contains various properties which can be used to interact with them, most of them public

Known limitations

  • ISO extensions currently not supported:
    • El Torito
    • Joliet
    • Rock Ridge
  • UDF file format not supported
  • Reading metadata requires manually processing the descriptors
    • Some Iterator implementation would be nice to have

Installation

This class can easily be installed via Composer:
composer require indy2kro/php-iso

CLI tool

This tool also provides a CLI tool that can be used to view information about ISO files - bin\isotool:

Description:
  Tool to process ISO files

Usage:
  isotool --file=<path>

Options:
  -f, --file              Path for the ISO file (mandatory)

Sample usage:

Input ISO file: fixtures/1mb.iso

Number of descriptors: 3
  - Primary volume descriptor
   - System ID: Win32
   - Volume ID: 25_12_2024
   - App ID: PowerISO
   - Volume Space Size: 542
   - Volume Set Size: 1
   - Volume SeqNum: 1
   - Block size: 2048
   - Volume Set ID: 
   - Publisher ID: 
   - Preparer ID: 
   - Copyright File ID: 
   - Abstract File ID: 
   - Bibliographic File ID: 
   - Creation Date: 2024-12-25 14:01:20
   - Modification Date: 2024-12-25 14:01:20
   - Expiration Date: 
   - Effective Date: 
   - Files:
.
..
1MB.PNG

  - Supplementary volume descriptor
   - System ID: Win32
   - Volume ID: 25_12_2024
   - App ID: PowerISO
   - Volume Space Size: 542
   - Volume Set Size: 1
   - Volume SeqNum: 1
   - Block size: 2048
   - Volume Set ID: 
   - Publisher ID: 
   - Preparer ID: 
   - Copyright File ID: ?
   - Abstract File ID: ?
   - Bibliographic File ID: ?
   - Creation Date: 2024-12-25 14:01:20
   - Modification Date: 2024-12-25 14:01:20
   - Expiration Date: 
   - Effective Date: 
   - Files:
.
..
1mb.png

  - Terminator descriptor

Usage

<?php

use PhpIso\IsoFile;
use PhpIso\Descriptor\Type;
use PhpIso\Descriptor\PrimaryVolume;
use PhpIso\FileDirectory;
use PhpIso\PathTableRecord;

$isoFilePath = 'test.iso';

$isoFile = new IsoFile($isoFilePath);

// you can process each descriptor using $isoFile->descriptors directly

/** @var PrimaryVolume $primaryVolumeDescriptor */
$primaryVolumeDescriptor = $isoFile->descriptors[Type::PRIMARY_VOLUME_DESC];

// get the path table
$pathTable = $primaryVolumeDescriptor->loadTable($isoFile);

$paths = [];

/** @var PathTableRecord $pathRecord */
foreach ($pathTable as $pathRecord) {
    $currentPath = $pathRecord->getFullPath($pathTable);

    $paths[$currentPath] = [];

    // check extents
    $extents = $pathRecord->loadExtents($isoFile, $primaryVolumeDescriptor->blockSize);

    if ($extents !== false) {
        /** @var FileDirectory $extentRecord */
        foreach ($extents as $extentRecord) {
            $path = $extentRecord->fileId;
            if ($extentRecord->isDirectory()) {
                $path .= '/';
            }
            $paths[$currentPath][] = $path;
        }
    }
}

print_r($paths);