heic-converter-tui 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ .pytest_cache/
@@ -0,0 +1,204 @@
1
+ Metadata-Version: 2.5
2
+ Name: heic-converter-tui
3
+ Version: 0.2.0
4
+ Summary: 방향키 TUI와 CLI로 HEIC 이미지를 JPEG 또는 PNG로 변환하는 도구
5
+ Keywords: converter,heic,jpeg,macos,png,tui
6
+ Classifier: Environment :: Console
7
+ Classifier: Operating System :: MacOS
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3 :: Only
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
12
+ Requires-Python: >=3.11
13
+ Requires-Dist: pillow-heif>=0.18
14
+ Requires-Dist: pillow>=10.0
15
+ Requires-Dist: questionary>=2.0.1
16
+ Requires-Dist: rich>=13.0
17
+ Requires-Dist: typer>=0.12
18
+ Description-Content-Type: text/markdown
19
+
20
+ # HEIC Converter TUI
21
+
22
+ HEIC 이미지를 JPEG 또는 PNG로 변환하는 설치형 Python 3.11+ 명령줄 도구입니다. macOS를 우선 지원하며, 입력 디렉터리와 하위 디렉터리를 처리합니다.
23
+
24
+ 이 도구는 HEIC 파일의 **primary still image(기본 정지 이미지)**만 변환합니다. 원본 파일은 덮어쓰지 않으며, 변환 결과를 별도의 출력 경로에 저장합니다.
25
+
26
+ ## 요구 사항
27
+
28
+ - Python 3.11 이상
29
+ - macOS 우선 지원
30
+ - HEIC 디코딩을 지원하는 시스템 및 Python 이미지 런타임
31
+
32
+ ## 설치
33
+
34
+ PyPI에서 설치하려면 다음 중 하나를 실행합니다.
35
+
36
+ ```bash
37
+ uv tool install heic-converter-tui
38
+ ```
39
+
40
+ 또는
41
+
42
+ ```bash
43
+ pipx install heic-converter-tui
44
+ ```
45
+
46
+ 소스 저장소에서 직접 설치하려면 저장소 루트에서 다음 중 하나를 실행합니다.
47
+
48
+ ```bash
49
+ uv tool install .
50
+ ```
51
+
52
+ 또는
53
+
54
+ ```bash
55
+ pipx install .
56
+ ```
57
+
58
+ 배포 패키지 이름은 `heic-converter-tui`이며, 설치 후 실행 파일 이름은 `heic-converter`입니다.
59
+
60
+ ## 사용법
61
+
62
+ 인수 없이 TTY에서 실행하면 대화형 TUI가 시작됩니다.
63
+
64
+ ```bash
65
+ heic-converter
66
+ ```
67
+
68
+ 화면에서 `↑`/`↓` 방향키와 Enter로 JPEG 또는 PNG, 형식별 품질/압축 preset, 재귀 검색, metadata 정책, conflict 처리 방식, 실행 또는 취소를 선택합니다. 입력 경로와 출력 경로는 화면의 입력란에 직접 입력합니다. 기본 경로는 각각 `./input`과 `./output`입니다.
69
+
70
+ 간단한 실행 화면 예시는 다음과 같습니다.
71
+
72
+ ```text
73
+ HEIC Converter
74
+
75
+ ❯ JPEG
76
+ PNG
77
+
78
+ JPEG 품질 preset ❯ 고품질 (90)
79
+ 재귀 검색 ❯ 아니요
80
+ 메타데이터 ❯ safe
81
+ 충돌 처리 ❯ rename
82
+ 입력 경로 ./input
83
+ 출력 경로 ./output
84
+
85
+ ❯ 실행
86
+ 취소
87
+ ```
88
+
89
+ 키 안내:
90
+
91
+ - `↑`/`↓`: 선택 항목 이동
92
+ - `Enter`: 선택 확정 또는 다음 단계로 이동
93
+ - 경로 입력란: 경로를 직접 입력
94
+ - `Ctrl+C` 또는 `취소`: 작업을 시작하지 않고 종료(코드 `130`)
95
+
96
+ TTY가 아닌 환경에서는 이 화면을 사용하지 않으며, 아래 비대화형 명령을 사용해야 합니다.
97
+
98
+ 스크립트나 자동화에서는 단일 명령 형식을 사용합니다.
99
+
100
+ ```bash
101
+ # 입력 디렉터리의 HEIC를 JPEG로 변환
102
+ heic-converter --input ./input --output ./output --format jpeg
103
+
104
+ # 디렉터리의 HEIC 파일을 PNG로 변환
105
+ heic-converter --input ./photos --output ./converted --format png
106
+
107
+ # 하위 디렉터리까지 검색하고 기존 결과가 있으면 새 이름으로 저장
108
+ heic-converter --input ./photos --output ./converted --format jpeg --recursive --on-conflict rename
109
+ ```
110
+
111
+ ## 명령 형식
112
+
113
+ ```text
114
+ heic-converter --input INPUT --output OUTPUT --format {jpeg,png} [옵션]
115
+ ```
116
+
117
+ `--input`은 입력 디렉터리이고 `--output`은 출력 디렉터리입니다. 두 옵션의 기본값은 각각 `./input`과 `./output`입니다. 변환 결과는 입력 디렉터리의 상대 경로 구조를 유지해 저장됩니다. 단일 파일 입력은 지원하지 않습니다.
118
+
119
+ ### 옵션
120
+
121
+ | 옵션 | 설명 | 기본값 |
122
+ | --- | --- | --- |
123
+ | `--input PATH` | 입력 디렉터리 | `./input` |
124
+ | `--output PATH` | 출력 디렉터리 | `./output` |
125
+ | `--format {jpeg,png}` | 출력 형식 | 필수(비대화형) |
126
+ | `--jpeg-quality N` | JPEG 품질(일반적으로 1~100). PNG에서는 무시됨 | `90` |
127
+ | `--png-compression N` | PNG 압축 수준(일반적으로 0~9). JPEG에서는 무시됨 | `6` |
128
+ | `--recursive` | 입력 디렉터리의 하위 디렉터리까지 검색 | 꺼짐 |
129
+ | `--metadata {safe,preserve,strip}` | 메타데이터 처리 정책 | `safe` |
130
+ | `--on-conflict {rename,skip,overwrite,error}` | 같은 이름의 출력 파일이 있을 때의 동작 | `rename` |
131
+
132
+ JPEG 출력은 `.jpeg`, PNG 출력은 `.png` 확장자를 사용합니다.
133
+
134
+ 예:
135
+
136
+ ```bash
137
+ # JPEG 품질 88, 메타데이터 보존
138
+ heic-converter --input ./input --output ./output --format jpeg --jpeg-quality 88 --metadata preserve
139
+
140
+ # PNG 압축 9, GPS와 XMP를 제거하고 나머지는 가능한 범위에서 보존
141
+ heic-converter --input ./input --output ./output --format png --png-compression 9 --metadata safe
142
+
143
+ # 기존 파일은 건너뜀
144
+ heic-converter --input ./input --output ./output --format jpeg --on-conflict skip
145
+
146
+ # 기존 파일을 교체
147
+ heic-converter --input ./input --output ./output --format png --on-conflict overwrite
148
+ ```
149
+
150
+ ## 메타데이터와 이미지 처리
151
+
152
+ 메타데이터 정책은 다음과 같습니다.
153
+
154
+ - `safe` (기본값): GPS 위치 정보와 XMP를 제거합니다. 그 밖의 EXIF와 ICC 프로파일은 가능한 범위에서 보존합니다.
155
+ - `preserve`: 변환 라이브러리가 지원하는 메타데이터를 최대한 보존합니다.
156
+ - `strip`: 출력 이미지의 메타데이터를 제거합니다.
157
+
158
+ 변환 시 이미지 orientation을 픽셀에 반영해 정규화합니다. 따라서 출력 파일은 EXIF orientation 태그에 의존하지 않고 올바른 방향으로 표시됩니다.
159
+
160
+ JPEG는 알파 채널을 지원하지 않으므로 투명 영역을 흰색으로 합성합니다. PNG는 알파 채널을 유지합니다.
161
+
162
+ ## 파일 검색 및 충돌 처리
163
+
164
+ - 지원 입력은 확장자가 `.heic`인 파일입니다(대소문자 구분 없음). `.heif` 파일은 제외합니다.
165
+ - 디렉터리는 기본적으로 바로 아래 파일만 검색하며, `--recursive`를 지정하면 하위 디렉터리까지 검색합니다.
166
+ - 출력 디렉터리가 입력 디렉터리 안에 있더라도 출력 경로 자체는 검색 대상에서 제외합니다. 따라서 변환 결과를 다시 입력으로 처리하지 않습니다.
167
+ - `rename`은 `photo.jpeg`, `photo-2.jpeg`, `photo-3.jpeg`처럼 충돌하지 않는 새 파일명을 자동으로 선택합니다.
168
+ - `skip`은 기존 파일을 그대로 두고 해당 항목을 건너뜁니다.
169
+ - `overwrite`는 기존 출력 파일을 교체합니다.
170
+ - `error`는 충돌을 오류로 보고 처리를 실패시킵니다.
171
+
172
+ ## 범위와 제한
173
+
174
+ 이 프로젝트의 범위는 HEIC의 기본 정지 이미지 변환입니다. 다음 기능은 제공하지 않습니다.
175
+
176
+ - PDF 변환 또는 PDF 생성
177
+ - HWP/HWPX 변환
178
+ - OCR 및 텍스트 추출
179
+ - Live Photo의 동영상/비디오 처리
180
+ - primary still image 이외의 보조 이미지, 시퀀스 또는 동영상 추출
181
+
182
+ ## 종료 코드
183
+
184
+ 자동화에서 결과를 판별할 수 있도록 다음 종료 코드를 사용합니다.
185
+
186
+ | 코드 | 의미 |
187
+ | --- | --- |
188
+ | `0` | 모든 입력을 성공적으로 처리함 |
189
+ | `1` | 하나 이상의 파일을 읽거나 변환하거나 저장하는 중 오류가 발생함 |
190
+ | `2` | 명령줄 인수, 경로, 옵션 값 등 사용법이 잘못되었거나 대상 `.heic` 파일이 없음 |
191
+ | `130` | 대화형 화면에서 `Ctrl+C`를 누르거나 `취소`를 선택함 |
192
+
193
+ 자세한 옵션은 다음 명령으로 확인할 수 있습니다.
194
+
195
+ ```bash
196
+ heic-converter --help
197
+ ```
198
+
199
+ ## 실행 모드와 입력 없음 처리
200
+
201
+ - 인자 없이 TTY에서 실행하면 대화형 TUI가 시작됩니다. JPEG/PNG, 형식별 품질·압축 preset, 재귀, metadata, conflict, 실행/취소와 input/output 경로를 화면에서 선택합니다.
202
+ - TTY가 아닌 환경에서 `--format`을 생략하면 사용법 오류로 종료 코드 `2`를 반환합니다.
203
+ - 입력 디렉터리에서 처리할 `.heic` 파일을 찾지 못하면 종료 코드 `2`를 반환합니다.
204
+ - 대화형 화면에서 `Ctrl+C`를 누르거나 `취소`를 선택하면 종료 코드 `130`을 반환합니다.
@@ -0,0 +1,185 @@
1
+ # HEIC Converter TUI
2
+
3
+ HEIC 이미지를 JPEG 또는 PNG로 변환하는 설치형 Python 3.11+ 명령줄 도구입니다. macOS를 우선 지원하며, 입력 디렉터리와 하위 디렉터리를 처리합니다.
4
+
5
+ 이 도구는 HEIC 파일의 **primary still image(기본 정지 이미지)**만 변환합니다. 원본 파일은 덮어쓰지 않으며, 변환 결과를 별도의 출력 경로에 저장합니다.
6
+
7
+ ## 요구 사항
8
+
9
+ - Python 3.11 이상
10
+ - macOS 우선 지원
11
+ - HEIC 디코딩을 지원하는 시스템 및 Python 이미지 런타임
12
+
13
+ ## 설치
14
+
15
+ PyPI에서 설치하려면 다음 중 하나를 실행합니다.
16
+
17
+ ```bash
18
+ uv tool install heic-converter-tui
19
+ ```
20
+
21
+ 또는
22
+
23
+ ```bash
24
+ pipx install heic-converter-tui
25
+ ```
26
+
27
+ 소스 저장소에서 직접 설치하려면 저장소 루트에서 다음 중 하나를 실행합니다.
28
+
29
+ ```bash
30
+ uv tool install .
31
+ ```
32
+
33
+ 또는
34
+
35
+ ```bash
36
+ pipx install .
37
+ ```
38
+
39
+ 배포 패키지 이름은 `heic-converter-tui`이며, 설치 후 실행 파일 이름은 `heic-converter`입니다.
40
+
41
+ ## 사용법
42
+
43
+ 인수 없이 TTY에서 실행하면 대화형 TUI가 시작됩니다.
44
+
45
+ ```bash
46
+ heic-converter
47
+ ```
48
+
49
+ 화면에서 `↑`/`↓` 방향키와 Enter로 JPEG 또는 PNG, 형식별 품질/압축 preset, 재귀 검색, metadata 정책, conflict 처리 방식, 실행 또는 취소를 선택합니다. 입력 경로와 출력 경로는 화면의 입력란에 직접 입력합니다. 기본 경로는 각각 `./input`과 `./output`입니다.
50
+
51
+ 간단한 실행 화면 예시는 다음과 같습니다.
52
+
53
+ ```text
54
+ HEIC Converter
55
+
56
+ ❯ JPEG
57
+ PNG
58
+
59
+ JPEG 품질 preset ❯ 고품질 (90)
60
+ 재귀 검색 ❯ 아니요
61
+ 메타데이터 ❯ safe
62
+ 충돌 처리 ❯ rename
63
+ 입력 경로 ./input
64
+ 출력 경로 ./output
65
+
66
+ ❯ 실행
67
+ 취소
68
+ ```
69
+
70
+ 키 안내:
71
+
72
+ - `↑`/`↓`: 선택 항목 이동
73
+ - `Enter`: 선택 확정 또는 다음 단계로 이동
74
+ - 경로 입력란: 경로를 직접 입력
75
+ - `Ctrl+C` 또는 `취소`: 작업을 시작하지 않고 종료(코드 `130`)
76
+
77
+ TTY가 아닌 환경에서는 이 화면을 사용하지 않으며, 아래 비대화형 명령을 사용해야 합니다.
78
+
79
+ 스크립트나 자동화에서는 단일 명령 형식을 사용합니다.
80
+
81
+ ```bash
82
+ # 입력 디렉터리의 HEIC를 JPEG로 변환
83
+ heic-converter --input ./input --output ./output --format jpeg
84
+
85
+ # 디렉터리의 HEIC 파일을 PNG로 변환
86
+ heic-converter --input ./photos --output ./converted --format png
87
+
88
+ # 하위 디렉터리까지 검색하고 기존 결과가 있으면 새 이름으로 저장
89
+ heic-converter --input ./photos --output ./converted --format jpeg --recursive --on-conflict rename
90
+ ```
91
+
92
+ ## 명령 형식
93
+
94
+ ```text
95
+ heic-converter --input INPUT --output OUTPUT --format {jpeg,png} [옵션]
96
+ ```
97
+
98
+ `--input`은 입력 디렉터리이고 `--output`은 출력 디렉터리입니다. 두 옵션의 기본값은 각각 `./input`과 `./output`입니다. 변환 결과는 입력 디렉터리의 상대 경로 구조를 유지해 저장됩니다. 단일 파일 입력은 지원하지 않습니다.
99
+
100
+ ### 옵션
101
+
102
+ | 옵션 | 설명 | 기본값 |
103
+ | --- | --- | --- |
104
+ | `--input PATH` | 입력 디렉터리 | `./input` |
105
+ | `--output PATH` | 출력 디렉터리 | `./output` |
106
+ | `--format {jpeg,png}` | 출력 형식 | 필수(비대화형) |
107
+ | `--jpeg-quality N` | JPEG 품질(일반적으로 1~100). PNG에서는 무시됨 | `90` |
108
+ | `--png-compression N` | PNG 압축 수준(일반적으로 0~9). JPEG에서는 무시됨 | `6` |
109
+ | `--recursive` | 입력 디렉터리의 하위 디렉터리까지 검색 | 꺼짐 |
110
+ | `--metadata {safe,preserve,strip}` | 메타데이터 처리 정책 | `safe` |
111
+ | `--on-conflict {rename,skip,overwrite,error}` | 같은 이름의 출력 파일이 있을 때의 동작 | `rename` |
112
+
113
+ JPEG 출력은 `.jpeg`, PNG 출력은 `.png` 확장자를 사용합니다.
114
+
115
+ 예:
116
+
117
+ ```bash
118
+ # JPEG 품질 88, 메타데이터 보존
119
+ heic-converter --input ./input --output ./output --format jpeg --jpeg-quality 88 --metadata preserve
120
+
121
+ # PNG 압축 9, GPS와 XMP를 제거하고 나머지는 가능한 범위에서 보존
122
+ heic-converter --input ./input --output ./output --format png --png-compression 9 --metadata safe
123
+
124
+ # 기존 파일은 건너뜀
125
+ heic-converter --input ./input --output ./output --format jpeg --on-conflict skip
126
+
127
+ # 기존 파일을 교체
128
+ heic-converter --input ./input --output ./output --format png --on-conflict overwrite
129
+ ```
130
+
131
+ ## 메타데이터와 이미지 처리
132
+
133
+ 메타데이터 정책은 다음과 같습니다.
134
+
135
+ - `safe` (기본값): GPS 위치 정보와 XMP를 제거합니다. 그 밖의 EXIF와 ICC 프로파일은 가능한 범위에서 보존합니다.
136
+ - `preserve`: 변환 라이브러리가 지원하는 메타데이터를 최대한 보존합니다.
137
+ - `strip`: 출력 이미지의 메타데이터를 제거합니다.
138
+
139
+ 변환 시 이미지 orientation을 픽셀에 반영해 정규화합니다. 따라서 출력 파일은 EXIF orientation 태그에 의존하지 않고 올바른 방향으로 표시됩니다.
140
+
141
+ JPEG는 알파 채널을 지원하지 않으므로 투명 영역을 흰색으로 합성합니다. PNG는 알파 채널을 유지합니다.
142
+
143
+ ## 파일 검색 및 충돌 처리
144
+
145
+ - 지원 입력은 확장자가 `.heic`인 파일입니다(대소문자 구분 없음). `.heif` 파일은 제외합니다.
146
+ - 디렉터리는 기본적으로 바로 아래 파일만 검색하며, `--recursive`를 지정하면 하위 디렉터리까지 검색합니다.
147
+ - 출력 디렉터리가 입력 디렉터리 안에 있더라도 출력 경로 자체는 검색 대상에서 제외합니다. 따라서 변환 결과를 다시 입력으로 처리하지 않습니다.
148
+ - `rename`은 `photo.jpeg`, `photo-2.jpeg`, `photo-3.jpeg`처럼 충돌하지 않는 새 파일명을 자동으로 선택합니다.
149
+ - `skip`은 기존 파일을 그대로 두고 해당 항목을 건너뜁니다.
150
+ - `overwrite`는 기존 출력 파일을 교체합니다.
151
+ - `error`는 충돌을 오류로 보고 처리를 실패시킵니다.
152
+
153
+ ## 범위와 제한
154
+
155
+ 이 프로젝트의 범위는 HEIC의 기본 정지 이미지 변환입니다. 다음 기능은 제공하지 않습니다.
156
+
157
+ - PDF 변환 또는 PDF 생성
158
+ - HWP/HWPX 변환
159
+ - OCR 및 텍스트 추출
160
+ - Live Photo의 동영상/비디오 처리
161
+ - primary still image 이외의 보조 이미지, 시퀀스 또는 동영상 추출
162
+
163
+ ## 종료 코드
164
+
165
+ 자동화에서 결과를 판별할 수 있도록 다음 종료 코드를 사용합니다.
166
+
167
+ | 코드 | 의미 |
168
+ | --- | --- |
169
+ | `0` | 모든 입력을 성공적으로 처리함 |
170
+ | `1` | 하나 이상의 파일을 읽거나 변환하거나 저장하는 중 오류가 발생함 |
171
+ | `2` | 명령줄 인수, 경로, 옵션 값 등 사용법이 잘못되었거나 대상 `.heic` 파일이 없음 |
172
+ | `130` | 대화형 화면에서 `Ctrl+C`를 누르거나 `취소`를 선택함 |
173
+
174
+ 자세한 옵션은 다음 명령으로 확인할 수 있습니다.
175
+
176
+ ```bash
177
+ heic-converter --help
178
+ ```
179
+
180
+ ## 실행 모드와 입력 없음 처리
181
+
182
+ - 인자 없이 TTY에서 실행하면 대화형 TUI가 시작됩니다. JPEG/PNG, 형식별 품질·압축 preset, 재귀, metadata, conflict, 실행/취소와 input/output 경로를 화면에서 선택합니다.
183
+ - TTY가 아닌 환경에서 `--format`을 생략하면 사용법 오류로 종료 코드 `2`를 반환합니다.
184
+ - 입력 디렉터리에서 처리할 `.heic` 파일을 찾지 못하면 종료 코드 `2`를 반환합니다.
185
+ - 대화형 화면에서 `Ctrl+C`를 누르거나 `취소`를 선택하면 종료 코드 `130`을 반환합니다.
File without changes
File without changes
@@ -0,0 +1,42 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.25"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "heic-converter-tui"
7
+ version = "0.2.0"
8
+ description = "방향키 TUI와 CLI로 HEIC 이미지를 JPEG 또는 PNG로 변환하는 도구"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ keywords = ["heic", "jpeg", "png", "converter", "tui", "macos"]
12
+ classifiers = [
13
+ "Environment :: Console",
14
+ "Operating System :: MacOS",
15
+ "Programming Language :: Python :: 3",
16
+ "Programming Language :: Python :: 3 :: Only",
17
+ "Programming Language :: Python :: 3.11",
18
+ "Topic :: Multimedia :: Graphics :: Graphics Conversion",
19
+ ]
20
+ dependencies = [
21
+ "pillow>=10.0",
22
+ "pillow-heif>=0.18",
23
+ "questionary>=2.0.1",
24
+ "rich>=13.0",
25
+ "typer>=0.12",
26
+ ]
27
+
28
+ [project.scripts]
29
+ heic-converter = "heic_converter.cli:run"
30
+
31
+ [dependency-groups]
32
+ dev = [
33
+ "pytest>=8.3",
34
+ "ruff>=0.14",
35
+ ]
36
+
37
+ [tool.ruff.lint]
38
+ extend-select = ["B", "I", "UP"]
39
+ ignore = ["B008"]
40
+
41
+ [tool.hatch.build.targets.wheel]
42
+ packages = ["src/heic_converter"]
@@ -0,0 +1,17 @@
1
+ """HEIC 이미지 변환을 위한 공개 API입니다."""
2
+
3
+ from .core import (
4
+ ConversionResult,
5
+ convert_image,
6
+ discover_heic_files,
7
+ natural_sort_key,
8
+ plan_output_path,
9
+ )
10
+
11
+ __all__ = [
12
+ "ConversionResult",
13
+ "convert_image",
14
+ "discover_heic_files",
15
+ "natural_sort_key",
16
+ "plan_output_path",
17
+ ]