Browse Source

add torrent approved moderation tools

main
ghost 1 year ago
parent
commit
ed6c4ea415
  1. 54
      src/Controller/ActivityController.php
  2. 85
      src/Controller/TorrentController.php
  3. 27
      src/Entity/Activity.php
  4. 87
      src/Service/ActivityService.php
  5. 24
      src/Service/TorrentService.php
  6. 16
      templates/default/activity/event/torrent/approve/add.html.twig
  7. 16
      templates/default/activity/event/torrent/approve/delete.html.twig
  8. 371
      templates/default/torrent/info.html.twig

54
src/Controller/ActivityController.php

@ -372,6 +372,60 @@ class ActivityController extends AbstractController
break; break;
case $activity::EVENT_TORRENT_APPROVE_ADD:
return $this->render(
'default/activity/event/torrent/approve/add.html.twig',
[
'added' => $activity->getAdded(),
'user' =>
[
'id' => $activity->getUserId(),
'identicon' => $userService->identicon(
$userService->getUser(
$activity->getUserId()
)->getAddress()
)
],
'torrent' =>
[
'id' => $activity->getTorrentId(),
'name' => $torrentService->readTorrentFileByTorrentId(
$activity->getTorrentId()
)->getName()
]
]
);
break;
case $activity::EVENT_TORRENT_APPROVE_DELETE:
return $this->render(
'default/activity/event/torrent/approve/delete.html.twig',
[
'added' => $activity->getAdded(),
'user' =>
[
'id' => $activity->getUserId(),
'identicon' => $userService->identicon(
$userService->getUser(
$activity->getUserId()
)->getAddress()
)
],
'torrent' =>
[
'id' => $activity->getTorrentId(),
'name' => $torrentService->readTorrentFileByTorrentId(
$activity->getTorrentId()
)->getName()
]
]
);
break;
// Torrent Download // Torrent Download
case $activity::EVENT_TORRENT_DOWNLOAD_FILE_ADD: case $activity::EVENT_TORRENT_DOWNLOAD_FILE_ADD:

85
src/Controller/TorrentController.php

@ -76,7 +76,13 @@ class TorrentController extends AbstractController
$page = $request->get('page') ? (int) $request->get('page') : 1; $page = $request->get('page') ? (int) $request->get('page') : 1;
// Render template // Render template
return $this->render('default/torrent/info.html.twig', [ return $this->render('default/torrent/info.html.twig',
[
'user' =>
[
'id' => $user->getId(),
'moderator' => $user->isModerator()
],
'torrent' => 'torrent' =>
[ [
'id' => $torrent->getId(), 'id' => $torrent->getId(),
@ -90,6 +96,7 @@ class TorrentController extends AbstractController
], ],
'locales' => $torrent->getLocales(), 'locales' => $torrent->getLocales(),
'sensitive' => $torrent->isSensitive(), 'sensitive' => $torrent->isSensitive(),
'approved' => $torrent->isApproved(),
'download' => 'download' =>
[ [
'file' => 'file' =>
@ -564,6 +571,82 @@ class TorrentController extends AbstractController
); );
} }
#[Route(
'/{_locale}/torrent/{torrentId}/approve/toggle',
name: 'torrent_approve_toggle',
requirements:
[
'torrentId' => '\d+',
],
methods:
[
'GET'
]
)]
public function approve(
Request $request,
UserService $userService,
TorrentService $torrentService,
ActivityService $activityService
): Response
{
// Init user
$user = $this->initUser(
$request,
$userService,
$activityService
);
// Init torrent
if (!$torrent = $torrentService->getTorrent($request->get('torrentId')))
{
throw $this->createNotFoundException();
}
// Check permissions
if (!$user->isModerator())
{
// @TODO
throw new \Exception(
$translator->trans('Access denied')
);
}
// Register activity event
if (!$torrent->isApproved())
{
$activityService->addEventTorrentApproveAdd(
$user->getId(),
$torrent->getId(),
time()
);
}
else
{
$activityService->addEventTorrentApproveDelete(
$user->getId(),
$torrent->getId(),
time()
);
}
// Update approved
$torrentService->toggleTorrentApproved(
$torrent->getId()
);
// Redirect back to form
return $this->redirectToRoute(
'torrent_info',
[
'_locale' => $request->get('_locale'),
'torrentId' => $torrent->getId()
]
);
}
// Torrent locales // Torrent locales
#[Route( #[Route(
'/{_locale}/torrent/{torrentId}/edit/locales/{torrentLocalesId}', '/{_locale}/torrent/{torrentId}/edit/locales/{torrentLocalesId}',

