프로젝트 개요
관련 소스 파일
이 페이지의 내용은 다음 소스 파일을 기반으로 생성되었습니다:
res-downloader는 Go 언어와 Wails 프레임워크를 기반으로 구축된 크로스 플랫폼 리소스 다운로더이다. 이 프로젝트는 로컬 프록시를 통해 네트워크 트래픽을 캡처하고, 다양한 플랫폼에서 비디오, 오디오, 이미지, m3u8, 라이브 스트림 등의 리소스를 필터링하여 다운로드할 수 있도록 설계되었다. Fiddler나 Charles와 유사한 원리로 동작하지만, 일반 사용자도 쉽게 사용할 수 있도록 직관적인 UI와 향상된 필터링 기능을 제공한다 (README-EN.md:1-104).
이 애플리케이션은 Windows, macOS, Linux를 지원하며, 위챗 채널, 미니 프로그램, Douyin, Kuaishou, Xiaohongshu, KuGou Music, QQ Music 등 다양한 플랫폼과 호환된다. 사용자는 프록시를 시작한 후 대상 콘텐츠를 열면, 애플리케이션이 자동으로 리소스를 감지하여 목록으로 표시한다 (README.md:1-32).
핵심 모듈
Go 백엔드 진입점 모듈
职责边界: Go 백엔드 진입점은 Wails 애플리케이션의 초기화, 윈도우 설정, 메뉴 구성, 에셋 서버 설정을 담당한다. 비즈니스 로직이나 데이터 처리는 core 패키지에 위임한다.
入口与关键 API: main 함수가 애플리케이션의 진입점이며, core.GetApp()과 core.NewBind()를 통해 앱 인스턴스와 바인딩 객체를 생성한다 (main.go:29-32).
go1func main() { 2 app := core.GetApp(assets, wailsJson) 3 bind := core.NewBind() 4 isMac := runtime.GOOS == "darwin" 5 // ... 6}
关键数据结构: options.App 구조체는 윈도우 크기(1280x800), 최소 크기(960x600), 프레임리스 모드, 배경색 등의 UI 설정을 포함한다. macOS에서만 시스템 메뉴를 활성화하는 플랫폼별 분기 처리가 존재한다 (main.go:43-56).
关键调用链:
main()→core.GetApp()→ 앱 메타데이터 로드wails.Run()→ 에셋 서버 및 미들웨어 초기화OnStartup콜백 →app.Startup(ctx)호출
错误处理与边界条件: Wails 런타임 에러는 err := wails.Run()의 반환값으로 처리되며, macOS 여부에 따라 프레임리스 모드(!isMac)가 결정된다 (main.go:49).
Vue 프론트엔드 진입점 모듈
职责边界: Vue 애플리케이션의 부트스트랩을 담당하며, 라우터, 상태 관리, i18n을 통합한다. UI 컴포넌트 렌더링은 App.vue와 하위 컴포넌트에 위임한다.
入口与关键 API: createApp(App)이 Vue 인스턴스를 생성하며, .use(router), .use(i18n), .use(createPinia()) 체인으로 플러그인을 등록한다 (frontend/src/main.ts:10-14).
typescript1createApp(App) 2 .use(router) 3 .use(i18n) 4 .use(createPinia()) 5 .mount('#app')
关键数据结构: Pinia 스토어는 appType.App과 appType.Config 타입의 반응형 상태를 관리한다. globalConfig는 프록시 설정(Host, Port), 테마, 로케일, 다운로드 디렉토리 등을 포함한다 (frontend/src/stores/index.ts:17-36).
关键调用链:
createApp()→ Vue 인스턴스 생성.use(createPinia())→ 상태 관리 초기화.mount('#app')→ DOM 마운트
错误处理与边界条件: Wails 런타임 환경은 Environment 함수를 통해 확인하며, Go 백엔드와의 통신은 bind 모듈을 통해 수행된다 (frontend/src/stores/index.ts:5-7).
라우팅 모듈
职责边界: SPA(Single Page Application)의 네비게이션을 관리하며, 해시 기반 라우팅을 사용한다. 페이지 컴포넌트의 지연 로딩을 통해 초기 번들 크기를 최적화한다.
入口与关键 API: createRouter()와 createWebHashHistory()를 사용하여 라우터 인스턴스를 생성한다 (frontend/src/router/index.ts:26-29).
关键数据结构: routes 배열은 계층적 라우트 구조를 정의한다. 루트 경로 /는 layout 컴포넌트로 리다이렉트되며, /index와 /setting이 하위 라우트로 존재한다 (frontend/src/router/index.ts:3-24).
typescript1const routes = [ 2 { 3 path: "/", 4 name: "layout", 5 component: () => import("@/components/layout/Index.vue"), 6 redirect: "/index", 7 children: [ 8 { path: "/index", name: "index", meta: {keepAlive: true}, ... }, 9 { path: "/setting", name: "setting", meta: {keepAlive: false}, ... } 10 ] 11 } 12]
关键调用链:
- URL 변경 감지 → 라우트 매칭
keepAlive메타 확인 → 컴포넌트 캐싱 여부 결정- 지연 import → 컴포넌트 로드
错误处理与边界条件: keepAlive: true 설정은 인덱스 페이지의 상태를 유지하며, 설정 페이지는 keepAlive: false로 매번 새로 로드된다 (frontend/src/router/index.ts:13-20).
상태 관리 모듈
职责边界: 애플리케이션 전역 상태를 중앙 집중식으로 관리한다. 앱 정보, 글로벌 설정, MIME 타입 매핑 등의 상태를 제공한다.
入口与关键 API: defineStore("index-store", ...)로 Pinia 스토어를 정의하며, Composition API 스타일의 팩토리 함수를 사용한다 (frontend/src/stores/index.ts:9).
关键数据结构:
appInfo: AppName, Version, Description, Copyright 포함globalConfig: Host(0.0.0.0), Port(8899), Theme, Locale, SaveDirectory, UpstreamProxy, TaskNumber(8), DownNumber(3) 등 (frontend/src/stores/index.ts:10-36)
关键调用链:
- 컴포넌트 →
useIndexStore()호출 - 스토어 인스턴스 →
appApi를 통해 Go 백엔드와 통신 globalConfig변경 → 반응형 UI 업데이트
错误处理与边界条件: MimeMap은 동적 MIME 타입 매핑을 지원하며, InsertTail 플래그는 다운로드 시 데이터 끝에 추가 데이터를 삽입할지 여부를 제어한다 (frontend/src/stores/index.ts:35).
기술 스택 및 아키텍처
백엔드 기술 스택
Go 백엔드는 다음과 같은 핵심 의존성을 사용한다:
| 라이브러리 | 버전 | 용도 |
|---|---|---|
| github.com/wailsapp/wails/v2 | v2.10.1 | 크로스 플랫폼 데스크톱 앱 프레임워크 |
| github.com/elazarl/goproxy | v1.7.2 | HTTP 프록시 서버 구현 |
| github.com/rs/zerolog | v1.33.0 | 구조화된 로깅 |
| github.com/matoous/go-nanoid/v2 | v2.1.0 | 고유 ID 생성 |
| golang.org/x/net | v0.35.0 | 네트워크 프로토콜 확장 |
goproxy 라이브러리는 로컬 프록시 서버(기본 포트 8899)를 구현하는 데 사용되며, 이를 통해 네트워크 트래픽을 가로채고 리소스 URL을 추출한다. zerolog는 JSON 형식의 구조화된 로그를 출력하여 디버깅과 모니터링을 지원한다.
프론트엔드 기술 스택
Vue 3 기반 프론트엔드는 다음 의존성을 사용한다:
| 라이브러리 | 버전 | 용도 |
|---|---|---|
| vue | ^3.2.37 | UI 프레임워크 |
| vue-router | ^4.3.3 | SPA 라우팅 |
| pinia | ^2.1.7 | 상태 관리 |
| naive-ui | ^2.38.2 | UI 컴포넌트 라이브러리 |
| axios | ^1.7.2 | HTTP 클라이언트 |
| video.js | ^8.22.0 | 비디오 플레이어 |
| flv.js | ^1.6.2 | FLV 스트림 재생 |
| vue-i18n | ^11.1.3 | 국제화 |
naive-ui는 Vue 3용 고품질 컴포넌트 라이브러리로, 깔끔한 UI를 제공한다. video.js와 flv.js는 캡처된 비디오 리소스의 미리보기 기능을 지원한다.
Wails 프레임워크 구성
Wails는 Go 백엔드와 웹 프론트엔드를 통합하여 네이티브 데스크톱 애플리케이션을 생성한다. wails.json 설정 파일은 다음과 같다:
json1{ 2 "name": "res-downloader", 3 "outputfilename": "res-downloader", 4 "frontend:install": "npm install", 5 "frontend:build": "npm run build", 6 "frontend:dev:watcher": "npm run dev", 7 "frontend:dev:serverUrl": "auto", 8 "info": { 9 "productVersion": "3.1.3", 10 "copyright": "Copyright © 2023" 11 } 12}
이 구성은 프론트엔드 빌드 파이프라인과 개발 서버 URL을 자동으로 관리한다. productVersion: 3.1.3은 현재 버전을 나타낸다.
시스템 아키텍처
正在加载图表渲染器...
아키텍처 설명:
-
프론트엔드 레이어: Vue 3 애플리케이션이 라우터, 상태 관리, UI 컴포넌트를 통합하여 사용자 인터페이스를 구성한다. Pinia 스토어는 Go 바인딩을 통해 백엔드와 통신한다 (frontend/src/main.ts:10-14).
-
Wails 런타임: Go 바인딩이 백엔드 함수를 프론트엔드에 노출하며,
@wailsapp/runtime은 이벤트 기반 통신을 제공한다. 에셋 서버는 정적 리소스를 제공한다 (frontend/wailsjs/runtime/package.json:1-24). -
백엔드 레이어:
main.go가 애플리케이션을 초기화하고, core 패키지가 비즈니스 로직을 처리한다. goproxy 서버가 트래픽을 캡처하고, zerolog가 로깅을 담당한다 (main.go:28-67).
핵심 데이터 흐름
正在加载图表渲染器...
데이터 흐름 설명:
-
프록시 시작: 사용자가 "프록시 시작" 버튼을 클릭하면, Pinia 스토어의
OpenProxy상태가true로 설정된다. 이 변경은 Go 바인딩을 통해 goproxy 서버를 시작한다 (frontend/src/stores/index.ts:27). -
트래픽 캡처: 사용자가 대상 플랫폼(위챗, 브라우저 등)에서 콘텐츠에 접근하면, 모든 HTTP 트래픽이 로컬 프록시(127.0.0.1:8899)를 통해 라우팅된다. goproxy 서버는 요청을 가로채고 리소스 URL을 필터링한다 (README-EN.md:95-96).
-
리소스 표시: 캡처된 리소스 목록은 Go 바인딩을 통해 프론트엔드로 전달되며, Pinia 스토어가 이를 저장한다. Vue 앱은 반응형으로 UI를 업데이트하여 사용자에게 리소스 목록을 표시한다.
주요 기능 및 특징
| 기능 | 설명 | 관련 설정 |
|---|---|---|
| 크로스 플랫폼 | Windows, macOS, Linux 지원 | wails.json:3-4 |
| 다중 리소스 타입 | 비디오, 오디오, 이미지, m3u8, 라이브 스트림 | MimeMap 동적 매핑 |
| 프록시 캡처 | 로컬 프록시를 통한 트래픽 캡처 | Host: 0.0.0.0, Port: 8899 |
| 플랫폼 호환성 | 위챗, Douyin, Kuaishou, Xiaohongshu 등 | UserAgent 커스터마이징 |
| 병렬 다운로드 | TaskNumber: 8, DownNumber: 3 | frontend/src/stores/index.ts:31-32 |
| 업스트림 프록시 | 제한된 네트워크 환경 지원 | UpstreamProxy 설정 |
디렉토리 구조
res-downloader/
├── main.go # Go 진입점
├── go.mod # Go 의존성
├── wails.json # Wails 설정
├── frontend/
│ ├── src/
│ │ ├── main.ts # Vue 진입점
│ │ ├── router/
│ │ │ └── index.ts # 라우팅 구성
│ │ ├── stores/
│ │ │ └── index.ts # Pinia 스토어
│ │ └── views/ # 페이지 컴포넌트
│ ├── package.json # npm 의존성
│ └── wailsjs/
│ └── runtime/ # Wails 런타임
└── build/ # 빌드 에셋
적용 시나리오
- 소셜 미디어 리소스 다운로드: 위챗 채널, Douyin, Kuaishou 등에서 비디오와 이미지를 다운로드한다.
- 음악 스트리밍 캡처: KuGou Music, QQ Music 등에서 오디오 리소스를 추출한다.
- m3u8 비디오 처리: m3u8 플레이리스트를 감지하고 외부 도구와 연동하여 다운로드한다.
- 라이브 스트림 녹화: 라이브 스트림 URL을 캡처하여 OBS 등의 도구로 녹화한다.
- 제한된 네트워크 환경: 업스트림 프록시를 통해 네트워크 제한을 우회한다.
보고서 로드맵
正在加载图表渲染器...
추천 읽기 순서:
- 프로젝트 개요 (현재): 전체 시스템 구조와 핵심 모듈 이해
- 아키텍처 분석: Go 백엔드와 Vue 프론트엔드의 상세 구조
- 데이터 흐름: 프록시 캡처부터 다운로드까지의 전체 프로세스
- API 설계: Go 바인딩과 프론트엔드 간의 인터페이스 명세
- 의존성 그래프: 외부 라이브러리와의 의존 관계
- 데이터 모델: 상태 관리와 설정 구조의 상세 분석
정량적 지표
| 지표 | 값 | 출처 |
|---|---|---|
| 제품 버전 | 3.1.3 | wails.json:16 |
| 기본 프록시 포트 | 8899 | frontend/src/stores/index.ts:21 |
| 기본 병렬 태스크 | 8 | frontend/src/stores/index.ts:31 |
| 기본 동시 다운로드 | 3 | frontend/src/stores/index.ts:32 |
| 최소 윈도우 크기 | 960x600 | main.go:46-48 |
| 기본 윈도우 크기 | 1280x800 | main.go:45-47 |
| Go 버전 | 1.22.0+ | go.mod:3 |
| Vue 버전 | 3.2.37+ | frontend/package.json:18 |
| Wails 버전 | 2.10.1 | go.mod:12 |
