Merged in feature_magnet_redirector (pull request #23)

Feature magnet redirector
This commit is contained in:
Alexey Eschenko 2019-01-29 17:41:24 +00:00
commit 31bbc4392e
7 changed files with 72 additions and 27 deletions

View file

@ -16,6 +16,15 @@ torrents_show:
method: GET
id: '\d+'
# Mainly for Telegram bot
magnet_redirect:
path: /magnet/{infoHash}
controller: App\Controller\MagnetRedirectController::redirect
requirements:
method: GET
# SHA-1 hash
infoHash: '[0-9a-fA-F]{40}'
user_register:
path: /register/{inviteCode}
controller: App\Controller\UserController::register

View file

@ -1,3 +0,0 @@
controllers:
resource: ../../src/Controller/
type: annotation

View file

@ -0,0 +1,14 @@
<?php
namespace App\Controller;
use App\Magnet\MagnetGenerator;
use Symfony\Component\HttpFoundation\RedirectResponse;
class MagnetRedirectController
{
public function redirect(string $infoHash, MagnetGenerator $magnetGenerator): RedirectResponse
{
return new RedirectResponse($magnetGenerator->generate($infoHash), RedirectResponse::HTTP_TEMPORARY_REDIRECT);
}
}

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>