MyGo 云音乐
Go와 MyGo로 만든 서드파티 네이버 클라우드 뮤직 데스크톱 클라이언트
선별된 유튜브 채널을 골라 무작위 클립을 끊임없이 재생, 계정·API키·추천 피드 필요 없음
Pick a curated YouTube station and let random clips play nonstop. No account, no runtime API key, and no platform recommendation feed.
미디어TypeScript · JavaScriptGitHub @Significant-Hobbies온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Lean-back, zero-API-key YouTube TV player with curated channels and random playback.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
TV-like app that plays random YouTube videos from curated channels, nonstop. Pick a station, hit play, and lean back.
Zero API keys needed for playback or forks using the checked-in catalog. Maintained catalog refreshes use a cache-first YouTube Data API path with yt-dlp fallback; free-AI tagging runs only for new, untagged videos.
Fork it, edit stations.json with your own YouTube channels, and deploy. That's it.README 전문 보기 ↗Product: tv.significanthobbies.com
TV-like app that plays random YouTube videos from curated channels, nonstop. Pick a station, hit play, and lean back.
Zero API keys needed for playback or forks using the checked-in catalog. Maintained catalog refreshes use a cache-first YouTube Data API path with yt-dlp fallback; free-AI tagging runs only for new, untagged videos.
Fork it, edit
stations.jsonwith your own YouTube channels, and deploy. That's it.
Station pages now omit the portfolio strip so it cannot cover the full-viewport player. Browsing pages retain it. Next pressed while the YouTube iframe starts now loads the latest selection once ready, keeping the video and title aligned. The delayed-player browser regression reproduces the old failure and passes with the fix.
pnpm quality passes (233 tests). Built-browser checks at 1280×800, 390×844 and
844×390 found no horizontal overflow, all controls in bounds and working search
open/close. A fresh desktop public video after immediate Next showed a matching
iframe/control title and advancing playback; screenshot.
This is a representative local check, not qualification of all upstream videos.
The repair was deployed through Actions 34125220328 and passed hosted desktop/mobile acceptance. See the hosted receipt for actual YouTube playback, ready/startup Next, search, controls and separately controlled embed-error checks. Issue #51 is complete. The product remains inactive; catalog-wide availability, long-session playback and physical-device behavior are outside this representative check.
| Concern | Service |
|---|---|
| Hosting | Cloudflare Pages (looptv, tv.significanthobbies.com) — static Astro output, deployed via wrangler pages deploy |
| Database | None — static public/catalog.json served at runtime; watched history in browser localStorage |
| Analytics | PostHog via local posthog-js wrapper |
| AI / tagging | Free-AI LLM gateway in CI (multi-model fan-out) for untagged videos; local HuggingFace NER retained as an offline fallback, not run in CI |
| CI/CD | GitHub Actions — Pages deploys plus cache-first catalog refreshes on the 1st and 15th |
public/catalog-summary.json for the live count)dslim/bert-base-NER retained as a local offline fallback onlystations.json is the single config file. Each station groups one or more YouTube channels:
{
"id": "comedy",
"name": "Comedy",
"description": "Stand-up and sketches",
"sources": [
{ "name": "Comedy Central", "handle": "@ComedyCentral", "minDuration": 60, "maxDuration": 1800 }
]
}
pnpm install
pnpm dev
For a reliable refresh, set YOUTUBE_API_KEY. Without it, the fetcher falls back to yt-dlp:
brew install yt-dlp # or pip install yt-dlp
bash scripts/fetch-sources.sh
bash scripts/build-catalog.sh --process-only
Incremental AI tagging runs automatically in GitHub Actions only when new videos need tags. Local NER remains available:
pip install -r requirements-ner.txt
python3 scripts/extract-tags.py
stations.json <- Add YouTube channels here
|
fetch-sources.sh <- recent cache, then bounded Data API fetch; yt-dlp fallback
|
process-catalog.mjs <- Merges with existing catalog, preserves existing tags for known videos
|
tag-videos.mjs <- free-AI LLM gateway tags only new/untagged videos in CI
catalog.json <- Committed to repo, served as static JSON
|
Astro + React islands <- Picks random videos, plays via YouTube IFrame API
| Script | Description |
|---|---|
scripts/build-catalog.sh | Process cached sources into the static catalog |
scripts/fetch-sources.sh | Cache-first Data API fetch with yt-dlp fallback |
scripts/process-catalog.mjs | Merge raw JSONL into catalog.json, preserve existing tags |
scripts/tag-videos.mjs | Free-AI LLM gateway topic tagging for untagged videos (CI tagger) |
scripts/extract-tags.py | Local HuggingFace NER tagging fallback (not run in CI) |
scripts/fetch-all-sources.sh | Compatibility wrapper for fetching all sources |
| Key | Action |
|---|---|
| Space | Play / Pause |
| N / Right | Next random video |
| P / Left | Previous video |
| M | Mute / Unmute |
| F | Fullscreen |
| W | Hide watched videos |
| / | Search |
| 1-9 | Jump to station by number |
| Esc | Close search |
onError with code 101 or 150. Player.tsx treats
both as auto-skip: the video is added to a session skip set and the next
random pick fires immediately. There's no user-visible error and no
toast — by design, so the "TV channel" feel never breaks.stations.json is bundled) with a Retry button that re-runs the
fetch without a page reload. Dev builds show the build-catalog hint
instead.watched.ts keeps everything client-side in localStorage:
looptv_watched — set of video IDs seen ≥ 50% through.looptv_stats — counts by station + source, total seconds watched.looptv_blocked_sources — sources you opted out of.looptv_watch_later — bookmarked video IDs.looptv_smart_mix_profile — Smart Mix preference weights.looptv_prefs — default station, autoplay/mute on load, hide-watched toggle.Clearing site data wipes all of it; nothing leaves the browser.
The source workflow runs on the 1st and 15th. Complete source caches younger than 13 days make zero YouTube requests. Stale or missing sources scan at most 250 recent uploads, stop when known IDs are reached, request video metadata in batches of 50, and hard-stop at 20 requests per source. The chained build audits coverage and replacement churn before calling AI, tags only untagged additions, retries only still-pending tags once, and commits only a passing catalog.
For an occasional complete quality rebaseline, pnpm audit:catalog:full scans full upload histories at five requests per second with a 4,500-request global ceiling and per-source checkpoints. It is never scheduled. The July 12 baseline used 3,467 requests for all 122 sources; an immediate rerun used zero. See docs/operations/catalog-quality-audit.md.
Deployed on Cloudflare Pages as a static site: tv.significanthobbies.com.
pnpm build
wrangler pages deploy dist --project-name=looptv
dslim/bert-base-NER) retained as a local offline fallbackMIT
This section is maintained by the SaaS Maker Active-AI product/design loop so future agents do not reopen duplicate UI tasks.
| Task | Status | Priority | Last known note |
|---|---|---|---|
4a5a6c8c [fleet-smoke] looptv/web React hydration error | done | medium | 2026-05-25 18:55:41 |
fcdbf330 looptv: add clear offline catalog fallback | done | low | 2026-05-26 — landing-page banner with sample channels + Retry when /catalog.json fetch fails |