infureal/php-ass

用于读取高级Sub Station Alpha字幕文件的库

v1.1 2020-10-15 22:52 UTC

This package is auto-updated.

Last update: 2024-09-16 07:08:14 UTC


README

用于读取高级Substation Alpha字幕文件的库。

规范

ASS文件规范分散在不同的地方

  1. 维基百科有很好的概述
  2. 原始格式在Microsoft Word .doc格式中
  3. 文件如何被整合到Matroska (MKV) 文件中

简而言之:ASS文件是原始SSA(Sub Station Alpha)字幕文件的高级版本,在样式和效果方面包含几个改进。

有效的脚本文件以[Script Info]开始,并包含多个以INI风格格式编写的部分。

快速开始

使用composer安装

composer require chaostangent/php-ass

然后开始使用

require __DIR__.'/vendor/autoload.php';

use ChaosTangent\ASS\Reader;

$reader = new Reader();
$script = $reader->fromFile(__DIR__.'/examples/example.ass');

foreach ($script as $block) {
    echo $block->getId().PHP_EOL;

    foreach ($block as $line) {
        echo $line->getKey().': '.$line->getValue();
    }
}

部分

脚本

ChaosTangent\ASS\Script 类代表ASS脚本的根对象。

您可以使用脚本的内容以及可选的文件名来实例化一个 Script

$script = new Script('[Script Info]', 'mytestscript.ass');

一旦实例化,您就可以检查传递的内容是否看起来像有效的ASS脚本

if ($script->isASSScript()) {
    // do more processing
}

这仅检查前几个字节中的"[Script Info]"字符串,不能保证传递的脚本有效或可读。

要解析传递的脚本

$script->parse();

这将遍历创建脚本时传递的内容,并将其解析为块和行。

要获取当前块集合,您可以调用 getBlocks() 或将脚本视为迭代器

foreach ($script as $block) {
    // block processing
}

要检查脚本是否有块

if ($script->hasBlock('Script Info')) {
    $script->getBlock('Script Info');
}

每个ASS脚本都由几个不同的块组成。 ChaosTangent\ASS\Block\Block 抽象类代表这些块之一。

目前php-ass支持以下块

解析时,任何其他类型的块(例如“Aegisub Project Garbage”,“字体”)都将被静默忽略。

ScriptInfo 块提供了对常用字段的函数

$scriptInfoBlock->getTitle();
$scriptInfoBlock->getWrapStyle();
$scriptInfoBlock->getScriptType();

否则,您只需将块视为行的容器。您可以使用数组访问来获取特定的行

$scriptInfoBlock[123]; // line 124 of this block

或将块视为迭代器

foreach ($scriptInfoBlock as $line) {
    // line processing
}

行是脚本文件的核心。任何非注释行(不要与注释事件行混淆)都使用基类 ChaosTangent\ASS\Line\Line

某些块中的行根据特殊的“格式”行进行映射。这些由 ChaosTangent\ASS\Line\Format 表示。格式行有一个特殊的 getMapping() 方法,该方法返回一个可以用于解析其他行的数组。

如果这一切听起来有点复杂,您大多数时候不必担心,因为解析文件时一切都会为您处理。这意味着对于对话和样式行,您可以使用方法来获取不同的部分

$styleLine->getName();
$styleLine->getPrimaryColour();
$dialogueLine->getLayer();
$dialogueLine->getText();

对话行还有一个额外的方法来获取没有样式覆盖代码的行的文本

$dialogueLine->getTextWithoutStyleOverrides();

对于所有行,您可以使用通用的 getKey()getValue() 方法,这些方法将返回行的键(例如,“Dialogue”,“Format”,“Style”)和未解析的值。

$dialogueLine->getKey(); // == 'Dialogue'
$dialogueLine->getValue(); // e.g. 0,0:00:00.98,0:00:05.43,ED_English,,0,0,0,,{\fad(100,200)\blur5\c&H000010&\3c&H80A0C0&}My destiny,

如果您只想获取特定类型的行,只需在迭代时进行 instanceof 检查即可。

foreach ($block as $line) {
    if ($line instanceof Dialogue) {
        echo $line->getTextWithoutStyleOverrides().PHP_EOL;
    }
}

测试

这个库有一个不断增长的测试套件,您可以使用 phpunit 来验证。任何古怪或已知的损坏脚本都将是受欢迎的补充。

待办事项

  • 允许读取嵌入的信息(图像、字体等)。
  • 允许构建和写入 ASS 文件。
  • 更多行类型支持。
  • 更多块类型支持。
  • 测试完成。