MagnetExtension for Twig refactored: MagnetGenerator extracted to separate service.

This commit is contained in:
Alexey Skobkin 2019-01-29 20:09:58 +03:00
parent 13f974cc59
commit 47a671c493
4 changed files with 49 additions and 24 deletions

View file

@ -0,0 +1,36 @@
<?php
namespace App\Magnet;
class MagnetGenerator
{
private const MAGNET_TEMPLATE = 'magnet:?xt=urn:btih:%s';
/** @var string[] Array of public trackers which will be added to the magnet link */
private $publicTrackers = [];
/**
* @param string[] $publicTrackers
*/
public function __construct(array $publicTrackers = [])
{
$this->publicTrackers = $publicTrackers;
}
public function generate(string $infoHash, ?string $name = null, bool $withTrackers = true): string
{
$url = sprintf(self::MAGNET_TEMPLATE, urlencode($infoHash));
if (null !== $name) {
$url .= '&dn='.urlencode($name);
}
if ($withTrackers) {
foreach ($this->publicTrackers as $tracker) {
$url .= '&tr='.urlencode($tracker);
}
}
return $url;
}
}

View file

@ -2,42 +2,31 @@
namespace App\Twig;
use App\Magnet\MagnetGenerator;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
use Twig\{TwigFilter, TwigFunction};
class MagnetExtension extends AbstractExtension
{
private const MAGNET_TEMPLATE = 'magnet:?xt=urn:btih:%s&dn=%s';
/** @var MagnetGenerator */
private $magnetGenerator;
/** @var string[] Array of public trackers which will be added to the magnet link */
private $publicTrackers = [];
/**
* @param string[] $publicTrackers
*/
public function __construct(array $publicTrackers = [])
public function __construct(MagnetGenerator $magnetGenerator)
{
$this->publicTrackers = $publicTrackers;
$this->magnetGenerator = $magnetGenerator;
}
public function getFunctions(): array
{
return [
new TwigFunction('magnet', [$this, 'createMagnet']),
new TwigFunction('magnet', [$this->magnetGenerator, 'generate']),
];
}
public function createMagnet(string $name, string $infoHash, bool $addPublicTrackers = true): string
public function getFilters()
{
$magnetUrl = sprintf(self::MAGNET_TEMPLATE, urlencode($infoHash), urlencode($name));
if ($addPublicTrackers) {
foreach ($this->publicTrackers as $tracker) {
$magnetUrl .= '&tr='.urlencode($tracker);
}
}
return $magnetUrl;
return [
new TwigFilter('magnet', [$this->magnetGenerator, 'generate']),
];
}
}

View file

@ -19,7 +19,7 @@
{# @var torrent \App\Magnetico\Entity\Torrent #}
{% for torrent in torrents %}
<tr>
<td><a href="{{ magnet(torrent.name, torrent.infoHash) }}">&#128279;</a></td>
<td><a href="{{ magnet(torrent.infoHash, torrent.name) }}">&#128279;</a></td>
<td><a href="{{ path('torrents_show', {'id': torrent.id}) }}">{{ torrent.name }}</a></td>
<td>{{ torrent.totalSize | readable_size }}</td>
<td>{{ torrent.discoveredOn | date('Y-m-d H:i:s')}}</td>

View file

@ -10,7 +10,7 @@
<tr>
<td>Hash</td>
<td>
<a href="{{ magnet(torrent.name, torrent.infoHash) }}">{{ torrent.infoHash }}</a>
<a href="{{ magnet(torrent.infoHash, torrent.name) }}">{{ torrent.infoHash }}</a>
</td>
</tr>
<tr>