wip: pauses downloads
This commit is contained in:
@@ -7,12 +7,14 @@ use App\Monitor\Service\MediaFiles;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Component\Process\Exception\ProcessFailedException;
|
||||
use Symfony\Component\Process\Process;
|
||||
use Symfony\Contracts\Cache\CacheInterface;
|
||||
|
||||
class ProcessDownloader implements DownloaderInterface
|
||||
{
|
||||
public function __construct(
|
||||
private EntityManagerInterface $entityManager,
|
||||
private MediaFiles $mediaFiles,
|
||||
private CacheInterface $cache,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -30,7 +32,7 @@ class ProcessDownloader implements DownloaderInterface
|
||||
|
||||
$process = (new Process([
|
||||
'wget',
|
||||
$url
|
||||
$url,
|
||||
]))->setWorkingDirectory($path);
|
||||
|
||||
$process->setTimeout(1800); // 30 min
|
||||
@@ -41,7 +43,18 @@ class ProcessDownloader implements DownloaderInterface
|
||||
try {
|
||||
$progress = 0;
|
||||
$this->entityManager->flush();
|
||||
$process->wait(function ($type, $buffer) use ($progress, $downloadEntity): void {
|
||||
|
||||
$process->wait(function ($type, $buffer) use ($progress, $downloadEntity, $process): void {
|
||||
// The PauseDownloadHandler will set this to 'true'
|
||||
$doPause = $this->cache->getItem('download.pause.' . $downloadEntity->getId());
|
||||
|
||||
if (true === $doPause->isHit()) {
|
||||
$downloadEntity->setStatus('Paused');
|
||||
$this->entityManager->flush();
|
||||
$doPause->expiresAt(new \DateTimeImmutable('now'));
|
||||
$process->stop();
|
||||
}
|
||||
|
||||
if (Process::ERR === $type) {
|
||||
$pregMatchOutput = [];
|
||||
preg_match('/[\d]+%/', $buffer, $pregMatchOutput);
|
||||
@@ -56,7 +69,9 @@ class ProcessDownloader implements DownloaderInterface
|
||||
}
|
||||
fwrite(STDOUT, $buffer);
|
||||
});
|
||||
$downloadEntity->setProgress(100);
|
||||
if ($downloadEntity->getStatus() !== 'Paused') {
|
||||
$downloadEntity->setProgress(100);
|
||||
}
|
||||
} catch (ProcessFailedException $exception) {
|
||||
$downloadEntity->setStatus('Failed');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user