작품 · 03
OmniDL · 올인원 다운로더
범용 미디어 가져오기 엔진 —— 아무 링크나 붙여넣으면 자동 인식, 1000+ 사이트의 이미지/영상을 한 번에 다운로드. 안드로이드에서 로컬 실행 · 완전 오프라인 · 서버 제로. Kotlin + Python + yt-dlp 기반.
왜 만들었나
시작은 아주 구체적인 불편이었습니다. 이미지 한 장 저장하려고 앱 하나 설치하고, 영상 하나 저장하려고 또 다른 앱을 설치하고, 특정 사이트의 워터마크 영상을 위해 세 번째 도구를 찾아 헤맸습니다. 다운로드라는 행위가 사이트별로 조각나 있어선 안 됩니다 — 엔진 하나와 그 위의 껍데기 하나면 충분한 일입니다.
yt-dlp는 “하나의 엔진이 웹 전체를 소화한다”가 가능함을 이미 증명했지만, 명령줄 도구입니다. 제가 한 일은 이 엔진을 주머니에 넣는 것이었습니다: 안드로이드에서 로컬로 실행되고, 그 어떤 서버도 거치지 않는.
아키텍처 선택
- Kotlin 셸 + Python 엔진: UI와 작업 관리는 Kotlin 네이티브로 구현하고, 파싱과 다운로드 코어는 yt-dlp(Python)를 그대로 재사용합니다. 둘은 프로세스 브리지로 통신하며 각자 잘하는 일을 합니다.
- 완전 오프라인: 모든 파싱이 로컬에서 끝나고, 링크는 서드파티 서버를 거치지 않습니다. 프라이버시 약속인 동시에 운영 비용 제로 — 프로젝트는 조용히 여러 해를 살 수 있습니다.
- 배치 큐: 다운로드는 일회성 동작이 아니라 파이프라인입니다. 페이지 전체 이미지 일괄 수집, 이어 받기를 지원합니다.
어려운 점
가장 큰 도전은 Python 런타임의 안드로이드 이식이었습니다. 기기마다 ABI, 저장소 권한, 백그라운드 생존 전략이 제각각입니다. 최종 방안은 Python 환경을 자가 진단하는 리소스 번들로 포장해, 시작 시 항목별로 건강 검진을 하고 부족한 것을 보충하는 것 — 메인 프로그램에 if-else를 쌓는 대신.
현재 상태
- 1000+ 사이트 파싱 지원 (yt-dlp 업스트림 업데이트 추종)
- 페이지 전체 이미지 수집 + 영상 원터치 다운로드, 큐로 일괄 관리
- 완전 오프라인, 제 일상 다운로드를 2년째 지탱 중