Selaa lähdekoodia

Add basic whipper support

tags/v0.7.0
itismadness 6 vuotta sitten
vanhempi
commit
5332ab5bbd
6 muutettua tiedostoa jossa 397 lisäystä ja 130 poistoa
  1. +61
    -5
      README.md
  2. +1
    -0
      composer.json
  3. +16
    -15
      composer.lock
  4. +58
    -0
      src/Command/AnalyzeCommand.php
  5. +213
    -62
      src/Logchecker.php
  6. +48
    -48
      src/eac_languages.php

+ 61
- 5
README.md Näytä tiedosto

@@ -16,13 +16,69 @@ setting up the necessary programs to validate the checksum, see below for the gi
## Requirements
* PHP 7.0+
* Python3.4+
* chardet
* eac_logchecker.py
* xld_logchecker.py
* [chardet](https://github.com/chardet/chardet)
* [eac_logchecker.py](https://github.com/OPSnet/eac_logchecker.py)
* [xld_logchecker.py](https://github.com/OPSnet/xld_logchecker.py)

## Installation
```
$ composer require orpheusnet/logchecker
$ pip3 install chardet
$ pip3 install eac-logchecker
$ pip3 install chardet eac-logchecker xld-logchecker
```

## Usage
### CLI
```
$ logchecker list
Logchecker by Orpheus 0.5.0

Usage:
command [options] [arguments]

Options:
-h, --help Display this help message
-V, --version Display this application version

Available commands:
analyze analyze log file
help Displays help for a command
list Lists commands

$ logchecker analyze --help
Description:
analyze log file

Usage:
analyze [options] [--] <file>

Arguments:
file Log file to analyze

Options:
--output Print the HTML log text
-h, --help Display this help message

Help:
This command analyzes a log file

$ logchecker analyze tests/logs/wgdbcm.log
Score : 57
Checksum: false
Details :
[Notice] Translated log from Русский (Russian) to English.
EAC version older than 0.99 (-30 points)
Could not verify read mode (-1 point)
Could not verify read offset (-1 point)
Could not verify null samples
Could not verify gap handling (-10 points)
Could not verify id3 tag setting (-1 point)
```

### Code
```
<?php

$logchecker = new OrpheusNET\Logchecker\Logchecker();
$logchecker->add_file('path/to/file.log');
list($score, $details, $checksum, $log_text) = $logchecker->parse();
```

+ 1
- 0
composer.json Näytä tiedosto

@@ -18,6 +18,7 @@
"require": {
"php": ">=7",
"ext-mbstring": "*",
"ext-yaml": "*",
"symfony/console": "^4.1"
},
"require-dev": {


+ 16
- 15
composer.lock Näytä tiedosto

@@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "2a366400c7ef056c432e0380c4b48f5e",
"content-hash": "fa52b95b461ba9af6f89994e631f51e4",
"packages": [
{
"name": "symfony/console",
"version": "v4.1.7",
"version": "v4.1.8",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "432122af37d8cd52fba1b294b11976e0d20df595"
"reference": "c74f4d1988dfcd8760273e53551694da32b056d0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/432122af37d8cd52fba1b294b11976e0d20df595",
"reference": "432122af37d8cd52fba1b294b11976e0d20df595",
"url": "https://api.github.com/repos/symfony/console/zipball/c74f4d1988dfcd8760273e53551694da32b056d0",
"reference": "c74f4d1988dfcd8760273e53551694da32b056d0",
"shasum": ""
},
"require": {
@@ -72,7 +72,7 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
"time": "2018-10-31T09:30:44+00:00"
"time": "2018-11-26T14:00:40+00:00"
},
{
"name": "symfony/polyfill-mbstring",
@@ -1057,28 +1057,28 @@
},
{
"name": "sebastian/environment",
"version": "3.1.0",
"version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
"reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5"
"reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
"reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/febd209a219cea7b56ad799b30ebbea34b71eb8f",
"reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f",
"shasum": ""
},
"require": {
"php": "^7.0"
"php": "^7.1"
},
"require-dev": {
"phpunit/phpunit": "^6.1"
"phpunit/phpunit": "^7.4"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.1.x-dev"
"dev-master": "4.0-dev"
}
},
"autoload": {
@@ -1103,7 +1103,7 @@
"environment",
"hhvm"
],
"time": "2017-07-01T08:51:00+00:00"
"time": "2018-11-25T09:31:21+00:00"
},
{
"name": "sebastian/exporter",
@@ -1551,7 +1551,8 @@
"prefer-lowest": false,
"platform": {
"php": ">=7",
"ext-mbstring": "*"
"ext-mbstring": "*",
"ext-yaml": "*"
},
"platform-dev": []
}

+ 58
- 0
src/Command/AnalyzeCommand.php Näytä tiedosto

@@ -14,6 +14,7 @@ class AnalyzeCommand extends Command {
->setDescription('analyze log file')
->setHelp('This command analyzes a log file')
->addOption('output', null, InputOption::VALUE_NONE, 'Print the HTML log text')
->addOption('out', 'file', InputOption::VALUE_REQUIRED, 'File to write HTML log text to')
->addArgument('file', InputArgument::REQUIRED, 'Log file to analyze');
}

@@ -42,5 +43,62 @@ class AnalyzeCommand extends Command {
$output->writeln('Log Text:');
$output->writeln($log_text);
}

if ($input->getOption('out')) {
$html_out = <<<HTML
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test</title>
<meta charset="utf-8"/>
<style>
.log1 {

}

.log2 {
color: yellow;
}

.log3 {
color: #0E88C6;
}

.log4 {
font-weight: bold;
}

.log5 {
text-decoration: underline;
}

.good {
font-weight: bold;
color: green;
}

.bad {
font-weight: bold;
color: red;
}

.goodish {
font-weight: bold;
color: #35BF00;
}

.badish {
font-weight: bold;
color: #E5B244;
}
</style>
</head>
<body>
<pre>{$log_text}</pre>
</body>
</html>
HTML;
file_put_contents($input->getOption('out'), $html_out);
}
}
}

+ 213
- 62
src/Logchecker.php Näytä tiedosto

@@ -42,10 +42,13 @@ class Logchecker {
var $DubiousTracks = 0;
var $EAC_LANG = array();
var $Chardet = null;
var $FakeDrives = [
'Generic DVD-ROM SCSI CdRom Device'
];

var $ValidateChecksum = true;

function __construct() {
public function __construct() {
$this->EAC_LANG = require_once(__DIR__ . '/eac_languages.php');
try {
$this->Chardet = new Chardet();
@@ -58,6 +61,10 @@ class Logchecker {
$this->AllDrives = array_map(function($elem) { return explode(',', $elem); }, file(__DIR__.'/offsets.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
}

public function get_log() {
return $this->Log;
}

/**
* @param string $LogPath path to log file on local filesystem
*/
@@ -65,31 +72,6 @@ class Logchecker {
$this->reset();
$this->LogPath = $LogPath;
$this->Log = file_get_contents($this->LogPath);

// To parse the log, we want to deal with the log in UTF-8. EAC by default should
// always output to UTF-16 and XLD to UTF-8, but sometimes people view the log and
// re-encode them to something else (like Windows-1251), and we need to use chardet
// to detect this so we can then convert it to UTF-8.
if (ord($this->Log[0]) . ord($this->Log[1]) == 0xFF . 0xFE) {
$this->Log = mb_convert_encoding(substr($this->Log, 2), 'UTF-8', 'UTF-16LE');
}
elseif (ord($this->Log[0]) . ord($this->Log[1]) == 0xFE . 0xFF) {
$this->Log = mb_convert_encoding(substr($this->Log, 2), 'UTF-8', 'UTF-16BE');
}
elseif (ord($this->Log[0]) == 0xEF && ord($this->Log[1]) == 0xBB && ord($this->Log[2]) == 0xBF) {
$this->Log = substr($this->Log, 3);
}
elseif ($this->Chardet !== null) {
try {
$Results = $this->Chardet->analyze($this->LogPath);
if ($Results['charset'] !== 'utf-8' && $Results['confidence'] > 0.7) {
$this->Log = mb_convert_encoding($this->Log, 'UTF-8', $Results['charset']);
}
}
catch (\Exception $exc) {
$this->account('chardet failed to analyze log encoding', false, false, false, true);
}
}
}

function reset() {
@@ -130,10 +112,179 @@ class Logchecker {
$this->ValidateChecksum = $Bool;
}

private function convert_encoding() {
// To parse the log, we want to deal with the log in UTF-8. EAC by default should
// always output to UTF-16 and XLD to UTF-8, but sometimes people view the log and
// re-encode them to something else (like Windows-1251), and we need to use chardet
// to detect this so we can then convert it to UTF-8.
if (ord($this->Log[0]) . ord($this->Log[1]) == 0xFF . 0xFE) {
$this->Log = mb_convert_encoding(substr($this->Log, 2), 'UTF-8', 'UTF-16LE');
}
elseif (ord($this->Log[0]) . ord($this->Log[1]) == 0xFE . 0xFF) {
$this->Log = mb_convert_encoding(substr($this->Log, 2), 'UTF-8', 'UTF-16BE');
}
elseif (ord($this->Log[0]) == 0xEF && ord($this->Log[1]) == 0xBB && ord($this->Log[2]) == 0xBF) {
$this->Log = substr($this->Log, 3);
}
elseif ($this->Chardet !== null) {
$Results = $this->Chardet->analyze($this->LogPath);
if ($Results['charset'] !== 'utf-8' && $Results['confidence'] > 0.7) {
$this->Log = mb_convert_encoding($this->Log, 'UTF-8', $Results['charset']);
}
}
}

/**
* @return array Returns an array that contains [Score, Details, Checksum, Log]
*/
function parse() {
try {
$this->convert_encoding();
}
catch (\Exception $exc) {
$this->Checksum = false;
$this->Score = 0;
$this->account('Could not detect log encoding, log is corrupt.');
return $this->return_parse();
}
if (strpos($this->Log, "Log created by: whipper") !== false) {
return $this->whipper_parse();
}
else {
return $this->legacy_parse();
}
}

private function whipper_parse() {
$Yaml = @yaml_parse($this->Log);
if ($Yaml === false) {
$this->Score = 0;
$this->account('Could not parse whipper log.');
}

if (!empty($Yaml['SHA-256 hash'])) {
$Hash = $Yaml['SHA-256 hash'];
$lines = explode("\n", trim($this->Log));
$Slice = array_slice($lines, 0, count($lines)-1);
$this->Checksum = strtolower(hash('sha256', implode("\n", $Slice))) === strtolower($Hash);
$Class = $this->Checksum ? 'good' : 'bad';
$Yaml['SHA-256 hash'] = "<span class='{$Class}'>{$Hash}</span>";
}
else {
$this->Checksum = false;
}
$Drive = $Yaml['Ripping phase information']['Drive'];
$Offset = $Yaml['Ripping phase information']['Read offset correction'];

if (in_array(trim($Drive), $this->FakeDrives)) {
$this->account('Virtual drive used: ' . $Drive, 20, false, false, false, 20);
$Yaml['Ripping phase information']['Drive'] = "<span class='bad'>{$Drive}</span>";
}
else {
$this->get_drives($Drive);

$DriveClass = 'badish';
if (count($this->Drives) > 0) {
$DriveClass = 'good';
if (in_array((string) $Offset, $this->Offsets)) {
$OffsetClass = 'good';
}
else {
$OffsetClass = 'bad';
$this->account('Incorrect read offset for drive. Correct offsets are: ' . implode(', ', $this->Offsets) . ' (Checked against the following drive(s): ' . implode(', ', $this->Drives) . ')', 5, false, false, false, 5);
}
}
else {
$Drive .= ' (not found in database)';
$OffsetClass = 'badish';
if ($Offset === '0') {
$OffsetClass = 'bad';
$this->account('The drive was not found in the database, so we cannot determine the correct read offset. However, the read offset in this case was 0, which is almost never correct. As such, we are assuming that the offset is incorrect', 5, false, false, false, 5);
}
}
$Yaml['Ripping phase information']['Drive'] = "<span class='{$DriveClass}'>{$Drive}</span>";
$Offset = ($Offset > 0) ? '+' . (string) $Offset : (string) $Offset;
$Yaml['Ripping phase information']['Read offset correction'] = "<span class='{$OffsetClass}'>{$Offset}</span>";
}

$DefeatCache = $Yaml['Ripping phase information']['Defeat audio cache'];
if ($DefeatCache) {
$Value = 'Yes';
$Class = 'good';
}
else {
$Value = 'No';
$Class = 'bad';
$this->account('"Defeat audio cache" should be yes', 10);
}
$Yaml['Ripping phase information']['Defeat audio cache'] = "<span class='{$Class}'>{$Value}</span>";

foreach ($Yaml['Tracks'] as $Key => $Track) {
$Class = 'good';
if ($Track['Test CRC'] !== $Track['Copy CRC']) {
$Class = 'bad';
$this->account("CRC mismatch: {$Track['Test CRC']} and {$Track['Copy CRC']}", 30);
}

$Yaml['Tracks'][$Key]['Test CRC'] = "<span class='{$Class}'>{$Track['Test CRC']}</span>";
$Yaml['Tracks'][$Key]['Copy CRC'] = "<span class='{$Class}'>{$Track['Copy CRC']}</span>";
}

$this->Log = "Log created by: {$Yaml['Log created by']}\nLog creation date: {$Yaml['Log creation date']}\n\n";
$this->Log .= "Ripping phase information:\n";
foreach ($Yaml['Ripping phase information'] as $Key => $Value) {
$this->Log .= " {$Key}: {$Value}\n";
}
$this->Log .= "\n";

$this->Log .= "CD metadata:\n";
foreach ($Yaml['CD metadata'] as $Key => $Value) {
$this->Log .= " {$Key}: {$Value}\n";
}
$this->Log .= "\n";

$this->Log .= "TOC:\n";
foreach ($Yaml['TOC'] as $Key => $Track) {
$this->Log .= " {$Key}:\n";
foreach ($Track as $KKey => $Value) {
$this->Log .= " {$KKey}: {$Value}\n";
}
$this->Log .= "\n";
}
$this->Log .= "\n";

$this->Log .= "Tracks:\n";
foreach ($Yaml['Tracks'] as $Key => $Track) {
$this->Log .= " {$Key}:\n";
foreach ($Track as $KKey => $Value) {
if (is_array($Value)) {
$this->Log .= " {$KKey}:\n";
foreach ($Value as $KKKey => $VValue) {
$this->Log .= " {$KKKey}: {$VValue}\n";
}
}
else {
$this->Log .= " {$KKey}: {$Value}\n";
}
}
$this->Log .= "\n";
}
$this->Log .= "\n";

$this->Log .= "Conclusive status report:\n";
foreach ($Yaml['Conclusive status report'] as $Key => $Value) {
$this->Log .= "{$Key}: {$Value}\n";
}
$this->Log .= "\n";
$this->Log .= "SHA-256 hash: {$Yaml['SHA-256 hash']}\n";
return $this->return_parse();

}

private function legacy_parse() {
foreach ($this->EAC_LANG as $Lang => $Dict) {
if ($Lang === 'en') {
continue;
@@ -256,30 +407,27 @@ class Logchecker {
$this->Details[] = "Unrecognized log file! Feel free to report for manual review.";
}
$this->Score = 0;
return $this->returnParse();
return $this->return_parse();
} else {
$this->RIPPER = ($EAC) ? "EAC" : "XLD";
}

if ($this->ValidateChecksum && $this->Checksum && !empty($this->LogPath)) {
if ($EAC) {
$CommandExists = Util::commandExists('eac_logchecker');
if ($CommandExists) {
$Out = shell_exec("eac_logchecker {$this->LogPath}");
$Strings = ['Log entry has no checksum!', 'Log entry was modified, checksum incorrect!'];
if (Util::strposArray($Out, $Strings) !== false || strpos($Out, 'Log entry is fine!') === false) {
$this->Checksum = false;
}
}
$Command = 'eac_logchecker';
$BadStrings = ['Log entry has no checksum!', 'Log entry was modified, checksum incorrect!'];
$GoodString = 'Log entry is fine!';
}
else {
$Exe = __DIR__ . '/logchecker/xld_logchecker';
if (file_exists($Exe)) {
$Out = shell_exec("{$Exe} {$this->LogPath}");
if (strpos($Out, "Malformed") !== false || strpos($Out, "OK") === false) {
$this->Checksum = false;
}
}
$Command = 'xld_logchecker';
$BadStrings = ['Malformed', 'Not a logfile'];
$GoodString = 'OK';
}

$CommandExists = Util::commandExists($Command);
$Out = shell_exec("{$Command} {$this->LogPath}");
if (Util::strposArray($Out, $BadStrings) !== false || strpos($Out, $GoodString) === false) {
$this->Checksum = false;
}
}

@@ -815,20 +963,32 @@ class Logchecker {
if ($this->Combined) {
array_unshift($this->Details, "Combined Log (" . $this->Combined . ")");
} //combined log msg
return $this->returnParse();
return $this->return_parse();
}
// Callback functions
function drive($Matches)
{
global $DB;
$FakeDrives = array(
'Generic DVD-ROM SCSI CdRom Device'
);
if (in_array(trim($Matches[2]), $FakeDrives)) {
if (in_array(trim($Matches[2]), $this->FakeDrives)) {
$this->account('Virtual drive used: ' . $Matches[2], 20, false, false, false, 20);
return "<span class=\"log5\">Used Drive$Matches[1]</span>: <span class=\"bad\">$Matches[2]</span>";
}
$DriveName = $Matches[2];

$this->get_drives($DriveName);

if (count($this->Drives) > 0) {
$Class = 'good';
$this->DriveFound = true;
} else {
$Class = 'badish';
$Matches[2] .= ' (not found in database)';
}
return "<span class=\"log5\">Used Drive$Matches[1]</span>: <span class=\"$Class\">$Matches[2]</span>";
}

private function get_drives($DriveName) {
// Necessary transformations to get what the drives report themselves to match up into
// what is from the AccurateRIP DB
$DriveName = str_replace('JLMS', 'Lite-ON', $DriveName);
$DriveName = preg_replace('/TSSTcorp(BD|CD|DVD)/', 'TSSTcorp \1', $DriveName);
$DriveName = preg_replace('/HL-DT-ST(BD|CD|DVD)/', 'HL-DT-ST \1', $DriveName);
@@ -860,18 +1020,9 @@ class Logchecker {
break;
}
}

if (count($this->Drives) > 0) {
$Class = 'good';
$this->DriveFound = true;
} else {
$Class = 'badish';
$Matches[2] .= ' (not found in database)';
}
return "<span class=\"log5\">Used Drive$Matches[1]</span>: <span class=\"$Class\">$Matches[2]</span>";
}
function media_type_xld($Matches)
{

function media_type_xld($Matches) {
// Pressed CD
if (trim($Matches[2]) == "Pressed CD") {
$Class = 'good';
@@ -1052,7 +1203,7 @@ class Logchecker {
$Class = 'badish';
}
}
return '<span class="log5">' . ($this->RIPPER == "DBPA" ? '' : 'Read offset correction') . $Matches[1] . '</span>: <span class="' . $Class . '">' . $Matches[2] . '</span>';
return '<span class="log5">Read offset correction' . $Matches[1] . '</span>: <span class="' . $Class . '">' . $Matches[2] . '</span>';
}
function fill_offset_samples($Matches)
{
@@ -1241,7 +1392,7 @@ class Logchecker {
$this->Details[] = "Invalid log, no tracks!";
}
$this->Score = 0;
return $this->returnParse();
return $this->return_parse();
}
}

@@ -1285,7 +1436,7 @@ class Logchecker {
$this->BadTrack[] = $Prepend . $Msg . $Append;
}

function returnParse() {
function return_parse() {
return array(
$this->Score,
$this->Details,


+ 48
- 48
src/eac_languages.php Näytä tiedosto

@@ -76,6 +76,9 @@ $EAC_LANG['en'] = array(
1223 => "Review Range",
1224 => "There were errors",
1225 => "End of status report",
1321 => "Not detected, thus appended to previous track",
1322 => "Appended to previous track",
1323 => "Appended to next track",
1325 => "Log checksum",
1226 => "Track",
1230 => "Index",
@@ -146,9 +149,6 @@ $EAC_LANG['en'] = array(
1309 => "Add ID3 tag",
1310 => "Sample format",
1320 => "Gap handling",
1321 => "Not detected, thus appended to previous track",
1322 => "Appended to previous track",
1323 => "Appended to next track",
1324 => "Left out",

81700 => "L3Enc MP3 Encoder & Compatible",
@@ -248,6 +248,9 @@ $EAC_LANG['ru'] = array(
1223 => "Просмотр диапазона",
1224 => "Были ошибки",
1225 => "Конец отчёта",
1321 => "Не обнаружено, добавлено к предыдущему треку",
1322 => "Добавлено к предыдущему треку",
1323 => "Добавлено к следующему треку",
1325 => "Контрольная сумма отчёта",
1226 => "Трек",
1230 => "Индекс",
@@ -321,9 +324,6 @@ $EAC_LANG['ru'] = array(
],
1310 => "Формат сэмплов",
1320 => "Обработка зазоров",
1321 => "Не обнаружено, добавлено к предыдущему треку",
1322 => "Добавлено к предыдущему треку",
1323 => "Добавлено к следующему треку",
1324 => "Исключено",

81700 => "MP3: L3Enc и совместимые",
@@ -424,6 +424,9 @@ $EAC_LANG['bg'] = array(
1223 => "Прегледай Диапазона",
1224 => "Има грешки",
1225 => "Край на отчета",
1321 => "Няма открити, прикачени към предишния трак",
1322 => "Прикачени към предишния трак",
1323 => "Прикачени към следващия Трак",
1325 => "Контролна сума от отчет",
1226 => "Трак",
1230 => "Индекс",
@@ -494,9 +497,6 @@ $EAC_LANG['bg'] = array(
1309 => "Добави ID3 таг",
1310 => "Дискретен формат",
1320 => "Управление на празнини",
1321 => "Няма открити, прикачени към предишния трак",
1322 => "Прикачени към предишния трак",
1323 => "Прикачени към следващия Трак",
1324 => "Извадени",

81700 => "L3Enc MP3 Енкодер & Съвместими",
@@ -592,6 +592,9 @@ $EAC_LANG['cs'] = array(
1223 => "Přehled rozsahu",
1224 => "Vyskytly se chyby",
1225 => "Konec protokolu",
1321 => "Nedetekovány - přidány k předchozí stopě",
1322 => "Přidány k předchozí stopě",
1323 => "Přidány k následující stopě",
1325 => "Kontrolní součet protokolu",
1226 => "Stopa",
1230 => "Index",
@@ -662,9 +665,6 @@ $EAC_LANG['cs'] = array(
1309 => "Přidat ID3 tag",
1310 => "Formát vzorkování",
1320 => "Nakládání s mezerami",
1321 => "Nedetekovány - přidány k předchozí stopě",
1322 => "Přidány k předchozí stopě",
1323 => "Přidány k následující stopě",
1324 => "Vynechány",

81700 => "L3Enc MP3 enkodér nebo kompatibilní",
@@ -762,6 +762,9 @@ $EAC_LANG['nl'] = array(
1223 => "Controleer bereik",
1224 => "Er zijn fouten",
1225 => "Einde status report",
1321 => "Niet herkend, daarom achter de volgende track bijgevoegd",
1322 => "Achter de volgende track bijgevoegd",
1323 => "Vóór de volgende track bijgevoegd",
1325 => "Log proefsom",
1226 => "Track",
1230 => "Index",
@@ -833,9 +836,6 @@ $EAC_LANG['nl'] = array(
1309 => "ID3 tag toevoegen",
1310 => "Sample formaat",
1320 => "Pauzebehandeling",
1321 => "Niet herkend, daarom achter de volgende track bijgevoegd",
1322 => "Achter de volgende track bijgevoegd",
1323 => "Vóór de volgende track bijgevoegd",
1324 => "Weggelaten",

81700 => "L3Enc MP3 Encoder & Compatibele",
@@ -933,6 +933,9 @@ $EAC_LANG['de'] = array(
1223 => "Überprüfe Bereich",
1224 => "Es sind Fehler aufgetreten",
1225 => "Ende des Statusreports",
1321 => "Nicht erkannt, daher hinter dem vorigen Track angehängt",
1322 => "Hinter dem vorigen Track angehängt",
1323 => "Vor dem folgenden Track angehängt",
1325 => "Report Prüfsumme",
1226 => "Track",
1230 => "Index",
@@ -1004,9 +1007,6 @@ $EAC_LANG['de'] = array(
1309 => "Füge ID3 Tag hinzu",
1310 => "Sampleformat",
1320 => "Pausenbehandlung",
1321 => "Nicht erkannt, daher hinter dem vorigen Track angehängt",
1322 => "Hinter dem vorigen Track angehängt",
1323 => "Vor dem folgenden Track angehängt",
1324 => "Weggelassen",

81700 => "L3Enc MP3 Komprimierer & Kompatible",
@@ -1104,6 +1104,9 @@ $EAC_LANG['it'] = array(
1223 => "Esamina Intervallo",
1224 => "Sono stati riscontrati errori",
1225 => "Fine del resoconto di stato",
1321 => "Non rilevato, così aggiunto a traccia precedente",
1322 => "Aggiunto a traccia precedente",
1323 => "Aggiunto a traccia successiva",
1325 => "Checksum del log",
1226 => "Traccia",
1230 => "Indice",
@@ -1174,9 +1177,6 @@ $EAC_LANG['it'] = array(
1309 => "Aggiungi tag ID3",
1310 => "Formato Sample",
1320 => "Gestione Gap",
1321 => "Non rilevato, così aggiunto a traccia precedente",
1322 => "Aggiunto a traccia precedente",
1323 => "Aggiunto a traccia successiva",
1324 => "Left out",

81700 => "Encoder MP3 L3Enc e compatibili",
@@ -1275,6 +1275,9 @@ $EAC_LANG['pl'] = array(
1223 => "Przeglądnij zakres",
1224 => "Były błędy",
1225 => "Koniec raportu",
1321 => "Nie wykryte, zatem dodawane do poprzedniego nagrania",
1322 => "Dodane do poprzedniego nagrania",
1323 => "Dodane do następnego nagrania",
1325 => "Suma kontrola sprawozdania",
1226 => "Nagranie",
1230 => "Indeks",
@@ -1345,9 +1348,6 @@ $EAC_LANG['pl'] = array(
1309 => "Dodawanie znaczników ID3",
1310 => "Format próbki",
1320 => "Przerwy",
1321 => "Nie wykryte, zatem dodawane do poprzedniego nagrania",
1322 => "Dodane do poprzedniego nagrania",
1323 => "Dodane do następnego nagrania",
1324 => "Pominięte",

81700 => "Koder MP3 L3Enc i zgodne",
@@ -1446,6 +1446,9 @@ $EAC_LANG['zh-Hans'] = array(
1223 => "重新检查范围",
1224 => "出现错误",
1225 => "状态报告结尾",
1321 => "没检测到,因此追加到上一曲目",
1322 => "追加到上一曲目",
1323 => "追加到下一曲目",
1325 => "记录校验日志",
1226 => "音轨",
1230 => "索引",
@@ -1516,9 +1519,6 @@ $EAC_LANG['zh-Hans'] = array(
1309 => "添加 ID3 标签",
1310 => "样本格式",
1320 => "间隙处理",
1321 => "没检测到,因此追加到上一曲目",
1322 => "追加到上一曲目",
1323 => "追加到下一曲目",
1324 => "忽略",

81700 => "L3Enc MP3 兼容编码器",
@@ -1617,6 +1617,9 @@ $EAC_LANG['sr'] = array(
1223 => "Preispitivanje opsega",
1224 => "Bilo je grešaka",
1225 => "Kraj statusnog izveštaja",
1321 => "Nije detektovano, stoga pripojeno prethodnom track-u",
1322 => "Pripojeno prethodnom track-u",
1323 => "Pripojeno sledećem track-u",
1325 => "Kontrolna suma log fajla",
1226 => "Track",
1230 => "Index",
@@ -1687,9 +1690,6 @@ $EAC_LANG['sr'] = array(
1309 => "Dodaj ID3 tag",
1310 => "Format sempla",
1320 => "Upravljanje pauzama",
1321 => "Nije detektovano, stoga pripojeno prethodnom track-u",
1322 => "Pripojeno prethodnom track-u",
1323 => "Pripojeno sledećem track-u",
1324 => "Izostavljeno",

81700 => "L3Enc MP3 Encoder & kompatibilni",
@@ -1786,6 +1786,9 @@ $EAC_LANG['se'] = [
1223 => "Review Range",
1224 => "There were errors",
1225 => "Slut pĺ status rapport",
1321 => "Ej pĺvisat, alltsĺ tillagt till föregĺende spĺr",
1322 => "Appended to previous track",
1323 => "Appended to next track",
1325 => "Log checksum",
1226 => "Track",
1230 => "Index",
@@ -1841,9 +1844,6 @@ $EAC_LANG['se'] = [
1309 => "Lägg till ID3 taggar",
1310 => "Sample format",
1320 => "Gap hantering",
1321 => "Ej pĺvisat, alltsĺ tillagt till föregĺende spĺr",
1322 => "Appended to previous track",
1323 => "Appended to next track",
1324 => "Left out",

81700 => "L3Enc MP3 Encoder & Compatible",
@@ -1960,6 +1960,9 @@ $EAC_LANG['sk'] = array(
1223 => "Prezretie rozsahu",
1224 => "Vyskytli sa chyby",
1225 => "Koniec stavovej správy",
1321 => "Nedetekované a pridané k predchádzajúcej stope",
1322 => "Pridané k predchádzajúcej stope",
1323 => "Pridané k nasledujúcej stope",
1325 => "Kontrolný súčet logu",
1226 => "Stopa",
1230 => "Index",
@@ -2030,9 +2033,6 @@ $EAC_LANG['sk'] = array(
1309 => "Pridať ID3 tag",
1310 => "Formát vzorkovania",
1320 => "Spracovnie medzier",
1321 => "Nedetekované a pridané k predchádzajúcej stope",
1322 => "Pridané k predchádzajúcej stope",
1323 => "Pridané k nasledujúcej stope",
1324 => "Vynechané",

81700 => "L3Enc MP3 kóder a kompatibilné",
@@ -2132,6 +2132,9 @@ $EAC_LANG['es'] = array(
1223 => "Ver gama",
1224 => "Hubo Errores",
1225 => "Final del Informe",
1321 => "No se detectó, por lo que anexa a la pista anterior",
1322 => "Anexada a la pista anterior",
1323 => "Anexada a la pista siguiente",
1325 => "Log checksum",
1226 => "Pista",
1230 => "Índice",
@@ -2202,9 +2205,6 @@ $EAC_LANG['es'] = array(
1309 => "Añadir ID3 tag",
1310 => "Formato de muestra",
1320 => "Manejo de huecos",
1321 => "No se detectó, por lo que anexa a la pista anterior",
1322 => "Anexada a la pista anterior",
1323 => "Anexada a la pista siguiente",
1324 => "Left out",

81700 => "Compresor MP3 L3Enc y Compatibles",
@@ -2302,6 +2302,9 @@ $EAC_LANG['sv'] = array(
1223 => "Granska Område",
1224 => "Det fanns fel",
1225 => "Slut på status rapport",
1321 => "Hittades inte, därigenom tillagt till föregående spår",
1322 => "Lägg till föregående spår",
1323 => "Lägg till nästa spår",
1325 => "Logg-kontrollsumma",
1226 => "Spår",
1230 => "Index",
@@ -2372,9 +2375,6 @@ $EAC_LANG['sv'] = array(
1309 => "Lägg till ID3 tag",
1310 => "Samplingsformat",
1320 => "Gap-hantering",
1321 => "Hittades inte, därigenom tillagt till föregående spår",
1322 => "Lägg till föregående spår",
1323 => "Lägg till nästa spår",
1324 => "Utelämnat",

81700 => "L3Enc MP3 Kodare & Kompatibla",
@@ -2472,6 +2472,9 @@ $EAC_LANG['fr'] = array(
1223 => "Revoir gamme",
1224 => "Il y avait des erreurs",
1225 => "Fin du rapport d'état",
1321 => "Non détecté, ajouté à la piste précédente",
1322 => "Ajouté à la piste précédente",
1323 => "Ajouté à la piste suivante",
1325 => "Checksum de log",
1226 => "Piste",
1230 => "Index",
@@ -2542,9 +2545,6 @@ $EAC_LANG['fr'] = array(
1309 => "Ajouter ID3 tag",
1310 => "Format d'échantillon",
1320 => "Traitement des intervalles",
1321 => "Non détecté, ajouté à la piste précédente",
1322 => "Ajouté à la piste précédente",
1323 => "Ajouté à la piste suivante",
1324 => "Exclu",

81700 => "Encodeur L3Enc MP3 & Compatible",
@@ -2780,6 +2780,9 @@ $EAC_LANG['jp99_5'] = array(
1223 => "選択範囲再調査",
1224 => "エラーがありました",
1225 => "ステータス報告完了",
1321 => "Not detected, thus appended to previous track",
1322 => "Appended to previous track",
1323 => "Appended to next track",
1325 => "Log checksum",
1226 => "トラック",
1230 => "インデックス",
@@ -2851,9 +2854,6 @@ $EAC_LANG['jp99_5'] = array(
1309 => "Add ID3 tag",
1310 => "サンプルフォーマット",
1320 => "Gap handling",
1321 => "Not detected, thus appended to previous track",
1322 => "Appended to previous track",
1323 => "Appended to next track",
1324 => "Left out",

81700 => "L3Enc MP3 Encoder & Compatible",


Ladataan…
Peruuta
Tallenna