{"id":50593566,"url":"https://github.com/comerc/try-go-secrets","last_synced_at":"2026-06-05T12:03:51.650Z","repository":{"id":342118245,"uuid":"1171505110","full_name":"comerc/try-go-secrets","owner":"comerc","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-28T18:06:46.000Z","size":6180,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-28T18:23:03.218Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/comerc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-03T09:57:44.000Z","updated_at":"2026-05-28T18:06:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/comerc/try-go-secrets","commit_stats":null,"previous_names":["comerc/try-go-secrets"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/comerc/try-go-secrets","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comerc%2Ftry-go-secrets","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comerc%2Ftry-go-secrets/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comerc%2Ftry-go-secrets/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comerc%2Ftry-go-secrets/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/comerc","download_url":"https://codeload.github.com/comerc/try-go-secrets/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/comerc%2Ftry-go-secrets/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33939236,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-05T12:03:50.843Z","updated_at":"2026-06-05T12:03:51.645Z","avatar_url":"https://github.com/comerc.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Go Secrets Pipeline\n\nАвтоматизированный пайплайн генерации YouTube Shorts (\u003c60 сек) из 286 markdown-файлов с секретами Go.\n\n**Стек:** Go · Gemini TTS · Codex CLI / Claude Code CLI / z.ai · Puppeteer · FFmpeg\n\n---\n\n## Режимы запуска\n\nВ `.env` используются ключевые параметры запуска:\n\n| Переменная | Значение | Эффект |\n|---|---|---|\n| `LLM_BACKEND` | `codex-cli` (по умолчанию) | инференс через локальный Codex CLI |\n| `LLM_BACKEND` | `claude-cli` | инференс через локальный Claude Code CLI |\n| `LLM_BACKEND` | `zai-api` | инференс через z.ai API |\n| `LLM_MODEL` | например `gpt-5.5` | модель для Codex, Claude и z.ai |\n| `LLM_EFFORT` | `medium` по умолчанию | уровень reasoning/thinking для LLM-бэкенда |\n| `PUPPETEER_URL` | выбирается автоматически, если не задан | адрес локально запущенного Puppeteer-сервиса |\n\nПоддерживаемые уровни `LLM_EFFORT` зависят от бэкенда:\n\n- `claude-cli`: `low`, `medium`, `high`, `xhigh`, `max`\n- `codex-cli`: `low`, `medium`, `high`, `xhigh`\n- `zai-api`: `low`, `medium`, `high`\n\nДля `zai-api` значение `LLM_EFFORT` маппится так:\n\n- `low` -\u003e `thinking.disabled`\n- `medium` -\u003e `thinking.enabled`\n- `high` -\u003e `thinking.enabled` + `clear_thinking=false`\n\n---\n\n## Быстрый старт (локальный режим)\n\n```bash\n# 1. Скопировать и заполнить ключи API\ncp .env.example .env\n\n# 2. Убедиться что Codex CLI залогинен\ncodex login\n\n# 3. Конкретный файл по номеру\n./scripts/run.sh 43\n# → output/ru/videos/YYYY-MM-DD__NNN.mp4\n\n# Другой язык на один запуск\nVIDEO_LANG=es ./scripts/run.sh 43\n\n# 4. Случайный необработанный файл\n./scripts/run.sh\n\n# 5. Бесконечный цикл (все файлы подряд)\n./scripts/loop.sh\n```\n\n`run.sh` запускает pipeline локально (`go run ./cmd/main.go`). Если Puppeteer ещё не установлен, скрипт сам сделает `npm install` в `puppeteer/`, поднимет сервис на свободном порту и дождётся `/health`.\n\nРезультаты:\n- `output/\u003cVIDEO_LANG\u003e/` — видео, аудио, сценарии\n- `state/tts_usage.json` — общий учёт TTS\n- `state/\u003cVIDEO_LANG\u003e/` — `processed.json`, `youtube_schedule.json`\n\n---\n\n## YouTube автопубликация\n\nФинальный шаг пайплайна может автоматически загрузить готовый ролик в YouTube, поставить публикацию в расписание и добавить видео в плейлист.\n\nВключается через `.env`:\n\n```bash\nYOUTUBE_ENABLED=true\nYOUTUBE_CLIENT_ID=...\nYOUTUBE_CLIENT_SECRET=...\nYOUTUBE_REFRESH_TOKEN=...\nYOUTUBE_PLAYLIST_ID_RU=...\nTERMINAL_TITLE_RU=300 секретов Golang\nYOUTUBE_SCHEDULE_LOCATION_RU=Europe/Moscow\nYOUTUBE_SCHEDULE_TIME_RU=12:00\n```\n\nПоведение:\n- `Script.Title` отправляется как title ролика.\n- `Script.NarrationText` отправляется в description.\n- `TERMINAL_TITLE_\u003cVIDEO_LANG\u003e` отображается в заголовке терминала внутри видео.\n- Видео загружается как `private` с `publishAt`, то есть YouTube сам опубликует его в заданное время.\n- Публикация планируется по одному ролику в день. Занятые даты хранятся в `state/\u003cVIDEO_LANG\u003e/youtube_schedule.json`.\n- Ролик добавляется в плейлист `YOUTUBE_PLAYLIST_ID_\u003cVIDEO_LANG\u003e`.\n\nОпубликовать уже готовый ролик без перегенерации:\n\n```bash\n./scripts/pub.sh 43\n```\n\nСкрипт найдёт последние `output/\u003cVIDEO_LANG\u003e/scripts/*__043.json` и `output/\u003cVIDEO_LANG\u003e/videos/*__043.mp4`, выберет первую свободную дату и загрузит ролик в YouTube.\n\n`state/\u003cVIDEO_LANG\u003e/youtube_schedule.json` хранит только номер ролика и дату:\n\n```json\n{\n  \"043\": \"2026-05-03\"\n}\n```\n\nДля OAuth refresh token нужен доступ к YouTube Data API v3 со scope `https://www.googleapis.com/auth/youtube`.\n\n---\n\n## Исправление готового ролика (fix)\n\nЕсли нужно поправить озвучку/субтитры без перегенерации сценария через LLM:\n\n**1. Найти сценарий**\n\n```\noutput/ru/scripts/YYYY-MM-DD__NNN.json\n```\n\n**2. Отредактировать поля**\n\n| Поле | Что менять |\n|---|---|\n| `NarrationTags` | Gemini TTS markup tags для озвучки, например `[short pause]`, `[whispering]`; официальный список: https://docs.cloud.google.com/text-to-speech/docs/gemini-tts#markup_tag_guide |\n| `NarrationText` | Чистый текст субтитров (без Audio-Tags) |\n| `Segments[].Text` | Текст отдельного сегмента субтитров |\n\n**3. Запустить перегенерацию**\n\n```bash\n./scripts/fix.sh 43\n```\n\nСкрипт пропускает LLM, берёт отредактированный `NarrationTags` и заново синтезирует аудио + рендерит видео (Puppeteer + FFmpeg).\n\n---\n\n## Разработка\n\n```bash\n# Unit-тесты (парсер + выбор контента), без внешних зависимостей\ngo test ./tests/...\n\n# Тест TTS изолированно\ngo run ./cmd/main.go -test-tts \"Привет мир\"\n# → output/ru/audio/test-tts.wav\n\n# Puppeteer поднимается автоматически через `./scripts/run.sh` и `./scripts/fix.sh`\n```\n\n---\n\n## Переменные окружения\n\n| Переменная | Описание |\n|---|---|\n| `LLM_BACKEND` | `codex-cli` — Codex CLI, `claude-cli` — Claude Code CLI, `zai-api` — z.ai API |\n| `LLM_MODEL` | модель для Codex, Claude и z.ai (`glm-5.1` по умолчанию для z.ai) |\n| `LLM_EFFORT` | уровень effort/thinking для LLM-бэкенда |\n| `ZAI_API_KEY` | ключ z.ai API |\n| `GEMINI_API_KEY` | ключ Gemini API для TTS |\n| `GEMINI_TTS_MODEL` | модель Gemini TTS, по умолчанию `gemini-3.1-flash-tts-preview` |\n| `GEMINI_TTS_VOICE` | голос Gemini TTS; если пусто, выбирается случайно из `x-voices.md` |\n| `PUPPETEER_URL` | URL локального puppeteer-сервиса, подбирается автоматически |\n| `RAW_DIR` | папка с markdown-файлами, по умолчанию `./raw` |\n| `OUTPUT_DIR` | базовая папка с результатами, по умолчанию `./output`; язык добавляется автоматически |\n| `STATE_DIR` | базовая папка с состоянием, по умолчанию `./state`; язык добавляется автоматически |\n| `VIDEO_LANG` | язык нарратива и подпапок: `ru` (по умолчанию), `en-us`, `es` |\n| `VIDEO_WIDTH` | ширина видео в пикселях, по умолчанию `1080` |\n| `VIDEO_HEIGHT` | высота видео в пикселях, по умолчанию `1920` |\n| `VIDEO_FPS` | частота кадров, по умолчанию `30` |\n| `TERMINAL_TITLE_\u003cLANG\u003e` | текст в заголовке терминала внутри видео, например `TERMINAL_TITLE_EN_US` |\n| `YOUTUBE_ENABLED` | включает финальную загрузку и планирование YouTube |\n| `YOUTUBE_CLIENT_ID` | OAuth client id Google Cloud |\n| `YOUTUBE_CLIENT_SECRET` | OAuth client secret Google Cloud |\n| `YOUTUBE_REFRESH_TOKEN` | refresh token для YouTube Data API |\n| `YOUTUBE_PLAYLIST_ID_\u003cLANG\u003e` | ID плейлиста для языка, например `YOUTUBE_PLAYLIST_ID_RU` |\n| `YOUTUBE_SCHEDULE_LOCATION_\u003cLANG\u003e` | IANA-таймзона расписания, например `YOUTUBE_SCHEDULE_LOCATION_RU=Europe/Moscow` |\n| `YOUTUBE_SCHEDULE_TIME_\u003cLANG\u003e` | время публикации по выбранной таймзоне в формате `HH:MM`, например `YOUTUBE_SCHEDULE_TIME_RU=13:30` |\n\n---\n\nYOUTUBE_ENABLED=true ./scripts/runs.sh\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomerc%2Ftry-go-secrets","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcomerc%2Ftry-go-secrets","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcomerc%2Ftry-go-secrets/lists"}