feat: local content-mining platform for YouTube creator scraping

Scraper de canales de YouTube hacia notas Markdown para base de conocimiento
(Obsidian-ready), con plataforma web local.

Engine + CLI (Workstream A):
- Modular pipeline: discover/extract/parse/chapters/render/store + ratelimit
- SQLite store con migración idempotente: FTS5 (transcript search), columnas
  de metadata enriquecida, tablas cookies_meta y scrape_jobs
- Módulos: segments, cookies (Netscape vault), export (json/csv/srt/html),
  analysis (word freq/timeline/wordcloud), monitor (watch loop), pipeline
- CLI Click group: search, export, audio, channels, watch, analyze, re-render
- Fix del bug de scoping de cookies en cli.py

Webapp local (Workstream B):
- FastAPI backend: dashboard, channels, videos facetado, transcript, search
  FTS, analysis, scrape jobs con SSE, cookies drag-and-drop, exports,
  folders (abrir en OS), tools (re-render, formato)
- SPA no-build (Alpine.js + Tailwind + Chart.js por CDN): 9 vistas, tema
  dark command-center con acento rojo→rosa, cookie vault drag-drop,
  consola de scrapeo con progreso live vía SSE

Launcher + subagentes (Workstream C):
- start-server.bat / stop-server.bat con auto port-scan + browser open
- .opencode/agent/webapp-builder.md + .opencode/goals/webapp-build.md

Tests: 38 pytest verdes. Sin funcionalidad de IA (enfoque data-mining).
This commit is contained in:
urieljareth
2026-07-26 23:19:34 -06:00
commit 621bbc5f5c
45 changed files with 6541 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
---
video_id: {{ video_id }}
title: {{ title | quote_yaml }}
channel: {{ channel_name | quote_yaml }}
channel_id: {{ channel_id | default('') }}
channel_url: {{ channel_url | default('') }}
upload_date: {{ upload_date | default('') }}
duration: {{ duration | default(0) }}
url: {{ url }}
transcript_lang: {{ transcript_lang | default('') }}
transcript_src: {{ transcript_src | default('') }}
views: {{ view_count | default('') }}
likes: {{ like_count | default('') }}
tags: {{ tags | to_json if tags else '[]' }}
thumbnail: {{ thumbnail | default('') }}
---
# {{ title }}
> [Ver en YouTube]({{ url }})
{% if description %}{{ description }}
---
{% endif %}
## Transcripcion
{% for section in sections if section.segments %}
### {{ section.title }} ({{ section.start | format_timestamp }})
{% for seg in section.segments %}
**{{ seg.start | format_timestamp }}** · {{ seg.text }}
{% endfor %}
{% endfor %}