feat: pauses & resumes downloads
This commit is contained in:
@@ -5,12 +5,17 @@ namespace App\Download\Downloader;
|
||||
use App\Download\Framework\Entity\Download;
|
||||
use App\Monitor\Service\MediaFiles;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Component\Cache\Adapter\RedisAdapter;
|
||||
use Symfony\Component\Process\Exception\ProcessFailedException;
|
||||
use Symfony\Component\Process\Process;
|
||||
use Symfony\Contracts\Cache\CacheInterface;
|
||||
|
||||
class ProcessDownloader implements DownloaderInterface
|
||||
{
|
||||
/**
|
||||
* @var RedisAdapter $cache
|
||||
*/
|
||||
|
||||
public function __construct(
|
||||
private EntityManagerInterface $entityManager,
|
||||
private MediaFiles $mediaFiles,
|
||||
@@ -24,16 +29,23 @@ class ProcessDownloader implements DownloaderInterface
|
||||
{
|
||||
/** @var Download $downloadEntity */
|
||||
$downloadEntity = $this->entityManager->getRepository(Download::class)->find($downloadId);
|
||||
$downloadEntity->setProgress(0);
|
||||
$this->entityManager->flush();
|
||||
|
||||
$downloadPreferences = $downloadEntity->getUser()->getDownloadPreferences();
|
||||
$path = $this->getDownloadPath($mediaType, $title, $downloadPreferences);
|
||||
|
||||
$process = (new Process([
|
||||
'wget',
|
||||
$url,
|
||||
]))->setWorkingDirectory($path);
|
||||
$processArgs = ['wget', $url];
|
||||
|
||||
if ($downloadEntity->getStatus() === 'Paused') {
|
||||
$downloadEntity->setStatus('In Progress');
|
||||
$processArgs = ['wget', '-c', $url];
|
||||
} else {
|
||||
$downloadEntity->setProgress(0);
|
||||
}
|
||||
|
||||
fwrite(STDOUT, implode(" ", $processArgs));
|
||||
|
||||
$process = (new Process($processArgs))->setWorkingDirectory($path);
|
||||
|
||||
$process->setTimeout(1800); // 30 min
|
||||
$process->setIdleTimeout(600); // 10 min
|
||||
@@ -48,10 +60,10 @@ class ProcessDownloader implements DownloaderInterface
|
||||
// The PauseDownloadHandler will set this to 'true'
|
||||
$doPause = $this->cache->getItem('download.pause.' . $downloadEntity->getId());
|
||||
|
||||
if (true === $doPause->isHit()) {
|
||||
if (true === $doPause->isHit() && true === $doPause->get()) {
|
||||
$downloadEntity->setStatus('Paused');
|
||||
$this->cache->deleteItem('download.pause.' . $downloadEntity->getId());
|
||||
$this->entityManager->flush();
|
||||
$doPause->expiresAt(new \DateTimeImmutable('now'));
|
||||
$process->stop();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user