| μμ | νμΌ | μ»€λ° |
|---|---|---|
| ꡬλ μ·¨μ λ²νΌ UI (μ±λ ν€λ μ°μΈ‘) | frontend/src/app/page.tsx |
3912a7b |
| ꡬλ μ μ²μΌ νμ (ꡬλ μΌ: MMμ DDμΌ) | frontend/src/app/page.tsx |
3912a7b |
| DELETE /api/youtube/subscriptions/{channel_id} | backend/routers/youtube.py |
3912a7b |
| YouTube API ꡬλ μ·¨μ (unsubscribe_channel) | backend/services/youtube.py |
3912a7b |
| Next.js νλ‘μ: [channel_id]/route.ts | frontend/src/app/api/youtube/subscriptions/ |
3912a7b |
| DB subscribed_at μ»¬λΌ + λ§μ΄κ·Έλ μ΄μ | backend/database.py |
3912a7b |
| OAuth μ€μ½ν: youtube.readonly β youtube | frontend/src/app/api/auth/[...nextauth]/route.ts |
3912a7b |
| μκ° | μμ | μ»€λ° |
|---|---|---|
| μ€μ | <img> β next/image <Image> κ΅μ²΄ (νλ‘ν/μ±λ/μμ μΈλ€μΌ) |
23f9295 |
| μ€μ | next.config.ts remotePatterns 4κ° λλ©μΈ μΆκ° | 23f9295 |
| μ€ν | κ³μΈ΅ν μΉ΄ν κ³ λ¦¬ μ¬μ΄λλ° (λΆλͺ¨>μμ, μ κΈ°/νΌμΉκΈ°) | ccc5fc8 |
| μ€ν | μ΅κ·Ό 3μΌ μ΄λ΄ μμλ§ νμ | ccc5fc8 |
| μ€ν | ꡬλ λκΈ°ν μ playlistItems.listλ‘ μμ μλ μ μ₯ | ccc5fc8 |
| μ€ν | μ±λλͺ ν΄λ¦ β YouTube μ ν | d19fce5 |
| μ€ν | μΉ΄ν κ³ λ¦¬ invisible (ꡬλ μλ μΉ΄ν κ³ λ¦¬ μ¨κΉ) | d19fce5 |
| μ€ν | μΉ΄ν κ³ λ¦¬ κ°κ²© μ‘°λ°ν | d19fce5 |
| μ€ν | μΉ΄ν κ³ λ¦¬λͺ μ ꡬλ μ±λ μ νμ | b97722d |
| μ€ν | ꡬλ 0κ° μΉ΄ν κ³ λ¦¬ μμ μ¨κΉ νν° | 862005b |
| μ¦μ | μμΈ | ν΄κ²° |
|---|---|---|
| μ 체 Uncategorized | channel_title λ§€ν λΆμΌμΉ | channel_id ν€λ‘ λ³κ²½ |
| Gemini 429 μ€λ₯ | gemini-2.0-flash λ¬΄λ£ ν°μ΄ μμ§ | gemini-3-flash-preview μ ν |
| μΉ΄ν κ³ λ¦¬ μ ν μ보μ | μΉ΄ν κ³ λ¦¬ APIμ 3μΌ νν° κ³Όμ μ© | μΉ΄ν κ³ λ¦¬ κΈ°μ€μ ꡬλ μ λ¬΄λ‘ λ³΅κ΅¬ |
| μμ | κ²°κ³Ό |
|---|---|
| Google OAuth 401 (invalid_client) | GOOGLE_CLIENT_SECRET μ¬λ°λ₯Έ κ°μΌλ‘ κ΅μ²΄ |
| 403 access_denied | OAuth λμ νλ©΄ ν μ€νΈ μ¬μ©μ λ±λ‘ |
| OAuthCallback μ€λ₯ | Next.js ν¬νΈ 3000 κ³ μ |
| μλ² μ°λ μ€ν¨ | JWT_SECRET_KEY νκ²½λ³μ μΆκ° |
| uvicorn --reload .env λ―Έλ‘λ | --reload μ κ±°, ν¬νΈ 8003 μ¬μ© |
| Turbopack μΊμ μμ | .next μμ ν μ¬κΈ°λ |
| μμ | νμΌ |
|---|---|
| GET /api/youtube/categories ꡬν | backend/routers/youtube.py |
| GET /api/youtube/subscriptions ꡬν | backend/routers/youtube.py |
| νλ°νΈμλ μΉ΄ν κ³ λ¦¬ μ€μ API μ°λ | frontend/src/app/page.tsx |
| νλ°νΈμλ μμ μΉ΄λ μ€μ API μ°λ | frontend/src/app/page.tsx |
| N+1 쿼리 β JOIN λ¨μΌ 쿼리 μ΅μ ν | backend/routers/youtube.py |
| Gemini λΆλ₯: channel_id κΈ°λ° λ§€ν | backend/services/gemini.py |
| Gemini 50κ° λ°°μΉ μ²λ¦¬ | backend/services/gemini.py |
| .gitignore μΆκ° | .gitignore |
| GitHub μ μ₯μ μ΄κΈ° λ°°ν¬ | 21fa07d |
- Google OAuth λ‘κ·ΈμΈ (youtube μ€μ½ν)
- ꡬλ λκΈ°ν + AI μΉ΄ν κ³ λ¦¬ λΆλ₯
- μ΅κ·Ό 3μΌ μμ μλ μμ§
- κ³μΈ΅ν μΉ΄ν κ³ λ¦¬ μ¬μ΄λλ° (ꡬλ μ νμ)
- μ±λλͺ ν΄λ¦ β YouTube μ±λ μ ν
- μ±λ ꡬλ μ·¨μ (YouTube API + DB λμ μμ )
- ꡬλ μ μ²μΌ νμ
- ai_summary μλ μμ± (νμ¬ summarize-recent μλ νΈμΆ)
- μμ μ λͺ© ν΄λ¦ β YouTube λ§ν¬
- λκΈ°ν μ§νλ₯ UI (μ±λ λ§μ λ λκΈ° μκ° μμ)
- refresh_token κ°±μ λ‘μ§
- Turso νλ‘λμ μ ν
- ai_summary μλ μμ± νμ΄νλΌμΈ (λκΈ°ν μ λ°°μΉ μμ½)
- μμ μ λͺ© ν΄λ¦ β YouTube μμ λ§ν¬
- λκΈ°ν μ§νλ₯ νμ (SSE λλ ν΄λ§)