Initial commit: RECON codebase baseline

Current state of the pipeline code as of 2026-04-14 (Phase 1 scaffolding complete).
Config has new_pipeline.enabled=false and crawler.sites=[] per refactor plan.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Matt 2026-04-14 14:57:23 +00:00
commit 563c16bb71
59 changed files with 18327 additions and 0 deletions

View file

@ -0,0 +1,53 @@
{% extends "base.html" %}
{% block content %}
<h3 class="section-title mb-16">PeerTube Channels</h3>
<div class="stat-grid" id="pt-stats" style="margin-bottom:24px;">
<div class="stat-card"><div class="value" id="pt-total-ch"></div><div class="label">Channels</div></div>
<div class="stat-card"><div class="value" id="pt-total-vid"></div><div class="label">Videos</div></div>
<div class="stat-card"><div class="value" id="pt-dl-status"></div><div class="label">Downloader</div></div>
</div>
<div class="panel">
<div class="flex gap-8" style="flex-wrap:wrap;align-items:flex-end;margin-bottom:12px;">
<div style="flex:1;min-width:250px;">
<label class="text-dim text-xs" style="text-transform:uppercase;display:block;margin-bottom:4px;">YouTube URL</label>
<input type="text" id="pt-yt-url" class="search-box" placeholder="https://www.youtube.com/@ChannelName" style="margin-bottom:0;width:100%;">
</div>
<div style="min-width:150px;">
<label class="text-dim text-xs" style="text-transform:uppercase;display:block;margin-bottom:4px;">Category</label>
<input type="text" id="pt-category" list="pt-cat-list" class="search-box" placeholder="e.g. OPSEC/Privacy" style="margin-bottom:0;width:100%;">
<datalist id="pt-cat-list"></datalist>
</div>
<div style="min-width:60px;">
<label class="text-dim text-xs" style="text-transform:uppercase;display:block;margin-bottom:4px;">Priority</label>
<select id="pt-priority" style="background:#0a0a0a;border:1px solid #333;color:#c0c0c0;padding:6px 10px;font-family:inherit;font-size:12px;width:100%;">
<option value="M">M</option>
<option value="H">H</option>
<option value="L">L</option>
</select>
</div>
<button class="btn" id="pt-add-btn" onclick="addChannel()">Add Channel</button>
</div>
<div id="pt-feedback" style="font-size:12px;min-height:18px;"></div>
</div>
<div style="background:#111;border:1px solid #222;overflow-x:auto;">
<table style="width:100%;border-collapse:collapse;font-size:12px;" id="pt-channel-table">
<thead>
<tr style="border-bottom:1px solid #222;">
<th style="text-align:left;padding:10px;">Channel</th>
<th style="text-align:center;padding:10px;">Videos</th>
<th style="text-align:left;padding:10px;">Category</th>
<th style="text-align:center;padding:10px;">Pri</th>
<th style="text-align:center;padding:10px;">Status</th>
<th style="text-align:center;padding:10px;width:60px;"></th>
</tr>
</thead>
<tbody id="pt-channel-tbody"><tr><td colspan="6" style="text-align:center;padding:20px;color:#555;">Loading...</td></tr></tbody>
</table>
</div>
{% endblock %}
{% block scripts %}
<script src="/static/js/channels.js"></script>
{% endblock %}

View file

@ -0,0 +1,53 @@
{% extends "base.html" %}
{% block content %}
<div id="pt-dashboard">
<div class="stat-grid" style="grid-template-columns:repeat(6, 1fr);">
<div class="stat-card"><div class="label">Published</div><div class="value" id="pt-published"></div></div>
<div class="stat-card"><div class="label">In Pipeline</div><div class="value" id="pt-in-pipeline"></div></div>
<div class="stat-card"><div class="label">Failed</div><div class="value" id="pt-failed"></div></div>
<div class="stat-card"><div class="label">Import Rate</div><div class="value" id="pt-import-rate"></div><div class="sublabel">/hour</div></div>
<div class="stat-card"><div class="label">GPU Util</div><div class="value" id="pt-gpu-util"></div><div class="sublabel">%</div></div>
<div class="stat-card"><div class="label">GPU Temp</div><div class="value" id="pt-gpu-temp"></div><div class="sublabel">&deg;C</div></div>
</div>
<div class="mb-24">
<div class="flex-between" style="margin-bottom:4px;font-size:11px;color:#888;">
<span>Pipeline Flow</span>
<span id="pt-pipeline-summary"></span>
</div>
<div id="pt-pipeline-bar" class="pipeline-bar"></div>
<div id="pt-pipeline-legend" class="pipeline-legend"></div>
</div>
<div class="svc-row">
<div class="svc-item"><span class="svc-dot unknown" id="svc-downloader"></span>Downloader</div>
<div class="svc-item"><span class="svc-dot unknown" id="svc-importer"></span>Importer</div>
<div class="svc-item"><span class="svc-dot unknown" id="svc-transcoder"></span>Transcoder</div>
<div class="svc-item"><span class="svc-dot unknown" id="svc-runner"></span>Runner</div>
</div>
<div id="pt-gpu-panel" class="panel" style="display:none;">
<h3 class="section-title" style="margin-bottom:8px;">GPU Status</h3>
<div id="pt-gpu-detail" class="text-small text-muted"></div>
</div>
<div id="pt-chart-container" class="panel" style="display:none;">
<h3 class="section-title" style="margin-bottom:8px;">Pipeline Activity (24h)</h3>
<canvas id="pt-chart" width="800" height="200" style="width:100%;height:200px;"></canvas>
</div>
<div id="pt-storage" class="panel">
<h3 class="section-title" style="margin-bottom:12px;">Pipeline Storage</h3>
<div id="pt-storage-content" class="text-small text-muted">Loading...</div>
</div>
<details id="pt-errors-panel" class="errors-panel panel">
<summary>Recent Errors (<span id="pt-error-count">0</span>)</summary>
<div id="pt-errors-content" style="margin-top:8px;"></div>
</details>
</div>
{% endblock %}
{% block scripts %}
<script src="/static/js/charts.js"></script>
<script src="/static/js/peertube.js"></script>
{% endblock %}