- app/api/seo.py (+ app/templates/seo/*): publiczny HTML SEO router (programmatic entity long-tail: performer/studio/scene/landing/2257), bez api-key. Importowany przez main.py — wymagany do uruchomienia, dotąd untracked. Opsec-clean (brak VPS IP/sekretów). - CLAUDE.md: instrukcje projektu (dotąd untracked). - .gitignore: .nimbalyst/ (lokalne tracker-tooling, nie dla OSS repo). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
29 lines
1.2 KiB
HTML
29 lines
1.2 KiB
HTML
{% extends "seo/base.html" %}
|
|
{% block title %}{{ performer.canonical_name }} — scenes & videos | Goon{% endblock %}
|
|
{% block description %}Browse {{ scenes|length }} {{ performer.canonical_name }} scenes aggregated across multiple sources. Find where to watch — free metadata index by Goon.{% endblock %}
|
|
{% block og_type %}profile{% endblock %}
|
|
|
|
{% block jsonld %}
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context":"https://schema.org",
|
|
"@type":"Person",
|
|
"name": {{ performer.canonical_name|tojson }},
|
|
{% if aliases %}"alternateName": {{ aliases|tojson }},{% endif %}
|
|
{% if performer.gender %}"gender": {{ performer.gender.value|tojson }},{% endif %}
|
|
{% if performer.country %}"nationality": {{ performer.country|tojson }},{% endif %}
|
|
"url": {{ canonical|tojson }}
|
|
}
|
|
</script>
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
<h1>{{ performer.canonical_name }}</h1>
|
|
<p class="meta">
|
|
{% if aliases %}aka {{ aliases|join(", ") }}<br>{% endif %}
|
|
{% if performer.gender %}{{ performer.gender.value|replace("_"," ") }}{% endif %}
|
|
{% if performer.country %} · {{ performer.country }}{% endif %}
|
|
· {{ scenes|length }} scenes indexed
|
|
</p>
|
|
{% include "seo/_cards.html" %}
|
|
{% endblock %}
|