Conversation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- updateDataLog 및 log/ 폴더 관련 코드 전체 제거 (DB가 성공/실패 상태 관리) - saveCrawlYoutubeFailedKYSongs 제거 (crawlYoutube가 DB 방식으로 전환되어 미사용) - replaceSupabaseFailed에서 loadValidKYSongs → loadCrawlYoutubeFailedKYSongs 버그 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Review Summary by QodoRefactor crawling pipeline with AI validation and database-backed checkpoints
WalkthroughsDescription• Remove unused @repo/query package and clean up dependencies • Replace file-based checkpoints with database-backed verification in crawlYoutubeVerify • Introduce AI-powered song validation using OpenAI gpt-4o-mini via validateSongMatch utility • Eliminate logging system (updateDataLog) and temporary crawling scripts (crawlYoutubeTemp, crawlYoutubeUbuntu) • Fix bug in replaceSupabaseFailed (incorrect function reference) • Add comprehensive CLAUDE.md documentation for crawling package architecture Diagramflowchart LR
A["Song Data<br/>num_ky=null"] -->|YouTube Scrape| B["Extract KY Number"]
B -->|Validate| C["validateSongMatch<br/>GPT-4o-mini"]
C -->|Valid| D["Update DB<br/>songs table"]
C -->|Invalid| E["Post to<br/>invalid_ky_songs"]
F["Existing KY Numbers"] -->|Re-verify| G["crawlYoutubeVerify"]
G -->|Check Match| C
G -->|Valid| H["Insert to<br/>verify_ky_songs"]
G -->|Invalid| I["Reset num_ky=null"]
File Changes1. packages/crawling/src/crawling/crawlYoutubeVerify.ts
|
Code Review by Qodo
1. ky-update 실패 숨김
|
| "ky-verify": "tsx src/crawling/crawlYoutubeVerify.ts", | ||
| "ky-update": "pnpm run ky-youtube & pnpm run ky-valid & pnpm run ky-verify", | ||
| "trans": "tsx src/postTransDictionary.ts", |
There was a problem hiding this comment.
1. Ky-update 실패 숨김 🐞 Bug ⛯ Reliability
ky-update가 &로 3개 스크립트를 백그라운드 병렬 실행해, 일부 작업이 실패해도 전체 명령이 성공으로 보일 수 있습니다(마지막 foreground 프로세스 exit code만 반영). 결과적으로 크롤링/검증 실패가 탐지되지 않고 데이터 파이프라인이 부분 실패 상태로 남을 수 있습니다.
Agent Prompt
## Issue description
`ky-update` 스크립트가 `&` 백그라운드 실행을 사용하여 일부 작업 실패가 상위 명령의 실패로 전파되지 않을 수 있습니다. 이로 인해 크롤링/검증 파이프라인이 부분 실패해도 성공으로 보이는 문제가 발생합니다.
## Issue Context
현재 `ky-update`는 3개 스크립트를 병렬로 띄우되 실패 집계가 없습니다.
## Fix Focus Areas
- packages/crawling/package.json[9-16]
## Suggested changes
- (옵션 A, 안정) 순차 실행으로 변경: `pnpm run ky-youtube && pnpm run ky-valid && pnpm run ky-verify`
- (옵션 B, 병렬 유지) `concurrently`(또는 유사 툴) 도입 후 fail-fast/exit-code 집계 적용
- (옵션 C, 쉘 기반) 백그라운드 실행 후 `wait` 및 각 job의 종료코드 확인 로직 추가(가능하면 B 권장)
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| const browser = await puppeteer.launch(); | ||
| const page = await browser.newPage(); | ||
|
|
||
| const data = await getSongsKyNotNullDB(); | ||
| const verifiedIds = await getVerifyKySongsDB(); | ||
|
|
||
| console.log('getSongsKyNotNullDB : ', data.length); | ||
| console.log('이미 검증된 곡 수 : ', verifiedIds.size); | ||
| let index = 0; | ||
|
|
||
| for (const song of data) { | ||
| if (verifiedIds.has(song.id!)) { | ||
| continue; | ||
| } | ||
|
|
||
| console.log(song.title, ' - ', song.artist + ' : ', song.num_ky); | ||
| let isValid = true; | ||
| try { | ||
| isValid = await isValidKYExistNumber(page, song.num_ky, song.title, song.artist); | ||
| } catch (error) { | ||
| index++; | ||
| continue; | ||
| } | ||
|
|
||
| if (isValid) { | ||
| await postVerifyKySongsDB(song); | ||
| } else { | ||
| await updateSongsKyDB({ ...song, num_ky: null }); | ||
| } | ||
|
|
||
| index++; | ||
| console.log('crawlYoutubeVerify : ', index); | ||
| } | ||
|
|
||
| browser.close(); |
There was a problem hiding this comment.
2. Verify 브라우저 정리 누락 🐞 Bug ⛯ Reliability
새 crawlYoutubeVerify.ts가 browser.close()를 await하지 않고 try/finally로 감싸지 않아, 에러/중단 시 Chromium 프로세스가 남거나 스크립트가 종료되지 않고 hang될 수 있습니다.
Agent Prompt
## Issue description
`crawlYoutubeVerify.ts`가 Puppeteer 브라우저를 열고 종료 시 `browser.close()`를 `await`하지 않으며, 예외가 발생해도 항상 닫히도록 보장하는 `try/finally`가 없습니다. 이로 인해 프로세스 hang/리소스 누수가 발생할 수 있습니다.
## Issue Context
동일 패키지의 `crawlYoutube.ts`는 `finally`에서 `await browser.close()`로 안전하게 정리합니다.
## Fix Focus Areas
- packages/crawling/src/crawling/crawlYoutubeVerify.ts[12-46]
## Suggested changes
- 전체 로직을 `try { ... } catch { ... } finally { await browser.close(); }`로 구성
- 마지막 줄을 `await browser.close()`로 변경
- (선택) 예외 catch에서 최소한 song.id/title/artist/num_ky를 로그로 남김
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
📌 PR 제목
refactor : 크롤링 코드 개선
📌 변경 사항
전환
💬 추가 참고 사항