BitTorrent Network for Yggdrasil
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

470 lines
25 KiB

{% macro recursive_file_tree(tree) %}
{% import _self as self %}
{% for key, value in tree %}
{% if value is iterable %}
<div class="padding-x-4-px margin-b-4-px cursor-default line-height-20-px word-break">
{{ key }}
</div>
<div class="padding-l-8-px">
{{ self.recursive_file_tree(value) }}
</div>
{% else %}
<div class="row padding-x-4-px margin-b-4-px cursor-default background-color-hover-night-light word-break">
<div class="column width-80 line-height-20-px">
{{ key }}
</div>
<div class="column width-20 line-height-20-px text-right">
{{ value | format_bytes }}
</div>
</div>
{% endif %}
{% endfor %}
{% endmacro %}
{% from _self import recursive_file_tree %}
{% extends 'default/layout.html.twig' %}
{% block title %}{{ file.name }} - {{ 'Torrent' | trans }} #{{ torrent.id }}{% if pagination.page > 1 %} - {{ 'Page' | trans }} {{ pagination.page }}{% endif %} - {{ name }}{% endblock %}
{% block keywords %}
{% if torrent.keywords %}
<meta name="keywords" content="{{ torrent.keywords | join(',') }}" />
{% endif %}
{% endblock %}
{% block main_content %}
<div class="padding-24-px margin-y-8-px border-radius-3-px background-color-night {% if torrent.poster %}background-poster{% endif %}"
{% if torrent.poster %}style="background-image:url('{{ torrent.poster.url }}');background-position:{{ torrent.poster.position }}"{% endif %}>
<h1 class="display-block text-center margin-b-16-px">
{{ file.name }}
{#{{ 'Torrent' | trans }} #{{ torrent.id }}#}
</h1>
<div class="text-center">
<a rel="nofollow" class="margin-l-8-px margin-r-4-px" href="{{ path('torrent_magnet', {torrentId : torrent.id}) }}" title="{{ 'Open magnet link' | trans }}">
{% if torrent.download.magnet.exist %}
<svg class="vertical-align-middle" 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"/>
</svg>
{% else %}
<svg class="vertical-align-middle" 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"/>
</svg>
{% endif %}
</a>
<small class="cursor-default" title="{{ 'Total' | trans }}">
{{ torrent.download.magnet.total }}
</small>
<a rel="nofollow" class="margin-l-8-px margin-r-4-px" href="{{ path('torrent_file', {torrentId : torrent.id}) }}" title="{{ 'Download torrent file' | trans }}">
{% if torrent.download.file.exist %}
<svg class="vertical-align-middle" 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 class="vertical-align-middle" 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>
<small class="cursor-default" title="{{ 'Total' | trans }}">
{{ torrent.download.file.total }}
</small>
<a rel="nofollow" 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 class="vertical-align-middle" 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 class="vertical-align-middle" 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>
<small class="cursor-default" title="{{ 'Total' | trans }}">
{{ torrent.star.total }}
</small>
</div>
<table class="width-100">
<tbody>
{% if session.moderator or session.owner %}
<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">
{{ 'Enabled' | trans }}
</td>
<td class="padding-t-16-px">
{% if torrent.status %}
{{ 'Yes' | trans }}
<a rel="nofollow" class="float-right" href="{{ path('torrent_status_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 rel="nofollow" class="float-right text-color-red" href="{{ path('torrent_status_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>
{% if session.moderator %}
<tr>
<td>
{{ 'Approved' | trans }}
</td>
<td>
{% if torrent.approved %}
{{ 'Yes' | trans }}
<a rel="nofollow" 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 rel="nofollow" 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 %}
{% 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>
<td>
{{ 'Info hash v1' | trans }}
</td>
<td>
{{ file.hash.v1 }}
</td>
</tr>
{% endif %}
{% if file.hash.v2 %}
<tr>
<td>
{{ 'Info hash v2' | trans }}
</td>
<td>
{{ file.hash.v2 }}
</td>
</tr>
{% endif %}
{# visible in H1
<tr>
<td>
{{ 'Filename'|trans }}
</td>
<td>
{{ file.name }}
</td>
</tr>
#}
{% if file.created %}
<tr>
<td>
{{ 'Created' | trans }}
</td>
<td>
{{ file.created | format_date }}
</td>
</tr>
{% endif %}
{% 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 %}
<tr>
<td>
{{ 'Private' | trans }}
</td>
<td>
{% if file.private %}
{{ 'Yes' | trans }}
{% else %}
{{ 'No' | trans }}
{% endif %}
</td>
</tr>
{% if file.source %}
<tr>
<td>
{{ 'Source' | trans }}
</td>
<td>
{# disable markdown as unsafe for unfiltered content #}
{#{{ file.source | url_to_markdown | markdown_to_html }}#}
{{ file.source }}
</td>
</tr>
{% endif %}
{% if file.software %}
<tr>
<td>
{{ 'Software' | trans }}
</td>
<td>
{# disable markdown as unsafe for unfiltered content #}
{#{{ file.software | url_to_markdown | markdown_to_html }}#}
{{ file.software }}
</td>
</tr>
{% endif %}
{% if file.comment %}
<tr>
<td>
{{ 'Comment' | trans }}
</td>
<td>
{# disable markdown as unsafe for unfiltered content #}
{#{{ file.comment | url_to_markdown | markdown_to_html }}#}
{{ file.comment }}
</td>
</tr>
{% endif %}
<tr>
<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">
{{ 'Files' | trans }}
</div>
<div class="padding-y-16-px">
{% for key, value in file.tree %}
{% if value is iterable %}
{{ recursive_file_tree(value) }}
{% else %}
<div class="padding-y-4-px cursor-default">
{{ key }}
<div class="float-right">
{{ value | format_bytes }}
</div>
</div>
{% endif %}
{% endfor %}
</div>
<div class="padding-y-8-px border-bottom-default text-right">
{{ 'Trackers' | trans }}
</div>
<div class="padding-y-16-px">
{% for tracker, status in trackers %}
<div class="padding-y-4-px word-break">
{% if status %}
{{ tracker }}
{% else %}
<span class="text-color-night">
{{ tracker }}
</span>
1 year ago
<span class="float-right" title="{{ 'Filtered by settings' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
<path d="M1.5 1.5A.5.5 0 0 1 2 1h12a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-.128.334L10 8.692V13.5a.5.5 0 0 1-.342.474l-3 1A.5.5 0 0 1 6 14.5V8.692L1.628 3.834A.5.5 0 0 1 1.5 3.5v-2z"/>
</svg>
</span>
{% endif %}
</div>
{% endfor %}
</div>
<div class="text-right">
<a rel="nofollow" class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_locales_edit', { torrentId : torrent.id }) }}" title="{{ 'Edit' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
<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>
</a>
{{ 'Locale' | trans }}
<div class="padding-b-8-px border-bottom-default"></div>
1 year ago
<div class="padding-t-16-px text-left">
{% if torrent.locales %}
<div class="padding-y-4-px">
{% set i = 0 %}
{% for locale in torrent.locales | sort %}{% if i > 0 %},{% endif %} {{ locale | locale_name(locale) | u.title }}{% set i = i + 1 %}{% endfor %}
</div>
{% endif %}
</div>
</div>
<div class="text-right">
<a rel="nofollow" class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_categories_edit', { torrentId : torrent.id }) }}" title="{{ 'Edit' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
<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>
</a>
{{ 'Category' | trans }}
<div class="padding-b-8-px border-bottom-default"></div>
<div class="padding-t-16-px text-left">
{% if torrent.categories %}
<div class="padding-y-4-px">
{% set i = 0 %}
{% for category in torrent.categories | sort %}{% if i > 0 %},{% endif %} {{ category | trans_category | u.title }}{% set i = i + 1 %}{% endfor %}
</div>
{% endif %}
</div>
</div>
<div class="text-right">
<a rel="nofollow" class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_sensitive_edit', { torrentId : torrent.id }) }}" title="{{ 'Edit' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
<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>
</a>
{{ 'Sensitive' | trans }}
<div class="padding-b-8-px border-bottom-default"></div>
<div class="padding-t-16-px text-left">
{% if torrent.sensitive %}
{{ 'Yes' | trans }}
{% else %}
{{ 'No' | trans }}
{% endif %}
</div>
</div>
<div class="text-right">
<a rel="nofollow" class="margin-r-4-px{#opacity-0 parent-hover-opacity-09#}" href="{{ path('torrent_poster_edit', { torrentId : torrent.id }) }}" title="{{ 'Edit' | trans }}">
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" fill="currentColor" viewBox="0 0 16 16">
<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>
</a>
{{ 'Poster' | trans }}
<div class="padding-b-8-px border-bottom-default"></div>
<div class="padding-t-16-px text-left">
{% if torrent.poster %}
{{ 'Yes' | trans }}
{% else %}
{{ 'No' | trans }}
{% endif %}
</div>
</div>
</div>
<a name="activity"></a>
<div class="padding-t-16-px padding-b-8-px text-right">
<h2>{{ 'Recent activity' | trans }}</h2>
<sub>
<a class="text-color-night margin-x-4-px" href="{{ path('rss_activity_torrent', { torrentId : torrent.id }) }}" title="RSS">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm1.5 2.5c5.523 0 10 4.477 10 10a1 1 0 1 1-2 0 8 8 0 0 0-8-8 1 1 0 0 1 0-2zm0 4a6 6 0 0 1 6 6 1 1 0 1 1-2 0 4 4 0 0 0-4-4 1 1 0 0 1 0-2zm.5 7a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"/>
</svg>
</a>
</sub>
</div>
{% if activities %}
{% for activity in activities %}
<div class="padding-x-24-px padding-y-16-px margin-y-8-px border-radius-3-px background-color-night">
{{ render(controller(
'App\\Controller\\ActivityController::event',
{ user : session.user, activity : activity }
)) }}
</div>
{% endfor %}
{% if pagination.pages > 1 %}
<div class="row margin-t-16-px">
<div class="column width-50 padding-t-16-px">
&nbsp;
</div>
<div class="column width-50 text-right">
{% if pagination.pages > 1 %}
{{ 'Page' | trans | lower }} {{ pagination.page }} / {{ pagination.pages }}
{% if pagination.page > 1 %}
{% if pagination.page == 2 %}
<a rel="nofollow" class="button margin-l-8-px" href="{{ path('torrent_info', { torrentId : torrent.id }) }}#activity">
{{ 'Back' | trans | lower }}
</a>
{% else %}
<a rel="nofollow" class="button margin-l-8-px" href="{{ path('torrent_info', { torrentId : torrent.id, page : pagination.page - 1 }) }}#activity">
{{ 'Back' | trans | lower }}
</a>
{% endif %}
{% endif %}
{% if pagination.page < pagination.pages %}
<a rel="nofollow" class="button margin-l-8-px" href="{{ path('torrent_info', { torrentId : torrent.id, page : pagination.page + 1 }) }}#activity">
{{ 'Next' | trans | lower }}
</a>
{% endif %}
{% endif %}
</div>
</div>
{% endif %}
{% endif %}
{% endblock %}