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 method: GET
id: '\d+' 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: user_register:
path: /register/{inviteCode} path: /register/{inviteCode}
controller: App\Controller\UserController::register 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; namespace App\Twig;
use App\Magnet\MagnetGenerator;
use Twig\Extension\AbstractExtension; use Twig\Extension\AbstractExtension;
use Twig\TwigFunction; use Twig\{TwigFilter, TwigFunction};
class MagnetExtension extends AbstractExtension 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 */ public function __construct(MagnetGenerator $magnetGenerator)
private $publicTrackers = [];
/**
* @param string[] $publicTrackers
*/
public function __construct(array $publicTrackers = [])
{ {
$this->publicTrackers = $publicTrackers; $this->magnetGenerator = $magnetGenerator;
} }
public function getFunctions(): array public function getFunctions(): array
{ {
return [ 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)); return [
new TwigFilter('magnet', [$this->magnetGenerator, 'generate']),
if ($addPublicTrackers) { ];
foreach ($this->publicTrackers as $tracker) {
$magnetUrl .= '&tr='.urlencode($tracker);
}
}
return $magnetUrl;
} }
} }

View file

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

View file

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