27
src/Entity/Activity.php

@ -37,22 +37,25 @@ class Activity
/// Torrent /// Torrent
public const EVENT_TORRENT_ADD = 2000; public const EVENT_TORRENT_ADD = 2000;
public const EVENT_TORRENT_LOCALES_ADD = 2100; public const EVENT_TORRENT_APPROVE_ADD = 1100;
public const EVENT_TORRENT_LOCALES_DELETE = 2101; public const EVENT_TORRENT_APPROVE_DELETE = 1101;
public const EVENT_TORRENT_LOCALES_APPROVE_ADD = 2110;
public const EVENT_TORRENT_LOCALES_APPROVE_DELETE = 2111;
public const EVENT_TORRENT_SENSITIVE_ADD = 2200; public const EVENT_TORRENT_LOCALES_ADD = 2200;
public const EVENT_TORRENT_SENSITIVE_DELETE = 2201; public const EVENT_TORRENT_LOCALES_DELETE = 2201;
public const EVENT_TORRENT_SENSITIVE_APPROVE_ADD = 2210; public const EVENT_TORRENT_LOCALES_APPROVE_ADD = 2210;
public const EVENT_TORRENT_SENSITIVE_APPROVE_DELETE = 2211; public const EVENT_TORRENT_LOCALES_APPROVE_DELETE = 2211;
public const EVENT_TORRENT_STAR_ADD = 2300; public const EVENT_TORRENT_SENSITIVE_ADD = 2300;
public const EVENT_TORRENT_STAR_DELETE = 2301; public const EVENT_TORRENT_SENSITIVE_DELETE = 2301;
public const EVENT_TORRENT_SENSITIVE_APPROVE_ADD = 2310;
public const EVENT_TORRENT_SENSITIVE_APPROVE_DELETE = 2311;
public const EVENT_TORRENT_DOWNLOAD_FILE_ADD = 2400; public const EVENT_TORRENT_STAR_ADD = 2400;
public const EVENT_TORRENT_STAR_DELETE = 2401;
public const EVENT_TORRENT_DOWNLOAD_MAGNET_ADD = 2500; public const EVENT_TORRENT_DOWNLOAD_FILE_ADD = 2500;
public const EVENT_TORRENT_DOWNLOAD_MAGNET_ADD = 2600;
// ... // ...

87
src/Service/ActivityService.php

@ -43,6 +43,9 @@ class ActivityService
// Torrents // Torrents
Activity::EVENT_TORRENT_ADD, Activity::EVENT_TORRENT_ADD,
Activity::EVENT_TORRENT_APPROVE_ADD,
Activity::EVENT_TORRENT_APPROVE_DELETE,
Activity::EVENT_TORRENT_LOCALES_ADD, Activity::EVENT_TORRENT_LOCALES_ADD,
Activity::EVENT_TORRENT_LOCALES_DELETE, Activity::EVENT_TORRENT_LOCALES_DELETE,
Activity::EVENT_TORRENT_LOCALES_APPROVE_ADD, Activity::EVENT_TORRENT_LOCALES_APPROVE_ADD,
@ -191,6 +194,30 @@ class ActivityService
break; break;
case Activity::EVENT_TORRENT_APPROVE_ADD:
$events
[
$this->translatorInterface->trans('Torrents')
]
[
$this->translatorInterface->trans('Approved')
] = $code;
break;
case Activity::EVENT_TORRENT_APPROVE_DELETE:
$events
[
$this->translatorInterface->trans('Torrents')
]
[
$this->translatorInterface->trans('Disapproved')
] = $code;
break;
/// Torrent locales /// Torrent locales
case Activity::EVENT_TORRENT_LOCALES_ADD: case Activity::EVENT_TORRENT_LOCALES_ADD:
@ -760,6 +787,66 @@ class ActivityService
return $activity; return $activity;
} }
public function addEventTorrentApproveAdd(
int $userId,
int $torrentId,
int $added
): ?Activity
{
$activity = new Activity();
$activity->setEvent(
Activity::EVENT_TORRENT_APPROVE_ADD
);
$activity->setUserId(
$userId
);
$activity->setTorrentId(
$torrentId
);
$activity->setAdded(
$added
);
$this->entityManagerInterface->persist($activity);
$this->entityManagerInterface->flush();
return $activity;
}
public function addEventTorrentApproveDelete(
int $userId,
int $torrentId,
int $added
): ?Activity
{
$activity = new Activity();
$activity->setEvent(
Activity::EVENT_TORRENT_APPROVE_DELETE
);
$activity->setUserId(
$userId
);
$activity->setTorrentId(
$torrentId
);
$activity->setAdded(
$added
);
$this->entityManagerInterface->persist($activity);
$this->entityManagerInterface->flush();
return $activity;
}
/// Torrent Download /// Torrent Download
public function addEventTorrentDownloadFileAdd( public function addEventTorrentDownloadFileAdd(
int $userId, int $userId,

24
src/Service/TorrentService.php

@ -298,6 +298,30 @@ class TorrentService
return $torrent; return $torrent;
} }
public function toggleTorrentApproved(
int $torrentId
): ?Torrent
{
$torrent = $this->getTorrent($torrentId);
$torrent->setApproved(
!$torrent->isApproved() // toggle current value
);
$this->entityManagerInterface->persist($torrent);
$this->entityManagerInterface->flush();
$this->updateTorrentLocales(
$torrent->getId()
);
$this->updateTorrentSensitive(
$torrent->getId()
);
return $torrent;
}
public function getTorrentScrapeQueue(): ?Torrent public function getTorrentScrapeQueue(): ?Torrent
{ {
return $this->entityManagerInterface return $this->entityManagerInterface

16
templates/default/activity/event/torrent/approve/add.html.twig

@ -0,0 +1,16 @@
<div class="row">
<div class="column width-80">
<a href="{{ path('user_info', { userId : user.id }) }}">
<img class="border-radius-50 border-color-default vertical-align-middle" src="{{ user.identicon }}" alt="{{ 'identicon' | trans }}" />
</a>
<span class="margin-l-4-px">
{{ 'approved torrent' | trans }}
</span>
<a href="{{ path('torrent_info', { torrentId : torrent.id }) }}">
{{ torrent.name }}
</a>
</div>
<div class="column width-20 text-right">
{{ added | format_ago }}
</div>
</div>

16
templates/default/activity/event/torrent/approve/delete.html.twig

@ -0,0 +1,16 @@
<div class="row">
<div class="column width-80">
<a href="{{ path('user_info', { userId : user.id }) }}">
<img class="border-radius-50 border-color-default vertical-align-middle" src="{{ user.identicon }}" alt="{{ 'identicon' | trans }}" />
</a>
<span class="margin-l-4-px">
{{ 'disapproved torrent' | trans }}
</span>
<a href="{{ path('torrent_info', { torrentId : torrent.id }) }}">
{{ torrent.name }}
</a>
</div>
<div class="column width-20 text-right">
{{ added | format_ago }}
</div>
</div>

371
templates/default/torrent/info.html.twig

@ -23,225 +23,248 @@
{% block title %}{{ file.name }} - {{ 'Torrent' | trans }} #{{ torrent.id }}{% if pagination.page > 1 %} - {{ 'Page' | trans }} {{ pagination.page }}{% endif %} - {{ name }}{% endblock %} {% block title %}{{ file.name }} - {{ 'Torrent' | trans }} #{{ torrent.id }}{% if pagination.page > 1 %} - {{ 'Page' | trans }} {{ pagination.page }}{% endif %} - {{ name }}{% endblock %}
{% block main_content %} {% block main_content %}
<div class="padding-24-px margin-y-8-px border-radius-3-px background-color-night"> <div class="padding-24-px margin-y-8-px border-radius-3-px background-color-night">
<div class="padding-b-16-px"> <h1 class="display-block text-center margin-b-16-px">
<h1 class="display-block text-center margin-b-16-px"> {{ file.name }}
{{ file.name }} {#{{ 'Torrent' | trans }} #{{ torrent.id }}#}
{#{{ 'Torrent' | trans }} #{{ torrent.id }}#} </h1>
</h1> <div class="text-center">
<div class="text-center"> <a class="margin-l-8-px margin-r-4-px" href="{{ path('torrent_download_magnet', {torrentId : torrent.id}) }}" title="{{ 'Open magnet link' | trans }}">
<a class="margin-l-8-px margin-r-4-px" href="{{ path('torrent_download_magnet', {torrentId : torrent.id}) }}" title="{{ 'Open magnet link' | trans }}"> {% if torrent.download.magnet.exist %}
{% if torrent.download.magnet.exist %} <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 16 16">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 16 16"> <path d="M15 12h-4v3h4v-3ZM5 12H1v3h4v-3ZM0 8a8 8 0 1 1 16 0v8h-6V8a2 2 0 1 0-4 0v8H0V8Z"/>
<path d="M15 12h-4v3h4v-3ZM5 12H1v3h4v-3ZM0 8a8 8 0 1 1 16 0v8h-6V8a2 2 0 1 0-4 0v8H0V8Z"/> </svg>
</svg> {% else %}
{% else %} <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 16 16">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" viewBox="0 0 16 16"> <path d="M8 1a7 7 0 0 0-7 7v3h4V8a3 3 0 0 1 6 0v3h4V8a7 7 0 0 0-7-7Zm7 11h-4v3h4v-3ZM5 12H1v3h4v-3ZM0 8a8 8 0 1 1 16 0v8h-6V8a2 2 0 1 0-4 0v8H0V8Z"/>
<path d="M8 1a7 7 0 0 0-7 7v3h4V8a3 3 0 0 1 6 0v3h4V8a7 7 0 0 0-7-7Zm7 11h-4v3h4v-3ZM5 12H1v3h4v-3ZM0 8a8 8 0 1 1 16 0v8h-6V8a2 2 0 1 0-4 0v8H0V8Z"/> </svg>
</svg> {% endif %}
{% endif %}
</a>
<sup class="cursor-default" title="{{ 'Total' | trans }}">
{{ torrent.download.magnet.total }}
</sup>
<a class="margin-l-8-px margin-r-4-px" href="{{ path('torrent_download_file', {torrentId : torrent.id}) }}" title="{{ 'Download torrent file' | trans }}">
{% if torrent.download.file.exist %}
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" fill="currentColor" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z"/>
</svg>
{% else %}
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" fill="currentColor" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8zm15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z"/>
</svg>
{% endif %}
</a>
<sup class="cursor-default" title="{{ 'Total' | trans }}">
{{ torrent.download.file.total }}
</sup>
<a class="margin-l-8-px margin-r-4-px" href="{{ path('torrent_star_toggle', {torrentId : torrent.id}) }}" title="{{ 'Star' | trans }}">
{% if torrent.star.exist %}
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.282.95l-3.522 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z"/>
</svg>
{% else %}
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M2.866 14.85c-.078.444.36.791.746.593l4.39-2.256 4.389 2.256c.386.198.824-.149.746-.592l-.83-4.73 3.522-3.356c.33-.314.16-.888-.282-.95l-4.898-.696L8.465.792a.513.513 0 0 0-.927 0L5.354 5.12l-4.898.696c-.441.062-.612.636-.283.95l3.523 3.356-.83 4.73zm4.905-2.767-3.686 1.894.694-3.957a.565.565 0 0 0-.163-.505L1.71 6.745l4.052-.576a.525.525 0 0 0 .393-.288L8 2.223l1.847 3.658a.525.525 0 0 0 .393.288l4.052.575-2.906 2.77a.565.565 0 0 0-.163.506l.694 3.957-3.686-1.894a.503.503 0 0 0-.461 0z"/>
</svg>
{% endif %}
</a>
<sup class="cursor-default" title="{{ 'Total' | trans }}">
{{ torrent.star.total }}
</sup>
</div>
{#
<a class="float-right margin-l-8-px" href="#" title="{{ 'Magnet'|trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M8 1a7 7 0 0 0-7 7v3h4V8a3 3 0 0 1 6 0v3h4V8a7 7 0 0 0-7-7Zm7 11h-4v3h4v-3ZM5 12H1v3h4v-3ZM0 8a8 8 0 1 1 16 0v8h-6V8a2 2 0 1 0-4 0v8H0V8Z"/>
</svg>
</a> </a>
#} <sup class="cursor-default" title="{{ 'Total' | trans }}">
</div> {{ torrent.download.magnet.total }}
<div class="padding-y-8-px border-bottom-default text-right"> </sup>
{{ 'Common'|trans }} <a class="margin-l-8-px margin-r-4-px" href="{{ path('torrent_download_file', {torrentId : torrent.id}) }}" title="{{ 'Download torrent file' | trans }}">
{% if torrent.download.file.exist %}
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" fill="currentColor" viewBox="0 0 16 16">
<path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z"/>
</svg>
{% else %}
<svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" fill="currentColor" viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M1 8a7 7 0 1 0 14 0A7 7 0 0 0 1 8zm15 0A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8.5 4.5a.5.5 0 0 0-1 0v5.793L5.354 8.146a.5.5 0 1 0-.708.708l3 3a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V4.5z"/>
</svg>
{% endif %}
</a>
<sup class="cursor-default" title="{{ 'Total' | trans }}">
{{ torrent.download.file.total }}
</sup>
<a class="margin-l-8-px margin-r-4-px" href="{{ path('torrent_star_toggle', {torrentId : torrent.id}) }}" title="{{ 'Star' | trans }}">
{% if torrent.star.exist %}
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.282.95l-3.522 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z"/>
</svg>
{% else %}
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M2.866 14.85c-.078.444.36.791.746.593l4.39-2.256 4.389 2.256c.386.198.824-.149.746-.592l-.83-4.73 3.522-3.356c.33-.314.16-.888-.282-.95l-4.898-.696L8.465.792a.513.513 0 0 0-.927 0L5.354 5.12l-4.898.696c-.441.062-.612.636-.283.95l3.523 3.356-.83 4.73zm4.905-2.767-3.686 1.894.694-3.957a.565.565 0 0 0-.163-.505L1.71 6.745l4.052-.576a.525.525 0 0 0 .393-.288L8 2.223l1.847 3.658a.525.525 0 0 0 .393.288l4.052.575-2.906 2.77a.565.565 0 0 0-.163.506l.694 3.957-3.686-1.894a.503.503 0 0 0-.461 0z"/>
</svg>
{% endif %}
</a>
<sup class="cursor-default" title="{{ 'Total' | trans }}">
{{ torrent.star.total }}
</sup>
</div> </div>
<div class="padding-t-16-px"> <table class="width-100">
<table class="width-100"> <tbody>
<tbody> {% if user.moderator %}
<tr>
<td colspan="2">
<div class="padding-y-8-px border-bottom-default text-right">
{{ 'Moderation' | trans }}
</div>
</td>
</tr>
<tr>
<td class="padding-t-16-px">
{{ 'Approved' | trans }}
</td>
<td class="padding-t-16-px">
{% if torrent.approved %}
{{ 'Yes' | trans }}
<a class="float-right" href="{{ path('torrent_approve_toggle', { torrentId : torrent.id }) }}" title="{{ 'Toggle' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M5 3a5 5 0 0 0 0 10h6a5 5 0 0 0 0-10H5zm6 9a4 4 0 1 1 0-8 4 4 0 0 1 0 8z"/>
</svg>
</a>
{% else %}
{{ 'No' | trans }}
<a class="float-right text-color-red" href="{{ path('torrent_approve_toggle', { torrentId : torrent.id }) }}" title="{{ 'Toggle' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M11 4a4 4 0 0 1 0 8H8a4.992 4.992 0 0 0 2-4 4.992 4.992 0 0 0-2-4h3zm-6 8a4 4 0 1 1 0-8 4 4 0 0 1 0 8zM0 8a5 5 0 0 0 5 5h6a5 5 0 0 0 0-10H5a5 5 0 0 0-5 5z"/>
</svg>
</a>
{% endif %}
</td>
</tr>
{% endif %}
<tr>
<td colspan="2">
<div class="padding-y-8-px border-bottom-default text-right">
{{ 'Common' | trans }}
</div>
</td>
</tr>
<tr>
<td class="padding-t-16-px">
{{ 'ID' | trans }}
</td>
<td class="padding-t-16-px">
#{{ torrent.id }}
</td>
</tr>
<tr>
<td>
{{ 'MD5' | trans }}
</td>
<td>
{{ torrent.md5file }}
</td>
</tr>
{% if file.hash.v1 %}
<tr> <tr>
<td> <td>
{{ 'ID'|trans }} {{ 'Info hash v1' | trans }}
</td> </td>
<td> <td>
#{{ torrent.id }} {{ file.hash.v1 }}
</td> </td>
</tr> </tr>
{% endif %}
{% if file.hash.v2 %}
<tr> <tr>
<td> <td>
{{ 'MD5'|trans }} {{ 'Info hash v2' | trans }}
</td> </td>
<td> <td>
{{ torrent.md5file }} {{ file.hash.v2 }}
</td> </td>
</tr> </tr>
{% if file.hash.v1 %} {% endif %}
<tr> {# visible in H1
<td> <tr>
{{ 'Info hash v1'|trans }} <td>
</td> {{ 'Filename'|trans }}
<td> </td>
{{ file.hash.v1 }} <td>
</td> {{ file.name }}
</tr> </td>
{% endif %} </tr>
{% if file.hash.v2 %} #}
<tr> {% if file.created %}
<td>
{{ 'Info hash v2'|trans }}
</td>
<td>
{{ file.hash.v2 }}
</td>
</tr>
{% endif %}
{# visible in H1
<tr> <tr>
<td> <td>
{{ 'Filename'|trans }} {{ 'Created' | trans }}
</td> </td>
<td> <td>
{{ file.name }} {{ file.created | format_date }}
</td> </td>
</tr> </tr>
#} {% endif %}
{% if file.created %}
<tr>
<td>
{{ 'Created'|trans }}
</td>
<td>
{{ file.created | format_date }}
</td>
</tr>
{% endif %}
{% if file.size %} {% if file.size %}
<tr>
<td>
{{ 'Size'|trans }}
</td>
<td>
{{ file.size | format_bytes }}
</td>
</tr>
{% endif %}
{% if file.pieces %}
<tr>
<td>
{{ 'Pieces'|trans }}
</td>
<td>
{{ file.pieces | format_number }}
</td>
</tr>
{% endif %}
{% if file.source %}
<tr>
<td>
{{ 'Source'|trans }}
</td>
<td>
{{ file.source }}
</td>
</tr>
{% endif %}
{% if file.software %}
<tr>
<td>
{{ 'Software'|trans }}
</td>
<td>
{{ file.software }}
</td>
</tr>
{% endif %}
{% if file.comment %}
<tr>
<td>
{{ 'Comment'|trans }}
</td>
<td>
{{ file.comment }}
</td>
</tr>
{% endif %}
<tr> <tr>
<td> <td>
{{ 'Contributors'|trans }} {{ 'Size' | trans }}
</td> </td>
<td> <td>
{% for id, identicon in torrent.contributors %} {{ file.size | format_bytes }}
<a href="{{ path('user_info', { userId : id }) }}">
<img class="border-radius-50 border-color-default vertical-align-middle" src="{{ identicon }}" alt="{{'identicon'|trans }}" />
</a>
{% endfor %}
</td> </td>
</tr> </tr>
{% endif %}
{% if file.pieces %}
<tr> <tr>
<td colspan="2"> <td>
<div class="padding-y-8-px border-bottom-default text-right"> {{ 'Pieces' | trans }}
{{ 'Scrape'|trans }} </td>
</div> <td>
{{ file.pieces | format_number }}
</td> </td>
</tr> </tr>
{% endif %}
{% if file.source %}
<tr> <tr>
<td class="padding-t-16-px"> <td>
{{ 'Seeders'|trans }} {{ 'Source' | trans }}
</td> </td>
<td class="padding-t-16-px"> <td>
{{ torrent.scrape.seeders }} {{ file.source }}
</td> </td>
</tr> </tr>
{% endif %}
{% if file.software %}
<tr> <tr>
<td> <td>
{{ 'Peers'|trans }} {{ 'Software' | trans }}
</td> </td>
<td> <td>
{{ torrent.scrape.peers }} {{ file.software }}
</td> </td>
</tr> </tr>
{% endif %}
{% if file.comment %}
<tr> <tr>
<td> <td>
{{ 'Leechers'|trans }} {{ 'Comment' | trans }}
</td> </td>
<td> <td>
{{ torrent.scrape.leechers }} {{ file.comment }}
</td> </td>
</tr> </tr>
</tbody> {% endif %}
</table> <tr>
</div> <td>
{{ 'Contributors' | trans }}
</td>
<td>
{% for id, identicon in torrent.contributors %}
<a href="{{ path('user_info', { userId : id }) }}">
<img class="border-radius-50 border-color-default vertical-align-middle" src="{{ identicon }}" alt="{{'identicon'|trans }}" />
</a>
{% endfor %}
</td>
</tr>
<tr>
<td colspan="2">
<div class="padding-y-8-px border-bottom-default text-right">
{{ 'Scrape' | trans }}
</div>
</td>
</tr>
<tr>
<td class="padding-t-16-px">
{{ 'Seeders' | trans }}
</td>
<td class="padding-t-16-px">
{{ torrent.scrape.seeders }}
</td>
</tr>
<tr>
<td>
{{ 'Peers' | trans }}
</td>
<td>
{{ torrent.scrape.peers }}
</td>
</tr>
<tr>
<td>
{{ 'Leechers' | trans }}
</td>
<td>
{{ torrent.scrape.leechers }}
</td>
</tr>
</tbody>
</table>
<div class="padding-y-8-px border-bottom-default text-right"> <div class="padding-y-8-px border-bottom-default text-right">
{{ 'Files'|trans }} {{ 'Files' | trans }}
</div> </div>
<div class="padding-y-16-px"> <div class="padding-y-16-px">
{% for key, value in file.tree %} {% for key, value in file.tree %}
@ -258,7 +281,7 @@
{% endfor %} {% endfor %}
</div> </div>
<div class="padding-y-8-px border-bottom-default text-right"> <div class="padding-y-8-px border-bottom-default text-right">
{{ 'Trackers'|trans }} {{ 'Trackers' | trans }}
</div> </div>
<div class="padding-t-16-px"> <div class="padding-t-16-px">
{% for tracker in trackers %} {% for tracker in trackers %}
@ -303,7 +326,7 @@
<path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/> <path d="M12.854.146a.5.5 0 0 0-.707 0L10.5 1.793 14.207 5.5l1.647-1.646a.5.5 0 0 0 0-.708l-3-3zm.646 6.061L9.793 2.5 3.293 9H3.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.5h.5a.5.5 0 0 1 .5.5v.207l6.5-6.5zm-7.468 7.468A.5.5 0 0 1 6 13.5V13h-.5a.5.5 0 0 1-.5-.5V12h-.5a.5.5 0 0 1-.5-.5V11h-.5a.5.5 0 0 1-.5-.5V10h-.5a.499.499 0 0 1-.175-.032l-.179.178a.5.5 0 0 0-.11.168l-2 5a.5.5 0 0 0 .65.65l5-2a.5.5 0 0 0 .168-.11l.178-.178z"/>
</svg> </svg>
</a> </a>
{{ 'Sensitive'|trans }} {{ 'Sensitive' | trans }}
<div class="padding-b-8-px border-bottom-default"></div> <div class="padding-b-8-px border-bottom-default"></div>
<div class="padding-t-16-px text-left"> <div class="padding-t-16-px text-left">
{% if torrent.sensitive %} {% if torrent.sensitive %}

Loading…
Cancel
Save