Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37910415
en ru br
Репозитории ALT

Группа :: Работа с файлами
Пакет: m4b-tool

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: 35f6fe997f0543d3f6ef6ca400738f94ff9c29ce.patch
Скачать


From 35f6fe997f0543d3f6ef6ca400738f94ff9c29ce Mon Sep 17 00:00:00 2001
From: andreas <andreas.schroden@gmail.com>
Date: Wed, 11 Sep 2019 07:23:13 +0200
Subject: [PATCH] fixed #47 - Merge fails with chapters shorter than 1 second
---
 src/library/M4bTool/Executables/Mp4info.php   | 29 ++++--
 .../M4bTool/Executables/Mp4infoTest.php       | 97 +++++++++++++++++++
 2 files changed, 117 insertions(+), 9 deletions(-)
 create mode 100644 tests/library/M4bTool/Executables/Mp4infoTest.php
diff --git a/src/library/M4bTool/Executables/Mp4info.php b/src/library/M4bTool/Executables/Mp4info.php
index 529e6fe..9a425e0 100644
--- a/src/library/M4bTool/Executables/Mp4info.php
+++ b/src/library/M4bTool/Executables/Mp4info.php
@@ -4,6 +4,7 @@
 namespace M4bTool\Executables;
 
 
+use Exception;
 use Sandreas\Time\TimeUnit;
 use SplFileInfo;
 use Symfony\Component\Console\Helper\ProcessHelper;
@@ -17,21 +18,31 @@ public function __construct($pathToBinary = "mp4info", ProcessHelper $processHel
         parent::__construct($pathToBinary, $processHelper, $output);
     }
 
+    /**
+     * @param SplFileInfo $file
+     * @return TimeUnit|null
+     * @throws Exception
+     */
     public function estimateDuration(SplFileInfo $file): ?TimeUnit
+    {
+        return $this->inspectExactDuration($file);
+    }
+
+
+    /**
+     * @param SplFileInfo $file
+     * @return TimeUnit|null
+     * @throws Exception
+     */
+    public function inspectExactDuration(SplFileInfo $file): ?TimeUnit
     {
         $process = $this->runProcess([$file]);
         $output = $process->getOutput() . $process->getErrorOutput();
-        preg_match("/([1-9][0-9]*\.[0-9]{3}) secs,/isU", $output, $matches);
+        preg_match("/([0-9]+\.[0-9]{3}) secs,/isU", $output, $matches);
         if (!isset($matches[1])) {
-            return null;
+            throw new Exception(sprintf("Could not detect length for file %s, output '%s' does not contain a valid length value", $file->getBasename(), $output));
         }
 
         return new TimeUnit($matches[1], TimeUnit::SECOND);
     }
-
-
-    public function inspectExactDuration(SplFileInfo $file): ?TimeUnit
-    {
-        return $this->estimateDuration($file);
-    }
-}
\ No newline at end of file
+}
diff --git a/tests/library/M4bTool/Executables/Mp4infoTest.php b/tests/library/M4bTool/Executables/Mp4infoTest.php
new file mode 100644
index 0000000..93ceb04
--- /dev/null
+++ b/tests/library/M4bTool/Executables/Mp4infoTest.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace M4bTool\Executables;
+
+use Exception;
+use PHPUnit\Framework\TestCase;
+
+use Mockery as m;
+use SplFileInfo;
+use Symfony\Component\Console\Helper\ProcessHelper;
+use Symfony\Component\Process\Process;
+
+class Mp4infoTest extends TestCase
+{
+    const SAMPLE_OUTPUT = <<<EOT
+Track   Type    Info
+1       audio   MPEG-4 AAC LC, 640.684 secs, 32 kbps, 44100 Hz
+2       text
+ Name: My Name
+ Artist: My Artist
+EOT;
+
+    const SAMPLE_OUTPUT_SHORT_LENGTH = <<<EOT
+Track   Type    Info
+1       audio   MPEG-4 AAC LC, 0.684 secs, 32 kbps, 44100 Hz
+2       text
+ Name: My Name
+ Artist: My Artist
+EOT;
+
+    /**
+     * @var Mp4info
+     */
+    protected $subject;
+    /**
+     * @var ProcessHelper|m\MockInterface
+     */
+    protected $mockProcessHelper;
+    /**
+     * @var m\MockInterface
+     */
+    protected $mockProcess;
+    /**
+     * @var SplFileInfo
+     */
+    protected $mockFile;
+
+    public function setUp()
+    {
+        $this->mockProcess = m::mock(Process::class);
+        $this->mockProcess->shouldReceive('getErrorOutput')->andReturn("");
+        $this->mockProcess->shouldReceive('stop');
+
+        $this->mockFile = new SplFileInfo(__FILE__);
+        /** @var ProcessHelper|m\MockInterface $mockProcessHelper */
+        $mockProcessHelper = m::mock(ProcessHelper::class);
+        $mockProcessHelper->shouldReceive('run')->once()->andReturn($this->mockProcess);
+
+        $this->subject = new Mp4info("mp4info", $mockProcessHelper);
+    }
+
+    /**
+     * @throws Exception
+     */
+    public function testInspectDuration()
+    {
+        $this->mockProcess->shouldReceive("getOutput")->andReturn(static::SAMPLE_OUTPUT);
+        $timeUnit = $this->subject->estimateDuration($this->mockFile);
+        $this->assertEquals(640684, $timeUnit->milliseconds());
+
+        $timeUnitExact = $this->subject->inspectExactDuration($this->mockFile);
+        $this->assertEquals(640684, $timeUnitExact->milliseconds());
+    }
+
+    /**
+     * @throws Exception
+     */
+    public function testInspectDurationWithShortLength()
+    {
+        $this->mockProcess->shouldReceive("getOutput")->andReturn(static::SAMPLE_OUTPUT_SHORT_LENGTH);
+        $timeUnit = $this->subject->estimateDuration($this->mockFile);
+        $this->assertEquals(684, $timeUnit->milliseconds());
+
+        $timeUnitExact = $this->subject->inspectExactDuration($this->mockFile);
+        $this->assertEquals(684, $timeUnitExact->milliseconds());
+    }
+
+    /**
+     * @expectedException Exception
+     * @expectedExceptionMessage Could not detect length for file Mp4infoTest.php, output '' does not contain a valid length value
+     */
+    public function testInspectExactDurationException()
+    {
+        $this->mockProcess->shouldReceive("getOutput")->andReturn("");
+        $this->subject->estimateDuration($this->mockFile);
+    }
+}
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin