wip: pauses downloads

This commit is contained in:
2025-06-09 11:26:17 -05:00
parent 51c2a1c577
commit a7bedae3db
18 changed files with 217 additions and 12 deletions

View File

@@ -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');
}