[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80740":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":13,"stars30d":15,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":16,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":19,"hasPages":17,"topics":20,"createdAt":8,"pushedAt":8,"updatedAt":21,"readmeContent":22,"aiSummary":23,"trendingCount":14,"starSnapshotCount":14,"syncStatus":15,"lastSyncTime":24,"discoverSource":25},80740,"yt-pub-livesx","inematds\u002Fyt-pub-livesx","inematds",null,"Python",43,21,41,1,0,2,38.73,false,"main",true,[],"2026-06-12 04:01:29","# yt-pub-livesx\n\n![YouTube Live Clips — Fabrica de Videos](assets\u002Fbanner.jpg)\n\nPipeline automatizado para cortar lives do YouTube em clips por topico e publicar em outro canal.\n\n**Canal de origem** (lives): [INEMA TDS](https:\u002F\u002Fwww.youtube.com\u002F@inematdsx) (`UC2QbQDyPKuHk93dwo5iq3Sw`)\n**Canal de destino** (clips): [INEMA TIA](https:\u002F\u002Fwww.youtube.com\u002F@InemaTIA) (`UCavuQHkxBSAZbzRoOm6Gq4g`)\n\n## Fluxo\n\n```\nYouTube (lives do canal origem) → Transcricao → Analise IA → Corte (FFmpeg) → Thumbnail (IA) → Publicacao (canal destino)\n```\n\n1. **Sincroniza** lives do canal de origem via YouTube Data API\n2. **Baixa transcricao** automatica (legendas do YouTube)\n3. **Analisa topicos** com IA (Piramyd\u002FClaude\u002FOpenRouter API)\n4. **Corta clips** com FFmpeg baseado nos timestamps\n5. **Gera thumbnails** com IA (LLM + gerador de imagem) ou local\n6. **Publica clips** no canal de destino com titulo, descricao, tags e thumbnail\n\n## Modos de entrada\n\nAlem do fluxo principal (cortar lives → gerar clips → publicar), o pipeline aceita mais duas fontes de video:\n\n1. **Lives do YouTube** → transcricao → analise IA → corte (FFmpeg) → thumbnail → publicacao\n2. **Import de videos** → pasta `imports\u002F` vira fila do pipeline → thumbnail → publicacao\n3. **Sync TikTok → YouTube** → scan de canais TikTok → download → fila do pipeline → publicacao no canal YouTube de destino\n\n## Estrutura\n\n```\nyt-pub-livesx\u002F\n├── config\u002F                    # Configuracao isolada do projeto\n│   ├── .env                   # Variaveis de ambiente (nao vai pro git)\n│   ├── client_secret.json     # Credenciais OAuth (nao vai pro git)\n│   ├── credentials.enc        # Tokens encriptados (nao vai pro git)\n│   ├── .encryption_key        # Chave AES-GCM (nao vai pro git)\n│   ├── prompt_cortes.txt      # Prompt IA para analise de topicos\n│   ├── prompt_pub.txt         # Prompt IA para refinar titulo\u002Fdescricao\n│   └── prompt_thumb.txt       # Prompt IA para gerar thumbnails\n├── data\u002F\n│   └── lives.db               # Banco SQLite local (nao vai pro git)\n├── dashboard\u002F\n│   ├── server.py              # Backend API (Python HTTP server)\n│   └── index.html             # Frontend SPA (vanilla JS)\n├── scripts\u002F\n│   ├── yt-auth                # Autenticacao OAuth standalone\n│   ├── yt-clip                # Pipeline: transcricao → analise → corte\n│   ├── yt-publish             # Upload de video para YouTube\n│   ├── yt-thumbnail           # Gera thumbnails com IA\n│   ├── setup-db               # Cria banco SQLite (com --import migra do Sheets)\n│   └── sync-instances         # Sync codigo para outras instancias\n├── systemd\u002F\n│   ├── yt-dashboard.service   # Service systemd (porta 8091)\n│   └── yt-scheduler.service   # Service systemd scheduler\n├── db.py                      # Modulo SQLite (CONFIG, LIVES, PUBLICADOS)\n├── scheduler.py               # Scheduler automatico\n├── docker-compose.yml         # Docker (porta 8091)\n├── Dockerfile\n├── requirements.txt\n├── setup.sh\n└── docs\u002F\n    └── SETUP-CANAL-DESTINO.md # Documentacao completa do setup\n```\n\n## Requisitos\n\n- Python 3.10+\n- ffmpeg\n- yt-dlp\n- deno (runtime JS para yt-dlp)\n- curl\n- Pillow (thumbnails)\n\n## Arquitetura: master + canais\n\nO sistema e composto por **1 master-dashboard** + **N instancias** (1 por canal).\n\n```\n~\u002Fprojetos\u002F\n├── yt-pub-livesx\u002F              ← TEMPLATE (este repo, sem credenciais)\n│   ├── master-dashboard\u002F       ← agrega todas as instancias\n│   ├── scripts\u002Fsetup-system    ← Parte 1: sobe master\n│   └── scripts\u002Fsetup-canal     ← Parte 2: cria instancia nova\n│\n├── yt-pub-lives1\u002F              ← Canal 1 (copia do template)\n│   ├── config\u002F.env             ← credenciais GCP do canal 1\n│   ├── config\u002Fcredentials.enc  ← OAuth tokens do canal 1\n│   ├── data\u002Flives.db           ← SQLite isolado\n│   └── lives\u002F                  ← videos baixados\n│\n├── yt-pub-livesx\u002F              ← Canal 2 (idem)\n└── yt-pub-lives7\u002F              ← Canal N\n```\n\n### O que e compartilhado vs isolado\n\n| Recurso | Master (porta 8090) | Cada canal (porta 809N) |\n|---|---|---|\n| Codigo (Python\u002FHTML) | proprio (pasta template) | propria copia |\n| Banco SQLite | nao usa | `data\u002Flives.db` proprio |\n| Credenciais GCP | nao usa | projeto GCP proprio |\n| OAuth do canal | nao | `config\u002Fcredentials.enc` proprio |\n| Service systemd | `yt-master-dashboard` | `yt-dashboard\u003CN>` + `yt-scheduler\u003CN>` |\n| Atualizacao de codigo | manual no template | via `sync-instances` (opt-in) |\n\n### Servicos systemd (modelo final)\n\n```\nyt-master-dashboard           → porta 8090 (agrega todos)\nyt-dashboard1 + yt-scheduler1 → porta 8091 (canal 1)\nyt-dashboard2 + yt-scheduler2 → porta 8092 (canal 2)\n...\nyt-dashboardN + yt-schedulerN → porta 809N (canal N)\n```\n\nCada par `dashboard\u003CN>` + `scheduler\u003CN>` e **independente**: se um canal cai, os outros continuam. O master so consome as APIs HTTP de cada dashboard.\n\n### Fluxo de dados (1 canal)\n\n```\nYouTube (canal origem)\n    ↓ YouTube Data API v3\nscheduler\u003CN>  ─→  baixa lives novas (yt-dlp)\n    ↓\n    transcricao (legendas YouTube)\n    ↓\n    analise IA (Piramyd\u002FClaude) → topicos + timestamps\n    ↓\n    corte (FFmpeg)\n    ↓\n    geracao thumbnail (IA ou local)\n    ↓\n    upload via OAuth → YouTube (canal destino)\n    ↓\ndata\u002Flives.db  ←  log local + status\n    ↑\ndashboard\u003CN>   ←  UI de controle (porta 809N)\n    ↑\nmaster-dashboard ← agrega todos (porta 8090)\n```\n\n### Por que 1 canal = 1 instancia?\n\n- **OAuth do YouTube e por usuario\u002Fcanal** — nao da pra autenticar 2 canais no mesmo OAuth\n- **Cota da YouTube Data API e por projeto GCP** — separar projetos = cotas independentes\n- **Isolamento de falhas** — bug ou rate-limit num canal nao afeta os outros\n- **Sync de codigo opcional** — `scripts\u002Fsync-instances` propaga atualizacoes do template; cada instancia decide se entra\n\n## Instalacao\n\nA instalacao e dividida em **duas partes independentes**:\n\n- **Parte 1 — `setup-system`** (1x por maquina): sobe o master-dashboard\n  na porta 8090 e prepara dependencias.\n- **Parte 2 — `setup-canal`** (1x por canal, inclusive o primeiro): cria\n  uma nova instancia copiando este template.\n\n> Esta pasta (`yt-pub-livesx`) e o **template oficial** — nunca deve\n> conter `.env`, credenciais ou dados. Toda nova instancia e copia\n> dela.\n\n### Parte 1 — Setup do sistema\n\n```bash\ngit clone \u003Crepo> yt-pub-livesx\ncd yt-pub-livesx\n.\u002Fsetup.sh                    # equivalente a: .\u002Fscripts\u002Fsetup-system\n```\n\nO script:\n1. Verifica `python3`, `ffmpeg`, `curl`, `yt-dlp`, `deno`\n2. Instala pacotes Python (`cryptography`, `anthropic`)\n3. Sobe o **master-dashboard** como systemd user service (`yt-master-dashboard`)\n4. Para com erro se a porta 8090 ja estiver em uso\n\nApos terminar: `http:\u002F\u002Flocalhost:8090`\n\n### Parte 2 — Adicionar canal\n\n```bash\n.\u002Fscripts\u002Fsetup-canal\n```\n\nAntes de rodar, tenha em maos:\n\n| Pergunta | Origem | Default |\n|---|---|---|\n| Nome da instancia | livre (ex: `yt-pub-lives7`) | — |\n| Numero da instancia (services) | extraido do nome se terminar em digito | proximo livre |\n| Porta do dashboard | livre na maquina | proxima livre 8091+ |\n| `YOUTUBE_CHANNEL_ID` (origem) | UC... do canal de onde vem as lives | INEMA TDS |\n| Handle do canal de destino | so doc | opcional |\n| `CLIENT_ID` \u002F `CLIENT_SECRET` | GCP → OAuth Client ID (Desktop App) | — |\n| `API_KEY` | GCP → API Key (YouTube Data API v3) | — |\n| `GCP_PROJECT` | id do projeto GCP | — |\n| `PIRAMYD_API_KEY` | painel Piramyd | — |\n| Senha do dashboard | livre | `Inema2026$$$` |\n| Adicionar ao `sync-instances`? | s\u002FN | N |\n\n> **ENTER em qualquer pergunta com `[default]` aceita o default mostrado.**\n\n#### Pre-requisitos no Google Cloud (1 projeto por instancia)\n\nCada instancia precisa de um **projeto Google Cloud proprio**:\n\n1. Acesse [Google Cloud Console](https:\u002F\u002Fconsole.cloud.google.com) e crie um projeto (ex: `yt-pub-lives7`)\n2. Ative a API: **YouTube Data API v3**\n   - Menu: APIs & Services → Library → YouTube Data API v3 → Enable\n3. Configure o **OAuth Consent Screen**:\n   - Tipo: **External**, modo **Testing**\n   - Scopes: `youtube`, `youtube.upload`\n   - Test users: adicione o **email da conta dona do canal de destino**\n4. Crie credenciais **OAuth 2.0 → Desktop App**:\n   - Authorized redirect URIs: `http:\u002F\u002Flocalhost:8888`\n   - Para re-auth pelo master-dashboard: tambem `http:\u002F\u002Flocalhost:8090\u002Fapi\u002Fauth\u002Fcallback`\n   - Anote `CLIENT_ID` e `CLIENT_SECRET`\n5. Crie uma **API Key** — anote o valor\n6. (Opcional) Verifique o telefone do canal em `youtube.com\u002Fverify`\n   - Necessario para upload de **thumbnails customizadas**\n\n#### O que o `setup-canal` faz\n\n1. Faz as perguntas acima (ENTER aceita default)\n2. Mostra resumo, pede confirmacao (`[S\u002Fn]`)\n3. `cp -r` deste template para `~\u002Fprojetos\u002F\u003Cnome>\u002F`\n4. Limpa `data\u002F`, `lives\u002F`, `.git\u002F` e arquivos sensiveis (`.env`, `credentials.enc`, `.encryption_key`)\n5. Gera `config\u002F.env` (chmod 600) com as respostas\n6. Patcha service files (porta, paths, dependencia entre dashboard\u002Fscheduler)\n7. Cria symlinks em `~\u002F.config\u002Fsystemd\u002Fuser\u002Fyt-dashboard\u003CN>.service` e `yt-scheduler\u003CN>.service`\n8. Sobe o **dashboard** e **pausa** para voce rodar OAuth manualmente\n9. Apos OAuth: sobe o **scheduler**\n10. (Opcional) registra a instancia em `scripts\u002Fsync-instances`\n\nURL final: `http:\u002F\u002Flocalhost:\u003Cporta>` — e ja aparece no master `http:\u002F\u002Flocalhost:8090`\n\n### Autenticacao OAuth (passo manual dentro do `setup-canal`)\n\nQuando o `setup-canal` pausa, abra **outro terminal** e rode:\n\n```bash\nGWS_CONFIG_DIR=~\u002Fprojetos\u002F\u003Cnome>\u002Fconfig python3 ~\u002Fprojetos\u002F\u003Cnome>\u002Fscripts\u002Fyt-auth\n```\n\nO `yt-auth`:\n1. Gera um link de autenticacao do Google\n2. Sobe um servidor local em `http:\u002F\u002Flocalhost:8888` aguardando callback\n3. Voce abre o link no browser e autoriza com a conta do canal de destino\n4. O callback salva os tokens encriptados em `config\u002Fcredentials.enc`\n\n**Troubleshooting OAuth:**\n- *\"Access blocked\"*: clique em **Avancado → Ir para (app) (nao seguro)** (normal em modo Testing)\n- *\"app has not completed verification\"*: a conta nao esta como **test user** — adicione em GCP → OAuth Consent Screen → Test users\n- *\"Unable to connect localhost:8888\"*: o script `yt-auth` ja terminou — rode de novo e abra o link **enquanto ele estiver rodando**\n- Varias contas no browser: use **aba anonima** ou adicione `&login_hint=email@gmail.com` ao link\n\n**Re-autenticacao pelo Master Dashboard (porta 8090):**\n\nO master usa `redirect_uri=http:\u002F\u002Flocalhost:8090\u002Fapi\u002Fauth\u002Fcallback`. Esse URI precisa estar **tambem** cadastrado em GCP → Credentials → OAuth Client ID da instancia → Authorized redirect URIs. Sem isso, a re-auth falha mesmo apos autorizar no Google.\n\n### Banco de dados (SQLite local)\n\nCriado automaticamente ao iniciar o scheduler ou dashboard. Para criar manualmente:\n\n```bash\npython3 scripts\u002Fsetup-db                # cria DB vazio\npython3 scripts\u002Fsetup-db --import       # cria DB e importa do Google Sheets (legacy)\n```\n\nBanco em `data\u002Flives.db` com tabelas **config**, **lives**, **publicados**.\n\n### Deploy em VPS (Ubuntu\u002FDebian)\n\nPasso-a-passo do zero numa VPS limpa.\n\n#### 1. Pacotes do sistema\n\n```bash\nsudo apt-get update\nsudo apt-get install -y python3 python3-pip ffmpeg curl git unzip pipx\npipx install yt-dlp\n\n# Deno (runtime JS usado pelo yt-dlp)\ncurl -fsSL https:\u002F\u002Fdeno.land\u002Finstall.sh | sh\necho 'export PATH=\"$HOME\u002F.deno\u002Fbin:$PATH\"' >> ~\u002F.bashrc\nsource ~\u002F.bashrc\n```\n\n#### 2. Habilitar lingering (services rodam sem login SSH)\n\n```bash\nsudo loginctl enable-linger $USER\n```\n\nSem isso, todos os `--user` services param quando voce desconectar do SSH.\n\n#### 3. Clonar e rodar Parte 1\n\n```bash\nmkdir -p ~\u002Fprojetos && cd ~\u002Fprojetos\ngit clone https:\u002F\u002Fgithub.com\u002Finematds\u002Fyt-pub-livesx.git\ncd yt-pub-livesx\n.\u002Fsetup.sh\n```\n\n#### 4. Firewall — opcional mas recomendado\n\n```bash\nsudo ufw allow OpenSSH\nsudo ufw allow 8090\u002Ftcp        # master-dashboard\nsudo ufw allow 8091:8099\u002Ftcp   # range das instancias\nsudo ufw enable\n```\n\nPara nao expor portas publicamente, mantenha o firewall fechado e use **SSH tunnel** da sua maquina local:\n\n```bash\nssh -L 8090:localhost:8090 -L 8091:localhost:8091 user@vps\n```\n\n#### 5. Criar primeiro canal\n\n```bash\n.\u002Fscripts\u002Fsetup-canal\n```\n\n**OAuth numa VPS sem browser:** quando o `setup-canal` pausar, abra **outro terminal SSH com tunnel da porta 8888**:\n\n```bash\nssh -L 8888:localhost:8888 user@vps\n# dentro da VPS:\nGWS_CONFIG_DIR=~\u002Fprojetos\u002Fyt-pub-lives1\u002Fconfig python3 ~\u002Fprojetos\u002Fyt-pub-lives1\u002Fscripts\u002Fyt-auth\n```\n\nCopie o link gerado, abra no **browser da sua maquina local**, autorize. O callback chega em `localhost:8888` local → via tunnel SSH → cai na VPS e salva os tokens encriptados.\n\n#### 6. Verificar\n\n```bash\nsystemctl --user list-units --type=service --state=active | grep yt-\njournalctl --user -u yt-dashboard1 -f\njournalctl --user -u yt-scheduler1 -f\n```\n\n#### 7. Backup (essencial)\n\nSalve regularmente **fora da VPS**:\n\n- `config\u002Fcredentials.enc` — sem isso, precisa refazer OAuth\n- `config\u002F.encryption_key` — sem essa chave, `credentials.enc` e inutil\n- `data\u002Flives.db` — historico de lives processadas\n\n```bash\ntar -czf backup-$(date +%F).tar.gz \\\n  ~\u002Fprojetos\u002Fyt-pub-lives*\u002Fconfig\u002F.env \\\n  ~\u002Fprojetos\u002Fyt-pub-lives*\u002Fconfig\u002Fcredentials.enc \\\n  ~\u002Fprojetos\u002Fyt-pub-lives*\u002Fconfig\u002F.encryption_key \\\n  ~\u002Fprojetos\u002Fyt-pub-lives*\u002Fdata\u002Flives.db\n```\n\n#### Recursos minimos da VPS\n\n| Recurso | Minimo | Recomendado |\n|---|---|---|\n| CPU | 2 vCPU | 4 vCPU (FFmpeg corta video) |\n| RAM | 2 GB | 4 GB |\n| Disco | 20 GB | 50+ GB (videos baixados ficam em `lives\u002F`) |\n| Banda | 1 TB\u002Fmes | depende de quantos canais |\n| OS | Ubuntu 22.04+ \u002F Debian 12+ | — |\n\n> **Disco:** videos brutos ficam em `lives\u002F` ate o pipeline cortar e publicar. Configure cleanup periodico ou o disco enche:\n> ```bash\n> find ~\u002Fprojetos\u002Fyt-pub-lives*\u002Flives -mtime +7 -delete\n> ```\n\n### Prompts de IA (opcional)\n\nCopie os prompts personalizados para `config\u002F`:\n```bash\ncp ~\u002Fcaminho\u002Fprompt_cortes.txt config\u002F\ncp ~\u002Fcaminho\u002Fprompt_pub.txt config\u002F\ncp ~\u002Fcaminho\u002Fprompt_thumb.txt config\u002F\n```\n\nOu edite pelo dashboard na aba de configuracao.\n\n## Uso\n\n### Dashboard Web\n\n```bash\npython3 dashboard\u002Fserver.py [porta]    # padrao: 8091\n```\n\nAcesse `http:\u002F\u002Flocalhost:8091` — ao abrir o browser pela primeira vez sera pedida a senha.\n\n#### Autenticacao\n\nTodos os dashboards (master `:8090` e cada canal `:809N`) exigem senha para acesso.\n\n- **Senha default:** `Inema2026$$$`\n- **Configurada em:** `config\u002F.env` → variavel `DASHBOARD_PASSWORD`\n- **Cookie de sessao** (`ds`) dura 30 dias; expira se o service reiniciar\n\n**Trocar a senha** (via curl ou pelo devtools do browser):\n```bash\ncurl -X POST http:\u002F\u002Flocalhost:8091\u002Fapi\u002Fconfig\u002Fpassword \\\n  -b \"ds=SEU_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"current\":\"Inema2026$$$\",\"new\":\"NovaSenha\"}'\n```\n\nO token `ds` aparece nos cookies do browser apos o login. A troca invalida todas as sessoes ativas (force re-login).\n\n**Instancias existentes** (criadas antes desta versao): adicionar manualmente ao `config\u002F.env`:\n```\nDASHBOARD_PASSWORD=Inema2026$$$\n```\nE reiniciar o service: `systemctl --user restart yt-dashboard\u003CN>`.\n\n> **TODO (seguranca — revisar):**\n> A implementacao atual e adequada para uso interno em VPS com SSH tunnel,\n> mas tem limitacoes que devem ser avaliadas antes de expor em rede aberta:\n> - Sem rate limiting em `\u002Fapi\u002Flogin` — suscetivel a brute force\n> - Senha gravada em texto puro no `.env` (nao e hash)\n> - Sem TLS: cookie e senha trafegam em claro (risco em redes nao confiaveis)\n> - Sessions em memoria: restart do service = logout forcado de todos\n> - Sem expiracao por inatividade (so pelo Max-Age de 30 dias)\n> - Sem 2FA\n> Enquanto o acesso for via SSH tunnel local, o risco e baixo. Se expor\n> publicamente, o minimo e colocar um reverse proxy (nginx) com HTTPS.\n\nPainel com:\n- Stats clicaveis (total lives, cortadas, pendentes, clips aguardando, publicados)\n- Configuracao de horarios (picker visual 24h)\n- Tabela de lives com filtro por status\n- Aba Clips unificada: publicados + pendentes\n- Controle de clips: pausar\u002Fretomar publicacao individual\n- Reprocessar lives com erro\n- Controle de privacy\n- Configuracao de thumbnails\n- Status do scheduler em tempo real\n\n### Docker\n\n```bash\ndocker-compose up -d\n```\n\nDashboard em `http:\u002F\u002Flocalhost:8091`.\n\n### Systemd (user services)\n\n```bash\n# Criar symlinks (exemplo para lives5, porta 8095)\nln -sf \u002Fhome\u002Fnmaldaner\u002Fprojetos\u002Fyt-pub-lives5\u002Fsystemd\u002Fyt-scheduler.service ~\u002F.config\u002Fsystemd\u002Fuser\u002Fyt-scheduler5.service\nln -sf \u002Fhome\u002Fnmaldaner\u002Fprojetos\u002Fyt-pub-lives5\u002Fsystemd\u002Fyt-dashboard.service ~\u002F.config\u002Fsystemd\u002Fuser\u002Fyt-dashboard5.service\nsystemctl --user daemon-reload\nsystemctl --user enable --now yt-scheduler5 yt-dashboard5\n```\n\n### Multi-instancia\n\n**Convencao recomendada:** nome do projeto GCP = nome do canal de destino\n(facilita auditoria — voce vê na GCP Console qual canal cada projeto serve).\n\n| Instancia | Porta | Scheduler | Dashboard | Canal Destino | GCP Project |\n|-----------|-------|-----------|-----------|---------------|-------------|\n| lives1 | 8091 | yt-scheduler1 | yt-dashboard1 | INEMA TDS | inema-tds |\n| lives2 | 8092 | yt-scheduler2 | yt-dashboard2 | INEMA TIA | inema-tia |\n| lives3 | 8093 | yt-scheduler3 | yt-dashboard3 | INEMA TDS | inema-tds-2 |\n| lives4 | 8094 | yt-scheduler4 | yt-dashboard4 | INEMA Tec | inema-tec |\n| lives5 | 8095 | yt-scheduler5 | yt-dashboard5 | INEMA PROMPTS | inema-prompts |\n| lives6 | 8096 | yt-scheduler6 | yt-dashboard6 | INEMA Robot | inema-robot |\n\n**Sync codigo** (`yt-pub-livesx` e o template fonte):\n```bash\n.\u002Fscripts\u002Fsync-instances    # Propaga codigo do template para as instancias listadas\n```\n\n**Restart todos:**\n```bash\nsystemctl --user restart yt-scheduler{1..6} yt-dashboard{1..6}\n```\n\n### Cortar uma Live\n\n```bash\nyt-clip \u003Cvideo_id>                    # Modo manual (gera prompt)\nyt-clip \u003Cvideo_id> --ai piramyd-api   # Modo automatico (Piramyd API)\nyt-clip \u003Cvideo_id> --dry-run          # So mostra topicos\nyt-clip \u003Cvideo_id> --publish          # Corta e publica\n```\n\n### Gerar Thumbnail\n\n```bash\nyt-thumbnail --title \"Titulo do clip\" --output thumb.jpg\n```\n\n### Publicar um Video\n\n```bash\nyt-publish video.mp4 --title \"Titulo\" --description \"Descricao\"\nyt-publish video.mp4 --title \"Titulo\" --description \"Desc\" --privacy unlisted --tags \"ia,dev\"\n```\n\n## Tecnologias\n\n- **Backend**: Python 3 (stdlib HTTPServer, sem frameworks)\n- **Frontend**: HTML\u002FCSS\u002FJS vanilla (single page, sem build)\n- **Banco**: SQLite local (WAL mode, sem dependencia externa)\n- **APIs**: YouTube Data API v3\n- **IA**: Piramyd API \u002F Anthropic Claude API \u002F OpenRouter (analise de topicos + thumbnails)\n- **Video**: FFmpeg (corte), yt-dlp (download)\n- **Auth**: OAuth 2.0 com refresh token (AES-GCM encrypted)\n\n## Licenca\n\nUso interno — INEMA TDS (@inematdsx)\n","yt-pub-livesx 是一个自动化工具，用于将YouTube直播视频剪辑成多个主题片段，并发布到另一个频道。其核心功能包括通过YouTube Data API同步源频道的直播视频、自动下载字幕并使用AI分析主题、利用FFmpeg按时间戳切割视频片段、生成缩略图（支持AI或本地生成）以及在目标频道上发布带有标题、描述和标签的视频片段。该项目还支持从导入文件夹中的视频开始处理流程或将TikTok视频同步至YouTube。适合需要高效管理和分发视频内容的场景，如教育机构、媒体公司等。","2026-06-11 04:01:51","CREATED_QUERY"]