Merged in feature_magnet_redirector (pull request #23)
Feature magnet redirector
This commit is contained in:
commit
31bbc4392e
|
@ -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
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
controllers:
|
||||
resource: ../../src/Controller/
|
||||
type: annotation
|
14
src/Controller/MagnetRedirectController.php
Normal file
14
src/Controller/MagnetRedirectController.php
Normal 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);
|
||||
}
|
||||
}
|
36
src/Magnet/MagnetGenerator.php
Normal file
36
src/Magnet/MagnetGenerator.php
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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']),
|
||||
];
|
||||
}
|
||||
}
|
|
@ -19,7 +19,7 @@
|
|||
{# @var torrent \App\Magnetico\Entity\Torrent #}
|
||||
{% for torrent in torrents %}
|
||||
<tr>
|
||||
<td><a href="{{ magnet(torrent.name, torrent.infoHash) }}">🔗</a></td>
|
||||
<td><a href="{{ magnet(torrent.infoHash, 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.discoveredOn | date('Y-m-d H:i:s')}}</td>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue